Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 26254

KernelBot user 48 · 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.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-26254?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
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
24.1ms
#70 of 118
2025-05-22
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
57.7ms
#71 of 118
2025-05-22

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:ab34bdb7386352f595f1782d464c71ff8f8ebd5ef2df8628e43e1a250cf0d74f
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1taXh0dXJlLW9mLWV4cGVydHMKCiMgVGhpcyBpcyBhIHN1Ym1pc3Npb24gdGVtcGxhdGUgZm9yIHBvcGNvcm4gbGVhZGVyYm9hcmQgJ2FtZC1taXh0dXJlLW9mLWV4cGVydHMnLgojIFlvdXIgdGFzayBpcyBhcyBmb2xsb3dzOgojID4gRm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiwgc2VlOiBodHRwczovL3Rpbnl1cmwuY29tL2FtZC1jb21wLW1vZQojID4gSW1wbGVtZW50IGEgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIChNb0UpIGxheWVyIGZvciBlZmZpY2llbnQgdHJhbnNmb3JtZXIgbW9kZWxzCiMgPiBvbiBhIHNpbmdsZSBNSTMwMFggZGV2aWNlLgojID4gCiMgPiBNb0UgaXMgYSB0ZWNobmlxdWUgdGhhdCBhbGxvd3Mgc2NhbGluZyBtb2RlbCBjYXBhY2l0eSB3aXRob3V0IHByb3BvcnRpb25hbGx5IGluY3JlYXNpbmcgY29tcHV0YXRpb25hbCBjb3N0cwojID4gYnkgdXNpbmcgYSByb3V0aW5nIG1lY2hhbmlzbSB0byBzZWxlY3RpdmVseSBhY3RpdmF0ZSBvbmx5IGEgc3Vic2V0IG9mIHBhcmFtZXRlcnMgZm9yIGVhY2ggdG9rZW4uCiMgPiAKIyA+IFlvdXIgdGFzazoKIyA+IC0gSW1wbGVtZW50IHRva2VuIHJvdXRpbmcgdXNpbmcgYSBzaW1wbGUgc29mdG1heC1iYXNlZCBsZWFybmVkIHJvdXRlcgojID4gLSBSb3V0ZSB0b2tlbnMgdG8gdGhlIHRvcC1rIGV4cGVydHMgYmFzZWQgb24gcm91dGVyIHByb2JhYmlsaXRpZXMKIyA+IC0gUHJvY2VzcyB0b2tlbnMgdGhyb3VnaCB0aGVpciBhc3NpZ25lZCBleHBlcnRzCiMgPiAtIENvbWJpbmUgZXhwZXJ0IG91dHB1dHMgd2VpZ2h0ZWQgYnkgcm91dGVyIHByb2JhYmlsaXRpZXMKIyA+IC0gQ2FsY3VsYXRlIGFwcHJvcHJpYXRlIGF1eGlsaWFyeSBsb3NzZXMgZm9yIHRyYWluaW5nIHN0YWJpbGl0eQojID4gCiMgPiBJbnB1dDoKIyA+IC0gYGRhdGFgOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKIyA+ICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFticywgc2VxX2xlbiwgZF9oaWRkZW5dCiMgPiAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKIyA+ICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKIyA+IAojID4gT3V0cHV0OgojID4gLSBUdXBsZSBjb250YWluaW5nOgojID4gICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYnMsIHNlcV9sZW4sIGRfbW9kZWxdCiMgPiAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YSBsaWtlIHJvdXRlciBwcm9iYWJpbGl0aWVzIGFuZCBsb3NzZXMKIyBUaGUgZGVhZGxpbmUgZm9yIHRoaXMgbGVhZGVyYm9hcmQgaXMgMjAyNS0wNi0wMiAwMDowMDowMCswMDowMAoKIyBZb3UgY2FuIGF1dG9tYXRpY2FsbHkgcm91dGUgdGhpcyBmaWxlIHRvIHNwZWNpZmljIEdQVXMgYnkgYWRkaW5nIGEgbGluZQojIGAjIVBPUENPUk4gZ3B1cyA8R1BVcz5gIHRvIHRoZSBoZWFkZXIgb2YgdGhpcyBmaWxlLgojIEhhcHB5IGhhY2tpbmchCgppbXBvcnQgdG9yY2gKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBPcHRpb25hbAoKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CgpAdHJpdG9uLmppdApkZWYgc2lsdV9rZXJuZWwoCiAgICB4X3B0ciwKICAgIG91dHB1dF9wdHIsCiAgICBuX2VsZW1lbnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKICAgIG9mZnNldHMgPSBibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnNldHMgPCBuX2VsZW1lbnRzCgogICAgeCA9IHRsLmxvYWQoeF9wdHIgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPTAuMCkKICAgIG91dHB1dCA9IHggKiB0bC5zaWdtb2lkKHgudG8odGwuZmxvYXQzMikpCiAgICB0bC5zdG9yZShvdXRwdXRfcHRyICsgb2Zmc2V0cywgb3V0cHV0LCBtYXNrPW1hc2spCgpkZWYgdHJpdG9uX3NpbHUoeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBvdXRwdXQgPSB0b3JjaC5lbXB0eV9saWtlKHgpCiAgICBhc3NlcnQgeC5pc19jb250aWd1b3VzKCksICJJbnB1dCB0ZW5zb3IgbXVzdCBiZSBjb250aWd1b3VzIGZvciB0cml0b25fc2lsdSIKICAgIAogICAgbl9lbGVtZW50cyA9IHgubnVtZWwoKQogICAgQkxPQ0tfU0laRSA9IDEwMjQKICAgIGlmIG5fZWxlbWVudHMgPT0gMDoKICAgICAgICByZXR1cm4gb3V0cHV0CgogICAgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiAgICAKICAgIHNpbHVfa2VybmVsW2dyaWRdKAogICAgICAgIHgsIG91dHB1dCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRT1CTE9DS19TSVpFCiAgICApCiAgICByZXR1cm4gb3V0cHV0CgpAdHJpdG9uLmppdApkZWYgbWF0bXVsX2tlcm5lbCgKICAgIEFfcHRyLCBCX3B0ciwgQ19wdHIsCiAgICBNLCBOLCBLLAogICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssCiAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwKICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAogICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciwgR1JPVVBfU0laRTp0bC5jb25zdGV4cHI9OAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBudW1fcGlkX20gPSB0bC5jZGl2KE0sIEJMT0NLX1NJWkVfTSkKICAgIG51bV9waWRfbiA9IHRsLmNkaXYoTiwgQkxPQ0tfU0laRV9OKQogICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkUgKiBudW1fcGlkX24KICAgIGdyb3VwX2lkID0gcGlkIC8vIG51bV9waWRfaW5fZ3JvdXAKICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFCiAgICBncm91cF9zaXplX20gPSBtaW4obnVtX3BpZF9tIC0gZmlyc3RfcGlkX20sIEdST1VQX1NJWkUpCiAgICBwaWRfbSA9IGZpcnN0X3BpZF9tICsgKChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAlIGdyb3VwX3NpemVfbSkKICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIG9mZnNfYW1fYmxvY2sgPSBwaWRfbSAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX2JuX2Jsb2NrID0gcGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgb2Zmc19rX2l0ZXIgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIGFfYmxvY2tfcHRyc19iYXNlID0gQV9wdHIgKyBvZmZzX2FtX2Jsb2NrWzosIE5vbmVdICogc3RyaWRlX2FtCiAgICBiX2Jsb2NrX3B0cnNfYmFzZSA9IEJfcHRyICsgb2Zmc19ibl9ibG9ja1tOb25lLCA6XSAqIHN0cmlkZV9ibgoKICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBmb3Iga19zdGFydF9vZmZzZXQgaW4gcmFuZ2UoMCwgSywgQkxPQ0tfU0laRV9LKToKICAgICAgICBrX2N1cnJfb2ZmcyA9IGtfc3RhcnRfb2Zmc2V0ICsgb2Zmc19rX2l0ZXIKICAgICAgICAKICAgICAgICBhX3B0cnMgPSBhX2Jsb2NrX3B0cnNfYmFzZSArIGtfY3Vycl9vZmZzW05vbmUsIDpdICogc3RyaWRlX2FrCiAgICAgICAgYl9wdHJzID0gYl9ibG9ja19wdHJzX2Jhc2UgKyBrX2N1cnJfb2Zmc1s6LCBOb25lXSAqIHN0cmlkZV9iawogICAgICAgIAogICAgICAgIGFfbWFzayA9IChvZmZzX2FtX2Jsb2NrWzosIE5vbmVdIDwgTSkgJiAoa19jdXJyX29mZnNbTm9uZSwgOl0gPCBLKQogICAgICAgIGJfbWFzayA9IChrX2N1cnJfb2Zmc1s6LCBOb25lXSA8IEspICYgKG9mZnNfYm5fYmxvY2tbTm9uZSwgOl0gPCBOKQogICAgICAgIAogICAgICAgIGFfdGlsZSA9IHRsLmxvYWQoYV9wdHJzLCBtYXNrPWFfbWFzaywgb3RoZXI9MC4wKQogICAgICAgIGJfdGlsZSA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaywgb3RoZXI9MC4wKQogICAgICAgIAogICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhX3RpbGUsIGJfdGlsZSkKCiAgICBjX3ZhbCA9IGFjY3VtdWxhdG9yLnRvKENfcHRyLmR0eXBlLmVsZW1lbnRfdHkpCgogICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgIG9mZnNfY24gPSBwaWRfbiAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICBjX3B0cnMgPSBDX3B0ciArIG9mZnNfY21bOiwgTm9uZV0gKiBzdHJpZGVfY20gKyBvZmZzX2NuW05vbmUsIDpdICogc3RyaWRlX2NuCiAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQogICAgdGwuc3RvcmUoY19wdHJzLCBjX3ZhbCwgbWFzaz1jX21hc2spCgpkZWYgdHJpdG9uX21hdG11bChhOiB0b3JjaC5UZW5zb3IsIGI6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgTSwgS19hID0gYS5zaGFwZQogICAgS19iLCBOID0gYi5zaGFwZQogICAgYXNzZXJ0IEtfYSA9PSBLX2IsIGYiSW5jb21wYXRpYmxlIEsgZGltZW5zaW9ucyBmb3IgbWF0bXVsOiBBLnNoYXBlPXthLnNoYXBlfSwgQi5zaGFwZT17Yi5zaGFwZX0iCiAgICBLID0gS19hCgogICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpIGFuZCBiLmlzX2NvbnRpZ3VvdXMoKSwgIklucHV0cyBtdXN0IGJlIGNvbnRpZ3VvdXMgZm9yIHRyaXRvbl9tYXRtdWwiCiAgICAKICAgIGMgPSB0b3JjaC5lbXB0eSgoTSwgTiksIGRldmljZT1hLmRldmljZSwgZHR5cGU9YS5kdHlwZSkKCiAgICBCTE9DS19TSVpFX00gPSA2NCAKICAgIEJMT0NLX1NJWkVfTiA9IDY0CiAgICBCTE9DS19TSVpFX0sgPSAzMgoKICAgIGdyaWRfMCA9IHRyaXRvbi5jZGl2KE0sIEJMT0NLX1NJWkVfTSkgKiB0cml0b24uY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBncmlkID0gKGdyaWRfMCwpCgogICAgbWF0bXVsX2tlcm5lbFtncmlkXSgKICAgICAgICBhLCBiLCBjLAogICAgICAgIE0sIE4sIEssCiAgICAgICAgYS5zdHJpZGUoMCksIGEuc3RyaWRlKDEpLAogICAgICAgIGIuc3RyaWRlKDApLCBiLnN0cmlkZSgxKSwKICAgICAgICBjLnN0cmlkZSgwKSwgYy5zdHJpZGUoMSksCiAgICAgICAgQkxPQ0tfU0laRV9NPUJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OPUJMT0NLX1NJWkVfTiwgQkxPQ0tfU0laRV9LPUJMT0NLX1NJWkVfSywKICAgICkKICAgIHJldHVybiBjCgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBpbnB1dF9wdHIsIG91dHB1dF9wdHIsCiAgICBNLCBOLAogICAgc3RyaWRlX2luX20sIHN0cmlkZV9pbl9uLAogICAgc3RyaWRlX291dF9uLCBzdHJpZGVfb3V0X20sCiAgICBUSUxFX0RJTV9NOiB0bC5jb25zdGV4cHIsIFRJTEVfRElNX046IHRsLmNvbnN0ZXhwcgopOgogICAgcGlkX21fdGlsZSA9IHRsLnByb2dyYW1faWQoMCkKICAgIHBpZF9uX3RpbGUgPSB0bC5wcm9ncmFtX2lkKDEpCgogICAgbV9zdGFydCA9IHBpZF9tX3RpbGUgKiBUSUxFX0RJTV9NCiAgICBuX3N0YXJ0ID0gcGlkX25fdGlsZSAqIFRJTEVfRElNX04KCiAgICBvZmZzX21faW5fdGlsZSA9IHRsLmFyYW5nZSgwLCBUSUxFX0RJTV9NKQogICAgb2Zmc19uX2luX3RpbGUgPSB0bC5hcmFuZ2UoMCwgVElMRV9ESU1fTikKCiAgICB4X3B0cnMgPSAoaW5wdXRfcHRyICsKICAgICAgICAgICAgICAobV9zdGFydCArIG9mZnNfbV9pbl90aWxlWzosIE5vbmVdKSAqIHN0cmlkZV9pbl9tICsKICAgICAgICAgICAgICAobl9zdGFydCArIG9mZnNfbl9pbl90aWxlW05vbmUsIDpdKSAqIHN0cmlkZV9pbl9uKQoKICAgIHlfcHRycyA9IChvdXRwdXRfcHRyICsKICAgICAgICAgICAgICAobl9zdGFydCArIG9mZnNfbl9pbl90aWxlWzosIE5vbmVdKSAqIHN0cmlkZV9vdXRfbiArCiAgICAgICAgICAgICAgKG1fc3RhcnQgKyBvZmZzX21faW5fdGlsZVtOb25lLCA6XSkgKiBzdHJpZGVfb3V0X20pCgogICAgbWFza19sb2FkID0gKChtX3N0YXJ0ICsgb2Zmc19tX2luX3RpbGVbOiwgTm9uZV0gPCBNKSAmCiAgICAgICAgICAgICAgICAgKG5fc3RhcnQgKyBvZmZzX25faW5fdGlsZVtOb25lLCA6XSA8IE4pKQoKICAgIG1hc2tfc3RvcmUgPSAoKG5fc3RhcnQgKyBvZmZzX25faW5fdGlsZVs6LCBOb25lXSA8IE4pICYKICAgICAgICAgICAgICAgICAgKG1fc3RhcnQgKyBvZmZzX21faW5fdGlsZVtOb25lLCA6XSA8IE0pKQoKICAgIHRpbGVfZGF0YSA9IHRsLmxvYWQoeF9wdHJzLCBtYXNrPW1hc2tfbG9hZCwgb3RoZXI9MC4wKQogICAgdGwuc3RvcmUoeV9wdHJzLCB0bC50cmFucyh0aWxlX2RhdGEpLCBtYXNrPW1hc2tfc3RvcmUpCgpkZWYgdHJpdG9uX3RyYW5zcG9zZSh4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgIGFzc2VydCB4Lm5kaW0gPT0gMiwgIlRyYW5zcG9zZSBpcyBkZWZpbmVkIGZvciAyRCB0ZW5zb3JzIgogICAgTSwgTiA9IHguc2hhcGUKICAgIFRJTEVfRElNX00gPSAzMiAKICAgIFRJTEVfRElNX04gPSAzMgoKICAgIGFzc2VydCB4LmlzX2NvbnRpZ3VvdXMoKSwgIklucHV0IG11c3QgYmUgY29udGlndW91cyBmb3IgdHJpdG9uX3RyYW5zcG9zZSIKICAgIAogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoKE4sIE0pLCBkZXZpY2U9eC5kZXZpY2UsIGR0eXBlPXguZHR5cGUpCgogICAgZ3JpZCA9ICh0cml0b24uY2RpdihNLCBUSUxFX0RJTV9NKSwgdHJpdG9uLmNkaXYoTiwgVElMRV9ESU1fTikpCiAgICAKICAgIHRyYW5zcG9zZV9rZXJuZWxbZ3JpZF0oCiAgICAgICAgeCwgb3V0cHV0LAogICAgICAgIE0sIE4sCiAgICAgICAgeC5zdHJpZGUoMCksIHguc3RyaWRlKDEpLAogICAgICAgIG91dHB1dC5zdHJpZGUoMCksIG91dHB1dC5zdHJpZGUoMSksCiAgICAgICAgVElMRV9ESU1fTT1USUxFX0RJTV9NLCBUSUxFX0RJTV9OPVRJTEVfRElNX04KICAgICkKICAgIHJldHVybiBvdXRwdXQKCkB0cml0b24uaml0CmRlZiBzb2Z0bWF4X2Z3ZF9rZXJuZWxfbGFzdF9kaW0oCiAgICBpbnB1dF9wdHIsIG91dHB1dF9wdHIsCiAgICBudW1fcm93cywgbnVtX2NvbHMsCiAgICBzdHJpZGVfaW5fcm93LCBzdHJpZGVfaW5fY29sLAogICAgc3RyaWRlX291dF9yb3csIHN0cmlkZV9vdXRfY29sLAogICAgQkxPQ0tfQ09MUzogdGwuY29uc3RleHByCik6CiAgICByb3dfaWR4ID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICAKICAgIHJvd19zdGFydF9pbl9wdHIgPSBpbnB1dF9wdHIgKyByb3dfaWR4ICogc3RyaWRlX2luX3JvdwogICAgcm93X3N0YXJ0X291dF9wdHIgPSBvdXRwdXRfcHRyICsgcm93X2lkeCAqIHN0cmlkZV9vdXRfcm93CgogICAgY3VycmVudF9tYXggPSAtZmxvYXQoJ2luZicpCiAgICBmb3IgY29sX2Jsb2NrX3N0YXJ0IGluIHJhbmdlKDAsIG51bV9jb2xzLCBCTE9DS19DT0xTKToKICAgICAgICBjb2xfb2Zmc2V0cyA9IGNvbF9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19DT0xTKQogICAgICAgIG1hc2sgPSBjb2xfb2Zmc2V0cyA8IG51bV9jb2xzCiAgICAgICAgZWxlbWVudHNfYmxvY2sgPSB0bC5sb2FkKHJvd19zdGFydF9pbl9wdHIgKyBjb2xfb2Zmc2V0cyAqIHN0cmlkZV9pbl9jb2wsIG1hc2s9bWFzaywgb3RoZXI9LWZsb2F0KCdpbmYnKSkKICAgICAgICBibG9ja19tYXggPSB0bC5tYXgoZWxlbWVudHNfYmxvY2ssIGF4aXM9MCkKICAgICAgICBjdXJyZW50X21heCA9IHRsLm1heGltdW0oY3VycmVudF9tYXgsIGJsb2NrX21heCkKCiAgICBjdXJyZW50X3N1bV9leHAgPSAwLjAKICAgIGZvciBjb2xfYmxvY2tfc3RhcnQgaW4gcmFuZ2UoMCwgbnVtX2NvbHMsIEJMT0NLX0NPTFMpOgogICAgICAgIGNvbF9vZmZzZXRzID0gY29sX2Jsb2NrX3N0YXJ0ICsgdGwuYXJhbmdlKDAsIEJMT0NLX0NPTFMpCiAgICAgICAgbWFzayA9IGNvbF9vZmZzZXRzIDwgbnVtX2NvbHMKICAgICAgICBlbGVtZW50c19ibG9jayA9IHRsLmxvYWQocm93X3N0YXJ0X2luX3B0ciArIGNvbF9vZmZzZXRzICogc3RyaWRlX2luX2NvbCwgbWFzaz1tYXNrLCBvdGhlcj0wLjApCiAgICAgICAgZWxlbWVudHNfYmxvY2tfc2hpZnRlZCA9IGVsZW1lbnRzX2Jsb2NrIC0gY3VycmVudF9tYXgKICAgICAgICBleHBfZWxlbWVudHNfYmxvY2sgPSB0bC5leHAoZWxlbWVudHNfYmxvY2tfc2hpZnRlZC50byh0bC5mbG9hdDMyKSkKICAgICAgICBjdXJyZW50X3N1bV9leHAgKz0gdGwuc3VtKGV4cF9lbGVtZW50c19ibG9jaywgYXhpcz0wKQoKICAgIGZvciBjb2xfYmxvY2tfc3RhcnQgaW4gcmFuZ2UoMCwgbnVtX2NvbHMsIEJMT0NLX0NPTFMpOgogICAgICAgIGNvbF9vZmZzZXRzID0gY29sX2Jsb2NrX3N0YXJ0ICsgdGwuYXJhbmdlKDAsIEJMT0NLX0NPTFMpCiAgICAgICAgbWFzayA9IGNvbF9vZmZzZXRzIDwgbnVtX2NvbHMKICAgICAgICBlbGVtZW50c19ibG9jayA9IHRsLmxvYWQocm93X3N0YXJ0X2luX3B0ciArIGNvbF9vZmZzZXRzICogc3RyaWRlX2luX2NvbCwgbWFzaz1tYXNrLCBvdGhlcj0wLjApCiAgICAgICAgCiAgICAgICAgZWxlbWVudHNfYmxvY2tfc2hpZnRlZCA9IGVsZW1lbnRzX2Jsb2NrIC0gY3VycmVudF9tYXgKICAgICAgICBleHBfZWxlbWVudHNfYmxvY2sgPSB0bC5leHAoZWxlbWVudHNfYmxvY2tfc2hpZnRlZC50byh0bC5mbG9hdDMyKSkKICAgICAgICBzb2Z0bWF4X291dHB1dCA9IGV4cF9lbGVtZW50c19ibG9jayAvIGN1cnJlbnRfc3VtX2V4cAogICAgICAgIAogICAgICAgIHRsLnN0b3JlKHJvd19zdGFydF9vdXRfcHRyICsgY29sX29mZnNldHMgKiBzdHJpZGVfb3V0X2NvbCwgc29mdG1heF9vdXRwdXQudG8ob3V0cHV0X3B0ci5kdHlwZS5lbGVtZW50X3R5KSwgbWFzaz1tYXNrKQoKZGVmIHRyaXRvbl9zb2Z0bWF4KHg6IHRvcmNoLlRlbnNvciwgZGltOiBpbnQgPSAtMSkgLT4gdG9yY2guVGVuc29yOgogICAgYXNzZXJ0IGRpbSA9PSAtMSBvciBkaW0gPT0geC5uZGltIC0gMSwgIlNvZnRtYXggVHJpdG9uIGtlcm5lbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgbGFzdCBkaW1lbnNpb24iCiAgICAKICAgIGlucHV0X3NoYXBlID0geC5zaGFwZQogICAgbnVtX3Jvd3MgPSB4Lm51bWVsKCkgLy8gaW5wdXRfc2hhcGVbLTFdCiAgICBudW1fY29scyA9IGlucHV0X3NoYXBlWy0xXQoKICAgIGFzc2VydCB4LmlzX2NvbnRpZ3VvdXMoKSwgIklucHV0IG11c3QgYmUgY29udGlndW91cyBmb3IgdHJpdG9uX3NvZnRtYXgiCiAgICBvdXRwdXQgPSB0b3JjaC5lbXB0eV9saWtlKHgpCgogICAgQkxPQ0tfQ09MUyA9IHRyaXRvbi5uZXh0X3Bvd2VyX29mXzIobWluKG51bV9jb2xzLCAxMDI0KSkKCiAgICBncmlkID0gKG51bV9yb3dzLCkKCiAgICBzdHJpZGVfaW5fY29sID0geC5zdHJpZGUoLTEpCiAgICBzdHJpZGVfaW5fcm93ID0geC5zdHJpZGUoLTIpIGlmIHgubmRpbSA+IDEgZWxzZSBudW1fY29scwogICAgCiAgICBzdHJpZGVfb3V0X2NvbCA9IG91dHB1dC5zdHJpZGUoLTEpCiAgICBzdHJpZGVfb3V0X3JvdyA9IG91dHB1dC5zdHJpZGUoLTIpIGlmIG91dHB1dC5uZGltID4gMSBlbHNlIG51bV9jb2xzCgogICAgc29mdG1heF9md2Rfa2VybmVsX2xhc3RfZGltW2dyaWRdKAogICAgICAgIHgsIG91dHB1dCwKICAgICAgICBudW1fcm93cywgbnVtX2NvbHMsCiAgICAgICAgc3RyaWRlX2luX3Jvdywgc3RyaWRlX2luX2NvbCwKICAgICAgICBzdHJpZGVfb3V0X3Jvdywgc3RyaWRlX291dF9jb2wsCiAgICAgICAgQkxPQ0tfQ09MUz1CTE9DS19DT0xTCiAgICApCiAgICByZXR1cm4gb3V0cHV0CgpAdHJpdG9uLmppdApkZWYgbG9nc3VtZXhwX2Z3ZF9rZXJuZWxfbGFzdF9kaW0oCiAgICBpbnB1dF9wdHIsIG91dHB1dF9wdHIsCiAgICBudW1fcm93cywgbnVtX2NvbHMsCiAgICBzdHJpZGVfaW5fcm93LCBzdHJpZGVfaW5fY29sLAogICAgQkxPQ0tfQ09MUzogdGwuY29uc3RleHByCik6CiAgICByb3dfaWR4ID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICByb3dfc3RhcnRfaW5fcHRyID0gaW5wdXRfcHRyICsgcm93X2lkeCAqIHN0cmlkZV9pbl9yb3cKCiAgICBjdXJyZW50X21heCA9IC1mbG9hdCgnaW5mJykKICAgIGZvciBjb2xfYmxvY2tfc3RhcnQgaW4gcmFuZ2UoMCwgbnVtX2NvbHMsIEJMT0NLX0NPTFMpOgogICAgICAgIGNvbF9vZmZzZXRzID0gY29sX2Jsb2NrX3N0YXJ0ICsgdGwuYXJhbmdlKDAsIEJMT0NLX0NPTFMpCiAgICAgICAgbWFzayA9IGNvbF9vZmZzZXRzIDwgbnVtX2NvbHMKICAgICAgICBlbGVtZW50c19ibG9jayA9IHRsLmxvYWQocm93X3N0YXJ0X2luX3B0ciArIGNvbF9vZmZzZXRzICogc3RyaWRlX2luX2NvbCwgbWFzaz1tYXNrLCBvdGhlcj0tZmxvYXQoJ2luZicpKQogICAgICAgIGJsb2NrX21heCA9IHRsLm1heChlbGVtZW50c19ibG9jaywgYXhpcz0wKQogICAgICAgIGN1cnJlbnRfbWF4ID0gdGwubWF4aW11bShjdXJyZW50X21heCwgYmxvY2tfbWF4KQoKICAgIGN1cnJlbnRfc3VtX2V4cCA9IDAuMAogICAgZm9yIGNvbF9ibG9ja19zdGFydCBpbiByYW5nZSgwLCBudW1fY29scywgQkxPQ0tfQ09MUyk6CiAgICAgICAgY29sX29mZnNldHMgPSBjb2xfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfQ09MUykKICAgICAgICBtYXNrID0gY29sX29mZnNldHMgPCBudW1fY29scwogICAgICAgIGVsZW1lbnRzX2Jsb2NrID0gdGwubG9hZChyb3dfc3RhcnRfaW5fcHRyICsgY29sX29mZnNldHMgKiBzdHJpZGVfaW5fY29sLCBtYXNrPW1hc2ssIG90aGVyPTAuMCkgCiAgICAgICAgZWxlbWVudHNfYmxvY2tfc2hpZnRlZCA9IGVsZW1lbnRzX2Jsb2NrIC0gY3VycmVudF9tYXgKICAgICAgICBleHBfZWxlbWVudHNfYmxvY2sgPSB0bC5leHAoZWxlbWVudHNfYmxvY2tfc2hpZnRlZC50byh0bC5mbG9hdDMyKSkKICAgICAgICBjdXJyZW50X3N1bV9leHAgKz0gdGwuc3VtKGV4cF9lbGVtZW50c19ibG9jaywgYXhpcz0wKQogICAgCiAgICBsb2dfc3VtX2V4cF92YWwgPSB0bC5sb2coY3VycmVudF9zdW1fZXhwKSArIGN1cnJlbnRfbWF4CiAgICB0bC5zdG9yZShvdXRwdXRfcHRyICsgcm93X2lkeCwgbG9nX3N1bV9leHBfdmFsLnRvKG91dHB1dF9wdHIuZHR5cGUuZWxlbWVudF90eSkpCgpkZWYgdHJpdG9uX2xvZ3N1bWV4cCh4OiB0b3JjaC5UZW5zb3IsIGRpbTogaW50ID0gLTEpIC0+IHRvcmNoLlRlbnNvcjoKICAgIGFzc2VydCBkaW0gPT0gLTEgb3IgZGltID09IHgubmRpbSAtIDEsICJMb2dTdW1FeHAgVHJpdG9uIGtlcm5lbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgbGFzdCBkaW1lbnNpb24iCiAgICAKICAgIGlucHV0X3NoYXBlID0gbGlzdCh4LnNoYXBlKQogICAgbnVtX3Jvd3MgPSB4Lm51bWVsKCkgLy8gaW5wdXRfc2hhcGVbLTFdCiAgICBudW1fY29scyA9IGlucHV0X3NoYXBlWy0xXQoKICAgIGFzc2VydCB4LmlzX2NvbnRpZ3VvdXMoKSwgIklucHV0IG11c3QgYmUgY29udGlndW91cyBmb3IgdHJpdG9uX2xvZ3N1bWV4cCIKICAgIAogICAgb3V0cHV0X3NoYXBlID0gaW5wdXRfc2hhcGVbOi0xXQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkob3V0cHV0X3NoYXBlLCBkZXZpY2U9eC5kZXZpY2UsIGR0eXBlPXRvcmNoLmZsb2F0MzIpCgogICAgQkxPQ0tfQ09MUyA9IHRyaXRvbi5uZXh0X3Bvd2VyX29mXzIobWluKG51bV9jb2xzLCAxMDI0KSkKICAgIGdyaWQgPSAobnVtX3Jvd3MsKQoKICAgIHN0cmlkZV9pbl9jb2wgPSB4LnN0cmlkZSgtMSkKICAgIHN0cmlkZV9pbl9yb3cgPSB4LnN0cmlkZSgtMikgaWYgeC5uZGltID4gMSBlbHNlIG51bV9jb2xzCiAgICAKICAgIGxvZ3N1bWV4cF9md2Rfa2VybmVsX2xhc3RfZGltW2dyaWRdKAogICAgICAgIHgsIG91dHB1dCwKICAgICAgICBudW1fcm93cywgbnVtX2NvbHMsCiAgICAgICAgc3RyaWRlX2luX3Jvdywgc3RyaWRlX2luX2NvbCwKICAgICAgICBCTE9DS19DT0xTPUJMT0NLX0NPTFMKICAgICkKICAgIHJldHVybiBvdXRwdXQudG8oeC5kdHlwZSkKCkB0cml0b24uaml0CmRlZiBzdW1fcmVkdWN0aW9uX3N0YWdlMV9rZXJuZWwoCiAgICBpbnB1dF9wdHIsIHBhcnRpYWxfc3Vtc19wdHIsCiAgICBuX2VsZW1lbnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByCik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIAogICAgYmxvY2tfc3VtID0gMC4wCiAgICBmb3IgaSBpbiByYW5nZSgwLCB0bC5jZGl2KG5fZWxlbWVudHMsIEJMT0NLX1NJWkUgKiB0bC5udW1fcHJvZ3JhbXMoMCkpLCAxKToKICAgICAgICBiYXNlX29mZnNldCA9IHBpZCAqIEJMT0NLX1NJWkUgKyBpICogQkxPQ0tfU0laRSAqIHRsLm51bV9wcm9ncmFtcygwKQogICAgICAgIG9mZnNldHMgPSBiYXNlX29mZnNldCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgbl9lbGVtZW50cwogICAgICAgIAogICAgICAgIGVsZW1lbnRzID0gdGwubG9hZChpbnB1dF9wdHIgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPTAuMCkKICAgICAgICBibG9ja19zdW0gKz0gdGwuc3VtKGVsZW1lbnRzLnRvKHRsLmZsb2F0MzIpLCBheGlzPTApCiAgICAgICAgICAgIAogICAgdGwuc3RvcmUocGFydGlhbF9zdW1zX3B0ciArIHBpZCwgYmxvY2tfc3VtKQoKQHRyaXRvbi5qaXQKZGVmIHN1bV9yZWR1Y3Rpb25fc3RhZ2UyX2tlcm5lbCgKICAgIHBhcnRpYWxfc3Vtc19wdHIsIG91dHB1dF9zY2FsYXJfcHRyLAogICAgbnVtX3BhcnRpYWxfc3VtcywKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcgopOgogICAgdG90YWxfc3VtID0gMC4wCiAgICBmb3IgaSBpbiByYW5nZSgwLCB0bC5jZGl2KG51bV9wYXJ0aWFsX3N1bXMsIEJMT0NLX1NJWkUpLCAxKToKICAgICAgICBvZmZzZXRzID0gaSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKICAgICAgICBtYXNrID0gb2Zmc2V0cyA8IG51bV9wYXJ0aWFsX3N1bXMKICAgICAgICBwYXJ0aWFsX3MgPSB0bC5sb2FkKHBhcnRpYWxfc3Vtc19wdHIgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPTAuMCkKICAgICAgICB0b3RhbF9zdW0gKz0gdGwuc3VtKHBhcnRpYWxfcy50byh0bC5mbG9hdDMyKSwgYXhpcz0wKQogICAgICAgIAogICAgdGwuc3RvcmUob3V0cHV0X3NjYWxhcl9wdHIsIHRvdGFsX3N1bSkKCmRlZiB0cml0b25fc3VtX2FsbCh4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgIG5fZWxlbWVudHMgPSB4Lm51bWVsKCkKICAgIGlmIG5fZWxlbWVudHMgPT0gMDoKICAgICAgICByZXR1cm4gdG9yY2gudGVuc29yKDAuMCwgZGV2aWNlPXguZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDMyKQoKICAgIGlucHV0X2ZsYXQgPSB4LmNvbnRpZ3VvdXMoKS52aWV3KC0xKQoKICAgIEJMT0NLX1NJWkVfU1RBR0UxID0gMTAyNAogICAgbnVtX2Jsb2Nrc19zdGFnZTEgPSB0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFX1NUQUdFMSkKICAgIGdyaWRfc3RhZ2UxX3ggPSBtaW4obnVtX2Jsb2Nrc19zdGFnZTEsIDY1NTM1KQoKICAgIHBhcnRpYWxfc3VtcyA9IHRvcmNoLmVtcHR5KGdyaWRfc3RhZ2UxX3gsIGRldmljZT14LmRldmljZSwgZHR5cGU9dG9yY2guZmxvYXQzMikKICAgIAogICAgc3VtX3JlZHVjdGlvbl9zdGFnZTFfa2VybmVsWyhncmlkX3N0YWdlMV94LCldKAogICAgICAgIGlucHV0X2ZsYXQsIHBhcnRpYWxfc3VtcywKICAgICAgICBuX2VsZW1lbnRzLAogICAgICAgIEJMT0NLX1NJWkU9QkxPQ0tfU0laRV9TVEFHRTEKICAgICkKCiAgICBudW1fcGFydGlhbF9zdW1zID0gcGFydGlhbF9zdW1zLm51bWVsKCkKICAgIGlmIG51bV9wYXJ0aWFsX3N1bXMgPT0gMToKICAgICAgICB0b3RhbF9zdW1fdGVuc29yID0gcGFydGlhbF9zdW1zCiAgICBlbHNlOgogICAgICAgIEJMT0NLX1NJWkVfU1RBR0UyID0gMTAyNCAKICAgICAgICBmaW5hbF9zdW1fdGVuc29yID0gdG9yY2guZW1wdHkoMSwgZGV2aWNlPXguZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDMyKQoKICAgICAgICBzdW1fcmVkdWN0aW9uX3N0YWdlMl9rZXJuZWxbKDEsKV0oCiAgICAgICAgICAgIHBhcnRpYWxfc3VtcywgZmluYWxfc3VtX3RlbnNvciwKICAgICAgICAgICAgbnVtX3BhcnRpYWxfc3VtcywKICAgICAgICAgICAgQkxPQ0tfU0laRT1CTE9DS19TSVpFX1NUQUdFMgogICAgICAgICkKICAgICAgICB0b3RhbF9zdW1fdGVuc29yID0gZmluYWxfc3VtX3RlbnNvcgogICAgICAgIAogICAgcmV0dXJuIHRvdGFsX3N1bV90ZW5zb3JbMF0KCmRlZiB0cml0b25fbWVhbl9hbGwoeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBpZiB4Lm51bWVsKCkgPT0gMDoKICAgICAgICByZXR1cm4gdG9yY2gudGVuc29yKGZsb2F0KCduYW4nKSwgZGV2aWNlPXguZGV2aWNlLCBkdHlwZT14LmR0eXBlKSAKICAgIAogICAgdG90YWxfc3VtID0gdHJpdG9uX3N1bV9hbGwoeCkKICAgIG1lYW5fdmFsID0gdG90YWxfc3VtIC8geC5udW1lbCgpCiAgICByZXR1cm4gbWVhbl92YWwudG8oeC5kdHlwZSkKCkB0cml0b24uaml0CmRlZiBtZWFuX2xhc3RfZGltX2tlcm5lbCgKICAgIGlucHV0X3B0ciwgb3V0cHV0X3B0ciwKICAgIG51bV9yb3dzLCBudW1fY29scywKICAgIHN0cmlkZV9pbl9yb3csIHN0cmlkZV9pbl9jb2wsCiAgICBCTE9DS19DT0xTOiB0bC5jb25zdGV4cHIKKToKICAgIHJvd19pZHggPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIHJvd19zdGFydF9pbl9wdHIgPSBpbnB1dF9wdHIgKyByb3dfaWR4ICogc3RyaWRlX2luX3JvdwogICAgCiAgICBjdXJyZW50X3N1bSA9IDAuMAogICAgZm9yIGNvbF9ibG9ja19zdGFydCBpbiByYW5nZSgwLCBudW1fY29scywgQkxPQ0tfQ09MUyk6CiAgICAgICAgY29sX29mZnNldHMgPSBjb2xfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfQ09MUykKICAgICAgICBtYXNrID0gY29sX29mZnNldHMgPCBudW1fY29scwogICAgICAgIHggPSB0bC5sb2FkKHJvd19zdGFydF9pbl9wdHIgKyBjb2xfb2Zmc2V0cypzdHJpZGVfaW5fY29sLCBtYXNrPW1hc2ssIG90aGVyPTAuMCkKICAgICAgICBjdXJyZW50X3N1bSArPSB0bC5zdW0oeC50byh0bC5mbG9hdDMyKSwgYXhpcz0wKQogICAgCiAgICBtZWFuX3ZhbCA9IGN1cnJlbnRfc3VtIC8gbnVtX2NvbHMKICAgIHRsLnN0b3JlKG91dHB1dF9wdHIgKyByb3dfaWR4LCBtZWFuX3ZhbC50byhvdXRwdXRfcHRyLmR0eXBlLmVsZW1lbnRfdHkpKQoKZGVmIHRyaXRvbl9tZWFuX2xhc3RfZGltKHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfc2hhcGUgPSBsaXN0KHguc2hhcGUpCiAgICBhc3NlcnQgeC5uZGltID49MQogICAgbnVtX3Jvd3MgPSB4Lm51bWVsKCkgLy8gaW5wdXRfc2hhcGVbLTFdCiAgICBudW1fY29scyA9IGlucHV0X3NoYXBlWy0xXQoKICAgIGlmIG51bV9jb2xzID09IDA6CiAgICAgICAgb3V0cHV0X3NoYXBlID0gaW5wdXRfc2hhcGVbOi0xXQogICAgICAgIHJldHVybiB0b3JjaC5mdWxsKG91dHB1dF9zaGFwZSwgZmxvYXQoJ25hbicpLCBkZXZpY2U9eC5kZXZpY2UsIGR0eXBlPXguZHR5cGUpCgogICAgYXNzZXJ0IHguaXNfY29udGlndW91cygpCiAgICAKICAgIG91dHB1dF9zaGFwZSA9IGlucHV0X3NoYXBlWzotMV0KICAgIG91dHB1dCA9IHRvcmNoLmVtcHR5KG91dHB1dF9zaGFwZSwgZGV2aWNlPXguZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDMyKSAKCiAgICBCTE9DS19DT0xTID0gdHJpdG9uLm5leHRfcG93ZXJfb2ZfMihtaW4obnVtX2NvbHMsIDEwMjQpKQogICAgZ3JpZCA9IChudW1fcm93cywpCgogICAgc3RyaWRlX2luX2NvbCA9IHguc3RyaWRlKC0xKQogICAgc3RyaWRlX2luX3JvdyA9IHguc3RyaWRlKC0yKSBpZiB4Lm5kaW0gPiAxIGVsc2UgbnVtX2NvbHMKCiAgICBtZWFuX2xhc3RfZGltX2tlcm5lbFtncmlkXSgKICAgICAgICB4LCBvdXRwdXQsCiAgICAgICAgbnVtX3Jvd3MsIG51bV9jb2xzLAogICAgICAgIHN0cmlkZV9pbl9yb3csIHN0cmlkZV9pbl9jb2wsCiAgICAgICAgQkxPQ0tfQ09MUz1CTE9DS19DT0xTCiAgICApCiAgICByZXR1cm4gb3V0cHV0LnRvKHguZHR5cGUpCgpAdHJpdG9uLmppdApkZWYgZ2F0aGVyX3Jvd3Nfa2VybmVsKAogICAgaW5wdXRfcHRyLCBpbmRpY2VzX3B0ciwgb3V0cHV0X3B0ciwKICAgIG51bV9vdXRwdXRfcm93cywgRF9jb2xzLAogICAgc3RyaWRlX2lucHV0X3Jvdywgc3RyaWRlX2lucHV0X2NvbCwKICAgIHN0cmlkZV9vdXRwdXRfcm93LCBzdHJpZGVfb3V0cHV0X2NvbCwKICAgIEJMT0NLX1NJWkVfUk9XX09VVDogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX0NPTDogdGwuY29uc3RleHByCik6CiAgICBwaWRfcm93X291dF9iYXNlID0gdGwucHJvZ3JhbV9pZCgwKQogICAgcGlkX2NvbF9iYXNlID0gdGwucHJvZ3JhbV9pZCgxKQoKICAgIG9mZnNfcm93X291dCA9IHBpZF9yb3dfb3V0X2Jhc2UgKiBCTE9DS19TSVpFX1JPV19PVVQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9ST1dfT1VUKQogICAgb2Zmc19jb2wgPSBwaWRfY29sX2Jhc2UgKiBCTE9DS19TSVpFX0NPTCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0NPTCkKCiAgICBtYXNrX3Jvd19vdXRfdmFsaWQgPSBvZmZzX3Jvd19vdXQgPCBudW1fb3V0cHV0X3Jvd3MKICAgIG1hc2tfY29sX3ZhbGlkID0gb2Zmc19jb2wgPCBEX2NvbHMKCiAgICBpbmRpY2VzX3RvX2dhdGhlciA9IHRsLmxvYWQoaW5kaWNlc19wdHIgKyBvZmZzX3Jvd19vdXQsIG1hc2s9bWFza19yb3dfb3V0X3ZhbGlkLCBvdGhlcj0wKQoKICAgIGlucHV0X3Jvd19zdGFydHMgPSBpbnB1dF9wdHIgKyBpbmRpY2VzX3RvX2dhdGhlcls6LCBOb25lXSAqIHN0cmlkZV9pbnB1dF9yb3cKICAgIGlucHV0X2VsZW1lbnRfcHRycyA9IGlucHV0X3Jvd19zdGFydHMgKyBvZmZzX2NvbFtOb25lLCA6XSAqIHN0cmlkZV9pbnB1dF9jb2wKICAgIAogICAgb3V0cHV0X3Jvd19zdGFydHMgPSBvdXRwdXRfcHRyICsgb2Zmc19yb3dfb3V0WzosIE5vbmVdICogc3RyaWRlX291dHB1dF9yb3cKICAgIG91dHB1dF9lbGVtZW50X3B0cnMgPSBvdXRwdXRfcm93X3N0YXJ0cyArIG9mZnNfY29sW05vbmUsIDpdICogc3RyaWRlX291dHB1dF9jb2wKICAgIAogICAgZmluYWxfbWFzayA9IG1hc2tfcm93X291dF92YWxpZFs6LCBOb25lXSAmIG1hc2tfY29sX3ZhbGlkW05vbmUsIDpdCiAgICAKICAgIGdhdGhlcmVkX2RhdGEgPSB0bC5sb2FkKGlucHV0X2VsZW1lbnRfcHRycywgbWFzaz1maW5hbF9tYXNrLCBvdGhlcj0wLjApCiAgICB0bC5zdG9yZShvdXRwdXRfZWxlbWVudF9wdHJzLCBnYXRoZXJlZF9kYXRhLCBtYXNrPWZpbmFsX21hc2spCgpkZWYgdHJpdG9uX2dhdGhlcl9yb3dzKGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLCBpbmRpY2VzOiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgIGFzc2VydCBpbnB1dF90ZW5zb3IubmRpbSA9PSAyIGFuZCBpbmRpY2VzLm5kaW0gPT0gMSwgImdhdGhlcl9yb3dzIGV4cGVjdHMgMkQgaW5wdXQgYW5kIDFEIGluZGljZXMiCiAgICBhc3NlcnQgaW5wdXRfdGVuc29yLmlzX2NvbnRpZ3VvdXMoKSBhbmQgaW5kaWNlcy5pc19jb250aWd1b3VzKCksICJJbnB1dHMgbXVzdCBiZSBjb250aWd1b3VzIgoKICAgIG51bV9pbnB1dF9yb3dzLCBEX2NvbHMgPSBpbnB1dF90ZW5zb3Iuc2hhcGUKICAgIG51bV9vdXRwdXRfcm93cyA9IGluZGljZXMubnVtZWwoKQoKICAgIG91dHB1dCA9IHRvcmNoLmVtcHR5KChudW1fb3V0cHV0X3Jvd3MsIERfY29scyksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCgogICAgQkxPQ0tfU0laRV9ST1dfT1VUID0gNjQKICAgIEJMT0NLX1NJWkVfQ09MID0gNjQKICAgIAogICAgZ3JpZCA9ICh0cml0b24uY2RpdihudW1fb3V0cHV0X3Jvd3MsIEJMT0NLX1NJWkVfUk9XX09VVCksIHRyaXRvbi5jZGl2KERfY29scywgQkxPQ0tfU0laRV9DT0wpKQoKICAgIGdhdGhlcl9yb3dzX2tlcm5lbFtncmlkXSgKICAgICAgICBpbnB1dF90ZW5zb3IsIGluZGljZXMsIG91dHB1dCwKICAgICAgICBudW1fb3V0cHV0X3Jvd3MsIERfY29scywKICAgICAgICBpbnB1dF90ZW5zb3Iuc3RyaWRlKDApLCBpbnB1dF90ZW5zb3Iuc3RyaWRlKDEpLAogICAgICAgIG91dHB1dC5zdHJpZGUoMCksIG91dHB1dC5zdHJpZGUoMSksCiAgICAgICAgQkxPQ0tfU0laRV9ST1dfT1VUPUJMT0NLX1NJWkVfUk9XX09VVCwgQkxPQ0tfU0laRV9DT0w9QkxPQ0tfU0laRV9DT0wKICAgICkKICAgIHJldHVybiBvdXRwdXQKCkB0cml0b24uaml0CmRlZiBzY2F0dGVyX2FkZF9yb3dzX2tlcm5lbCgKICAgIHZhbHVlc19wdHIsIGluZGljZXNfcHRyLCBvdXRwdXRfcHRyLAogICAgbnVtX3ZhbHVlX3Jvd3MsIERfY29scywKICAgIHN0cmlkZV92YWx1ZXNfcm93LCBzdHJpZGVfdmFsdWVzX2NvbCwKICAgIHN0cmlkZV9vdXRwdXRfcm93LCBzdHJpZGVfb3V0cHV0X2NvbCwKICAgIEJMT0NLX1NJWkVfUk9XX1ZBTDogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX0NPTDogdGwuY29uc3RleHByCik6CiAgICBwaWRfcm93X3ZhbF9iYXNlID0gdGwucHJvZ3JhbV9pZCgwKQogICAgcGlkX2NvbF9iYXNlID0gdGwucHJvZ3JhbV9pZCgxKQoKICAgIG9mZnNfcm93X3ZhbCA9IHBpZF9yb3dfdmFsX2Jhc2UgKiBCTE9DS19TSVpFX1JPV19WQUwgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9ST1dfVkFMKQogICAgb2Zmc19jb2wgPSBwaWRfY29sX2Jhc2UgKiBCTE9DS19TSVpFX0NPTCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0NPTCkKCiAgICBtYXNrX3Jvd192YWxfdmFsaWQgPSBvZmZzX3Jvd192YWwgPCBudW1fdmFsdWVfcm93cwogICAgbWFza19jb2xfdmFsaWQgPSBvZmZzX2NvbCA8IERfY29scwogICAgCiAgICB2YWx1ZXNfcm93X3N0YXJ0cyA9IHZhbHVlc19wdHIgKyBvZmZzX3Jvd192YWxbOiwgTm9uZV0gKiBzdHJpZGVfdmFsdWVzX3JvdwogICAgY3VycmVudF92YWx1ZXNfcHRycyA9IHZhbHVlc19yb3dfc3RhcnRzICsgb2Zmc19jb2xbTm9uZSwgOl0gKiBzdHJpZGVfdmFsdWVzX2NvbAogICAgCiAgICBsb2FkX21hc2sgPSBtYXNrX3Jvd192YWxfdmFsaWRbOiwgTm9uZV0gJiBtYXNrX2NvbF92YWxpZFtOb25lLCA6XQogICAgdmFsc190b19hZGQgPSB0bC5sb2FkKGN1cnJlbnRfdmFsdWVzX3B0cnMsIG1hc2s9bG9hZF9tYXNrLCBvdGhlcj0wLjApCgogICAgdGFyZ2V0X3Jvd19pbmRpY2VzID0gdGwubG9hZChpbmRpY2VzX3B0ciArIG9mZnNfcm93X3ZhbCwgbWFzaz1tYXNrX3Jvd192YWxfdmFsaWQsIG90aGVyPTApCgogICAgb3V0cHV0X3Jvd19zdGFydHMgPSBvdXRwdXRfcHRyICsgdGFyZ2V0X3Jvd19pbmRpY2VzWzosIE5vbmVdICogc3RyaWRlX291dHB1dF9yb3cKICAgIG91dHB1dF9hdG9taWNfcHRycyA9IG91dHB1dF9yb3dfc3RhcnRzICsgb2Zmc19jb2xbTm9uZSwgOl0gKiBzdHJpZGVfb3V0cHV0X2NvbAogICAgCiAgICB0bC5hdG9taWNfYWRkKG91dHB1dF9hdG9taWNfcHRycywgdmFsc190b19hZGQsIG1hc2s9bG9hZF9tYXNrKQoKZGVmIHRyaXRvbl9zY2F0dGVyX2FkZF9yb3dzKG91dHB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwgaW5kaWNlczogdG9yY2guVGVuc29yLCB2YWx1ZXM6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgb3V0cHV0X3RlbnNvci5uZGltID09IDIgYW5kIHZhbHVlcy5uZGltID09IDIgYW5kIGluZGljZXMubmRpbSA9PSAxCiAgICBhc3NlcnQgb3V0cHV0X3RlbnNvci5zaGFwZVsxXSA9PSB2YWx1ZXMuc2hhcGVbMV0sICJOdW1iZXIgb2YgY29sdW1ucyBtdXN0IG1hdGNoIGZvciBvdXRwdXQgYW5kIHZhbHVlcyIKICAgIGFzc2VydCBpbmRpY2VzLm51bWVsKCkgPT0gdmFsdWVzLnNoYXBlWzBdLCAiTnVtYmVyIG9mIGluZGljZXMgbXVzdCBtYXRjaCBudW1iZXIgb2Ygcm93cyBpbiB2YWx1ZXMiCiAgICBhc3NlcnQgKG91dHB1dF90ZW5zb3IuaXNfY29udGlndW91cygpIGFuZCBpbmRpY2VzLmlzX2NvbnRpZ3VvdXMoKSBhbmQgdmFsdWVzLmlzX2NvbnRpZ3VvdXMoKSksICJBbGwgdGVuc29ycyBtdXN0IGJlIGNvbnRpZ3VvdXMgZm9yIHRyaXRvbl9zY2F0dGVyX2FkZF9yb3dzIgoKICAgIG51bV92YWx1ZV9yb3dzLCBEX2NvbHMgPSB2YWx1ZXMuc2hhcGUKCiAgICBCTE9DS19TSVpFX1JPV19WQUwgPSA2NAogICAgQkxPQ0tfU0laRV9DT0wgPSA2NAogICAgCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KG51bV92YWx1ZV9yb3dzLCBCTE9DS19TSVpFX1JPV19WQUwpLCB0cml0b24uY2RpdihEX2NvbHMsIEJMT0NLX1NJWkVfQ09MKSkKCiAgICBzY2F0dGVyX2FkZF9yb3dzX2tlcm5lbFtncmlkXSgKICAgICAgICB2YWx1ZXMsIGluZGljZXMsIG91dHB1dF90ZW5zb3IsCiAgICAgICAgbnVtX3ZhbHVlX3Jvd3MsIERfY29scywKICAgICAgICB2YWx1ZXMuc3RyaWRlKDApLCB2YWx1ZXMuc3RyaWRlKDEpLAogICAgICAgIG91dHB1dF90ZW5zb3Iuc3RyaWRlKDApLCBvdXRwdXRfdGVuc29yLnN0cmlkZSgxKSwKICAgICAgICBCTE9DS19TSVpFX1JPV19WQUw9QkxPQ0tfU0laRV9ST1dfVkFMLCBCTE9DS19TSVpFX0NPTD1CTE9DS19TSVpFX0NPTAogICAgKQoKQHRyaXRvbi5qaXQKZGVmIHplcm9zX2tlcm5lbChvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKICAgIG9mZnNldHMgPSBibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnNldHMgPCBuX2VsZW1lbnRzCiAgICB6ZXJvc192YWwgPSB0bC56ZXJvcygoQkxPQ0tfU0laRSwpLCBkdHlwZT1vdXRwdXRfcHRyLmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZShvdXRwdXRfcHRyICsgb2Zmc2V0cywgemVyb3NfdmFsLCBtYXNrPW1hc2spCgpkZWYgdHJpdG9uX3plcm9zX2xpa2UoeF9wcm90b3R5cGU6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgb3V0cHV0ID0gdG9yY2guZW1wdHlfbGlrZSh4X3Byb3RvdHlwZSkKICAgIGlmIG5vdCBvdXRwdXQuaXNfY29udGlndW91cygpOgogICAgICAgIG91dHB1dCA9IG91dHB1dC5jb250aWd1b3VzKCkKCiAgICBuX2VsZW1lbnRzID0gb3V0cHV0Lm51bWVsKCkKICAgIEJMT0NLX1NJWkUgPSAxMDI0CiAgICBpZiBuX2VsZW1lbnRzID09IDA6IHJldHVybiBvdXRwdXQKICAgIAogICAgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiAgICB6ZXJvc19rZXJuZWxbZ3JpZF0ob3V0cHV0LCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFPUJMT0NLX1NJWkUpCiAgICByZXR1cm4gb3V0cHV0CgpkZWYgdHJpdG9uX3RvcGtfc3R1Yihwcm9iczogdG9yY2guVGVuc29yLCBrOiBpbnQsIGRpbTogaW50ID0gLTEsIHNvcnRlZDogYm9vbCA9IEZhbHNlKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICByZXR1cm4gdG9yY2gudG9wayhwcm9icywgaz1rLCBkaW09ZGltLCBzb3J0ZWQ9c29ydGVkKQoKZGVmIHRyaXRvbl9hcmdzb3J0X3N0dWIoeDogdG9yY2guVGVuc29yLCBkaW06IGludCA9IC0xLCBkZXNjZW5kaW5nOiBib29sID0gRmFsc2UpIC0+IHRvcmNoLlRlbnNvcjoKICAgIHJldHVybiB0b3JjaC5hcmdzb3J0KHgsIGRpbT1kaW0sIGRlc2NlbmRpbmc9ZGVzY2VuZGluZykKCmRlZiB0cml0b25fYmluY291bnRfc3R1Yih4OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IE9wdGlvbmFsW3RvcmNoLlRlbnNvcl09Tm9uZSwgbWlubGVuZ3RoOiBpbnQ9MCkgLT4gdG9yY2guVGVuc29yOgogICAgcmV0dXJuIHRvcmNoLmJpbmNvdW50KHgsIHdlaWdodHM9d2VpZ2h0cywgbWlubGVuZ3RoPW1pbmxlbmd0aCkKCmRlZiB0cml0b25fY3Vtc3VtX3N0dWIoeDogdG9yY2guVGVuc29yLCBkaW06IGludCkgLT4gdG9yY2guVGVuc29yOgogICAgcmV0dXJuIHRvcmNoLmN1bXN1bSh4LCBkaW09ZGltKQoKZGVmIGV4cGVydF9mZm5fd2l0aF9hbGxfdHJpdG9uKAogICAgeDogdG9yY2guVGVuc29yLCAKICAgIFdfZ2F0ZV90OiB0b3JjaC5UZW5zb3IsCiAgICBXX3VwX3Q6IHRvcmNoLlRlbnNvciwKICAgIFdfZG93bl90OiB0b3JjaC5UZW5zb3IKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAjV19nYXRlID0gdHJpdG9uX3RyYW5zcG9zZShXX2dhdGVfdCkKICAgIGdhdGVfaCA9IHRyaXRvbl9tYXRtdWwoeCwgV19nYXRlX3QpCgogICAgI1dfdXAgPSB0cml0b25fdHJhbnNwb3NlKFdfdXBfdCkKICAgIHVwX2ggPSB0cml0b25fbWF0bXVsKHgsIFdfdXBfdCkKICAgIAogICAgYWN0aXZhdGVkX2dhdGUgPSB0cml0b25fc2lsdShnYXRlX2gpCiAgICAKICAgIGZ1c2VkX2ggPSBhY3RpdmF0ZWRfZ2F0ZSAqIHVwX2gKICAgIAogICAgI1dfZG93biA9IHRyaXRvbl90cmFuc3Bvc2UoV19kb3duX3QpCiAgICBvdXQgPSB0cml0b25fbWF0bXVsKGZ1c2VkX2gsIFdfZG93bl90KQogICAgCiAgICByZXR1cm4gb3V0CgpkZWYgbW9lX2xheWVyX3dpdGhfYWxsX3RyaXRvbigKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLCAKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCAKICAgIGNvbmZpZzogRGljdAopIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgRGljdF06CiAgICBicywgc2VxX2xlbiwgZF9oaWRkZW4gPSBpbnB1dF90ZW5zb3Iuc2hhcGUKICAgIG51bV9yb3V0ZWRfZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICB0b3BfayA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAKICAgIGlucHV0X3RlbnNvcl9jID0gaW5wdXRfdGVuc29yLmNvbnRpZ3VvdXMoKQoKICAgIHNoYXJlZF9leHBlcnRfV19nYXRlX3QgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddCiAgICBzaGFyZWRfZXhwZXJ0X1dfdXBfdCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10KICAgIHNoYXJlZF9leHBlcnRfV19kb3duX3QgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddCiAgICAKICAgIHNoYXJlZF9vdXRwdXQgPSBleHBlcnRfZmZuX3dpdGhfYWxsX3RyaXRvbigKICAgICAgICBpbnB1dF90ZW5zb3JfYy52aWV3KC0xLCBkX2hpZGRlbiksCiAgICAgICAgc2hhcmVkX2V4cGVydF9XX2dhdGVfdCwgCiAgICAgICAgc2hhcmVkX2V4cGVydF9XX3VwX3QsIAogICAgICAgIHNoYXJlZF9leHBlcnRfV19kb3duX3QKICAgICkudmlldyhicywgc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgcm91dGVyX1dfZyA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXQogICAgcm91dGVyX1dfZ190cmFuc3Bvc2VkX2Zvcl9tYXRtdWwgPSB0cml0b25fdHJhbnNwb3NlKHJvdXRlcl9XX2cpCiAgICByb3V0ZXJfbG9naXRzX2ZsYXQgPSB0cml0b25fbWF0bXVsKGlucHV0X3RlbnNvcl9jLnZpZXcoLTEsIGRfaGlkZGVuKSwgcm91dGVyX1dfZ190cmFuc3Bvc2VkX2Zvcl9tYXRtdWwpCiAgICByb3V0ZXJfbG9naXRzID0gcm91dGVyX2xvZ2l0c19mbGF0LnZpZXcoYnMsIHNlcV9sZW4sIG51bV9yb3V0ZWRfZXhwZXJ0cykKCiAgICByb3V0ZXJfcHJvYnNfZmxvYXQzMiA9IHRyaXRvbl9zb2Z0bWF4KHJvdXRlcl9sb2dpdHMudG8odG9yY2guZmxvYXQzMiksIGRpbT0tMSkKICAgIHJvdXRlcl9wcm9icyA9IHJvdXRlcl9wcm9ic19mbG9hdDMyLnRvKGlucHV0X3RlbnNvcl9jLmR0eXBlKQoKICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0cml0b25fdG9wa19zdHViKHJvdXRlcl9wcm9icywgaz10b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgeF9mbGF0ID0gaW5wdXRfdGVuc29yX2MudmlldygtMSwgZF9oaWRkZW4pCiAgICBudW1fdG9rZW5zID0geF9mbGF0LnNoYXBlWzBdCgogICAgZXhwZXJ0X2luZGljZXNfZmxhdCA9IHRvcGtfaW5kaWNlcy52aWV3KC0xKQogICAgZXhwZXJ0X3Njb3Jlc19mbGF0ID0gdG9wa19zY29yZXMudmlldygtMSwgMSkKCiAgICBvcmlnaW5hbF90b2tlbl9pZHhfZXhwYW5kZWQgPSB0b3JjaC5hcmFuZ2UobnVtX3Rva2VucywgZGV2aWNlPWlucHV0X3RlbnNvcl9jLmRldmljZSwgZHR5cGU9dG9yY2gubG9uZykKICAgIG9yaWdpbmFsX3Rva2VuX2lkeF9leHBhbmRlZCA9IG9yaWdpbmFsX3Rva2VuX2lkeF9leHBhbmRlZC51bnNxdWVlemUoMSkuZXhwYW5kKC0xLCB0b3BfaykucmVzaGFwZSgtMSkKICAgIAogICAgcGVybSA9IHRyaXRvbl9hcmdzb3J0X3N0dWIoZXhwZXJ0X2luZGljZXNfZmxhdCwgZGltPS0xLCBkZXNjZW5kaW5nPUZhbHNlKQogICAgCiAgICBzb3J0ZWRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlc19mbGF0W3Blcm1dLmNvbnRpZ3VvdXMoKSAKICAgIHNvcnRlZF90b2tlbl9pbmRpY2VzID0gb3JpZ2luYWxfdG9rZW5faWR4X2V4cGFuZGVkW3Blcm1dLmNvbnRpZ3VvdXMoKQogICAgc29ydGVkX3Njb3JlcyA9IGV4cGVydF9zY29yZXNfZmxhdFtwZXJtXS5jb250aWd1b3VzKCkKICAgIAogICAgYmF0Y2hlZF9leHBlcnRfaW5wdXRzID0gdHJpdG9uX2dhdGhlcl9yb3dzKHhfZmxhdCwgc29ydGVkX3Rva2VuX2luZGljZXMpCgogICAgZXhwZXJ0X2NvdW50cyA9IHRyaXRvbl9iaW5jb3VudF9zdHViKHNvcnRlZF9leHBlcnRfaW5kaWNlcywgbWlubGVuZ3RoPW51bV9yb3V0ZWRfZXhwZXJ0cykKCiAgICB6ZXJvX29mZnNldCA9IHRvcmNoLnRlbnNvcihbMF0sIGRldmljZT1pbnB1dF90ZW5zb3JfYy5kZXZpY2UsIGR0eXBlPXRvcmNoLmxvbmcpCiAgICBjdW1zdW1fY291bnRzID0gdHJpdG9uX2N1bXN1bV9zdHViKGV4cGVydF9jb3VudHMsIGRpbT0wKQogICAgZXhwZXJ0X29mZnNldHMgPSB0b3JjaC5jYXQoW3plcm9fb2Zmc2V0LCBjdW1zdW1fY291bnRzWzotMV1dKQoKICAgIGJhdGNoZWRfZXhwZXJ0X291dHB1dHMgPSB0cml0b25femVyb3NfbGlrZShiYXRjaGVkX2V4cGVydF9pbnB1dHMpCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX3JvdXRlZF9leHBlcnRzKToKICAgICAgICBzdGFydF9vZmZzZXQgPSBleHBlcnRfb2Zmc2V0c1tpXS5pdGVtKCkKICAgICAgICBudW1fYXNzaWdubWVudHNfZm9yX2V4cGVydCA9IGV4cGVydF9jb3VudHNbaV0uaXRlbSgpCgogICAgICAgIGlmIG51bV9hc3NpZ25tZW50c19mb3JfZXhwZXJ0ID09IDA6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGVuZF9vZmZzZXQgPSBzdGFydF9vZmZzZXQgKyBudW1fYXNzaWdubWVudHNfZm9yX2V4cGVydAogICAgICAgIGN1cnJlbnRfZXhwZXJ0X2lucHV0X2JhdGNoID0gYmF0Y2hlZF9leHBlcnRfaW5wdXRzLm5hcnJvdygwLCBzdGFydF9vZmZzZXQsIG51bV9hc3NpZ25tZW50c19mb3JfZXhwZXJ0KQoKICAgICAgICBleHBfV19nYXRlX3QgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgICAgIGV4cF9XX3VwX3QgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAgICAgZXhwX1dfZG93bl90ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KCiAgICAgICAgZXhwZXJ0X291dHB1dF9mb3JfYmF0Y2ggPSBleHBlcnRfZmZuX3dpdGhfYWxsX3RyaXRvbigKICAgICAgICAgICAgY3VycmVudF9leHBlcnRfaW5wdXRfYmF0Y2gsCiAgICAgICAgICAgIGV4cF9XX2dhdGVfdCwKICAgICAgICAgICAgZXhwX1dfdXBfdCwKICAgICAgICAgICAgZXhwX1dfZG93bl90CiAgICAgICAgKQogICAgICAgIGJhdGNoZWRfZXhwZXJ0X291dHB1dHMubmFycm93KDAsIHN0YXJ0X29mZnNldCwgbnVtX2Fzc2lnbm1lbnRzX2Zvcl9leHBlcnQpLmNvcHlfKGV4cGVydF9vdXRwdXRfZm9yX2JhdGNoKQogICAgCiAgICB3ZWlnaHRlZF9leHBlcnRfb3V0cHV0cyA9IGJhdGNoZWRfZXhwZXJ0X291dHB1dHMqc29ydGVkX3Njb3JlcwogICAgCiAgICBmaW5hbF9yb3V0ZWRfb3V0cHV0X2ZsYXQgPSB0cml0b25femVyb3NfbGlrZSh4X2ZsYXQpCiAgICAKICAgIHRyaXRvbl9zY2F0dGVyX2FkZF9yb3dzKGZpbmFsX3JvdXRlZF9vdXRwdXRfZmxhdCwgc29ydGVkX3Rva2VuX2luZGljZXMsIHdlaWdodGVkX2V4cGVydF9vdXRwdXRzKQogICAgCiAgICByb3V0ZWRfb3V0cHV0ID0gZmluYWxfcm91dGVkX291dHB1dF9mbGF0LnZpZXcoYnMsIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICBvdXRwdXRfdGVuc29yID0gcm91dGVkX291dHB1dCtzaGFyZWRfb3V0cHV0CgogICAgYXV4X2RhdGEgPSB7fQogICAgYXV4X2RhdGFbJ3JvdXRlcl9wcm9icyddID0gcm91dGVyX3Byb2JzCiAgICBhdXhfZGF0YVsncm91dGVyX2xvZ2l0cyddID0gcm91dGVyX2xvZ2l0cwoKICAgIHJvdXRlcl96X2xvc3NfY29lZiA9IGNvbmZpZy5nZXQoInJvdXRlcl96X2xvc3NfY29lZiIsIDAuMDAxKQogICAgcm91dGVyX2xvZ2l0c19mbGF0X2Zvcl9sb3NzID0gcm91dGVyX2xvZ2l0cy52aWV3KC0xLCBudW1fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIGxvZ196ID0gdHJpdG9uX2xvZ3N1bWV4cChyb3V0ZXJfbG9naXRzX2ZsYXRfZm9yX2xvc3MudG8odG9yY2guZmxvYXQzMiksIGRpbT0tMSkKICAgIAogICAgbG9nX3pfc3F1YXJlZCA9IGxvZ196ICogbG9nX3oKICAgIG1lYW5fbG9nX3pfc3F1YXJlZCA9IHRyaXRvbl9tZWFuX2FsbChsb2dfel9zcXVhcmVkKQogICAgcm91dGVyX3pfbG9zcyA9IHJvdXRlcl96X2xvc3NfY29lZiAqIG1lYW5fbG9nX3pfc3F1YXJlZCAKICAgIGF1eF9kYXRhWydyb3V0ZXJfel9sb3NzJ10gPSByb3V0ZXJfel9sb3NzLnRvKGlucHV0X3RlbnNvcl9jLmR0eXBlKQoKICAgIGF2Z19yb3V0ZXJfcHJvYnNfcGVyX2V4cGVydCA9IHRvcmNoLm1lYW4ocm91dGVyX3Byb2JzLCBkaW09KDAsMSkpCgogICAgaWYgKG51bV90b2tlbnMgKiB0b3BfaykgPiAwOgogICAgICAgIGZyYWN0aW9uX3Rva2Vuc19wZXJfZXhwZXJ0ID0gZXhwZXJ0X2NvdW50cy50byh0b3JjaC5mbG9hdDMyKSAvIChudW1fdG9rZW5zICogdG9wX2spCiAgICBlbHNlOgogICAgICAgIGZyYWN0aW9uX3Rva2Vuc19wZXJfZXhwZXJ0ID0gdHJpdG9uX3plcm9zX2xpa2UoZXhwZXJ0X2NvdW50cykudG8odG9yY2guZmxvYXQzMikKCiAgICBsb2FkX2JhbGFuY2VfbG9zc19jb2VmID0gY29uZmlnLmdldCgibG9hZF9iYWxhbmNlX2xvc3NfY29lZiIsIDAuMDEpCiAgICBwcm9kX2Zvcl9sYiA9IGF2Z19yb3V0ZXJfcHJvYnNfcGVyX2V4cGVydC50byh0b3JjaC5mbG9hdDMyKSAqIGZyYWN0aW9uX3Rva2Vuc19wZXJfZXhwZXJ0CiAgICBzdW1fcHJvZF9mb3JfbGIgPSB0cml0b25fc3VtX2FsbChwcm9kX2Zvcl9sYikKICAgIAogICAgbG9hZF9iYWxhbmNpbmdfbG9zcyA9IGxvYWRfYmFsYW5jZV9sb3NzX2NvZWYgKiBudW1fcm91dGVkX2V4cGVydHMgKiBzdW1fcHJvZF9mb3JfbGIKICAgIGF1eF9kYXRhWydsb2FkX2JhbGFuY2luZ19sb3NzJ10gPSBsb2FkX2JhbGFuY2luZ19sb3NzLnRvKGlucHV0X3RlbnNvcl9jLmR0eXBlKQoKICAgIGF1eF9kYXRhWydleHBlcnRfYXNzaWdubWVudF9jb3VudHMnXSA9IGV4cGVydF9jb3VudHMKICAgIGF1eF9kYXRhWydhdmdfcm91dGVyX3Byb2JzX3Blcl9leHBlcnRfc3RhdCddID0gYXZnX3JvdXRlcl9wcm9ic19wZXJfZXhwZXJ0IAogICAgYXV4X2RhdGFbJ2ZyYWN0aW9uX3Rva2Vuc19wZXJfZXhwZXJ0X3N0YXQnXSA9IGZyYWN0aW9uX3Rva2Vuc19wZXJfZXhwZXJ0CgogICAgcmV0dXJuIG91dHB1dF90ZW5zb3IKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBTdWJtaXNzaW9uIHRlbXBsYXRlIGZvciBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIGRldiA9IGlucHV0X3RlbnNvci5kZXZpY2UKICAgIGZvciBrX3cgaW4gd2VpZ2h0czoKICAgICAgICBpZiBpc2luc3RhbmNlKHdlaWdodHNba193XSwgdG9yY2guVGVuc29yKToKICAgICAgICAgICAgd2VpZ2h0c1trX3ddID0gd2VpZ2h0c1trX3ddLnRvKGRldikKICAgICAgICAgICAgaWYgbm90IHdlaWdodHNba193XS5pc19jb250aWd1b3VzKCk6CiAgICAgICAgICAgICAgICAgd2VpZ2h0c1trX3ddID0gd2VpZ2h0c1trX3ddLmNvbnRpZ3VvdXMoKQoKICAgIHJldHVybiBtb2VfbGF5ZXJfd2l0aF9hbGxfdHJpdG9uKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnKQ==

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Best evidence level for this revision: reported

JSON