amd-mixture-of-experts · submission 26179
KernelBot user 302 · 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.
moe_v4_clean.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-26179?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:a3cc3bf1f31d3525f267df90e0583451e4546f8f976326cdcd3e071cf1ef554b
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
moe_v4_clean.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgIyB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQoKQHRyaXRvbi5qaXQKZGVmIHN3aWdsdSh4LCB5KToKICAgIGxvZ18yX2U6IHRsLmNvbnN0ZXhwciA9IDEuNDQyNjk1MDQxCiAgICBleHBfeCA9IHRsLmV4cDIoIC1sb2dfMl9lICogeCkKICAgIHJldHVybiAxLiAvICgxLiArIGV4cF94KSAqIHggKiB5CkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogNjQsCiAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9OCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBncm91cF9nZW1tX1N3aUdsdSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAjIEFsbG9jYXRlIHRlbnNvciAKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczEgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczIgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQoKICAgIAogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgcm91dGVyIHRpbWVyIikgYXMgdDoKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4wID0gRi5zaWx1KGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MCkgKiAoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQxKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBjYWxjdWxhdGUgaW5kZXggdGltZXIiKSBhcyB0OgogICAgICAgICMgZXhwZXJ0MnRva2VuX2NvdW50IChuX3JvdXRlZF9leHBlcnRzLCkKICAgICAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgICAgIGNhbGN1bGF0ZV9leHBlcnQydG9rZW5fY291bnRfYW5kX3dpdGhpbl9leHBlcnRfaW5kZXhbIChuX3JvdXRlZF9leHBlcnRzLCApIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICApCiAgICAgICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX3Rva2VuMmluZGV4WyBsYW1iZGEgbWV0YSA6ICh0cml0b24uY2RpdihiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksKSBdKAogICAgICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHNjYXR0ZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgICAgIHRva2VuMmluZGV4LAogICAgICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICkKICAgIAogICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICAgICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgICAgICBjID0gZmZuMF9vdXQsCiAgICAgICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgICAgIGMgPSBmZm4xX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICB3ZWlnaHRlZCBzdW0gZ2F0aGVyIHRpbWVyIikgYXMgdDoKICAgICAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgICAgICBmZm4xX291dCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgICAgIG1vZV9vdXQsCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICAgICApCiAgICAjIHNsZWVwIDggbXMgCiAgICAjIGJlbmNobWFyayBzdWNrcyAhCiAgICAjIHRpbWUuc2xlZXAoMC4wMDgpCiAgICByZXR1cm4gbW9lX291dC5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgb3V0cHV0ID0gbW9lX2ZvcndhcmQoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCAqKmNvbmZpZykKICAgIHJldHVybiBvdXRwdXQKSource 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 26164.
- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiA2NCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiA2NCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpCiAgICAgICAgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhY2N1bTAgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2swKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFjY3VtMSArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazEpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0cjAgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMCwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICAgICAgYl9ibG9ja19wdHIxID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjEsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgb3V0ID0gc3dpZ2x1KGFjY3VtMCwgYWNjdW0xKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQgKiA4LAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopICAgICAgICAgICAKQHRyaXRvbi5qaXQKZGVmIHdlaWdodGVkX3N1bV9nYXRoZXIoCiAgICBmZm4xX291dCwKICAgIHRva2VuMmluZGV4LAogICAgdG9wa19zY29yZXMsCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICBtb2Vfb3V0LAogICAgZF9oaWRkZW4sCiAgICBiYXRjaF9zaXplLAogICAgc2VxX2xlbiwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGZmbjFfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIHRva2VuMmluZGV4OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHRvcGtfc2NvcmVzOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHNoYXJlZF9leHBlcnRfZmZuMTogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIG1vZV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBncmlkOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIEJMT0NLX1NJWkUpLCBiYXRjaF9zaXplICogc2VxX2xlbikKICAgIAogICAgc2VnbWVudF9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICB0b2tlbl9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIG9mZnNldHMgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyBzZWdtZW50X2lkeCAqIEJMT0NLX1NJWkUKICAgIG1hc2sgPSBvZmZzZXRzIDwgZF9oaWRkZW4KICAgIAogICAgZGF0YSA9IHRsLmxvYWQoCiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4xICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIG1hc2s9bWFzaywKICAgICkKICAgIGZvciBpIGluIHJhbmdlKG5fZXhwZXJ0c19wZXJfdG9rZW4pOgogICAgICAgIHdlaWdodCA9IHRsLmxvYWQodG9wa19zY29yZXMgKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgaSkKICAgICAgICBpbmRleCA9IHRsLmxvYWQodG9rZW4yaW5kZXggKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgaSkKICAgICAgICBmZm4xX291dF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgICAgIGZmbjFfb3V0ICsgaW5kZXggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCiAgICAgICAgZGF0YSArPSB3ZWlnaHQgKiBmZm4xX291dF9ibG9jawogICAgdGwuc3RvcmUoCiAgICAgICAgbW9lX291dCArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBkYXRhLAogICAgICAgIG1hc2s9bWFzaywKICAgICkKICAgCiMgY29uZmlnOiB7J2RfaGlkZGVuJzogNzE2OCwgJ2RfZXhwZXJ0JzogMjA0OCwgJ25fcm91dGVkX2V4cGVydHMnOiAzMiwgJ25fc2hhcmVkX2V4cGVydHMnOiAxLCAnbl9leHBlcnRzX3Blcl90b2tlbic6IDQsICdiYXRjaF9zaXplJzogMSwgJ3NlcV9sZW4nOiAyMDQ4fQojIGlucHV0X3RlbnNvciBsYXlvdXQ6IChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4gKiBzZXFfbGVuLCBkX2hpZGRlbiwgMSkKIyByb3V0ZXIud2VpZ2h0IGxheW91dDogKG5fcm91dGVkX2V4cGVydHMsICBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiMgZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0LCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKCmNsYXNzIFRpbWVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhYmVsOiBzdHIpOgogICAgICAgIHNlbGYubGFiZWwgPSBsYWJlbAogICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmVuZF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuaW50ZXJ2YWwgPSBOb25lCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICMgc2VsZi5zdGFydCA9IHRpbWUudGltZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICAgICAjIHNlbGYuZW5kID0gdGltZS50aW1lKCkKICAgICAgICAjIHNlbGYuaW50ZXJ2YWwgPSAoc2VsZi5lbmQgLSBzZWxmLnN0YXJ0KSAqIDEwMDAgIyBpbiBtcwogICAgICAgICMgcHJpbnQoZiJ7c2VsZi5sYWJlbH06IHtzZWxmLmludGVydmFsOi40Zn0gbXMiKQogICAgICAgIHJldHVybiBGYWxzZQpkZWYgbW9lX2ZvcndhcmQoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLAogICAgZF9oaWRkZW46IGludCwKICAgIGRfZXhwZXJ0OiBpbnQsCiAgICBuX3JvdXRlZF9leHBlcnRzOiBpbnQsCiAgICBuX3NoYXJlZF9leHBlcnRzOiBpbnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzZXFfbGVuOiBpbnQKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBpbnB1dF90ZW5zb3IgPSBpbnB1dF90ZW5zb3IucmVzaGFwZSgtMSwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSB0ZW5zb3IgdGltZXIiKSBhcyB0OgogICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkoc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cywpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIHRva2VuMmluZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSA9IHRvcmNoLnplcm9zKHNpemU9KG5fcm91dGVkX2V4cGVydHMgKyAxLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICAKICAgICAgICByZXBlYXRlZF90b2tlbnMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiAgICAgICAgIyBmZm4wX2xocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgICMgZmZuMF9yaHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgICAgICBmZm4wX291dCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjFfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShyZXBlYXRlZF90b2tlbnMpCiAgICAgICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgYWxsb2NhdGUgcHRyIGFycmF5IikgYXMgdDoKICAgICAgICBiX3B0cnMwID0gdG9yY2gudGVuc29yKAogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKICAgICAgICBiX3B0cnMxID0gdG9yY2gudGVuc29yKAogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKICAgICAgICBiX3B0cnMyID0gdG9yY2gudGVuc29yKAogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKCiAgICAKICAgIHJvdXRlcl93ZWlnaHQgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gIyAobl9yb3V0ZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICBsb2dpdHMgPSB0b3JjaC5tYXRtdWwoaW5wdXRfdGVuc29yLCByb3V0ZXJfd2VpZ2h0LnQoKSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICAjIFRPRE86IGZ1c2VkIHNvZnRtYXggKyB0b3AgayBodHRwczovL2dpdGh1Yi5jb20vc2dsLXByb2plY3Qvc2dsYW5nL2Jsb2IvZmJhOGVjY2Q3ZWJlNDFiYmRiZjcwYWIzYjZhMmRmMTgzNWY4YjUzMi9zZ2wta2VybmVsL2NzcmMvdG9yY2hfZXh0ZW5zaW9uX3JvY20uY2MjTDY1CiAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBuX2V4cGVydHNfcGVyX3Rva2VuLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pICAgIAoKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10gIyAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10gIyAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gIyAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc2lsdSArIG1hdG11bAogICAgIyBUT0RPOiBpbXBsZW1lbnQgbWF0bXVsPyBvciB1c2UgdG9yY2gubWF0bXVsPwogICAgIyBUT0RPOiBzaGFyZWQgZXhwZXJ0IGluIGEgc2VwYXJhdGUgc3RyZWFtPwogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzaGFyZWQgZXhwZXJ0IHRpbWVyIikgYXMgdDoKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjAgPSBGLnNpbHUoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQwKSAqIChpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4xID0gc2hhcmVkX2V4cGVydF9mZm4wIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQyICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBleHBlcnQydG9rZW5fY291bnQgKG5fcm91dGVkX2V4cGVydHMsKQogICAgICAgICMgd2l0aGluX2V4cGVydF9pbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKICAgICAgICAjIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2NhdHRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2NhdHRlclsgKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpIF0oCiAgICAgICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgKQogICAgCiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgZmZuMCB0aW1lciIpIGFzIHQ6CiAgICAjICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfZXhwZXJ0LCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICMgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgIyAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMCwKICAgICMgICAgICAgICBjID0gZmZuMF9saHMsCiAgICAjICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgIyAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgIyAgICAgICAgIG4gPSBkX2V4cGVydCwKICAgICMgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAjICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAjICAgICAgICAgIyBCTE9DS19NPUJMT0NLX00sCiAgICAjICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAjICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAjICAgICApCiAgICAgICAgCiAgICAjICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfZXhwZXJ0LCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICMgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgIyAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMSwKICAgICMgICAgICAgICBjID0gZmZuMF9yaHMsCiAgICAjICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgIyAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgIyAgICAgICAgIG4gPSBkX2V4cGVydCwKICAgICMgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAjICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAjICAgICAgICAgIyBCTE9DS19NPUJMT0NLX00sCiAgICAjICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAjICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAjICAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIFNpbHUgdGltZXIiKSBhcyB0OgogICAgIyAgICAgIyBUT0RPOiBmdXNlZCBzaWx1IHdpdGggZ3JvdXAgZ2VtbSA/CiAgICAjICAgICAjIFRPRE86IGltcGxlbWVudCBGLnNpbHUoZmZuMF9saHMpICogZmZuMF9yaHMgdXNpbmcgdHJpdG9uPwogICAgIyAgICAgIyBUT0RPOiB0b3JjaC5tYXRtdWwoZmZuMF9saHMsIGZmbjBfcmhzKSA/CiAgICAjICAgICBmZm4wX291dCA9IEYuc2lsdShmZm4wX2xocykgKiBmZm4wX3JocyAjIChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KQogICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMwID0gYl9wdHJzMCwKICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gZmZuMF9vdXQsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKV0oCiAgICAgICAgICAgIGZmbjFfb3V0LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgdG9wa19zY29yZXMsCiAgICAgICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICAgICAgbW9lX291dCwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAo=No newline at end of file+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgIyB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQoKQHRyaXRvbi5qaXQKZGVmIHN3aWdsdSh4LCB5KToKICAgIGxvZ18yX2U6IHRsLmNvbnN0ZXhwciA9IDEuNDQyNjk1MDQxCiAgICBleHBfeCA9IHRsLmV4cDIoIC1sb2dfMl9lICogeCkKICAgIHJldHVybiAxLiAvICgxLiArIGV4cF94KSAqIHggKiB5CkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogNjQsCiAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9OCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBncm91cF9nZW1tX1N3aUdsdSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAjIEFsbG9jYXRlIHRlbnNvciAKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczEgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczIgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQoKICAgIAogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgcm91dGVyIHRpbWVyIikgYXMgdDoKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4wID0gRi5zaWx1KGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MCkgKiAoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQxKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBjYWxjdWxhdGUgaW5kZXggdGltZXIiKSBhcyB0OgogICAgICAgICMgZXhwZXJ0MnRva2VuX2NvdW50IChuX3JvdXRlZF9leHBlcnRzLCkKICAgICAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgICAgIGNhbGN1bGF0ZV9leHBlcnQydG9rZW5fY291bnRfYW5kX3dpdGhpbl9leHBlcnRfaW5kZXhbIChuX3JvdXRlZF9leHBlcnRzLCApIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICApCiAgICAgICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX3Rva2VuMmluZGV4WyBsYW1iZGEgbWV0YSA6ICh0cml0b24uY2RpdihiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksKSBdKAogICAgICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHNjYXR0ZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgICAgIHRva2VuMmluZGV4LAogICAgICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICkKICAgIAogICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICAgICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgICAgICBjID0gZmZuMF9vdXQsCiAgICAgICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgICAgIGMgPSBmZm4xX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICB3ZWlnaHRlZCBzdW0gZ2F0aGVyIHRpbWVyIikgYXMgdDoKICAgICAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgICAgICBmZm4xX291dCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgICAgIG1vZV9vdXQsCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICAgICApCiAgICAjIHNsZWVwIDggbXMgCiAgICAjIGJlbmNobWFyayBzdWNrcyAhCiAgICAjIHRpbWUuc2xlZXAoMC4wMDgpCiAgICByZXR1cm4gbW9lX291dC5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgb3V0cHV0ID0gbW9lX2ZvcndhcmQoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCAqKmNvbmZpZykKICAgIHJldHVybiBvdXRwdXQKNo newline at end of file
Best evidence level for this revision: reported
JSON