submission 17326
KernelBot user 292 · 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.
test_K64_2.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-17326?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=576 · seed=12346
AMD Instinct MI300X
97.9µs
#42 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
100.1µs
#40 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
160.8µs
#45 of 98
2025-05-07
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
261.0µs
#55 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
264.6µs
#62 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
312.0µs
#65 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
609.3µs
#65 of 98
2025-05-07
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.70ms
#72 of 98
2025-05-07
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:286d9bbdf6ff0dc470e8cb5bbc0ba4821d42ab4c19b0aac4ecba2f1d5fb953f9
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
test_K64_2.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KaW1wb3J0IHN5cw0KDQpDUFBfV1JBUFBFUiA9ICIiIg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYyk7DQoiIiINCg0KQ1VEQV9TUkMyID0gIiIiDQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPg0KI2luY2x1ZGUgPGNvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KbmFtZXNwYWNlIGNnID0gY29vcGVyYXRpdmVfZ3JvdXBzOw0KDQovL3VzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsNCg0KI2RlZmluZSBLX0pVTVAgNjQNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgMQ0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBjdXN0b21fa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIGEgYmxvY2sgY292ZXJzICgxNng0KSB4ICgxNngxKSA9IDY0eDE2ID0gMTAyNCBlbGVtcw0KICAgIG51bV93YXJwX3ggPSA0DQogICAgbnVtX3dhcnBfeSA9IDENCiAgICBibG9jayBzaXplID0gKCg2NCAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KSA9IDI1NiB0aHJlYWRzDQogICAgZ3JpZCBzaXplID0gKE4gLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIE0gLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpDQogICAgLT4gYmxvY2tEaW0ueCA9IDY0ICogNCwgYmxvY2tEaW0ueSA9IDENCg0KICAgIG9yIGNlaWwgZGl2aXNpb24NCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgKi8gICAgICANCi8vICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7IC8vID0gMA0KICAgaW50IHJvd19iYXNlX0MgPSBibG9ja0lkeC55ICogTlVNX1dBUlBfWSAqIFdNTUFfTTsNCiAgIGlmIChyb3dfYmFzZV9DID49IE0pIHJldHVybjsNCg0KICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgDQogICANCiAgIC8vIFNNRU06ICggMTYgKiA3MiArIDY0ICogNzIpIC8gMTAyNCArIDE2ICogMjAgKiA0IC8gMTAyNCA9IDUuNjI1ICsgMS4yNSA9IDYuODc1IEtCIG9mIExEUyBtZW1vcnkgcGVyIGJsb2NrLCA4IGJsb2NrcyA9IDU1S0INCg0KICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzE2XVs3Ml07IC8vIHJvdy1tYWpvcg0KICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQUJzWzE2XVsyMF07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnBvc2VkLCBwYWRkaW5nIDQNCg0KICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgLy8gaW50IGxkYSA9IE07DQogICAvLyBpbnQgbGRiID0gTjsNCg0KICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgLy8gVFJZOiB0ZXN0IHRpbGVkIHBhcnRpdGlvbiA2NA0KICAgICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAyNTYgdGhyZWFkcyAtPiA2NCB4IDQNCiAgICAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7ICAgICAgICANCg0KICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCBLX0pVTVA7IGttaW5pX2xvYWQgKz0gNCl7ICAvLyA0IGlzIG51bSBncm91cA0KICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsNCiAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KDQogICAgICAgYXV0byBncm91cDE2ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjwxNj4odGhpc190Yik7IC8vIDI1NiB0aHJlYWRzIC0+IDE2IHggMTYNCiAgICAgICBpbnQgdDE2eCA9IGdyb3VwMTYudGhyZWFkX3JhbmsoKTsNCiAgICAgICBpbnQgdDE2eSA9IGdyb3VwMTYubWV0YV9ncm91cF9yYW5rKCk7DQogICAgICAgDQogICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCBLX0pVTVA7IGttaW5pX2xvYWQgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3QxNnhdW2ttaW5pX2xvYWQgKyB0MTZ5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDE2eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDE2eSldOw0KICAgICAgIH0NCg0KICAgICAgIA0KICAgICAgIGlmICh0MTZ5ID09IDApew0KICAgICAgICAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgICAgICAgICBmbG9hdCBzY2FsZUIgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YIC8gMTI4KV07DQogICAgICAgICAgIGZsb2F0IHZhbCA9IEFzX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQxNnggKyBNICogKGtiYXNlIC8gMTI4KV0gKiBzY2FsZUI7DQogICAgICAgICAgIC8vIFRSWTogI3ByYWdtYSB1bnJvbGwgaWYgbm8gcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHRpbGVBQnNbaV1bdDE2eF0gPSB2YWw7DQogICAgICAgICAgIH0gLy8gZW5kIGZvciBpIDwgMTYgICAgICAgICAgICANCiAgICAgICB9IC8vIGVuZCBpZiAodDY0eSA9PSAwKQ0KDQoNCg0KICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7ICANCg0KICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSAgKyBrbWluaSwgNzIpOyAgICAgICAgICAgIA0KICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVCWzBdWzBdICsga21pbmkgKyA3MiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgNzIpOw0KICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICANCiAgICAgICBhdXRvIGZyYWdfc2NhbGVBID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdLCAyMCwgcm9jd21tYTo6bWVtX2NvbF9tYWpvcik7DQoNCiAgICAgICAvLyBBcHBseSBzY2FsZXINCiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICAgICAvL2ZyYWdfYWNjX21hc3Rlci54W2ldICs9IGZyYWdfc2NhbGVBLnhbaV0gKiBmcmFnX2FjY19ibG9jay54W2ldOw0KICAgICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYoZnJhZ19zY2FsZUEueFtpXSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgIH0NCg0KICAgICAgIF9fc3luY3RocmVhZHMoKTsgICAgICAgIA0KICAgfSAvLyBlbmQgZm9yIGtiYXNlDQogIA0KICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgIA0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICB9DQoNCiAgIGludCBsZGMgPSBOOw0KICAgICAgDQogICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBsZGMgKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgbGRjLCByb2N3bW1hOjptZW1fcm93X21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgY3VzdG9tX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgDQogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQojaW5jbHVkZSA8Y29vcGVyYXRpdmVfZ3JvdXBzLmg+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCi8vdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0Ow0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBjdXN0b21fa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIGEgYmxvY2sgY292ZXJzICgxNng0KSB4ICgxNng0KSA9IDY0eDY0IGVsZW1zDQogICAgbnVtX3dhcnBfeCA9IDQNCiAgICBudW1fd2FycF95ID0gNA0KICAgIGJsb2NrIHNpemUgPSAoKDY0ICogbnVtX3dhcnBfeCksIG51bV93YXJwX3kpID0gMTAyNCB0aHJlYWRzDQogICAgZ3JpZCBzaXplID0gKE4gLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIE0gLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpDQogICAgLT4gYmxvY2tEaW0ueCA9IDY0ICogNCwgYmxvY2tEaW0ueSA9IDY0DQoNCiAgICBvciBjZWlsIGRpdmlzaW9uDQogICAgZGltMyBncmlkX3NpemUoKE4gKyBudW1fd2FycF94ICogV01NQV9OIC0gMSkgLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIA0KICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIFdNTUFfTSAtIDEpIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKTsNCg0KICAgIEE6IE0geCBLIGNvbC1tYWogIC0tLSBBcyAoMXgxMjggc2NhbGluZyk6IE0geCBLLzEyOCBjb2wtbWFqDQogICAgQjogSyB4IE4gcm93LW1haiAgLS0tIEJzICgxMjh4MTI4IHNjYWxpbmcpOiBLLzEyOCB4IE4vMTI4IHJvdy1tYWoNCiAgICBDOiBNIHggTiByb3ctbWFqDQogICAgTSwgTiBpcyBkaXZpc2libGUgYnkgNjQgKHNvbWUgYXJlIG9ubHkgZGl2aXNpYmxlIGJ5IDMyKQ0KICAgIEsgaXMgZGl2aXNpYmxlIGJ5IDEyOA0KICAgICovICAgICAgDQoNCiAgICAvLyBUUlk6IGJyaW5nIHdhcnBfaWR4X3kgYW5kIHggaW5zaWRlIGZvciBsb29wIHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgIC8vIFRSWTogcmVtb3ZlIHdhcnBfaWR4X3kgaWYgaXQgY2F1c2VzIGV4dHJlbWUgc2xvdyBkb3duIGxpa2UgYmVmb3JlDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE0pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgDQogICAgDQogICAgLy8gU01FTTogNjQgKiAxMzYgKiAyIC8gMTAyNCArIDE2ICogNjggKiA0IC8gMTAyNCA9IDE3ICsgNC4yNSA9IDIxLjI1IEtCIG9mIExEUyBtZW1vcnkgcGVyIGJsb2NrDQogICAgLy8gUGFkZGluZyBmcm9tIDEyOCB0byAxMzYgdG8gbWluaW1pemUgYmFuayBjb25mbGljdCBhbmQgcHJlc2VydmUgbGRzIDEyOA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs2NF1bMTM2XTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsxMzZdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBfX3NoYXJlZF9fIGZsb2F0IHRpbGVBQnNbMTZdWzY4XTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFucG9zZWQsIHBhZGRpbmcgNA0KICAgIC8vX19zaGFyZWRfXyBmbG9hdCB0aWxlQUJzWzY0XVsyMF07IC8vIHJvdy1tYWpvciwgcGFkZGluZyA0DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgICAvLyBUUlk6IHRlc3QgdGlsZWQgcGFydGl0aW9uIDY0DQogICAgICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgICAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICAgICAgLy9jZzo6Y29hbGVzY2VkX2dyb3VwIGdyb3VwNjQgPSBjZzo6Y29hbGVzY2VkX3RocmVhZHMoKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICAgICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgICAgICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgS19KVU1QOyBrbWluaV9sb2FkICs9IDE2KXsgIC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgLy8gaWYgKChibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHgpIDwgTSAmJiAoYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4KSA8IE4pew0KICAgICAgICAgICAgLy8gICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSldOw0KICAgICAgICAgICAgLy8gICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICAgIC8vIGVsc2V7DQogICAgICAgICAgICAvLyAgICAgdGlsZUFbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gMDsNCiAgICAgICAgICAgIC8vICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSAwOw0KICAgICAgICAgICAgLy8gfQ0KDQogICAgICAgICAgICAvLyBJdCB3aWxsIGxvYWQgdGhlIGJvdW5kYXJ5LCBidXQgbm8gTUZNQSB3aWxsIGJlIGNhbGN1bGF0ZWQNCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQoNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBpZiAodDY0eSA9PSAwKXsNCiAgICAgICAgICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQogICAgICAgICAgICBmbG9hdCBzY2FsZUIgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YIC8gMTI4KV07DQogICAgICAgICAgICBmbG9hdCB2YWwgPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgTSAqIChrYmFzZSAvIDEyOCldICogc2NhbGVCOw0KICAgICAgICAgICAgLy8gVFJZOiAjcHJhZ21hIHVucm9sbCBpZiBubyByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSl7ICAgICAgDQogICAgICAgICAgICAgICAgdGlsZUFCc1tpXVt0NjR4XSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vdGlsZUFCc1t0NjR4XVtpXSA9IHZhbDsNCiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBpIDwgMTYgICAgICAgICAgICANCiAgICAgICAgfSAvLyBlbmQgaWYgKHQ2NHkgPT0gMCkNCg0KDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiAxMzYgKyBrbWluaSwgMTM2KTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIDEzNiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgMTM2KTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICAgDQogICAgICAgIGF1dG8gZnJhZ19zY2FsZUEgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdICsgd2FycF9pZHhfeSAqIFdNTUFfTSwgNjgsIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KICAgICAgICAvL3JvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdICsgd2FycF9pZHhfeSAqIFdNTUFfTSAqIDIwLCAyMCwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQoNCiAgICAgICAgLy8gQXBwbHkgc2NhbGVyDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgICAgICAvL2ZyYWdfYWNjX21hc3Rlci54W2ldICs9IGZyYWdfc2NhbGVBLnhbaV0gKiBmcmFnX2FjY19ibG9jay54W2ldOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKGZyYWdfc2NhbGVBLnhbaV0sIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgLy8gTm8gbmVlZCBmb3IgdGhpcyBzeW50aHJlYWRzKCksIGJ1dCBpdCdzIGZhc3RlciB3aXRoIGl0ID8/PyAgICAgICANCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCiAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICogTiArIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fcm93X21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgY3VzdG9tX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgDQogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdmcDhfbW0nLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwNCikNCg0KbW9kdWxlMiA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDMl0sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwNCikNCg0KIyBPMSBpcyBzbG93LCAtTzIgaXMgZXF1YWwgdG8gbm90aGluZywgIC1PMyBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBPMiAobWF5YmUgc2FtZSkgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAsICItRE5ERUJVRyIgLCAiLWZmYXN0LW1hdGgiDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgIyBpZiBhLnNoYXBlWzBdICUgNjQgIT0gMDoNCiAgICAjICAgICBtb2R1bGUyLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KICAgICMgZWxzZTogICAgDQogICAgIyAgICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgaWYgYS5zaGFwZVswXSA9PSA5NjoNCiAgICAgICAgbW9kdWxlMi5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykNCiAgICBlbHNlOiAgICANCiAgICAgICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKSAgICAgICAgDQogICAgcmV0dXJuIGMNCg==Source 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 9802.
- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPg0KI2luY2x1ZGUgPGNvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KbmFtZXNwYWNlIGNnID0gY29vcGVyYXRpdmVfZ3JvdXBzOw0KDQp1c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQoNCl9fZ2xvYmFsX18gdm9pZCBjdXN0b21fa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIGEgYmxvY2sgY292ZXJzIDMyeDMyeDQgZWxlbQ0KICAgIG51bV93YXJwX3ggPSA0DQogICAgbnVtX3dhcnBfeSA9IDENCiAgICBibG9jayBzaXplID0gKCg2NCAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KSA9IDI1NiB0aHJlYWRzDQogICAgZ3JpZCBzaXplID0gKE4gLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIE0gLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpDQoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0DQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgKi8gICAgICANCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KICAgIC8vaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICANCiAgICBpbnQgbGRhID0gTTsNCiAgICBpbnQgbGRiID0gTjsNCiAgICBpbnQgbGRjID0gTjsNCiAgICANCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgLy9pbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55KSAqIFdNTUFfTTsgLy8gYWRkIHRoaXMgbGluZSBjYXVzZXMgdGhlIGNvZGUgdG8gYmUgMnggc2xvd2VyDQogICAgDQogICAgaW50IHJvd19iYXNlX0MgPSBibG9ja0lkeC55ICogV01NQV9NOw0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBibG9ja0RpbS54IC8gV0FSUF9TSVpFICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQoNCiAgICAvL2ludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiAyICsgd2FycF9pZHhfeCkgKiBXTU1BX047IC8vIG51bV93YXJwX3ggPSAyDQogICAgLy9pbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogNCArIHdhcnBfaWR4X3gpICogV01NQV9OOyAvLyBudW1fd2FycF94ID0gNA0KDQogICAgLy9pbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICsgd2FycF9pZHhfeCkgKiBXTU1BX047IC8vIG51bV93YXJwX3ggPSAyDQogICAgDQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7IC8vIFRoaXMgY2F1c2UgdGltZSBvdXQNCiAgICAvL2ludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgLy9pbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55KSAqIFdNTUFfTTsNCiAgICAvL2ludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4LngpLyBXQVJQX1NJWkUgKiBXTU1BX04gOw0KDQogICAgLy8gaWYgKHJvd19iYXNlX0MgPj0gTSkgcmV0dXJuOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgIA0KICAgIA0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsgIA0KDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCBLX0pVTVA7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgaW50IGtfb2Zmc2V0ID0ga2Jhc2UgKyBrbWluaTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCBBX3B0ciArIHJvd19iYXNlX0MgKyBrX29mZnNldCAqIGxkYSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCBCX3B0ciArIGtfb2Zmc2V0ICogbGRiICsgY29sX2Jhc2VfQywgbGRiKTsgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIC8vIExvYWQgc2NhbGVyDQoNCiAgICAgICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlU2NhbGVBW1dNTUFfTV1bV01NQV9OICsgMV07IC8vIGNvbC1tYWpvciB0aWxlU2NhbGVBW2NvbF1bcm93XQ0KICAgICAgICBmbG9hdCBzY2FsZUIgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnggKiAoKGJsb2NrRGltLnggLyBXQVJQX1NJWkUpICogV01NQV9OKSAvIDEyOCldOyANCg0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCBXTU1BX00pIHsgICAgICAgICAgIA0KICAgICAgICAgICAgZmxvYXQgdmFsID0gQXNfcHRyW3Jvd19iYXNlX0MgKyB0aHJlYWRJZHgueCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHNjYWxlQjsNCiAgICAgICAgICAgIC8vIFJlcGxpY2F0ZSB0aGlzIHZhbHVlIGFjcm9zcyBhbGwgY29sdW1ucw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBXTU1BX047ICsraikgew0KICAgICAgICAgICAgICAgIHRpbGVTY2FsZUFbal1bdGhyZWFkSWR4LnhdID0gdmFsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgICAgIC8vIGF1dG8gdGlsZTE2ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjwxNj4odGhpc190Yik7IC8vIDEyOCB0aHJlYWRzIC0+IDE2IHggOA0KICAgICAgICAvLyBpbnQgdDE2eCA9IHRpbGUxNi50aHJlYWRfcmFuaygpOw0KICAgICAgICAvLyBpbnQgdDE2eSA9IHRpbGUxNi5tZXRhX2dyb3VwX3JhbmsoKTsNCg0KICAgICAgICAvLyBmbG9hdCB2YWwgPSBBc19wdHJbcm93X2Jhc2VfQyArIHQxNnggKyBNICogKGtiYXNlIC8gMTI4KV0gKiBzY2FsZUI7DQogICAgICAgIC8vIHRpbGVTY2FsZUFbdDE2eV1bdDE2eF0gPSB2YWw7DQogICAgICAgIC8vIHRpbGVTY2FsZUFbdDE2eSArIDhdW3QxNnhdID0gdmFsOw0KDQogICAgICAgIA0KICAgICAgICAvLyBpZiAodDE2eSA9PSAwKXsNCiAgICAgICAgLy8gICAgIGZsb2F0IHZhbCA9IEFzX3B0cltyb3dfYmFzZV9DICsgdDE2eCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHNjYWxlQjsNCiAgICAgICAgLy8gICAgIGZvciAoaW50IGogPSAwOyBqIDwgV01NQV9OOyArK2opIHsNCiAgICAgICAgLy8gICAgICAgICB0aWxlU2NhbGVBW2pdW3QxNnhdID0gdmFsOw0KICAgICAgICAvLyAgICAgfSAgICAgICAgICAgIA0KICAgICAgICAvLyB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgICAgICANCiAgICAgICAgYXV0byBmcmFnX3NjYWxlQSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX3NjYWxlQSwgJnRpbGVTY2FsZUFbMF1bMF0sIFdNTUFfTiArIDEsIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQogICAgICAgIC8vIFRPRE86IFRyeSB0byB1c2UgZnJhZ19hY2NfbWFzdGVyIGFzIGJmbG9hdDE2LCBzZWUgaWYgaXQncyB3aXRoaW4gZXJyb3IuDQogICAgICAgIC8vIEFwcGx5IHNjYWxlcg0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gZnJhZ19zY2FsZUEueFtpXSAqIGZyYWdfYWNjX2Jsb2NrLnhbaV07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgfSAvLyBlbmQgZm9yIGtiYXNlDQogICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICAgfQ0KICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICogbGRjICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIGxkYywgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsNCiAgICBpbnQgTSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgTiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgSyA9IGEuc2l6ZSgxKTsNCg0KICAgIGludCBudW1fd2FycF94ID0gNDsNCiAgICBpbnQgbnVtX3dhcnBfeSA9IDE7DQogICAgZGltMyBibG9ja19zaXplKChXQVJQX1NJWkUgKiBudW1fd2FycF94KSwgbnVtX3dhcnBfeSk7DQogICAgZGltMyBncmlkX3NpemUoKE4gKyBudW1fd2FycF94ICogV01NQV9OIC0gMSkgLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIA0KICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIFdNTUFfTSAtIDEpIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKTsNCg0KICAgIGN1c3RvbV9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIA0KICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgLy9DMTBfQ1VEQV9DSEVDSyhjdWRhR2V0TGFzdEVycm9yKCkpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCmltcG9ydCB0b3JjaA0KYmxvY2tfc2hhcGUgPSAxMjgNCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMiJdLA0KKQ0KIyBPMSBpcyBzbG93LCAtTzIgaXMgZXF1YWwgdG8gbm90aGluZywgIC1PMyBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBPMiAobWF5YmUgc2FtZSkNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGENCiAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQogICAgcmV0dXJuIGMNCg==No newline at end of file+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KaW1wb3J0IHN5cw0KDQpDUFBfV1JBUFBFUiA9ICIiIg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYyk7DQoiIiINCg0KQ1VEQV9TUkMyID0gIiIiDQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPg0KI2luY2x1ZGUgPGNvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KbmFtZXNwYWNlIGNnID0gY29vcGVyYXRpdmVfZ3JvdXBzOw0KDQovL3VzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsNCg0KI2RlZmluZSBLX0pVTVAgNjQNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgMQ0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBjdXN0b21fa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIGEgYmxvY2sgY292ZXJzICgxNng0KSB4ICgxNngxKSA9IDY0eDE2ID0gMTAyNCBlbGVtcw0KICAgIG51bV93YXJwX3ggPSA0DQogICAgbnVtX3dhcnBfeSA9IDENCiAgICBibG9jayBzaXplID0gKCg2NCAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KSA9IDI1NiB0aHJlYWRzDQogICAgZ3JpZCBzaXplID0gKE4gLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIE0gLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpDQogICAgLT4gYmxvY2tEaW0ueCA9IDY0ICogNCwgYmxvY2tEaW0ueSA9IDENCg0KICAgIG9yIGNlaWwgZGl2aXNpb24NCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgKi8gICAgICANCi8vICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7IC8vID0gMA0KICAgaW50IHJvd19iYXNlX0MgPSBibG9ja0lkeC55ICogTlVNX1dBUlBfWSAqIFdNTUFfTTsNCiAgIGlmIChyb3dfYmFzZV9DID49IE0pIHJldHVybjsNCg0KICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgDQogICANCiAgIC8vIFNNRU06ICggMTYgKiA3MiArIDY0ICogNzIpIC8gMTAyNCArIDE2ICogMjAgKiA0IC8gMTAyNCA9IDUuNjI1ICsgMS4yNSA9IDYuODc1IEtCIG9mIExEUyBtZW1vcnkgcGVyIGJsb2NrLCA4IGJsb2NrcyA9IDU1S0INCg0KICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzE2XVs3Ml07IC8vIHJvdy1tYWpvcg0KICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQUJzWzE2XVsyMF07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnBvc2VkLCBwYWRkaW5nIDQNCg0KICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgLy8gaW50IGxkYSA9IE07DQogICAvLyBpbnQgbGRiID0gTjsNCg0KICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgLy8gVFJZOiB0ZXN0IHRpbGVkIHBhcnRpdGlvbiA2NA0KICAgICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAyNTYgdGhyZWFkcyAtPiA2NCB4IDQNCiAgICAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7ICAgICAgICANCg0KICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCBLX0pVTVA7IGttaW5pX2xvYWQgKz0gNCl7ICAvLyA0IGlzIG51bSBncm91cA0KICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsNCiAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KDQogICAgICAgYXV0byBncm91cDE2ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjwxNj4odGhpc190Yik7IC8vIDI1NiB0aHJlYWRzIC0+IDE2IHggMTYNCiAgICAgICBpbnQgdDE2eCA9IGdyb3VwMTYudGhyZWFkX3JhbmsoKTsNCiAgICAgICBpbnQgdDE2eSA9IGdyb3VwMTYubWV0YV9ncm91cF9yYW5rKCk7DQogICAgICAgDQogICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCBLX0pVTVA7IGttaW5pX2xvYWQgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3QxNnhdW2ttaW5pX2xvYWQgKyB0MTZ5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDE2eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDE2eSldOw0KICAgICAgIH0NCg0KICAgICAgIA0KICAgICAgIGlmICh0MTZ5ID09IDApew0KICAgICAgICAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgICAgICAgICBmbG9hdCBzY2FsZUIgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YIC8gMTI4KV07DQogICAgICAgICAgIGZsb2F0IHZhbCA9IEFzX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQxNnggKyBNICogKGtiYXNlIC8gMTI4KV0gKiBzY2FsZUI7DQogICAgICAgICAgIC8vIFRSWTogI3ByYWdtYSB1bnJvbGwgaWYgbm8gcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHRpbGVBQnNbaV1bdDE2eF0gPSB2YWw7DQogICAgICAgICAgIH0gLy8gZW5kIGZvciBpIDwgMTYgICAgICAgICAgICANCiAgICAgICB9IC8vIGVuZCBpZiAodDY0eSA9PSAwKQ0KDQoNCg0KICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7ICANCg0KICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSAgKyBrbWluaSwgNzIpOyAgICAgICAgICAgIA0KICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVCWzBdWzBdICsga21pbmkgKyA3MiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgNzIpOw0KICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICANCiAgICAgICBhdXRvIGZyYWdfc2NhbGVBID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdLCAyMCwgcm9jd21tYTo6bWVtX2NvbF9tYWpvcik7DQoNCiAgICAgICAvLyBBcHBseSBzY2FsZXINCiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICAgICAvL2ZyYWdfYWNjX21hc3Rlci54W2ldICs9IGZyYWdfc2NhbGVBLnhbaV0gKiBmcmFnX2FjY19ibG9jay54W2ldOw0KICAgICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYoZnJhZ19zY2FsZUEueFtpXSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgIH0NCg0KICAgICAgIF9fc3luY3RocmVhZHMoKTsgICAgICAgIA0KICAgfSAvLyBlbmQgZm9yIGtiYXNlDQogIA0KICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgIA0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICB9DQoNCiAgIGludCBsZGMgPSBOOw0KICAgICAgDQogICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBsZGMgKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgbGRjLCByb2N3bW1hOjptZW1fcm93X21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgY3VzdG9tX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgDQogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQojaW5jbHVkZSA8Y29vcGVyYXRpdmVfZ3JvdXBzLmg+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCi8vdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0Ow0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBjdXN0b21fa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIGEgYmxvY2sgY292ZXJzICgxNng0KSB4ICgxNng0KSA9IDY0eDY0IGVsZW1zDQogICAgbnVtX3dhcnBfeCA9IDQNCiAgICBudW1fd2FycF95ID0gNA0KICAgIGJsb2NrIHNpemUgPSAoKDY0ICogbnVtX3dhcnBfeCksIG51bV93YXJwX3kpID0gMTAyNCB0aHJlYWRzDQogICAgZ3JpZCBzaXplID0gKE4gLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIE0gLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpDQogICAgLT4gYmxvY2tEaW0ueCA9IDY0ICogNCwgYmxvY2tEaW0ueSA9IDY0DQoNCiAgICBvciBjZWlsIGRpdmlzaW9uDQogICAgZGltMyBncmlkX3NpemUoKE4gKyBudW1fd2FycF94ICogV01NQV9OIC0gMSkgLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIA0KICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIFdNTUFfTSAtIDEpIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKTsNCg0KICAgIEE6IE0geCBLIGNvbC1tYWogIC0tLSBBcyAoMXgxMjggc2NhbGluZyk6IE0geCBLLzEyOCBjb2wtbWFqDQogICAgQjogSyB4IE4gcm93LW1haiAgLS0tIEJzICgxMjh4MTI4IHNjYWxpbmcpOiBLLzEyOCB4IE4vMTI4IHJvdy1tYWoNCiAgICBDOiBNIHggTiByb3ctbWFqDQogICAgTSwgTiBpcyBkaXZpc2libGUgYnkgNjQgKHNvbWUgYXJlIG9ubHkgZGl2aXNpYmxlIGJ5IDMyKQ0KICAgIEsgaXMgZGl2aXNpYmxlIGJ5IDEyOA0KICAgICovICAgICAgDQoNCiAgICAvLyBUUlk6IGJyaW5nIHdhcnBfaWR4X3kgYW5kIHggaW5zaWRlIGZvciBsb29wIHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgIC8vIFRSWTogcmVtb3ZlIHdhcnBfaWR4X3kgaWYgaXQgY2F1c2VzIGV4dHJlbWUgc2xvdyBkb3duIGxpa2UgYmVmb3JlDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE0pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgDQogICAgDQogICAgLy8gU01FTTogNjQgKiAxMzYgKiAyIC8gMTAyNCArIDE2ICogNjggKiA0IC8gMTAyNCA9IDE3ICsgNC4yNSA9IDIxLjI1IEtCIG9mIExEUyBtZW1vcnkgcGVyIGJsb2NrDQogICAgLy8gUGFkZGluZyBmcm9tIDEyOCB0byAxMzYgdG8gbWluaW1pemUgYmFuayBjb25mbGljdCBhbmQgcHJlc2VydmUgbGRzIDEyOA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs2NF1bMTM2XTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsxMzZdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBfX3NoYXJlZF9fIGZsb2F0IHRpbGVBQnNbMTZdWzY4XTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFucG9zZWQsIHBhZGRpbmcgNA0KICAgIC8vX19zaGFyZWRfXyBmbG9hdCB0aWxlQUJzWzY0XVsyMF07IC8vIHJvdy1tYWpvciwgcGFkZGluZyA0DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgICAvLyBUUlk6IHRlc3QgdGlsZWQgcGFydGl0aW9uIDY0DQogICAgICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgICAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICAgICAgLy9jZzo6Y29hbGVzY2VkX2dyb3VwIGdyb3VwNjQgPSBjZzo6Y29hbGVzY2VkX3RocmVhZHMoKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICAgICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgICAgICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgS19KVU1QOyBrbWluaV9sb2FkICs9IDE2KXsgIC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgLy8gaWYgKChibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHgpIDwgTSAmJiAoYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4KSA8IE4pew0KICAgICAgICAgICAgLy8gICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSldOw0KICAgICAgICAgICAgLy8gICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOyAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICAgIC8vIGVsc2V7DQogICAgICAgICAgICAvLyAgICAgdGlsZUFbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gMDsNCiAgICAgICAgICAgIC8vICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSAwOw0KICAgICAgICAgICAgLy8gfQ0KDQogICAgICAgICAgICAvLyBJdCB3aWxsIGxvYWQgdGhlIGJvdW5kYXJ5LCBidXQgbm8gTUZNQSB3aWxsIGJlIGNhbGN1bGF0ZWQNCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQoNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBpZiAodDY0eSA9PSAwKXsNCiAgICAgICAgICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQogICAgICAgICAgICBmbG9hdCBzY2FsZUIgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YIC8gMTI4KV07DQogICAgICAgICAgICBmbG9hdCB2YWwgPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgTSAqIChrYmFzZSAvIDEyOCldICogc2NhbGVCOw0KICAgICAgICAgICAgLy8gVFJZOiAjcHJhZ21hIHVucm9sbCBpZiBubyByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSl7ICAgICAgDQogICAgICAgICAgICAgICAgdGlsZUFCc1tpXVt0NjR4XSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIC8vdGlsZUFCc1t0NjR4XVtpXSA9IHZhbDsNCiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBpIDwgMTYgICAgICAgICAgICANCiAgICAgICAgfSAvLyBlbmQgaWYgKHQ2NHkgPT0gMCkNCg0KDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiAxMzYgKyBrbWluaSwgMTM2KTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIDEzNiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgMTM2KTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICAgDQogICAgICAgIGF1dG8gZnJhZ19zY2FsZUEgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdICsgd2FycF9pZHhfeSAqIFdNTUFfTSwgNjgsIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KICAgICAgICAvL3JvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQUJzWzBdWzBdICsgd2FycF9pZHhfeSAqIFdNTUFfTSAqIDIwLCAyMCwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQoNCiAgICAgICAgLy8gQXBwbHkgc2NhbGVyDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgICAgICAvL2ZyYWdfYWNjX21hc3Rlci54W2ldICs9IGZyYWdfc2NhbGVBLnhbaV0gKiBmcmFnX2FjY19ibG9jay54W2ldOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKGZyYWdfc2NhbGVBLnhbaV0sIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgLy8gTm8gbmVlZCBmb3IgdGhpcyBzeW50aHJlYWRzKCksIGJ1dCBpdCdzIGZhc3RlciB3aXRoIGl0ID8/PyAgICAgICANCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCiAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICogTiArIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fcm93X21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgY3VzdG9tX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgDQogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdmcDhfbW0nLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwNCikNCg0KbW9kdWxlMiA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDMl0sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwNCikNCg0KIyBPMSBpcyBzbG93LCAtTzIgaXMgZXF1YWwgdG8gbm90aGluZywgIC1PMyBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBPMiAobWF5YmUgc2FtZSkgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAsICItRE5ERUJVRyIgLCAiLWZmYXN0LW1hdGgiDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgIyBpZiBhLnNoYXBlWzBdICUgNjQgIT0gMDoNCiAgICAjICAgICBtb2R1bGUyLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KICAgICMgZWxzZTogICAgDQogICAgIyAgICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgaWYgYS5zaGFwZVswXSA9PSA5NjoNCiAgICAgICAgbW9kdWxlMi5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykNCiAgICBlbHNlOiAgICANCiAgICAgICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKSAgICAgICAgDQogICAgcmV0dXJuIGMNCg==No newline at end of file
Best evidence level for this revision: reported
JSON