Skip to content
KernelIndex
Search⌘K

submission 29876

KernelBot user 376 · 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.

baguette_gemm_6.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-29876?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, 512]
AMD Instinct MI300X
35.0µs
#6 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
38.3µs
#18 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
48.1µs
#5 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
51.7µs
#9 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
60.8µs
#12 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
82.0µs
#12 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
83.8µs
#12 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
88.1µs
#9 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
95.4µs
#12 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
95.9µs
#10 of 98
2025-06-01
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
130.7µs
#10 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
150.3µs
#15 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
156.0µs
#20 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
175.3µs
#17 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
247.6µs
#10 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
335.7µs
#18 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
368.4µs
#17 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
720.5µs
#18 of 98
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:761eb67744f85b4b83f40bd399f20dde2dc1ce49dfbd21bbebe6080b8cc66ef7
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

baguette_gemm_6.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgoKdHlwZWRlZiBfX2hpcF9mcDhfZTRtM19mbnV6IGZwODsKdXNpbmcgdmVjNGYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgojZGVmaW5lIFdBUlBfU0laRSA2NAojZGVmaW5lIE5fV0FSUF9ZX0RFRiAyCiNkZWZpbmUgTl9XQVJQX1hfREVGIDQKLy8gT3V0cHV0IFRpbGUgY29uZmlnCiNkZWZpbmUgVElMRV9TSVpFX1lfREVGIDEyOAojZGVmaW5lIFRJTEVfU0laRV9YX0RFRiAxMjgKI2RlZmluZSBUSUxFX0tfRElNX0RFRiAxMjgKCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUY7CmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWF9ERUY7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUY7IC8vIDQKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUY7IC8vIDIKLy8gaW50cmluc2ljIGNvbmZpZwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fSyA9IDMyOwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fTk0gPSAxNjsKY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKdXNpbmcgdmVjNHUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJ1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90Owp1c2luZyB2ZWMyc2hvcnQgPQogICAgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDE2X3QpKSkpIHVpbnQxNl90OwoKX19kZXZpY2VfXyB2b2lkIG1hdG11bDE2eDE2KGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpiLCBpbnQgaywgaW50IGFfY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfY29sLCB2ZWM0ZiAmYywgaW50IG0sIGludCBuKSB7CiAgaW50IHRpZCA9IHRocmVhZElkeC54ICUgV0FSUF9TSVpFOwogIGludCByb3cgPSBrICsgdGlkICUgOCArICh0aWQgLyAxNikgKiA4OwogIGludCBjb2wgPSAoKHRpZCAlIDE2KSAvIDgpOwogIGludCBhX2NvbF9zID0gKGFfY29sIC8gOCArIGNvbCk7CiAgaW50IGJfY29sX3MgPSAoYl9jb2wgLyA4ICsgY29sKTsKICBpbnQgY29sX2Ffc3dpenpsZWQgPSAoKGFfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYV9jb2xfcyAlIDI7CiAgaW50IGNvbF9iX3N3aXp6bGVkID0gKChiX2NvbF9zIC8gMikgXiAocm93ICUgOCkpICogMiArIGJfY29sX3MgJSAyOwoKICBhdXRvIHBhY2tlZEEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGEgKyByb3cgKiBtKVtjb2xfYV9zd2l6emxlZF07CiAgYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihiICsgcm93ICogbSlbY29sX2Jfc3dpenpsZWRdOwoKICBjID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHBhY2tlZEEsIHBhY2tlZEIsIGMsIDAsIDAsIDApOwp9Cgp0ZW1wbGF0ZTxib29sIGJvdW5kQ2hlY2s+Cl9fZGV2aWNlX18gdm9pZCBsb2FkTERTKGludCB3YXJwSWQsIGludCBsYW5lSWQsIGludCBrSWQsIGZwOCAqc19hLCBmcDggKnNfYiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICphLCBjb25zdCBmcDggKmIsIGludCBNLCBpbnQgTikgewogIAogIGNvbnN0IGZwOCAqcHRyID0gYTsKICBmcDggKmRzdCA9IHNfYTsKICBpbnQgd2FycElkTG9jYWwgPSB3YXJwSWQlNDsKICBpbnQgc3RyaWRlID0gTTsKICAKICB1aW50MzJfdCBjb2xfb2Zmc2V0ID0gVElMRV9TSVpFX1ggKiBibG9ja0lkeC54OwogIGlmICh3YXJwSWQ+PTQpewogICAgcHRyPWI7CiAgICBjb2xfb2Zmc2V0ID0gVElMRV9TSVpFX1kgKiBibG9ja0lkeC55OwogICAgZHN0PXNfYjsKICAgIHN0cmlkZT0gTjsKICB9CiAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICBpZiBjb25zdGV4cHIgKGJvdW5kQ2hlY2spewogICAgYl9jaGVjayA9ICh3YXJwSWQ+PTQpIHx8IChjb2xfb2Zmc2V0IDwgc3RyaWRlKTsKICB9CiAgCiAgY29uc3RleHByIGludCBESU1ZID0gVElMRV9TSVpFX1kgLyA4OwogIHZlYzJ1IGJfdmFsdWVbOF0gPSB7MH07CiAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIAogICAgdmVjMnUgcmVzdWx0X2JbOF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyArK2opIHsKICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmYl92YWx1ZVtqXSlbaV07CiAgICAgIH0KCiAgICBmb3IgKGludCByID0gMDsgciA8IDg7IHIrKykgewogICAgICBpbnQgY29sID0gbGFuZUlkICUgRElNWTsKICAgICAgaW50IHJvdyA9IHIgKyAzMiAqIHdhcnBJZExvY2FsICsgOCAqIChsYW5lSWQgLyBESU1ZKTsKICAgICAgaW50IGNvbF9zd2l6emxlZCA9IDIgKiAoKGNvbCAvIDIpIF4gKHJvdyAlIDgpKSArIGNvbCAlIDI7CiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgfQp9CgpfX2dsb2JhbF9fIHZvaWQgY2FzdF9rZXJuZWwoX19oaXBfYmZsb2F0MTYgKmNfYmYxNiwgY29uc3QgZmxvYXQgKmNfZnAzMiwgaW50IE0sIGludCBOKSB7CgogICAgaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCt0aHJlYWRJZHgueDsKICAgIGlmICh0aWQ8TSpOKXsKICAgICAgY19iZjE2W3RpZF0gPSAoX19oaXBfYmZsb2F0MTYpY19mcDMyW3RpZF07CiAgICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsYm9vbCBib3VuZENoZWNrLCBib29sIHVzZUF0b21pYz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpCiAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicywKICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYgKmMsZmxvYXQgKmNfYXRvbWljLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CiAgaW50IHRpZCA9IHRocmVhZElkeC54OwogIGludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CgogIGludCBzcGxpdEsgPSBLIC8gS19TUExJVDsKICBpbnQga0lkU3RhcnQgPSBibG9ja0lkeC56ICogc3BsaXRLOwogIGludCBrSWRTdG9wID0gc3BsaXRLICsgYmxvY2tJZHgueiAqIHNwbGl0SzsKCiAgaW50IFNOID0gKE4gKyAxMjggLSAxKSAvIDEyODsKCiAgaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwogIGludCB3YXJwSWR4ID0gd2FycElkIC8gTkJXQVJQU19ZOyAKICBpbnQgd2FycElkeSA9IHdhcnBJZCAlIE5CV0FSUFNfWTsKCiAgX19zaGFyZWRfXyBmcDggc19hW0tfRElNXVtUSUxFX1NJWkVfWF07CiAgX19zaGFyZWRfXyBmcDggc19iW0tfRElNXVtUSUxFX1NJWkVfWV07CgogIGNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZIC8gTkJXQVJQU19ZIC8gTUFUTVVMX0RJTV9OTTsgLy8gMgogIGNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YIC8gTkJXQVJQU19YIC8gTUFUTVVMX0RJTV9OTTsgLy8gNAogIHZlYzRmIGNfc1tXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKCiAgZm9yIChpbnQga0lkID0ga0lkU3RhcnQ7IGtJZCA8IGtJZFN0b3A7IGtJZCArPSBLX0RJTSkgewoKICAgIGxvYWRMRFM8Ym91bmRDaGVjaz4od2FycElkLCBsYW5lSWQsIGtJZCwgJnNfYVswXVswXSwgJnNfYlswXVswXSwgYSwgYiwgTSwgTik7CiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgdmVjNGYgY190bXBbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CiNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgICBmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykgewogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CiAgICAgICAgY29uc3RleHByIGludCBzdGVwWSA9IFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWTsKCiAgICAgICAgdmVjNGYgY190bXAgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBLX0RJTTtrICs9IE1BVE1VTF9ESU1fSykgLy8gTUFUTVVMX0RJTV9LIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBLX0RJTQogICAgICAgIHsKICAgICAgICAgIGludCBhX2NvbCA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAgIGludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAgIG1hdG11bDE2eDE2KCZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGssIGFfY29sLCBiX2NvbCwgY190bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTEVfU0laRV9YLCBUSUxFX1NJWkVfWSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgYV9yb3cgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgLy8gQXBwbHkgc2NhbGluZwogICAgICAgIGludCBhc19jb2wgPSBrSWQgLyAxMjg7CiAgICAgICAgaW50IGFzX3JvdyA9IGFfcm93ICsgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9YOwogICAgICAgIGludCBic19jb2wgPSBibG9ja0lkeC55OwogICAgICAgIGludCBic19yb3cgPSBrSWQgLyAxMjg7CiAgICAgICAgZmxvYXQgYnNfdmFsID0gYnNbYnNfcm93ICogU04gKyBic19jb2xdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBpbnQgcm93ID0gYXNfcm93ICsgaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgZmxvYXQgYXNfdmFsID0gYXNbYXNfY29sICogTSArIHJvd107CiAgICAgICAgICBjX3NbdF93SWR4XVt0X3dJZHldW2ldICs9IGNfdG1wW2ldICogYXNfdmFsICogYnNfdmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKICB9CiAgCgogIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CiAgICBmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykgewogICAgICAvLyBvZmZzZXQgcG9pbnRpbmcgdG8gdGhlIGFjY3VtdWxhdGVkIDE2eDE2IGJsb2NrCiAgICAgIGludCBjb2xfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnkgKiBUSUxFX1NJWkVfWSArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHkgKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHkgKiAoVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgaW50IHJvd19vZmZzZXQgPQogICAgICAgICAgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9YICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAgICAgICAod2FycElkeCAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgIHRfd0lkeCAqIChUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1gpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICBhdXRvIHJlcyA9IGNfc1t0X3dJZHhdW3Rfd0lkeV07CgogICAgICBib29sIGJfY2hlY2sgPSB0cnVlOwogICAgICBpZiBjb25zdGV4cHIgKGJvdW5kQ2hlY2spewogICAgICAgIGJfY2hlY2sgPSAocm93X29mZnNldCkgPCBNICYmIChjb2xfb2Zmc2V0KSA8IE47CiAgICAgIH0KICAgICAgaWYgKGJfY2hlY2spIHsKICAgICAgICAgIC8vIEMgaXMgc3RvcmVkIG9uIDQgVkdQUnMKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgICAgIGludCBjb2wgPSBsYW5lSWQgJSAxNjsKICAgICAgICAgICAgICBpbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgICAgICAgICAgICAgIGF0b21pY0FkZCggJmNfYXRvbWljWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldLHJlc1tpXSk7CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBjWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldID0gKF9faGlwX2JmbG9hdDE2KShyZXNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAKICAgICAgfQogICAgfQogIH0KfQoKCnN0cnVjdCBMYXVuY2hDb25maWcgewogIGludCBLX1NQTElUOwogIGJvb2wgdXNlQXRvbWljOwogIGJvb2wgYm91bmRDaGVjazsKfTsKCnRlbXBsYXRlIDxpbnQgS19TUExJVCwgYm9vbCBib3VuZENoZWNrLCBib29sIHVzZUF0b21pYz4KaW5saW5lIHZvaWQgbGF1bmNoX2tlcm5lbF92YXJpYW50KGNvbnN0IGRpbTMmIGJsb2NrcywgY29uc3QgZGltMyYgdGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzQ2FzdCgyNTYpOwogIGRpbTMgYmxvY2tDYXN0KChNKk4gKyAoTipNLTEpKS8yNTYpOwoKICBoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWw8S19TUExJVCwgYm91bmRDaGVjaywgdXNlQXRvbWljPiksIGJsb2NrcywgdGhyZWFkcywgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQywgY19hdG9taWMsTSwgTiwgSyk7CiAgaWYgY29uc3RleHByICh1c2VBdG9taWMpewogICAgaGlwTGF1bmNoS2VybmVsR0dMKGNhc3Rfa2VybmVsLCBibG9ja0Nhc3QsdGhyZWFkc0Nhc3QsMCwwLGRfQyxjX2F0b21pYyxNLE4pOwogIH0KfQoKCnRlbXBsYXRlIDxpbnQgS19TUExJVD4KaW5saW5lIHZvaWQgZGlzcGF0Y2hfYm91bmRfYXRvbWljKGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CiAgaWYgKGJvdW5kQ2hlY2spIHsKICAgIGlmICh1c2VBdG9taWMpewogICAgICBoaXBNZW1zZXRBc3luYyhjX2F0b21pYywgMCwgTipNICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCB0cnVlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgfSAKICAgIGVsc2V7CiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCB0cnVlLCBmYWxzZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHVzZUF0b21pYyl7CiAgICAgIGhpcE1lbXNldEFzeW5jKGNfYXRvbWljLCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIGZhbHNlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgICB9CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDg6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw4Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgCiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCnZvaWQgbGF1bmNoX2tlcm5lbChjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsIGNvbnN0IGZsb2F0ICpkX0FzLAogICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsIGZsb2F0KmNfYXRvbWljLGludCBNLCBpbnQgTiwKICAgICAgICAgICAgICAgICAgIGludCBLKSB7CiAgTGF1bmNoQ29uZmlnIGNvbmZpZzsKICBjb25maWcudXNlQXRvbWljPWZhbHNlOwogIGNvbmZpZy5LX1NQTElUPTE7CiAgaWYgKE0gJSAxMjggPT0wICYmIE4gJTEyOCA9PTApCiAgICBjb25maWcuYm91bmRDaGVjayA9IGZhbHNlOwogIGVsc2UKICAgIGNvbmZpZy5ib3VuZENoZWNrID0gdHJ1ZTsKCiAgaWYgKChNID09IDEwMjQgJiYgIE49PTUxMiAmJiBLID09NzE2OCApIHx8CiAgICAgIChNID09IDEwMjQgJiYgIE49PTU3NiAmJiBLID09NzE2OCApKXsKICAgICAgICBjb25maWcudXNlQXRvbWljID0gdHJ1ZTsKICAgICAgICBjb25maWcuS19TUExJVCA9IDg7CiAgICAgIAogICAgICB9ZWxzZSBpZiAoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9CiAgICAgIGVsc2UgaWYgKE0gPT0gNjE0NCAmJiAgTj09NTEyICYmIEsgPT03MTY4ICl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSAyOwogICAgICB9CiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwp9CgoKCgojZGVmaW5lIEhJUF9DSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIGhpcEVycm9yX3QgZXJyb3IgPSBjb25kaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIGlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yICIgPDwgaGlwR2V0RXJyb3JOYW1lKGVycm9yKSA8PCAnKCcgPDwgZXJyb3IgPDwgJyknIDw8ICI6ICIgICAgQAogICAgICAgICAgICAgICAgICAgICAgPDwgaGlwR2V0RXJyb3JTdHJpbmcoZXJyb3IpIDw8ICIgaW4gIiA8PCBfX2Z1bmNfXyA8PCAiIGF0ICIgPDwgX19GSUxFX18gQAogICAgICAgICAgICAgICAgICAgICAgPDwgJzonIDw8IF9fTElORV9fIDw8ICdAbic7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgICAgICBleGl0KGVycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgd2hpbGUoZmFsc2UpCgp2b2lkIHJ1bigKICAgIHVpbnRwdHJfdCBhX3B0ciwKICAgIHVpbnRwdHJfdCBiX3B0ciwKICAgIHVpbnRwdHJfdCBhc19wdHIsCiAgICB1aW50cHRyX3QgYnNfcHRyLAogICAgdWludHB0cl90IGNfcHRyLAogICAgaW50IE0sCiAgICBpbnQgTiwKICAgIGludCBLCikgewogICAgY29uc3QgYXV0byogZF9BID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihhX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0IgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oYXNfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oYnNfcHRyKTsKICAgIGF1dG8qIGRfQyA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19oaXBfYmZsb2F0MTYqPihjX3B0cik7CgogICAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZCgoTSArIFRJTEVfU0laRV9YX0RFRiAtIDEpIC8gVElMRV9TSVpFX1hfREVGLAogICAgICAgICAgICAgICAgICAgICAoTiArIFRJTEVfU0laRV9ZX0RFRiAtIDEpIC8gVElMRV9TSVpFX1lfREVGKTsKICAgIAogICAgc3RhdGljIGZsb2F0KiBkX2FycmF5ID0gbnVsbHB0cjsKICAgIGNvbnN0ZXhwciBpbnQgbl9tYXg9NzE2ODsKICAgIGNvbnN0ZXhwciBpbnQgbV9tYXg9NjE0NDsKICAgIGlmICghZF9hcnJheSkKICAgIHsKICAgICAgICBzaXplX3Qgc2l6ZSA9IG1fbWF4Km5fbWF4ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICBoaXBFcnJvcl90IGVyciA9IGhpcE1hbGxvYygmZF9hcnJheSwgc2l6ZSk7CiAgICB9CiAgICBsYXVuY2hfa2VybmVsKGRfQSwgZF9CLCBkX0FzLAogICAgICAgICAgICAgICAgICAgZF9CcyxkX0MsIGRfYXJyYXksIE0sIE4sIEspOyAKCiAgICBISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMjAgLU8zIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBj

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 25269.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgewogICAgICBoaXBNZW1zZXQoY19hdG9taWMsIDAsIE4qTSAqIHNpemVvZihmbG9hdCkpOwogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIH0KICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKXsKICAgICAgaGlwTWVtc2V0QXN5bmMoY19hdG9taWMsIDAsIE4qTSAqIHNpemVvZihmbG9hdCkpOwogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIHRydWU+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgICB9CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLCBjb25zdCBmbG9hdCAqZF9BcywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLCBmbG9hdCpjX2F0b21pYyxpbnQgTSwgaW50IE4sCiAgICAgICAgICAgICAgICAgICBpbnQgSykgewogIExhdW5jaENvbmZpZyBjb25maWc7CiAgY29uZmlnLnVzZUF0b21pYz1mYWxzZTsKICBjb25maWcuS19TUExJVD0xOwogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CgogIC8vU1BMSVQgSyBmb3IgdGhlc2UgOgogIGlmICgoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01MTIgJiYgSyA9PTcxNjggKSB8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01NzYgJiYgSyA9PTcxNjggKSl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9ICAKICBsYXVuY2hfa2VybmVsKGNvbmZpZywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7Cn0KCgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdm9pZCBydW4oCiAgICB1aW50cHRyX3QgYV9wdHIsCiAgICB1aW50cHRyX3QgYl9wdHIsCiAgICB1aW50cHRyX3QgYXNfcHRyLAogICAgdWludHB0cl90IGJzX3B0ciwKICAgIHVpbnRwdHJfdCBjX3B0ciwKICAgIGludCBNLAogICAgaW50IE4sCiAgICBpbnQgSwopIHsKICAgIGNvbnN0IGF1dG8qIGRfQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogZF9CID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0FzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGFzX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0JzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGJzX3B0cik7CiAgICBhdXRvKiBkX0MgPSByZWludGVycHJldF9jYXN0PF9faGlwX2JmbG9hdDE2Kj4oY19wdHIpOwoKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CiAgICAKICAgIHN0YXRpYyBmbG9hdCogZF9hcnJheSA9IG51bGxwdHI7CiAgICBjb25zdGV4cHIgaW50IG5fbWF4PTcxNjg7CiAgICBjb25zdGV4cHIgaW50IG1fbWF4PTYxNDQ7CiAgICBpZiAoIWRfYXJyYXkpCiAgICB7CiAgICAgICAgc2l6ZV90IHNpemUgPSBtX21heCpuX21heCAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgaGlwRXJyb3JfdCBlcnIgPSBoaXBNYWxsb2MoJmRfYXJyYXksIHNpemUpOwogICAgfQogICAgbGF1bmNoX2tlcm5lbChkX0EsIGRfQiwgZF9BcywKICAgICAgICAgICAgICAgICAgIGRfQnMsZF9DLCBkX2FycmF5LCBNLCBOLCBLKTsgCgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKfQoKUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewogIG0uZGVmKCJmcDgiLCAmcnVuLCAiSElQIGtlcm5lbCIpOwp9CiIiIgoKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4IiwKICAgIGNwcF9zb3VyY2VzPSIiLAogICAgY3VkYV9zb3VyY2VzPWtlcm5lbF9jcHAucmVwbGFjZSgnQCcsIGNocig5MikpLAogICAgd2l0aF9jdWRhPVRydWUsCiAgICB2ZXJib3NlPUZhbHNlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBj
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgoKdHlwZWRlZiBfX2hpcF9mcDhfZTRtM19mbnV6IGZwODsKdXNpbmcgdmVjNGYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgojZGVmaW5lIFdBUlBfU0laRSA2NAojZGVmaW5lIE5fV0FSUF9ZX0RFRiAyCiNkZWZpbmUgTl9XQVJQX1hfREVGIDQKLy8gT3V0cHV0IFRpbGUgY29uZmlnCiNkZWZpbmUgVElMRV9TSVpFX1lfREVGIDEyOAojZGVmaW5lIFRJTEVfU0laRV9YX0RFRiAxMjgKI2RlZmluZSBUSUxFX0tfRElNX0RFRiAxMjgKCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUY7CmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWF9ERUY7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUY7IC8vIDQKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUY7IC8vIDIKLy8gaW50cmluc2ljIGNvbmZpZwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fSyA9IDMyOwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fTk0gPSAxNjsKY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKdXNpbmcgdmVjNHUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJ1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90Owp1c2luZyB2ZWMyc2hvcnQgPQogICAgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDE2X3QpKSkpIHVpbnQxNl90OwoKX19kZXZpY2VfXyB2b2lkIG1hdG11bDE2eDE2KGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpiLCBpbnQgaywgaW50IGFfY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfY29sLCB2ZWM0ZiAmYywgaW50IG0sIGludCBuKSB7CiAgaW50IHRpZCA9IHRocmVhZElkeC54ICUgV0FSUF9TSVpFOwogIGludCByb3cgPSBrICsgdGlkICUgOCArICh0aWQgLyAxNikgKiA4OwogIGludCBjb2wgPSAoKHRpZCAlIDE2KSAvIDgpOwogIGludCBhX2NvbF9zID0gKGFfY29sIC8gOCArIGNvbCk7CiAgaW50IGJfY29sX3MgPSAoYl9jb2wgLyA4ICsgY29sKTsKICBpbnQgY29sX2Ffc3dpenpsZWQgPSAoKGFfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYV9jb2xfcyAlIDI7CiAgaW50IGNvbF9iX3N3aXp6bGVkID0gKChiX2NvbF9zIC8gMikgXiAocm93ICUgOCkpICogMiArIGJfY29sX3MgJSAyOwoKICBhdXRvIHBhY2tlZEEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGEgKyByb3cgKiBtKVtjb2xfYV9zd2l6emxlZF07CiAgYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihiICsgcm93ICogbSlbY29sX2Jfc3dpenpsZWRdOwoKICBjID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHBhY2tlZEEsIHBhY2tlZEIsIGMsIDAsIDAsIDApOwp9Cgp0ZW1wbGF0ZTxib29sIGJvdW5kQ2hlY2s+Cl9fZGV2aWNlX18gdm9pZCBsb2FkTERTKGludCB3YXJwSWQsIGludCBsYW5lSWQsIGludCBrSWQsIGZwOCAqc19hLCBmcDggKnNfYiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICphLCBjb25zdCBmcDggKmIsIGludCBNLCBpbnQgTikgewogIAogIGNvbnN0IGZwOCAqcHRyID0gYTsKICBmcDggKmRzdCA9IHNfYTsKICBpbnQgd2FycElkTG9jYWwgPSB3YXJwSWQlNDsKICBpbnQgc3RyaWRlID0gTTsKICAKICB1aW50MzJfdCBjb2xfb2Zmc2V0ID0gVElMRV9TSVpFX1ggKiBibG9ja0lkeC54OwogIGlmICh3YXJwSWQ+PTQpewogICAgcHRyPWI7CiAgICBjb2xfb2Zmc2V0ID0gVElMRV9TSVpFX1kgKiBibG9ja0lkeC55OwogICAgZHN0PXNfYjsKICAgIHN0cmlkZT0gTjsKICB9CiAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICBpZiBjb25zdGV4cHIgKGJvdW5kQ2hlY2spewogICAgYl9jaGVjayA9ICh3YXJwSWQ+PTQpIHx8IChjb2xfb2Zmc2V0IDwgc3RyaWRlKTsKICB9CiAgCiAgY29uc3RleHByIGludCBESU1ZID0gVElMRV9TSVpFX1kgLyA4OwogIHZlYzJ1IGJfdmFsdWVbOF0gPSB7MH07CiAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIAogICAgdmVjMnUgcmVzdWx0X2JbOF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyArK2opIHsKICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmYl92YWx1ZVtqXSlbaV07CiAgICAgIH0KCiAgICBmb3IgKGludCByID0gMDsgciA8IDg7IHIrKykgewogICAgICBpbnQgY29sID0gbGFuZUlkICUgRElNWTsKICAgICAgaW50IHJvdyA9IHIgKyAzMiAqIHdhcnBJZExvY2FsICsgOCAqIChsYW5lSWQgLyBESU1ZKTsKICAgICAgaW50IGNvbF9zd2l6emxlZCA9IDIgKiAoKGNvbCAvIDIpIF4gKHJvdyAlIDgpKSArIGNvbCAlIDI7CiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgfQp9CgpfX2dsb2JhbF9fIHZvaWQgY2FzdF9rZXJuZWwoX19oaXBfYmZsb2F0MTYgKmNfYmYxNiwgY29uc3QgZmxvYXQgKmNfZnAzMiwgaW50IE0sIGludCBOKSB7CgogICAgaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCt0aHJlYWRJZHgueDsKICAgIGlmICh0aWQ8TSpOKXsKICAgICAgY19iZjE2W3RpZF0gPSAoX19oaXBfYmZsb2F0MTYpY19mcDMyW3RpZF07CiAgICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsYm9vbCBib3VuZENoZWNrLCBib29sIHVzZUF0b21pYz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpCiAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicywKICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYgKmMsZmxvYXQgKmNfYXRvbWljLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CiAgaW50IHRpZCA9IHRocmVhZElkeC54OwogIGludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CgogIGludCBzcGxpdEsgPSBLIC8gS19TUExJVDsKICBpbnQga0lkU3RhcnQgPSBibG9ja0lkeC56ICogc3BsaXRLOwogIGludCBrSWRTdG9wID0gc3BsaXRLICsgYmxvY2tJZHgueiAqIHNwbGl0SzsKCiAgaW50IFNOID0gKE4gKyAxMjggLSAxKSAvIDEyODsKCiAgaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwogIGludCB3YXJwSWR4ID0gd2FycElkIC8gTkJXQVJQU19ZOyAKICBpbnQgd2FycElkeSA9IHdhcnBJZCAlIE5CV0FSUFNfWTsKCiAgX19zaGFyZWRfXyBmcDggc19hW0tfRElNXVtUSUxFX1NJWkVfWF07CiAgX19zaGFyZWRfXyBmcDggc19iW0tfRElNXVtUSUxFX1NJWkVfWV07CgogIGNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZIC8gTkJXQVJQU19ZIC8gTUFUTVVMX0RJTV9OTTsgLy8gMgogIGNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YIC8gTkJXQVJQU19YIC8gTUFUTVVMX0RJTV9OTTsgLy8gNAogIHZlYzRmIGNfc1tXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKCiAgZm9yIChpbnQga0lkID0ga0lkU3RhcnQ7IGtJZCA8IGtJZFN0b3A7IGtJZCArPSBLX0RJTSkgewoKICAgIGxvYWRMRFM8Ym91bmRDaGVjaz4od2FycElkLCBsYW5lSWQsIGtJZCwgJnNfYVswXVswXSwgJnNfYlswXVswXSwgYSwgYiwgTSwgTik7CiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgdmVjNGYgY190bXBbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CiNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgICBmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykgewogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CiAgICAgICAgY29uc3RleHByIGludCBzdGVwWSA9IFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWTsKCiAgICAgICAgdmVjNGYgY190bXAgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBLX0RJTTtrICs9IE1BVE1VTF9ESU1fSykgLy8gTUFUTVVMX0RJTV9LIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBLX0RJTQogICAgICAgIHsKICAgICAgICAgIGludCBhX2NvbCA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAgIGludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAgIG1hdG11bDE2eDE2KCZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGssIGFfY29sLCBiX2NvbCwgY190bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTEVfU0laRV9YLCBUSUxFX1NJWkVfWSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgYV9yb3cgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgLy8gQXBwbHkgc2NhbGluZwogICAgICAgIGludCBhc19jb2wgPSBrSWQgLyAxMjg7CiAgICAgICAgaW50IGFzX3JvdyA9IGFfcm93ICsgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9YOwogICAgICAgIGludCBic19jb2wgPSBibG9ja0lkeC55OwogICAgICAgIGludCBic19yb3cgPSBrSWQgLyAxMjg7CiAgICAgICAgZmxvYXQgYnNfdmFsID0gYnNbYnNfcm93ICogU04gKyBic19jb2xdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBpbnQgcm93ID0gYXNfcm93ICsgaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgZmxvYXQgYXNfdmFsID0gYXNbYXNfY29sICogTSArIHJvd107CiAgICAgICAgICBjX3NbdF93SWR4XVt0X3dJZHldW2ldICs9IGNfdG1wW2ldICogYXNfdmFsICogYnNfdmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKICB9CiAgCgogIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CiAgICBmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykgewogICAgICAvLyBvZmZzZXQgcG9pbnRpbmcgdG8gdGhlIGFjY3VtdWxhdGVkIDE2eDE2IGJsb2NrCiAgICAgIGludCBjb2xfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnkgKiBUSUxFX1NJWkVfWSArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHkgKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHkgKiAoVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgaW50IHJvd19vZmZzZXQgPQogICAgICAgICAgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9YICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAgICAgICAod2FycElkeCAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgIHRfd0lkeCAqIChUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1gpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICBhdXRvIHJlcyA9IGNfc1t0X3dJZHhdW3Rfd0lkeV07CgogICAgICBib29sIGJfY2hlY2sgPSB0cnVlOwogICAgICBpZiBjb25zdGV4cHIgKGJvdW5kQ2hlY2spewogICAgICAgIGJfY2hlY2sgPSAocm93X29mZnNldCkgPCBNICYmIChjb2xfb2Zmc2V0KSA8IE47CiAgICAgIH0KICAgICAgaWYgKGJfY2hlY2spIHsKICAgICAgICAgIC8vIEMgaXMgc3RvcmVkIG9uIDQgVkdQUnMKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgICAgewogICAgICAgICAgICAgIGludCBjb2wgPSBsYW5lSWQgJSAxNjsKICAgICAgICAgICAgICBpbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwogICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgICAgICAgICAgICAgIGF0b21pY0FkZCggJmNfYXRvbWljWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldLHJlc1tpXSk7CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBjWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldID0gKF9faGlwX2JmbG9hdDE2KShyZXNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAKICAgICAgfQogICAgfQogIH0KfQoKCnN0cnVjdCBMYXVuY2hDb25maWcgewogIGludCBLX1NQTElUOwogIGJvb2wgdXNlQXRvbWljOwogIGJvb2wgYm91bmRDaGVjazsKfTsKCnRlbXBsYXRlIDxpbnQgS19TUExJVCwgYm9vbCBib3VuZENoZWNrLCBib29sIHVzZUF0b21pYz4KaW5saW5lIHZvaWQgbGF1bmNoX2tlcm5lbF92YXJpYW50KGNvbnN0IGRpbTMmIGJsb2NrcywgY29uc3QgZGltMyYgdGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzQ2FzdCgyNTYpOwogIGRpbTMgYmxvY2tDYXN0KChNKk4gKyAoTipNLTEpKS8yNTYpOwoKICBoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWw8S19TUExJVCwgYm91bmRDaGVjaywgdXNlQXRvbWljPiksIGJsb2NrcywgdGhyZWFkcywgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQywgY19hdG9taWMsTSwgTiwgSyk7CiAgaWYgY29uc3RleHByICh1c2VBdG9taWMpewogICAgaGlwTGF1bmNoS2VybmVsR0dMKGNhc3Rfa2VybmVsLCBibG9ja0Nhc3QsdGhyZWFkc0Nhc3QsMCwwLGRfQyxjX2F0b21pYyxNLE4pOwogIH0KfQoKCnRlbXBsYXRlIDxpbnQgS19TUExJVD4KaW5saW5lIHZvaWQgZGlzcGF0Y2hfYm91bmRfYXRvbWljKGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CiAgaWYgKGJvdW5kQ2hlY2spIHsKICAgIGlmICh1c2VBdG9taWMpewogICAgICBoaXBNZW1zZXRBc3luYyhjX2F0b21pYywgMCwgTipNICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCB0cnVlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgfSAKICAgIGVsc2V7CiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCB0cnVlLCBmYWxzZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHVzZUF0b21pYyl7CiAgICAgIGhpcE1lbXNldEFzeW5jKGNfYXRvbWljLCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIGZhbHNlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgICB9CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDg6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw4Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgCiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCnZvaWQgbGF1bmNoX2tlcm5lbChjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsIGNvbnN0IGZsb2F0ICpkX0FzLAogICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsIGZsb2F0KmNfYXRvbWljLGludCBNLCBpbnQgTiwKICAgICAgICAgICAgICAgICAgIGludCBLKSB7CiAgTGF1bmNoQ29uZmlnIGNvbmZpZzsKICBjb25maWcudXNlQXRvbWljPWZhbHNlOwogIGNvbmZpZy5LX1NQTElUPTE7CiAgaWYgKE0gJSAxMjggPT0wICYmIE4gJTEyOCA9PTApCiAgICBjb25maWcuYm91bmRDaGVjayA9IGZhbHNlOwogIGVsc2UKICAgIGNvbmZpZy5ib3VuZENoZWNrID0gdHJ1ZTsKCiAgaWYgKChNID09IDEwMjQgJiYgIE49PTUxMiAmJiBLID09NzE2OCApIHx8CiAgICAgIChNID09IDEwMjQgJiYgIE49PTU3NiAmJiBLID09NzE2OCApKXsKICAgICAgICBjb25maWcudXNlQXRvbWljID0gdHJ1ZTsKICAgICAgICBjb25maWcuS19TUExJVCA9IDg7CiAgICAgIAogICAgICB9ZWxzZSBpZiAoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9CiAgICAgIGVsc2UgaWYgKE0gPT0gNjE0NCAmJiAgTj09NTEyICYmIEsgPT03MTY4ICl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSAyOwogICAgICB9CiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwp9CgoKCgojZGVmaW5lIEhJUF9DSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIGhpcEVycm9yX3QgZXJyb3IgPSBjb25kaXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIGlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yICIgPDwgaGlwR2V0RXJyb3JOYW1lKGVycm9yKSA8PCAnKCcgPDwgZXJyb3IgPDwgJyknIDw8ICI6ICIgICAgQAogICAgICAgICAgICAgICAgICAgICAgPDwgaGlwR2V0RXJyb3JTdHJpbmcoZXJyb3IpIDw8ICIgaW4gIiA8PCBfX2Z1bmNfXyA8PCAiIGF0ICIgPDwgX19GSUxFX18gQAogICAgICAgICAgICAgICAgICAgICAgPDwgJzonIDw8IF9fTElORV9fIDw8ICdAbic7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgICAgICBleGl0KGVycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAogICAgd2hpbGUoZmFsc2UpCgp2b2lkIHJ1bigKICAgIHVpbnRwdHJfdCBhX3B0ciwKICAgIHVpbnRwdHJfdCBiX3B0ciwKICAgIHVpbnRwdHJfdCBhc19wdHIsCiAgICB1aW50cHRyX3QgYnNfcHRyLAogICAgdWludHB0cl90IGNfcHRyLAogICAgaW50IE0sCiAgICBpbnQgTiwKICAgIGludCBLCikgewogICAgY29uc3QgYXV0byogZF9BID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihhX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0IgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oYXNfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oYnNfcHRyKTsKICAgIGF1dG8qIGRfQyA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19oaXBfYmZsb2F0MTYqPihjX3B0cik7CgogICAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZCgoTSArIFRJTEVfU0laRV9YX0RFRiAtIDEpIC8gVElMRV9TSVpFX1hfREVGLAogICAgICAgICAgICAgICAgICAgICAoTiArIFRJTEVfU0laRV9ZX0RFRiAtIDEpIC8gVElMRV9TSVpFX1lfREVGKTsKICAgIAogICAgc3RhdGljIGZsb2F0KiBkX2FycmF5ID0gbnVsbHB0cjsKICAgIGNvbnN0ZXhwciBpbnQgbl9tYXg9NzE2ODsKICAgIGNvbnN0ZXhwciBpbnQgbV9tYXg9NjE0NDsKICAgIGlmICghZF9hcnJheSkKICAgIHsKICAgICAgICBzaXplX3Qgc2l6ZSA9IG1fbWF4Km5fbWF4ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICBoaXBFcnJvcl90IGVyciA9IGhpcE1hbGxvYygmZF9hcnJheSwgc2l6ZSk7CiAgICB9CiAgICBsYXVuY2hfa2VybmVsKGRfQSwgZF9CLCBkX0FzLAogICAgICAgICAgICAgICAgICAgZF9CcyxkX0MsIGRfYXJyYXksIE0sIE4sIEspOyAKCiAgICBISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMjAgLU8zIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBj
No newline at end of file

Best evidence level for this revision: reported

JSON