amd-mixture-of-experts · submission 31229
KernelBot user 266 · 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.
submission_moe_optimize_1207.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-31229?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:3af9f5e44c723429fc5f3b33b2518ddd68a9703794c6796a349b2c60831e7726
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
submission_moe_optimize_1207.py1 lines
ZnJvbSBwaXAuX2ludGVybmFsIGltcG9ydCBtYWluIGFzIHBpcF9tYWluCnBpcF9tYWluKFsnaW5zdGFsbCcsICd0aWxlbGFuZy1yb2NtJ10pCgppbXBvcnQgbWF0aAppbXBvcnQgdG9yY2gKaW1wb3J0IHRvcmNoLm5uIGFzIG5uCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKZnJvbSB0b3JjaC5wcm9maWxlciBpbXBvcnQgcHJvZmlsZSwgUHJvZmlsZXJBY3Rpdml0eQpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIE9wdGlvbmFsCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKaW1wb3J0IHRpbGVsYW5nCmltcG9ydCB0aWxlbGFuZy5sYW5ndWFnZSBhcyBUCmZyb20gdGlsZWxhbmcuYXV0b3R1bmVyIGltcG9ydCAqCgppbXBvcnQgdGltZQoKIyB0aWxlbGFuZy5kaXNhYmxlX2NhY2hlKCkKCgpAdGlsZWxhbmcuaml0CmRlZiBtb2VfZm9yd2FyZF90aWxlbGFuZ19zaGFyZWQoZF9oaWRkZW4sIGRfZXhwZXJ0LCBuX3NoYXJlZF9leHBlcnRzLCBkdHlwZSwgbnVtX3Rva2VucywgYmxvY2tfdG9rZW49MTI4LCBibG9ja19kaGlkZGVuPTEyOCwgYmxvY2tfZGV4cGVydD0xMjgsIHRocmVhZHM9MjU2LCBudW1fc3RhZ2VzPTEpOgoKICAgIHNjYWxlID0gMS40NDI2OTUwNCAgIyBsb2cyKGUpCgogICAgIyBQYXJhbWV0ZXJzCiAgICBkaGlkZGVuID0gZF9oaWRkZW4KICAgIGRleHBlcnQgPSBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMKCiAgICAjIFRlbnNvcnM6IE5vdGUgdGhhdCBpbnB1dCBzaGFwZSBpcyByZXNoYXBlIHRvIChudW1fdG9rZW5zLCBkaGlkZGVuKQogICAgaW5wdXRfc2hhcGUgPSAobnVtX3Rva2VucywgZGhpZGRlbikKICAgIHNoYXJlZF9XX2dhdGVfc2hhcGUgPSAoZGhpZGRlbiwgZGV4cGVydCkKICAgIHNoYXJlZF9XX3VwX3NoYXBlID0gKGRoaWRkZW4sIGRleHBlcnQpCiAgICBzaGFyZWRfV19kb3duX3NoYXBlID0gKGRleHBlcnQsIGRoaWRkZW4pCgogICAgYWNjdW1fdHlwZSA9ICJmbG9hdDMyIiAKCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBrZXJuZWxfc2hhcmVkKAogICAgICAgIGlucHV0OiBULlRlbnNvcihpbnB1dF9zaGFwZSwgZHR5cGUpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIHNoYXJlZF9XX2dhdGU6IFQuVGVuc29yKHNoYXJlZF9XX2dhdGVfc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICBzaGFyZWRfV191cDogVC5UZW5zb3Ioc2hhcmVkX1dfdXBfc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICBzaGFyZWRfV19kb3duOiBULlRlbnNvcihzaGFyZWRfV19kb3duX3NoYXBlLCBkdHlwZSksICMgdHlwZTogaWdub3JlCiAgICAgICAgdXBfbG9naXRzOiBULlRlbnNvcigobnVtX3Rva2VucywgZGV4cGVydCksIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICBvdXRwdXQ6IFQuVGVuc29yKGlucHV0X3NoYXBlLCBkdHlwZSksICMgdHlwZTogaWdub3JlCiAgICApOgogICAgICAgICMgU3RlcCAxOiBDb21wdXRlIGdhdGUgYW5kIHVwIGxvZ2l0cwogICAgICAgIHdpdGggVC5LZXJuZWwoVC5jZWlsZGl2KG51bV90b2tlbnMsIGJsb2NrX3Rva2VuKSwgVC5jZWlsZGl2KGRleHBlcnQsIGJsb2NrX2RleHBlcnQpLCB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnkpOgogICAgICAgICAgICAjIFNwbGl0IHRoZSBibG9jayB0byBzaGFyZWQgZXhwZXJ0cyBhbmQgcm91dGVkIGV4cGVydHMKICAgICAgICAgICAgaW5wdXRfc2hhcmVkID0gVC5hbGxvY19mcmFnbWVudCgoYmxvY2tfdG9rZW4sIGJsb2NrX2RoaWRkZW4pLCBkdHlwZT1kdHlwZSkKICAgICAgICAgICAgV19nYXRlX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKChibG9ja19kaGlkZGVuLCBibG9ja19kZXhwZXJ0KSwgZHR5cGU9ZHR5cGUpCiAgICAgICAgICAgIFdfdXBfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoKGJsb2NrX2RoaWRkZW4sIGJsb2NrX2RleHBlcnQpLCBkdHlwZT1kdHlwZSkKICAgICAgICAgICAgIyBXX2Rvd25fc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoKGJsb2NrX2RleHBlcnQsIGJsb2NrX2RpbSksIGR0eXBlPWR0eXBlKSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyBTaGFyZWQgZXhwZXJ0czogbm8gbmVlZCB0byBjaGVjayBleHBlcnRfaW5kaWNlcwoKICAgICAgICAgICAgZ2F0ZV9sb2dpdHNfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KChibG9ja190b2tlbiwgYmxvY2tfZGV4cGVydCksIGR0eXBlPWFjY3VtX3R5cGUpCiAgICAgICAgICAgIHVwX2xvZ2l0c19sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoKGJsb2NrX3Rva2VuLCBibG9ja19kZXhwZXJ0KSwgZHR5cGU9YWNjdW1fdHlwZSkKICAgICAgICAgICAgIyBkb3duX2xvZ2l0c19sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoKGJsb2NrX3Rva2VuLCBibG9ja19kaW0pLCBkdHlwZT1kdHlwZSkKCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTApCiAgICAgICAgICAgIFQuY2xlYXIoZ2F0ZV9sb2dpdHNfbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIodXBfbG9naXRzX2xvY2FsKQogICAgICAgICAgICAjIFQuY2xlYXIoZG93bl9sb2dpdHNfbG9jYWwpCiAgICAgICAgICAgIAogICAgICAgICAgICAjIFBhcmFsbGVsIGZvciBnYXRlIGFuZCB1cCBtYXRtdWwKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQoVC5jZWlsZGl2KGRoaWRkZW4sIGJsb2NrX2RoaWRkZW4pLCBudW1fc3RhZ2VzPW51bV9zdGFnZXMpOgogICAgICAgICAgICAgICAgVC5jb3B5KGlucHV0W2J4ICogYmxvY2tfdG9rZW4sIGsgKiBibG9ja19kaGlkZGVuXSwgaW5wdXRfc2hhcmVkKQogICAgICAgICAgICAgICAgIyBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX3Rva2VuLCBibG9ja19kaGlkZGVuKToKICAgICAgICAgICAgICAgICMgICAgIGlucHV0X3NoYXJlZFtpLCBqXSA9IGlucHV0W2J4ICogYmxvY2tfdG9rZW4gKyBpLCBrICogYmxvY2tfZGhpZGRlbiArIGpdCiAgICAgICAgICAgICAgICBULmNvcHkoc2hhcmVkX1dfZ2F0ZVtrICogYmxvY2tfZGhpZGRlbiwgYnkgKiBibG9ja19kZXhwZXJ0XSwgV19nYXRlX3NoYXJlZCkKICAgICAgICAgICAgICAgIFQuY29weShzaGFyZWRfV191cFtrICogYmxvY2tfZGhpZGRlbiwgYnkgKiBibG9ja19kZXhwZXJ0XSwgV191cF9zaGFyZWQpCiAgICAgICAgICAgICAgICAjIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfZGhpZGRlbiwgYmxvY2tfZGV4cGVydCk6CiAgICAgICAgICAgICAgICAjICAgICBXX2dhdGVfc2hhcmVkW2ksIGpdID0gc2hhcmVkc19XX2dhdGVbYnosIGsgKiBibG9ja19kaW0gKyBpLCBieSAqIGJsb2NrX2RleHBlcnQgKyBqXQogICAgICAgICAgICAgICAgIyAgICAgV191cF9zaGFyZWRbaSwgal0gPSBzaGFyZWRzX1dfdXBbYnosIGsgKiBibG9ja19kaW0gKyBpLCBieSAqIGJsb2NrX2RleHBlcnQgKyBqXQogICAgICAgICAgICAgICAgVC5nZW1tKGlucHV0X3NoYXJlZCwgV19nYXRlX3NoYXJlZCwgZ2F0ZV9sb2dpdHNfbG9jYWwpCiAgICAgICAgICAgICAgICBULmdlbW0oaW5wdXRfc2hhcmVkLCBXX3VwX3NoYXJlZCwgdXBfbG9naXRzX2xvY2FsKQoKICAgICAgICAgICAgIyBGdXNlIHdpdGggU2lMVSBhbmQgZWxlbWVudC13aXNlIHByb2R1Y3QKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja190b2tlbiwgYmxvY2tfZGV4cGVydCk6CiAgICAgICAgICAgICAgICBnYXRlX2xvZ2l0c19sb2NhbFtpLCBqXSA9IGdhdGVfbG9naXRzX2xvY2FsW2ksIGpdICogKDEuMCAvICgxLjAgKyBULmV4cDIoLWdhdGVfbG9naXRzX2xvY2FsW2ksIGpdICogc2NhbGUpKSkKICAgICAgICAgICAgICAgIHVwX2xvZ2l0c19sb2NhbFtpLCBqXSA9IHVwX2xvZ2l0c19sb2NhbFtpLCBqXSAqIGdhdGVfbG9naXRzX2xvY2FsW2ksIGpdCgogICAgICAgICAgICBULmNvcHkodXBfbG9naXRzX2xvY2FsLCB1cF9sb2dpdHNbYnggKiBibG9ja190b2tlbiwgYnkgKiBibG9ja19kZXhwZXJ0XSkKICAgICAgICAKICAgICAgICAjIFN0ZXAgMjogQ29tcHV0ZSBkb3duIGxvZ2l0cwogICAgICAgIHdpdGggVC5LZXJuZWwoVC5jZWlsZGl2KG51bV90b2tlbnMsIGJsb2NrX3Rva2VuKSwgVC5jZWlsZGl2KGRoaWRkZW4sIGJsb2NrX2RoaWRkZW4pLCB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnkpOgogICAgICAgICAgICB1cF9sb2dpdHNfc2hhcmVkID0gVC5hbGxvY19mcmFnbWVudCgoYmxvY2tfdG9rZW4sIGJsb2NrX2RleHBlcnQpLCBkdHlwZT1kdHlwZSkKICAgICAgICAgICAgV19kb3duX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKChibG9ja19kZXhwZXJ0LCBibG9ja19kaGlkZGVuKSwgZHR5cGU9ZHR5cGUpCiAgICAgICAgICAgIG91dHB1dF9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoKGJsb2NrX3Rva2VuLCBibG9ja19kaGlkZGVuKSwgZHR5cGU9YWNjdW1fdHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTApCiAgICAgICAgICAgIFQuY2xlYXIob3V0cHV0X2xvY2FsKQoKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQoVC5jZWlsZGl2KGRleHBlcnQsIGJsb2NrX2RleHBlcnQpLCBudW1fc3RhZ2VzPW51bV9zdGFnZXMpOgogICAgICAgICAgICAgICAgVC5jb3B5KHVwX2xvZ2l0c1tieCAqIGJsb2NrX3Rva2VuLCBrICogYmxvY2tfZGV4cGVydF0sIHVwX2xvZ2l0c19zaGFyZWQpCiAgICAgICAgICAgICAgICBULmNvcHkoc2hhcmVkX1dfZG93bltrICogYmxvY2tfZGV4cGVydCwgYnkgKiBibG9ja19kaGlkZGVuXSwgV19kb3duX3NoYXJlZCkKICAgICAgICAgICAgICAgIFQuZ2VtbSh1cF9sb2dpdHNfc2hhcmVkLCBXX2Rvd25fc2hhcmVkLCBvdXRwdXRfbG9jYWwpCgogICAgICAgICAgICBULmNvcHkob3V0cHV0X2xvY2FsLCBvdXRwdXRbYnggKiBibG9ja190b2tlbiwgYnkgKiBibG9ja19kaGlkZGVuXSkKICAgIAogICAgcmV0dXJuIGtlcm5lbF9zaGFyZWQKCgpkZWYgbW9lX2ZvcndhcmRfdG9yY2hfcm91dGVkKGNvbmZpZzogRGljdCwgZHR5cGUsIGdyb3VwX3NpemVzX2xpc3QsIGJsb2NrX3Rva2VuPTEyOCwgYmxvY2tfZGhpZGRlbj0xMjgsIGJsb2NrX2RleHBlcnQ9MTI4LCB0aHJlYWRzPTI1NiwgbnVtX3N0YWdlcz0xKToKICAgIAogICAgc2NhbGUgPSAxLjQ0MjY5NTA0ICAjIGxvZzIoZSkKCiAgICAjIFBhcmFtZXRlcnMKICAgIGJzID0gY29uZmlnWyJiYXRjaF9zaXplIl0KICAgIHNlcV9sZW4gPSBjb25maWdbInNlcV9sZW4iXQogICAgZGhpZGRlbiA9IGNvbmZpZ1siZF9oaWRkZW4iXQogICAgZGV4cGVydCA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KCiAgICAjIEdyb3VwIGluZm8KICAgIGdyb3VwX3N1bSA9IHN1bShncm91cF9zaXplc19saXN0KQogICAgZ3JvdXBfY291bnQgPSBsZW4oZ3JvdXBfc2l6ZXNfbGlzdCkKICAgICMgTSA9IHN1bShbKGdyb3VwX3NpemUgKyBibG9ja190b2tlbiAtIDEpIC8vIGJsb2NrX3Rva2VuIGZvciBncm91cF9zaXplIGluIGdyb3VwX3NpemVzX2xpc3RdKQogICAgTSA9IG1hdGguY2VpbChncm91cF9zdW0gLyBibG9ja190b2tlbikgKyBncm91cF9jb3VudAoKICAgICMgVGVuc29yczogTm90ZSB0aGF0IGlucHV0IHNoYXBlIGlzIHJlc2hhcGUgdG8gKGJzICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRoaWRkZW4pIGZvciBncm91cGVkIGdlbW0KICAgIGlucHV0X3NoYXBlID0gKGdyb3VwX3N1bSwgZGhpZGRlbikKICAgIGludGVybWVkaWF0ZV9zaGFwZSA9IChncm91cF9zdW0sIGRleHBlcnQpCiAgICByb3V0ZWRfZXhwZXJ0X2dhdGVfc2hhcGUgPSAobl9yb3V0ZWRfZXhwZXJ0cywgZGhpZGRlbiwgZGV4cGVydCkKICAgIHJvdXRlZF9leHBlcnRfdXBfc2hhcGUgPSAobl9yb3V0ZWRfZXhwZXJ0cywgZGhpZGRlbiwgZGV4cGVydCkKICAgIHJvdXRlZF9leHBlcnRfZG93bl9zaGFwZSA9IChuX3JvdXRlZF9leHBlcnRzLCBkZXhwZXJ0LCBkaGlkZGVuKQogICAgZ3JvdXBfc2l6ZXNfc2hhcGUgPSAobl9yb3V0ZWRfZXhwZXJ0cykKCiAgICBkZWYga2VybmVsX3JvdXRlZCgKICAgICAgICBpbnB1dDogdG9yY2guVGVuc29yKGlucHV0X3NoYXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICByb3V0ZWRfZXhwZXJ0X2dhdGU6IHRvcmNoLlRlbnNvcihyb3V0ZWRfZXhwZXJ0X2dhdGVfc2hhcGUpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIHJvdXRlZF9leHBlcnRfdXA6IHRvcmNoLlRlbnNvcihyb3V0ZWRfZXhwZXJ0X3VwX3NoYXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICByb3V0ZWRfZXhwZXJ0X2Rvd246IHRvcmNoLlRlbnNvcihyb3V0ZWRfZXhwZXJ0X2Rvd25fc2hhcGUpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIGdyb3VwX3NpemVzOiB0b3JjaC5UZW5zb3IoZ3JvdXBfc2l6ZXNfc2hhcGUpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIGdyb3VwX29mZnNldHM6IHRvcmNoLlRlbnNvcihncm91cF9zaXplc19zaGFwZSksICMgdHlwZTogaWdub3JlCiAgICAgICAgZ3JvdXBfcGFkZGVkX29mZnNldHM6IHRvcmNoLlRlbnNvcihncm91cF9zaXplc19zaGFwZSksICMgdHlwZTogaWdub3JlCiAgICAgICAgdXBfbG9naXRzOiB0b3JjaC5UZW5zb3IoaW50ZXJtZWRpYXRlX3NoYXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICAjIG91dHB1dDogVC5UZW5zb3IoaW5wdXRfc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICk6CiAgICAgICAgIyBTdGVwIDE6IENvbXB1dGUgZ2F0ZSBhbmQgdXAgbG9naXRzCiAgICAgICAgZm9yIGJ4IGluIHJhbmdlKE0pOgogICAgICAgICAgICBmb3IgYnkgaW4gcmFuZ2UobWF0aC5jZWlsKGRleHBlcnQgLyBibG9ja19kZXhwZXJ0KSk6CiAgICAgICAgICAgICAgICBpbnB1dF9zaGFyZWQgPSB0b3JjaC56ZXJvcygoYmxvY2tfdG9rZW4sIGJsb2NrX2RoaWRkZW4pLCBkdHlwZT10b3JjaC5mbG9hdDE2KQogICAgICAgICAgICAgICAgcm91dGVkX2V4cGVydF91cF9zaGFyZWQgPSB0b3JjaC56ZXJvcygoYmxvY2tfZGhpZGRlbiwgYmxvY2tfZGV4cGVydCksIGR0eXBlPXRvcmNoLmZsb2F0MTYpCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdXBfbG9naXRzX2xvY2FsID0gdG9yY2guemVyb3MoKGJsb2NrX3Rva2VuLCBibG9ja19kZXhwZXJ0KSwgZHR5cGU9dG9yY2guZmxvYXQzMikKCiAgICAgICAgICAgICAgICBjdXJfZ3JvdXBfaWR4ID0gMAogICAgICAgICAgICAgICAgY3VyX2dyb3VwX3NpemUgPSBncm91cF9zaXplc1swXQoKICAgICAgICAgICAgICAgIG1fc3RhcnRfcGFkZGVkID0gYnggKiBibG9ja190b2tlbgoKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX2NvdW50KToKICAgICAgICAgICAgICAgICAgICBpbl9jdXJfZ3JvdXBfaWR4ID0gKG1fc3RhcnRfcGFkZGVkID49IGdyb3VwX3BhZGRlZF9vZmZzZXRzW2ldKQogICAgICAgICAgICAgICAgICAgIGlmIGluX2N1cl9ncm91cF9pZHg6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9ncm91cF9pZHggPSBpCgogICAgICAgICAgICAgICAgY3VyX2dyb3VwX3NpemUgPSBncm91cF9zaXplc1tjdXJfZ3JvdXBfaWR4XQogICAgICAgICAgICAgICAgbV9zdGFydCA9IG1fc3RhcnRfcGFkZGVkIC0gZ3JvdXBfcGFkZGVkX29mZnNldHNbY3VyX2dyb3VwX2lkeF0gKyBncm91cF9vZmZzZXRzW2N1cl9ncm91cF9pZHhdCiAgICAgICAgICAgICAgICBhY3R1YWxfcm93cyA9IG1heCgwLCBtaW4oYmxvY2tfdG9rZW4sIGN1cl9ncm91cF9zaXplIC0gKG1fc3RhcnRfcGFkZGVkIC0gZ3JvdXBfcGFkZGVkX29mZnNldHNbY3VyX2dyb3VwX2lkeF0pKSkKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgayBpbiByYW5nZShtYXRoLmNlaWwoZGhpZGRlbiAvIGJsb2NrX2RoaWRkZW4pKToKICAgICAgICAgICAgICAgICAgICBpbnB1dF9zaGFyZWRbMDphY3R1YWxfcm93cywgMDpibG9ja19kaGlkZGVuXSA9IGlucHV0W21fc3RhcnQ6bV9zdGFydCArIGFjdHVhbF9yb3dzLCBrICogYmxvY2tfZGhpZGRlbjooayArIDEpICogYmxvY2tfZGhpZGRlbl0KICAgICAgICAgICAgICAgICAgICByb3V0ZWRfZXhwZXJ0X3VwX3NoYXJlZFswOmJsb2NrX2RoaWRkZW4sIDA6YmxvY2tfZGV4cGVydF0gPSByb3V0ZWRfZXhwZXJ0X3VwW2N1cl9ncm91cF9pZHgsIGsgKiBibG9ja19kaGlkZGVuOihrICsgMSkgKiBibG9ja19kaGlkZGVuLCBieSAqIGJsb2NrX2RleHBlcnQ6KGJ5ICsgMSkgKiBibG9ja19kZXhwZXJ0XQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHVwX2xvZ2l0c19sb2NhbFswOmFjdHVhbF9yb3dzLCAwOmJsb2NrX2RleHBlcnRdICs9IHRvcmNoLm1tKGlucHV0X3NoYXJlZFswOmFjdHVhbF9yb3dzLCAwOmJsb2NrX2RoaWRkZW5dLCByb3V0ZWRfZXhwZXJ0X3VwX3NoYXJlZFswOmJsb2NrX2RoaWRkZW4sIDA6YmxvY2tfZGV4cGVydF0pCgogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYmxvY2tfdG9rZW4pOgogICAgICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGJsb2NrX2RleHBlcnQpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBpIDwgYWN0dWFsX3Jvd3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF9sb2dpdHNbbV9zdGFydCArIGksIGJ5ICogYmxvY2tfZGV4cGVydCArIGpdICs9IHVwX2xvZ2l0c19sb2NhbFtpLCBqXQoKICAgICAgICByZXR1cm4gdXBfbG9naXRzCgogICAgcmV0dXJuIGtlcm5lbF9yb3V0ZWQKCgpAdGlsZWxhbmcuaml0CmRlZiBtb2VfZm9yd2FyZF90aWxlbGFuZ19yb3V0ZWQoZF9oaWRkZW4sIGRfZXhwZXJ0LCBuX3JvdXRlZF9leHBlcnRzLCBkdHlwZSwgZ3JvdXBfc3VtLCBncm91cF9jb3VudCwgYmxvY2tfdG9rZW49MTI4LCBibG9ja19kaGlkZGVuPTEyOCwgYmxvY2tfZGV4cGVydD0xMjgsIHRocmVhZHM9MjU2LCBudW1fc3RhZ2VzPTEsIGtfcGFjaz0xLCBjb2FsZXNjZWRfd2lkdGg9Tm9uZSk6CiAgICAKICAgIHNjYWxlID0gMS40NDI2OTUwNCAgIyBsb2cyKGUpCgogICAgIyBQYXJhbWV0ZXJzCiAgICBkaGlkZGVuID0gZF9oaWRkZW4KICAgIGRleHBlcnQgPSBkX2V4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5fcm91dGVkX2V4cGVydHMKCiAgICAjIEdyb3VwIGluZm8KICAgICMgZ3JvdXBfc3VtID0gc3VtKGdyb3VwX3NpemVzX2xpc3QpCiAgICAjIGdyb3VwX2NvdW50ID0gbGVuKGdyb3VwX3NpemVzX2xpc3QpCiAgICAjIE0gPSBzdW0oWyhncm91cF9zaXplICsgYmxvY2tfdG9rZW4gLSAxKSAvLyBibG9ja190b2tlbiBmb3IgZ3JvdXBfc2l6ZSBpbiBncm91cF9zaXplc19saXN0XSkKICAgIE0gPSBtYXRoLmNlaWwoZ3JvdXBfc3VtIC8gYmxvY2tfdG9rZW4pICsgZ3JvdXBfY291bnQKICAgIGFjY3VtX2R0eXBlID0gImZsb2F0MzIiCgogICAgIyBUZW5zb3JzOiBOb3RlIHRoYXQgaW5wdXQgc2hhcGUgaXMgcmVzaGFwZSB0byAoYnMgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZGhpZGRlbikgZm9yIGdyb3VwZWQgZ2VtbQogICAgaW5wdXRfc2hhcGUgPSAoZ3JvdXBfc3VtLCBkaGlkZGVuKQogICAgaW50ZXJtZWRpYXRlX3NoYXBlID0gKGdyb3VwX3N1bSwgZGV4cGVydCkKICAgIHJvdXRlZF9leHBlcnRfZ2F0ZV9zaGFwZSA9IChuX3JvdXRlZF9leHBlcnRzLCBkaGlkZGVuLCBkZXhwZXJ0KQogICAgcm91dGVkX2V4cGVydF91cF9zaGFwZSA9IChuX3JvdXRlZF9leHBlcnRzLCBkaGlkZGVuLCBkZXhwZXJ0KQogICAgcm91dGVkX2V4cGVydF9kb3duX3NoYXBlID0gKG5fcm91dGVkX2V4cGVydHMsIGRleHBlcnQsIGRoaWRkZW4pCiAgICByb3V0ZWRfZXhwZXJ0X3dlaWdodHNfc2hhcGUgPSAoZ3JvdXBfc3VtKQogICAgZ3JvdXBfc2l6ZXNfc2hhcGUgPSAobl9yb3V0ZWRfZXhwZXJ0cykKCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBrZXJuZWwoCiAgICAgICAgaW5wdXQ6IFQuVGVuc29yKGlucHV0X3NoYXBlLCBkdHlwZSksICMgdHlwZTogaWdub3JlCiAgICAgICAgcm91dGVkX2V4cGVydF9nYXRlOiBULlRlbnNvcihyb3V0ZWRfZXhwZXJ0X2dhdGVfc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICByb3V0ZWRfZXhwZXJ0X3VwOiBULlRlbnNvcihyb3V0ZWRfZXhwZXJ0X3VwX3NoYXBlLCBkdHlwZSksICMgdHlwZTogaWdub3JlCiAgICAgICAgcm91dGVkX2V4cGVydF9kb3duOiBULlRlbnNvcihyb3V0ZWRfZXhwZXJ0X2Rvd25fc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICByb3V0ZWRfZXhwZXJ0X3dlaWdodHM6IFQuVGVuc29yKHJvdXRlZF9leHBlcnRfd2VpZ2h0c19zaGFwZSwgZHR5cGUpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIGdyb3VwX3NpemVzOiBULlRlbnNvcihncm91cF9zaXplc19zaGFwZSwgImludDMyIiksICMgdHlwZTogaWdub3JlCiAgICAgICAgZ3JvdXBfb2Zmc2V0czogVC5UZW5zb3IoZ3JvdXBfc2l6ZXNfc2hhcGUsICJpbnQzMiIpLCAjIHR5cGU6IGlnbm9yZQogICAgICAgIGdyb3VwX3BhZGRlZF9vZmZzZXRzOiBULlRlbnNvcihncm91cF9zaXplc19zaGFwZSwgImludDMyIiksICMgdHlwZTogaWdub3JlCiAgICAgICAgdXBfbG9naXRzOiBULlRlbnNvcihpbnRlcm1lZGlhdGVfc2hhcGUsIGR0eXBlKSwgIyB0eXBlOiBpZ25vcmUKICAgICAgICBvdXRwdXQ6IFQuVGVuc29yKGlucHV0X3NoYXBlLCBkdHlwZSksICMgdHlwZTogaWdub3JlCiAgICApOgogICAgICAgICMgU3RlcCAxOiBDb21wdXRlIGdhdGUgYW5kIHVwIGxvZ2l0cwogICAgICAgIHdpdGggVC5LZXJuZWwoTSwgVC5jZWlsZGl2KGRleHBlcnQsIGJsb2NrX2RleHBlcnQpLCB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnkpOgogICAgICAgICAgICBpbnB1dF9zaGFyZWQgPSBULmFsbG9jX2ZyYWdtZW50KChibG9ja190b2tlbiwgYmxvY2tfZGhpZGRlbiksIGR0eXBlPWR0eXBlKQogICAgICAgICAgICByb3V0ZWRfZXhwZXJ0X2dhdGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoKGJsb2NrX2RoaWRkZW4sIGJsb2NrX2RleHBlcnQpLCBkdHlwZT1kdHlwZSkKICAgICAgICAgICAgcm91dGVkX2V4cGVydF91cF9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZCgoYmxvY2tfZGhpZGRlbiwgYmxvY2tfZGV4cGVydCksIGR0eXBlPWR0eXBlKQogICAgICAgICAgICAKICAgICAgICAgICAgZ2F0ZV9sb2dpdHNfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KChibG9ja190b2tlbiwgYmxvY2tfZGV4cGVydCksIGR0eXBlPWFjY3VtX2R0eXBlKQogICAgICAgICAgICB1cF9sb2dpdHNfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KChibG9ja190b2tlbiwgYmxvY2tfZGV4cGVydCksIGR0eXBlPWFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgY3VyX2dyb3VwX2lkeCA9IFQuYWxsb2NfbG9jYWwoWzFdLCAiaW50MzIiKQogICAgICAgICAgICBjdXJfZ3JvdXBfc2l6ZSA9IFQuYWxsb2NfbG9jYWwoWzFdLCAiaW50MzIiKQoKICAgICAgICAgICAgVC51c2Vfc3dpenpsZSgxMCwgZW5hYmxlPVRydWUpCgogICAgICAgICAgICBtX3N0YXJ0X3BhZGRlZCA9IGJ4ICogYmxvY2tfdG9rZW4KCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX2NvdW50KToKICAgICAgICAgICAgICAgIGluX2N1cl9ncm91cF9pZHggPSAobV9zdGFydF9wYWRkZWQgPj0gZ3JvdXBfcGFkZGVkX29mZnNldHNbaV0pCiAgICAgICAgICAgICAgICBjdXJfZ3JvdXBfaWR4WzBdID0gVC5pZl90aGVuX2Vsc2UoaW5fY3VyX2dyb3VwX2lkeCwgaSwgY3VyX2dyb3VwX2lkeFswXSkKCiAgICAgICAgICAgIGN1cl9ncm91cF9zaXplWzBdID0gZ3JvdXBfc2l6ZXNbY3VyX2dyb3VwX2lkeFswXV0KICAgICAgICAgICAgbV9zdGFydCA9IG1fc3RhcnRfcGFkZGVkIC0gZ3JvdXBfcGFkZGVkX29mZnNldHNbY3VyX2dyb3VwX2lkeFswXV0gKyBncm91cF9vZmZzZXRzW2N1cl9ncm91cF9pZHhbMF1dCiAgICAgICAgICAgIGFjdHVhbF9yb3dzID0gVC5tYXgoMCwgVC5taW4oYmxvY2tfdG9rZW4sIGN1cl9ncm91cF9zaXplWzBdIC0gKG1fc3RhcnRfcGFkZGVkIC0gZ3JvdXBfcGFkZGVkX29mZnNldHNbY3VyX2dyb3VwX2lkeFswXV0pKSkKICAgICAgICAgICAgCiAgICAgICAgICAgIFQuY2xlYXIoZ2F0ZV9sb2dpdHNfbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIodXBfbG9naXRzX2xvY2FsKQoKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQoVC5jZWlsZGl2KGRoaWRkZW4sIGJsb2NrX2RoaWRkZW4pLCBudW1fc3RhZ2VzPW51bV9zdGFnZXMpOgogICAgICAgICAgICAgICAgVC5jb3B5KGlucHV0W21fc3RhcnQ6bV9zdGFydCArIGJsb2NrX3Rva2VuLCBrICogYmxvY2tfZGhpZGRlbjooayArIDEpICogYmxvY2tfZGhpZGRlbl0sIGlucHV0X3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPWNvYWxlc2NlZF93aWR0aCkKICAgICAgICAgICAgICAgIFQuY29weShyb3V0ZWRfZXhwZXJ0X2dhdGVbY3VyX2dyb3VwX2lkeFswXSwgayAqIGJsb2NrX2RoaWRkZW46KGsgKyAxKSAqIGJsb2NrX2RoaWRkZW4sIGJ5ICogYmxvY2tfZGV4cGVydDooYnkgKyAxKSAqIGJsb2NrX2RleHBlcnRdLCByb3V0ZWRfZXhwZXJ0X2dhdGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9Y29hbGVzY2VkX3dpZHRoKQogICAgICAgICAgICAgICAgVC5nZW1tKGlucHV0X3NoYXJlZCwgcm91dGVkX2V4cGVydF9nYXRlX3NoYXJlZCwgZ2F0ZV9sb2dpdHNfbG9jYWwsIGtfcGFjaz1rX3BhY2spCiAgICAgICAgICAgICAgICBULmNvcHkocm91dGVkX2V4cGVydF91cFtjdXJfZ3JvdXBfaWR4WzBdLCBrICogYmxvY2tfZGhpZGRlbjooayArIDEpICogYmxvY2tfZGhpZGRlbiwgYnkgKiBibG9ja19kZXhwZXJ0OihieSArIDEpICogYmxvY2tfZGV4cGVydF0sIHJvdXRlZF9leHBlcnRfdXBfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9Y29hbGVzY2VkX3dpZHRoKQogICAgICAgICAgICAgICAgVC5nZW1tKGlucHV0X3NoYXJlZCwgcm91dGVkX2V4cGVydF91cF9zaGFyZWQsIHVwX2xvZ2l0c19sb2NhbCwga19wYWNrPWtfcGFjaykKCiAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfdG9rZW4sIGJsb2NrX2RleHBlcnQpOgogICAgICAgICAgICAgICAgZ2F0ZV9sb2dpdHNfbG9jYWxbaSwgal0gPSBnYXRlX2xvZ2l0c19sb2NhbFtpLCBqXSAqICgxLjAgLyAoMS4wICsgVC5leHAyKC1nYXRlX2xvZ2l0c19sb2NhbFtpLCBqXSAqIHNjYWxlKSkpCiAgICAgICAgICAgICAgICB1cF9sb2dpdHNfbG9jYWxbaSwgal0gPSB1cF9sb2dpdHNfbG9jYWxbaSwgal0gKiBnYXRlX2xvZ2l0c19sb2NhbFtpLCBqXQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfdG9rZW4sIGJsb2NrX2RleHBlcnQpOgogICAgICAgICAgICAgICAgd2l0aCBULklmKGkgPCBhY3R1YWxfcm93cyksIFQuVGhlbigpOgogICAgICAgICAgICAgICAgICAgIHVwX2xvZ2l0c1ttX3N0YXJ0ICsgaSwgYnkgKiBibG9ja19kZXhwZXJ0ICsgal0gPSB1cF9sb2dpdHNfbG9jYWxbaSwgal0KICAgICAgICAKICAgICAgICAjIFN0ZXAgMjogQ29tcHV0ZSBkb3duIGxvZ2l0cwogICAgICAgIHdpdGggVC5LZXJuZWwoTSwgVC5jZWlsZGl2KGRoaWRkZW4sIGJsb2NrX2RoaWRkZW4pLCB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnkpOgogICAgICAgICAgICB1cF9sb2dpdHNfc2hhcmVkID0gVC5hbGxvY19mcmFnbWVudCgoYmxvY2tfdG9rZW4sIGJsb2NrX2RleHBlcnQpLCBkdHlwZT1kdHlwZSkKICAgICAgICAgICAgcm91dGVkX2V4cGVydF9kb3duX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKChibG9ja19kZXhwZXJ0LCBibG9ja19kaGlkZGVuKSwgZHR5cGU9ZHR5cGUpCiAgICAgICAgICAgIG91dHB1dF9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoKGJsb2NrX3Rva2VuLCBibG9ja19kaGlkZGVuKSwgZHR5cGU9YWNjdW1fZHR5cGUpCgogICAgICAgICAgICBjdXJfZ3JvdXBfaWR4ID0gVC5hbGxvY19sb2NhbChbMV0sICJpbnQzMiIpCiAgICAgICAgICAgIGN1cl9ncm91cF9zaXplID0gVC5hbGxvY19sb2NhbChbMV0sICJpbnQzMiIpCgogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9VHJ1ZSkKCiAgICAgICAgICAgIG1fc3RhcnRfcGFkZGVkID0gYnggKiBibG9ja190b2tlbgoKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZ3JvdXBfY291bnQpOgogICAgICAgICAgICAgICAgaW5fY3VyX2dyb3VwX2lkeCA9IChtX3N0YXJ0X3BhZGRlZCA+PSBncm91cF9wYWRkZWRfb2Zmc2V0c1tpXSkKICAgICAgICAgICAgICAgIGN1cl9ncm91cF9pZHhbMF0gPSBULmlmX3RoZW5fZWxzZShpbl9jdXJfZ3JvdXBfaWR4LCBpLCBjdXJfZ3JvdXBfaWR4WzBdKQoKICAgICAgICAgICAgY3VyX2dyb3VwX3NpemVbMF0gPSBncm91cF9zaXplc1tjdXJfZ3JvdXBfaWR4WzBdXQogICAgICAgICAgICBtX3N0YXJ0ID0gbV9zdGFydF9wYWRkZWQgLSBncm91cF9wYWRkZWRfb2Zmc2V0c1tjdXJfZ3JvdXBfaWR4WzBdXSArIGdyb3VwX29mZnNldHNbY3VyX2dyb3VwX2lkeFswXV0KICAgICAgICAgICAgYWN0dWFsX3Jvd3MgPSBULm1heCgwLCBULm1pbihibG9ja190b2tlbiwgY3VyX2dyb3VwX3NpemVbMF0gLSAobV9zdGFydF9wYWRkZWQgLSBncm91cF9wYWRkZWRfb2Zmc2V0c1tjdXJfZ3JvdXBfaWR4WzBdXSkpKQoKICAgICAgICAgICAgVC5jbGVhcihvdXRwdXRfbG9jYWwpCgogICAgICAgICAgICBmb3IgayBpbiBULlBpcGVsaW5lZChULmNlaWxkaXYoZGV4cGVydCwgYmxvY2tfZGV4cGVydCksIG51bV9zdGFnZXM9bnVtX3N0YWdlcyk6CiAgICAgICAgICAgICAgICBULmNvcHkodXBfbG9naXRzW21fc3RhcnQ6bV9zdGFydCArIGJsb2NrX3Rva2VuLCBrICogYmxvY2tfZGV4cGVydDooayArIDEpICogYmxvY2tfZGV4cGVydF0sIHVwX2xvZ2l0c19zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD1jb2FsZXNjZWRfd2lkdGgpCiAgICAgICAgICAgICAgICBULmNvcHkocm91dGVkX2V4cGVydF9kb3duW2N1cl9ncm91cF9pZHhbMF0sIGsgKiBibG9ja19kZXhwZXJ0OihrICsgMSkgKiBibG9ja19kZXhwZXJ0LCBieSAqIGJsb2NrX2RoaWRkZW46KGJ5ICsgMSkgKiBibG9ja19kaGlkZGVuXSwgcm91dGVkX2V4cGVydF9kb3duX3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPWNvYWxlc2NlZF93aWR0aCkgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBULmdlbW0odXBfbG9naXRzX3NoYXJlZCwgcm91dGVkX2V4cGVydF9kb3duX3NoYXJlZCwgb3V0cHV0X2xvY2FsLCBrX3BhY2s9a19wYWNrKQoKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja190b2tlbiwgYmxvY2tfZGhpZGRlbik6CiAgICAgICAgICAgICAgICB3aXRoIFQuSWYoaSA8IGFjdHVhbF9yb3dzKSwgVC5UaGVuKCk6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W21fc3RhcnQgKyBpLCBieSAqIGJsb2NrX2RoaWRkZW4gKyBqXSA9IG91dHB1dF9sb2NhbFtpLCBqXSAqIHJvdXRlZF9leHBlcnRfd2VpZ2h0c1ttX3N0YXJ0ICsgaV0KCiAgICByZXR1cm4ga2VybmVsCgoKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBnYXRlOiB0b3JjaC5UZW5zb3IsIHVwOiB0b3JjaC5UZW5zb3IsIGRvd246IHRvcmNoLlRlbnNvciwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAogICAgICAgIHNlbGYuZGV2aWNlID0gdG9yY2guZGV2aWNlKCJjdWRhIikKCiAgICAgICAgIyBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19nYXRlX3dlaWdodCA9IGdhdGUudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgIyBzZWxmLldfdXAgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5kX2V4cGVydCwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLldfdXBfd2VpZ2h0ID0gdXAudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgIyBzZWxmLldfZG93biA9IG5uLkxpbmVhcihzZWxmLmRfZXhwZXJ0LCBzZWxmLmRfaGlkZGVuLCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duX3dlaWdodCA9IGRvd24udG8oc2VsZi5kZXZpY2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHggQCBzZWxmLldfZ2F0ZV93ZWlnaHQpCiAgICAgICAgb3V0ID0gKGdhdGUgKiAoeCBAIHNlbGYuV191cF93ZWlnaHQpKSBAIHNlbGYuV19kb3duX3dlaWdodAogICAgICAgIHJldHVybiBvdXQKCgpjbGFzcyBNb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXS50KCkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSB4IEAgc2VsZi5XX2dfd2VpZ2h0CiAgICAgICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz1zZWxmLnRvcF9rLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKCiAgICAgICAgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMKCgpjbGFzcyBNb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHNoYXJlZF9rZXJuZWw6IHRpbGVsYW5nLkpJVEtlcm5lbCwgcm91dGVkX2tlcm5lbDogdGlsZWxhbmcuSklUS2VybmVsLCB3ZWlnaHRzOiBEaWN0LCBwYWRkaW5nX006IGludCA9IDEyOCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLnNoYXJlZF9rZXJuZWwgPSBzaGFyZWRfa2VybmVsCiAgICAgICAgc2VsZi5yb3V0ZWRfa2VybmVsID0gcm91dGVkX2tlcm5lbAogICAgICAgIHNlbGYucGFkZGluZ19NID0gcGFkZGluZ19NCiAgICAgICAgc2VsZi5leHBlcnRzID0gbm4uTW9kdWxlTGlzdChbCiAgICAgICAgICAgIEV4cGVydChjb25maWcsIGdhdGU9d2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10sIHVwPXdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLCBkb3duPXdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0KGNvbmZpZz1jb25maWcsIGdhdGU9d2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwgdXA9d2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSwgZG93bj13ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKICAgICAgICBzZWxmLmRldmljZSA9IHRvcmNoLmRldmljZSgiY3VkYSIpCiAgICAgICAgc2VsZi5leHBlcnRfY2FjaGUgPSB0b3JjaC56ZXJvcygoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSwgY29uZmlnWyJkX2hpZGRlbiJdKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIHNlbGYuc3RhY2tlZF9leHBlcnRfd19nYXRlID0gdG9yY2guc3RhY2soW2V4cGVydC5XX2dhdGVfd2VpZ2h0IGZvciBleHBlcnQgaW4gc2VsZi5leHBlcnRzXSwgZGltPTApCiAgICAgICAgc2VsZi5zdGFja2VkX2V4cGVydF93X3VwID0gdG9yY2guc3RhY2soW2V4cGVydC5XX3VwX3dlaWdodCBmb3IgZXhwZXJ0IGluIHNlbGYuZXhwZXJ0c10sIGRpbT0wKQogICAgICAgICMgc2VsZi5zdGFja2VkX2V4cGVydF93X2dhdGVfdXBfY2F0ID0gdG9yY2guY2F0KFtzZWxmLnN0YWNrZWRfZXhwZXJ0X3dfZ2F0ZSwgc2VsZi5zdGFja2VkX2V4cGVydF93X3VwXSwgZGltPS0xKQogICAgICAgIHNlbGYuc3RhY2tlZF9leHBlcnRfd19kb3duID0gdG9yY2guc3RhY2soW2V4cGVydC5XX2Rvd25fd2VpZ2h0IGZvciBleHBlcnQgaW4gc2VsZi5leHBlcnRzXSwgZGltPTApCiAgICAgICAgc2VsZi5zdGFja2VkX2V4cGVydF90b2tlbnMgPSB0b3JjaC5lbXB0eSgoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSAqIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBzZWxmLmNvbmZpZ1siZF9oaWRkZW4iXSksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT1zZWxmLmRldmljZSkKICAgICAgICBzZWxmLnN0YWNrZWRfZXhwZXJ0X3dlaWdodHMgPSB0b3JjaC5lbXB0eSgoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSAqIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCAxKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIHNlbGYuc3RhY2tlZF9leHBlcnRfdG9rZW5zX2lkeHMgPSB0b3JjaC5lbXB0eSgoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSAqIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCAxKSwgZHR5cGU9dG9yY2guaW50NjQsIGRldmljZT1zZWxmLmRldmljZSkKCiAgICAgICAgc2VsZi51cF9sb2dpdHNfc2hhcmVkID0gdG9yY2guZW1wdHkoKGNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0sIHNlbGYuY29uZmlnWyJkX2V4cGVydCJdKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIHNlbGYuZXhwZXJ0X291dHB1dF9zaGFyZWQgPSB0b3JjaC5lbXB0eSgoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSwgc2VsZi5jb25maWdbImRfaGlkZGVuIl0pLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9c2VsZi5kZXZpY2UpCgogICAgICAgICMgc2VsZi5nYXRlX3VwX2NhdF9sb2dpdHNfcm91dGVkID0gdG9yY2guZW1wdHkoKGNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgc2VsZi5jb25maWdbImRfZXhwZXJ0Il0gKiAyKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIHNlbGYudXBfbG9naXRzX3JvdXRlZCA9IHRvcmNoLmVtcHR5KChjb25maWdbImJhdGNoX3NpemUiXSAqIGNvbmZpZ1sic2VxX2xlbiJdICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIHNlbGYuY29uZmlnWyJkX2V4cGVydCJdKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIHNlbGYuZXhwZXJ0X291dHB1dF9yb3V0ZWQgPSB0b3JjaC5lbXB0eSgoY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXSAqIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBzZWxmLmNvbmZpZ1siZF9oaWRkZW4iXSksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT1zZWxmLmRldmljZSkKCiAgICBAdG9yY2gubm9fZ3JhZCgpCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBvcmlnX3NoYXBlID0geC5zaGFwZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW0gPSB4LnNoYXBlCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGV4cGVydF9zY29yZXMgPSBzZWxmLmdhdGluZ19uZXR3b3JrKHgpCiAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF9zY29yZXMudmlldygtMSwgMSkKICAgICAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCgogICAgICAgICMgc2hhcmVkX291dHB1dCA9IHRvcmNoLmVtcHR5X2xpa2UoeF9mbGF0LCBkZXZpY2U9c2VsZi5kZXZpY2UpCiAgICAgICAgIyB1cF9sb2dpdHNfc2hhcmVkID0gdG9yY2guZW1wdHkoKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBzZWxmLmNvbmZpZ1siZF9leHBlcnQiXSksIGR0eXBlPXguZHR5cGUsIGRldmljZT1zZWxmLmRldmljZSkKCiAgICAgICAgIyBQcmVwYXJlIGZvciBncm91cGVkIEdFTU0KICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgICMgY291bnRzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5iaW5jb3VudCgpCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnQgPSBjb3VudHMuY3Vtc3VtKCkKICAgICAgICAjIHRva2Vuc19wZXJfZXhwZXJ0ID0gdG9yY2guY3Vtc3VtKGNvdW50cywgZGltPTApCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKCiAgICAgICAgIyBHZXQgc3RhY2tlZCBleHBlcnQgdG9rZW5zIGFuZCBleHBlcnQgd2VpZ2h0cwogICAgICAgICMgc3RhY2tlZF9leHBlcnRfdG9rZW5zID0gW10KICAgICAgICAjIHN0YWNrZWRfZXhwZXJ0X3Rva2Vuc19pZHhzID0gW10KICAgICAgICAjIHN0YWNrZWRfZXhwZXJ0X3dlaWdodHMgPSBbXQoKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4X2ZsYXRbZXhwX3Rva2VuX2lkeHNdCgogICAgICAgICAgICBzZWxmLnN0YWNrZWRfZXhwZXJ0X3Rva2Vuc1tzdGFydF9pZHg6ZW5kX2lkeF0gPSBleHBlcnRfdG9rZW5zCiAgICAgICAgICAgIHNlbGYuc3RhY2tlZF9leHBlcnRfdG9rZW5zX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHgsIDBdID0gZXhwX3Rva2VuX2lkeHMKICAgICAgICAgICAgc2VsZi5zdGFja2VkX2V4cGVydF93ZWlnaHRzW3N0YXJ0X2lkeDplbmRfaWR4XSA9IGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dCiAgICAgICAgICAgICMgc3RhY2tlZF9leHBlcnRfdG9rZW5zX2lkeHMuYXBwZW5kKGV4cF90b2tlbl9pZHhzKSAjIFticyAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuXQogICAgICAgICAgICAjIHN0YWNrZWRfZXhwZXJ0X3Rva2Vucy5hcHBlbmQoZXhwZXJ0X3Rva2VucykKICAgICAgICAgICAgIyBzdGFja2VkX2V4cGVydF93ZWlnaHRzLmFwcGVuZChmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAKICAgICAgICAjIHN0YWNrZWRfZXhwZXJ0X3Rva2VucyA9IHRvcmNoLmNhdChzdGFja2VkX2V4cGVydF90b2tlbnMsIGRpbT0wKS50byhzZWxmLmRldmljZSkKICAgICAgICAjIHN0YWNrZWRfZXhwZXJ0X3Rva2Vuc19pZHhzID0gdG9yY2guY2F0KHN0YWNrZWRfZXhwZXJ0X3Rva2Vuc19pZHhzLCBkaW09MCkudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgIyBzdGFja2VkX2V4cGVydF93ZWlnaHRzID0gdG9yY2guY2F0KHN0YWNrZWRfZXhwZXJ0X3dlaWdodHMsIGRpbT0wKS50byhzZWxmLmRldmljZSkKCiAgICAgICAgZ3JvdXBfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoY291bnRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPXNlbGYuZGV2aWNlKQogICAgICAgIGdyb3VwX29mZnNldCA9IHRvcmNoLnRlbnNvcih0b2tlbnNfcGVyX2V4cGVydCAtIGNvdW50cywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1zZWxmLmRldmljZSkKCiAgICAgICAgIyBncm91cF9wYWRkZWRfb2Zmc2V0cyA9IHRvcmNoLmVtcHR5KGxlbihncm91cF9zaXplcyksIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9c2VsZi5kZXZpY2UpCiAgICAgICAgZ3JvdXBfcGFkZGVkX29mZnNldHMgPSBbMCBmb3IgXyBpbiByYW5nZShsZW4oZ3JvdXBfc2l6ZXMpKV0KICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oZ3JvdXBfc2l6ZXMpKToKICAgICAgICAgICAgZ3JvdXBfcGFkZGVkX29mZnNldHNbaV0gPSBncm91cF9wYWRkZWRfb2Zmc2V0c1tpIC0gMV0gKyBtYXRoLmNlaWwoKGNvdW50c1tpIC0gMV0gKyAxKSAvIHNlbGYucGFkZGluZ19NKSAqIHNlbGYucGFkZGluZ19NCiAgICAgICAgZ3JvdXBfcGFkZGVkX29mZnNldHMgPSB0b3JjaC50ZW5zb3IoZ3JvdXBfcGFkZGVkX29mZnNldHMsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9c2VsZi5kZXZpY2UpCgogICAgICAgICMgdXBfbG9naXRzX3JvdXRlZCA9IHRvcmNoLmVtcHR5KCh4X2ZsYXQuc2hhcGVbMF0gKiBudW1fcGVyX3Rvaywgc2VsZi5jb25maWdbImRfZXhwZXJ0Il0pLCBkdHlwZT14LmR0eXBlLCBkZXZpY2U9c2VsZi5kZXZpY2UpCiAgICAgICAgIyBleHBlcnRfb3V0cHV0X3JvdXRlZCA9IHRvcmNoLmVtcHR5KCh4X2ZsYXQuc2hhcGVbMF0gKiBudW1fcGVyX3Rvaywgc2VsZi5jb25maWdbImRfaGlkZGVuIl0pLCBkdHlwZT14LmR0eXBlLCBkZXZpY2U9c2VsZi5kZXZpY2UpCgogICAgICAgIHNoYXJlZF9zdHJlYW0gPSB0b3JjaC5jdWRhLlN0cmVhbSgpCiAgICAgICAgcm91dGVkX3N0cmVhbSA9IHRvcmNoLmN1ZGEuZGVmYXVsdF9zdHJlYW0oKQogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQoKICAgICAgICB3aXRoIHRvcmNoLmN1ZGEuc3RyZWFtKHJvdXRlZF9zdHJlYW0pOgogICAgICAgICAgICAjIFRpbGVsYW5nIHZlcnNpb246IEdyb3VwZWQgR0VNTQogICAgICAgICAgICBzZWxmLnJvdXRlZF9rZXJuZWwoc2VsZi5zdGFja2VkX2V4cGVydF90b2tlbnMsIHNlbGYuc3RhY2tlZF9leHBlcnRfd19nYXRlLCBzZWxmLnN0YWNrZWRfZXhwZXJ0X3dfdXAsIHNlbGYuc3RhY2tlZF9leHBlcnRfd19kb3duLCBzZWxmLnN0YWNrZWRfZXhwZXJ0X3dlaWdodHMsIGdyb3VwX3NpemVzLCBncm91cF9vZmZzZXQsIGdyb3VwX3BhZGRlZF9vZmZzZXRzLCBzZWxmLnVwX2xvZ2l0c19yb3V0ZWQsIHNlbGYuZXhwZXJ0X291dHB1dF9yb3V0ZWQpCiAgICAgICAgICAgICMgc2VsZi5yb3V0ZWRfa2VybmVsKHN0YWNrZWRfZXhwZXJ0X3Rva2Vucywgc2VsZi5zdGFja2VkX2V4cGVydF93X2dhdGVfdXBfY2F0LCBzZWxmLnN0YWNrZWRfZXhwZXJ0X3dfZG93biwgc3RhY2tlZF9leHBlcnRfd2VpZ2h0cywgZ3JvdXBfc2l6ZXMsIGdyb3VwX29mZnNldCwgZ3JvdXBfcGFkZGVkX29mZnNldHMsIHNlbGYuZ2F0ZV91cF9jYXRfbG9naXRzX3JvdXRlZCwgc2VsZi51cF9sb2dpdHNfcm91dGVkLCBzZWxmLmV4cGVydF9vdXRwdXRfcm91dGVkKQoKICAgICAgICAgICAgIyBTY2F0dGVyIHJlZHVjZQogICAgICAgICAgICBzZWxmLmV4cGVydF9jYWNoZSA9IHRvcmNoLnNjYXR0ZXJfcmVkdWNlKAogICAgICAgICAgICAgICAgc2VsZi5leHBlcnRfY2FjaGUsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgc2VsZi5zdGFja2VkX2V4cGVydF90b2tlbnNfaWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeF9mbGF0LnNoYXBlWy0xXSksCiAgICAgICAgICAgICAgICBzZWxmLmV4cGVydF9vdXRwdXRfcm91dGVkLAogICAgICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgICAgICkKICAgICAgICAgICAgcm91dGVkX291dHB1dCA9IHNlbGYuZXhwZXJ0X2NhY2hlLnZpZXcoKm9yaWdfc2hhcGUpCgogICAgICAgIHdpdGggdG9yY2guY3VkYS5zdHJlYW0oc2hhcmVkX3N0cmVhbSk6CiAgICAgICAgICAgICMgVXNlIHRpbGVsYW5nIHRvIGltcGxlbWVudCB0aGUgbW9lIGluZmVyZW5jZSBvZiBzaGFyZWQgZXhwZXJ0cwogICAgICAgICAgICBzZWxmLnNoYXJlZF9rZXJuZWwoeF9mbGF0LCBzZWxmLnNoYXJlZF9leHBlcnQuV19nYXRlX3dlaWdodCwgc2VsZi5zaGFyZWRfZXhwZXJ0LldfdXBfd2VpZ2h0LCBzZWxmLnNoYXJlZF9leHBlcnQuV19kb3duX3dlaWdodCwgc2VsZi51cF9sb2dpdHNfc2hhcmVkLCBzZWxmLmV4cGVydF9vdXRwdXRfc2hhcmVkKQogICAgICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5leHBlcnRfb3V0cHV0X3NoYXJlZC52aWV3KCpvcmlnX3NoYXBlKQoKICAgICAgICAgICAgIyBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHgpCgogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQoKICAgICAgICByZXR1cm4gcm91dGVkX291dHB1dCArIHNoYXJlZF9vdXRwdXQKCiAgICAjIEB0b3JjaC5ub19ncmFkKCkKICAgICMgZGVmIG1vZV9pbmZlcihzZWxmLAogICAgIyAgICAgICAgICAgICAgIHg6IHRvcmNoLlRlbnNvciwKICAgICMgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAjICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0czogdG9yY2guVGVuc29yCiAgICAjICAgICAgICAgICAgICApIC0+IHRvcmNoLlRlbnNvcjoKCiAgICAjICAgICByZXR1cm4gc2VsZi5leHBlcnRfY2FjaGUKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgU3VibWlzc2lvbiB0ZW1wbGF0ZSBmb3IgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIHVzaW5nIFB5VG9yY2guCiAgICAKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX3NpemVdCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCgogICAgZHR5cGVfc3RyID0gImZsb2F0MTYiCgogICAgIyBzdGFydF90aW1lID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBkZWYgZ2V0X2NvbmZpZ3MoKToKICAgICMgICAgIGltcG9ydCBpdGVydG9vbHMKICAgICMgICAgIEJMT0NLX00gPSBbMzIsIDY0LCAxMjhdCiAgICAjICAgICBCTE9DS19OID0gWzMyLCA2NCwgMTI4XQogICAgIyAgICAgQkxPQ0tfSyA9IFszMiwgNjQsIDEyOF0KICAgICMgICAgIG51bV9zdGFnZXMgPSBbMCwgMSwgMl0KICAgICMgICAgIHRocmVhZHMgPSBbMTI4LCAyNTZdCiAgICAjICAgICBrX3BhY2sgPSBbMSwgMiwgNCwgOF0KICAgICMgICAgIGNvYWxlc2NlZF93aWR0aCA9IFsxLCAyLCA0XQogICAgIyAgICAgIyBudW1fc3RhZ2VzID0gWzFdCiAgICAjICAgICAjIHRocmVhZHMgPSBbMTI4XQogICAgIyAgICAgIyBrX3BhY2sgPSBbMV0KICAgICMgICAgICMgY29hbGVzY2VkX3dpZHRoID0gWzRdCiAgICAjICAgICBfY29uZmlncyA9IGxpc3QoaXRlcnRvb2xzLnByb2R1Y3QoQkxPQ0tfTSwgQkxPQ0tfTiwgQkxPQ0tfSywgbnVtX3N0YWdlcywgdGhyZWFkcywga19wYWNrLCBjb2FsZXNjZWRfd2lkdGgpKQogICAgICAgIAogICAgIyAgICAgcmV0dXJuIFt7CiAgICAjICAgICAgICAgImJsb2NrX00iOiBjWzBdLAogICAgIyAgICAgICAgICJibG9ja19OIjogY1sxXSwKICAgICMgICAgICAgICAiYmxvY2tfSyI6IGNbMl0sCiAgICAjICAgICAgICAgIm51bV9zdGFnZXMiOiBjWzNdLAogICAgIyAgICAgICAgICJ0aHJlYWRzIjogY1s0XSwKICAgICMgICAgICAgICAia19wYWNrIjogY1s1XSwKICAgICMgICAgICAgICAiY29hbGVzY2VkX3dpZHRoIjogY1s2XSwKICAgICMgICAgIH0gZm9yIGMgaW4gX2NvbmZpZ3NdCiAgICAKICAgICMgZGVmIHdyYXBwZWRfa2VybmVsKGJsb2NrX009Tm9uZSwgYmxvY2tfTj1Ob25lLCBibG9ja19LPU5vbmUsIG51bV9zdGFnZXM9Tm9uZSwgdGhyZWFkcz1Ob25lLCBrX3BhY2s9Tm9uZSwgY29hbGVzY2VkX3dpZHRoPU5vbmUpOgogICAgIyAgICAgcmV0dXJuIG1vZV9mb3J3YXJkX3RpbGVsYW5nX3JvdXRlZChjb25maWdbImRfaGlkZGVuIl0sIGNvbmZpZ1siZF9leHBlcnQiXSwgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIGR0eXBlPWR0eXBlX3N0ciwgZ3JvdXBfc3VtPWNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgZ3JvdXBfY291bnQ9Y29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIGJsb2NrX3Rva2VuPWJsb2NrX00sIGJsb2NrX2RoaWRkZW49YmxvY2tfTiwgYmxvY2tfZGV4cGVydD1ibG9ja19LLCB0aHJlYWRzPXRocmVhZHMsIG51bV9zdGFnZXM9bnVtX3N0YWdlcywga19wYWNrPWtfcGFjaywgY29hbGVzY2VkX3dpZHRoPWNvYWxlc2NlZF93aWR0aCkKICAgIAogICAgIyBhdXRvdHVuZXIgPSBBdXRvVHVuZXIuZnJvbV9rZXJuZWwoCiAgICAjICAgICBrZXJuZWw9d3JhcHBlZF9rZXJuZWwsCiAgICAjICAgICBjb25maWdzPWdldF9jb25maWdzKCkKICAgICMgKS5zZXRfY29tcGlsZV9hcmdzKAogICAgIyAgICAgb3V0X2lkeD1bLTFdLAogICAgIyAgICAgdGFyZ2V0PSJoaXAiLAogICAgIyApCiAgICAjIHR1bmVfcmVzdWx0ID0gYXV0b3R1bmVyLnJ1bih3YXJtdXA9MywgcmVwPTEwKQogICAgIyBiZXN0X2xhdGVuY3kgPSB0dW5lX3Jlc3VsdC5sYXRlbmN5CiAgICAjIGJlc3RfY29uZmlnID0gdHVuZV9yZXN1bHQuY29uZmlnCiAgICAjIHByaW50KGYiQmVzdCBsYXRlbmN5OiB7YmVzdF9sYXRlbmN5fSIpCiAgICAjIHByaW50KGYiQmVzdCBjb25maWc6IHtiZXN0X2NvbmZpZ30iKQogICAgCiAgICBzaGFyZWRfa2VybmVsID0gbW9lX2ZvcndhcmRfdGlsZWxhbmdfc2hhcmVkKGNvbmZpZ1siZF9oaWRkZW4iXSwgY29uZmlnWyJkX2V4cGVydCJdLCBjb25maWdbIm5fc2hhcmVkX2V4cGVydHMiXSwgZHR5cGU9ZHR5cGVfc3RyLCBudW1fdG9rZW5zPWNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0pCiAgICAjIHNoYXJlZF9rZXJuZWwgPSB0aWxlbGFuZy5jb21waWxlKHNoYXJlZF9wcm9ncmFtLCBvdXRfaWR4PVstMV0sIHBhc3NfY29uZmlncz17InRsLmRpc2FibGVfdG1hX2xvd2VyIjogVHJ1ZSwgInRsLmRpc2FibGVfd2FycF9zcGVjaWFsaXplZCI6IFRydWV9KQogICAgcm91dGVkX2tlcm5lbCA9IG1vZV9mb3J3YXJkX3RpbGVsYW5nX3JvdXRlZChjb25maWdbImRfaGlkZGVuIl0sIGNvbmZpZ1siZF9leHBlcnQiXSwgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIGR0eXBlPWR0eXBlX3N0ciwgZ3JvdXBfc3VtPWNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgZ3JvdXBfY291bnQ9Y29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIGJsb2NrX3Rva2VuPTEyOCwgYmxvY2tfZGhpZGRlbj0xMjgsIGJsb2NrX2RleHBlcnQ9MTI4LCB0aHJlYWRzPTI1NiwgbnVtX3N0YWdlcz0xLCBrX3BhY2s9MSwgY29hbGVzY2VkX3dpZHRoPTIpCiAgICAjIHJvdXRlZF9rZXJuZWwgPSB0aWxlbGFuZy5jb21waWxlKHJvdXRlZF9wcm9ncmFtLCBvdXRfaWR4PVstMV0sIHBhc3NfY29uZmlncz17InRsLmRpc2FibGVfdG1hX2xvd2VyIjogVHJ1ZSwgInRsLmRpc2FibGVfd2FycF9zcGVjaWFsaXplZCI6IFRydWV9KQoKICAgICMgZW5kX3RpbWUgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIGNvbXBpbGVfdGltZSA9IGVuZF90aW1lIC0gc3RhcnRfdGltZQogICAgIyBwcmludChmIlRpbWUgdGFrZW4gdG8gY29tcGlsZSBrZXJuZWxzOiB7Y29tcGlsZV90aW1lfSBucyIpCgogICAgIyBzdGFydF90aW1lID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lID0gTW9FKGNvbmZpZywgc2hhcmVkX2tlcm5lbCwgcm91dGVkX2tlcm5lbCwgd2VpZ2h0cywgcGFkZGluZ19NPTEyOCkKICAgICMgZW5kX3RpbWUgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIGluaXRfdGltZSA9IGVuZF90aW1lIC0gc3RhcnRfdGltZQogICAgIyBwcmludChmIlRpbWUgdGFrZW4gdG8gaW5pdGlhbGl6ZSBtb2RlbDoge2luaXRfdGltZX0gbnMiKQoKICAgICMgc3RhcnRfdGltZSA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgUnVuIHRoZSBtb2RlbAogICAgIyB3aXRoIHByb2ZpbGUoYWN0aXZpdGllcz1bUHJvZmlsZXJBY3Rpdml0eS5DUFUsIFByb2ZpbGVyQWN0aXZpdHkuQ1VEQV0sIHJlY29yZF9zaGFwZXM9VHJ1ZSkgYXMgcHJvZjoKICAgIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCiAgICAjIGVuZF90aW1lID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBpbmZlcmVuY2VfdGltZSA9IGVuZF90aW1lIC0gc3RhcnRfdGltZQogICAgIyBwcmludChmIlRpbWUgdGFrZW4gdG8gcnVuIG1vZGVsOiB7aW5mZXJlbmNlX3RpbWV9IG5zIikKCiAgICAjIHByaW50KHByb2Yua2V5X2F2ZXJhZ2VzKCkudGFibGUoc29ydF9ieT0iY3B1X3RpbWVfdG90YWwiKSkKICAgICMgcHJvZi5leHBvcnRfY2hyb21lX3RyYWNlKCJtb2VfbXVsdGlzdHJlYW0uanNvbiIpCgoKICAgIHJldHVybiBvdXRwdXQ=Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Best evidence level for this revision: reported
JSON