amd-mixture-of-experts · submission 28903
KernelBot user 252 · 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.
group_gemm.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-28903?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:02552ce6ba9950dfd2ed77947f5e43858f039f49d605d42f9e3b4ef22c3b2eed
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
group_gemm.py1 lines
ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpkZWYgaXNfY3VkYSgpOgogICAgcmV0dXJuIHRyaXRvbi5ydW50aW1lLmRyaXZlci5hY3RpdmUuZ2V0X2N1cnJlbnRfdGFyZ2V0KCkuYmFja2VuZCA9PSAiY3VkYSIKCmRlZiBudW1fc21zKCk6CiAgICBpZiBpc19jdWRhKCk6CiAgICAgICAgcmV0dXJuIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9wcm9wZXJ0aWVzKCJjdWRhIikubXVsdGlfcHJvY2Vzc29yX2NvdW50CiAgICByZXR1cm4gMTQ4CgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDg0LAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiAxMjgsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiA4NCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDEyOCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDY0LAogICAgICAgICAgICAnTlVNX1NNJzogbnVtX3NtcygpLAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiA2NCwKICAgICAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKSwKICAgICAgICB9KSwKICAgIF0sCiAgICBrZXk9Wydncm91cF9zaXplJ10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwZWRfbWF0bXVsX2tlcm5lbCgKICAgICMgZGV2aWNlIHRlbnNvciBvZiBtYXRyaWNlcyBwb2ludGVycwogICAgZ3JvdXBfYV9wdHJzLAogICAgZ3JvdXBfYl9wdHJzLAogICAgZ3JvdXBfY19wdHJzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGdlbW0gc2l6ZXMuIGl0cyBzaGFwZSBpcyBbZ3JvdXBfc2l6ZSwgM10KICAgICMgZGltIDAgaXMgZ3JvdXBfc2l6ZSwgZGltIDEgaXMgdGhlIHZhbHVlcyBvZiA8TSwgTiwgSz4gb2YgZWFjaCBnZW1tCiAgICBncm91cF9nZW1tX3NpemVzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGxlYWRpbmcgZGltZW5zaW9uIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPGxkYSwgbGRiLCBsZGM+IG9mIGVhY2ggZ2VtbQogICAgZ19sZHMsCiAgICAjIG51bWJlciBvZiBnZW1tcwogICAgZ3JvdXBfc2l6ZSwKICAgICMgbnVtYmVyIG9mIHZpcnR1YWwgU00KICAgIE5VTV9TTTogdGwuY29uc3RleHByLAogICAgIyB0aWxlIHNpemVzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCik6CiAgICByIiIiCiAgICBUaGlzIGlzIHRha2VuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSB0cml0b24gdHV0b3JpYWwuIAogICAgICAtIGFkZHMgbWFza2luZyB0byBnZXQgd29ya2luZyB3aXRoIGRpZmZlcmVudCBzaGFwZXMuCiAgICAiIiIKICAgIHRpbGVfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgbGFzdF9wcm9ibGVtX2VuZCA9IDAKICAgIGZvciBnIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgICMgZ2V0IHRoZSBnZW1tIHNpemUgb2YgdGhlIGN1cnJlbnQgcHJvYmxlbQogICAgICAgIGdtID0gdGwubG9hZChncm91cF9nZW1tX3NpemVzICsgZyAqIDMpCiAgICAgICAgZ24gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDEpCiAgICAgICAgZ2sgPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDIpCiAgICAgICAgbnVtX21fdGlsZXMgPSB0bC5jZGl2KGdtLCBCTE9DS19TSVpFX00pCiAgICAgICAgbnVtX25fdGlsZXMgPSB0bC5jZGl2KGduLCBCTE9DS19TSVpFX04pCiAgICAgICAgbnVtX3RpbGVzID0gbnVtX21fdGlsZXMgKiBudW1fbl90aWxlcwogICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHRoZSB0aWxlcyBpbiB0aGUgY3VycmVudCBnZW1tIHByb2JsZW0KICAgICAgICB3aGlsZSAodGlsZV9pZHggPj0gbGFzdF9wcm9ibGVtX2VuZCBhbmQgdGlsZV9pZHggPCBsYXN0X3Byb2JsZW1fZW5kICsgbnVtX3RpbGVzKToKICAgICAgICAgICAgIyBwaWNrIHVwIGEgdGlsZSBmcm9tIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgICAgICBrID0gZ2sKICAgICAgICAgICAgbGRhID0gdGwubG9hZChnX2xkcyArIGcgKiAzKQogICAgICAgICAgICBsZGIgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAxKQogICAgICAgICAgICBsZGMgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAyKQogICAgICAgICAgICBhX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYV9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBiX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYl9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBjX3B0ciA9IHRsLmxvYWQoZ3JvdXBfY19wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgdGlsZSBjb29yZGluYXRlcwogICAgICAgICAgICB0aWxlX2lkeF9pbl9nZW1tID0gdGlsZV9pZHggLSBsYXN0X3Byb2JsZW1fZW5kCiAgICAgICAgICAgIHRpbGVfbV9pZHggPSB0aWxlX2lkeF9pbl9nZW1tIC8vIG51bV9uX3RpbGVzCiAgICAgICAgICAgIHRpbGVfbl9pZHggPSB0aWxlX2lkeF9pbl9nZW1tICUgbnVtX25fdGlsZXMKCiAgICAgICAgICAgICMgZG8gcmVndWxhciBnZW1tIGhlcmUKICAgICAgICAgICAgb2Zmc19hbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2JuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiAgICAgICAgICAgIGFfcHRycyA9IGFfcHRyICsgb2Zmc19hbVs6LCBOb25lXSAqIGxkYSArIG9mZnNfa1tOb25lLCA6XQogICAgICAgICAgICBiX3B0cnMgPSBiX3B0ciArIG9mZnNfa1s6LCBOb25lXSAqIGxkYiArIG9mZnNfYm5bTm9uZSwgOl0KICAgICAgICAgICAgCiAgICAgICAgICAgIG1fbWFzayA9IG9mZnNfYW0gPCBnbQogICAgICAgICAgICBuX21hc2sgPSBvZmZzX2JuIDwgZ24KICAgICAgICAgICAgCiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKICAgICAgICAgICAgZm9yIGtrIGluIHJhbmdlKDAsIHRsLmNkaXYoaywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICAgICAjIGhpbnQgdG8gVHJpdG9uIGNvbXBpbGVyIHRvIGRvIHByb3BlciBsb29wIHBpcGVsaW5pbmcKICAgICAgICAgICAgICAgICN0bC5tdWx0aXBsZV9vZihhX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgI3RsLm11bHRpcGxlX29mKGJfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGtfbWFzayA9IGtrICsgb2Zmc19rIDwgZ2sKICAgICAgICAgICAgICAgIGFfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQga19tYXNrW05vbmUsIDpdCiAgICAgICAgICAgICAgICBiX21hc2sgPSBrX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9YV9tYXNrKQogICAgICAgICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKQogICAgICAgICAgICAgICAgYV9wdHJzICs9IEJMT0NLX1NJWkVfSwogICAgICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIGxkYgogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKCiAgICAgICAgICAgIG9mZnNfY20gPSB0aWxlX21faWR4ICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICAgICAgb2Zmc19jbiA9IHRpbGVfbl9pZHggKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgICAgICAgICBjX3B0cnMgPSBjX3B0ciArIGxkYyAqIG9mZnNfY21bOiwgTm9uZV0gKyBvZmZzX2NuW05vbmUsIDpdCgogICAgICAgICAgICBjX21hc2sgPSBtX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKICAgICAgICAgICAgIyBnbyB0byB0aGUgbmV4dCB0aWxlIGJ5IGFkdmFuY2luZyBOVU1fU00KICAgICAgICAgICAgdGlsZV9pZHggKz0gTlVNX1NNCgogICAgICAgICMgZ2V0IHJlYWR5IHRvIGdvIHRvIHRoZSBuZXh0IGdlbW0gcHJvYmxlbQogICAgICAgIGxhc3RfcHJvYmxlbV9lbmQgPSBsYXN0X3Byb2JsZW1fZW5kICsgbnVtX3RpbGVzCgpkZWYgZ3JvdXBfZ2VtbV9mbihncm91cF9BOiBMaXN0W3RvcmNoLlRlbnNvcl0sIGdyb3VwX0I6IExpc3RbdG9yY2guVGVuc29yXSk6CiAgICBhc3NlcnQgbGVuKGdyb3VwX0EpID09IGxlbihncm91cF9CKQogICAgREVWSUNFID0gJ2N1ZGEnCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0EpCgogICAgQV9hZGRycyA9IFtdCiAgICBCX2FkZHJzID0gW10KICAgIENfYWRkcnMgPSBbXQogICAgZ19zaXplcyA9IFtdCiAgICBnX2xkcyA9IFtdCiAgICBncm91cF9DID0gW10KICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOiAgICAgICAgCiAgICAgICAgQSA9IGdyb3VwX0FbaV0KICAgICAgICBCID0gZ3JvdXBfQltpXQogICAgICAgIGFzc2VydCBBLnNoYXBlWzFdID09IEIuc2hhcGVbMF0KICAgICAgICBNLCBLID0gQS5zaGFwZQogICAgICAgIEssIE4gPSBCLnNoYXBlCiAgICAgICAgCiAgICAgICAgQyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPURFVklDRSwgZHR5cGU9QS5kdHlwZSkKICAgICAgICBncm91cF9DLmFwcGVuZChDKQogICAgICAgIEFfYWRkcnMuYXBwZW5kKEEuZGF0YV9wdHIoKSkKICAgICAgICBCX2FkZHJzLmFwcGVuZChCLmRhdGFfcHRyKCkpCiAgICAgICAgQ19hZGRycy5hcHBlbmQoQy5kYXRhX3B0cigpKQogICAgICAgIGdfc2l6ZXMgKz0gW00sIE4sIEtdCiAgICAgICAgZ19sZHMgKz0gW0Euc3RyaWRlKDApLCBCLnN0cmlkZSgwKSwgQy5zdHJpZGUoMCldCiAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgICMgd2UgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIENUQSwgYW5kIGl0J3MgYXV0by10dW5hYmxlCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChNRVRBWydOVU1fU00nXSwgKQogICAgZ3JvdXBlZF9tYXRtdWxfa2VybmVsW2dyaWRdKAogICAgICAgIGRfYV9wdHJzLAogICAgICAgIGRfYl9wdHJzLAogICAgICAgIGRfY19wdHJzLAogICAgICAgIGRfZ19zaXplcywKICAgICAgICBkX2dfbGRzLAogICAgICAgIGdyb3VwX3NpemUsCiAgICApCgogICAgcmV0dXJuIGdyb3VwX0MKCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKSAjIFRPRE86IHdoeSBtb3ZlIHRvIGNwdT8KICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bSgpCiAgICB0b2tlbl9pbmRpY2VzID0gaW5kaWNlcyAvLyBudW1fZXhwZXJ0c19wZXJfdG9rZW4KICAgIHJldHVybiBpbmRpY2VzLCB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwgdG9rZW5faW5kaWNlcwoKZGVmIGV4cGVydF9pbnB1dF9wZXJtdXRlKAogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludAopIC0+IExpc3RbdG9yY2guVGVuc29yXToKICAgIF8sIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZXhwZXJ0X2RhdGEgPSBbXQogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAjIHRyaXRvbiBncm91cCBnZW1tIG5lZWRzIGxlbihncm91cF9BKSA9PSBsZW4oZ3JvdXBfQiksCiAgICAgICAgICAgICMgYWRkaW5nIGFuIGVtcHR5IGxpc3QgaXMganVzdCBhIGhhY2sgdG8gZW5zdXJlIHRoZSBncm91cCBzaXplcyBhcmUgdGhlCiAgICAgICAgICAgICMgc2FtZS4gVGhpcyBjb3VsZC9zaG91bGQgYWxzbyBiZSBkb25lIGJ5IG5vdCBwYXNzaW5nIGluIHdlaWdodHMgaWYgdGhlCiAgICAgICAgICAgICMgY29ycmVzcG9uZGluZyBleHBlcnQgZ2V0cyBubyB0b2tlbnMuCiAgICAgICAgICAgIGV4cGVydF9kYXRhLmFwcGVuZCh0b3JjaC5lbXB0eSgoMCwgdG9rZW5zLnNpemUoLTEpKSkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIGV4cGVydF90b2tlbnMgPSB0b2tlbnNbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgZXhwZXJ0X2RhdGEuYXBwZW5kKGV4cGVydF90b2tlbnMpCiAgICAgICAgCiAgICByZXR1cm4gZXhwZXJ0X2RhdGEsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlCgpkZWYgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgZXhwZXJ0X2RhdGE6IExpc3RbdG9yY2guVGVuc29yXSwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIGV4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXRfc2hhcGU6IFR1cGxlW2ludF0KKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBoaWRkZW5fZGltID0gZXhwZXJ0X2RhdGFbMF0uc2l6ZSgtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfd2VpZ2h0cy52aWV3KC0xLCAxKQoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgb3V0cHV0ID0gdG9yY2guemVyb3Mob3V0cHV0X3NoYXBlLCBkZXZpY2U9ZXhwZXJ0X2RhdGFbMF0uZGV2aWNlLCBkdHlwZT1leHBlcnRfZGF0YVswXS5kdHlwZSkKICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlKToKICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2VbZXhwZXJ0X2lkIC0gMV0KICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAKICAgICAgICAjIG11bHRpcGx5IHRva2VuIGJ5IGJ5IGV4cGVydCB3ZWlnaHRzIGFuZCByZWR1Y2UKICAgICAgICBleHBlcnRfZGF0YVtleHBlcnRfaWRdLm11bF8oZmxhdF9leHBlcnRfd2VpZ2h0c1tpbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XV0pCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIG91dHB1dC5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCBoaWRkZW5fZGltKSwKICAgICAgICAgICAgZXhwZXJ0X2RhdGFbZXhwZXJ0X2lkXSwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQogICAgCiAgICByZXR1cm4gb3V0cHV0CgpAdG9yY2guY29tcGlsZQpjbGFzcyBHUlVTaGFyZWRFeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX2hpZGRlbiwgZF9leHBlcnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5XX2dhdGUgPSBubi5MaW5lYXIoZF9oaWRkZW4sIGRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihkX2hpZGRlbiwgZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoZF9leHBlcnQsIGRfaGlkZGVuLCBiaWFzPUZhbHNlKQogICAgICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeCk6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIHVwID0gc2VsZi5XX3VwKHgpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHVwKQogICAgICAgIHJldHVybiBvdXQKICAgIApjbGFzcyBHUlVSb3V0ZWRFeHBlcnRzKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtX2V4cGVydHMsIGRfaGlkZGVuLCBkX2V4cGVydCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkgIyBUT0RPOiBmdXNlIFNpTFUgd2l0aCBncm91cCBnZW1tCiAgICAgICAgCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ1dfZ2F0ZScsIHRvcmNoLmVtcHR5KG51bV9leHBlcnRzLCBkX2hpZGRlbiwgZF9leHBlcnQpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdXX3VwJywgdG9yY2guZW1wdHkobnVtX2V4cGVydHMsIGRfaGlkZGVuLCBkX2V4cGVydCkpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ1dfZG93bicsIHRvcmNoLmVtcHR5KG51bV9leHBlcnRzLCBkX2V4cGVydCwgZF9oaWRkZW4pKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGdyb3VwX3Rva2VuKToKICAgICAgICAjIFRPRE86IGFyZSB0aGVzZSBjb3BpZXMgb3IgYSBsaXN0IG9mIHZpZXdzPwogICAgICAgIGdyb3VwX2dhdGUgPSBbdyBmb3IgdyBpbiBzZWxmLldfZ2F0ZV0KICAgICAgICBncm91cF91cCA9IFt3IGZvciB3IGluIHNlbGYuV191cF0KICAgICAgICBncm91cF9kb3duID0gW3cgZm9yIHcgaW4gc2VsZi5XX2Rvd25dCiAgICAgICAgCiAgICAgICAgZ2F0ZSA9IFtzZWxmLmFjdF9mbih0KSBmb3IgdCBpbiBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VuLCBncm91cF9nYXRlKV0KICAgICAgICB1cCA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW4sIGdyb3VwX3VwKQogICAgICAgIGxocyA9IFt0X2dhdGUgKiB0X3VwIGZvciAodF9nYXRlLCB0X3VwKSBpbiB6aXAoZ2F0ZSwgdXApXQogICAgICAgIG91dCA9IGdyb3VwX2dlbW1fZm4obGhzLCBncm91cF9kb3duKQogICAgICAgIAogICAgICAgIHJldHVybiBvdXQKCkB0b3JjaC5jb21waWxlCmNsYXNzIE1vRUdhdGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1fZXhwZXJ0cywgZF9oaWRkZW4sIHRvcGspOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2sgPSB0b3BrCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0cyA9IG51bV9leHBlcnRzCiAgICAgICAgc2VsZi5kX2hpZGRlbiA9IGRfaGlkZGVuCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCiAgICAgICAgcmV0dXJuIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMKCmNsYXNzIE1vRUdyb3VwR0VNTShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV9leHBlcnRzLCBkX2V4cGVydCwgZF9oaWRkZW4sIHRvcGspOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wayA9IHRvcGsKICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBHUlVTaGFyZWRFeHBlcnQoZF9oaWRkZW4sIGRfZXhwZXJ0KQogICAgICAgIHNlbGYucm91dGVkX2V4cGVydHMgPSBHUlVSb3V0ZWRFeHBlcnRzKG51bV9leHBlcnRzLCBkX2hpZGRlbiwgZF9leHBlcnQpCiAgICAgICAgc2VsZi5yb3V0ZXIgPSBNb0VHYXRlKG51bV9leHBlcnRzLCBkX2hpZGRlbiwgc2VsZi50b3BrKQogICAgICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgdG9rZW5zKToKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZSA9IHRva2Vucy5zaXplKCkKICAgICAgICB0b2tlbnNfZmxhdCA9IHRva2Vucy52aWV3KC0xLCBoaWRkZW5fc2l6ZSkKICAgICAgICAKICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHRva2Vuc19mbGF0KQogICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzID0gc2VsZi5yb3V0ZXIodG9rZW5zX2ZsYXQpCiAgICAgICAgCiAgICAgICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgICAgICBncm91cF90b2tlbiwgXyA9IGV4cGVydF9pbnB1dF9wZXJtdXRlKHRva2Vuc19mbGF0LCBleHBlcnRfaW5kaWNlcywgc2VsZi50b3BrKQogICAgICAgIGdyb3VwX3Rva2VuID0gc2VsZi5yb3V0ZWRfZXhwZXJ0cyhncm91cF90b2tlbikKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gZXhwZXJ0X291dHB1dF9wZXJtdXRlKGdyb3VwX3Rva2VuLCBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3Jlcywgc2VsZi50b3BrLCB0b2tlbnNfZmxhdC5zaGFwZSkKICAgICAgICAKICAgICAgICBvdXRwdXQgPSBzaGFyZWRfb3V0cHV0ICsgcm91dGVkX291dHB1dAogICAgICAgIHJldHVybiBvdXRwdXQudmlldyhiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZSkKICAgICAgICAKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YSk6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgZF9leHBlcnQgPSBjb25maWdbImRfZXhwZXJ0Il0KICAgIGRfaGlkZGVuID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICB0b3BrID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgIG1vZSA9IE1vRUdyb3VwR0VNTShudW1fZXhwZXJ0cywgZF9leHBlcnQsIGRfaGlkZGVuLCB0b3BrKS5jdWRhKCkudG8odG9yY2guZmxvYXQxNikKCiAgICBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyk6CiAgICAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICAgICAjIHdlaWdodHMgbm90IHRyYW5zcG9zZWQsIHNpbmNlIG5vcm1hbCB0ZW5zb3IKICAgICAgICBtb2Uucm91dGVkX2V4cGVydHMuV19nYXRlW2ldID0gZ2F0ZV9wcm9qX3dlaWdodAogICAgICAgIG1vZS5yb3V0ZWRfZXhwZXJ0cy5XX3VwW2ldID0gdXBfcHJval93ZWlnaHQKICAgICAgICBtb2Uucm91dGVkX2V4cGVydHMuV19kb3duW2ldID0gZG93bl9wcm9qX3dlaWdodAogICAgCiAgICAjIFRyYW5zcG9zZSB0byBtYXRjaCBsYXlvdXQgZXhwZWN0ZWQgYnkgbGluZWFyCiAgICBtb2Uucm91dGVyLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKSkKCiAgICBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQoKICAgIHJldHVybiBvdXRwdXQKCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=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 amd-mixture-of-experts · submission 13030.
- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKQHRvcmNoLmNvbXBpbGUKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBkX2V4cGVydDogT3B0aW9uYWxbaW50XSA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0gaWYgZF9leHBlcnQgaXMgTm9uZSBlbHNlIGRfZXhwZXJ0CgogICAgICAgIHNlbGYuV19nYXRlID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX3VwID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBnYXRlID0gc2VsZi5hY3RfZm4oc2VsZi5XX2dhdGUoeCkpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHNlbGYuV191cCh4KSkKICAgICAgICByZXR1cm4gb3V0CgpAdG9yY2guY29tcGlsZQpjbGFzcyBNb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYubnVtX2V4cGVydHMsIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgbG9naXRzID0gc2VsZi5XX2coeCkKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwoKQHRvcmNoLmNvbXBpbGUKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnQoY29uZmlnKQogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0KGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgU3VibWlzc2lvbiB0ZW1wbGF0ZSBmb3IgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIHVzaW5nIFB5VG9yY2guCiAgICAKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX3NpemVdCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICBtb2UgPSBNb0UoY29uZmlnKQoKICAgICMgRmlsbCBpbiB0aGUgZ2l2ZW4gd2VpZ2h0cyBvZiB0aGUgbW9kZWwKICAgIG1vZS5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyk6CiAgICAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGdhdGVfcHJval93ZWlnaHQudCgpKQogICAgICAgIG1vZS5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Uuc2hhcmVkX2V4cGVydC5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQoKICAgIHJldHVybiBvdXRwdXQ=No newline at end of file+ ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpkZWYgaXNfY3VkYSgpOgogICAgcmV0dXJuIHRyaXRvbi5ydW50aW1lLmRyaXZlci5hY3RpdmUuZ2V0X2N1cnJlbnRfdGFyZ2V0KCkuYmFja2VuZCA9PSAiY3VkYSIKCmRlZiBudW1fc21zKCk6CiAgICBpZiBpc19jdWRhKCk6CiAgICAgICAgcmV0dXJuIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9wcm9wZXJ0aWVzKCJjdWRhIikubXVsdGlfcHJvY2Vzc29yX2NvdW50CiAgICByZXR1cm4gMTQ4CgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDg0LAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiAxMjgsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiA4NCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDEyOCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDY0LAogICAgICAgICAgICAnTlVNX1NNJzogbnVtX3NtcygpLAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiA2NCwKICAgICAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKSwKICAgICAgICB9KSwKICAgIF0sCiAgICBrZXk9Wydncm91cF9zaXplJ10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwZWRfbWF0bXVsX2tlcm5lbCgKICAgICMgZGV2aWNlIHRlbnNvciBvZiBtYXRyaWNlcyBwb2ludGVycwogICAgZ3JvdXBfYV9wdHJzLAogICAgZ3JvdXBfYl9wdHJzLAogICAgZ3JvdXBfY19wdHJzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGdlbW0gc2l6ZXMuIGl0cyBzaGFwZSBpcyBbZ3JvdXBfc2l6ZSwgM10KICAgICMgZGltIDAgaXMgZ3JvdXBfc2l6ZSwgZGltIDEgaXMgdGhlIHZhbHVlcyBvZiA8TSwgTiwgSz4gb2YgZWFjaCBnZW1tCiAgICBncm91cF9nZW1tX3NpemVzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGxlYWRpbmcgZGltZW5zaW9uIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPGxkYSwgbGRiLCBsZGM+IG9mIGVhY2ggZ2VtbQogICAgZ19sZHMsCiAgICAjIG51bWJlciBvZiBnZW1tcwogICAgZ3JvdXBfc2l6ZSwKICAgICMgbnVtYmVyIG9mIHZpcnR1YWwgU00KICAgIE5VTV9TTTogdGwuY29uc3RleHByLAogICAgIyB0aWxlIHNpemVzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCik6CiAgICByIiIiCiAgICBUaGlzIGlzIHRha2VuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSB0cml0b24gdHV0b3JpYWwuIAogICAgICAtIGFkZHMgbWFza2luZyB0byBnZXQgd29ya2luZyB3aXRoIGRpZmZlcmVudCBzaGFwZXMuCiAgICAiIiIKICAgIHRpbGVfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgbGFzdF9wcm9ibGVtX2VuZCA9IDAKICAgIGZvciBnIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgICMgZ2V0IHRoZSBnZW1tIHNpemUgb2YgdGhlIGN1cnJlbnQgcHJvYmxlbQogICAgICAgIGdtID0gdGwubG9hZChncm91cF9nZW1tX3NpemVzICsgZyAqIDMpCiAgICAgICAgZ24gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDEpCiAgICAgICAgZ2sgPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDIpCiAgICAgICAgbnVtX21fdGlsZXMgPSB0bC5jZGl2KGdtLCBCTE9DS19TSVpFX00pCiAgICAgICAgbnVtX25fdGlsZXMgPSB0bC5jZGl2KGduLCBCTE9DS19TSVpFX04pCiAgICAgICAgbnVtX3RpbGVzID0gbnVtX21fdGlsZXMgKiBudW1fbl90aWxlcwogICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHRoZSB0aWxlcyBpbiB0aGUgY3VycmVudCBnZW1tIHByb2JsZW0KICAgICAgICB3aGlsZSAodGlsZV9pZHggPj0gbGFzdF9wcm9ibGVtX2VuZCBhbmQgdGlsZV9pZHggPCBsYXN0X3Byb2JsZW1fZW5kICsgbnVtX3RpbGVzKToKICAgICAgICAgICAgIyBwaWNrIHVwIGEgdGlsZSBmcm9tIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgICAgICBrID0gZ2sKICAgICAgICAgICAgbGRhID0gdGwubG9hZChnX2xkcyArIGcgKiAzKQogICAgICAgICAgICBsZGIgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAxKQogICAgICAgICAgICBsZGMgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAyKQogICAgICAgICAgICBhX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYV9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBiX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYl9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBjX3B0ciA9IHRsLmxvYWQoZ3JvdXBfY19wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgdGlsZSBjb29yZGluYXRlcwogICAgICAgICAgICB0aWxlX2lkeF9pbl9nZW1tID0gdGlsZV9pZHggLSBsYXN0X3Byb2JsZW1fZW5kCiAgICAgICAgICAgIHRpbGVfbV9pZHggPSB0aWxlX2lkeF9pbl9nZW1tIC8vIG51bV9uX3RpbGVzCiAgICAgICAgICAgIHRpbGVfbl9pZHggPSB0aWxlX2lkeF9pbl9nZW1tICUgbnVtX25fdGlsZXMKCiAgICAgICAgICAgICMgZG8gcmVndWxhciBnZW1tIGhlcmUKICAgICAgICAgICAgb2Zmc19hbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2JuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiAgICAgICAgICAgIGFfcHRycyA9IGFfcHRyICsgb2Zmc19hbVs6LCBOb25lXSAqIGxkYSArIG9mZnNfa1tOb25lLCA6XQogICAgICAgICAgICBiX3B0cnMgPSBiX3B0ciArIG9mZnNfa1s6LCBOb25lXSAqIGxkYiArIG9mZnNfYm5bTm9uZSwgOl0KICAgICAgICAgICAgCiAgICAgICAgICAgIG1fbWFzayA9IG9mZnNfYW0gPCBnbQogICAgICAgICAgICBuX21hc2sgPSBvZmZzX2JuIDwgZ24KICAgICAgICAgICAgCiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKICAgICAgICAgICAgZm9yIGtrIGluIHJhbmdlKDAsIHRsLmNkaXYoaywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICAgICAjIGhpbnQgdG8gVHJpdG9uIGNvbXBpbGVyIHRvIGRvIHByb3BlciBsb29wIHBpcGVsaW5pbmcKICAgICAgICAgICAgICAgICN0bC5tdWx0aXBsZV9vZihhX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgI3RsLm11bHRpcGxlX29mKGJfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGtfbWFzayA9IGtrICsgb2Zmc19rIDwgZ2sKICAgICAgICAgICAgICAgIGFfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQga19tYXNrW05vbmUsIDpdCiAgICAgICAgICAgICAgICBiX21hc2sgPSBrX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9YV9tYXNrKQogICAgICAgICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKQogICAgICAgICAgICAgICAgYV9wdHJzICs9IEJMT0NLX1NJWkVfSwogICAgICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIGxkYgogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKCiAgICAgICAgICAgIG9mZnNfY20gPSB0aWxlX21faWR4ICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICAgICAgb2Zmc19jbiA9IHRpbGVfbl9pZHggKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgICAgICAgICBjX3B0cnMgPSBjX3B0ciArIGxkYyAqIG9mZnNfY21bOiwgTm9uZV0gKyBvZmZzX2NuW05vbmUsIDpdCgogICAgICAgICAgICBjX21hc2sgPSBtX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKICAgICAgICAgICAgIyBnbyB0byB0aGUgbmV4dCB0aWxlIGJ5IGFkdmFuY2luZyBOVU1fU00KICAgICAgICAgICAgdGlsZV9pZHggKz0gTlVNX1NNCgogICAgICAgICMgZ2V0IHJlYWR5IHRvIGdvIHRvIHRoZSBuZXh0IGdlbW0gcHJvYmxlbQogICAgICAgIGxhc3RfcHJvYmxlbV9lbmQgPSBsYXN0X3Byb2JsZW1fZW5kICsgbnVtX3RpbGVzCgpkZWYgZ3JvdXBfZ2VtbV9mbihncm91cF9BOiBMaXN0W3RvcmNoLlRlbnNvcl0sIGdyb3VwX0I6IExpc3RbdG9yY2guVGVuc29yXSk6CiAgICBhc3NlcnQgbGVuKGdyb3VwX0EpID09IGxlbihncm91cF9CKQogICAgREVWSUNFID0gJ2N1ZGEnCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0EpCgogICAgQV9hZGRycyA9IFtdCiAgICBCX2FkZHJzID0gW10KICAgIENfYWRkcnMgPSBbXQogICAgZ19zaXplcyA9IFtdCiAgICBnX2xkcyA9IFtdCiAgICBncm91cF9DID0gW10KICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOiAgICAgICAgCiAgICAgICAgQSA9IGdyb3VwX0FbaV0KICAgICAgICBCID0gZ3JvdXBfQltpXQogICAgICAgIGFzc2VydCBBLnNoYXBlWzFdID09IEIuc2hhcGVbMF0KICAgICAgICBNLCBLID0gQS5zaGFwZQogICAgICAgIEssIE4gPSBCLnNoYXBlCiAgICAgICAgCiAgICAgICAgQyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPURFVklDRSwgZHR5cGU9QS5kdHlwZSkKICAgICAgICBncm91cF9DLmFwcGVuZChDKQogICAgICAgIEFfYWRkcnMuYXBwZW5kKEEuZGF0YV9wdHIoKSkKICAgICAgICBCX2FkZHJzLmFwcGVuZChCLmRhdGFfcHRyKCkpCiAgICAgICAgQ19hZGRycy5hcHBlbmQoQy5kYXRhX3B0cigpKQogICAgICAgIGdfc2l6ZXMgKz0gW00sIE4sIEtdCiAgICAgICAgZ19sZHMgKz0gW0Euc3RyaWRlKDApLCBCLnN0cmlkZSgwKSwgQy5zdHJpZGUoMCldCiAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgICMgd2UgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIENUQSwgYW5kIGl0J3MgYXV0by10dW5hYmxlCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChNRVRBWydOVU1fU00nXSwgKQogICAgZ3JvdXBlZF9tYXRtdWxfa2VybmVsW2dyaWRdKAogICAgICAgIGRfYV9wdHJzLAogICAgICAgIGRfYl9wdHJzLAogICAgICAgIGRfY19wdHJzLAogICAgICAgIGRfZ19zaXplcywKICAgICAgICBkX2dfbGRzLAogICAgICAgIGdyb3VwX3NpemUsCiAgICApCgogICAgcmV0dXJuIGdyb3VwX0MKCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKSAjIFRPRE86IHdoeSBtb3ZlIHRvIGNwdT8KICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bSgpCiAgICB0b2tlbl9pbmRpY2VzID0gaW5kaWNlcyAvLyBudW1fZXhwZXJ0c19wZXJfdG9rZW4KICAgIHJldHVybiBpbmRpY2VzLCB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwgdG9rZW5faW5kaWNlcwoKZGVmIGV4cGVydF9pbnB1dF9wZXJtdXRlKAogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludAopIC0+IExpc3RbdG9yY2guVGVuc29yXToKICAgIF8sIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZXhwZXJ0X2RhdGEgPSBbXQogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAjIHRyaXRvbiBncm91cCBnZW1tIG5lZWRzIGxlbihncm91cF9BKSA9PSBsZW4oZ3JvdXBfQiksCiAgICAgICAgICAgICMgYWRkaW5nIGFuIGVtcHR5IGxpc3QgaXMganVzdCBhIGhhY2sgdG8gZW5zdXJlIHRoZSBncm91cCBzaXplcyBhcmUgdGhlCiAgICAgICAgICAgICMgc2FtZS4gVGhpcyBjb3VsZC9zaG91bGQgYWxzbyBiZSBkb25lIGJ5IG5vdCBwYXNzaW5nIGluIHdlaWdodHMgaWYgdGhlCiAgICAgICAgICAgICMgY29ycmVzcG9uZGluZyBleHBlcnQgZ2V0cyBubyB0b2tlbnMuCiAgICAgICAgICAgIGV4cGVydF9kYXRhLmFwcGVuZCh0b3JjaC5lbXB0eSgoMCwgdG9rZW5zLnNpemUoLTEpKSkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIGV4cGVydF90b2tlbnMgPSB0b2tlbnNbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgZXhwZXJ0X2RhdGEuYXBwZW5kKGV4cGVydF90b2tlbnMpCiAgICAgICAgCiAgICByZXR1cm4gZXhwZXJ0X2RhdGEsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlCgpkZWYgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgZXhwZXJ0X2RhdGE6IExpc3RbdG9yY2guVGVuc29yXSwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIGV4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXRfc2hhcGU6IFR1cGxlW2ludF0KKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBoaWRkZW5fZGltID0gZXhwZXJ0X2RhdGFbMF0uc2l6ZSgtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfd2VpZ2h0cy52aWV3KC0xLCAxKQoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgb3V0cHV0ID0gdG9yY2guemVyb3Mob3V0cHV0X3NoYXBlLCBkZXZpY2U9ZXhwZXJ0X2RhdGFbMF0uZGV2aWNlLCBkdHlwZT1leHBlcnRfZGF0YVswXS5kdHlwZSkKICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlKToKICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2VbZXhwZXJ0X2lkIC0gMV0KICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAKICAgICAgICAjIG11bHRpcGx5IHRva2VuIGJ5IGJ5IGV4cGVydCB3ZWlnaHRzIGFuZCByZWR1Y2UKICAgICAgICBleHBlcnRfZGF0YVtleHBlcnRfaWRdLm11bF8oZmxhdF9leHBlcnRfd2VpZ2h0c1tpbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XV0pCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIG91dHB1dC5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCBoaWRkZW5fZGltKSwKICAgICAgICAgICAgZXhwZXJ0X2RhdGFbZXhwZXJ0X2lkXSwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQogICAgCiAgICByZXR1cm4gb3V0cHV0CgpAdG9yY2guY29tcGlsZQpjbGFzcyBHUlVTaGFyZWRFeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX2hpZGRlbiwgZF9leHBlcnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5XX2dhdGUgPSBubi5MaW5lYXIoZF9oaWRkZW4sIGRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihkX2hpZGRlbiwgZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoZF9leHBlcnQsIGRfaGlkZGVuLCBiaWFzPUZhbHNlKQogICAgICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeCk6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIHVwID0gc2VsZi5XX3VwKHgpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHVwKQogICAgICAgIHJldHVybiBvdXQKICAgIApjbGFzcyBHUlVSb3V0ZWRFeHBlcnRzKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtX2V4cGVydHMsIGRfaGlkZGVuLCBkX2V4cGVydCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkgIyBUT0RPOiBmdXNlIFNpTFUgd2l0aCBncm91cCBnZW1tCiAgICAgICAgCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ1dfZ2F0ZScsIHRvcmNoLmVtcHR5KG51bV9leHBlcnRzLCBkX2hpZGRlbiwgZF9leHBlcnQpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdXX3VwJywgdG9yY2guZW1wdHkobnVtX2V4cGVydHMsIGRfaGlkZGVuLCBkX2V4cGVydCkpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ1dfZG93bicsIHRvcmNoLmVtcHR5KG51bV9leHBlcnRzLCBkX2V4cGVydCwgZF9oaWRkZW4pKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGdyb3VwX3Rva2VuKToKICAgICAgICAjIFRPRE86IGFyZSB0aGVzZSBjb3BpZXMgb3IgYSBsaXN0IG9mIHZpZXdzPwogICAgICAgIGdyb3VwX2dhdGUgPSBbdyBmb3IgdyBpbiBzZWxmLldfZ2F0ZV0KICAgICAgICBncm91cF91cCA9IFt3IGZvciB3IGluIHNlbGYuV191cF0KICAgICAgICBncm91cF9kb3duID0gW3cgZm9yIHcgaW4gc2VsZi5XX2Rvd25dCiAgICAgICAgCiAgICAgICAgZ2F0ZSA9IFtzZWxmLmFjdF9mbih0KSBmb3IgdCBpbiBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VuLCBncm91cF9nYXRlKV0KICAgICAgICB1cCA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW4sIGdyb3VwX3VwKQogICAgICAgIGxocyA9IFt0X2dhdGUgKiB0X3VwIGZvciAodF9nYXRlLCB0X3VwKSBpbiB6aXAoZ2F0ZSwgdXApXQogICAgICAgIG91dCA9IGdyb3VwX2dlbW1fZm4obGhzLCBncm91cF9kb3duKQogICAgICAgIAogICAgICAgIHJldHVybiBvdXQKCkB0b3JjaC5jb21waWxlCmNsYXNzIE1vRUdhdGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1fZXhwZXJ0cywgZF9oaWRkZW4sIHRvcGspOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2sgPSB0b3BrCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0cyA9IG51bV9leHBlcnRzCiAgICAgICAgc2VsZi5kX2hpZGRlbiA9IGRfaGlkZGVuCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCiAgICAgICAgcmV0dXJuIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMKCmNsYXNzIE1vRUdyb3VwR0VNTShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV9leHBlcnRzLCBkX2V4cGVydCwgZF9oaWRkZW4sIHRvcGspOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wayA9IHRvcGsKICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBHUlVTaGFyZWRFeHBlcnQoZF9oaWRkZW4sIGRfZXhwZXJ0KQogICAgICAgIHNlbGYucm91dGVkX2V4cGVydHMgPSBHUlVSb3V0ZWRFeHBlcnRzKG51bV9leHBlcnRzLCBkX2hpZGRlbiwgZF9leHBlcnQpCiAgICAgICAgc2VsZi5yb3V0ZXIgPSBNb0VHYXRlKG51bV9leHBlcnRzLCBkX2hpZGRlbiwgc2VsZi50b3BrKQogICAgICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgdG9rZW5zKToKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZSA9IHRva2Vucy5zaXplKCkKICAgICAgICB0b2tlbnNfZmxhdCA9IHRva2Vucy52aWV3KC0xLCBoaWRkZW5fc2l6ZSkKICAgICAgICAKICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHRva2Vuc19mbGF0KQogICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzID0gc2VsZi5yb3V0ZXIodG9rZW5zX2ZsYXQpCiAgICAgICAgCiAgICAgICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgICAgICBncm91cF90b2tlbiwgXyA9IGV4cGVydF9pbnB1dF9wZXJtdXRlKHRva2Vuc19mbGF0LCBleHBlcnRfaW5kaWNlcywgc2VsZi50b3BrKQogICAgICAgIGdyb3VwX3Rva2VuID0gc2VsZi5yb3V0ZWRfZXhwZXJ0cyhncm91cF90b2tlbikKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gZXhwZXJ0X291dHB1dF9wZXJtdXRlKGdyb3VwX3Rva2VuLCBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3Jlcywgc2VsZi50b3BrLCB0b2tlbnNfZmxhdC5zaGFwZSkKICAgICAgICAKICAgICAgICBvdXRwdXQgPSBzaGFyZWRfb3V0cHV0ICsgcm91dGVkX291dHB1dAogICAgICAgIHJldHVybiBvdXRwdXQudmlldyhiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZSkKICAgICAgICAKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YSk6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgZF9leHBlcnQgPSBjb25maWdbImRfZXhwZXJ0Il0KICAgIGRfaGlkZGVuID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICB0b3BrID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgIG1vZSA9IE1vRUdyb3VwR0VNTShudW1fZXhwZXJ0cywgZF9leHBlcnQsIGRfaGlkZGVuLCB0b3BrKS5jdWRhKCkudG8odG9yY2guZmxvYXQxNikKCiAgICBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyk6CiAgICAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICAgICAjIHdlaWdodHMgbm90IHRyYW5zcG9zZWQsIHNpbmNlIG5vcm1hbCB0ZW5zb3IKICAgICAgICBtb2Uucm91dGVkX2V4cGVydHMuV19nYXRlW2ldID0gZ2F0ZV9wcm9qX3dlaWdodAogICAgICAgIG1vZS5yb3V0ZWRfZXhwZXJ0cy5XX3VwW2ldID0gdXBfcHJval93ZWlnaHQKICAgICAgICBtb2Uucm91dGVkX2V4cGVydHMuV19kb3duW2ldID0gZG93bl9wcm9qX3dlaWdodAogICAgCiAgICAjIFRyYW5zcG9zZSB0byBtYXRjaCBsYXlvdXQgZXhwZWN0ZWQgYnkgbGluZWFyCiAgICBtb2Uucm91dGVyLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKSkKCiAgICBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQoKICAgIHJldHVybiBvdXRwdXQKCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=No newline at end of file
Best evidence level for this revision: reported
JSON