submission 27258
KernelBot user 3 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
solution.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-27258?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz
Benchmark evidence
18 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
59.5µs
#14 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
61.4µs
#13 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
112.2µs
#24 of 98
2025-05-25
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
144.8µs
#12 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
145.6µs
#8 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
168.2µs
#11 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
284.5µs
#26 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
969.7µs
#34 of 98
2025-05-25
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:06760ac8a17a5c766b4a0bcad36b2a154ed4bece93ad978243318d12050d94b9
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
solution.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB6bGliCmltcG9ydCBiYXNlNjQKCmlmICJQWVRPUkNIX1JPQ01fQVJDSCIgbm90IGluIG9zLmVudmlyb246CiAgICBvcy5lbnZpcm9uWyJQWVRPUkNIX1JPQ01fQVJDSCJdID0gImdmeDk0Mjp4bmFjay0iCgpURVNUSU5HID0gb3MuZW52aXJvbi5nZXQoIkdQVU1PREVfVEVTVElORyIsIE5vbmUpCgprZXJuZWxfY3BwID0gYidlSnp0ZlUxejIwaVM2Rm42RmRYcXNBMUtORVZTdEZvdFVaencrR1BHMjkzdWptbjN6bTVvRkFpQUJDV1lCTUFGUUgzWXJZZ1g3N3lIUGN4aEQzdDh4M2Q4eC9kcjlwZHNabGFoVUFVVVFGQ1cvTEZyaGswUmhhck1yS3lzck15c3IyLzljRHhmVGp3MlBQY1h1L0RmanBkaDZnZGU1M3kwK1czcDVYVFIyemUvY2FkVmI2YUxBLzNGNHRyMXcwbXZ0NXY5MEYvN1VaTEduaFBvYVlFVCtnczF5ZlhUMGVibXR4TnY2b2NlKy9PclgreG5mMzd4N0FkckhJVVRQL1dqc01VKytQTzNUZnllUkI4T3FRNysrL3NDTCtEakJ4cmlSUnhIc1oweUQvK3lZeVlaZFhRSDhQMnB4ZUYrYzR5NGZsMk94MTZTZkdnVDVQRHZoMGM1ZlB3azZlVHdjQXpWWU1NaDJ5SjJzUzM4RFJYNms1ZFN3bXNuOEhoTlcvam1rZlVJLy9DcTQzT0xucmNPb1dBSmZ2N1JZZjZheG41NHBrRGRZbjdJTWR2MmRCbU9iWnVuT21tVyt2TFZqeThndFFiK284TkhQT3VQcjE2LzRBQWUvUzE4dEY1YjYvQzlLejhWVk41ZVpDcmczOXdOUUNQOCs0R2R3Nzg4OStlZU5YWG1pZGZhM0Z3bTBKZ01sQjUwTWRzV0N0RDJCc0dlUFEyWDc0NUVCdFNYTW9jN25VZE8ydHMva3FYMyt2Q1NVdFcwcXdHbTRrdmJkbElRRzNlWmVyWnRXZDVWYWw5NDR4UTcrUFhDc3dhdFZpc3I2SXR5ZnBqdTlhSC9yMUdVY0JLZFRaRDI5cW5vSnFqdjVUaGw0Nlhyc2ZmRUlVRE5nallMMjJ4MnRIa0RXVUQzSktsM3RZanAxYVVUTCt6RWYrY0JvdjNCVWVIdDJCbWZlL1ljdEh5V3A5Yy9LTUVJYkhjZWpXZVV4UTZXODlSZnpESHZYcjhJTDJ5Y2MxYVJrK1BuTElxOU14K0tjQmJBdTZWZ00yUkl2V0F4ZDFJWXEvQmRDSnFEdldreitmdTMwU2EwUGd4MjBEdHRlK0pkK0dPUGZrNmplT3o1SWRYWVZraHlsbW5FNE0zY252Z1gxaHZtdE5sdnpHMEpIc2RldW94RFpqbHNoN25zTWV1MTJDNXpnZDA1SVVPQ0FNWG9yM3NyL0lEYW4zaTJkK1dNVXl2RG5hUk82bzl0SjBtOE9BVUtIZ0FGeDhlczIyWmJrOGhMV0JpbG9pQ2pndDlzZ1p3b1JEdGxVcEgvTU5hM3FTR2N5VVJoWE9MOXl5Z1RNdEVxMTdaN2JVUDJvMW9JOEtQVDZiQlhTVlh4SWVXbnZEUVlRQUh2RE5vV01DNjljRXd3MjFBZW9JeEdvdTVjREVUcjE1U3lBRGJiaHNMUVBvQ2hoVEI0WjlBb2ZzWHBmYzMvWlBRWHlYWm1IdEE3OGE0a0V2dlNUOCt4RHZhNU4xOTRzWWs2eVVGanRWK0pTZ3ZneGpxOEJzRjZoWUlGSlVhancwT0UyS1FTSTlGYjZnalhDRnhkd1NFZ0lRUmpTVWRPaEFUMFVtTmZFM20vaVB3Slc0WnhOSi9iemdLWVpMMWswd2J5a1BVRmE5cVJIVDhDT2gzUWoxWnJDT2l0VnB0QnpsWlowRXY4UWlXalNQekx0VWxIb2pPS3RNcEFWZXFZcTNEMS9ZMlowZytncWpjcDB6VUVMZkZxWkUycjJmSVBINFN6WDQzejVPRXAxeEpaWDlaei9FT2U0NjJhQXovbVJ2YmJrTk1TdWcwL04rSjNCU3RGN2ZEUER4OVV5YjE3cVdTZTY0YzgxNnlZcTU0ZE1PUnJIRkc1VXNNaGZjeWtBUmo2Qi9LbG5oM2p1ZWZFTURaYUQ1MDRkcTViSjY5UHkxeDVYY0VWS25MaW4wTHZlL08rZTZNUlZvT1lURG44c3FkeEZOaG9LbGxrdXJHckRQZnVMbnFvanhKMHVpNjhPQUd2aTZGbGorNFhveUhTbWMvWkREcGx3cUlwQTROblBFdXlrb0NOUlJPb201TkFSdXUxQXgwMFdicGhGQWRnYzdaWWVnNm9MajJBRXo1Q2N5bjJtT05HeTdTVEFYaHo3aWZzekF1eFlSQ1ZtMFJ6c09IbTEvRHpPZ0VnUU5iRUE2QVJlN3RNVWdhRFREaUdyRm41OU54anl3VU9LdUIwSnd5c2dETXZwZFRZUHp0UDJZVXpYM3BzN3M4OFRNeEsvWXdsRnRmcE9WUVJGU2NvbkVsblV4MzJTYWNDU0J0cWxnNlJneU5MTm9hd0tlZ1ZHbFhBM2xSNXpiT281VFBMYTJRQjIyRjQ3dTNMekMzNnRiSWh5Y2pGcjZ3aER5eTA0K3RiRVhLU3RROWNvZkxBNm1RZVhUSjQ1NFJRZXhwL29ZVXlDTmphMkU3bnpnV3hDMzdFazB0c05EL2t3enVBSlNaUEl1YW5IV2c5TUhtaWFZcDVNaUNCQjJ5ZHNJa0hBc0JRZDdOazRZMTliRW16a0xRWldPMGdKRGtWdXF4d0lUcjM0QmtHNnJHWHl4T1lmbURqdy9zb1FSSlZtZkREeFpJVEdIdkFTWkFnS0RWMlF0QUJxUitnclo0cXRETWZ1cllYZUNFMmJDUUJ1ZGRjNkpMejVYUTY1OXp5U05BNm05LzYwNGszaFhZNm0xNTlQK2hERTRsQ1A3M2E2M2FCY3lETW9jbzM2aXZBODZTanlobDFScENLbzgxdlBYRFNNaUF2b2MrNXpuaEdQSk45NWVmblB4K3lsOUFUd1NxZE9tamFVM1VFd1FhSTRjU2ZWcWl1bHdXRkpYVzZRWE1sM2h6NGJMbFJOS2ZRVEpzcEd0MmZNZ3BzdFJSdFpkYTV3QWxQS3R3Ymh2VmRXWVpjMTd4UWFhU2FMQmIyT0kzbmZLU0tvMHM3Y0pJWmFNbnUxWlNudVU0NDB4S3BHaUJZNFlSS29nZEpTT3E2WDlhQlFSU200T01zRnBaTXVTcDRPYmJ0TG4yd1lVUGJDU1puNDlCZUxpWkFMUlc2YWpQNGw5T2MwZHZPcVd3cnBCbEc1cm1EdmlaNHVwT0dCS2V4RXlZTDZDRDI0R3BnVHcvc2kzNU9PL1VTczZla0lHSkR4UTNlWlFOd25mQXRFMjk5MUFnUlVCYWZlWm56cE1QU2dEMWsyaU42ZzYzTUkwUGlNN0RZZzlBVkJDM0FGdEVseXZxVTljMElWSURIWko5dVBmL2xsMEt2aGdiNmw2VWZnd29xWnMrQTd1NXlqaHptQ2dDa3NjdDZyTS8yc2pUNmlEU0N4UDVKZXpWZ1Q5ZysrMDY4MmxGd2Fka08yUGZzS2Z2anFtelAySFAyQXJwYmRiYmswbG13aGVQSE5EeGpobXdZekhJVUtpQUl6QjRGaHV4UjBLWG8waEE4Tlk5WUFkMHlRTmdLeXZNbzl0OUZ3T0U1RE5rN29QeEJDTlNSTnIyTWdPOEpPSFZ5Y081ZjlYT3BuT1JFRG9ESS9leXhCMFR1NVVRZUFKbFAyWXZzOFh1ZytZK0NaZ29DOEFBQU1Ra0RWOFFtZjVLcERTWExXUnd0RitJOXVobVFuVXJ0YWtMeGdBMUtKVk9rKzdqY3ZaRXArZGdQeE5rMktZa3IwRjhrVFcwVk5JeDJrT1ZYeWNEY3BoQ0taZGgxZTkxSHZkNmpidmRSdHpmaUlGcnRQSnBOSU9WanFUNFBnSXZZbXpScjVBK2crYnI3ajdyOVI5MEJBTmJlSGVLN3ZVZmQ3d0Rkbys2VHpCd1JsWGtONWdJMU55RWlFZXRyamQ2R1lXNkM5b0RTNkFrT01GSmd1RGJIRHVoZGpiMUZ5bzBDQmQ1VnY1TkxBUXByVC9TeEx1RHFGMTg5Zmp3cXZ1cFRYOXlqVXBobEx4ZjJxbGRxd3c0b0JybFd3Nkl3YU8zS3RsbGZhVnRlTzFQamRxbGxvWDE3M1JHQlVkcVdvRlkzN1ZEVVdHdlZKOVNrdmFwVzdWUEQ3bWV0cXFrNXFEUnBUZ3pBOXdjdDludisyTnZYSGcvd0NSKzAwQmd5cm1pMzR0QnlBQ1BMZkg0UlpJeU1uVXZnN1hUcXhUYllKaFBiUGJCNDREZUprM2pjbG5GSmRoRk5wNG1YS2lsSktXVWNvVWtYanErNTRXekRFQkJZVzRpdXc5RjFBRjJIbytzZ3VvNS9nUHE5U0NUYTdQVlU5dlkvTHBtOWZST2RCSzJXVG5EcFBpcWRlMzBUbmZ1RFZYVHVEejR1bmZ1RElwMjJUUzNmWHltZ2tPVWp0MzJmQzZsS0xabmVGV1FtWUIxNzJKR3kvbllCTnFiVFpoK0phRUp2NkZnTlNJWmVKYnZmSnlHNjNNMGFVTDJuR00yZmhPcHlwMnRBTmZRNDJUVS9DZFhsTHRoRVFxRHpxVDMxMDBpSjZKQmV1QXpZZUE1K1JnNEcvS1VOUHZPSGtUSDBYTExuczNua09uT0trR2RKZk1FSUpNSEl2aEZHb1kzdVhCUlRyajF0ZWtLTks4cnBGRTZWOU5DVU5Cdk02bWdKUHAvaVEzT3JCbm04elJacG5JY3lKUy9BN2o3ekRPbFFjdXFmQ1M4YmlOcmdreUxnK0FlMk9vRVVlMEYwNGRuakN6c2R2aGtKZzZKSUVMYVJlRlhqb3VZbHJUZEFib1NCdUZodFNIQTMxYUFDeGs0ZWp4QTJFRk5BcVlkOVk0OWdMY0JPNGZFM2hTOGpTMkJTN0M3T1d6Mm14OE4xNVBKdUV5blIxSkxjYUJVS1o0Rk0rSGVKd2FwblA2RFBsSWpJRnFaUUlOVlB3VUZ5d2ord1YxQTd6d3ZJSmNJVTl2enBtNmYyeTUvLzh0UFROelRkaTBHbUlvYS9laXlnbUNhNnhPN2N3OElnT05mY25rYnVNQlNqdU5QcGFFWEJFT3gyKy9DLysxc2UyczdpS2ZSSFJoaXlZSFpiRWZZeHJjY1JUNGVIVXZCSFRkcVhaSVppMTBQSlBBeHlNeHoyckxJWVhqb2dYS0lEbDkrbTU5Q1hKcVgzRk5BQnU1MENKd25PMWNWTDdvdTBSSTlRWmhmRXpEaDZwSnBnRzRnODB2c1ZUVFJ6ZUJTSlFVdEJ6UHFYNUFOazVqWDJvZzJsUW16YmtQRUk4bWpWcXNpVmR3STE3N0ZTN1Q4VTNxRUg4Qkkrai9DclVCVytlR0ZNZGMvRkhoSkgxamp6RXZEalQ1V3FXMHFOajNFT3Y5anBESUZ6aGRFamE0VlBVSnE1MFVHUi9nZVhTV3FCUWg4c2NhZjgyaWhka2pGakxhbWxUZ1R4V0dVTk4vcDN6QTJ3a3I1a2RnenVtQjFnZm4zSjdEaTRZM2FBWGZjbHN3T0RDM2ZiVy9wZmdQYlFhMXlJWDZ2c2VZemhhMHloY1lBV0tNbEF0amZaVWlFYkIvSFZRN2M2YTQxRlZ3emlmQTRJN1dKcmM0TXFTMk5JMWJENWtKSEIvZ2tHZDlNd3paMksvMUhqdEZwbHcwQzlLcVRBMnpnWDFPSkU5Z0VheHRqRWhpNzBhVHZkQ2lXazg2VTBaSytNVzZ4aURGOEc4T1Z6cGpSNnI0eU5yT0lNZDZhK2ZNNlVCdktWOFpkVm5NSFl6SDhIenBUSDlOVkJuanJlS0FHZ0w0VTlkUU84eml3YTRTbXArUkMvc2NiNC9pR2p1aHpNUHY0d3ZzSDVCaFFOeHlNZ2FrTTJjc25LNkkyczkwamVEVFF5ejZkUnhaTUtwUEJFU1FOSGx5OHNnZUYwZDVjOUZZdlI1clRBaG9tQVh1QUZVWHpOUXMrYnlFVUpDWnRHODNsMG1SeGl1Y2ZzVHpoZGgvT1p1T0x1R2hlekpaRmMvNFlyajNBVzNjRUYrbzlCWmlsOHdBdmlJaXBDdG5EUzgzeVJBb2dDL09WYkRCaTJXNFlaUzNvVDNIRVRoV092dzU0OWYvMTBiNU1XRE9TWnVXRDVDZUxqNUxRNVBaQ0lTN05ZNEtTeGY4V3p5Y1ZLVUhNT2FPS0RLTklpTW92dk0wajl1V2NIUjB4RStId01oODZYUVFodzN1TFdJS2czRURUM3NCNkFzc09yOWxjUDJnVk1HTy9DQS9ieDlxQ3dsUk5ENS9DaHdueHBIM0FJZVN0QmNDTHlIUTVzbDFsWWtWM1NNeDd2S0FsdVJjSUt2UVp5WTQ4V1dYVktKWTl4M3dZN0hyRUQwNnYrazMxOHQ5YzN2ZXgxKzFRU01NdnFRSDllQmg1dlY3bk9ETm5oekxGeTEvRFhQd3M5cWlXeDNrOFRQa1V1aXdSaWhRdEhTVVdCQlZtNVpEays3MlE3VWhndGdwdlBhWWRDNG1QUXo3Mkcrb2kyeFBWODU5RnlQa0d4d0wyR1dIME85ai8vL3EvLytmZi9sZjM3dncxKy8xdWh6TDlsZ1A1M2w3NEg5SDFBMzcwK2Z0Ti9lc2FJdDVENnJOUi9LS0QrZjRQZi93ZksvRjE1L25lSnZrZmZUK2o3ZTU2eWg5KzN4aVFoOStsN244UHMwdmZnYmlEdjBmZDNISEtQdnArb2tOV2EvcjhHdi84OVh3VzJ5YlZZcWdocnU1REdPNnN4TmVTcGNxYUJQRS9TcVp0U1RVOUJVMEZpdGtSbk01K01JRGlrZjJMam9qRVZFWHVRK1VjU2gxem5oVG00dWxFMFRiN2dTNU4yOG9RcFVvdmd0akszSjdkRU9BbFUwVFJLblRrUmlFT015Z3h3OURUaWRzdkVtUmFXcVFBZkZOUURWUVRmTXllQUVTV2w1VmVVVXgwbnRMclE4bEVFMHFBdUJBb1hvZGdhNGNjTjY3RUNwdERGeHhyTGRwVWFDdExFWnJ2NHpCQXN6MlduQkhqVWJQcEhrQ2JCRTBSYTRNd0gzanlxdzIyRTZlSkFhMGVjQzh5ZFlOckpwejJHK2lNdkNmYUFIVlM5Q0lWTlVweFRvNVZDMHB0WDh1T1d0aHdzaUZsWTlPR3BxQWhBVkdjQTgxaE9hNG41S3Vsc1Y4eG5pZmZiSTB0blNhdk44YWdSZ2p5Y2tQclU3TlJNcnlaWG5Tc2xsMndJSG50VDN1UTdGRXBOWGIxSkkwZnFBOHEzc2c4U00zYVFrcU9LL0hGMGlVRVRYSlpuN0FaVjVjQW9vWElQMWl3SFhNTUdoTEtJR1hnSDVDR3NiVlAzcW9IQjZjWnZUU3pxMEhLU0s1QnBZSXpVbHd6cmpJd2hDTUhEaHhMRkVPWE9VSjZFN3pLS0oxejY4a1hZU01Td1JOREl5cWJYQmN2YU9mTENWaG91UXlkdlR6T3RJVjAxQ1c1a0llYkNscHZOSEFCRmhUTlpwUGZycUpYY3c3SFR5RTdBaU0vMVNWR1RUQkxGV1pIZFFIZ1FIMC9Ock9xZ05OSHNaYXNDYUdoMHlBa0JSWTBEVGhUNEtST2lRRHQxVUh2VC9ERG1oWWUyQ3NyTk5sZlFLbDgrQnZqaEJaaWlFMmxrZDlpYkNHekxLOHJJZDFFZ1hCVU1ibXp3d1BQSXlyRExjdzhneGd4MzVDVExCYTN6RmNNaG1PeTBCSUhieFA0VWZWOFYxanN2eHEwbGpQWUkzYi8yK1V6VUQwaWZwbjUwUTJvSEkzSk45UkgyNTIwRWlNQ0s0NFlzQldQR1ExMzZUd1FOcDRWZXZNMUI1VDBCT25SRmYrVkxaSy9ETWMrY3FIdnJjTTNwVk5TTGhKb3NLRlJRSk83d1crME1Zdlg3SWdiNnA5Yldnd2w3TVBsYnVOWFd1cGJhblhSTStFR2h0S2p4Y2ZGTjl3ai9EaldUOElqdDdQaUJBYTFlUEJURlE3MTRTTVhEaXVJYTlaMytsQUh0ZkdOT2dldCtVR3h1YkdvL1BHMlZxMFFNTnlWbW1JQkY1VktsRWxudXgvZ3BGYmxaMlp3MytxYnFlL0pIekY3SFVFR2lBOWVCS240TlJacEdxOXlWNEt1N2NnL3VTbENzMW4yN0swWXdmQ0c5c01BSFI3VHBKZkxEc1QveHhBNUYzQUVnL2QzT1Y4OUh4Vnp0K1d5RGhWbGg1bjUxYlBSUm1mWnArZS9lemZtK1U3NUxDME45M1A3S044TU1SRncxb2RCZjZGMmhsaURyS2tLVHFsTkJCaGZ4YkVjVEdpQzUwRmNaSFR3SGJqd1V0czdxSXR3dVVncFdHRHFWRGc4M2tGUnFkMVJ3RmZZV052cHE0b28rbk1tWjRqWlUwTkNIVytXUU5mVHI3dEdIQTdsUzNheXlBOWNiV1YzcHE3Vk91cWRmbmNDdlR1QlhKL0NycHY0NG1ycTVhMm9jOHlFdjdZb3FOTkN2TkhXZTd5RVd0aHBhY2J4OVRNem5ZZGg0WEZKRWlsMlh6V0szMldDRVN3a1VuN2RsWUpROGpVM2JVTTU2YUdJMjRYWXUwU1VWSzVNeWtsb3Jqcm5SZ3dtcnhyRFowUW9BY3ZRcVp5UkdYdkJSNm1TV20vU1MwdE55bVF1YThTK2RSREJVanpPd0xscFZWRlZ0M1ZaMmVsZnQ0RlkvMjBhcFE1b3hIb0x1dUpYVi9iSGt3Z01lZmJFeXR1NlVDR2taSXphbnJSSisvQnl6aXdZbkRwR0xyZXdNOHJPakNMa1kyVzJtcDRTMmNrWlR2bnNvbUFZT2VCWE9HV25rOTRwZkkzeWFOMVYrVXk0TkNsb29vQkpSNGJtWmlvWmEwZEJlalpZN2VuNkt1MlEwdE1Cc0JkSnFRQVJDZHlMVmd3S0hDcUoyZnM3RnlLcHlUQlVkSzg1WHJJTmV3aTc3NDV1OGoyc0hOYmFhb0thcGRoMXRIYWFqN0d3ajlVQkllRXBPVEhVNGJlYkNsc2pUcFEwSGNVczFib1FscCtWNi8vN21aajJqVHVycU4rMVNsVWNQTTJPTmpuMUtUT2pMT21BRlRGUU5ZbEVaTUt5MURyV2xkZExOYUM0dWE2Nmt2Qkg4T3ZyTGh4TCt0dTYycnQvYVpXR1VROEp2TGFnZW9yVWR2VEVLY2JnaWdBYzVBRDEweFJkVzBib2Z5aWlsTFR2R1U4YXVmbFBqbWszYWZsVkY3b09QcFFaY2g1dEZNZmxjZUxwMnBUNmdoeWtINjZuaWxSdFdKdjFXY2NRZU5hUWtnNSsxMXpXTnphcDdxZHVCVXo4R0t3RzdJRGg0Tm9DeHhEaGhVRVNRbXF0b2ZRUXd4ZG01RFJDMGhhL0p1Q0dvRC9SNE9oei9yeFdzekRYczdiY1ovaC9vSjhhaTYrdGtZVTlOWDFPSmdaakxFQnNrOHpMdUxjcU1xOHZnLzZ6UXVoNi9kK1dObDZtbitQb1MxME9tT1BJaXVpb3IvSkE1cHBldWVPbVdYZmFTUDVGaktwd0pXRHBoUnJaSGIvOEsvZzJtcS9lNWNYNVlxNWREaTR6dTZvd0x2bkRhdEY2NjJ5eEpTOG5OM2dvNXJoYkh2WDZiNGY5K1kzR2szR3VLWTIyWkNuSE1LUHVmSVk0Z0VQQ3YvK25FRVUvYi9HankyRXl2SHNDL1ZXS01lYVRtMm1zdXhUeDdHK09SNitqVXFpSmZxa3FWUjJyaWpTblBYL3pqcTJjdjdHYy8vL1FMWFNoUmNlQm1RM2xmcFhxeDlSWUhkS3lxSmp4VkczYUtBbCtWcnlqdnpWUnZ0LzR4RitoTklkWVZaNGRHQzkrYjhHTmduK0VoenJoZy9CSVBqT0FiRXNBa3d6MEU3S2RYL1Y2M293cVJnRUJja25Ka3RCc1VUNVdpTk5EWXdwR0JjazZuNE5xVWM3dDVidGVjTzdmbGNwRTZQQ3k1T2Vib21CSStrcFZ5eWlLajF2ZndNTWN6c3RSOWw1bXlFd1NlekxSRkdpWlViaE5VYmpVcTE0eXFBQ1RybU9PMlVrbmx0NnVjWXkzT2hCVi9LRlZmemxHbDFySVJFRlR6T29Nektaem1hcTJ1eUpjNk5IOFN0Y2FIY0R6Myt4T3BOZE1RL3RucnRkd0EvYXJYNmxCOU9Yb05aNHM4aisrUlk0RVRMcDE1bTMzWDZYVUc4Sis5b3QxYmMrYzZXdEtlTTV4V0hUdno4WEx1OEtQTzZkUnhuTitMM05UeGNYL1doZS9RVWFlNFYvQ241OWsyT3ZXYzd3eEFSSHZwenROMGtSenU3cDc1NmZuUzdZeWpZUGN2UHo4TGRxSEQycnl3clJTMjljSjBmRGx0RWFNZ0J5NUFRem5IdTNhaUFFam5jNVNCczFqZ3JDNU81VzdTbWIzS1VWU1lJY1gxQlR6c2tOQ1U2NnRIQWRUNjNYVUh0N1JGNGZ4Nmt4WVMwQ0crdEJFUFNpVWVIZDdyaE5lSUVxZDN3K2l5WXpxdERGdExIelpvV3NTTGEreGxrV05ZYlR4bjR0NU1sYXZCYUpCTFBGdVgzNENDaHlWUVVCU24vd1hESFN1YnRHdkxLUUx6Tkh5UW5RLzhnT0VWV09VTU9DTjdnUE0vNGhSaDNKKzRRd0JMa2JMMzRHVE0xb3gycjE4M3QzSGR3cnVzVy9neDZqWmVxOTBHSzBoZnlRbWwzVUpadDdwWVJvVlFLNmJUNXliVUdDbGMzZkI3L1M5UnFEKzhicCtaVUljWjZaZ0ZEK0p2VVMxeHRybFVJWjRINTY1TlRLaVFBS1hlUVlYQVU2SnB0VGRkcVpkUGdpdUpjcmEyZnVzcEFsMzRDNC9ZT2ZFVzZUay9SeFBmbWJhbGlqTUVsQXo4cU0zWkpsNk13RmZSVWpQTm5XVTRQaGZMMDJ6YnlpbHY4ZXN0Wmw0Y2VtTEZyYkxhVnBqMzZ2cGJQV1d2RDVtU2Nwb3IwdkRXbU8zTWhWQldqQ21yeFVnaTg1K2lCbUlSQTAvbk1MTTNhYkNRMmZQVU1TN285dUxOVEc3MFdRbHNnSHlCdWRoUEwyZTZTelBveFhYNzJocnVUbENjbXk0dTZOZXpoeXV5ei9Uc00zbEVlYzFLL1NGZGM5aG1XM3h0T3EzTy80a0ZlRk1MaUJ0ZUdqVDM4S29WY0FVb3g2V2ZGTmV4cjhBUkduRzh2bE1jTXlPT0g5YkRVZEhhaHZVYTVvYXJXS0ZoYnJZODgwekxQRFBTQWM0cVRTL1dibXc0VWlmVGpJMjlyVXVMYVZjRC9sWUxPYTJxelJubERRMjEyTVBiWUhjL0NIdkd0U2FZeGkzV0ZORXFMai9ReFlianc2U3NkNGtxaVpzeTFZN1hnSXNQZERrclFuOWREZjMxU3VnekRmcXNEUDJIYXVnL3JPcENpV2tIaThLcDJsNlNtSGJyYTB1WGFndnJtdEdlYVlWbkt3b0hXbmRPOUZWVENmVzdEYjB3L0k4ZHUxQnpNWEtBbm1KL2dQK0hESXlGVmVWQ3ZkenZ2K2RQZlFGRkpnd2dvUThKZzFWZ2lScHRZWlZLYWR0QVBhMmlXZ0UwckFFYUdvQ0dCRFNMUjRYTHdPVzNFa2xoUytxNnZwNC9XZFdBRkFRaXlEVTFEL21TdFlUWFZ1OGtaUlp1bXpod1hJRVdGWTRUK3VrMVgrdTl0UkpCWXNLUTVDZ1NBOFQ2OFN0c3ZQNVBYT0ZhRE91Uis2V1ViYXRGMVlkWktkb3NZOXBhbUVNTm9sV0d0QTBsWEdPSmNVMkpjYW1FOEM2ekNxck81a2hqZzdwaGtxS0M2KytnbkdrN0tBdVd0OFlyRFpuYkVGbTRGaktqY2FHdGZjeEdUWDFIb0dsMFZZdFZTVDVJV040QzVaQnNyUmpYYnQ3UVY4WmlGbitpbStKNkx0TjlWcG4yb1d1RzVMbFhkSkM4TS9OSzJ6N29ZS2c0U1VzVWtrWTlBemZqdVI5MHJ0aGpwbXpOZnN4NlJWS2dRS2dVdUZZTFhQTUNRdHRxam93L3VjcEVBbk8rSzRKRlY4ZUpVd29uVXdrWUVOU3kyd1dYQ0U5TExjUHd3b2tHSWZCREM0VEtVaUh0NEVHb1JYQXRnRGZUS1M5cVNEOGJCOEhPS0N1OG85cWkyVkJJbDFLdlZUUkNyQVpTdG04OUNKclJoQ1kwWVEyYUZjTWl0VDBDbFhmQlF3RndjaFRCVlJRZjc2eGpHNUpPekYxUmJDV29LRk1hNFU1TFNlR3BPdHZTbnd4TFpVb1Z3dnJJQllJOEpxTnRLOUlvT0QxNWU5b1JDeER6MlFnUkswck9uUmgwbVUyWHNLb095a25CeGRFTld0bzljTFFDaG51aVdaWU5ZZERWditxbTJyR0Q5NXFlNUdyelZOTlYvRm85Vk03WmpXSEFHWDR1Z25iZko4R2xvVEhKdzBsNDRBTnF1Q0ZKUVBHV2FzcU1rMm5KQ1c1cHdzUHkrSVppMGszYnV0Vk5PN1hVY3ljTXFGMktjYWpRa3BDREsvaHhJYytnZ0ZQbnVKQ3V3akJtdzVoY3ZVRWJQMDRibHhDQnpqRVFEeUtVejJ4VzRpd09uYmE3Q3FmTHp3aHNtMnBZZ1ZNOVo1MnVXaytYaTdsblVaMzVQS1FycGlNVDhTaVg0NWJGZ20rcUxNbEZXNXNIRmFDTFNhNGhWMkxJbHJSS0hTOXZFbjFYcDlxLzJobmV1a1pSK0ZKa2ZDVmtWM0twanZVbHlGcGZRMGtHaG9rT3NDMHFXc25tZ0d4YWM3Zkw3VlQ2MlV3aHFxcDJwblNDMjZySXkxU3Nub05mWWZYK1M4aUdndzMrTVhnSkFaMTZVaHp2amlwaGhSeFdhUFk0RExBS0c2OWhJQ3FSVmg2RGQ0amUycEttRVRRS2VVbHlzemMyMUFpeVE0SHJoOXBnd0ZtaXV6aEdiYTdSa2E4ZjBFMXAxYW1SalhTWnptekVYYmx6TUhlL1VncnVpZnltb0lPWkNIVVJRLzJpZTdDK0lJT0prb0xrbjNBL0I2U0wvNWlkRXEvSjdlRm11VGI5eGFkUVZEckt5L0U1Ym5YTlFXWFR1dHp5SzdYTmpxQW1NTU5RQVdpY3pNb1p1S2lYd3ozMXdtNzJaems2bzFDWVlkWHZjeFNxQW1wMml0K29FTkxaYVljMlBYRCtuTGJZc1JHd0dUZ25YVVdCRlQ0UjlTanVuTVhQVFNHdHVBZFMwM0J1cnVIY3J4cXVWc045cGlyT1BlSDFVT05PWDZpS2N4dXB1SEJORlJjMlVuR3VvdUxjU2hVWHJxUGl5RU10dFUybWM4S1BxK0xNUW5GYkZlZFdxTGp3TTFSeHdyZWxOcURuZFZ4Yi9OeWhlNHNmbFpDeWh5dXJzTEd4dTYxZkNsR2N3QmZYck1pTEhrb0xWcFB4T1hpbXJoUEh2aGRiWFF4WFZPZTFFeTlkeEg1azllcnpsV0JLcXJkM2krZUo3RFhqV1Z1TkZjNnF4b1oycGwrS0ROVVhOSmFFUmVWM0xyVGxuUzNtb2R1Y3J5ei9XcllxY1Z5VEszV0Iwbm91aWVqKzErRzBPSnlXYTJDMGhzTzZvV0lzaGdyQlpOUGhKVTJOWEQzbW9NYStjdkVxcm5BK0VYaFAyYzV4aFhCWEZpa0o4N1l4WU9VSHhXTklQNWsyV3BHdlZodlIzeXg0dW9MNDRoR3BmL0hPbG5NblpvSGo0OEZOMFNJZlUrVHBwZEM2SXNaK0JBOURIaXpIbnp2NjdISXhQS2NLWGwxNENJVXdqdzlhZmtIU2xCaVI1Y3VvVEYyZ0tlZGp4VW15K0FrQ3A0U3Fzb0M0UXNkMGgxR1p4NzBDajM4Uk9TWTVsL2xSV3J4RUx3OTJGcmd0WDN3UUQ5ZmpuOTcrMU1yNkVvTG03VThod3RSZkVSc3NFRjVBZDI4dFd1Sk1BWEZqUWN2RHlKVzRWTUlheWxCL1BSbnFmNTR5aElUSDN0Ukx4K2Y4ZERPZzZjd3prZFFUeFhzWnVDd2g2UlhKS2t1SUtyTW1rZjJrRXZ5WkNYUU5vd3ZBZVBZc3lseCs1MmJ2WEVPNVJCWk1EQ1hsV3plNWRVZXF6WWpUUmxXYXE5eklkOGkwMWUxWkxRL2FJQ092TWxQWEhoVDB4RWdjZjE1SUhoN2oyUVJiMlFHTTJWdXVLckxGY0RkeU12V3ZNZGhNZUU0aWU1WWx2Vkd1aFhMR1l5OUorR0szWjB4Y2w1WGdRcE1veGp0OEhIbUhGdGlOd1hKT3V1bWI0bUlGUDdCRlVNY3drVktjamNlRFFHWG00dHdJV21tNjl2eEdUTWlUWGJaUlBqQVkxMUNQY0FkWWR2QXZjZlpUT0NuU3dyczdtL3l6ZFh4a1hkZHplcXFLclF3Z2x1bHU0SmdZUzYwTWFKbUtFYTVNeW5jUXR4RzZ6K3VSWnpPQTQ0Y2o4bVhQVTl4K2k3TzN1SVRmV3RkMWFxbkE4VkJlY1ROaWZ0OWpHSVUyN3N5SVltYytzaTV3WjJPM3pXaW1nRGRzbTE5NlFHY0kwLzBGc2dQZDZCYU5rRzdVdk5yS0hlRnpiSHk2VG5mZnZlNnVlOTZkOUw3YmRyOWI5NzliZHNEYjlzQ21YYkJ4SDRRUFZQbDFsSHFIekpsZk90YzBybVgzZk1KSDJUNXpvblNRVTdub29ubS96T2dTTVFkRS9LdC9Ga0tYbHpjODhpWG11QU1YaHVmVUN6dVlyMlJkYk1nK3AxNkJzc0dUblRRSy9QSFR5Y1I2V05qa2M2S3N1OXRXVnZEdEtDdjRUdHVzSnpIY2lDNHZ1L3FHRUpGZm9EdERyNFlXWW5Sa2NVNzNKTUs3SkNzSjNMZzhSNHZDd3YxWFdSSmxoUWJDb1A0SEUwOFJsWTBjLzVWMHpUZXlaQmZnenZKY04vVHJSbFpaL0NneEhiTTFzVEsrYXJ5UHFmRVF4aTJWWGwzUi8vNTZ6eUFyUnVNalV5dlVjOVpVZUdyWkhWYWxTUlZpV2hwcGQybTZTTVVyZWpuL2h0NmU3OHZsV3pyenM2WjVwK0JUTGpRL0RjNFNlSXVsdloza1E2N2Fxc2xaZDFWTXVLYU5sMXl2VUVQZDhyWVRva0c1NUlSRGpHaDkzUzFCOHRvQ1RMcXVwWld2ZFNiUWhvWHE2bXJoOHNuSnVEMStjME5aVVNvd01SU0hmVnh6dVQ4NExTQng4ejFVVjVUaFNIK2Q3NUs2RnE4M04xQVBLb1NJcGZMYkpaS090SHdSUXFJN2FVSit5NGY2a2grM3Y4dnhLK25YakIvRHp4R3JsR1diVC95d1EvZGdsRGNDVkVwMDFHWlhZam5yTlFsdWVVcFp1ZUdlRGtBRkJoSjdEckFNVGs4WFRsaFI4bzlvZHpkRzZ6WnVlSE1VQjdrUDRoL3ZnMjVvNHQrREN2N3RadndybktaL2dJZnBsd1pEbm9KdzVFekZXMGJYckwyRnJsNGlrdTNzdkJXRHY2SnhrU0FLeWJ4dHlXWlYzMThyN3pPeU53ZzJ2NDRFT2U2UzZVRnlkMENXSFZrT2VPOUVTV1hSM2VxMk01L1QxZlFjRUY0cXZ4SFJOd0pDT0NFODhJWWh0VlN6RDczL1pMOVYxRlo0RHp6VW0vYkFsSFNXN2JSTFNhNVprZG5semVzODNWMWpOM3JBcnk1SXVIYlRKU0UzMXpTVmNhMit1aGJoSGpEZmhoSVliOGV5ZnQ0Z3RndlNrYjloL2p1Zzd4bm5NMzFmWjF6T2pkbzZrSzRDa3Y4T1ZaRHNzU1JQaDQ1dFNNd0RXYkdkTjFDNWNEbWZMOUw0S0U5MnRlUk41QUowOGd1Ylh6dVlQNGVGNXhsLzNpenQ3MWZCK1laZC9ocTYxZGZ3TlQ2WWdTaTdpd01ZTUQ3c1FMTlVuZmRBVzVxa010c2M4VTRRTDBQNzh6aUpnZW9TZUU2eWpEMzlTQVhLaFY0THRhN2M0Nkx0bmV0a3MrMkZFc1ZkTWVvaENhMThCdGo2cHNobXNJQXNJVkhmNEEzU3YvK2VDUkE4enVSamlJOWhxNlVHYzdqWTVpRWNQSUh1Mlo5ZlBQdkJPdmNYTDJQUHkzSkk0OHFjdytVNXVMa2xyWDh0NzA5NEJkR1l4akVBeUcyWVdYN0FOYlJhUzEyVFZsbldmY050RlVOWlRvRHNYRm1RVHZhdVVFMUFLWnhwNFhKaXJ0TFAxTGtFSXpucW1SdnN1OTdCUHBBay9raks5dnFycTFYb3Z5dGdvUk9ESjNkNUY1Z1ZiMCthTy9HWng3d3dXcDZkcXhVQ0ZDOHV2REMxYVc0dWhvRTJkZHcyem9rc2ptU05oUnhYVnBZZ1BBTUNVdzhwQlRDVjlkR3lBcXBtR1pHYytweC84Y1pSUExGRUhicFo1aHN4ZWhRN2hKUnc4N0E1SEE3enVPbkVEL1lzdFovdTg2dDBsWDRJS2UwOFlVWUpyWFlCQkkzVmxEVENpNEdFakdmeTZyUnhNMDZRYlFvcDRNdDZqbGJ4UDNucGowRDBpemlPWWt0bUtUVFl4a3FlVVlOM1cwV1BDQmluYk1KTUZuTVVJM1dISkc2Njd4MFZzbVgzRjBuNlZhN293RnFhL3BxMXRIa2VPaEJrUXdrbWN3V2s5dzJ3bnJ6MEtScXVWcWwvZ0Nzb2xPeDJwanRsTndHS3FjZHRpRTdBaDR5aEZLL2k4SmVuNVNNZGZncURIMzRLQnhLUkt0SEdRK1Z5T0Ywazh4ZlpHVVFrS2lpS21oanhXb25haFdXbTZybnpxaWh2K0NtWktJVlZ4RUR6T3RDOFFraHJjcmtpbDZ2a3lrWlJZcHZ5V3prSVZiblBUcm56YmxiaWdYYUtrWnBPWnhodHFDblorVVdZbG8yRjlkMWxQZjBtTlV5MFVCU01PZSt2SUpMbmNSVGlZU3VaN3RMbXBrMzZpQ2tmdmlPUlBNZXVIaW9ySTNzeGR4WUE3STBmZ0tiRUM0aHlSVjVjd2MzTmlVbTB4Q01sVWlpQVF5QmVndHQ3MU8xMk85MmEzSUVYUkRHNVEraVFoaTB4dlBiMUlYWWxBRHZsVy8wRXVGMU94UzZ6ZWtRQVFNTWY0azh4N0VoKzRkaUw0MUx3Y0Rqa0w2ZitsVGVwZkV1TDdieXhqM2N2Vy8zeTNWcVFieXNYYnRUSWgyekxsQXQ0aG5ueHIvRzlSYlhhNW16Ri95MmVmMW1SWCtVTlpmelRIM2Nyc2xKRnZIQXlWOWNOeUo5M0tFWGx2czYzMlIvbUZzTDY0dFZBdmd4R0h3cWNNWlhIR1dRcW11aDFKRVY0WWt5SnFmeWxGYlFFTUM3V1lFSDl0SnluL21KK0RZaWN5U1MvblJMUDRpdEJ3ZHZkQ29ENitFTWQvK1I0QWFNZDJXaGlKZXBLdHF6YmF5ckJpU05mTTNqSWtIcGduN0FuQm9GVDBmMjJyQzNxTmJ5djBPOVErVDJqMzYzYXNxcXZwUlJWSFNwemNoUGdlVHVyc1BQVTBKaGFDN200eElmS216SVd1MjExenN5U3E4NmhIQitHbVQ0L1phaUpNK1Y5OC9MSG4zLzU5ZE5xVGpIKzNrNURxcmsveW5pSGg5NThwSmF0YjRFeVo1OTdJS1BSdGRYQXBjeXlyblFwYzVoNTYxQ01MZ3NnY1pzWVEwdUxOQWEzMkxIaGI3dVE2Sm9TbmNTWTFaZzZ6aE52RjB1QzBlTVZYM2JIdlpjRVQ2NTNrbVFKTGRMckh6eDJmU0JvN3ArRmVNRUJQOEJlTENLa0N0RXh4WHcrL2toOTZkYTk1QldzTEZyN2RseDZxUVM0K0syK2VFWkJ4V1FVQnV4R25ISXRNc1lMdXFzS3VoVUY2ZkNReXBKN2ZjU1pWQ0ZkWGRaVnkvSlNZMU1oQ2kyT09JdmtLVGZieXE3UnZYenFmeUhYRWVhdisvbnI0c2xYYWdUQVdJRG1tT21RZlRXcmtoMVBVKy9tK1pOemY1cVc4a3JtMElwTUVsaTBMMHJSM21PS0dGU1hSQXp2TUdSTTZnSlIxV2FuRURTdFREM09LMEx5QmVZcXZueWZuNXQ5QTVZckplWG53OStveStPeWo3NjI5QjJ0cG4yeTN6TFZHRDk1eUhuNHJzMFI3QTh3Wm9QL2I5cEVWcHVCeTRpM0kxQ01CMWVPdTNoUWlSTHV5VHhRRTBFcnNFQm52d1dhZGJEUUFiTzNxa3hUTEFMRGZiT00wTngvYlNUUDdyZHBKTlB1Q00yTmdaRzFUTHdkM2taSW9NZmRMUStyS3BJaCtsQWNOMnFDOFRwdThQaXluY01VY3lKbDJPMFBjRzZHenJmc1BkbmJ4d2M2Zi9hNzNyNTIzSlZDUDVGc2tvQ2l3b092TnA5ZW8rOW10U0phNVI0bEE1bDczZS82a2t5a3VZTE1KNzEraGNRVXRiQ2s4NDRvZlBMZG1uelVWV21aamYxN1lDTVNKcWtVQTh4S0luUGRWZG5XOTBKZWQ5QlFHRDhlZ1lQOTdrR1RWbDRoaGgrTmhYdmR3ZWZHUW1ETkIvY1RyUnZmUno4WmRML1Blek5RL0RrMDgzNXY4TUZxKzE2YldTUHdqaFQyUFZMWVVHRi9PZ0xYVnRZZnVZay9SMjJ0RWZoWmF1c2FGbjRlMmxydkpNMjA5YWZqWUVOTi9SRVkrS0Ztc3h6SGFBbmFHdWpsbmxvRkx5SnFaR1UycnlyZytlV2YvL2pxOWZOZXovN3A1K2UvL2ZnQ0o4UWdCMmQ1MEpsNFUyc0xrcmJhN0NHUTBtWmJmMzcxaXdnVWJoR0Evd0xrbTZvSicKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz16bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZShrZXJuZWxfY3BwKSkuZGVjb2RlKCksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz0oWyItc2F2ZS10ZW1wcyJdIGlmIFRFU1RJTkcgaXMgbm90IE5vbmUgZWxzZSBbXSkgKyBbIi1zdGQ9YysrMjAiLCAiLVdlcnJvciJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvd29ya3NwYWNlL2J1aWxkLyIgaWYgVEVTVElORyA9PSAidnNjb2RlIiBlbHNlICIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICAqKih7J25vX2ltcGxpY2l0X2hlYWRlcnMnOiBUcnVlfSBpZiBURVNUSU5HICE9ICJ2c2NvZGUiIGVsc2Uge30pLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgIyBhID0gYS5jb250aWd1b3VzKCkKICAgICMgYiA9IGIuY29udGlndW91cygpCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMKSource code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 27020.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIFggY29uc3RleHByCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgQApkbyBACnsgQApoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpIEAKeyBACnN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiBACjw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKPDwgJzonIDw8IF9fTElORV9fIDw8ICdAbic7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApleGl0KGVycm9yKTsgQAp9IEAKfSBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07ClggaW50IHdhcnBfc2l6ZSA9IDY0OwpYIGludCBjYWNoZV9saW5lX3NpemUgPSAxMjg7ClggaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpYIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKWCBpbnQga19ibG9ja19zaXplX211bHRpcGxlID0gMTI4Owp1c2luZyByZWdpc3Rlcl90eXBlID0gdWludDMyX3Q7CnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpYIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KWCBhdXRvIGRpdmlkZV9leGFjdCgpIHsKc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwpyZXR1cm4gYSAvIGI7Cn0KdGVtcGxhdGU8aW50IGluYywgaW50IGFkZCwgdHlwZW5hbWUgc2VxPgpzdHJ1Y3QgbXVsdGlwbHlfYnlfaW5jOwp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCBpbnQuLi4gSXM+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM8aW5jLCBhZGQsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPj4gewp1c2luZyB0eXBlID0gc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgKGluYyAqIElzICsgYWRkKS4uLj47Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYywgaW50Li4uIElzPgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXIgewp1c2luZyB0eXBlID0gdHlwZW5hbWUgbXVsdGlwbHlfYnlfaW5jPGluYywgSSwgc3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2U8aW50LCAoTiAtIEkpIC8gaW5jPj46OnR5cGU7Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYz4KdXNpbmcgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYyA9IHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmNfaGVscGVyPEksIE4sIGluYz46OnR5cGU7CnRlbXBsYXRlPHR5cGVuYW1lIEYsIGludC4uLiBJcz4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGxfYXBwbHkoRiBmLCBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCBJcy4uLj4pIHsKKGYudGVtcGxhdGUgb3BlcmF0b3IoKTxJcz4oKSwgLi4uKTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IE4sIGludCBpbmMgPSAxLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbChGIGYpIHsKdW5yb2xsX2FwcGx5KGYsIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmM8SSwgTiwgaW5jPnt9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwxZChGIGYpIHsKdW5yb2xsPDAsIEk+KGYpOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwp9KTsKfSk7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCBpbnQgSywgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwzZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CnVucm9sbDwwLCBLPihbJl08aW50IGs+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGosIGs+KCk7Cn0pOwp9KTsKfSk7Cn0KdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIGNsZWFyKFQgKCZhcnJheSlbTl0pIHsKdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewphcnJheVtpXSA9IFR7MH07Cn0pOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxiZjE2PigKc3RhdGljX2Nhc3Q8dWludDE2X3Q+KApzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgopCik7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KZnAzMiBmcDMyX2Zyb21fZnA4KGZwOCB4KSB7CiNpZmRlZiBfX2dmeDk0Ml9fCnJldHVybiBmbG9hdCh4KTsKI2Vsc2UKcmV0dXJuIGZsb2F0KHgpOwojZW5kaWYKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzZWxlY3QoYm9vbCBjb25kLCBGIGYpIHsKaWYgKGNvbmQpIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KCk7Cn0gZWxzZSB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxmYWxzZT4oKTsKfQp9CnRlbXBsYXRlPGludCBkcHBfY3RybCwgaW50IHJvd19tYXNrID0gMHhmLCBpbnQgYmFua19tYXNrID0gMHhmLCBib29sIGJvdW5kX2N0cmwgPSBmYWxzZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3Qgc2hmbF9kcHAodWludDMyX3QgeCkgewpyZXR1cm4gX19idWlsdGluX2FtZGdjbl91cGRhdGVfZHBwKHgsIHgsIGRwcF9jdHJsLCByb3dfbWFzaywgYmFua19tYXNrLCBib3VuZF9jdHJsKTsKfQp0ZW1wbGF0ZTxpbnQgbGFuZV9zdHJpZGU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnVpbnQzMl90IHRyYW5zcG9zZV80eDRfZjhfdjIodWludDMyX3QgaW5wdXQpIHsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA8IHdhcnBfc2l6ZSAvIDQsICJsYW5lIHN0cmlkZSBpcyB0b28gbGFyZ2UiKTsKc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA9PSAxLCAiRFBQIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGxhbmVfc3RyaWRlID09IDEiKTsKY29uc3QgYXV0byBsYW5lID0gX19sYW5lX2lkKCk7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IGxhbmUgLyBsYW5lX3N0cmlkZSAlIDQ7CmNvbnN0IGF1dG8gdDJ4MiA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIwMScwMCcxMScxMD4odDJ4MiksCnQyeDIsCmdyb3VwX2xhbmVfaW5kZXggPCAyCj8gMHgwNScwNCcwMScwMAo6IDB4MDMnMDInMDcnMDYKKTsKcmV0dXJuIHQ0eDQ7Cn0KX19kZXZpY2VfXyB1aW50OF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmk4Iik7Cl9fZGV2aWNlX18gdWludDE2X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxNihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxNiIpOwpfX2RldmljZV9fIHVpbnQzMl90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMzIoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMzIiKTsKX19kZXZpY2VfXyB1aW50NjRfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTY0Iik7Cl9fZGV2aWNlX18gX191aW50MTI4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMTI4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I4KHVpbnQ4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmk4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNih1aW50MTZfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTE2Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMih1aW50MzJfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTMyIik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCh1aW50NjRfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTY0Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxMjgoX191aW50MTI4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmkxMjgiKTsKZW51bSBjbGFzcyBjb2hlcmVuY3kgewpjYWNoZV9hbGwgPSAwLApjYWNoZV9nbG9iYWwgPSAxLApjYWNoZV9zdHJlYW0gPSAyLApub25fdGVtcG9yYWwgPSAzCn07CnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgYnVmZmVyIHsKc3RydWN0IGJ1ZmZlcl9yZXNvdXJjZSB7CmNvbnN0IHZvaWQqIHB0cjsKdWludDMyX3QgcmFuZ2U7CnVpbnQzMl90IGNvbmZpZzsKfTsKdXNpbmcgZWxlbV90eXBlID0gc3RkOjpyZW1vdmVfY3ZfdDxUPjsKYnVmZmVyX3Jlc291cmNlIHJzcmM7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJ1ZmZlcihUKiBwb2ludGVyLCB1aW50MzJfdCBzaXplKSB7CnRoaXMtPnJzcmMgPSBidWZmZXJfcmVzb3VyY2V7CnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBvaW50ZXIpLApzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSAqIHNpemVvZihlbGVtX3R5cGUpKSwKMHgwMDAyMDAwMFUKfTsKfQp0ZW1wbGF0ZTxzaXplX3QgTiwgY29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+IGxvYWQoCnVpbnQzMl90IHdhdmVfb2Zmc2V0LAp1aW50MzJfdCB0aHJlYWRfb2Zmc2V0LApib29sIGluX2JvdW5kcyA9IHRydWUKKSBjb25zdCB7CnVzaW5nIHJlc3VsdF90eXBlID0gc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+OwpYIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBYIChsb2FkX3NpemUgPT0gMSkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDIpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMTYoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBYIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIFggKGxvYWRfc2l6ZSA9PSA4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDE2KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOCgKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChsb2FkX3NpemUgPT0gLTEsICJsb2FkIHNpemUgbm90IGltcGxlbWVudGVkIik7Cn0KfQp0ZW1wbGF0ZTxjb2hlcmVuY3kgYyA9IGNvaGVyZW5jeTo6Y2FjaGVfYWxsLCBzaXplX3QgTj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3Qgc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+JiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpYIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgWCAoc3RvcmVfc2l6ZSA9PSAxKSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgoCnN0ZDo6Yml0X2Nhc3Q8dWludDhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMikgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNigKc3RkOjpiaXRfY2FzdDx1aW50MTZfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gOCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMTYpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTI4KApzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgewpzdGF0aWNfYXNzZXJ0KHN0b3JlX3NpemUgPT0gLTEsICJzdG9yZSBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3QgZWxlbV90eXBlJiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpzdG9yZTxjPigKc3RkOjphcnJheTxlbGVtX3R5cGUsIDE+KHtkYXRhfSksCndhdmVfb2Zmc2V0LAp0aHJlYWRfb2Zmc2V0LAppbl9ib3VuZHMKKTsKfQp9Owp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyOwp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZQo+CnN0cnVjdCBibG9ja19sb2FkZXI8YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX24sIGxvYWRfdHlwZSwgdHJ1ZT4gewpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHNpemVvZihsb2FkX3R5cGUpID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGxvYWQgdHlwZSBzaXplIik7Clggc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKWCBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0OyAvLyBDb2luY2lkZXMgd2l0aCA0eDQgdHJhbnNwb3NlLgp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmNvbnN0IGludCBzcmNfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBtOwpjb25zdCBpbnQgc3JjX3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgYmxvY2tfb2ZmX207CmNvbnN0IGludCBzcmNfY29sID0gY29sICsgYmxvY2tfb2ZmX247CmNvbnN0IGJvb2wgaW5fYm91bmRzID0gc3JjX3JvdyA8IG0gJiYgc3JjX2NvbCA8IG47CmNvbnN0IGF1dG8gd29yZCA9IGJ1Zi50ZW1wbGF0ZSBsb2FkPHNpemVvZihsb2FkX3R5cGUpPihvZmZzZXQsIHNyY19vZmYsIGluX2JvdW5kcyk7CnJlc3VsdFtqXSA9IHN0ZDo6Yml0X2Nhc3Q8bG9hZF90eXBlPih3b3JkKTsKfSk7CnJldHVybiByZXN1bHQ7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgc3RvcmVfdG9fc21lbSgKZnA4KiBibG9ja190aWxlX2RzdCwKZnJnX3R5cGUgdGhyZWFkX3NyYywKaW50IG0sCmludCBuLAppbnQgYmxvY2tfb2ZmX20sCmludCBibG9ja19vZmZfbgopIHsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CmNvbnN0IGludCBncm91cF9pbmRleCA9IGkgJSBncm91cF9zaXplOwpjb25zdCBpbnQgZ3JvdXBfYmFuayA9IGkgLyBncm91cF9zaXplOwpjb25zdCBpbnQgcm93ID0gZ3JvdXBfYmFuayAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CmNvbnN0IGludCBjb2wgPSBncm91cF9pbmRleCArIGdyb3VwX2JhbmsgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tICogZ3JvdXBfc2l6ZTsKYXV0byogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmxvY2tfdGlsZV9kc3QpOwpjb25zdCBhdXRvIHNyYyA9IHN0ZDo6Yml0X2Nhc3Q8c3RkOjphcnJheTx1aW50MzJfdCwgND4+KHRocmVhZF9zcmNbal0pOwpYIGludCBsYW5lX3N0cmlkZSA9IDE7IC8vbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CmNvbnN0IGludCBkc3RfY29sID0gY29sOwphdXRvIHYgPSBzcmNbayAvIHNpemVvZih1aW50MzJfdCldOwp2ID0gdHJhbnNwb3NlXzR4NF9mOF92MjxsYW5lX3N0cmlkZT4odik7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IF9fbGFuZV9pZCgpIC8gbGFuZV9zdHJpZGUgJSA0OwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKPSB2Owp9KTsKfSk7Cn0KfTsKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKdXNpbmcgdHlwZSA9IFQ7Clggc3RhdGljIGNvbnN0IGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZV9tXzsKWCBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpYIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwpYIHN0YXRpYyBjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IGRpdmlkZV9leGFjdDx0b3RhbF9pdGVtcywgd2FycF9zaXplPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNfcGVyX3RocmVhZCA9IGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCk7CnJlZ2lzdGVyX3R5cGUgcmVnc1tyZWdpc3RlcnNfcGVyX3RocmVhZF07Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fClggc3RhdGljIG1mbWFfZnJhZ21lbnQgemVybygpIHsKcmV0dXJuIG1mbWFfZnJhZ21lbnR7e319Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9CnRlbXBsYXRlPHR5cGVuYW1lIFU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4mIHJlZ3NfYXMoKSB7CnN0YXRpY19hc3NlcnQoYnl0ZXNfcGVyX3RocmVhZCAlIHNpemVvZihVKSA9PSAwLCAidG90YWwgYnl0ZXMgaW4gdGhyZWFkIGZyYWdtZW50IG5vdCBkaXZpc2libGUgYnkgVSIpOwpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgY29uc3QgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBjbGVhcigpIHsKdW5yb2xsPDAsIHJlZ2lzdGVyc19wZXJfdGhyZWFkPihbJl08aW50IGk+IHsKdGhpcy0+cmVnc1tpXSA9IDA7Cn0pOwp9CnN0YXRpYyBYIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCnVzaW5nIGZhbGxiYWNrX21mbWEgPSBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND47CmNvbnN0IGF1dG8mIGFfdmFsdWVzID0gYS50aHJlYWRfdmFsdWVzKCk7CmNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CnVucm9sbDwwLCBmcmdfYV90eXBlOjppdGVtc19wZXJfdGhyZWFkPihbJl08aW50IGs+IHsKY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKY29uc3QgYXV0byBmYWxsYmFja19iID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYl90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYl92YWx1ZXNba10pKTsKZmFsbGJhY2tfbWZtYTo6ZXhlY3V0ZShjLCBmYWxsYmFja19hLCBmYWxsYmFja19iKTsKfSk7CiNlbmRpZgojZW5kaWYKfQp9Owp0ZW1wbGF0ZTw+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2PiB7CnVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+Owp1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMzIsIGZsb2F0PjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgZXhlY3V0ZSgKZnJnX2NfdHlwZSYgYywKY29uc3QgZnJnX2FfdHlwZSYgYSwKY29uc3QgZnJnX2JfdHlwZSYgYgopIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KYyA9IHN0ZDo6Yml0X2Nhc3Q8ZnJnX2NfdHlwZT4oCl9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYSksCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLApzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAowLAowLAowCikKKTsKI2Vsc2UKdXNpbmcgZmFsbGJhY2tfbWZtYSA9IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjsKY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKY29uc3QgYXV0byYgYl92YWx1ZXMgPSBiLnRocmVhZF92YWx1ZXMoKTsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaz4gewpjb25zdCBhdXRvIGZhbGxiYWNrX2EgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19hX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihhX3ZhbHVlc1trXSkpOwpjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwpmYWxsYmFja19tZm1hOjpleGVjdXRlKGMsIGZhbGxiYWNrX2EsIGZhbGxiYWNrX2IpOwp9KTsKI2VuZGlmCiNlbmRpZgp9Cn07Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgaXRlbTsKcmV0dXJuIHttLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDE2Owpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG4gPSBsYW5lICUgMzI7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgaXRlbTsKcmV0dXJuIHtuLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgawopIHsKWCBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpYIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07ClggaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKWCBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwpYIGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZS5tOwpYIGludCB3YXJwX3RpbGVfbiA9IHdhcnBfdGlsZS5uOwpYIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpYIGludCBjX3RvdGFsID0gYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9uOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2IpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChjX3RvdGFsICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2MpIGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHdhcnBfdGlsZV9tID09IDAsICJ3YXJwIHRpbGUgTSBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAlIHdhcnBfdGlsZV9uID09IDAsICJ3YXJwIHRpbGUgTiBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTiIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwpYIGludCB3YXJwX3RpbGVzX20gPSBibG9ja190aWxlX20gLyB3YXJwX3RpbGVfbTsKWCBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247ClggaW50IHdhcnBfdGlsZXNfayA9IGJsb2NrX3RpbGVfayAvIHdhcnBfdGlsZV9rOwpYIGludCB3YXJwX3RpbGVzX21uID0gd2FycF90aWxlc19tICogd2FycF90aWxlc19uOwpYIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7ClggaW50IGludHJhX3dhcnBfdGlsZXNfbiA9IHdhcnBzID09IDEgfHwgd2FycHMgPT0gMiA/IDEgOiB3YXJwcyA9PSA0ID8gMiA6IDQ7ClggaW50IGludHJhX3dhcnBfdGlsZV9tID0gZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpYIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKWCBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKWCBpbnQgd2FycF90aWxlX21uX2l0ZW1zID0gd2FycF90aWxlX20gKiB3YXJwX3RpbGVfbjsKdXNpbmcgbWZtYSA9IG1mbWFfZjMyX2Y4X2Y4PHdhcnBfdGlsZV9tLCB3YXJwX3RpbGVfbiwgd2FycF90aWxlX2s+Owp1c2luZyBmcmdfYV90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2FfdHlwZTsKdXNpbmcgZnJnX2JfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19iX3R5cGU7CnVzaW5nIGZyZ19jX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfY190eXBlOwp1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+Owp1c2luZyBibG9ja19sb2FkZXJfYSA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+Owp1c2luZyBibG9ja19sb2FkZXJfYiA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+OwpYIGludCBjX3Blcl90aHJlYWQgPSBjX3RvdGFsIC8gYmxvY2tfc2l6ZTsKc3RhdGljX2Fzc2VydChjX3Blcl90aHJlYWQgPT0gd2FycF90aWxlc19tbl9wZXJfd2FycCAqIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQsICJzYW5pdHkgY2hlY2siKTsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKY29uc3QgaW50IGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgaW50IHRpX20gPSBncmlkRGltLnggLSBibG9ja0lkeC54IC0gMTsKY29uc3QgaW50IHRpX24gPSBncmlkRGltLnkgLSBibG9ja0lkeC55IC0gMTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbSA9IHdhcnAgJSBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfaW4gPSB3YXJwIC8gaW50cmFfd2FycF90aWxlc19tOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29tID0gaW50cmFfd2FycF90aWxlX2ltICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29uID0gaW50cmFfd2FycF90aWxlX2luICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbiwgaW50cmFfd2FycF90aWxlc19uPigpOwppbnQgc24gPSBjZWlsX2RpdihuLCAxMjgpOwpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Fbd3RtICogd2FycF90aWxlX20gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbWtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYShsYW5lLCBmcmdfYV90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhta19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2ltICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbWtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Jbd3RuICogd2FycF90aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2JfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbmtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW4sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYihsYW5lLCBmcmdfYl90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhua19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2luICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYltpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbmtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwppZiBYIChwaXBlbGluZV9kZXB0aCA9PSAyKSB7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKX19idWlsdGluX2FtZGdjbl9zX3NldHByaW8oMSk7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKfQp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIHdhcnBfdGlsZXNfaz4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IHd0az4gewptZm1hOjpleGVjdXRlKAp3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLApmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLApmcmdfYltpd3RtXVtpd3RuXVt3dGtdCik7Cn0pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGludCB3dG0gPSBpbnRyYV93YXJwX3RpbGVfb20gKyBpd3RtOwpjb25zdCBpbnQgd3RuID0gaW50cmFfd2FycF90aWxlX29uICsgaXd0bjsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpibG9ja19jX2ZyZ1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0gKz0gd2FycF9mcmdfY1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0KKiBibG9ja190aWxlX3NjYWxpbmdbYmltXTsKfSk7CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDIpIHsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwpfX2J1aWx0aW5fYW1kZ2NuX3Nfc2V0cHJpbygwKTsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwp9Cn07CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDApIHsKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSBpZiBYIChwaXBlbGluZV9kZXB0aCA9PSAxKSB7CmludCBpID0gMDsKYXV0byBbZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19ic10gPSBsb2FkX2lucHV0KGkpOwpzdG9yZV9pbnB1dChpLCBmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwp9IGVsc2UgaWYgWCAocGlwZWxpbmVfZGVwdGggPT0gMikgewppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7CmF1dG8gW2ZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxXSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CmZvcig7IGkgKyBibG9ja190aWxlX2sgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxKTsKZnJnX2ExID0gZnJnX2E7CmZyZ19iMSA9IGZyZ19iOwpmcmdfYXMxID0gZnJnX2FzOwpmcmdfYnMxID0gZnJnX2JzOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CmlmIChpICsgYmxvY2tfdGlsZV9rIDwgaykgewpzdG9yZV9pbnB1dChpICsgYmxvY2tfdGlsZV9rLCBmcmdfYTEsIGZyZ19iMSwgZnJnX2FzMSwgZnJnX2JzMSk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkgKyBibG9ja190aWxlX2spOwp9Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQocGlwZWxpbmVfZGVwdGggPj0gMCAmJiBwaXBlbGluZV9kZXB0aCA8PSAyLCAiaW52YWxpZCBwaXBlbGluZSBkZXB0aCIpOwp9CmNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKY29uc3QgaW50IGluX2Jhc2UgPSB0aV9uICogYmxvY2tfdGlsZV9uOwphdXRvIGJ1ZiA9IGJ1ZmZlcjxiZjE2PihjLCBtICogbik7CnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBpbSA9IGltX2Jhc2UgKyBiaW07CmNvbnN0IGludCBpbiA9IGluX2Jhc2UgKyBiaW47CmNvbnN0IGF1dG8gdmFsID0gYmYxNl9mcm9tX2ZwMzIoYmxvY2tfY19mcmdbaXd0bV1baXd0bl0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dKTsKYnVmLnN0b3JlPGNvaGVyZW5jeTo6bm9uX3RlbXBvcmFsPih2YWwsIDAsIGltICogbiArIGluLCBpbSA8IG0gJiYgaW4gPCBuKTsKfSk7Cn0KX19kZXZpY2VfXwp2b2lkIHRyYW5zcG9zZV9tYXRyaXgoCmZwOCogb3V0cHV0LApjb25zdCBmcDgqIGlucHV0LAppbnQgbSwKaW50IG4sCmludCBibG9ja194LAppbnQgYmxvY2tfeQopIHsKYXV0byBpbiA9IGJ1ZmZlcjxjb25zdCB1aW50OF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbnB1dCksIG0gKiBuKTsKYXV0byBvdXQgPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ob3V0cHV0KSwgbiAqIG0pOwpjb25zdCBhdXRvIHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IDE2OwpfX3NoYXJlZF9fIHVpbnQ4X3QgdG1wWzY4ICogNjRdOwpjb25zdCBhdXRvIGJtID0gYmxvY2tfeCAqIDY0Owpjb25zdCBhdXRvIGJuID0gYmxvY2tfeSAqIDY0Owp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSArIGJuICogbTsKY29uc3QgaW50IHggPSBpIC8gNjQ7CmNvbnN0IGludCB5ID0gaSAlIDY0Owpjb25zdCBhdXRvIGl0ZW1zID0gaW4ubG9hZDxpdGVtc19wZXJfdGhyZWFkLCBjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4obywgeCAqIG0gKyB5KTsKKnJlaW50ZXJwcmV0X2Nhc3Q8X191aW50MTI4X3QqPigmdG1wW3ggKiA2OCArIHldKSA9IHN0ZDo6Yml0X2Nhc3Q8X191aW50MTI4X3Q+KGl0ZW1zKTsKfQpfX3N5bmN0aHJlYWRzKCk7CnsKY29uc3QgaW50IGkgPSB0aWQgKiBpdGVtc19wZXJfdGhyZWFkOwpjb25zdCBpbnQgbyA9IGJtICogbiArIGJuOwpjb25zdCBpbnQgeCA9IGkgJSA2NDsKY29uc3QgaW50IHkgPSBpIC8gNjQ7CnN0ZDo6YXJyYXk8dWludDhfdCwgaXRlbXNfcGVyX3RocmVhZD4gaXRlbXM7CmZvciAoaW50IGogPSAwOyBqIDwgaXRlbXNfcGVyX3RocmVhZDsgKytqKSB7CmNvbnN0IGludCBieCA9IChpICsgaikgLyA2NDsKY29uc3QgaW50IGJ5ID0gKGkgKyBqKSAlIDY0OwppdGVtc1tqXSA9IHRtcFtieCArIGJ5ICogNjhdOwp9Cm91dC5zdG9yZTxjb2hlcmVuY3k6OmNhY2hlX2FsbD4oCml0ZW1zLApvLAp4ICsgeSAqIG4KKTsKfQp9CnRlbXBsYXRlPAppbnQgYmxvY2tfc2l6ZSwKY3ViZSBibG9ja190aWxlLApjdWJlIHdhcnBfdGlsZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7CmhpcEV2ZW50X3Qgc3RhcnQsIHRhYiwgc3RvcDsKa2VybmVsPApibG9ja19zaXplLApibG9ja190aWxlLAp3YXJwX3RpbGUsCmxvYWRfdHlwZSwKcGlwZWxpbmVfZGVwdGgKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmEsCmIsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7CmFzc2VydChhX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYl9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYnNfcHRyICUgMTYgPT0gMCk7CmFzc2VydChjX3B0ciAlIDE2ID09IDApOwpjb25zdCBhdXRvKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihhX3B0cik7CmNvbnN0IGF1dG8qIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwpjb25zdCBhdXRvKiBicyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAzMio+KGJzX3B0cik7CmF1dG8qIGMgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihjX3B0cik7CmlmIChtID09IDEwMjQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyNTYpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgMiwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gMzA3MiAmJiBrID09IDE1MzYpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTc2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDUxMiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNDA5NiAmJiBrID09IDUxMikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB6bGliCmltcG9ydCBiYXNlNjQKCmlmICJQWVRPUkNIX1JPQ01fQVJDSCIgbm90IGluIG9zLmVudmlyb246CiAgICBvcy5lbnZpcm9uWyJQWVRPUkNIX1JPQ01fQVJDSCJdID0gImdmeDk0Mjp4bmFjay0iCgpURVNUSU5HID0gb3MuZW52aXJvbi5nZXQoIkdQVU1PREVfVEVTVElORyIsIE5vbmUpCgprZXJuZWxfY3BwID0gYidlSnp0ZlUxejIwaVM2Rm42RmRYcXNBMUtORVZTdEZvdFVaencrR1BHMjkzdWptbjN6bTVvRkFpQUJDV1lCTUFGUUgzWXJZZ1g3N3lIUGN4aEQzdDh4M2Q4eC9kcjlwZHNabGFoVUFVVVFGQ1cvTEZyaGswUmhhck1yS3lzck15c3IyLzljRHhmVGp3MlBQY1h1L0RmanBkaDZnZGU1M3kwK1czcDVYVFIyemUvY2FkVmI2YUxBLzNGNHRyMXcwbXZ0NXY5MEYvN1VaTEduaFBvYVlFVCtnczF5ZlhUMGVibXR4TnY2b2NlKy9PclgreG5mMzd4N0FkckhJVVRQL1dqc01VKytQTzNUZnllUkI4T3FRNysrL3NDTCtEakJ4cmlSUnhIc1oweUQvK3lZeVlaZFhRSDhQMnB4ZUYrYzR5NGZsMk94MTZTZkdnVDVQRHZoMGM1ZlB3azZlVHdjQXpWWU1NaDJ5SjJzUzM4RFJYNms1ZFN3bXNuOEhoTlcvam1rZlVJLy9DcTQzT0xucmNPb1dBSmZ2N1JZZjZheG41NHBrRGRZbjdJTWR2MmRCbU9iWnVuT21tVyt2TFZqeThndFFiK284TkhQT3VQcjE2LzRBQWUvUzE4dEY1YjYvQzlLejhWVk41ZVpDcmczOXdOUUNQOCs0R2R3Nzg4OStlZU5YWG1pZGZhM0Z3bTBKZ01sQjUwTWRzV0N0RDJCc0dlUFEyWDc0NUVCdFNYTW9jN25VZE8ydHMva3FYMyt2Q1NVdFcwcXdHbTRrdmJkbElRRzNlWmVyWnRXZDVWYWw5NDR4UTcrUFhDc3dhdFZpc3I2SXR5ZnBqdTlhSC9yMUdVY0JLZFRaRDI5cW5vSnFqdjVUaGw0Nlhyc2ZmRUlVRE5nallMMjJ4MnRIa0RXVUQzSktsM3RZanAxYVVUTCt6RWYrY0JvdjNCVWVIdDJCbWZlL1ljdEh5V3A5Yy9LTUVJYkhjZWpXZVV4UTZXODlSZnpESHZYcjhJTDJ5Y2MxYVJrK1BuTElxOU14K0tjQmJBdTZWZ00yUkl2V0F4ZDFJWXEvQmRDSnFEdldreitmdTMwU2EwUGd4MjBEdHRlK0pkK0dPUGZrNmplT3o1SWRYWVZraHlsbW5FNE0zY252Z1gxaHZtdE5sdnpHMEpIc2RldW94RFpqbHNoN25zTWV1MTJDNXpnZDA1SVVPQ0FNWG9yM3NyL0lEYW4zaTJkK1dNVXl2RG5hUk82bzl0SjBtOE9BVUtIZ0FGeDhlczIyWmJrOGhMV0JpbG9pQ2pndDlzZ1p3b1JEdGxVcEgvTU5hM3FTR2N5VVJoWE9MOXl5Z1RNdEVxMTdaN2JVUDJvMW9JOEtQVDZiQlhTVlh4SWVXbnZEUVlRQUh2RE5vV01DNjljRXd3MjFBZW9JeEdvdTVjREVUcjE1U3lBRGJiaHNMUVBvQ2hoVEI0WjlBb2ZzWHBmYzMvWlBRWHlYWm1IdEE3OGE0a0V2dlNUOCt4RHZhNU4xOTRzWWs2eVVGanRWK0pTZ3ZneGpxOEJzRjZoWUlGSlVhancwT0UyS1FTSTlGYjZnalhDRnhkd1NFZ0lRUmpTVWRPaEFUMFVtTmZFM20vaVB3Slc0WnhOSi9iemdLWVpMMWswd2J5a1BVRmE5cVJIVDhDT2gzUWoxWnJDT2l0VnB0QnpsWlowRXY4UWlXalNQekx0VWxIb2pPS3RNcEFWZXFZcTNEMS9ZMlowZytncWpjcDB6VUVMZkZxWkUycjJmSVBINFN6WDQzejVPRXAxeEpaWDlaei9FT2U0NjJhQXovbVJ2YmJrTk1TdWcwL04rSjNCU3RGN2ZEUER4OVV5YjE3cVdTZTY0YzgxNnlZcTU0ZE1PUnJIRkc1VXNNaGZjeWtBUmo2Qi9LbG5oM2p1ZWZFTURaYUQ1MDRkcTViSjY5UHkxeDVYY0VWS25MaW4wTHZlL08rZTZNUlZvT1lURG44c3FkeEZOaG9LbGxrdXJHckRQZnVMbnFvanhKMHVpNjhPQUd2aTZGbGorNFhveUhTbWMvWkREcGx3cUlwQTROblBFdXlrb0NOUlJPb201TkFSdXUxQXgwMFdicGhGQWRnYzdaWWVnNm9MajJBRXo1Q2N5bjJtT05HeTdTVEFYaHo3aWZzekF1eFlSQ1ZtMFJ6c09IbTEvRHpPZ0VnUU5iRUE2QVJlN3RNVWdhRFREaUdyRm41OU54anl3VU9LdUIwSnd5c2dETXZwZFRZUHp0UDJZVXpYM3BzN3M4OFRNeEsvWXdsRnRmcE9WUVJGU2NvbkVsblV4MzJTYWNDU0J0cWxnNlJneU5MTm9hd0tlZ1ZHbFhBM2xSNXpiT281VFBMYTJRQjIyRjQ3dTNMekMzNnRiSWh5Y2pGcjZ3aER5eTA0K3RiRVhLU3RROWNvZkxBNm1RZVhUSjQ1NFJRZXhwL29ZVXlDTmphMkU3bnpnV3hDMzdFazB0c05EL2t3enVBSlNaUEl1YW5IV2c5TUhtaWFZcDVNaUNCQjJ5ZHNJa0hBc0JRZDdOazRZMTliRW16a0xRWldPMGdKRGtWdXF4d0lUcjM0QmtHNnJHWHl4T1lmbURqdy9zb1FSSlZtZkREeFpJVEdIdkFTWkFnS0RWMlF0QUJxUitnclo0cXRETWZ1cllYZUNFMmJDUUJ1ZGRjNkpMejVYUTY1OXp5U05BNm05LzYwNGszaFhZNm0xNTlQK2hERTRsQ1A3M2E2M2FCY3lETW9jbzM2aXZBODZTanlobDFScENLbzgxdlBYRFNNaUF2b2MrNXpuaEdQSk45NWVmblB4K3lsOUFUd1NxZE9tamFVM1VFd1FhSTRjU2ZWcWl1bHdXRkpYVzZRWE1sM2h6NGJMbFJOS2ZRVEpzcEd0MmZNZ3BzdFJSdFpkYTV3QWxQS3R3Ymh2VmRXWVpjMTd4UWFhU2FMQmIyT0kzbmZLU0tvMHM3Y0pJWmFNbnUxWlNudVU0NDB4S3BHaUJZNFlSS29nZEpTT3E2WDlhQlFSU200T01zRnBaTXVTcDRPYmJ0TG4yd1lVUGJDU1puNDlCZUxpWkFMUlc2YWpQNGw5T2MwZHZPcVd3cnBCbEc1cm1EdmlaNHVwT0dCS2V4RXlZTDZDRDI0R3BnVHcvc2kzNU9PL1VTczZla0lHSkR4UTNlWlFOd25mQXRFMjk5MUFnUlVCYWZlWm56cE1QU2dEMWsyaU42ZzYzTUkwUGlNN0RZZzlBVkJDM0FGdEVseXZxVTljMElWSURIWko5dVBmL2xsMEt2aGdiNmw2VWZnd29xWnMrQTd1NXlqaHptQ2dDa3NjdDZyTS8yc2pUNmlEU0N4UDVKZXpWZ1Q5ZysrMDY4MmxGd2Fka08yUGZzS2Z2anFtelAySFAyQXJwYmRiYmswbG13aGVQSE5EeGpobXdZekhJVUtpQUl6QjRGaHV4UjBLWG8waEE4Tlk5WUFkMHlRTmdLeXZNbzl0OUZ3T0U1RE5rN29QeEJDTlNSTnIyTWdPOEpPSFZ5Y081ZjlYT3BuT1JFRG9ESS9leXhCMFR1NVVRZUFKbFAyWXZzOFh1ZytZK0NaZ29DOEFBQU1Ra0RWOFFtZjVLcERTWExXUnd0RitJOXVobVFuVXJ0YWtMeGdBMUtKVk9rKzdqY3ZaRXArZGdQeE5rMktZa3IwRjhrVFcwVk5JeDJrT1ZYeWNEY3BoQ0taZGgxZTkxSHZkNmpidmRSdHpmaUlGcnRQSnBOSU9WanFUNFBnSXZZbXpScjVBK2crYnI3ajdyOVI5MEJBTmJlSGVLN3ZVZmQ3d0Rkbys2VHpCd1JsWGtONWdJMU55RWlFZXRyamQ2R1lXNkM5b0RTNkFrT01GSmd1RGJIRHVoZGpiMUZ5bzBDQmQ1VnY1TkxBUXByVC9TeEx1RHFGMTg5Zmp3cXZ1cFRYOXlqVXBobEx4ZjJxbGRxd3c0b0JybFd3Nkl3YU8zS3RsbGZhVnRlTzFQamRxbGxvWDE3M1JHQlVkcVdvRlkzN1ZEVVdHdlZKOVNrdmFwVzdWUEQ3bWV0cXFrNXFEUnBUZ3pBOXdjdDludisyTnZYSGcvd0NSKzAwQmd5cm1pMzR0QnlBQ1BMZkg0UlpJeU1uVXZnN1hUcXhUYllKaFBiUGJCNDREZUprM2pjbG5GSmRoRk5wNG1YS2lsSktXVWNvVWtYanErNTRXekRFQkJZVzRpdXc5RjFBRjJIbytzZ3VvNS9nUHE5U0NUYTdQVlU5dlkvTHBtOWZST2RCSzJXVG5EcFBpcWRlMzBUbmZ1RFZYVHVEejR1bmZ1RElwMjJUUzNmWHltZ2tPVWp0MzJmQzZsS0xabmVGV1FtWUIxNzJKR3kvbllCTnFiVFpoK0phRUp2NkZnTlNJWmVKYnZmSnlHNjNNMGFVTDJuR00yZmhPcHlwMnRBTmZRNDJUVS9DZFhsTHRoRVFxRHpxVDMxMDBpSjZKQmV1QXpZZUE1K1JnNEcvS1VOUHZPSGtUSDBYTExuczNua09uT0trR2RKZk1FSUpNSEl2aEZHb1kzdVhCUlRyajF0ZWtLTks4cnBGRTZWOU5DVU5Cdk02bWdKUHAvaVEzT3JCbm04elJacG5JY3lKUy9BN2o3ekRPbFFjdXFmQ1M4YmlOcmdreUxnK0FlMk9vRVVlMEYwNGRuakN6c2R2aGtKZzZKSUVMYVJlRlhqb3VZbHJUZEFib1NCdUZodFNIQTMxYUFDeGs0ZWp4QTJFRk5BcVlkOVk0OWdMY0JPNGZFM2hTOGpTMkJTN0M3T1d6Mm14OE4xNVBKdUV5blIxSkxjYUJVS1o0Rk0rSGVKd2FwblA2RFBsSWpJRnFaUUlOVlB3VUZ5d2ord1YxQTd6d3ZJSmNJVTl2enBtNmYyeTUvLzh0UFROelRkaTBHbUlvYS9laXlnbUNhNnhPN2N3OElnT05mY25rYnVNQlNqdU5QcGFFWEJFT3gyKy9DLysxc2UyczdpS2ZSSFJoaXlZSFpiRWZZeHJjY1JUNGVIVXZCSFRkcVhaSVppMTBQSlBBeHlNeHoyckxJWVhqb2dYS0lEbDkrbTU5Q1hKcVgzRk5BQnU1MENKd25PMWNWTDdvdTBSSTlRWmhmRXpEaDZwSnBnRzRnODB2c1ZUVFJ6ZUJTSlFVdEJ6UHFYNUFOazVqWDJvZzJsUW16YmtQRUk4bWpWcXNpVmR3STE3N0ZTN1Q4VTNxRUg4Qkkrai9DclVCVytlR0ZNZGMvRkhoSkgxamp6RXZEalQ1V3FXMHFOajNFT3Y5anBESUZ6aGRFamE0VlBVSnE1MFVHUi9nZVhTV3FCUWg4c2NhZjgyaWhka2pGakxhbWxUZ1R4V0dVTk4vcDN6QTJ3a3I1a2RnenVtQjFnZm4zSjdEaTRZM2FBWGZjbHN3T0RDM2ZiVy9wZmdQYlFhMXlJWDZ2c2VZemhhMHloY1lBV0tNbEF0amZaVWlFYkIvSFZRN2M2YTQxRlZ3emlmQTRJN1dKcmM0TXFTMk5JMWJENWtKSEIvZ2tHZDlNd3paMksvMUhqdEZwbHcwQzlLcVRBMnpnWDFPSkU5Z0VheHRqRWhpNzBhVHZkQ2lXazg2VTBaSytNVzZ4aURGOEc4T1Z6cGpSNnI0eU5yT0lNZDZhK2ZNNlVCdktWOFpkVm5NSFl6SDhIenBUSDlOVkJuanJlS0FHZ0w0VTlkUU84eml3YTRTbXArUkMvc2NiNC9pR2p1aHpNUHY0d3ZzSDVCaFFOeHlNZ2FrTTJjc25LNkkyczkwamVEVFF5ejZkUnhaTUtwUEJFU1FOSGx5OHNnZUYwZDVjOUZZdlI1clRBaG9tQVh1QUZVWHpOUXMrYnlFVUpDWnRHODNsMG1SeGl1Y2ZzVHpoZGgvT1p1T0x1R2hlekpaRmMvNFlyajNBVzNjRUYrbzlCWmlsOHdBdmlJaXBDdG5EUzgzeVJBb2dDL09WYkRCaTJXNFlaUzNvVDNIRVRoV092dzU0OWYvMTBiNU1XRE9TWnVXRDVDZUxqNUxRNVBaQ0lTN05ZNEtTeGY4V3p5Y1ZLVUhNT2FPS0RLTklpTW92dk0wajl1V2NIUjB4RStId01oODZYUVFodzN1TFdJS2czRURUM3NCNkFzc09yOWxjUDJnVk1HTy9DQS9ieDlxQ3dsUk5ENS9DaHdueHBIM0FJZVN0QmNDTHlIUTVzbDFsWWtWM1NNeDd2S0FsdVJjSUt2UVp5WTQ4V1dYVktKWTl4M3dZN0hyRUQwNnYrazMxOHQ5YzN2ZXgxKzFRU01NdnFRSDllQmg1dlY3bk9ETm5oekxGeTEvRFhQd3M5cWlXeDNrOFRQa1V1aXdSaWhRdEhTVVdCQlZtNVpEays3MlE3VWhndGdwdlBhWWRDNG1QUXo3Mkcrb2kyeFBWODU5RnlQa0d4d0wyR1dIME85ai8vL3EvLytmZi9sZjM3dncxKy8xdWh6TDlsZ1A1M2w3NEg5SDFBMzcwK2Z0Ti9lc2FJdDVENnJOUi9LS0QrZjRQZi93ZksvRjE1L25lSnZrZmZUK2o3ZTU2eWg5KzN4aVFoOStsN244UHMwdmZnYmlEdjBmZDNISEtQdnArb2tOV2EvcjhHdi84OVh3VzJ5YlZZcWdocnU1REdPNnN4TmVTcGNxYUJQRS9TcVp0U1RVOUJVMEZpdGtSbk01K01JRGlrZjJMam9qRVZFWHVRK1VjU2gxem5oVG00dWxFMFRiN2dTNU4yOG9RcFVvdmd0akszSjdkRU9BbFUwVFJLblRrUmlFT015Z3h3OURUaWRzdkVtUmFXcVFBZkZOUURWUVRmTXllQUVTV2w1VmVVVXgwbnRMclE4bEVFMHFBdUJBb1hvZGdhNGNjTjY3RUNwdERGeHhyTGRwVWFDdExFWnJ2NHpCQXN6MlduQkhqVWJQcEhrQ2JCRTBSYTRNd0gzanlxdzIyRTZlSkFhMGVjQzh5ZFlOckpwejJHK2lNdkNmYUFIVlM5Q0lWTlVweFRvNVZDMHB0WDh1T1d0aHdzaUZsWTlPR3BxQWhBVkdjQTgxaE9hNG41S3Vsc1Y4eG5pZmZiSTB0blNhdk44YWdSZ2p5Y2tQclU3TlJNcnlaWG5Tc2xsMndJSG50VDN1UTdGRXBOWGIxSkkwZnFBOHEzc2c4U00zYVFrcU9LL0hGMGlVRVRYSlpuN0FaVjVjQW9vWElQMWl3SFhNTUdoTEtJR1hnSDVDR3NiVlAzcW9IQjZjWnZUU3pxMEhLU0s1QnBZSXpVbHd6cmpJd2hDTUhEaHhMRkVPWE9VSjZFN3pLS0oxejY4a1hZU01Td1JOREl5cWJYQmN2YU9mTENWaG91UXlkdlR6T3RJVjAxQ1c1a0llYkNscHZOSEFCRmhUTlpwUGZycUpYY3c3SFR5RTdBaU0vMVNWR1RUQkxGV1pIZFFIZ1FIMC9Ock9xZ05OSHNaYXNDYUdoMHlBa0JSWTBEVGhUNEtST2lRRHQxVUh2VC9ERG1oWWUyQ3NyTk5sZlFLbDgrQnZqaEJaaWlFMmxrZDlpYkNHekxLOHJJZDFFZ1hCVU1ibXp3d1BQSXlyRExjdzhneGd4MzVDVExCYTN6RmNNaG1PeTBCSUhieFA0VWZWOFYxanN2eHEwbGpQWUkzYi8yK1V6VUQwaWZwbjUwUTJvSEkzSk45UkgyNTIwRWlNQ0s0NFlzQldQR1ExMzZUd1FOcDRWZXZNMUI1VDBCT25SRmYrVkxaSy9ETWMrY3FIdnJjTTNwVk5TTGhKb3NLRlJRSk83d1crME1Zdlg3SWdiNnA5Yldnd2w3TVBsYnVOWFd1cGJhblhSTStFR2h0S2p4Y2ZGTjl3ai9EaldUOElqdDdQaUJBYTFlUEJURlE3MTRTTVhEaXVJYTlaMytsQUh0ZkdOT2dldCtVR3h1YkdvL1BHMlZxMFFNTnlWbW1JQkY1VktsRWxudXgvZ3BGYmxaMlp3MytxYnFlL0pIekY3SFVFR2lBOWVCS240TlJacEdxOXlWNEt1N2NnL3VTbENzMW4yN0swWXdmQ0c5c01BSFI3VHBKZkxEc1QveHhBNUYzQUVnL2QzT1Y4OUh4Vnp0K1d5RGhWbGg1bjUxYlBSUm1mWnArZS9lemZtK1U3NUxDME45M1A3S044TU1SRncxb2RCZjZGMmhsaURyS2tLVHFsTkJCaGZ4YkVjVEdpQzUwRmNaSFR3SGJqd1V0czdxSXR3dVVncFdHRHFWRGc4M2tGUnFkMVJ3RmZZV052cHE0b28rbk1tWjRqWlUwTkNIVytXUU5mVHI3dEdIQTdsUzNheXlBOWNiV1YzcHE3Vk91cWRmbmNDdlR1QlhKL0NycHY0NG1ycTVhMm9jOHlFdjdZb3FOTkN2TkhXZTd5RVd0aHBhY2J4OVRNem5ZZGg0WEZKRWlsMlh6V0szMldDRVN3a1VuN2RsWUpROGpVM2JVTTU2YUdJMjRYWXUwU1VWSzVNeWtsb3Jqcm5SZ3dtcnhyRFowUW9BY3ZRcVp5UkdYdkJSNm1TV20vU1MwdE55bVF1YThTK2RSREJVanpPd0xscFZWRlZ0M1ZaMmVsZnQ0RlkvMjBhcFE1b3hIb0x1dUpYVi9iSGt3Z01lZmJFeXR1NlVDR2taSXphbnJSSisvQnl6aXdZbkRwR0xyZXdNOHJPakNMa1kyVzJtcDRTMmNrWlR2bnNvbUFZT2VCWE9HV25rOTRwZkkzeWFOMVYrVXk0TkNsb29vQkpSNGJtWmlvWmEwZEJlalpZN2VuNkt1MlEwdE1Cc0JkSnFRQVJDZHlMVmd3S0hDcUoyZnM3RnlLcHlUQlVkSzg1WHJJTmV3aTc3NDV1OGoyc0hOYmFhb0thcGRoMXRIYWFqN0d3ajlVQkllRXBPVEhVNGJlYkNsc2pUcFEwSGNVczFib1FscCtWNi8vN21aajJqVHVycU4rMVNsVWNQTTJPTmpuMUtUT2pMT21BRlRGUU5ZbEVaTUt5MURyV2xkZExOYUM0dWE2Nmt2Qkg4T3ZyTGh4TCt0dTYycnQvYVpXR1VROEp2TGFnZW9yVWR2VEVLY2JnaWdBYzVBRDEweFJkVzBib2Z5aWlsTFR2R1U4YXVmbFBqbWszYWZsVkY3b09QcFFaY2g1dEZNZmxjZUxwMnBUNmdoeWtINjZuaWxSdFdKdjFXY2NRZU5hUWtnNSsxMXpXTnphcDdxZHVCVXo4R0t3RzdJRGg0Tm9DeHhEaGhVRVNRbXF0b2ZRUXd4ZG01RFJDMGhhL0p1Q0dvRC9SNE9oei9yeFdzekRYczdiY1ovaC9vSjhhaTYrdGtZVTlOWDFPSmdaakxFQnNrOHpMdUxjcU1xOHZnLzZ6UXVoNi9kK1dObDZtbitQb1MxME9tT1BJaXVpb3IvSkE1cHBldWVPbVdYZmFTUDVGaktwd0pXRHBoUnJaSGIvOEsvZzJtcS9lNWNYNVlxNWREaTR6dTZvd0x2bkRhdEY2NjJ5eEpTOG5OM2dvNXJoYkh2WDZiNGY5K1kzR2szR3VLWTIyWkNuSE1LUHVmSVk0Z0VQQ3YvK25FRVUvYi9HankyRXl2SHNDL1ZXS01lYVRtMm1zdXhUeDdHK09SNitqVXFpSmZxa3FWUjJyaWpTblBYL3pqcTJjdjdHYy8vL1FMWFNoUmNlQm1RM2xmcFhxeDlSWUhkS3lxSmp4VkczYUtBbCtWcnlqdnpWUnZ0LzR4RitoTklkWVZaNGRHQzkrYjhHTmduK0VoenJoZy9CSVBqT0FiRXNBa3d6MEU3S2RYL1Y2M293cVJnRUJja25Ka3RCc1VUNVdpTk5EWXdwR0JjazZuNE5xVWM3dDVidGVjTzdmbGNwRTZQQ3k1T2Vib21CSStrcFZ5eWlLajF2ZndNTWN6c3RSOWw1bXlFd1NlekxSRkdpWlViaE5VYmpVcTE0eXFBQ1RybU9PMlVrbmx0NnVjWXkzT2hCVi9LRlZmemxHbDFySVJFRlR6T29Nektaem1hcTJ1eUpjNk5IOFN0Y2FIY0R6Myt4T3BOZE1RL3RucnRkd0EvYXJYNmxCOU9Yb05aNHM4aisrUlk0RVRMcDE1bTMzWDZYVUc4Sis5b3QxYmMrYzZXdEtlTTV4V0hUdno4WEx1OEtQTzZkUnhuTitMM05UeGNYL1doZS9RVWFlNFYvQ241OWsyT3ZXYzd3eEFSSHZwenROMGtSenU3cDc1NmZuUzdZeWpZUGN2UHo4TGRxSEQycnl3clJTMjljSjBmRGx0RWFNZ0J5NUFRem5IdTNhaUFFam5jNVNCczFqZ3JDNU81VzdTbWIzS1VWU1lJY1gxQlR6c2tOQ1U2NnRIQWRUNjNYVUh0N1JGNGZ4Nmt4WVMwQ0crdEJFUFNpVWVIZDdyaE5lSUVxZDN3K2l5WXpxdERGdExIelpvV3NTTGEreGxrV05ZYlR4bjR0NU1sYXZCYUpCTFBGdVgzNENDaHlWUVVCU24vd1hESFN1YnRHdkxLUUx6Tkh5UW5RLzhnT0VWV09VTU9DTjdnUE0vNGhSaDNKKzRRd0JMa2JMMzRHVE0xb3gycjE4M3QzSGR3cnVzVy9neDZqWmVxOTBHSzBoZnlRbWwzVUpadDdwWVJvVlFLNmJUNXliVUdDbGMzZkI3L1M5UnFEKzhicCtaVUljWjZaZ0ZEK0p2VVMxeHRybFVJWjRINTY1TlRLaVFBS1hlUVlYQVU2SnB0VGRkcVpkUGdpdUpjcmEyZnVzcEFsMzRDNC9ZT2ZFVzZUay9SeFBmbWJhbGlqTUVsQXo4cU0zWkpsNk13RmZSVWpQTm5XVTRQaGZMMDJ6YnlpbHY4ZXN0Wmw0Y2VtTEZyYkxhVnBqMzZ2cGJQV1d2RDVtU2Nwb3IwdkRXbU8zTWhWQldqQ21yeFVnaTg1K2lCbUlSQTAvbk1MTTNhYkNRMmZQVU1TN285dUxOVEc3MFdRbHNnSHlCdWRoUEwyZTZTelBveFhYNzJocnVUbENjbXk0dTZOZXpoeXV5ei9Uc00zbEVlYzFLL1NGZGM5aG1XM3h0T3EzTy80a0ZlRk1MaUJ0ZUdqVDM4S29WY0FVb3g2V2ZGTmV4cjhBUkduRzh2bE1jTXlPT0g5YkRVZEhhaHZVYTVvYXJXS0ZoYnJZODgwekxQRFBTQWM0cVRTL1dibXc0VWlmVGpJMjlyVXVMYVZjRC9sWUxPYTJxelJubERRMjEyTVBiWUhjL0NIdkd0U2FZeGkzV0ZORXFMai9ReFlianc2U3NkNGtxaVpzeTFZN1hnSXNQZERrclFuOWREZjMxU3VnekRmcXNEUDJIYXVnL3JPcENpV2tIaThLcDJsNlNtSGJyYTB1WGFndnJtdEdlYVlWbkt3b0hXbmRPOUZWVENmVzdEYjB3L0k4ZHUxQnpNWEtBbm1KL2dQK0hESXlGVmVWQ3ZkenZ2K2RQZlFGRkpnd2dvUThKZzFWZ2lScHRZWlZLYWR0QVBhMmlXZ0UwckFFYUdvQ0dCRFNMUjRYTHdPVzNFa2xoUytxNnZwNC9XZFdBRkFRaXlEVTFEL21TdFlUWFZ1OGtaUlp1bXpod1hJRVdGWTRUK3VrMVgrdTl0UkpCWXNLUTVDZ1NBOFQ2OFN0c3ZQNVBYT0ZhRE91Uis2V1ViYXRGMVlkWktkb3NZOXBhbUVNTm9sV0d0QTBsWEdPSmNVMkpjYW1FOEM2ekNxck81a2hqZzdwaGtxS0M2KytnbkdrN0tBdVd0OFlyRFpuYkVGbTRGaktqY2FHdGZjeEdUWDFIb0dsMFZZdFZTVDVJV040QzVaQnNyUmpYYnQ3UVY4WmlGbitpbStKNkx0TjlWcG4yb1d1RzVMbFhkSkM4TS9OSzJ6N29ZS2c0U1VzVWtrWTlBemZqdVI5MHJ0aGpwbXpOZnN4NlJWS2dRS2dVdUZZTFhQTUNRdHRxam93L3VjcEVBbk8rSzRKRlY4ZUpVd29uVXdrWUVOU3kyd1dYQ0U5TExjUHd3b2tHSWZCREM0VEtVaUh0NEVHb1JYQXRnRGZUS1M5cVNEOGJCOEhPS0N1OG85cWkyVkJJbDFLdlZUUkNyQVpTdG04OUNKclJoQ1kwWVEyYUZjTWl0VDBDbFhmQlF3RndjaFRCVlJRZjc2eGpHNUpPekYxUmJDV29LRk1hNFU1TFNlR3BPdHZTbnd4TFpVb1Z3dnJJQllJOEpxTnRLOUlvT0QxNWU5b1JDeER6MlFnUkswck9uUmgwbVUyWHNLb095a25CeGRFTld0bzljTFFDaG51aVdaWU5ZZERWditxbTJyR0Q5NXFlNUdyelZOTlYvRm85Vk03WmpXSEFHWDR1Z25iZko4R2xvVEhKdzBsNDRBTnF1Q0ZKUVBHV2FzcU1rMm5KQ1c1cHdzUHkrSVppMGszYnV0Vk5PN1hVY3ljTXFGMktjYWpRa3BDREsvaHhJYytnZ0ZQbnVKQ3V3akJtdzVoY3ZVRWJQMDRibHhDQnpqRVFEeUtVejJ4VzRpd09uYmE3Q3FmTHp3aHNtMnBZZ1ZNOVo1MnVXaytYaTdsblVaMzVQS1FycGlNVDhTaVg0NWJGZ20rcUxNbEZXNXNIRmFDTFNhNGhWMkxJbHJSS0hTOXZFbjFYcDlxLzJobmV1a1pSK0ZKa2ZDVmtWM0twanZVbHlGcGZRMGtHaG9rT3NDMHFXc25tZ0d4YWM3Zkw3VlQ2MlV3aHFxcDJwblNDMjZySXkxU3Nub05mWWZYK1M4aUdndzMrTVhnSkFaMTZVaHp2amlwaGhSeFdhUFk0RExBS0c2OWhJQ3FSVmg2RGQ0amUycEttRVRRS2VVbHlzemMyMUFpeVE0SHJoOXBnd0ZtaXV6aEdiYTdSa2E4ZjBFMXAxYW1SalhTWnptekVYYmx6TUhlL1VncnVpZnltb0lPWkNIVVJRLzJpZTdDK0lJT0prb0xrbjNBL0I2U0wvNWlkRXEvSjdlRm11VGI5eGFkUVZEckt5L0U1Ym5YTlFXWFR1dHp5SzdYTmpxQW1NTU5RQVdpY3pNb1p1S2lYd3ozMXdtNzJaems2bzFDWVlkWHZjeFNxQW1wMml0K29FTkxaYVljMlBYRCtuTGJZc1JHd0dUZ25YVVdCRlQ0UjlTanVuTVhQVFNHdHVBZFMwM0J1cnVIY3J4cXVWc045cGlyT1BlSDFVT05PWDZpS2N4dXB1SEJORlJjMlVuR3VvdUxjU2hVWHJxUGl5RU10dFUybWM4S1BxK0xNUW5GYkZlZFdxTGp3TTFSeHdyZWxOcURuZFZ4Yi9OeWhlNHNmbFpDeWh5dXJzTEd4dTYxZkNsR2N3QmZYck1pTEhrb0xWcFB4T1hpbXJoUEh2aGRiWFF4WFZPZTFFeTlkeEg1azllcnpsV0JLcXJkM2krZUo3RFhqV1Z1TkZjNnF4b1oycGwrS0ROVVhOSmFFUmVWM0xyVGxuUzNtb2R1Y3J5ei9XcllxY1Z5VEszV0Iwbm91aWVqKzErRzBPSnlXYTJDMGhzTzZvV0lzaGdyQlpOUGhKVTJOWEQzbW9NYStjdkVxcm5BK0VYaFAyYzV4aFhCWEZpa0o4N1l4WU9VSHhXTklQNWsyV3BHdlZodlIzeXg0dW9MNDRoR3BmL0hPbG5NblpvSGo0OEZOMFNJZlUrVHBwZEM2SXNaK0JBOURIaXpIbnp2NjdISXhQS2NLWGwxNENJVXdqdzlhZmtIU2xCaVI1Y3VvVEYyZ0tlZGp4VW15K0FrQ3A0U3Fzb0M0UXNkMGgxR1p4NzBDajM4Uk9TWTVsL2xSV3J4RUx3OTJGcmd0WDN3UUQ5ZmpuOTcrMU1yNkVvTG03VThod3RSZkVSc3NFRjVBZDI4dFd1Sk1BWEZqUWN2RHlKVzRWTUlheWxCL1BSbnFmNTR5aElUSDN0Ukx4K2Y4ZERPZzZjd3prZFFUeFhzWnVDd2g2UlhKS2t1SUtyTW1rZjJrRXZ5WkNYUU5vd3ZBZVBZc3lseCs1MmJ2WEVPNVJCWk1EQ1hsV3plNWRVZXF6WWpUUmxXYXE5eklkOGkwMWUxWkxRL2FJQ092TWxQWEhoVDB4RWdjZjE1SUhoN2oyUVJiMlFHTTJWdXVLckxGY0RkeU12V3ZNZGhNZUU0aWU1WWx2Vkd1aFhMR1l5OUorR0szWjB4Y2w1WGdRcE1veGp0OEhIbUhGdGlOd1hKT3V1bWI0bUlGUDdCRlVNY3drVktjamNlRFFHWG00dHdJV21tNjl2eEdUTWlUWGJaUlBqQVkxMUNQY0FkWWR2QXZjZlpUT0NuU3dyczdtL3l6ZFh4a1hkZHplcXFLclF3Z2x1bHU0SmdZUzYwTWFKbUtFYTVNeW5jUXR4RzZ6K3VSWnpPQTQ0Y2o4bVhQVTl4K2k3TzN1SVRmV3RkMWFxbkE4VkJlY1ROaWZ0OWpHSVUyN3N5SVltYytzaTV3WjJPM3pXaW1nRGRzbTE5NlFHY0kwLzBGc2dQZDZCYU5rRzdVdk5yS0hlRnpiSHk2VG5mZnZlNnVlOTZkOUw3YmRyOWI5NzliZHNEYjlzQ21YYkJ4SDRRUFZQbDFsSHFIekpsZk90YzBybVgzZk1KSDJUNXpvblNRVTdub29ubS96T2dTTVFkRS9LdC9Ga0tYbHpjODhpWG11QU1YaHVmVUN6dVlyMlJkYk1nK3AxNkJzc0dUblRRSy9QSFR5Y1I2V05qa2M2S3N1OXRXVnZEdEtDdjRUdHVzSnpIY2lDNHZ1L3FHRUpGZm9EdERyNFlXWW5Sa2NVNzNKTUs3SkNzSjNMZzhSNHZDd3YxWFdSSmxoUWJDb1A0SEUwOFJsWTBjLzVWMHpUZXlaQmZnenZKY04vVHJSbFpaL0NneEhiTTFzVEsrYXJ5UHFmRVF4aTJWWGwzUi8vNTZ6eUFyUnVNalV5dlVjOVpVZUdyWkhWYWxTUlZpV2hwcGQybTZTTVVyZWpuL2h0NmU3OHZsV3pyenM2WjVwK0JUTGpRL0RjNFNlSXVsdloza1E2N2Fxc2xaZDFWTXVLYU5sMXl2VUVQZDhyWVRva0c1NUlSRGpHaDkzUzFCOHRvQ1RMcXVwWld2ZFNiUWhvWHE2bXJoOHNuSnVEMStjME5aVVNvd01SU0hmVnh6dVQ4NExTQng4ejFVVjVUaFNIK2Q3NUs2RnE4M04xQVBLb1NJcGZMYkpaS090SHdSUXFJN2FVSit5NGY2a2grM3Y4dnhLK25YakIvRHp4R3JsR1diVC95d1EvZGdsRGNDVkVwMDFHWlhZam5yTlFsdWVVcFp1ZUdlRGtBRkJoSjdEckFNVGs4WFRsaFI4bzlvZHpkRzZ6WnVlSE1VQjdrUDRoL3ZnMjVvNHQrREN2N3RadndybktaL2dJZnBsd1pEbm9KdzVFekZXMGJYckwyRnJsNGlrdTNzdkJXRHY2SnhrU0FLeWJ4dHlXWlYzMThyN3pPeU53ZzJ2NDRFT2U2UzZVRnlkMENXSFZrT2VPOUVTV1hSM2VxMk01L1QxZlFjRUY0cXZ4SFJOd0pDT0NFODhJWWh0VlN6RDczL1pMOVYxRlo0RHp6VW0vYkFsSFNXN2JSTFNhNVprZG5semVzODNWMWpOM3JBcnk1SXVIYlRKU0UzMXpTVmNhMit1aGJoSGpEZmhoSVliOGV5ZnQ0Z3RndlNrYjloL2p1Zzd4bm5NMzFmWjF6T2pkbzZrSzRDa3Y4T1ZaRHNzU1JQaDQ1dFNNd0RXYkdkTjFDNWNEbWZMOUw0S0U5MnRlUk41QUowOGd1Ylh6dVlQNGVGNXhsLzNpenQ3MWZCK1laZC9ocTYxZGZ3TlQ2WWdTaTdpd01ZTUQ3c1FMTlVuZmRBVzVxa010c2M4VTRRTDBQNzh6aUpnZW9TZUU2eWpEMzlTQVhLaFY0THRhN2M0Nkx0bmV0a3MrMkZFc1ZkTWVvaENhMThCdGo2cHNobXNJQXNJVkhmNEEzU3YvK2VDUkE4enVSamlJOWhxNlVHYzdqWTVpRWNQSUh1Mlo5ZlBQdkJPdmNYTDJQUHkzSkk0OHFjdytVNXVMa2xyWDh0NzA5NEJkR1l4akVBeUcyWVdYN0FOYlJhUzEyVFZsbldmY050RlVOWlRvRHNYRm1RVHZhdVVFMUFLWnhwNFhKaXJ0TFAxTGtFSXpucW1SdnN1OTdCUHBBay9raks5dnFycTFYb3Z5dGdvUk9ESjNkNUY1Z1ZiMCthTy9HWng3d3dXcDZkcXhVQ0ZDOHV2REMxYVc0dWhvRTJkZHcyem9rc2ptU05oUnhYVnBZZ1BBTUNVdzhwQlRDVjlkR3lBcXBtR1pHYytweC84Y1pSUExGRUhicFo1aHN4ZWhRN2hKUnc4N0E1SEE3enVPbkVEL1lzdFovdTg2dDBsWDRJS2UwOFlVWUpyWFlCQkkzVmxEVENpNEdFakdmeTZyUnhNMDZRYlFvcDRNdDZqbGJ4UDNucGowRDBpemlPWWt0bUtUVFl4a3FlVVlOM1cwV1BDQmluYk1KTUZuTVVJM1dISkc2Njd4MFZzbVgzRjBuNlZhN293RnFhL3BxMXRIa2VPaEJrUXdrbWN3V2s5dzJ3bnJ6MEtScXVWcWwvZ0Nzb2xPeDJwanRsTndHS3FjZHRpRTdBaDR5aEZLL2k4SmVuNVNNZGZncURIMzRLQnhLUkt0SEdRK1Z5T0Ywazh4ZlpHVVFrS2lpS21oanhXb25haFdXbTZybnpxaWh2K0NtWktJVlZ4RUR6T3RDOFFraHJjcmtpbDZ2a3lrWlJZcHZ5V3prSVZiblBUcm56YmxiaWdYYUtrWnBPWnhodHFDblorVVdZbG8yRjlkMWxQZjBtTlV5MFVCU01PZSt2SUpMbmNSVGlZU3VaN3RMbXBrMzZpQ2tmdmlPUlBNZXVIaW9ySTNzeGR4WUE3STBmZ0tiRUM0aHlSVjVjd2MzTmlVbTB4Q01sVWlpQVF5QmVndHQ3MU8xMk85MmEzSUVYUkRHNVEraVFoaTB4dlBiMUlYWWxBRHZsVy8wRXVGMU94UzZ6ZWtRQVFNTWY0azh4N0VoKzRkaUw0MUx3Y0Rqa0w2ZitsVGVwZkV1TDdieXhqM2N2Vy8zeTNWcVFieXNYYnRUSWgyekxsQXQ0aG5ueHIvRzlSYlhhNW16Ri95MmVmMW1SWCtVTlpmelRIM2Nyc2xKRnZIQXlWOWNOeUo5M0tFWGx2czYzMlIvbUZzTDY0dFZBdmd4R0h3cWNNWlhIR1dRcW11aDFKRVY0WWt5SnFmeWxGYlFFTUM3V1lFSDl0SnluL21KK0RZaWN5U1MvblJMUDRpdEJ3ZHZkQ29ENitFTWQvK1I0QWFNZDJXaGlKZXBLdHF6YmF5ckJpU05mTTNqSWtIcGduN0FuQm9GVDBmMjJyQzNxTmJ5djBPOVErVDJqMzYzYXNxcXZwUlJWSFNwemNoUGdlVHVyc1BQVTBKaGFDN200eElmS216SVd1MjExenN5U3E4NmhIQitHbVQ0L1phaUpNK1Y5OC9MSG4zLzU5ZE5xVGpIKzNrNURxcmsveW5pSGg5NThwSmF0YjRFeVo1OTdJS1BSdGRYQXBjeXlyblFwYzVoNTYxQ01MZ3NnY1pzWVEwdUxOQWEzMkxIaGI3dVE2Sm9TbmNTWTFaZzZ6aE52RjB1QzBlTVZYM2JIdlpjRVQ2NTNrbVFKTGRMckh6eDJmU0JvN3ArRmVNRUJQOEJlTENLa0N0RXh4WHcrL2toOTZkYTk1QldzTEZyN2RseDZxUVM0K0syK2VFWkJ4V1FVQnV4R25ISXRNc1lMdXFzS3VoVUY2ZkNReXBKN2ZjU1pWQ0ZkWGRaVnkvSlNZMU1oQ2kyT09JdmtLVGZieXE3UnZYenFmeUhYRWVhdisvbnI0c2xYYWdUQVdJRG1tT21RZlRXcmtoMVBVKy9tK1pOemY1cVc4a3JtMElwTUVsaTBMMHJSM21PS0dGU1hSQXp2TUdSTTZnSlIxV2FuRURTdFREM09LMEx5QmVZcXZueWZuNXQ5QTVZckplWG53OStveStPeWo3NjI5QjJ0cG4yeTN6TFZHRDk1eUhuNHJzMFI3QTh3Wm9QL2I5cEVWcHVCeTRpM0kxQ01CMWVPdTNoUWlSTHV5VHhRRTBFcnNFQm52d1dhZGJEUUFiTzNxa3hUTEFMRGZiT00wTngvYlNUUDdyZHBKTlB1Q00yTmdaRzFUTHdkM2taSW9NZmRMUStyS3BJaCtsQWNOMnFDOFRwdThQaXluY01VY3lKbDJPMFBjRzZHenJmc1BkbmJ4d2M2Zi9hNzNyNTIzSlZDUDVGc2tvQ2l3b092TnA5ZW8rOW10U0phNVI0bEE1bDczZS82a2t5a3VZTE1KNzEraGNRVXRiQ2s4NDRvZlBMZG1uelVWV21aamYxN1lDTVNKcWtVQTh4S0luUGRWZG5XOTBKZWQ5QlFHRDhlZ1lQOTdrR1RWbDRoaGgrTmhYdmR3ZWZHUW1ETkIvY1RyUnZmUno4WmRML1Blek5RL0RrMDgzNXY4TUZxKzE2YldTUHdqaFQyUFZMWVVHRi9PZ0xYVnRZZnVZay9SMjJ0RWZoWmF1c2FGbjRlMmxydkpNMjA5YWZqWUVOTi9SRVkrS0Ztc3h6SGFBbmFHdWpsbmxvRkx5SnFaR1UycnlyZytlV2YvL2pxOWZOZXovN3A1K2UvL2ZnQ0o4UWdCMmQ1MEpsNFUyc0xrcmJhN0NHUTBtWmJmMzcxaXdnVWJoR0Evd0xrbTZvSicKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz16bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZShrZXJuZWxfY3BwKSkuZGVjb2RlKCksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz0oWyItc2F2ZS10ZW1wcyJdIGlmIFRFU1RJTkcgaXMgbm90IE5vbmUgZWxzZSBbXSkgKyBbIi1zdGQ9YysrMjAiLCAiLVdlcnJvciJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvd29ya3NwYWNlL2J1aWxkLyIgaWYgVEVTVElORyA9PSAidnNjb2RlIiBlbHNlICIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICAqKih7J25vX2ltcGxpY2l0X2hlYWRlcnMnOiBUcnVlfSBpZiBURVNUSU5HICE9ICJ2c2NvZGUiIGVsc2Uge30pLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgIyBhID0gYS5jb250aWd1b3VzKCkKICAgICMgYiA9IGIuY29udGlndW91cygpCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file
Best evidence level for this revision: reported
JSON