Name: series-workflowgzj9g Phase: Succeeded StartedAt: 2026-07-11 05:39:07 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[0] Phase: Succeeded StartedAt: 2026-07-11 05:39:07 +0000 UTC FinishedAt: 2026-07-11 05:51:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[0].run-triage Phase: Succeeded StartedAt: 2026-07-11 05:39:07 +0000 UTC FinishedAt: 2026-07-11 05:51:28 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "1f9f5986-a7e3-49fa-8960-7724653c73fd" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "bm_register_write", "bm_entry_write", "bm_status_write", "bm_unlink", "load_misc_binary", "create_entry", "parse_magic_fields", "parse_extension_fields" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtsb2FkX21pc2NfYmluYXJ5JiMzNDssCiAgICAmIzM0O2NyZWF0ZV9lbnRyeSYjMzQ7LAogICAgJiMzNDtwYXJzZV9tYWdpY19maWVsZHMmIzM0OywKICAgICYjMzQ7cGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTEgMDU6NTA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5OTQzNjJjZWIzM2ZiOTYxM2RiZjQyMTFlZGQ4Y2M3MTRmNjE2NjRkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBKdWwgMTEgMDU6NTA6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5AQCAtMTMzLDcgJiM0MzsxMzMsOCBAQCBvciAxICh0byBlbmFibGUpIHRvIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgIG9yXG4gQ2F0dGluZyB0aGUgZmlsZSB0ZWxscyB5b3UgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBgYmluZm10X21pc2MvdGhlX2VudHJ5YGAuXG4gXG4gWW91IGNhbiByZW1vdmUgb25lIGVudHJ5IG9yIGFsbCBlbnRyaWVzIGJ5IGVjaG9pbmcgLTEgdG8gYGAvcHJvYy8uLi4vdGhlX25hbWVgYFxuLW9yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLlxuJiM0MztvciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC4gQSBzaW5nbGUgZW50cnkgY2FuIGFsc28gYmUgcmVtb3ZlZFxuJiM0MztieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuXG4gXG4gXG4gSGludHNcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xuaW5kZXggODQzNDlmY2I5M2YxM2EuLmZjYWFkMTRmODFhMzQyIDEwMDY0NFxuLS0tIGEvZnMvYmluZm10X21pc2MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvYmluZm10X21pc2MuY1xuQEAgLTEwLDQ1ICYjNDM7MTAsNDYgQEBcbiBcbiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogXCYjMzQ7IGZtdFxuIFxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL21tLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG9wcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3R5cGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9uYW1laS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW91bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgva3N0cnRveC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2VxX2ZpbGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC91c2VyX25hbWVzcGFjZS5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXCYjMzQ7aW50ZXJuYWwuaFwmIzM0O1xuLVxuLSNpZmRlZiBERUJVR1xuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXG4tI2Vsc2Vcbi0jIGRlZmluZSBVU0VfREVCVUcgMFxuLSNlbmRpZlxuLVxuLWVudW0ge1xuLVx0VkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovXG4mIzQzOy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi9cbiYjNDM7ZW51bSBiaW5mbXRfbWlzY19lbnRyeV9iaXRzIHtcbiYjNDM7XHRNSVNDX0ZNVF9FTkFCTEVEX0JJVFx0PSAwLFxuJiM0MztcdE1JU0NfRk1UX01BR0lDX0JJVFx0PSAxLFxuIH07XG4gXG4tZW51bSB7RW5hYmxlZCwgTWFnaWN9O1xuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcdTAwM2NcdTAwM2MgMzEpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFx1MDAzY1x1MDAzYyAzMClcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXHUwMDNjXHUwMDNjIDI5KVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXHUwMDNjXHUwMDNjIDI4KVxuJiM0MzsvKiBFbnRyeSBiZWhhdmlvciBmbGFncywgZml4ZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuICovXG4mIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3Mge1xuJiM0MztcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzEpLFxuJiM0MztcdE1JU0NfRk1UX09QRU5fQklOQVJZXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzApLFxuJiM0MztcdE1JU0NfRk1UX0NSRURFTlRJQUxTXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjkpLFxuJiM0MztcdE1JU0NfRk1UX09QRU5fRklMRVx0PSAoMVUgXHUwMDNjXHUwMDNjIDI4KSxcbiYjNDM7fTtcbiBcbi10eXBlZGVmIHN0cnVjdCB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XG4mIzQzO3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgbm9kZTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XHRcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xuIFx0aW50IG9mZnNldDtcdFx0XHQvKiBvZmZzZXQgb2YgbWFnaWMgKi9cbiBcdGludCBzaXplO1x0XHRcdC8qIHNpemUgb2YgbWFnaWMvbWFzayAqL1xuQEAgLTU5LDkgJiM0Mzs2MCw5IEBAIHR5cGVkZWYgc3RydWN0IHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcbiBcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHJlZmNvdW50X3QgdXNlcnM7XHRcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xuLX0gTm9kZTtcbi1cbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiYjNDM7XHRzdHJ1Y3QgcmN1X2hlYWQgcmN1O1xuJiM0MztcdGNoYXIgYnVmW107XHRcdFx0LyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqL1xuJiM0Mzt9O1xuIFxuIC8qXG4gICogTWF4IGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc3RyaW5nLiAgRGV0ZXJtaW5lZCBieTpcbkBAIC03NCwxMCAmIzQzOzc1LDM2IEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqICAtIGludGVycDogfjUwIGJ5dGVzXG4gICogIC0gZmxhZ3M6ICA1IGJ5dGVzXG4gICogUm91bmQgdGhhdCB1cCBhIGJpdCwgYW5kIHRoZW4gYmFjayBvZmYgdG8gaG9sZCB0aGUgaW50ZXJuYWwgZGF0YVxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cbiYjNDM7ICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cbiAgKi9cbiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMFxuIFxuJiM0MzsvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXG4mIzQzOyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxuJiM0MztcbiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgbWFnaWMgbWF0Y2hlcyBAYnBybSYjMzk7cyBidWZmZXIsIGFwcGx5aW5nIHRoZSBtYXNrIGlmIHNldC4gKi9cbiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19tYWdpYyhjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXG4mIzQzO1x0XHRcdFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVx1MDAzZWJ1ZiAmIzQzOyBlLVx1MDAzZW9mZnNldDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hc2spXG4mIzQzO1x0XHRyZXR1cm4gIW1lbWNtcChzLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKChzW2ldIF4gZS1cdTAwM2VtYWdpY1tpXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tpXSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDaGVjayBpZiBAZSYjMzk7cyByZWdpc3RlcmVkIGV4dGVuc2lvbiBtYXRjaGVzIEBleHQsIE5VTEwgaWYgdGhlcmUgaXMgbm9uZS4gKi9cbiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuJiM0MztcdFx0XHRcdCAgICBjb25zdCBjaGFyICpleHQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZXh0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGUtXHUwMDNlbWFnaWMsIGV4dCk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbkBAIC04Niw0MyAmIzQzOzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnlcbiAgKiB0eXBlIGhhbmRsZXJzLlxuICAqXG4mIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLlxuJiM0MzsgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxuJiM0MztzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIHtcbi1cdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAmIzM5Oy4mIzM5Oyk7XG4tXHROb2RlICplO1xuJiM0MztcdGNoYXIgKmRvdCA9IHN0cnJjaHIoYnBybS1cdTAwM2VpbnRlcnAsICYjMzk7LiYjMzk7KTtcbiYjNDM7XHRjb25zdCBjaGFyICpleHQgPSBkb3QgPyBkb3QgJiM0MzsgMSA6IE5VTEw7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuIFx0LyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbGlzdCkge1xuLVx0XHRjaGFyICpzO1xuLVx0XHRpbnQgajtcbi1cbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBub2RlKSB7XG4gXHRcdC8qIE1ha2Ugc3VyZSB0aGlzIG9uZSBpcyBjdXJyZW50bHkgZW5hYmxlZC4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0XHRpZiAocCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBwICYjNDM7IDEpKVxuJiM0MztcdFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXG4gXHRcdFx0XHRyZXR1cm4gZTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBtYWdpYyBcdTAwMjYgbWFzay4gKi9cbi1cdFx0cyA9IGJwcm0tXHUwMDNlYnVmICYjNDM7IGUtXHUwMDNlb2Zmc2V0O1xuLVx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqJiM0MzsmIzQzOylcbi1cdFx0XHRcdGlmICgoKnMmIzQzOyYjNDM7IF4gZS1cdTAwM2VtYWdpY1tqXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tqXSlcbi1cdFx0XHRcdFx0YnJlYWs7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqJiM0MzsmIzQzOylcbi1cdFx0XHRcdGlmICgoKnMmIzQzOyYjNDM7IF4gZS1cdTAwM2VtYWdpY1tqXSkpXG4tXHRcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZTtcbiBcdFx0fVxuLVx0XHRpZiAoaiA9PSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0cmV0dXJuIGU7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0xMzQsNjQgJiM0MzsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4gICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlclxuICAqXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXG4tICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLlxuJiM0MzsgKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIFRoZVxuJiM0MzsgKiByZWZjb3VudCBvZiBhbiBlbnRyeSBjYW4gb25seSBkcm9wIHRvIHplcm8gb25jZSBpdCBoYXMgYmVlbiB1bmxpbmtlZCBhbmRcbiYjNDM7ICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wXG4mIzQzOyAqIGlzIGJvdW5kZWQuXG4gICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHRzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbi1cdHJlYWRfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuLVx0aWYgKGUpXG4tXHRcdHJlZmNvdW50X2luYyhcdTAwMjZlLVx1MDAzZXVzZXJzKTtcbi1cdHJlYWRfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRndWFyZChyY3UpKCk7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbiYjNDM7XHR9IHdoaWxlIChlIFx1MDAyNlx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFx1MDAyNmUtXHUwMDNldXNlcnMpKTtcbiBcdHJldHVybiBlO1xuIH1cbiBcbiAvKipcbi0gKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgbm9kZVxuLSAqIEBlOiBub2RlIHRvIHB1dFxuJiM0MzsgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcbiYjNDM7ICogQGU6IGVudHJ5IHRvIHB1dFxuICAqXG4tICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbiYjNDM7ICogRnJlZSBlbnRyeSBzeW5jaW5nIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpIGFuZCBkZWZlciBmaW5hbCBmcmVlIHRvXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxuICAqIHJlcXVlc3RlZCB0byByZW1vdmUuXG4gICovXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuIFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZlLVx1MDAzZXVzZXJzKSkge1xuLVx0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuJiM0MztcdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuJiM0MztcdFx0XHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZS1cdTAwM2VpbnRlcnBfZmlsZSk7XG4gXHRcdFx0ZmlscF9jbG9zZShlLVx1MDAzZWludGVycF9maWxlLCBOVUxMKTtcbi1cdFx0a2ZyZWUoZSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xuJiM0MztcdFx0a2ZyZWVfcmN1KGUsIHJjdSk7XG4gXHR9XG4gfVxuIFxuJiM0MztERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXG4mIzQzO1xuIC8qKlxuLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4mIzQzOyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2VcbiAgKlxuLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLlxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IGNhbiBtYWtlIHVzZVxuLSAqIG9mIGl0cyBhbmNlc3RvciYjMzk7cyBiaW5mbXRfbWlzYyBoYW5kbGVycy4gVGhpcyBtaW1pY2tzIHRoZSBiZWhhdmlvciBvZlxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXG4tICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS5cbiYjNDM7ICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2VzbiYjMzk7dCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcbiYjNDM7ICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxuJiM0MzsgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxuJiM0MzsgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxuJiM0MzsgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxuJiM0MzsgKiBwcmFjdGljZS5cbiAgKlxuICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2VcbiAgKi9cbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4tXHR1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7XG4tXHR3aGlsZSAodXNlcl9ucykge1xuJiM0MztcdGZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQpIHtcbiBcdFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cbiBcdFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYyk7XG4gXHRcdGlmIChtaXNjKVxuIFx0XHRcdHJldHVybiBtaXNjO1xuLVxuLVx0XHR1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQ7XG4gXHR9XG4gXG4gXHRyZXR1cm4gXHUwMDI2aW5pdF9iaW5mbXRfbWlzYztcbkBAIC0yMDIsMzAgJiM0MzsyMjEsMjkgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuICAqL1xuIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIHtcbi1cdE5vZGUgKmZtdDtcbi1cdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XG4tXHRpbnQgcmV0dmFsID0gLUVOT0VYRUM7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiYjNDM7XHRpbnQgcmV0dmFsO1xuIFxuLVx0bWlzYyA9IGxvYWRfYmluZm10X21pc2MoKTtcbi1cdGlmICghbWlzYy1cdTAwM2VlbmFibGVkKVxuLVx0XHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdG1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7XG4mIzQzO1x0aWYgKCFSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSlcbiYjNDM7XHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbiBcdGlmICghZm10KVxuLVx0XHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0LyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqL1xuLVx0cmV0dmFsID0gLUVOT0VOVDtcbiBcdGlmIChicHJtLVx1MDAzZWludGVycF9mbGFncyBcdTAwMjYgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHtcbiBcdFx0YnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmV0dmFsID0gcmVtb3ZlX2FyZ196ZXJvKGJwcm0pO1xuIFx0XHRpZiAocmV0dmFsKVxuLVx0XHRcdGdvdG8gcmV0O1xuJiM0MztcdFx0XHRyZXR1cm4gcmV0dmFsO1xuIFx0fVxuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG5AQCAtMjM0LDU3ICYjNDM7MjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChicHJtLVx1MDAzZWludGVycCwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MmIzQzOyYjNDM7O1xuIFxuIFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xuIFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MmIzQzOyYjNDM7O1xuIFxuIFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXG4gXHRyZXR2YWwgPSBicHJtX2NoYW5nZV9pbnRlcnAoZm10LVx1MDAzZWludGVycHJldGVyLCBicHJtKTtcbiBcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4tXHRcdGdvdG8gcmV0O1xuJiM0MztcdFx0cmV0dXJuIHJldHZhbDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuIFx0XHRpbnRlcnBfZmlsZSA9IGZpbGVfY2xvbmVfb3BlbihmbXQtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuLVx0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpXG4tXHRcdFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuJiM0MztcdFx0aWYgKCFJU19FUlIoaW50ZXJwX2ZpbGUpKSB7XG4mIzQzO1x0XHRcdGludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0ZnB1dChpbnRlcnBfZmlsZSk7XG4mIzQzO1x0XHRcdFx0aW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdH0gZWxzZSB7XG4gXHRcdGludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC1cdTAwM2VpbnRlcnByZXRlcik7XG4gXHR9XG4tXHRyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcbiBcdGJwcm0tXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuIFx0XHRicHJtLVx1MDAzZWV4ZWNmZF9jcmVkcyA9IDE7XG4tXG4tXHRyZXR2YWwgPSAwO1xuLXJldDpcbi1cbi1cdC8qXG4tXHQgKiBJZiB3ZSBhY3R1YWxseSBwdXQgdGhlIG5vZGUgaGVyZSBhbGwgY29uY3VycmVudCBjYWxscyB0b1xuLVx0ICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93XG4tXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxuLVx0ICogcmVtb3ZlZCB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IGFuZCBpdCYjMzk7cyBvdXIgam9iIHRvXG4tXHQgKiBmcmVlIGl0LlxuLVx0ICovXG4tXHRwdXRfYmluZm10X2hhbmRsZXIoZm10KTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIENvbW1hbmQgcGFyc2VycyAqL1xuIFxuIC8qXG4tICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsXG4tICogcmVjb2duaXNpbmcgdGhlIFxceCBzcGVjaWFsLlxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxuLSAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLlxuJiM0MzsgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nXG4mIzQzOyAqIHRoZSBcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxuJiM0MzsgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxuICAqL1xuIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIHtcbkBAIC0yOTksNDYgJiM0MzszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIFx0XHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbiBcdH1cbi1cdHNbLTFdID0mIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNbLTFdID0gJiMzOTtcXDAmIzM5OztcbiBcdHJldHVybiBzO1xuIH1cbiBcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHRjaGFyICpwID0gc2ZzO1xuLVx0aW50IGNvbnQgPSAxO1xuLVxuLVx0Lyogc3BlY2lhbCBmbGFncyAqL1xuLVx0d2hpbGUgKGNvbnQpIHtcbiYjNDM7XHRmb3IgKDs7IHAmIzQzOyYjNDM7KSB7XG4gXHRcdHN3aXRjaCAoKnApIHtcbiBcdFx0Y2FzZSAmIzM5O1AmIzM5OzpcbiBcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7TyYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtDJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxcblwmIzM0Oyk7XG4tXHRcdFx0cCYjNDM7JiM0Mzs7XG4tXHRcdFx0LyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlXG4tXHRcdFx0ICAgb3Blbi1iaW5hcnkgZmxhZyAqL1xuLVx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHxcbi1cdFx0XHRcdFx0TUlTQ19GTVRfT1BFTl9CSU5BUlkpO1xuJiM0MztcdFx0XHQvKiBDIGltcGxpZXMgTyAqL1xuJiM0MztcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtGJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuLVx0XHRcdGNvbnQgPSAwO1xuJiM0MztcdFx0XHRyZXR1cm4gcDtcbiBcdFx0fVxuIFx0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OywgJiMzOTttYWdpYyYjMzk7IGFuZCAmIzM5O21hc2smIzM5OyBmaWVsZHMgb2YgYW4gJiMzOTtNJiMzOTsgZW50cnkuICovXG4mIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnM7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdHMgPSBzdHJjaHIocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXMpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0aWYgKHAgIT0gcykge1xuJiM0MztcdFx0aWYgKGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0cCA9IHMgJiM0MzsgMTtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXG5cJiMzNDssIGUtXHUwMDNlb2Zmc2V0KTtcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hZ2ljID0gcDtcbiYjNDM7XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuJiM0MztcdGlmICghcCB8fCAhZS1cdTAwM2VtYWdpY1swXSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCYjMzQ7LFxuJiM0MztcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljLCB0cnVlKTtcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdGUtXHUwMDNlbWFzayA9IHA7XG4mIzQzO1x0cCA9IHNjYW5hcmcocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXApXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoIWUtXHUwMDNlbWFza1swXSkge1xuJiM0MztcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbiYjNDM7XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxuXCYjMzQ7KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFwmIzM0OyxcbiYjNDM7XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzaywgdHJ1ZSk7XG4mIzQzO1x0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWRcbiYjNDM7XHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XG4mIzQzO1x0ICogdGhlIGZpcnN0IG9uZSB0aGV5IGVuY291bnRlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlLVx1MDAzZXNpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xuJiM0MztcdGlmIChlLVx1MDAzZW1hc2sgXHUwMDI2XHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcXG5cJiMzNDssIGUtXHUwMDNlc2l6ZSk7XG4mIzQzO1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXCYjMzQ7LFxuJiM0MztcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKGUtXHUwMDNlbWFzaylcbiYjNDM7XHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuJiM0MztcdFx0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUsIHRydWUpO1xuJiM0MztcdHJldHVybiBwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkIG9mIGFuICYjMzk7RSYjMzk7IGVudHJ5OiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsXG4mIzQzO1x0XHRcdFx0ICAgIGNoYXIgZGVsKVxuJiM0Mzt7XG4mIzQzO1x0LyogU2tpcCB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hZ2ljID0gcDtcbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cJiMzNDssIGUtXHUwMDNlbWFnaWMpO1xuJiM0MztcbiYjNDM7XHQvKiBTa2lwIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdHJldHVybiBwO1xuIH1cbiBcbkBAIC0zNDcsNTAgJiM0Mzs0MzMsNTIgQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuICAqICYjMzk7Om5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncyYjMzk7XG4gICogd2hlcmUgdGhlICYjMzk7OiYjMzk7IGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyXG4gICovXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgc2l6ZV90IGNvdW50KVxuIHtcbi1cdE5vZGUgKmU7XG4tXHRpbnQgbWVtc2l6ZSwgZXJyO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdGNoYXIgKmJ1ZiwgKnA7XG4gXHRjaGFyIGRlbDtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcXG5cJiMzNDssIGNvdW50KTtcbiBcbiBcdC8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqL1xuLVx0ZXJyID0gLUVJTlZBTDtcbiBcdGlmICgoY291bnQgXHUwMDNjIDExKSB8fCAoY291bnQgXHUwMDNlIE1BWF9SRUdJU1RFUl9MRU5HVEgpKVxuLVx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0ZXJyID0gLUVOT01FTTtcbi1cdG1lbXNpemUgPSBzaXplb2YoTm9kZSkgJiM0MzsgY291bnQgJiM0MzsgODtcbi1cdGUgPSBrbWFsbG9jKG1lbXNpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4mIzQzO1x0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCAmIzQzOyBNSVNDX0RFTElNX1BBRCksXG4mIzQzO1x0XHQgICAgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbiBcdGlmICghZSlcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdHAgPSBidWYgPSAoY2hhciAqKWUgJiM0Mzsgc2l6ZW9mKE5vZGUpO1xuJiM0MztcdHAgPSBidWYgPSBlLVx1MDAzZWJ1ZjtcbiBcbi1cdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xuJiM0MztcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxuLVx0XHRnb3RvIGVmYXVsdDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuIFxuLVx0ZGVsID0gKnAmIzQzOyYjNDM7O1x0LyogZGVsaW1ldGVyICovXG4mIzQzO1x0ZGVsID0gKnAmIzQzOyYjNDM7O1x0LyogZGVsaW1pdGVyICovXG4gXG4gXHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZGVsaW06ICUjeCB7JWN9XFxuXCYjMzQ7LCBkZWwsIGRlbCk7XG4gXG4mIzQzO1x0LyogQSBmbGFnLWNoYXIgZGVsaW1pdGVyIHJ1bnMgdGhlIGZsYWcgc2NhbiBvZmYgdGhlIGJ1ZmZlci4gKi9cbiYjNDM7XHRpZiAoZGVsID09ICYjMzk7UCYjMzk7IHx8IGRlbCA9PSAmIzM5O08mIzM5OyB8fCBkZWwgPT0gJiMzOTtDJiMzOTsgfHwgZGVsID09ICYjMzk7RiYjMzk7KVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1xuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7XG4mIzQzO1x0bWVtc2V0KGJ1ZiAmIzQzOyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtuYW1lJiMzOTsgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VuYW1lWzBdIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDspIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy4uXCYjMzQ7KSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICYjMzk7LyYjMzk7KSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW5hbWUpO1xuIFxuQEAgLTM5OCwxMzQgJiM0Mzs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwJiM0MzsmIzQzOykge1xuIFx0Y2FzZSAmIzM5O0UmIzM5OzpcbiBcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJiMzOTtNJiMzOTs6XG4gXHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gKDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQpIHwgKDEgXHUwMDNjXHUwMDNjIE1hZ2ljKTtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi9cbi1cdFx0Y2hhciAqcztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwJiM0MzsmIzQzOylcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCYjMzQ7LFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBwIC0gZS1cdTAwM2VtYXNrKTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbi1cdFx0aWYgKFVTRV9ERUJVRykge1xuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgJiM0MzsmIzQzO2kpXG4tXHRcdFx0XHRcdFx0bWFza2VkW2ldID0gZS1cdTAwM2VtYWdpY1tpXSBcdTAwMjYgZS1cdTAwM2VtYXNrW2ldO1xuLVx0XHRcdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbi1cdFx0ZS1cdTAwM2VtYWdpYyA9IHA7XG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VpbnRlcnByZXRlclswXSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqL1xuQEAgLTUzMywyNCAmIzQzOzUyMCwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmICgqcCA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRwJiM0MzsmIzQzOztcbiBcdGlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tZWZhdWx0OlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1laW52YWw6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4mIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4mIzQzO2VudW0gYm1fY29tbWFuZCB7XG4mIzQzO1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4mIzQzO1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcJiMzNDswXCYjMzQ7ICovXG4mIzQzO1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwmIzM0OzFcJiMzNDsgKi9cbiYjNDM7XHRCTV9DTURfUkVNT1ZFLFx0LyogXCYjMzQ7LTFcJiMzNDsgKi9cbiYjNDM7fTtcbiYjNDM7XG4gLypcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxuLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjXG4mIzQzOyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJiMzOTsxJiMzOTsgZW5hYmxlcyxcbiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgJiM0Mzs1NDYsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRpZiAoIWNvdW50KVxuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRjb3VudC0tO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTswJiMzOTspXG4tXHRcdHJldHVybiAxO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9ESVNBQkxFO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTsxJiMzOTspXG4tXHRcdHJldHVybiAyO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9FTkFCTEU7XG4gXHRpZiAoY291bnQgPT0gMiBcdTAwMjZcdTAwMjYgc1swXSA9PSAmIzM5Oy0mIzM5OyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAmIzM5OzEmIzM5Oylcbi1cdFx0cmV0dXJuIDM7XG4mIzQzO1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpXG4ge1xuLVx0Y2hhciAqZHAgPSBwYWdlO1xuLVx0Y29uc3QgY2hhciAqc3RhdHVzID0gXCYjMzQ7ZGlzYWJsZWRcJiMzNDs7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDslMDJ4XCYjMzQ7LCBkYXRhW2ldKTtcbiYjNDM7fVxuIFxuLVx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuLVx0XHRzdGF0dXMgPSBcJiMzNDtlbmFibGVkXCYjMzQ7O1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCYjMzQ7JXNcXG5cJiMzNDssIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZW5hYmxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZGlzYWJsZWRcXG5cJiMzNDspO1xuIFxuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0OyVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cJiMzNDssIHN0YXR1cywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4mIzQzO1x0c2VxX3ByaW50ZihtLCBcJiMzNDtpbnRlcnByZXRlciAlc1xcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBwcmludCB0aGUgc3BlY2lhbCBmbGFncyAqL1xuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuJiM0MztcdHNlcV9wdXRzKG0sIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKVxuLVx0XHQqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O08mIzM5OztcbiYjNDM7XHRcdHNlcV9wdXRjKG0sICYjMzk7TyYjMzk7KTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtDJiMzOTspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7O1xuLVx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7XFxuJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7XG4mIzQzO1x0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcJiMzNDtleHRlbnNpb24gLiVzXFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7ZXh0ZW5zaW9uIC4lc1xcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1x0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4gXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7XFxubWFzayBcJiMzNDspO1xuLVx0XHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcdFx0XHRzZXFfcHV0cyhtLCBcJiMzNDtcXG5tYXNrIFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O1xcbiYjMzk7O1xuLVx0XHQqZHAgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTtcbiBcbkBAIC02NTIsMTQgJiM0Mzs2MzksMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuJiM0MzsgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnlcbiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbiYjNDM7ICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVx1MDAzZWlfcHJpdmF0ZTtcbiBcbiBcdGNsZWFyX2lub2RlKGlub2RlKTtcbiBcbkBAIC02NjcsODkgJiM0Mzs2NTQsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4mIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiYjNDM7ICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXG4mIzQzOyAqXG4mIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbiYjNDM7ICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxuJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuJiM0MzsgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcbiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4mIzQzO3tcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0JiMzOTtzIG5vdCBhIHByZXNzaW5nIGlzc3VlLlxuJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2RlbF9pbml0KFx1MDAyNmUtXHUwMDNlbGlzdCk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuJiM0MzsvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4mIzQzO1x0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xuJiM0MztcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cbiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4mIzQzO1xuJiM0MztcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MzsvKipcbiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4mIzQzOyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZVxuJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbiYjNDM7ICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoIWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcbiYjNDM7XHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcbiYjNDM7XHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4mIzQzO31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0ge1xuJiM0MztcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuJiM0MztcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4mIzQzO307XG4gXG4tXHRyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTtcbiYjNDM7LyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuJiM0MztcdHJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLVx1MDAzZWlfcHJpdmF0ZSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4mIzQzO1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbiYjNDM7XHRcdGZpbGUtXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4mIzQzO1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuJiM0MztcdFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtNzU5LDE1ICYjNDM7Nzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuJiM0MztcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbiYjNDM7XHQucmVhZFx0XHQ9IHNlcV9yZWFkLFxuIFx0LndyaXRlXHRcdD0gYm1fZW50cnlfd3JpdGUsXG4tXHQubGxzZWVrXHRcdD0gZGVmYXVsdF9sbHNlZWssXG4mIzQzO1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbiYjNDM7XHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7c3RhdGljIGludCBhZGRfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHNpbXBsZV9zdGFydF9jcmVhdGluZyhzYi1cdTAwM2VzX3Jvb3QsIGUtXHUwMDNlbmFtZSk7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuQEAgLTc4OSw5ICYjNDM7ODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0aGxpc3RfYWRkX2hlYWRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyAmIzQzOzgzMSwxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2I7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICYjNDM7ODUzLDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCYjMzQ7cmVnaXN0ZXI6IGZhaWxlZCB0byBpbnN0YWxsIGludGVycHJldGVyIGZpbGUgJXNcXG5cJiMzNDssXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgJiM0Mzs4NjQsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuJiM0MztcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCAmIzQzOzg4MywxMCBAQCBzdGF0aWMgc3NpemVfdFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuLVx0Y2hhciAqcztcbiYjNDM7XHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCYjMzQ7ZW5hYmxlZFxcblwmIzM0OyA6IFwmIzM0O2Rpc2FibGVkXFxuXCYjMzQ7O1xuJiM0MztcdHMgPSBSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSA/IFwmIzM0O2VuYWJsZWRcXG5cJiMzNDsgOiBcJiMzNDtkaXNhYmxlZFxcblwmIzM0OztcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICYjNDM7ODk1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgYWxsIGhhbmRsZXJzLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuJiM0MztcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbiYjNDM7XHRcdGJtX3JlbW92ZV9hbGxfZW50cmllcyhtaXNjLCBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtOTE4LDcgJiM0Mzs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCAmIzQzOzk3NywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0XHRpZiAoIW1pc2MpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHRcdHJ3bG9ja19pbml0KFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4mIzQzO1x0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXG4gXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MsIG1pc2MpO1xuIFx0fVxuIFxuQEAgLTk4MywxMiAmIzQzOzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2Ym1fc3VwZXJfb3BzO1xuJiM0MztcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7XG4tXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbiYjNDM7XHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgJiM0MzsyMyw5IEBAXG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0ge1xuLVx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxuJiM0MztcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4mIzQzO1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUwPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtsb2FkX21pc2NfYmluYXJ5JiMzNDssCiAgICAmIzM0O2NyZWF0ZV9lbnRyeSYjMzQ7LAogICAgJiMzNDtwYXJzZV9tYWdpY19maWVsZHMmIzM0OywKICAgICYjMzQ7cGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDk5NDM2MmNlYjMzZmI5NjEzZGJmNDIxMWVkZDhjYzcxNGY2MTY2NGQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEp1bCAxMSAwNTo1MDo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdApAQCAtMTMzLDcgJiM0MzsxMzMsOCBAQCBvciAxICh0byBlbmFibGUpIHRvIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgIG9yCiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC4KIAogWW91IGNhbiByZW1vdmUgb25lIGVudHJ5IG9yIGFsbCBlbnRyaWVzIGJ5IGVjaG9pbmcgLTEgdG8gYGAvcHJvYy8uLi4vdGhlX25hbWVgYAotb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuCiYjNDM7b3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWQKJiM0MztieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuCiAKIAogSGludHMKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mY2FhZDE0ZjgxYTM0MiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0xMCw0NSAmIzQzOzEwLDQ2IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgJiMzNDs6ICYjMzQ7IGZtdAogCi0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvaGV4LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL21tLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9iaW5mbXRzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRvcHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2xlYW51cC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcmVkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3R5cGUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfaGVscGVycy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9wYWdlbWFwLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbmFtZWkuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tb3VudC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zeXNjYWxscy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9rc3RydG94LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmludGsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmN1bGlzdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yZWZjb3VudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zZXFfZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfaGVscGVycy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3VhY2Nlc3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdXNlcl9uYW1lc3BhY2UuaCZndDsKIAotI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBVU0VfREVCVUcgMQotI2Vsc2UKLSMgZGVmaW5lIFVTRV9ERUJVRyAwCi0jZW5kaWYKLQotZW51bSB7Ci0JVkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovCiYjNDM7LyogRW50cnkgc3RhdHVzIGFuZCBtYXRjaCB0eXBlIGJpdCBudW1iZXJzLiAqLwomIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7CiYjNDM7CU1JU0NfRk1UX0VOQUJMRURfQklUCT0gMCwKJiM0MzsJTUlTQ19GTVRfTUFHSUNfQklUCT0gMSwKIH07CiAKLWVudW0ge0VuYWJsZWQsIE1hZ2ljfTsKLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCAmbHQ7Jmx0OyAzMSkKLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDFVTCAmbHQ7Jmx0OyAzMCkKLSNkZWZpbmUgTUlTQ19GTVRfQ1JFREVOVElBTFMgKDFVTCAmbHQ7Jmx0OyAyOSkKLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgJmx0OyZsdDsgMjgpCiYjNDM7LyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqLwomIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3MgewomIzQzOwlNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMAk9ICgxVSAmbHQ7Jmx0OyAzMSksCiYjNDM7CU1JU0NfRk1UX09QRU5fQklOQVJZCT0gKDFVICZsdDsmbHQ7IDMwKSwKJiM0MzsJTUlTQ19GTVRfQ1JFREVOVElBTFMJPSAoMVUgJmx0OyZsdDsgMjkpLAomIzQzOwlNSVNDX0ZNVF9PUEVOX0ZJTEUJPSAoMVUgJmx0OyZsdDsgMjgpLAomIzQzO307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiYjNDM7c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5IHsKJiM0MzsJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdHlwZSwgc3RhdHVzLCBldGMuICovCiAJaW50IG9mZnNldDsJCQkvKiBvZmZzZXQgb2YgbWFnaWMgKi8KIAlpbnQgc2l6ZTsJCQkvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi8KQEAgLTU5LDkgJiM0Mzs2MCw5IEBAIHR5cGVkZWYgc3RydWN0IHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGZpbGUgKmludGVycF9maWxlOwogCXJlZmNvdW50X3QgdXNlcnM7CQkvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi8KLX0gTm9kZTsKLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiYjNDM7CXN0cnVjdCByY3VfaGVhZCByY3U7CiYjNDM7CWNoYXIgYnVmW107CQkJLyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqLwomIzQzO307CiAKIC8qCiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OgpAQCAtNzQsMTAgJiM0Mzs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTsKICAqICAtIGludGVycDogfjUwIGJ5dGVzCiAgKiAgLSBmbGFnczogIDUgYnl0ZXMKICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGEKLSAqIChsaWtlIHN0cnVjdCBOb2RlKS4KJiM0MzsgKiAobGlrZSBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkpLgogICovCiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMAogCiYjNDM7LyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqLwomIzQzOyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOAomIzQzOwomIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIG1hZ2ljIG1hdGNoZXMgQGJwcm0mIzM5O3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovCiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19tYWdpYyhjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsCiYjNDM7CQkJCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICpzID0gYnBybS0mZ3Q7YnVmICYjNDM7IGUtJmd0O29mZnNldDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmICghZS0mZ3Q7bWFzaykKJiM0MzsJCXJldHVybiAhbWVtY21wKHMsIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGUtJmd0O3NpemU7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKChzW2ldIF4gZS0mZ3Q7bWFnaWNbaV0pICZhbXA7IGUtJmd0O21hc2tbaV0pCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovCiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLAomIzQzOwkJCQkgICAgY29uc3QgY2hhciAqZXh0KQomIzQzO3sKJiM0MzsJcmV0dXJuIGV4dCAmYW1wOyZhbXA7ICFzdHJjbXAoZS0mZ3Q7bWFnaWMsIGV4dCk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBzZWFyY2hfYmluZm10X2hhbmRsZXIgLSBzZWFyY2ggZm9yIGEgYmluYXJ5IGhhbmRsZXIgZm9yIEBicHJtCiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlCkBAIC04Niw0MyAmIzQzOzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTsKICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeQogICogdHlwZSBoYW5kbGVycy4KICAqCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2suCiYjNDM7ICoKICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCi0JCQkJICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICoKJiM0MztzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCWNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tJmd0O2ludGVycCwgJiMzOTsuJiMzOTspOwotCU5vZGUgKmU7CiYjNDM7CWNoYXIgKmRvdCA9IHN0cnJjaHIoYnBybS0mZ3Q7aW50ZXJwLCAmIzM5Oy4mIzM5Oyk7CiYjNDM7CWNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCAmIzQzOyAxIDogTlVMTDsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplOwogCiAJLyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIGxpc3QpIHsKLQkJY2hhciAqczsKLQkJaW50IGo7Ci0KJiM0MzsJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbm9kZSkgewogCQkvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovCi0JCWlmICghdGVzdF9iaXQoRW5hYmxlZCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIERvIG1hdGNoaW5nIGJhc2VkIG9uIGV4dGVuc2lvbiBpZiBhcHBsaWNhYmxlLiAqLwotCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmYW1wO2UtJmd0O2ZsYWdzKSkgewotCQkJaWYgKHAgJmFtcDsmYW1wOyAhc3RyY21wKGUtJmd0O21hZ2ljLCBwICYjNDM7IDEpKQomIzQzOwkJaWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpIHsKJiM0MzsJCQlpZiAoZW50cnlfbWF0Y2hlc19tYWdpYyhlLCBicHJtKSkKIAkJCQlyZXR1cm4gZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgJmFtcDsgbWFzay4gKi8KLQkJcyA9IGJwcm0tJmd0O2J1ZiAmIzQzOyBlLSZndDtvZmZzZXQ7Ci0JCWlmIChlLSZndDttYXNrKSB7Ci0JCQlmb3IgKGogPSAwOyBqICZsdDsgZS0mZ3Q7c2l6ZTsgaiYjNDM7JiM0MzspCi0JCQkJaWYgKCgqcyYjNDM7JiM0MzsgXiBlLSZndDttYWdpY1tqXSkgJmFtcDsgZS0mZ3Q7bWFza1tqXSkKLQkJCQkJYnJlYWs7CiAJCX0gZWxzZSB7Ci0JCQlmb3IgKGogPSAwOyBqICZsdDsgZS0mZ3Q7c2l6ZTsgaiYjNDM7JiM0MzspCi0JCQkJaWYgKCgqcyYjNDM7JiM0MzsgXiBlLSZndDttYWdpY1tqXSkpCi0JCQkJCWJyZWFrOwomIzQzOwkJCWlmIChlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihlLCBleHQpKQomIzQzOwkJCQlyZXR1cm4gZTsKIAkJfQotCQlpZiAoaiA9PSBlLSZndDtzaXplKQotCQkJcmV0dXJuIGU7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0xMzQsNjQgJiM0MzsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiAgKiBAYnBybTogYmluYXJ5IGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgYSBoYW5kbGVyCiAgKgogICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhCi0gKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuCiYjNDM7ICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGUKJiM0MzsgKiByZWZjb3VudCBvZiBhbiBlbnRyeSBjYW4gb25seSBkcm9wIHRvIHplcm8gb25jZSBpdCBoYXMgYmVlbiB1bmxpbmtlZCBhbmQKJiM0MzsgKiBhIHJlc3RhcnRlZCBzZWFyY2ggY2Fubm90IGZpbmQgYW4gdW5saW5rZWQgZW50cnkgYWdhaW4gc28gdGhlIHJldHJ5IGxvb3AKJiM0MzsgKiBpcyBib3VuZGVkLgogICoKICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCi0JCQkJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkJCSAgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCU5vZGUgKmU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKIAotCXJlYWRfbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7Ci0JZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKLQlpZiAoZSkKLQkJcmVmY291bnRfaW5jKCZhbXA7ZS0mZ3Q7dXNlcnMpOwotCXJlYWRfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJZ3VhcmQocmN1KSgpOwomIzQzOwlkbyB7CiYjNDM7CQllID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pOwomIzQzOwl9IHdoaWxlIChlICZhbXA7JmFtcDsgIXJlZmNvdW50X2luY19ub3RfemVybygmYW1wO2UtJmd0O3VzZXJzKSk7CiAJcmV0dXJuIGU7CiB9CiAKIC8qKgotICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGUKLSAqIEBlOiBub2RlIHRvIHB1dAomIzQzOyAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBlbnRyeQomIzQzOyAqIEBlOiBlbnRyeSB0byBwdXQKICAqCi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0bwomIzQzOyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0bwogICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZQogICogcmVxdWVzdGVkIHRvIHJlbW92ZS4KICAqLwotc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpCiYjNDM7c3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKIHsKIAlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZhbXA7ZS0mZ3Q7dXNlcnMpKSB7Ci0JCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpCiYjNDM7CQlpZiAoZS0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKSB7CiYjNDM7CQkJZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtJmd0O2ludGVycF9maWxlKTsKIAkJCWZpbHBfY2xvc2UoZS0mZ3Q7aW50ZXJwX2ZpbGUsIE5VTEwpOwotCQlrZnJlZShlKTsKJiM0MzsJCX0KJiM0MzsJCS8qIExvY2tsZXNzIHdhbGtlcnMgbWF5IHN0aWxsIGRlcmVmZXJlbmNlIHRoaXMgZW50cnkuICovCiYjNDM7CQlrZnJlZV9yY3UoZSwgcmN1KTsKIAl9CiB9CiAKJiM0MztERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpCiYjNDM7CiAvKioKLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlCiYjNDM7ICogY3VycmVudF9iaW5mbXRfbWlzYyAtIGdldCB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZQogICoKLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLgotICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2VzbiYjMzk7dCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlCi0gKiBvZiBpdHMgYW5jZXN0b3ImIzM5O3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2YKLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlCi0gKiBhdmFpbGFibGUgdG8gYWxsIHVzZXIgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLgomIzQzOyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlCiYjNDM7ICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZgomIzQzOyAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIHdlcmUgYXZhaWxhYmxlCiYjNDM7ICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2UKJiM0MzsgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpbgomIzQzOyAqIHByYWN0aWNlLgogICoKICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2UKICAqLwotc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKQomIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZCkKIHsKIAljb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwogCi0JdXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOwotCXdoaWxlICh1c2VyX25zKSB7CiYjNDM7CWZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy0mZ3Q7cGFyZW50KSB7CiAJCS8qIFBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKSBpbiBibV9maWxsX3N1cGVyKCkuICovCiAJCW1pc2MgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7dXNlcl9ucy0mZ3Q7YmluZm10X21pc2MpOwogCQlpZiAobWlzYykKIAkJCXJldHVybiBtaXNjOwotCi0JCXVzZXJfbnMgPSB1c2VyX25zLSZndDtwYXJlbnQ7CiAJfQogCiAJcmV0dXJuICZhbXA7aW5pdF9iaW5mbXRfbWlzYzsKQEAgLTIwMiwzMCAmIzQzOzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpCiAgKi8KIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCU5vZGUgKmZtdDsKLQlzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMOwotCWludCByZXR2YWwgPSAtRU5PRVhFQzsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwomIzQzOwlpbnQgcmV0dmFsOwogCi0JbWlzYyA9IGxvYWRfYmluZm10X21pc2MoKTsKLQlpZiAoIW1pc2MtJmd0O2VuYWJsZWQpCi0JCXJldHVybiByZXR2YWw7CiYjNDM7CW1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7CiYjNDM7CWlmICghUkVBRF9PTkNFKG1pc2MtJmd0O2VuYWJsZWQpKQomIzQzOwkJcmV0dXJuIC1FTk9FWEVDOwogCiAJZm10ID0gZ2V0X2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pOwogCWlmICghZm10KQotCQlyZXR1cm4gcmV0dmFsOwomIzQzOwkJcmV0dXJuIC1FTk9FWEVDOwogCiAJLyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqLwotCXJldHZhbCA9IC1FTk9FTlQ7CiAJaWYgKGJwcm0tJmd0O2ludGVycF9mbGFncyAmYW1wOyBCSU5QUk1fRkxBR1NfUEFUSF9JTkFDQ0VTU0lCTEUpCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkgewogCQlicHJtLSZndDtpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IHJlbW92ZV9hcmdfemVybyhicHJtKTsKIAkJaWYgKHJldHZhbCkKLQkJCWdvdG8gcmV0OwomIzQzOwkJCXJldHVybiByZXR2YWw7CiAJfQogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9CSU5BUlkpCkBAIC0yMzQsNTcgJiM0MzsyNTIsNDggQEAgc3RhdGljIGludCBsb2FkX21pc2NfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiAJLyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi8KIAlyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS0mZ3Q7aW50ZXJwLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCWJwcm0tJmd0O2FyZ2MmIzQzOyYjNDM7OwogCiAJLyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqLwogCXJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtJmd0O2ludGVycHJldGVyLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCWJwcm0tJmd0O2FyZ2MmIzQzOyYjNDM7OwogCiAJLyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovCiAJcmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC0mZ3Q7aW50ZXJwcmV0ZXIsIGJwcm0pOwogCWlmIChyZXR2YWwgJmx0OyAwKQotCQlnb3RvIHJldDsKJiM0MzsJCXJldHVybiByZXR2YWw7CiAKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHsKIAkJaW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LSZndDtpbnRlcnBfZmlsZSk7Ci0JCWlmICghSVNfRVJSKGludGVycF9maWxlKSkKLQkJCWRlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTsKJiM0MzsJCWlmICghSVNfRVJSKGludGVycF9maWxlKSkgewomIzQzOwkJCWludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7CiYjNDM7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlmcHV0KGludGVycF9maWxlKTsKJiM0MzsJCQkJaW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7CiYjNDM7CQkJfQomIzQzOwkJfQogCX0gZWxzZSB7CiAJCWludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC0mZ3Q7aW50ZXJwcmV0ZXIpOwogCX0KLQlyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTsKIAlpZiAoSVNfRVJSKGludGVycF9maWxlKSkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gUFRSX0VSUihpbnRlcnBfZmlsZSk7CiAKIAlicHJtLSZndDtpbnRlcnByZXRlciA9IGludGVycF9maWxlOwogCWlmIChmbXQtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX0NSRURFTlRJQUxTKQogCQlicHJtLSZndDtleGVjZmRfY3JlZHMgPSAxOwotCi0JcmV0dmFsID0gMDsKLXJldDoKLQotCS8qCi0JICogSWYgd2UgYWN0dWFsbHkgcHV0IHRoZSBub2RlIGhlcmUgYWxsIGNvbmN1cnJlbnQgY2FsbHMgdG8KLQkgKiBsb2FkX21pc2NfYmluYXJ5KCkgd2lsbCBoYXZlIGZpbmlzaGVkLiBXZSBhbHNvIGtub3cKLQkgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseQotCSAqIHJlbW92ZWQgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBhbmQgaXQmIzM5O3Mgb3VyIGpvYiB0bwotCSAqIGZyZWUgaXQuCi0JICovCi0JcHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogLyogQ29tbWFuZCBwYXJzZXJzICovCiAKIC8qCi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCwKLSAqIHJlY29nbmlzaW5nIHRoZSBceCBzcGVjaWFsLgotICogcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjb3BpZWQgYXJndW1lbnQgb3IgTlVMTCBpbiBjYXNlIG9mIGFuCi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC4KJiM0MzsgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nCiYjNDM7ICogdGhlIFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKJiM0MzsgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLgogICovCiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKIHsKQEAgLTI5OSw0NiAmIzQzOzMwOCwxMjMgQEAgc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpCiAJCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9Ci0Jc1stMV0gPSYjMzk7XDAmIzM5OzsKJiM0MzsJc1stMV0gPSAmIzM5O1wwJiMzOTs7CiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSkKJiM0MztzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpwLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiB7Ci0JY2hhciAqcCA9IHNmczsKLQlpbnQgY29udCA9IDE7Ci0KLQkvKiBzcGVjaWFsIGZsYWdzICovCi0Jd2hpbGUgKGNvbnQpIHsKJiM0MzsJZm9yICg7OyBwJiM0MzsmIzQzOykgewogCQlzd2l0Y2ggKCpwKSB7CiAJCWNhc2UgJiMzOTtQJiMzOTs6CiAJCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBmbGFnOiBQIChwcmVzZXJ2ZSBhcmd2MClcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O08mIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7CiAJCQllLSZndDtmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7QyYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogQyAocHJlc2VydmUgY3JlZHMpXG4mIzM0Oyk7Ci0JCQlwJiM0MzsmIzQzOzsKLQkJCS8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZQotCQkJICAgb3Blbi1iaW5hcnkgZmxhZyAqLwotCQkJZS0mZ3Q7ZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHwKLQkJCQkJTUlTQ19GTVRfT1BFTl9CSU5BUlkpOwomIzQzOwkJCS8qIEMgaW1wbGllcyBPICovCiYjNDM7CQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7RiYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogRjogb3BlbiBpbnRlcnByZXRlciBmaWxlIG5vd1xuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7CiAJCQllLSZndDtmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0ZJTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWNvbnQgPSAwOwomIzQzOwkJCXJldHVybiBwOwogCQl9CiAJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OywgJiMzOTttYWdpYyYjMzk7IGFuZCAmIzM5O21hc2smIzM5OyBmaWVsZHMgb2YgYW4gJiMzOTtNJiMzOTsgZW50cnkuICovCiYjNDM7c3RhdGljIGNoYXIgKnBhcnNlX21hZ2ljX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsIGNoYXIgZGVsKQomIzQzO3sKJiM0MzsJY2hhciAqczsKJiM0MzsKJiM0MzsJLyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCiYjNDM7CXMgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpzID0gJiMzOTtcMCYjMzk7OwomIzQzOwlpZiAocCAhPSBzKSB7CiYjNDM7CQlpZiAoa3N0cnRvaW50KHAsIDEwLCAmYW1wO2UtJmd0O29mZnNldCkgfHwgZS0mZ3Q7b2Zmc2V0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwlwID0gcyAmIzQzOyAxOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxuJiMzNDssIGUtJmd0O29mZnNldCk7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hZ2ljID0gcDsKJiM0MzsJcCA9IHNjYW5hcmcocCwgZGVsKTsKJiM0MzsJaWYgKCFwIHx8ICFlLSZndDttYWdpY1swXSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcmludF9oZXhfZHVtcF9kZWJ1ZygKJiM0MzsJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogJiMzNDssCiYjNDM7CQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFnaWMsIHAgLSBlLSZndDttYWdpYywgdHJ1ZSk7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KJiM0MzsJZS0mZ3Q7bWFzayA9IHA7CiYjNDM7CXAgPSBzY2FuYXJnKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZiAoIWUtJmd0O21hc2tbMF0pIHsKJiM0MzsJCWUtJmd0O21hc2sgPSBOVUxMOwomIzQzOwkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxuJiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiAmIzM0OywKJiM0MzsJCQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFzaywgcCAtIGUtJmd0O21hc2ssIHRydWUpOwomIzQzOwl9CiAKJiM0MzsJLyoKJiM0MzsJICogRGVjb2RlIHRoZSBtYWdpYyAmYW1wOyBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZAomIzQzOwkgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0CiYjNDM7CSAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuCiYjNDM7CSAqLwomIzQzOwllLSZndDtzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFnaWMsIFVORVNDQVBFX0hFWCk7CiYjNDM7CWlmIChlLSZndDttYXNrICZhbXA7JmFtcDsgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLSZndDtzaXplKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWlmIChlLSZndDtzaXplICZndDsgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtJmd0O3NpemUgJmx0OyBlLSZndDtvZmZzZXQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXG4mIzM0OywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogJiMzNDssCiYjNDM7CQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUsIHRydWUpOwomIzQzOwlpZiAoZS0mZ3Q7bWFzaykKJiM0MzsJCXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06ICYjMzQ7LAomIzQzOwkJCURVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLSZndDttYXNrLCBlLSZndDtzaXplLCB0cnVlKTsKJiM0MzsJcmV0dXJuIHA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQgb2YgYW4gJiMzOTtFJiMzOTsgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovCiYjNDM7c3RhdGljIGNoYXIgKnBhcnNlX2V4dGVuc2lvbl9maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLAomIzQzOwkJCQkgICAgY2hhciBkZWwpCiYjNDM7ewomIzQzOwkvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqLwomIzQzOwlwID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hZ2ljID0gcDsKJiM0MzsJcCA9IHN0cmNocihwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlpZiAoIWUtJmd0O21hZ2ljWzBdIHx8IHN0cmNocihlLSZndDttYWdpYywgJiMzOTsvJiMzOTspKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxuJiMzNDssIGUtJmd0O21hZ2ljKTsKJiM0MzsKJiM0MzsJLyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAlyZXR1cm4gcDsKIH0KIApAQCAtMzQ3LDUwICYjNDM7NDMzLDUyIEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSkKICAqICYjMzk7Om5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncyYjMzk7CiAgKiB3aGVyZSB0aGUgJiMzOTs6JiMzOTsgaXMgdGhlIElGUywgdGhhdCBjYW4gYmUgY2hvc2VuIHdpdGggdGhlIGZpcnN0IGNoYXIKICAqLwotc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiYjNDM7CQkJCQkgICAgICBzaXplX3QgY291bnQpCiB7Ci0JTm9kZSAqZTsKLQlpbnQgbWVtc2l6ZSwgZXJyOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJY2hhciAqYnVmLCAqcDsKIAljaGFyIGRlbDsKIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHJlY2VpdmVkICV6dSBieXRlc1xuJiMzNDssIGNvdW50KTsKIAogCS8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLwotCWVyciA9IC1FSU5WQUw7CiAJaWYgKChjb3VudCAmbHQ7IDExKSB8fCAoY291bnQgJmd0OyBNQVhfUkVHSVNURVJfTEVOR1RIKSkKLQkJZ290byBvdXQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWVyciA9IC1FTk9NRU07Ci0JbWVtc2l6ZSA9IHNpemVvZihOb2RlKSAmIzQzOyBjb3VudCAmIzQzOyA4OwotCWUgPSBrbWFsbG9jKG1lbXNpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7CiYjNDM7CWUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgJiM0MzsgTUlTQ19ERUxJTV9QQUQpLAomIzQzOwkJICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7CiAJaWYgKCFlKQotCQlnb3RvIG91dDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcCA9IGJ1ZiA9IChjaGFyICopZSAmIzQzOyBzaXplb2YoTm9kZSk7CiYjNDM7CXAgPSBidWYgPSBlLSZndDtidWY7CiAKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTsKJiM0MzsJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQotCQlnb3RvIGVmYXVsdDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwogCi0JZGVsID0gKnAmIzQzOyYjNDM7OwkvKiBkZWxpbWV0ZXIgKi8KJiM0MzsJZGVsID0gKnAmIzQzOyYjNDM7OwkvKiBkZWxpbWl0ZXIgKi8KIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGRlbGltOiAlI3ggeyVjfVxuJiMzNDssIGRlbCwgZGVsKTsKIAomIzQzOwkvKiBBIGZsYWctY2hhciBkZWxpbWl0ZXIgcnVucyB0aGUgZmxhZyBzY2FuIG9mZiB0aGUgYnVmZmVyLiAqLwomIzQzOwlpZiAoZGVsID09ICYjMzk7UCYjMzk7IHx8IGRlbCA9PSAmIzM5O08mIzM5OyB8fCBkZWwgPT0gJiMzOTtDJiMzOTsgfHwgZGVsID09ICYjMzk7RiYjMzk7KQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiYjNDM7CiAJLyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi8KLQltZW1zZXQoYnVmICYjNDM7IGNvdW50LCBkZWwsIDgpOwomIzQzOwltZW1zZXQoYnVmICYjNDM7IGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O25hbWUmIzM5OyBmaWVsZC4gKi8KIAllLSZndDtuYW1lID0gcDsKIAlwID0gc3RyY2hyKHAsIGRlbCk7CiAJaWYgKCFwKQotCQlnb3RvIGVpbnZhbDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAlpZiAoIWUtJmd0O25hbWVbMF0gfHwKIAkgICAgIXN0cmNtcChlLSZndDtuYW1lLCAmIzM0Oy4mIzM0OykgfHwKIAkgICAgIXN0cmNtcChlLSZndDtuYW1lLCAmIzM0Oy4uJiMzNDspIHx8CiAJICAgIHN0cmNocihlLSZndDtuYW1lLCAmIzM5Oy8mIzM5OykpCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XG4mIzM0OywgZS0mZ3Q7bmFtZSk7CiAKQEAgLTM5OCwxMzQgJiM0Mzs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiAJc3dpdGNoICgqcCYjNDM7JiM0MzspIHsKIAljYXNlICYjMzk7RSYjMzk7OgogCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiB0eXBlOiBFIChleHRlbnNpb24pXG4mIzM0Oyk7Ci0JCWUtJmd0O2ZsYWdzID0gMSAmbHQ7Jmx0OyBFbmFibGVkOwomIzQzOwkJZS0mZ3Q7ZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpOwogCQlicmVhazsKIAljYXNlICYjMzk7TSYjMzk7OgogCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcbiYjMzQ7KTsKLQkJZS0mZ3Q7ZmxhZ3MgPSAoMSAmbHQ7Jmx0OyBFbmFibGVkKSB8ICgxICZsdDsmbHQ7IE1hZ2ljKTsKJiM0MzsJCWUtJmd0O2ZsYWdzID0gQklUKE1JU0NfRk1UX0VOQUJMRURfQklUKSB8IEJJVChNSVNDX0ZNVF9NQUdJQ19CSVQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlnb3RvIGVpbnZhbDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAlpZiAoKnAmIzQzOyYjNDM7ICE9IGRlbCkKLQkJZ290byBlaW52YWw7Ci0KLQlpZiAodGVzdF9iaXQoTWFnaWMsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKSB7Ci0JCS8qIEhhbmRsZSB0aGUgJiMzOTtNJiMzOTsgKG1hZ2ljKSBmb3JtYXQuICovCi0JCWNoYXIgKnM7Ci0KLQkJLyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCi0JCXMgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFzKQotCQkJZ290byBlaW52YWw7Ci0JCSpzID0gJiMzOTtcMCYjMzk7OwotCQlpZiAocCAhPSBzKSB7Ci0JCQlpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgJmFtcDtlLSZndDtvZmZzZXQpOwotCQkJaWYgKHIgIT0gMCB8fCBlLSZndDtvZmZzZXQgJmx0OyAwKQotCQkJCWdvdG8gZWludmFsOwotCQl9Ci0JCXAgPSBzOwotCQlpZiAoKnAmIzQzOyYjNDM7KQotCQkJZ290byBlaW52YWw7Ci0JCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XG4mIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYWdpYyA9IHA7Ci0JCXAgPSBzY2FuYXJnKHAsIGRlbCk7Ci0JCWlmICghcCkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoIWUtJmd0O21hZ2ljWzBdKQotCQkJZ290byBlaW52YWw7Ci0JCWlmIChVU0VfREVCVUcpCi0JCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106ICYjMzQ7LAotCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hZ2ljLCBwIC0gZS0mZ3Q7bWFnaWMpOwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KLQkJZS0mZ3Q7bWFzayA9IHA7Ci0JCXAgPSBzY2FuYXJnKHAsIGRlbCk7Ci0JCWlmICghcCkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoIWUtJmd0O21hc2tbMF0pIHsKLQkJCWUtJmd0O21hc2sgPSBOVUxMOwotCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxuJiMzNDspOwotCQl9IGVsc2UgaWYgKFVTRV9ERUJVRykKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFzaywgcCAtIGUtJmd0O21hc2spOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQkJLyoKLQkJICogRGVjb2RlIHRoZSBtYWdpYyAmYW1wOyBtYXNrIGZpZWxkcy4KLQkJICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbQotCQkgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZQotCQkgKiBpdCBlbmNvdW50ZXJzLgotCQkgKi8KLQkJZS0mZ3Q7c2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtJmd0O21hZ2ljLCBVTkVTQ0FQRV9IRVgpOwotCQlpZiAoZS0mZ3Q7bWFzayAmYW1wOyZhbXA7Ci0JCSAgICBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtJmd0O3NpemUpCi0JCQlnb3RvIGVpbnZhbDsKLQkJaWYgKGUtJmd0O3NpemUgJmd0OyBCSU5QUk1fQlVGX1NJWkUgfHwKLQkJICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtJmd0O3NpemUgJmx0OyBlLSZndDtvZmZzZXQpCi0JCQlnb3RvIGVpbnZhbDsKLQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXG4mIzM0OywgZS0mZ3Q7c2l6ZSk7Ci0JCWlmIChVU0VfREVCVUcpIHsKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06ICYjMzQ7LAotCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKLQotCQkJaWYgKGUtJmd0O21hc2spIHsKLQkJCQlpbnQgaTsKLQkJCQljaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtJmd0O3NpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7Ci0KLQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogJiMzNDssCi0JCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwotCi0JCQkJaWYgKG1hc2tlZCkgewotCQkJCQlmb3IgKGkgPSAwOyBpICZsdDsgZS0mZ3Q7c2l6ZTsgJiM0MzsmIzQzO2kpCi0JCQkJCQltYXNrZWRbaV0gPSBlLSZndDttYWdpY1tpXSAmYW1wOyBlLSZndDttYXNrW2ldOwotCQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06ICYjMzQ7LAotCQkJCQkJRFVNUF9QUkVGSVhfTk9ORSwgbWFza2VkLCBlLSZndDtzaXplKTsKLQotCQkJCQlrZnJlZShtYXNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqLwotCi0JCS8qIFNraXAgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCi0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYWdpYyA9IHA7Ci0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQkJaWYgKCFlLSZndDttYWdpY1swXSB8fCBzdHJjaHIoZS0mZ3Q7bWFnaWMsICYjMzk7LyYjMzk7KSkKLQkJCWdvdG8gZWludmFsOwotCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cbiYjMzQ7LCBlLSZndDttYWdpYyk7Ci0KLQkJLyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCi0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQl9CiYjNDM7CWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKQomIzQzOwkJcCA9IHBhcnNlX21hZ2ljX2ZpZWxkcyhlLCBwLCBkZWwpOwomIzQzOwllbHNlCiYjNDM7CQlwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O2ludGVycHJldGVyJiMzOTsgZmllbGQuICovCiAJZS0mZ3Q7aW50ZXJwcmV0ZXIgPSBwOwogCXAgPSBzdHJjaHIocCwgZGVsKTsKIAlpZiAoIXApCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwogCWlmICghZS0mZ3Q7aW50ZXJwcmV0ZXJbMF0pCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cbiYjMzQ7LCBlLSZndDtpbnRlcnByZXRlcik7CiAKIAkvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqLwpAQCAtNTMzLDI0ICYjNDM7NTIwLDIyIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogCWlmICgqcCA9PSAmIzM5O1xuJiMzOTspCiAJCXAmIzQzOyYjNDM7OwogCWlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudCkKLQkJZ290byBlaW52YWw7Ci0KLQlyZXR1cm4gZTsKLQotb3V0OgotCXJldHVybiBFUlJfUFRSKGVycik7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotZWZhdWx0OgotCWtmcmVlKGUpOwotCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotZWludmFsOgotCWtmcmVlKGUpOwotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwlyZXR1cm4gbm9fZnJlZV9wdHIoZSk7CiB9CiAKJiM0MzsvKiBDb21tYW5kcyBhY2NlcHRlZCBieSB0aGUgL3N0YXR1cyBhbmQgLyZsdDtlbnRyeSZndDsgZmlsZXMuICovCiYjNDM7ZW51bSBibV9jb21tYW5kIHsKJiM0MzsJQk1fQ01EX0lHTk9SRSwJLyogZW1wdHkgd3JpdGUgKi8KJiM0MzsJQk1fQ01EX0RJU0FCTEUsCS8qICYjMzQ7MCYjMzQ7ICovCiYjNDM7CUJNX0NNRF9FTkFCTEUsCS8qICYjMzQ7MSYjMzQ7ICovCiYjNDM7CUJNX0NNRF9SRU1PVkUsCS8qICYjMzQ7LTEmIzM0OyAqLwomIzQzO307CiYjNDM7CiAvKgotICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzoKLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjCiYjNDM7ICogUGFyc2Ugd2hhdCB1c2Vyc3BhY2Ugd3JvdGUgdG8gL3N0YXR1cyBvciBhbiBlbnRyeSBmaWxlOiAmIzM5OzEmIzM5OyBlbmFibGVzLAomIzQzOyAqICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiB7CkBAIC01NjEsNjIgJiM0Mzs1NDYsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIAlpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmICghY291bnQpCi0JCXJldHVybiAwOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9JR05PUkU7CiAJaWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xuJiMzOTspCiAJCWNvdW50LS07CiAJaWYgKGNvdW50ID09IDEgJmFtcDsmYW1wOyBzWzBdID09ICYjMzk7MCYjMzk7KQotCQlyZXR1cm4gMTsKJiM0MzsJCXJldHVybiBCTV9DTURfRElTQUJMRTsKIAlpZiAoY291bnQgPT0gMSAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTsxJiMzOTspCi0JCXJldHVybiAyOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9FTkFCTEU7CiAJaWYgKGNvdW50ID09IDIgJmFtcDsmYW1wOyBzWzBdID09ICYjMzk7LSYjMzk7ICZhbXA7JmFtcDsgc1sxXSA9PSAmIzM5OzEmIzM5OykKLQkJcmV0dXJuIDM7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX1JFTU9WRTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogZ2VuZXJpYyBzdHVmZiAqLwogCi1zdGF0aWMgdm9pZCBlbnRyeV9zdGF0dXMoTm9kZSAqZSwgY2hhciAqcGFnZSkKJiM0MztzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKQogewotCWNoYXIgKmRwID0gcGFnZTsKLQljb25zdCBjaGFyICpzdGF0dXMgPSAmIzM0O2Rpc2FibGVkJiMzNDs7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXFfcHJpbnRmKG0sICYjMzQ7JTAyeCYjMzQ7LCBkYXRhW2ldKTsKJiM0Mzt9CiAKLQlpZiAodGVzdF9iaXQoRW5hYmxlZCwgJmFtcDtlLSZndDtmbGFncykpCi0JCXN0YXR1cyA9ICYjMzQ7ZW5hYmxlZCYjMzQ7OwomIzQzO3N0YXRpYyBpbnQgYm1fZW50cnlfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tJmd0O3ByaXZhdGU7CiAKLQlpZiAoIVZFUkJPU0VfU1RBVFVTKSB7Ci0JCXNwcmludGYocGFnZSwgJiMzNDslc1xuJiMzNDssIHN0YXR1cyk7Ci0JCXJldHVybjsKLQl9CiYjNDM7CWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlzZXFfcHV0cyhtLCAmIzM0O2VuYWJsZWRcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJc2VxX3B1dHMobSwgJiMzNDtkaXNhYmxlZFxuJiMzNDspOwogCi0JZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7JXNcbmludGVycHJldGVyICVzXG4mIzM0Oywgc3RhdHVzLCBlLSZndDtpbnRlcnByZXRlcik7CiYjNDM7CXNlcV9wcmludGYobSwgJiMzNDtpbnRlcnByZXRlciAlc1xuJiMzNDssIGUtJmd0O2ludGVycHJldGVyKTsKIAogCS8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovCi0JZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7ZmxhZ3M6ICYjMzQ7KTsKJiM0MzsJc2VxX3B1dHMobSwgJiMzNDtmbGFnczogJiMzNDspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7UCYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtQJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7TyYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtPJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9DUkVERU5USUFMUykKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtDJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpCi0JCSpkcCYjNDM7JiM0MzsgPSAmIzM5O0YmIzM5OzsKLQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtcbiYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtGJiMzOTspOwomIzQzOwlzZXFfcHV0YyhtLCAmIzM5O1xuJiMzOTspOwogCi0JaWYgKCF0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJc3ByaW50ZihkcCwgJiMzNDtleHRlbnNpb24gLiVzXG4mIzM0OywgZS0mZ3Q7bWFnaWMpOwomIzQzOwlpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpIHsKJiM0MzsJCXNlcV9wcmludGYobSwgJiMzNDtleHRlbnNpb24gLiVzXG4mIzM0OywgZS0mZ3Q7bWFnaWMpOwogCX0gZWxzZSB7Ci0JCWRwICYjNDM7PSBzcHJpbnRmKGRwLCAmIzM0O29mZnNldCAlaVxubWFnaWMgJiMzNDssIGUtJmd0O29mZnNldCk7Ci0JCWRwID0gYmluMmhleChkcCwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwomIzQzOwkJc2VxX3ByaW50ZihtLCAmIzM0O29mZnNldCAlaVxubWFnaWMgJiMzNDssIGUtJmd0O29mZnNldCk7CiYjNDM7CQlibV9zZXFfaGV4KG0sIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKIAkJaWYgKGUtJmd0O21hc2spIHsKLQkJCWRwICYjNDM7PSBzcHJpbnRmKGRwLCAmIzM0O1xubWFzayAmIzM0Oyk7Ci0JCQlkcCA9IGJpbjJoZXgoZHAsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwomIzQzOwkJCXNlcV9wdXRzKG0sICYjMzQ7XG5tYXNrICYjMzQ7KTsKJiM0MzsJCQlibV9zZXFfaGV4KG0sIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwogCQl9Ci0JCSpkcCYjNDM7JiM0MzsgPSAmIzM5O1xuJiMzOTs7Ci0JCSpkcCA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCXNlcV9wdXRjKG0sICYjMzk7XG4mIzM5Oyk7CiAJfQomIzQzOwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKQomIzQzO3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7CiAKQEAgLTY1MiwxNCAmIzQzOzYzOSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAgKiBlbnRyeSBpcyByZW1vdmVkIG9yIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgdGhlIHN1cGVyIGJsb2NrIGlzCiAgKiBzaHV0ZG93bi4KICAqCi0gKiBJZiB0aGUgLSZndDtldmljdCBjYWxsIHdhcyBub3QgY2F1c2VkIGJ5IGEgc3VwZXIgYmxvY2sgc2h1dGRvd24gYnV0IGJ5IGEgd3JpdGUKLSAqIHRvIHJlbW92ZSB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgdGhlIGVudHJ5Ci0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrCi0gKiB0byBtYWtlIHRoYXQgZXhwbGljaXQuCiYjNDM7ICogSWYgdGhlIC0mZ3Q7ZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieQomIzQzOyAqIHJlbW92aW5nIHRoZSBlbnRyeSB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSBvciB1bmxpbmsoMikgdGhlIGVudHJ5CiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKCkKJiM0MzsgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuCiAqLwogc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlOb2RlICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKIAogCWNsZWFyX2lub2RlKGlub2RlKTsKIApAQCAtNjY3LDg5ICYjNDM7NjU0LDEzMiBAQCBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogCQlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7CiAKIAkJbWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpOwotCQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7ZS0mZ3Q7bGlzdCkpCi0JCQlsaXN0X2RlbF9pbml0KCZhbXA7ZS0mZ3Q7bGlzdCk7Ci0JCXdyaXRlX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlzcGluX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwkJaWYgKCFobGlzdF91bmhhc2hlZCgmYW1wO2UtJmd0O25vZGUpKQomIzQzOwkJCWhsaXN0X2RlbF9pbml0X3JjdSgmYW1wO2UtJmd0O25vZGUpOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwogCQlwdXRfYmluZm10X2hhbmRsZXIoZSk7CiAJfQogfQogCiYjNDM7LyoqCiYjNDM7ICogdW5saW5rX2JpbmZtdF9oYW5kbGVyIC0gdW5oYXNoIGEgYmluYXJ5IHR5cGUgaGFuZGxlcgomIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2UKJiM0MzsgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byB1bmhhc2gKJiM0MzsgKgomIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmQKJiM0MzsgKiB1bmxpbmsoMikgaGFwcGVucyB1bmRlciB0aGUgZXhjbHVzaXZlbHkgaGVsZCBpbm9kZSBsb2NrIG9mIHRoZSByb290CiYjNDM7ICogZGVudHJ5IGtlZXBpbmcgdGhlIGxpc3Qgc3RhYmxlIGZvciB3cml0ZXJzLiBsb2FkX21pc2NfYmluYXJ5KCkgd2Fsa3MgaXQKJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbAomIzQzOyAqIHVubGluayB0byBzZXJpYWxpemUgYWdhaW5zdCBibV9ldmljdF9pbm9kZSgpIHdoaWNoIHVubGlua3MgZW50cmllcwomIzQzOyAqIGR1cmluZyB1bW91bnQgd2l0aG91dCBob2xkaW5nIHRoZSByb290IGlub2RlIGxvY2suCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdW5saW5rX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiYjNDM7ewomIzQzOwlzcGluX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwlobGlzdF9kZWxfaW5pdF9yY3UoJmFtcDtlLSZndDtub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzO30KJiM0MzsKIC8qKgogICogcmVtb3ZlX2JpbmZtdF9oYW5kbGVyIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlcgogICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQogICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlCiAgKgogICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZAotICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbQotICogYmluZm10X3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHdhbnQgdG8gdGhpbmsgYWJvdXQKLSAqIGFkZGluZyBhIHByb3BlciAtJmd0O3VubGluaygpIG1ldGhvZCB0byBiaW5mbXRfbWlzYyBpbnN0ZWFkIG9mIGZvcmNpbmcgY2FsbGVyJiMzOTtzCi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhcwotICogd29ya2VkIGZvciBzbyBsb25nIHRoYXQgaXQmIzM5O3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuCiYjNDM7ICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4KICAqLwotc3RhdGljIHZvaWQgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgTm9kZSAqZSkKJiM0MztzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKIHsKLQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZhbXA7ZS0mZ3Q7bGlzdCk7Ci0Jd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJdW5saW5rX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpOwogCWxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLSZndDtkZW50cnksIE5VTEwpOwogfQogCi0vKiAvJmx0O2VudHJ5Jmd0OyAqLwomIzQzOy8qIFJlbW92ZSBAZSB1bmxlc3MgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZC4gKi8KJiM0MztzdGF0aWMgdm9pZCBibV9yZW1vdmVfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi0mZ3Q7c19yb290KTsKIAotc3RhdGljIHNzaXplX3QKLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKJiM0MzsJaW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpOwomIzQzOwlpZiAoIWhsaXN0X3VuaGFzaGVkKCZhbXA7ZS0mZ3Q7bm9kZSkpCiYjNDM7CQlyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhyb290KSwgZSk7CiYjNDM7CWlub2RlX3VubG9jayhyb290KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVtb3ZlIGFsbCBlbnRyaWVzIG9mIHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBAbWlzYyBiZWxvbmdpbmcgdG8gQHNiLiAqLwomIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9hbGxfZW50cmllcyhzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiYjNDM7CQkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlOb2RlICplID0gZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9wcml2YXRlOwotCXNzaXplX3QgcmVzOwotCWNoYXIgKnBhZ2U7CiYjNDM7CXN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItJmd0O3Nfcm9vdCk7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKJiM0MzsJc3RydWN0IGhsaXN0X25vZGUgKm5leHQ7CiYjNDM7CiYjNDM7CWlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTsKJiM0MzsJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIG5vZGUpCiYjNDM7CQlyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7CiYjNDM7CWlub2RlX3VubG9jayhyb290KTsKJiM0Mzt9CiAKLQlwYWdlID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7LyoqCiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpCiYjNDM7ICogQGRpcjogaW5vZGUgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CiYjNDM7ICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmUKJiM0MzsgKgomIzQzOyAqIFJlbW92aW5nIHRoZSBlbnRyeSBmaWxlIHJlbW92ZXMgaXRzIGJpbmFyeSB0eXBlIGhhbmRsZXIsIGV4YWN0bHkgbGlrZQomIzQzOyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4mIzM5O3QgYmUKJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2gKJiM0MzsgKiBzZXJpYWxpemVzIGFnYWluc3QgdGhlIHdyaXRlIGJhc2VkIGFkZCBhbmQgcmVtb3ZlIHBhdGhzLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktJmd0O2lfcHJpdmF0ZTsKJiM0MzsKJiM0MzsJaWYgKCFlKQomIzQzOwkJcmV0dXJuIC1FUEVSTTsKJiM0MzsKJiM0MzsJdW5saW5rX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoZGlyKSwgZSk7CiYjNDM7CXJldHVybiBzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKJiM0Mzt9CiAKLQllbnRyeV9zdGF0dXMoZSwgcGFnZSk7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewomIzQzOwkubG9va3VwCQk9IHNpbXBsZV9sb29rdXAsCiYjNDM7CS51bmxpbmsJCT0gYm1fdW5saW5rLAomIzQzO307CiAKLQlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTsKJiM0MzsvKiAvJmx0O2VudHJ5Jmd0OyAqLwomIzQzOwomIzQzO3N0YXRpYyBpbnQgYm1fZW50cnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiAKLQlrZnJlZShwYWdlKTsKLQlyZXR1cm4gcmVzOwomIzQzOwlyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS0mZ3Q7aV9wcml2YXRlKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovCiYjNDM7CWlmIChmaWxlLSZndDtmX21vZGUgJmFtcDsgRk1PREVfV1JJVEUpCiYjNDM7CQlmaWxlLSZndDtmX21vZGUgfD0gRk1PREVfUFdSSVRFOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7Ci0JTm9kZSAqZSA9IGlub2RlLSZndDtpX3ByaXZhdGU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLSZndDtpX3ByaXZhdGU7CiAJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CiAKIAlzd2l0Y2ggKHJlcykgewotCWNhc2UgMToKLQkJLyogRGlzYWJsZSB0aGlzIGhhbmRsZXIuICovCi0JCWNsZWFyX2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKTsKJiM0MzsJY2FzZSBCTV9DTURfRElTQUJMRToKJiM0MzsJCWNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMjoKLQkJLyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi8KLQkJc2V0X2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKTsKJiM0MzsJY2FzZSBCTV9DTURfRU5BQkxFOgomIzQzOwkJc2V0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJLyogRGVsZXRlIHRoaXMgaGFuZGxlci4gKi8KLQkJaW5vZGUgPSBkX2lub2RlKGlub2RlLSZndDtpX3NiLSZndDtzX3Jvb3QpOwotCQlpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQkgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlCi0JCSAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLgotCQkgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmUKLQkJICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc28KLQkJICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlCi0JCSAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC4KLQkJICovCi0JCWlmICghbGlzdF9lbXB0eSgmYW1wO2UtJmd0O2xpc3QpKQotCQkJcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTsKLQotCQlpbm9kZV91bmxvY2soaW5vZGUpOwomIzQzOwljYXNlIEJNX0NNRF9SRU1PVkU6CiYjNDM7CQlibV9yZW1vdmVfZW50cnkoZSwgaW5vZGUtJmd0O2lfc2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gcmVzOwpAQCAtNzU5LDE1ICYjNDM7Nzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0gewotCS5yZWFkCQk9IGJtX2VudHJ5X3JlYWQsCiYjNDM7CS5vcGVuCQk9IGJtX2VudHJ5X29wZW4sCiYjNDM7CS5yZWFkCQk9IHNlcV9yZWFkLAogCS53cml0ZQkJPSBibV9lbnRyeV93cml0ZSwKLQkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAomIzQzOwkubGxzZWVrCQk9IHNlcV9sc2VlaywKJiM0MzsJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIC8qIC9yZWdpc3RlciAqLwogCiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqLwotc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKJiM0MztzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLSZndDtzX3Jvb3QsIGUtJmd0O25hbWUpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC03ODksOSAmIzQzOzgyMSw5IEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiAKIAlkX21ha2VfcGVyc2lzdGVudChkZW50cnksIGlub2RlKTsKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7Ci0Jd3JpdGVfbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7Ci0JbGlzdF9hZGQoJmFtcDtlLSZndDtsaXN0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMpOwotCXdyaXRlX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWhsaXN0X2FkZF9oZWFkX3JjdSgmYW1wO2UtJmd0O25vZGUsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKIAlzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpOwogCXJldHVybiAwOwogfQpAQCAtNzk5LDEzICYjNDM7ODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlOb2RlICplOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2I7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IGZpbGUgKmYgPSBOVUxMOwomIzQzOwlpbnQgZXJyOwogCiAJZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTsKLQogCWlmIChJU19FUlIoZSkpCiAJCXJldHVybiBQVFJfRVJSKGUpOwogCkBAIC04MjIsNyAmIzQzOzg1Myw2IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQlpZiAoSVNfRVJSKGYpKSB7CiAJCQlwcl9ub3RpY2UoJiMzNDtyZWdpc3RlcjogZmFpbGVkIHRvIGluc3RhbGwgaW50ZXJwcmV0ZXIgZmlsZSAlc1xuJiMzNDssCiAJCQkJIGUtJmd0O2ludGVycHJldGVyKTsKLQkJCWtmcmVlKGUpOwogCQkJcmV0dXJuIFBUUl9FUlIoZik7CiAJCX0KIAkJZS0mZ3Q7aW50ZXJwX2ZpbGUgPSBmOwpAQCAtODM0LDkgJiM0Mzs4NjQsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQlleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7CiAJCQlmaWxwX2Nsb3NlKGYsIE5VTEwpOwogCQl9Ci0JCWtmcmVlKGUpOwogCQlyZXR1cm4gZXJyOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGVudHJ5IGlzIG93bmVkIGJ5IGl0cyBpbm9kZSBub3cuICovCiYjNDM7CXJldGFpbl9hbmRfbnVsbF9wdHIoZSk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC04NTEsMTAgJiM0Mzs4ODMsMTAgQEAgc3RhdGljIHNzaXplX3QKIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwotCWNoYXIgKnM7CiYjNDM7CWNvbnN0IGNoYXIgKnM7CiAKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTsKLQlzID0gbWlzYy0mZ3Q7ZW5hYmxlZCA/ICYjMzQ7ZW5hYmxlZFxuJiMzNDsgOiAmIzM0O2Rpc2FibGVkXG4mIzM0OzsKJiM0MzsJcyA9IFJFQURfT05DRShtaXNjLSZndDtlbmFibGVkKSA/ICYjMzQ7ZW5hYmxlZFxuJiMzNDsgOiAmIzM0O2Rpc2FibGVkXG4mIzM0OzsKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7CiB9CiAKQEAgLTg2MywzNyAmIzQzOzg5NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiB7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwogCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOwotCU5vZGUgKmUsICpuZXh0OwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTsKIAlzd2l0Y2ggKHJlcykgewotCWNhc2UgMToKLQkJLyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovCi0JCW1pc2MtJmd0O2VuYWJsZWQgPSBmYWxzZTsKJiM0MzsJY2FzZSBCTV9DTURfRElTQUJMRToKJiM0MzsJCVdSSVRFX09OQ0UobWlzYy0mZ3Q7ZW5hYmxlZCwgZmFsc2UpOwogCQlicmVhazsKLQljYXNlIDI6Ci0JCS8qIEVuYWJsZSBhbGwgaGFuZGxlcnMuICovCi0JCW1pc2MtJmd0O2VuYWJsZWQgPSB0cnVlOwomIzQzOwljYXNlIEJNX0NNRF9FTkFCTEU6CiYjNDM7CQlXUklURV9PTkNFKG1pc2MtJmd0O2VuYWJsZWQsIHRydWUpOwogCQlicmVhazsKLQljYXNlIDM6Ci0JCS8qIERlbGV0ZSBhbGwgaGFuZGxlcnMuICovCi0JCWlub2RlID0gZF9pbm9kZShmaWxlX2lub2RlKGZpbGUpLSZndDtpX3NiLSZndDtzX3Jvb3QpOwotCQlpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQkgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlCi0JCSAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLgotCQkgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmUKLQkJICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc28KLQkJICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlCi0JCSAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC4KLQkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIGxpc3QpCi0JCQlyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7Ci0KLQkJaW5vZGVfdW5sb2NrKGlub2RlKTsKJiM0MzsJY2FzZSBCTV9DTURfUkVNT1ZFOgomIzQzOwkJYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKG1pc2MsIGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gcmVzOwpAQCAtOTE4LDcgJiM0Mzs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIAlwdXRfdXNlcl9ucyh1c2VyX25zKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0gewomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAogCS5ldmljdF9pbm9kZQk9IGJtX2V2aWN0X2lub2RlLAogCS5wdXRfc3VwZXIJPSBibV9wdXRfc3VwZXIsCkBAIC05NjUsMTAgJiM0Mzs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYykKIAkJaWYgKCFtaXNjKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKLQkJcndsb2NrX2luaXQoJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwkJSU5JVF9ITElTVF9IRUFEKCZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7CiYjNDM7CQlzcGluX2xvY2tfaW5pdCgmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiAKLQkJLyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqLwomIzQzOwkJLyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gY3VycmVudF9iaW5mbXRfbWlzYygpLiAqLwogCQlzbXBfc3RvcmVfcmVsZWFzZSgmYW1wO3VzZXJfbnMtJmd0O2JpbmZtdF9taXNjLCBtaXNjKTsKIAl9CiAKQEAgLTk4MywxMiAmIzQzOzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKQogCSAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHkKIAkgKiByZXNldCAtJmd0O2VuYWJsZWQgdG8gdHJ1ZS4KIAkgKi8KLQltaXNjLSZndDtlbmFibGVkID0gdHJ1ZTsKJiM0MzsJV1JJVEVfT05DRShtaXNjLSZndDtlbmFibGVkLCB0cnVlKTsKIAogCWVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpOwotCWlmICghZXJyKQotCQlzYi0mZ3Q7c19vcCA9ICZhbXA7c19vcHM7Ci0JcmV0dXJuIGVycjsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CXNiLSZndDtzX29wID0gJmFtcDtibV9zdXBlcl9vcHM7CiYjNDM7CWRfaW5vZGUoc2ItJmd0O3Nfcm9vdCktJmd0O2lfb3AgPSAmYW1wO2JtX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYm1fZnJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykKIHN0cnVjdCBiaW5mbXRfbWlzYyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwotCXJ3bG9ja190IGVudHJpZXNfbG9jazsKJiM0MzsJc3RydWN0IGhsaXN0X2hlYWQgZW50cmllczsKJiM0MzsJc3BpbmxvY2tfdCBlbnRyaWVzX2xvY2s7CiAJYm9vbCBlbmFibGVkOwogfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDdhZWY0ZTY3OWE2YTBjLi4yMWJhZmRjMTEzNzk1NiAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvdXNlci5jCkBAIC0yMyw5ICYjNDM7MjMsOSBAQAogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpCiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHsKLQkuZW50cmllcyA9IExJU1RfSEVBRF9JTklUKGluaXRfYmluZm10X21pc2MuZW50cmllcyksCiYjNDM7CS5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULAogCS5lbmFibGVkID0gdHJ1ZSwKLQkuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSwKJiM0MzsJLmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpbml0X2JpbmZtdF9taXNjKTsKICNlbmRpZgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjY4MQoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDY1NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2g6IGJpbmZtdF9taXNjIFJlZmFjdG9yKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCYjMzk7cyBwcmV0dHkgaW50ZXJlc3RpbmcsIGFuZCBkZWZpbml0ZWx5IHdhcnJhbnRzIGEgY2xvc2VyIGxvb2suIFRoZXkmIzM5O3JlIGNoYW5naW5nIHRoZSBgYmluZm10X21pc2NgIHN1YnN5c3RlbSBpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgYGZzL2JpbmZtdF9taXNjLmNgLiAgSXQmIzM5O3MgYSBzaWduaWZpY2FudCByZWZhY3Rvciwgc3dpdGNoaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciBoYW5kbGluZyBiaW5hcnkgZm9ybWF0IGVudHJpZXMgZnJvbSBhIGRvdWJseS1saW5rZWQgbGlzdCAoYHN0cnVjdCBsaXN0X2hlYWRgKSB0byBhbiBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdCAoYHN0cnVjdCBobGlzdF9ub2RlYCAvIGBobGlzdF9oZWFkYCkuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IHRvdWNoZXMgY29yZSBrZXJuZWwgbG9naWMgZm9yIGxvYWRpbmcgYW5kIGV4ZWN1dGluZyBiaW5hcmllcy4gSXQgc2VlbXMgbGlrZSBpdCBhbHNvIGNoYW5nZXMgZnJvbSB1c2luZyBgcndsb2NrX3RgIHRvIGBzcGlubG9ja190YC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1RoaXMgaXMgcmVhY2hhYmxlIGFuZCAqZGVmaW5pdGVseSogd29ydGggZnV6emluZyEmIzM0OyAgQW55IHRpbWUgeW91IHRvdWNoIHNvbWV0aGluZyBmdW5kYW1lbnRhbCBsaWtlIHRoaXMg4oCTIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgYmluYXJ5IGV4ZWN1dGlvbiDigJMgeW91IG9wZW4gdXAgcG90ZW50aWFsIGF0dGFjayB2ZWN0b3JzLiBUaGUgaW50cm9kdWN0aW9uIG9mIFJDVSwgc3BlY2lmaWNhbGx5LCBpcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHdoZXJlIHJhY2UgY29uZGl0aW9ucyBtYXkgYXJpc2UuCgpMZXQmIzM5O3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhleSYjMzk7dmUgdG91Y2hlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gZm9jdXMgbXkgZnV6emluZyBlZmZvcnRzLiAgVGhleSYjMzk7dmUgbW9kaWZpZWQgb3IgYWRkZWQgYSBib2F0bG9hZCBvZiBmdW5jdGlvbnM6IGV2ZXJ5dGhpbmcgZnJvbSBgZW50cnlfbWF0Y2hlc19tYWdpY2AgYW5kIGBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbmAgdG8gYGxvYWRfbWlzY19iaW5hcnlgIGFuZCBhbGwgdGhlIGZpbGUgb3BlcmF0aW9uIGhvb2tzICggYGJtX2dldF9pbm9kZWAsIGBibV9ldmljdF9pbm9kZWAsIGBibV9lbnRyeV9vcGVuYCwgYGJtX2VudHJ5X3dyaXRlYCwgZXRjLikuICBUaGVyZSBpcyBhIGxvdCBvZiBuZXcgY29kZSBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIGB1bmxpbmsoMilgLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGAvcHJvY2AgZmlsZXN5c3RlbS4KCkdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIGVzcGVjaWFsbHkgdGhlIGRhdGEgc3RydWN0dXJlIG1vZGlmaWNhdGlvbnMgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBteSBodW5jaCBpcyB0aGF0IHBhcnNpbmcgYW5kIGZpbGUgb3BlcmF0aW9ucywgYWxvbmcgd2l0aCB0aGUgZXhlY3V0aW9uIHBhdGgsIGFyZSB3aGVyZSB0aGUgbW9zdCBpbnRlcmVzdGluZyBidWdzIG1pZ2h0IGhpZGUuIEkgc2hvdWxkIGNvbmNlbnRyYXRlIG15IGVmZm9ydHMgb24gdGhlc2Ugc3ltYm9sczogYGxvYWRfbWlzY19iaW5hcnlgLCBgY3JlYXRlX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBhbmQgYGJtX2VudHJ5X3Nob3dgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBib3RoIGFkZGluZyBuZXcgaGFuZGxlcnMsIHJlbW92aW5nIGhhbmRsZXJzLCBhbmQgYWN0dWFsbHkgdXNpbmcgdGhlIGhhbmRsZXJzLgoKT25lIG1vcmUgdGhpbmcgdG8gdmVyaWZ5OiBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgdG8gY29uZmlybSB0aGUgbmVjZXNzYXJ5IGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgY29kZS4gSSBzaG91bGQgZ3JlcCBmb3IgYEJJTkZNVF9NSVNDYCB3aXRoaW4gYGZzL0tjb25maWcuYmluZm10YCwgb3Igc2ltaWxhciBmaWxlcywgdG8gbWFrZSBzdXJlIHRoaXMgbW9kdWxlIGlzIGV2ZW4gZW5hYmxlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIHdoZXJlIHRoZSBjb2RlIGlzIGNvbXBpbGVkIHdpdGhpbiB0aGUga2VybmVsIGFuZCB0aHVzLCB3aGVyZSBJIHdpbGwgaGF2ZSB0aGUgbW9zdCBzdWNjZXNzIHRyeWluZyB0byBmaW5kIGlzc3Vlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCSU5GTVRfTUlTQyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9LY29uZmlnLmJpbmZtdD0xMzg9Y29uZmlnIEJJTkZNVF9aRkxBVFxuLS1cbmZzL0tjb25maWcuYmluZm10LTE0NC1cbmZzL0tjb25maWcuYmluZm10OjE0NTpjb25maWcgQklORk1UX01JU0NcbmZzL0tjb25maWcuYmluZm10LTE0Ni1cdHRyaXN0YXRlIFwmIzM0O0tlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzXCYjMzQ7XG4tLVxuZnMvTWFrZWZpbGU9MzQ9b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICAmIzQzOz0gbG9ja3Mub1xuZnMvTWFrZWZpbGU6MzU6b2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVx0JiM0Mzs9IGJpbmZtdF9taXNjLm9cbmZzL01ha2VmaWxlLTM2LW9iai0kKENPTkZJR19CSU5GTVRfU0NSSVBUKVx0JiM0Mzs9IGJpbmZtdF9zY3JpcHQub1xuLS1cbmZzL2ZpbGVfdGFibGUuYz0xNjU9c3RhdGljIGludCBfX2luaXQgaW5pdF9mc19zdGF0X3N5c2N0bHModm9pZClcbi0tXG5mcy9maWxlX3RhYmxlLmMtMTY3LVx0cmVnaXN0ZXJfc3lzY3RsX2luaXQoXCYjMzQ7ZnNcJiMzNDssIGZzX3N0YXRfc3lzY3Rscyk7XG5mcy9maWxlX3RhYmxlLmM6MTY4Olx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKSkge1xuZnMvZmlsZV90YWJsZS5jLTE2OS1cdFx0c3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhkcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODIyMwoJCQkJCQkJb3V0cHV0OiAyMDYKCQkJCQkJCXRob3VnaHRzOiA1NTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBiaW5mbXRfbWlzYyBGaWxlc3lzdGVtIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBgYmluZm10X21pc2NgIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseSBgQklORk1UX01JU0NgLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCB0aGlzIGlzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24sIG5vIG90aGVyIHJlbGV2YW50IGNvbmZpZ3MgYXJlIHByZXNlbnQuIE5vdywgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIGludm9sdmVkLiBJJiMzOTt2ZSBjb21waWxlZCBhIGxpc3Q6CgoqICAgYGJtX3JlZ2lzdGVyX3dyaXRlYAoqICAgYGJtX2VudHJ5X3dyaXRlYAoqICAgYGJtX3N0YXR1c193cml0ZWAKKiAgIGBibV91bmxpbmtgCiogICBgbG9hZF9taXNjX2JpbmFyeWAKKiAgIGBjcmVhdGVfZW50cnlgCiogICBgcGFyc2VfbWFnaWNfZmllbGRzYAoqICAgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgCgpJIGNoZWNrZWQsIGFuZCB0aGV5JiMzOTtyZSBhbGwgc3RhdGljIGV4Y2VwdCBmb3IgYGxvYWRfbWlzY19iaW5hcnlgLiBBaCwgYnV0ICp0aGF0JiMzOTtzKiByZWdpc3RlcmVkIGluIHRoZSBgbGludXhfYmluZm10YCBzdHJ1Y3QsIHNwZWNpZmljYWxseSBsaWtlIHRoaXM6CgpgYGBjCnN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0gewoJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAoJLmxvYWRfYmluYXJ5ID0gbG9hZF9taXNjX2JpbmFyeSwKfTsKYGBgCgpTbyBgbG9hZF9taXNjX2JpbmFyeWAgKmlzKiBleHBvc2VkOyBpdCYjMzk7cyBjYWxsZWQgdmlhIGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBiaW5hcnkgZm9ybWF0IGhhbmRsaW5nLiBTbyB0aGF0JiMzOTtzIHRoZSBlbnRyeSBwb2ludC4KCk9rYXksIGxldCYjMzk7cyBjaXJjbGUgYmFjayBhbmQgY29uZmlybS4gTm8sIGBCSU5GTVRfTUlTQ2AgaXMgdGhlIHJlbGV2YW50IGNvbmZpZy4KCk5vdywgZm9yIHRoZSByZWFzb25pbmc6IFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3JpbmcgYGJpbmZtdF9taXNjYCB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgZG91Ymx5IGxpbmtlZCBsaXN0cywgaXQgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBpdCBhZGRzIGB1bmxpbmsoMilgIHN1cHBvcnQsIGFuZCBpdCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgYHNlcV9maWxlYCkuIFRoaXMgbWVhbnMgdGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgZXhlY3ZlYCBhbmQgb3BlcmF0aW9ucyBvbiBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL2AuCgpUaGVyZWZvcmUsIHRoZSBmb2N1cyBzeW1ib2xzIGFyZToKCiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgCiogICBgYm1fZW50cnlfd3JpdGVgCiogICBgYm1fc3RhdHVzX3dyaXRlYAoqICAgYGJtX3VubGlua2AKKiAgIGBsb2FkX21pc2NfYmluYXJ5YAoqICAgYGNyZWF0ZV9lbnRyeWAKKiAgIGBwYXJzZV9tYWdpY19maWVsZHNgCiogICBgcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkc2AKCkZpbmFsbHksIGxldCYjMzk7cyBhc3Nlc3MgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGFzIGl0IGFmZmVjdHMgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gQW5kIHNpbmNlIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gY2FuIGJlIG1hbmlwdWxhdGVkIGZyb20gdXNlcnNwYWNlICh0aHJvdWdoIGBleGVjdmVgIGFuZCBgL3Byb2NgKSwgaXQgKmNhbiogYmUgZXhlY3V0ZWQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdyBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JtX3JlZ2lzdGVyX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3N0YXR1c193cml0ZSYjMzQ7LAogICAgJiMzNDtibV91bmxpbmsmIzM0OywKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtjcmVhdGVfZW50cnkmIzM0OywKICAgICYjMzQ7cGFyc2VfbWFnaWNfZmllbGRzJiMzNDssCiAgICAmIzM0O3BhcnNlX2V4dGVuc2lvbl9maWVsZHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JtX3JlZ2lzdGVyX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3N0YXR1c193cml0ZSYjMzQ7LAogICAgJiMzNDtibV91bmxpbmsmIzM0OywKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtjcmVhdGVfZW50cnkmIzM0OywKICAgICYjMzQ7cGFyc2VfbWFnaWNfZmllbGRzJiMzNDssCiAgICAmIzM0O3BhcnNlX2V4dGVuc2lvbl9maWVsZHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMTFUMDU6NTA6NTcuNDc3ODU3MTk0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwNTUyMjUyMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQklORk1UX01JU0NcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJibV9yZWdpc3Rlcl93cml0ZVwiLFxuICAgIFwiYm1fZW50cnlfd3JpdGVcIixcbiAgICBcImJtX3N0YXR1c193cml0ZVwiLFxuICAgIFwiYm1fdW5saW5rXCIsXG4gICAgXCJsb2FkX21pc2NfYmluYXJ5XCIsXG4gICAgXCJjcmVhdGVfZW50cnlcIixcbiAgICBcInBhcnNlX21hZ2ljX2ZpZWxkc1wiLFxuICAgIFwicGFyc2VfZXh0ZW5zaW9uX2ZpZWxkc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgYmluZm10X21pc2MgZmlsZXN5c3RlbSB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgYSBkb3VibHkgbGlua2VkIGxpc3QsIGNoYW5nZXMgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgYWRkcyBzdXBwb3J0IGZvciB1bmxpbmtpbmcgZW50cmllcyB2aWEgdW5saW5rKDIpLCBhbmQgcmVmYWN0b3JzIGVudHJ5IHBhcnNpbmcgYW5kIHJlYWRpbmcgKHVzaW5nIHNlcV9maWxlKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyAoYmluYXJ5IGZvcm1hdCBoYW5kbGluZyBhbmQgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0pIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSAodmlhIGV4ZWN2ZSBhbmQgb3BlcmF0aW9ucyBvbiAvcHJvYy9zeXMvZnMvYmluZm10X21pc2MvKSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTFUMDU6NTA6NTcuNDc3ODY2MzU0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDI2MzY1NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5OTQzNjJjZWIzM2ZiOTYxM2RiZjQyMTFlZGQ4Y2M3MTRmNjE2NjRkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgSnVsIDExIDA1OjUwOjU2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cXG4gXFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXFxuK29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkXFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cXG4gXFxuIFxcbiBIaW50c1xcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mY2FhZDE0ZjgxYTM0MiAxMDA2NDRcXG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXFxuKysrIGIvZnMvYmluZm10X21pc2MuY1xcbkBAIC0xMCw0NSArMTAsNDYgQEBcXG4gXFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXFxcIjogXFxcIiBmbXRcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGV4LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpbmZtdHMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcmVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jdHlwZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25hbWVpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY2FsbHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rc3RydG94LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gXFxuLSNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbi1cXG4tI2lmZGVmIERFQlVHXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXFxuLSNlbHNlXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAwXFxuLSNlbmRpZlxcbi1cXG4tZW51bSB7XFxuLVxcdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xcbisvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXFxuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XFxuK1xcdE1JU0NfRk1UX0VOQUJMRURfQklUXFx0PSAwLFxcbitcXHRNSVNDX0ZNVF9NQUdJQ19CSVRcXHQ9IDEsXFxuIH07XFxuIFxcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XFxuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcXHUwMDNjXFx1MDAzYyAzMSlcXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKVxcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXFx1MDAzY1xcdTAwM2MgMjkpXFxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXFx1MDAzY1xcdTAwM2MgMjgpXFxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cXG4rZW51bSBiaW5mbXRfbWlzY19lbnRyeV9mbGFncyB7XFxuK1xcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXFx0PSAoMVUgXFx1MDAzY1xcdTAwM2MgMzEpLFxcbitcXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDMwKSxcXG4rXFx0TUlTQ19GTVRfQ1JFREVOVElBTFNcXHQ9ICgxVSBcXHUwMDNjXFx1MDAzYyAyOSksXFxuK1xcdE1JU0NfRk1UX09QRU5fRklMRVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDI4KSxcXG4rfTtcXG4gXFxuLXR5cGVkZWYgc3RydWN0IHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xcbitcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcdFxcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xcbiBcXHRpbnQgb2Zmc2V0O1xcdFxcdFxcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xcbiBcXHRpbnQgc2l6ZTtcXHRcXHRcXHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcXG4gXFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xcbiBcXHRyZWZjb3VudF90IHVzZXJzO1xcdFxcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xcbi19IE5vZGU7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0Y2hhciBidWZbXTtcXHRcXHRcXHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXFxuK307XFxuIFxcbiAvKlxcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxcbkBAIC03NCwxMCArNzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqICAtIGludGVycDogfjUwIGJ5dGVzXFxuICAqICAtIGZsYWdzOiAgNSBieXRlc1xcbiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhXFxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cXG4gICovXFxuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXFxuIFxcbisvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXFxuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxcbitcXG4rLyogQ2hlY2sgaWYgQGUncyBtYWdpYyBtYXRjaGVzIEBicHJtJ3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXFxuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxcbitcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVxcdTAwM2VidWYgKyBlLVxcdTAwM2VvZmZzZXQ7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRyZXR1cm4gIW1lbWNtcChzLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaSsrKVxcbitcXHRcXHRpZiAoKHNbaV0gXiBlLVxcdTAwM2VtYWdpY1tpXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2ldKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKiBDaGVjayBpZiBAZSdzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqL1xcbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXFxuK1xcdFxcdFxcdFxcdCAgICBjb25zdCBjaGFyICpleHQpXFxuK3tcXG4rXFx0cmV0dXJuIGV4dCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBleHQpO1xcbit9XFxuK1xcbiAvKipcXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxcbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXFxuQEAgLTg2LDQzICsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxcbiAgKiB0eXBlIGhhbmRsZXJzLlxcbiAgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cXG4rICpcXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxcbitzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbiB7XFxuLVxcdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXFx1MDAzZWludGVycCwgJy4nKTtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVxcdTAwM2VpbnRlcnAsICcuJyk7XFxuK1xcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuIFxcbiBcXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdCkge1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXHRcXHRpbnQgajtcXG4tXFxuK1xcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbm9kZSkge1xcbiBcXHRcXHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXFxuLVxcdFxcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4rXFx0XFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cXG4tXFx0XFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSkge1xcbi1cXHRcXHRcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBwICsgMSkpXFxuK1xcdFxcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXFxuIFxcdFxcdFxcdFxcdHJldHVybiBlO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXFx1MDAyNiBtYXNrLiAqL1xcbi1cXHRcXHRzID0gYnBybS1cXHUwMDNlYnVmICsgZS1cXHUwMDNlb2Zmc2V0O1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzaykge1xcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaisrKVxcbi1cXHRcXHRcXHRcXHRpZiAoKCpzKysgXiBlLVxcdTAwM2VtYWdpY1tqXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2pdKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIGUtXFx1MDAzZXNpemU7IGorKylcXG4tXFx0XFx0XFx0XFx0aWYgKCgqcysrIF4gZS1cXHUwMDNlbWFnaWNbal0pKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGlmIChqID09IGUtXFx1MDAzZXNpemUpXFxuLVxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcXG4gICpcXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXFxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cXG4rICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxcbisgKiBpcyBib3VuZGVkLlxcbiAgKlxcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXFxuICAqL1xcbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xcbiBcXG4tXFx0cmVhZF9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xcbi1cXHRpZiAoZSlcXG4tXFx0XFx0cmVmY291bnRfaW5jKFxcdTAwMjZlLVxcdTAwM2V1c2Vycyk7XFxuLVxcdHJlYWRfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRndWFyZChyY3UpKCk7XFxuK1xcdGRvIHtcXG4rXFx0XFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4rXFx0fSB3aGlsZSAoZSBcXHUwMDI2XFx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZlLVxcdTAwM2V1c2VycykpO1xcbiBcXHRyZXR1cm4gZTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXFxuLSAqIEBlOiBub2RlIHRvIHB1dFxcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcXG4rICogQGU6IGVudHJ5IHRvIHB1dFxcbiAgKlxcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xcbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXFxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXFxuIHtcXG4gXFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcXHUwMDI2ZS1cXHUwMDNldXNlcnMpKSB7XFxuLVxcdFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcXG4rXFx0XFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XFxuK1xcdFxcdFxcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZS1cXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xcbi1cXHRcXHRrZnJlZShlKTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xcbitcXHRcXHRrZnJlZV9yY3UoZSwgcmN1KTtcXG4gXFx0fVxcbiB9XFxuIFxcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXFxuK1xcbiAvKipcXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcXG4gICpcXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXFxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXFxuLSAqIG9mIGl0cyBhbmNlc3RvcidzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mXFxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXFxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXFxuKyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxcbisgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxcbisgKiBwcmFjdGljZS5cXG4gICpcXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4gXFxuLVxcdHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTtcXG4tXFx0d2hpbGUgKHVzZXJfbnMpIHtcXG4rXFx0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVxcdTAwM2VwYXJlbnQpIHtcXG4gXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cXG4gXFx0XFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnVzZXJfbnMtXFx1MDAzZWJpbmZtdF9taXNjKTtcXG4gXFx0XFx0aWYgKG1pc2MpXFxuIFxcdFxcdFxcdHJldHVybiBtaXNjO1xcbi1cXG4tXFx0XFx0dXNlcl9ucyA9IHVzZXJfbnMtXFx1MDAzZXBhcmVudDtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIFxcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuICAqL1xcbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4ge1xcbi1cXHROb2RlICpmbXQ7XFxuLVxcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XFxuLVxcdGludCByZXR2YWwgPSAtRU5PRVhFQztcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4rXFx0aW50IHJldHZhbDtcXG4gXFxuLVxcdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XFxuLVxcdGlmICghbWlzYy1cXHUwMDNlZW5hYmxlZClcXG4tXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4rXFx0bWlzYyA9IGN1cnJlbnRfYmluZm10X21pc2MoKTtcXG4rXFx0aWYgKCFSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkpXFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4gXFx0aWYgKCFmbXQpXFxuLVxcdFxcdHJldHVybiByZXR2YWw7XFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cXG4tXFx0cmV0dmFsID0gLUVOT0VOVDtcXG4gXFx0aWYgKGJwcm0tXFx1MDAzZWludGVycF9mbGFncyBcXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcXG4tXFx0XFx0Z290byByZXQ7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xcbiBcXHRcXHRicHJtLVxcdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XFxuIFxcdFxcdGlmIChyZXR2YWwpXFxuLVxcdFxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoZm10LVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4gXFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cXG4gXFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tXFx1MDAzZWludGVycCwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xcbiBcXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LVxcdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXFxuIFxcdHJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtXFx1MDAzZWludGVycHJldGVyLCBicHJtKTtcXG4gXFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuLVxcdFxcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcXG4tXFx0XFx0XFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xcbitcXHRcXHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcXG4rXFx0XFx0XFx0aW50IGVyciA9IGV4ZV9maWxlX2Rlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0XFx0ZnB1dChpbnRlcnBfZmlsZSk7XFxuK1xcdFxcdFxcdFxcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBvcGVuX2V4ZWMoZm10LVxcdTAwM2VpbnRlcnByZXRlcik7XFxuIFxcdH1cXG4tXFx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XFxuIFxcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xcbiBcXG4gXFx0YnBybS1cXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcXG4gXFx0XFx0YnBybS1cXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcXG4tXFxuLVxcdHJldHZhbCA9IDA7XFxuLXJldDpcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXFxuLVxcdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xcbi1cXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxcbi1cXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xcbi1cXHQgKiBmcmVlIGl0Llxcbi1cXHQgKi9cXG4tXFx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0dmFsO1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gLyogQ29tbWFuZCBwYXJzZXJzICovXFxuIFxcbiAvKlxcbi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCxcXG4tICogcmVjb2duaXNpbmcgdGhlIFxcXFx4IHNwZWNpYWwuXFxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxcbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cXG4rICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xcbisgKiB0aGUgXFxcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxcbiAgKi9cXG4gc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXFxuIHtcXG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNbLTFdID0nXFxcXDAnO1xcbitcXHRzWy0xXSA9ICdcXFxcMCc7XFxuIFxcdHJldHVybiBzO1xcbiB9XFxuIFxcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXFxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHRjaGFyICpwID0gc2ZzO1xcbi1cXHRpbnQgY29udCA9IDE7XFxuLVxcbi1cXHQvKiBzcGVjaWFsIGZsYWdzICovXFxuLVxcdHdoaWxlIChjb250KSB7XFxuK1xcdGZvciAoOzsgcCsrKSB7XFxuIFxcdFxcdHN3aXRjaCAoKnApIHtcXG4gXFx0XFx0Y2FzZSAnUCc6XFxuIFxcdFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0cCsrO1xcbiBcXHRcXHRcXHRlLVxcdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ08nOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHArKztcXG4gXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdDJzpcXG4gXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuLVxcdFxcdFxcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxcbi1cXHRcXHRcXHQgICBvcGVuLWJpbmFyeSBmbGFnICovXFxuLVxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XFxuLVxcdFxcdFxcdFxcdFxcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcXG4rXFx0XFx0XFx0LyogQyBpbXBsaWVzIE8gKi9cXG4rXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ0YnOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuIFxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGRlZmF1bHQ6XFxuLVxcdFxcdFxcdGNvbnQgPSAwO1xcbitcXHRcXHRcXHRyZXR1cm4gcDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuK31cXG4rXFxuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcXG4re1xcbitcXHRjaGFyICpzO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpzID0gJ1xcXFwwJztcXG4rXFx0aWYgKHAgIT0gcykge1xcbitcXHRcXHRpZiAoa3N0cnRvaW50KHAsIDEwLCBcXHUwMDI2ZS1cXHUwMDNlb2Zmc2V0KSB8fCBlLVxcdTAwM2VvZmZzZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRwID0gcyArIDE7XFxuK1xcdHByX2RlYnVnKFxcXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXFxcblxcXCIsIGUtXFx1MDAzZW9mZnNldCk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cXG4rXFx0ZS1cXHUwMDNlbWFnaWMgPSBwO1xcbitcXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xcbitcXHRpZiAoIXAgfHwgIWUtXFx1MDAzZW1hZ2ljWzBdKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXFxuK1xcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tyYXddOiBcXFwiLFxcbitcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFnaWMsIHAgLSBlLVxcdTAwM2VtYWdpYywgdHJ1ZSk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRlLVxcdTAwM2VtYXNrID0gcDtcXG4rXFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrWzBdKSB7XFxuK1xcdFxcdGUtXFx1MDAzZW1hc2sgPSBOVUxMO1xcbitcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXFxcblxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFxcXCIsXFxuK1xcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYXNrLCBwIC0gZS1cXHUwMDNlbWFzaywgdHJ1ZSk7XFxuK1xcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxcbitcXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XFxuK1xcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXFxuK1xcdCAqL1xcbitcXHRlLVxcdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrIFxcdTAwMjZcXHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cXHUwMDNlc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChlLVxcdTAwM2VzaXplIFxcdTAwM2UgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcdHByaW50X2hleF9kdW1wX2RlYnVnKFxcbitcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFxcXCIsXFxuK1xcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcXFwiLFxcbitcXHRcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFzaywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdHJldHVybiBwO1xcbit9XFxuK1xcbisvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZCBvZiBhbiAnRScgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcXG4rXFx0XFx0XFx0XFx0ICAgIGNoYXIgZGVsKVxcbit7XFxuK1xcdC8qIFNraXAgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXFxuK1xcdGUtXFx1MDAzZW1hZ2ljID0gcDtcXG4rXFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbitcXHRpZiAoIXApXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHQqcCsrID0gJ1xcXFwwJztcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cXHUwMDNlbWFnaWMsICcvJykpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbitcXG4rXFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRyZXR1cm4gcDtcXG4gfVxcbiBcXG5AQCAtMzQ3LDUwICs0MzMsNTIgQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBzaXplX3QgY291bnQpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4tXFx0aW50IG1lbXNpemUsIGVycjtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRjaGFyICpidWYsICpwO1xcbiBcXHRjaGFyIGRlbDtcXG4gXFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxcXG5cXFwiLCBjb3VudCk7XFxuIFxcbiBcXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cXG4tXFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0aWYgKChjb3VudCBcXHUwMDNjIDExKSB8fCAoY291bnQgXFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tXFx0ZXJyID0gLUVOT01FTTtcXG4tXFx0bWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODtcXG4tXFx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4rXFx0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcXG4rXFx0XFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuIFxcdGlmICghZSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiBcXG4tXFx0cCA9IGJ1ZiA9IChjaGFyICopZSArIHNpemVvZihOb2RlKTtcXG4rXFx0cCA9IGJ1ZiA9IGUtXFx1MDAzZWJ1ZjtcXG4gXFxuLVxcdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xcbitcXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxcbi1cXHRcXHRnb3RvIGVmYXVsdDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuIFxcbi1cXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltZXRlciAqL1xcbitcXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltaXRlciAqL1xcbiBcXG4gXFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXFxcblxcXCIsIGRlbCwgZGVsKTtcXG4gXFxuK1xcdC8qIEEgZmxhZy1jaGFyIGRlbGltaXRlciBydW5zIHRoZSBmbGFnIHNjYW4gb2ZmIHRoZSBidWZmZXIuICovXFxuK1xcdGlmIChkZWwgPT0gJ1AnIHx8IGRlbCA9PSAnTycgfHwgZGVsID09ICdDJyB8fCBkZWwgPT0gJ0YnKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4rXFxuIFxcdC8qIFBhZCB0aGUgYnVmZmVyIHdpdGggdGhlIGRlbGltIHRvIHNpbXBsaWZ5IHBhcnNpbmcgYmVsb3cuICovXFxuLVxcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcXG4rXFx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXFxuIFxcdGUtXFx1MDAzZW5hbWUgPSBwO1xcbiBcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuIFxcdGlmICghcClcXG4tXFx0XFx0Z290byBlaW52YWw7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXHQqcCsrID0gJ1xcXFwwJztcXG4gXFx0aWYgKCFlLVxcdTAwM2VuYW1lWzBdIHx8XFxuIFxcdCAgICAhc3RyY21wKGUtXFx1MDAzZW5hbWUsIFxcXCIuXFxcIikgfHxcXG4gXFx0ICAgICFzdHJjbXAoZS1cXHUwMDNlbmFtZSwgXFxcIi4uXFxcIikgfHxcXG4gXFx0ICAgIHN0cmNocihlLVxcdTAwM2VuYW1lLCAnLycpKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbiBcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXG5AQCAtMzk4LDEzNCArNDg2LDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiBcXHRzd2l0Y2ggKCpwKyspIHtcXG4gXFx0Y2FzZSAnRSc6XFxuIFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcXFxuXFxcIik7XFxuLVxcdFxcdGUtXFx1MDAzZWZsYWdzID0gMSBcXHUwMDNjXFx1MDAzYyBFbmFibGVkO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRjYXNlICdNJzpcXG4gXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXFxcblxcXCIpO1xcbi1cXHRcXHRlLVxcdTAwM2VmbGFncyA9ICgxIFxcdTAwM2NcXHUwMDNjIEVuYWJsZWQpIHwgKDEgXFx1MDAzY1xcdTAwM2MgTWFnaWMpO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCkgfCBCSVQoTUlTQ19GTVRfTUFHSUNfQklUKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFx0fVxcbiBcXHRpZiAoKnArKyAhPSBkZWwpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0aWYgKHRlc3RfYml0KE1hZ2ljLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKSB7XFxuLVxcdFxcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbi1cXHRcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcylcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdCpzID0gJ1xcXFwwJztcXG4tXFx0XFx0aWYgKHAgIT0gcykge1xcbi1cXHRcXHRcXHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXFx1MDAyNmUtXFx1MDAzZW9mZnNldCk7XFxuLVxcdFxcdFxcdGlmIChyICE9IDAgfHwgZS1cXHUwMDNlb2Zmc2V0IFxcdTAwM2MgMClcXG4tXFx0XFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdH1cXG4tXFx0XFx0cCA9IHM7XFxuLVxcdFxcdGlmICgqcCsrKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcXFxuXFxcIiwgZS1cXHUwMDNlb2Zmc2V0KTtcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0pXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRpZiAoVVNFX0RFQlVHKVxcbi1cXHRcXHRcXHRwcmludF9oZXhfZHVtcF9ieXRlcyhcXG4tXFx0XFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFxcXCIsXFxuLVxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hZ2ljLCBwIC0gZS1cXHUwMDNlbWFnaWMpO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0ZS1cXHUwMDNlbWFzayA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFza1swXSkge1xcbi1cXHRcXHRcXHRlLVxcdTAwM2VtYXNrID0gTlVMTDtcXG4tXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxcXG5cXFwiKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChVU0VfREVCVUcpXFxuLVxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFzaywgcCAtIGUtXFx1MDAzZW1hc2spO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy5cXG4tXFx0XFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxcbi1cXHRcXHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxcbi1cXHRcXHQgKiBpdCBlbmNvdW50ZXJzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZS1cXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzayBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVxcdTAwM2VzaXplKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0aWYgKGUtXFx1MDAzZXNpemUgXFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcXG4tXFx0XFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcdFxcdGlmIChVU0VfREVCVUcpIHtcXG4tXFx0XFx0XFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXFxuLVxcdFxcdFxcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFnaWMsIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0XFx0aW50IGk7XFxuLVxcdFxcdFxcdFxcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hc2ssIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0aWYgKG1hc2tlZCkge1xcbi1cXHRcXHRcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgKytpKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHRtYXNrZWRbaV0gPSBlLVxcdTAwM2VtYWdpY1tpXSBcXHUwMDI2IGUtXFx1MDAzZW1hc2tbaV07XFxuLVxcdFxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcbi1cXHRcXHRcXHRcXHRcXHRrZnJlZShtYXNrZWQpO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKiBIYW5kbGUgdGhlICdFJyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovXFxuLVxcbi1cXHRcXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4tXFx0XFx0aWYgKCFwKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0KnArKyA9ICdcXFxcMCc7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXFx1MDAzZW1hZ2ljLCAnLycpKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4tXFxuLVxcdFxcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFx0fVxcbitcXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnaW50ZXJwcmV0ZXInIGZpZWxkLiAqL1xcbiBcXHRlLVxcdTAwM2VpbnRlcnByZXRlciA9IHA7XFxuIFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4gXFx0aWYgKCFwKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRpZiAoIWUtXFx1MDAzZWludGVycHJldGVyWzBdKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZWludGVycHJldGVyKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xcbkBAIC01MzMsMjQgKzUyMCwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcXG4gXFx0aWYgKCpwID09ICdcXFxcbicpXFxuIFxcdFxcdHArKztcXG4gXFx0aWYgKHAgIT0gYnVmICsgY291bnQpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0cmV0dXJuIGU7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tZWZhdWx0Olxcbi1cXHRrZnJlZShlKTtcXG4tXFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuLWVpbnZhbDpcXG4tXFx0a2ZyZWUoZSk7XFxuLVxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XFxuIH1cXG4gXFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXFx1MDAzY2VudHJ5XFx1MDAzZSBmaWxlcy4gKi9cXG4rZW51bSBibV9jb21tYW5kIHtcXG4rXFx0Qk1fQ01EX0lHTk9SRSxcXHQvKiBlbXB0eSB3cml0ZSAqL1xcbitcXHRCTV9DTURfRElTQUJMRSxcXHQvKiBcXFwiMFxcXCIgKi9cXG4rXFx0Qk1fQ01EX0VOQUJMRSxcXHQvKiBcXFwiMVxcXCIgKi9cXG4rXFx0Qk1fQ01EX1JFTU9WRSxcXHQvKiBcXFwiLTFcXFwiICovXFxuK307XFxuK1xcbiAvKlxcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxcbisgKiAnMCcgZGlzYWJsZXMgYW5kICctMScgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuXFxuICAqL1xcbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiB7XFxuQEAgLTU2MSw2MiArNTQ2LDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdGlmICghY291bnQpXFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcXG4gXFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxcXG4nKVxcbiBcXHRcXHRjb3VudC0tO1xcbiBcXHRpZiAoY291bnQgPT0gMSBcXHUwMDI2XFx1MDAyNiBzWzBdID09ICcwJylcXG4tXFx0XFx0cmV0dXJuIDE7XFxuK1xcdFxcdHJldHVybiBCTV9DTURfRElTQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDEgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAyO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDIgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnLScgXFx1MDAyNlxcdTAwMjYgc1sxXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAzO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcXG4gXFx0cmV0dXJuIC1FSU5WQUw7XFxuIH1cXG4gXFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cXG4gXFxuLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKVxcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxcbiB7XFxuLVxcdGNoYXIgKmRwID0gcGFnZTtcXG4tXFx0Y29uc3QgY2hhciAqc3RhdHVzID0gXFxcImRpc2FibGVkXFxcIjtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspXFxuK1xcdFxcdHNlcV9wcmludGYobSwgXFxcIiUwMnhcXFwiLCBkYXRhW2ldKTtcXG4rfVxcbiBcXG4tXFx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpXFxuLVxcdFxcdHN0YXR1cyA9IFxcXCJlbmFibGVkXFxcIjtcXG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXFx1MDAzZXByaXZhdGU7XFxuIFxcbi1cXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XFxuLVxcdFxcdHNwcmludGYocGFnZSwgXFxcIiVzXFxcXG5cXFwiLCBzdGF0dXMpO1xcbi1cXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4rXFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRzZXFfcHV0cyhtLCBcXFwiZW5hYmxlZFxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c2VxX3B1dHMobSwgXFxcImRpc2FibGVkXFxcXG5cXFwiKTtcXG4gXFxuLVxcdGRwICs9IHNwcmludGYoZHAsIFxcXCIlc1xcXFxuaW50ZXJwcmV0ZXIgJXNcXFxcblxcXCIsIHN0YXR1cywgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbitcXHRzZXFfcHJpbnRmKG0sIFxcXCJpbnRlcnByZXRlciAlc1xcXFxuXFxcIiwgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbiBcXG4gXFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cXG4tXFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcImZsYWdzOiBcXFwiKTtcXG4rXFx0c2VxX3B1dHMobSwgXFxcImZsYWdzOiBcXFwiKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXFxuLVxcdFxcdCpkcCsrID0gJ1AnO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnUCcpO1xcbiBcXHRpZiAoZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcXG4tXFx0XFx0KmRwKysgPSAnTyc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdPJyk7XFxuIFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxcbi1cXHRcXHQqZHArKyA9ICdDJztcXG4rXFx0XFx0c2VxX3B1dGMobSwgJ0MnKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxcbi1cXHRcXHQqZHArKyA9ICdGJztcXG4tXFx0KmRwKysgPSAnXFxcXG4nO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnRicpO1xcbitcXHRzZXFfcHV0YyhtLCAnXFxcXG4nKTtcXG4gXFxuLVxcdGlmICghdGVzdF9iaXQoTWFnaWMsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4tXFx0XFx0c3ByaW50ZihkcCwgXFxcImV4dGVuc2lvbiAuJXNcXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4rXFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiZXh0ZW5zaW9uIC4lc1xcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRkcCArPSBzcHJpbnRmKGRwLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbi1cXHRcXHRkcCA9IGJpbjJoZXgoZHAsIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbitcXHRcXHRibV9zZXFfaGV4KG0sIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4tXFx0XFx0XFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0XFx0c2VxX3B1dHMobSwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4rXFx0XFx0XFx0Ym1fc2VxX2hleChtLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0fVxcbi1cXHRcXHQqZHArKyA9ICdcXFxcbic7XFxuLVxcdFxcdCpkcCA9ICdcXFxcMCc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdcXFxcbicpO1xcbiBcXHR9XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpXFxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXFxuIHtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XFxuIFxcbkBAIC02NTIsMTQgKzYzOSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcXG4gICogc2h1dGRvd24uXFxuICAqXFxuLSAqIElmIHRoZSAtXFx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxcbi0gKiB0byByZW1vdmUgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIHRoZSBlbnRyeVxcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXFxuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cXG4rICogSWYgdGhlIC1cXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxcbisgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKVxcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXFxuICovXFxuIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIHtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcbiBcXHRjbGVhcl9pbm9kZShpbm9kZSk7XFxuIFxcbkBAIC02NjcsODkgKzY1NCwxMzIgQEAgc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gXFx0XFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXG4gXFx0XFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xcbi1cXHRcXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRcXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNmUtXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0XFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdGlmICghaGxpc3RfdW5oYXNoZWQoXFx1MDAyNmUtXFx1MDAzZW5vZGUpKVxcbitcXHRcXHRcXHRobGlzdF9kZWxfaW5pdF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUpO1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4gXFx0XFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xcbiBcXHR9XFxuIH1cXG4gXFxuKy8qKlxcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4rICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXFxuKyAqXFxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcXG4rICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxcbisgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0aGxpc3RfZGVsX2luaXRfcmN1KFxcdTAwMjZlLVxcdTAwM2Vub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4gICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlXFxuICAqXFxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcXG4tICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbVxcbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVxcdTAwM2V1bmxpbmsoKSBtZXRob2QgdG8gYmluZm10X21pc2MgaW5zdGVhZCBvZiBmb3JjaW5nIGNhbGxlcidzXFxuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXFxuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXFxuKyAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuXFxuICAqL1xcbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxcbitzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuIFxcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVxcdTAwM2VkZW50cnksIE5VTEwpO1xcbiB9XFxuIFxcbi0vKiAvXFx1MDAzY2VudHJ5XFx1MDAzZSAqL1xcbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXFxuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuK3tcXG4rXFx0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cXHUwMDNlc19yb290KTtcXG4gXFxuLXN0YXRpYyBzc2l6ZV90XFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFxcdTAwMjZlLVxcdTAwM2Vub2RlKSlcXG4rXFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xcbitcXHRpbm9kZV91bmxvY2socm9vdCk7XFxuK31cXG4rXFxuKy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdE5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX3ByaXZhdGU7XFxuLVxcdHNzaXplX3QgcmVzO1xcbi1cXHRjaGFyICpwYWdlO1xcbitcXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVxcdTAwM2VzX3Jvb3QpO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpuZXh0O1xcbitcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzLCBub2RlKVxcbitcXHRcXHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuK1xcdGlub2RlX3VubG9jayhyb290KTtcXG4rfVxcbiBcXG4tXFx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFwYWdlKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rLyoqXFxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxcbisgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnlcXG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcXG4rICpcXG4rICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlXFxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcXG4rICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cXG4rICovXFxuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXFxuK3tcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcbitcXHRpZiAoIWUpXFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xcbit9XFxuIFxcbi1cXHRlbnRyeV9zdGF0dXMoZSwgcGFnZSk7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gc2ltcGxlX2xvb2t1cCxcXG4rXFx0LnVubGlua1xcdFxcdD0gYm1fdW5saW5rLFxcbit9O1xcbiBcXG4tXFx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XFxuKy8qIC9cXHUwMDNjZW50cnlcXHUwMDNlICovXFxuK1xcbitzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4gXFxuLVxcdGtmcmVlKHBhZ2UpO1xcbi1cXHRyZXR1cm4gcmVzO1xcbitcXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cXHUwMDNlaV9wcml2YXRlKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXFxuK1xcdGlmIChmaWxlLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9XUklURSlcXG4rXFx0XFx0ZmlsZS1cXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcXG4rXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xcbiBcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0Y2xlYXJfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuK1xcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XFxuK1xcdFxcdGNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0c2V0X2JpdChFbmFibGVkLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpO1xcbitcXHRjYXNlIEJNX0NNRF9FTkFCTEU6XFxuK1xcdFxcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuIFxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIDM6XFxuLVxcdFxcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXFxuLVxcdFxcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KTtcXG4tXFx0XFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxcbi1cXHRcXHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXFxuLVxcdFxcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxcbi1cXHRcXHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4ndCBiZVxcbi1cXHRcXHQgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzb1xcbi1cXHRcXHQgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2VcXG4tXFx0XFx0ICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZlLVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTtcXG4tXFxuLVxcdFxcdGlub2RlX3VubG9jayhpbm9kZSk7XFxuK1xcdGNhc2UgQk1fQ01EX1JFTU9WRTpcXG4rXFx0XFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiByZXM7XFxuQEAgLTc1OSwxNSArNzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiB9XFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xcbi1cXHQucmVhZFxcdFxcdD0gYm1fZW50cnlfcmVhZCxcXG4rXFx0Lm9wZW5cXHRcXHQ9IGJtX2VudHJ5X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSBzZXFfcmVhZCxcXG4gXFx0LndyaXRlXFx0XFx0PSBibV9lbnRyeV93cml0ZSxcXG4tXFx0Lmxsc2Vla1xcdFxcdD0gZGVmYXVsdF9sbHNlZWssXFxuK1xcdC5sbHNlZWtcXHRcXHQ9IHNlcV9sc2VlayxcXG4rXFx0LnJlbGVhc2VcXHQ9IHNpbmdsZV9yZWxlYXNlLFxcbiB9O1xcbiBcXG4gLyogL3JlZ2lzdGVyICovXFxuIFxcbiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqL1xcbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHtcXG4gXFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVxcdTAwM2VzX3Jvb3QsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbkBAIC03ODksOSArODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4gXFxuIFxcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7XFxuLVxcdHdyaXRlX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZlLVxcdTAwM2VsaXN0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuLVxcdHdyaXRlX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRobGlzdF9hZGRfaGVhZF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuIFxcdHNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTc5OSwxMyArODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYjtcXG4tXFx0aW50IGVyciA9IDA7XFxuIFxcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcXG4rXFx0aW50IGVycjtcXG4gXFxuIFxcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XFxuLVxcbiBcXHRpZiAoSVNfRVJSKGUpKVxcbiBcXHRcXHRyZXR1cm4gUFRSX0VSUihlKTtcXG4gXFxuQEAgLTgyMiw3ICs4NTMsNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcXG4gXFx0XFx0aWYgKElTX0VSUihmKSkge1xcbiBcXHRcXHRcXHRwcl9ub3RpY2UoXFxcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbi1cXHRcXHRcXHRrZnJlZShlKTtcXG4gXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoZik7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZS1cXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xcbkBAIC04MzQsOSArODY0LDExIEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XFxuIFxcdFxcdH1cXG4tXFx0XFx0a2ZyZWUoZSk7XFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4rXFxuK1xcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xcbitcXHRyZXRhaW5fYW5kX251bGxfcHRyKGUpO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIH1cXG4gXFxuQEAgLTg1MSwxMCArODgzLDEwIEBAIHN0YXRpYyBzc2l6ZV90XFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbi1cXHRjaGFyICpzO1xcbitcXHRjb25zdCBjaGFyICpzO1xcbiBcXG4gXFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XFxuLVxcdHMgPSBtaXNjLVxcdTAwM2VlbmFibGVkID8gXFxcImVuYWJsZWRcXFxcblxcXCIgOiBcXFwiZGlzYWJsZWRcXFxcblxcXCI7XFxuK1xcdHMgPSBSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkgPyBcXFwiZW5hYmxlZFxcXFxuXFxcIiA6IFxcXCJkaXNhYmxlZFxcXFxuXFxcIjtcXG4gXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpO1xcbiB9XFxuIFxcbkBAIC04NjMsMzcgKzg5NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcXG4tXFx0Tm9kZSAqZSwgKm5leHQ7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTtcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xcbitcXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxcbitcXHRcXHRXUklURV9PTkNFKG1pc2MtXFx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IHRydWU7XFxuK1xcdGNhc2UgQk1fQ01EX0VOQUJMRTpcXG4rXFx0XFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMzpcXG4tXFx0XFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCk7XFxuLVxcdFxcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3RcXG4tXFx0XFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxcbi1cXHRcXHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cXG4tXFx0XFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcXG4tXFx0XFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cXG4tXFx0XFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXFxuLVxcdFxcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdClcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xcbi1cXG4tXFx0XFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcXG4rXFx0Y2FzZSBCTV9DTURfUkVNT1ZFOlxcbitcXHRcXHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbkBAIC05MTgsNyArOTMwLDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIFxcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XFxuIFxcdC5zdGF0ZnNcXHRcXHQ9IHNpbXBsZV9zdGF0ZnMsXFxuIFxcdC5ldmljdF9pbm9kZVxcdD0gYm1fZXZpY3RfaW5vZGUsXFxuIFxcdC5wdXRfc3VwZXJcXHQ9IGJtX3B1dF9zdXBlcixcXG5AQCAtOTY1LDEwICs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4gXFx0XFx0aWYgKCFtaXNjKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4tXFx0XFx0cndsb2NrX2luaXQoXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdElOSVRfSExJU1RfSEVBRChcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbiBcXG4tXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqL1xcbitcXHRcXHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXFxuIFxcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZ1c2VyX25zLVxcdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XFxuIFxcdH1cXG4gXFxuQEAgLTk4MywxMiArOTk1LDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuIFxcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcXG4gXFx0ICogcmVzZXQgLVxcdTAwM2VlbmFibGVkIHRvIHRydWUuXFxuIFxcdCAqL1xcbi1cXHRtaXNjLVxcdTAwM2VlbmFibGVkID0gdHJ1ZTtcXG4rXFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFxuIFxcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xcbi1cXHRpZiAoIWVycilcXG4tXFx0XFx0c2ItXFx1MDAzZXNfb3AgPSBcXHUwMDI2c19vcHM7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRzYi1cXHUwMDNlc19vcCA9IFxcdTAwMjZibV9zdXBlcl9vcHM7XFxuK1xcdGRfaW5vZGUoc2ItXFx1MDAzZXNfcm9vdCktXFx1MDAzZWlfb3AgPSBcXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xcbi1cXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XFxuK1xcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XFxuK1xcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xcbiBcXHRib29sIGVuYWJsZWQ7XFxuIH0gX19yYW5kb21pemVfbGF5b3V0O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmNcXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3VzZXIuY1xcbisrKyBiL2tlcm5lbC91c2VyLmNcXG5AQCAtMjMsOSArMjMsOSBAQFxcbiBcXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcXG4tXFx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxcbitcXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcXG4gXFx0LmVuYWJsZWQgPSB0cnVlLFxcbi1cXHQuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4rXFx0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4gfTtcXG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MDo1Ny44MjEzNzQ5NDVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NzExNjk3Nzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiY3JlYXRlX2VudHJ5XCIsXG4gICAgXCJwYXJzZV9tYWdpY19maWVsZHNcIixcbiAgICBcInBhcnNlX2V4dGVuc2lvbl9maWVsZHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOTk0MzYyY2ViMzNmYjk2MTNkYmY0MjExZWRkOGNjNzE0ZjYxNjY0ZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgSnVsIDExIDA1OjUwOjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5AQCAtMTMzLDcgKzEzMyw4IEBAIG9yIDEgKHRvIGVuYWJsZSkgdG8gYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAgb3JcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cbiBcbiBZb3UgY2FuIHJlbW92ZSBvbmUgZW50cnkgb3IgYWxsIGVudHJpZXMgYnkgZWNob2luZyAtMSB0byBgYC9wcm9jLy4uLi90aGVfbmFtZWBgXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXG4rb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWRcbitieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuXG4gXG4gXG4gSGludHNcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xuaW5kZXggODQzNDlmY2I5M2YxM2EuLmZjYWFkMTRmODFhMzQyIDEwMDY0NFxuLS0tIGEvZnMvYmluZm10X21pc2MuY1xuKysrIGIvZnMvYmluZm10X21pc2MuY1xuQEAgLTEwLDQ1ICsxMCw0NiBAQFxuIFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXCI6IFwiIGZtdFxuIFxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL21tLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NsZWFudXAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2N0eXBlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjYWxscy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tzdHJ0b3guaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ByaW50ay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmVmY291bnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlcV9maWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC91c2VyX25hbWVzcGFjZS5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXCJpbnRlcm5hbC5oXCJcbi1cbi0jaWZkZWYgREVCVUdcbi0jIGRlZmluZSBVU0VfREVCVUcgMVxuLSNlbHNlXG4tIyBkZWZpbmUgVVNFX0RFQlVHIDBcbi0jZW5kaWZcbi1cbi1lbnVtIHtcbi1cdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xuKy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi9cbitlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2JpdHMge1xuK1x0TUlTQ19GTVRfRU5BQkxFRF9CSVRcdD0gMCxcbitcdE1JU0NfRk1UX01BR0lDX0JJVFx0PSAxLFxuIH07XG4gXG4tZW51bSB7RW5hYmxlZCwgTWFnaWN9O1xuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcdTAwM2NcdTAwM2MgMzEpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFx1MDAzY1x1MDAzYyAzMClcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXHUwMDNjXHUwMDNjIDI5KVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXHUwMDNjXHUwMDNjIDI4KVxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cbitlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHtcbitcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzEpLFxuK1x0TUlTQ19GTVRfT1BFTl9CSU5BUllcdD0gKDFVIFx1MDAzY1x1MDAzYyAzMCksXG4rXHRNSVNDX0ZNVF9DUkVERU5USUFMU1x0PSAoMVUgXHUwMDNjXHUwMDNjIDI5KSxcbitcdE1JU0NfRk1UX09QRU5fRklMRVx0PSAoMVUgXHUwMDNjXHUwMDNjIDI4KSxcbit9O1xuIFxuLXR5cGVkZWYgc3RydWN0IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xuK1x0c3RydWN0IGhsaXN0X25vZGUgbm9kZTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XHRcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xuIFx0aW50IG9mZnNldDtcdFx0XHQvKiBvZmZzZXQgb2YgbWFnaWMgKi9cbiBcdGludCBzaXplO1x0XHRcdC8qIHNpemUgb2YgbWFnaWMvbWFzayAqL1xuQEAgLTU5LDkgKzYwLDkgQEAgdHlwZWRlZiBzdHJ1Y3Qge1xuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5O1xuIFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xuIFx0cmVmY291bnRfdCB1c2VycztcdFx0Lyogc3luYyByZW1vdmFsIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpICovXG4tfSBOb2RlO1xuLVxuLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuK1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbitcdGNoYXIgYnVmW107XHRcdFx0LyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqL1xuK307XG4gXG4gLypcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxuQEAgLTc0LDEwICs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiAgLSBpbnRlcnA6IH41MCBieXRlc1xuICAqICAtIGZsYWdzOiAgNSBieXRlc1xuICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGFcbi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cbiAgKi9cbiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMFxuIFxuKy8qIFRyYWlsaW5nIGRlbGltaXRlciBwYWQgc28gZmllbGQgcGFyc2luZyBhbHdheXMgdGVybWluYXRlcyBhdCBhIGRlbGltaXRlci4gKi9cbisjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDhcbitcbisvKiBDaGVjayBpZiBAZSdzIG1hZ2ljIG1hdGNoZXMgQGJwcm0ncyBidWZmZXIsIGFwcGx5aW5nIHRoZSBtYXNrIGlmIHNldC4gKi9cbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX21hZ2ljKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSxcbitcdFx0XHRcdGNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4re1xuK1x0Y29uc3QgY2hhciAqcyA9IGJwcm0tXHUwMDNlYnVmICsgZS1cdTAwM2VvZmZzZXQ7XG4rXHRpbnQgaTtcbitcbitcdGlmICghZS1cdTAwM2VtYXNrKVxuK1x0XHRyZXR1cm4gIW1lbWNtcChzLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZS1cdTAwM2VzaXplOyBpKyspXG4rXHRcdGlmICgoc1tpXSBeIGUtXHUwMDNlbWFnaWNbaV0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV0pXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qIENoZWNrIGlmIEBlJ3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovXG4rc3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuK1x0XHRcdFx0ICAgIGNvbnN0IGNoYXIgKmV4dClcbit7XG4rXHRyZXR1cm4gZXh0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGUtXHUwMDNlbWFnaWMsIGV4dCk7XG4rfVxuK1xuIC8qKlxuICAqIHNlYXJjaF9iaW5mbXRfaGFuZGxlciAtIHNlYXJjaCBmb3IgYSBiaW5hcnkgaGFuZGxlciBmb3IgQGJwcm1cbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXG5AQCAtODYsNDMgKzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnlcbiAgKiB0eXBlIGhhbmRsZXJzLlxuICAqXG4rICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2suXG4rICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxuK3NlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Y2hhciAqcCA9IHN0cnJjaHIoYnBybS1cdTAwM2VpbnRlcnAsICcuJyk7XG4tXHROb2RlICplO1xuK1x0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJy4nKTtcbitcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuIFx0LyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbGlzdCkge1xuLVx0XHRjaGFyICpzO1xuLVx0XHRpbnQgajtcbi1cbitcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIG5vZGUpIHtcbiBcdFx0LyogTWFrZSBzdXJlIHRoaXMgb25lIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqL1xuLVx0XHRpZiAoIXRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gZXh0ZW5zaW9uIGlmIGFwcGxpY2FibGUuICovXG4tXHRcdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdFx0aWYgKHAgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgcCArIDEpKVxuK1x0XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuK1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX21hZ2ljKGUsIGJwcm0pKVxuIFx0XHRcdFx0cmV0dXJuIGU7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXHUwMDI2IG1hc2suICovXG4tXHRcdHMgPSBicHJtLVx1MDAzZWJ1ZiArIGUtXHUwMDNlb2Zmc2V0O1xuLVx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqKyspXG4tXHRcdFx0XHRpZiAoKCpzKysgXiBlLVx1MDAzZW1hZ2ljW2pdKSBcdTAwMjYgZS1cdTAwM2VtYXNrW2pdKVxuLVx0XHRcdFx0XHRicmVhaztcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBlLVx1MDAzZXNpemU7IGorKylcbi1cdFx0XHRcdGlmICgoKnMrKyBeIGUtXHUwMDNlbWFnaWNbal0pKVxuLVx0XHRcdFx0XHRicmVhaztcbitcdFx0XHRpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSlcbitcdFx0XHRcdHJldHVybiBlO1xuIFx0XHR9XG4tXHRcdGlmIChqID09IGUtXHUwMDNlc2l6ZSlcbi1cdFx0XHRyZXR1cm4gZTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTEzNCw2NCArMTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcbiAgKlxuICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYVxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cbisgKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIFRoZVxuKyAqIHJlZmNvdW50IG9mIGFuIGVudHJ5IGNhbiBvbmx5IGRyb3AgdG8gemVybyBvbmNlIGl0IGhhcyBiZWVuIHVubGlua2VkIGFuZFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxuKyAqIGlzIGJvdW5kZWQuXG4gICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHRzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZTtcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbi1cdHJlYWRfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuLVx0aWYgKGUpXG4tXHRcdHJlZmNvdW50X2luYyhcdTAwMjZlLVx1MDAzZXVzZXJzKTtcbi1cdHJlYWRfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGd1YXJkKHJjdSkoKTtcbitcdGRvIHtcbitcdFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbitcdH0gd2hpbGUgKGUgXHUwMDI2XHUwMDI2ICFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2ZS1cdTAwM2V1c2VycykpO1xuIFx0cmV0dXJuIGU7XG4gfVxuIFxuIC8qKlxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXG4tICogQGU6IG5vZGUgdG8gcHV0XG4rICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIGVudHJ5XG4rICogQGU6IGVudHJ5IHRvIHB1dFxuICAqXG4tICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbiAgKiBsb2FkX21pc2NfYmluYXJ5KCkgaW4gY2FzZSBpdCBpcyB1c2luZyB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciB3ZSB3ZXJlXG4gICogcmVxdWVzdGVkIHRvIHJlbW92ZS5cbiAgKi9cbi1zdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoTm9kZSAqZSlcbitzdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbiBcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2ZS1cdTAwM2V1c2VycykpIHtcbi1cdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbitcdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuK1x0XHRcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVx1MDAzZWludGVycF9maWxlKTtcbiBcdFx0XHRmaWxwX2Nsb3NlKGUtXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xuLVx0XHRrZnJlZShlKTtcbitcdFx0fVxuK1x0XHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xuK1x0XHRrZnJlZV9yY3UoZSwgcmN1KTtcbiBcdH1cbiB9XG4gXG4rREVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKVxuK1xuIC8qKlxuLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcbiAgKlxuLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLlxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXG4tICogb2YgaXRzIGFuY2VzdG9yJ3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2Zcbi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZVxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXG4rICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2Vzbid0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCB1c2VzIHRoZVxuKyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2ZcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxuKyAqIHRvIGFsbCB1c2VycyBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uIFRoZSBpbml0IHVzZXIgbmFtZXNwYWNlXG4rICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW5cbisgKiBwcmFjdGljZS5cbiAgKlxuICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbitzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpXG4ge1xuIFx0Y29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuIFxuLVx0dXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuLVx0d2hpbGUgKHVzZXJfbnMpIHtcbitcdGZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQpIHtcbiBcdFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cbiBcdFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYyk7XG4gXHRcdGlmIChtaXNjKVxuIFx0XHRcdHJldHVybiBtaXNjO1xuLVxuLVx0XHR1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQ7XG4gXHR9XG4gXG4gXHRyZXR1cm4gXHUwMDI2aW5pdF9iaW5mbXRfbWlzYztcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXG4gICovXG4gc3RhdGljIGludCBsb2FkX21pc2NfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZm10O1xuLVx0c3RydWN0IGZpbGUgKmludGVycF9maWxlID0gTlVMTDtcbi1cdGludCByZXR2YWwgPSAtRU5PRVhFQztcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDtcbitcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbitcdGludCByZXR2YWw7XG4gXG4tXHRtaXNjID0gbG9hZF9iaW5mbXRfbWlzYygpO1xuLVx0aWYgKCFtaXNjLVx1MDAzZWVuYWJsZWQpXG4tXHRcdHJldHVybiByZXR2YWw7XG4rXHRtaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpO1xuK1x0aWYgKCFSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSlcbitcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0Zm10ID0gZ2V0X2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuIFx0aWYgKCFmbXQpXG4tXHRcdHJldHVybiByZXR2YWw7XG4rXHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cbi1cdHJldHZhbCA9IC1FTk9FTlQ7XG4gXHRpZiAoYnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHtcbiBcdFx0YnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmV0dmFsID0gcmVtb3ZlX2FyZ196ZXJvKGJwcm0pO1xuIFx0XHRpZiAocmV0dmFsKVxuLVx0XHRcdGdvdG8gcmV0O1xuK1x0XHRcdHJldHVybiByZXR2YWw7XG4gXHR9XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiBcdC8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovXG4gXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS1cdTAwM2VpbnRlcnAsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MrKztcbiBcbiBcdC8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtXHUwMDNlaW50ZXJwcmV0ZXIsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MrKztcbiBcbiBcdC8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqL1xuIFx0cmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuIFx0XHRpbnRlcnBfZmlsZSA9IGZpbGVfY2xvbmVfb3BlbihmbXQtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuLVx0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpXG4tXHRcdFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuK1x0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcbitcdFx0XHRpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuK1xuK1x0XHRcdGlmIChlcnIpIHtcbitcdFx0XHRcdGZwdXQoaW50ZXJwX2ZpbGUpO1xuK1x0XHRcdFx0aW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHR9IGVsc2Uge1xuIFx0XHRpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFx0fVxuLVx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXHRpZiAoSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcbiBcdGJwcm0tXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuIFx0XHRicHJtLVx1MDAzZWV4ZWNmZF9jcmVkcyA9IDE7XG4tXG4tXHRyZXR2YWwgPSAwO1xuLXJldDpcbi1cbi1cdC8qXG4tXHQgKiBJZiB3ZSBhY3R1YWxseSBwdXQgdGhlIG5vZGUgaGVyZSBhbGwgY29uY3VycmVudCBjYWxscyB0b1xuLVx0ICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93XG4tXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxuLVx0ICogcmVtb3ZlZCB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IGFuZCBpdCdzIG91ciBqb2IgdG9cbi1cdCAqIGZyZWUgaXQuXG4tXHQgKi9cbi1cdHB1dF9iaW5mbXRfaGFuZGxlcihmbXQpO1xuLVxuLVx0cmV0dXJuIHJldHZhbDtcbitcdHJldHVybiAwO1xuIH1cbiBcbiAvKiBDb21tYW5kIHBhcnNlcnMgKi9cbiBcbiAvKlxuLSAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLFxuLSAqIHJlY29nbmlzaW5nIHRoZSBcXHggc3BlY2lhbC5cbi0gKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW5cbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cbisgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nXG4rICogdGhlIFxceCBlc2NhcGUuIFRlcm1pbmF0ZXMgdGhlIGFyZ3VtZW50IHdpdGggYSBOVUwgYW5kIHJldHVybnMgYSBwb2ludGVyXG4rICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS5cbiAgKi9cbiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiB7XG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIFx0XHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbiBcdH1cbi1cdHNbLTFdID0nXFwwJztcbitcdHNbLTFdID0gJ1xcMCc7XG4gXHRyZXR1cm4gcztcbiB9XG4gXG4tc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHRjaGFyICpwID0gc2ZzO1xuLVx0aW50IGNvbnQgPSAxO1xuLVxuLVx0Lyogc3BlY2lhbCBmbGFncyAqL1xuLVx0d2hpbGUgKGNvbnQpIHtcbitcdGZvciAoOzsgcCsrKSB7XG4gXHRcdHN3aXRjaCAoKnApIHtcbiBcdFx0Y2FzZSAnUCc6XG4gXHRcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxuXCIpO1xuLVx0XHRcdHArKztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdPJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ0MnOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxcblwiKTtcbi1cdFx0XHRwKys7XG4tXHRcdFx0LyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlXG4tXHRcdFx0ICAgb3Blbi1iaW5hcnkgZmxhZyAqL1xuLVx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHxcbi1cdFx0XHRcdFx0TUlTQ19GTVRfT1BFTl9CSU5BUlkpO1xuK1x0XHRcdC8qIEMgaW1wbGllcyBPICovXG4rXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9DUkVERU5USUFMUyB8IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdGJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBGOiBvcGVuIGludGVycHJldGVyIGZpbGUgbm93XFxuXCIpO1xuLVx0XHRcdHArKztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbi1cdFx0XHRjb250ID0gMDtcbitcdFx0XHRyZXR1cm4gcDtcbiBcdFx0fVxuIFx0fVxuK31cbitcbisvKiBQYXJzZSB0aGUgJ29mZnNldCcsICdtYWdpYycgYW5kICdtYXNrJyBmaWVsZHMgb2YgYW4gJ00nIGVudHJ5LiAqL1xuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcbit7XG4rXHRjaGFyICpzO1xuK1xuK1x0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xuK1x0cyA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFzKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpzID0gJ1xcMCc7XG4rXHRpZiAocCAhPSBzKSB7XG4rXHRcdGlmIChrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KSB8fCBlLVx1MDAzZW9mZnNldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHAgPSBzICsgMTtcbitcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbitcbitcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuK1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4rXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuK1x0aWYgKCFwIHx8ICFlLVx1MDAzZW1hZ2ljWzBdKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwiLFxuK1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgcCAtIGUtXHUwMDNlbWFnaWMsIHRydWUpO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cbitcdGUtXHUwMDNlbWFzayA9IHA7XG4rXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4rXHRcdGUtXHUwMDNlbWFzayA9IE5VTEw7XG4rXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXG5cIik7XG4rXHR9IGVsc2Uge1xuK1x0XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbitcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFwiLFxuK1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2ssIHRydWUpO1xuK1x0fVxuIFxuK1x0LypcbitcdCAqIERlY29kZSB0aGUgbWFnaWMgXHUwMDI2IG1hc2sgZmllbGRzLiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkXG4rXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XG4rXHQgKiB0aGUgZmlyc3Qgb25lIHRoZXkgZW5jb3VudGVyLlxuK1x0ICovXG4rXHRlLVx1MDAzZXNpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xuK1x0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjYgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtXHUwMDNlc2l6ZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcXG5cIiwgZS1cdTAwM2VzaXplKTtcbitcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcIixcbitcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4rXHRpZiAoZS1cdTAwM2VtYXNrKVxuK1x0XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbitcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcIixcbitcdFx0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUsIHRydWUpO1xuK1x0cmV0dXJuIHA7XG4rfVxuK1xuKy8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkIG9mIGFuICdFJyBlbnRyeTogdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gKi9cbitzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsXG4rXHRcdFx0XHQgICAgY2hhciBkZWwpXG4re1xuK1x0LyogU2tpcCB0aGUgJ29mZnNldCcgZmllbGQuICovXG4rXHRwID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnArKyA9ICdcXDAnO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4rXHRlLVx1MDAzZW1hZ2ljID0gcDtcbitcdHAgPSBzdHJjaHIocCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHQqcCsrID0gJ1xcMCc7XG4rXHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICcvJykpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0cHJfZGVidWcoXCJyZWdpc3RlcjogZXh0ZW5zaW9uOiB7JXN9XFxuXCIsIGUtXHUwMDNlbWFnaWMpO1xuK1xuK1x0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xuK1x0cCA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpwKysgPSAnXFwwJztcbiBcdHJldHVybiBwO1xuIH1cbiBcbkBAIC0zNDcsNTAgKzQzMyw1MiBAQCBzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4gICogJzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MnXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxuICAqL1xuLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuK1x0XHRcdFx0XHQgICAgICBzaXplX3QgY291bnQpXG4ge1xuLVx0Tm9kZSAqZTtcbi1cdGludCBtZW1zaXplLCBlcnI7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRjaGFyICpidWYsICpwO1xuIFx0Y2hhciBkZWw7XG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcXG5cIiwgY291bnQpO1xuIFxuIFx0Lyogc29tZSBzYW5pdHkgY2hlY2tzICovXG4tXHRlcnIgPSAtRUlOVkFMO1xuIFx0aWYgKChjb3VudCBcdTAwM2MgMTEpIHx8IChjb3VudCBcdTAwM2UgTUFYX1JFR0lTVEVSX0xFTkdUSCkpXG4tXHRcdGdvdG8gb3V0O1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdGVyciA9IC1FTk9NRU07XG4tXHRtZW1zaXplID0gc2l6ZW9mKE5vZGUpICsgY291bnQgKyA4O1xuLVx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbitcdGUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgKyBNSVNDX0RFTElNX1BBRCksXG4rXHRcdCAgICBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuIFx0aWYgKCFlKVxuLVx0XHRnb3RvIG91dDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRwID0gYnVmID0gKGNoYXIgKillICsgc2l6ZW9mKE5vZGUpO1xuK1x0cCA9IGJ1ZiA9IGUtXHUwMDNlYnVmO1xuIFxuLVx0bWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7XG4rXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4gXHRpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSlcbi1cdFx0Z290byBlZmF1bHQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuIFxuLVx0ZGVsID0gKnArKztcdC8qIGRlbGltZXRlciAqL1xuK1x0ZGVsID0gKnArKztcdC8qIGRlbGltaXRlciAqL1xuIFxuIFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZGVsaW06ICUjeCB7JWN9XFxuXCIsIGRlbCwgZGVsKTtcbiBcbitcdC8qIEEgZmxhZy1jaGFyIGRlbGltaXRlciBydW5zIHRoZSBmbGFnIHNjYW4gb2ZmIHRoZSBidWZmZXIuICovXG4rXHRpZiAoZGVsID09ICdQJyB8fCBkZWwgPT0gJ08nIHx8IGRlbCA9PSAnQycgfHwgZGVsID09ICdGJylcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXG4gXHQvKiBQYWQgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWxpbSB0byBzaW1wbGlmeSBwYXJzaW5nIGJlbG93LiAqL1xuLVx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIDgpO1xuK1x0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcbiBcbiBcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHQqcCsrID0gJ1xcMCc7XG4gXHRpZiAoIWUtXHUwMDNlbmFtZVswXSB8fFxuIFx0ICAgICFzdHJjbXAoZS1cdTAwM2VuYW1lLCBcIi5cIikgfHxcbiBcdCAgICAhc3RyY21wKGUtXHUwMDNlbmFtZSwgXCIuLlwiKSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICcvJykpXG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXG5cIiwgZS1cdTAwM2VuYW1lKTtcbiBcbkBAIC0zOTgsMTM0ICs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwKyspIHtcbiBcdGNhc2UgJ0UnOlxuIFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiB0eXBlOiBFIChleHRlbnNpb24pXFxuXCIpO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbitcdFx0ZS1cdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSAnTSc6XG4gXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IHR5cGU6IE0gKG1hZ2ljKVxcblwiKTtcbi1cdFx0ZS1cdTAwM2VmbGFncyA9ICgxIFx1MDAzY1x1MDAzYyBFbmFibGVkKSB8ICgxIFx1MDAzY1x1MDAzYyBNYWdpYyk7XG4rXHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0fVxuIFx0aWYgKCpwKysgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAnTScgKG1hZ2ljKSBmb3JtYXQuICovXG4tXHRcdGNoYXIgKnM7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbi1cdFx0cyA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXMpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpzID0gJ1xcMCc7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwKyspXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCIsXG4tXHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFzaycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFzayA9IHA7XG4tXHRcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbi1cdFx0XHRlLVx1MDAzZW1hc2sgPSBOVUxMO1xuLVx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXG5cIik7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCI6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiBcIixcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzayk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXFxuXCIsIGUtXHUwMDNlc2l6ZSk7XG4tXHRcdGlmIChVU0VfREVCVUcpIHtcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwiLFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0XHRpbnQgaTtcbi1cdFx0XHRcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cdTAwM2VzaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuLVxuLVx0XHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFwiLFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgKytpKVxuLVx0XHRcdFx0XHRcdG1hc2tlZFtpXSA9IGUtXHUwMDNlbWFnaWNbaV0gXHUwMDI2IGUtXHUwMDNlbWFza1tpXTtcbi1cdFx0XHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCI6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCIsXG4tXHRcdFx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgbWFza2VkLCBlLVx1MDAzZXNpemUpO1xuLVxuLVx0XHRcdFx0XHRrZnJlZShtYXNrZWQpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cdFx0fVxuLVx0fSBlbHNlIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAnRScgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnArKyA9ICdcXDAnO1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICcvJykpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnArKyA9ICdcXDAnO1xuLVx0fVxuK1x0aWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbitcdGVsc2VcbitcdFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJ2ludGVycHJldGVyJyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHQqcCsrID0gJ1xcMCc7XG4gXHRpZiAoIWUtXHUwMDNlaW50ZXJwcmV0ZXJbMF0pXG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGludGVycHJldGVyOiB7JXN9XFxuXCIsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFxuIFx0LyogUGFyc2UgdGhlICdmbGFncycgZmllbGQuICovXG5AQCAtNTMzLDI0ICs1MjAsMjIgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRpZiAoKnAgPT0gJ1xcbicpXG4gXHRcdHArKztcbiBcdGlmIChwICE9IGJ1ZiArIGNvdW50KVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdHJldHVybiBlO1xuLVxuLW91dDpcbi1cdHJldHVybiBFUlJfUFRSKGVycik7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLWVmYXVsdDpcbi1cdGtmcmVlKGUpO1xuLVx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4tZWludmFsOlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4rLyogQ29tbWFuZHMgYWNjZXB0ZWQgYnkgdGhlIC9zdGF0dXMgYW5kIC9cdTAwM2NlbnRyeVx1MDAzZSBmaWxlcy4gKi9cbitlbnVtIGJtX2NvbW1hbmQge1xuK1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4rXHRCTV9DTURfRElTQUJMRSxcdC8qIFwiMFwiICovXG4rXHRCTV9DTURfRU5BQkxFLFx0LyogXCIxXCIgKi9cbitcdEJNX0NNRF9SRU1PVkUsXHQvKiBcIi0xXCIgKi9cbit9O1xuK1xuIC8qXG4tICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzpcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xuKyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJzEnIGVuYWJsZXMsXG4rICogJzAnIGRpc2FibGVzIGFuZCAnLTEnIHJlbW92ZXMgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzLlxuICAqL1xuIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4ge1xuQEAgLTU2MSw2MiArNTQ2LDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0aWYgKCFjb3VudClcbi1cdFx0cmV0dXJuIDA7XG4rXHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxuJylcbiBcdFx0Y291bnQtLTtcbiBcdGlmIChjb3VudCA9PSAxIFx1MDAyNlx1MDAyNiBzWzBdID09ICcwJylcbi1cdFx0cmV0dXJuIDE7XG4rXHRcdHJldHVybiBCTV9DTURfRElTQUJMRTtcbiBcdGlmIChjb3VudCA9PSAxIFx1MDAyNlx1MDAyNiBzWzBdID09ICcxJylcbi1cdFx0cmV0dXJuIDI7XG4rXHRcdHJldHVybiBCTV9DTURfRU5BQkxFO1xuIFx0aWYgKGNvdW50ID09IDIgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJy0nIFx1MDAyNlx1MDAyNiBzWzFdID09ICcxJylcbi1cdFx0cmV0dXJuIDM7XG4rXHRcdHJldHVybiBCTV9DTURfUkVNT1ZFO1xuIFx0cmV0dXJuIC1FSU5WQUw7XG4gfVxuIFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cbiBcbi1zdGF0aWMgdm9pZCBlbnRyeV9zdGF0dXMoTm9kZSAqZSwgY2hhciAqcGFnZSlcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxuIHtcbi1cdGNoYXIgKmRwID0gcGFnZTtcbi1cdGNvbnN0IGNoYXIgKnN0YXR1cyA9IFwiZGlzYWJsZWRcIjtcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpKyspXG4rXHRcdHNlcV9wcmludGYobSwgXCIlMDJ4XCIsIGRhdGFbaV0pO1xuK31cbiBcbi1cdGlmICh0ZXN0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbi1cdFx0c3RhdHVzID0gXCJlbmFibGVkXCI7XG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxuK3tcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXHUwMDNlcHJpdmF0ZTtcbiBcbi1cdGlmICghVkVSQk9TRV9TVEFUVVMpIHtcbi1cdFx0c3ByaW50ZihwYWdlLCBcIiVzXFxuXCIsIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbitcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdHNlcV9wdXRzKG0sIFwiZW5hYmxlZFxcblwiKTtcbitcdGVsc2VcbitcdFx0c2VxX3B1dHMobSwgXCJkaXNhYmxlZFxcblwiKTtcbiBcbi1cdGRwICs9IHNwcmludGYoZHAsIFwiJXNcXG5pbnRlcnByZXRlciAlc1xcblwiLCBzdGF0dXMsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuK1x0c2VxX3ByaW50ZihtLCBcImludGVycHJldGVyICVzXFxuXCIsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFxuIFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cbi1cdGRwICs9IHNwcmludGYoZHAsIFwiZmxhZ3M6IFwiKTtcbitcdHNlcV9wdXRzKG0sIFwiZmxhZ3M6IFwiKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMClcbi1cdFx0KmRwKysgPSAnUCc7XG4rXHRcdHNlcV9wdXRjKG0sICdQJyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCsrID0gJ08nO1xuK1x0XHRzZXFfcHV0YyhtLCAnTycpO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuLVx0XHQqZHArKyA9ICdDJztcbitcdFx0c2VxX3B1dGMobSwgJ0MnKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpXG4tXHRcdCpkcCsrID0gJ0YnO1xuLVx0KmRwKysgPSAnXFxuJztcbitcdFx0c2VxX3B1dGMobSwgJ0YnKTtcbitcdHNlcV9wdXRjKG0sICdcXG4nKTtcbiBcbi1cdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdHNwcmludGYoZHAsIFwiZXh0ZW5zaW9uIC4lc1xcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbitcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuK1x0XHRzZXFfcHJpbnRmKG0sIFwiZXh0ZW5zaW9uIC4lc1xcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGRwICs9IHNwcmludGYoZHAsIFwib2Zmc2V0ICVpXFxubWFnaWMgXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbi1cdFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuK1x0XHRzZXFfcHJpbnRmKG0sIFwib2Zmc2V0ICVpXFxubWFnaWMgXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbitcdFx0Ym1fc2VxX2hleChtLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuIFx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0ZHAgKz0gc3ByaW50ZihkcCwgXCJcXG5tYXNrIFwiKTtcbi1cdFx0XHRkcCA9IGJpbjJoZXgoZHAsIGUtXHUwMDNlbWFzaywgZS1cdTAwM2VzaXplKTtcbitcdFx0XHRzZXFfcHV0cyhtLCBcIlxcbm1hc2sgXCIpO1xuK1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCsrID0gJ1xcbic7XG4tXHRcdCpkcCA9ICdcXDAnO1xuK1x0XHRzZXFfcHV0YyhtLCAnXFxuJyk7XG4gXHR9XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKVxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XG4gXG5AQCAtNjUyLDE0ICs2MzksMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuKyAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxuKyAqIHJlbW92aW5nIHRoZSBlbnRyeSB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSBvciB1bmxpbmsoMikgdGhlIGVudHJ5XG4rICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXG4gKi9cbiBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4gXG4gXHRjbGVhcl9pbm9kZShpbm9kZSk7XG4gXG5AQCAtNjY3LDg5ICs2NTQsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRpZiAoIWhsaXN0X3VuaGFzaGVkKFx1MDAyNmUtXHUwMDNlbm9kZSkpXG4rXHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiBcdFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xuIFx0fVxuIH1cbiBcbisvKipcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4rICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuKyAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHVuaGFzaFxuKyAqXG4rICogQWRkaW5nIGFuZCByZW1vdmluZyBlbnRyaWVzIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGFuZFxuKyAqIHVubGluaygyKSBoYXBwZW5zIHVuZGVyIHRoZSBleGNsdXNpdmVseSBoZWxkIGlub2RlIGxvY2sgb2YgdGhlIHJvb3RcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuKyAqIGNvbmN1cnJlbnRseSB1bmRlciBSQ1UuIFRoZSBlbnRyaWVzX2xvY2sgaXMgb25seSBoZWxkIGFyb3VuZCB0aGUgYWN0dWFsXG4rICogdW5saW5rIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IGJtX2V2aWN0X2lub2RlKCkgd2hpY2ggdW5saW5rcyBlbnRyaWVzXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbisgKi9cbitzdGF0aWMgdm9pZCB1bmxpbmtfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4re1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK31cbitcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXInc1xuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXG4tICogd29ya2VkIGZvciBzbyBsb25nIHRoYXQgaXQncyBub3QgYSBwcmVzc2luZyBpc3N1ZS5cbisgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4rc3RhdGljIHZvaWQgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbi1cdHdyaXRlX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuKy8qIFJlbW92ZSBAZSB1bmxlc3MgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZC4gKi9cbitzdGF0aWMgdm9pZCBibV9yZW1vdmVfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiBcbi1zdGF0aWMgc3NpemVfdFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcbitcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbitcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbitcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xuK1x0aW5vZGVfdW5sb2NrKHJvb3QpO1xuK31cbitcbisvKiBSZW1vdmUgYWxsIGVudHJpZXMgb2YgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIEBtaXNjIGJlbG9uZ2luZyB0byBAc2IuICovXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHROb2RlICplID0gZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3ByaXZhdGU7XG4tXHRzc2l6ZV90IHJlcztcbi1cdGNoYXIgKnBhZ2U7XG4rXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDtcbitcbitcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbitcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgbmV4dCwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBub2RlKVxuK1x0XHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XG4rXHRpbm9kZV91bmxvY2socm9vdCk7XG4rfVxuIFxuLVx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghcGFnZSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4rLyoqXG4rICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4rICogQGRpcjogaW5vZGUgb2YgdGhlIHJvb3QgZGlyZWN0b3J5XG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcbisgKlxuKyAqIFJlbW92aW5nIHRoZSBlbnRyeSBmaWxlIHJlbW92ZXMgaXRzIGJpbmFyeSB0eXBlIGhhbmRsZXIsIGV4YWN0bHkgbGlrZVxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxuKyAqIHJlbW92ZWQuIFRoZSBWRlMgY2FsbHMgdGhpcyB3aXRoIHRoZSByb290IGlub2RlIGxvY2sgaGVsZCB3aGljaFxuKyAqIHNlcmlhbGl6ZXMgYWdhaW5zdCB0aGUgd3JpdGUgYmFzZWQgYWRkIGFuZCByZW1vdmUgcGF0aHMuXG4rICovXG4rc3RhdGljIGludCBibV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcbit7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuK1xuK1x0aWYgKCFlKVxuK1x0XHRyZXR1cm4gLUVQRVJNO1xuK1xuK1x0dW5saW5rX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoZGlyKSwgZSk7XG4rXHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4rfVxuIFxuLVx0ZW50cnlfc3RhdHVzKGUsIHBhZ2UpO1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcbitcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuK1x0LnVubGlua1x0XHQ9IGJtX3VubGluayxcbit9O1xuIFxuLVx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XG4rLyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4rXG4rc3RhdGljIGludCBibV9lbnRyeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuK3tcbitcdGludCByZXQ7XG4gXG4tXHRrZnJlZShwYWdlKTtcbi1cdHJldHVybiByZXM7XG4rXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cdTAwM2VpX3ByaXZhdGUpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4rXHRpZiAoZmlsZS1cdTAwM2VmX21vZGUgXHUwMDI2IEZNT0RFX1dSSVRFKVxuK1x0XHRmaWxlLVx1MDAzZWZfbW9kZSB8PSBGTU9ERV9QV1JJVEU7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbiBcbiBcdHN3aXRjaCAocmVzKSB7XG4tXHRjYXNlIDE6XG4tXHRcdC8qIERpc2FibGUgdGhpcyBoYW5kbGVyLiAqL1xuLVx0XHRjbGVhcl9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4rXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxuK1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbitcdGNhc2UgQk1fQ01EX0VOQUJMRTpcbitcdFx0c2V0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgdGhpcyBoYW5kbGVyLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX3Jvb3QpO1xuLVx0XHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Rcbi1cdFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxuLVx0XHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cbi1cdFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4rXHRjYXNlIEJNX0NNRF9SRU1PVkU6XG4rXHRcdGJtX3JlbW92ZV9lbnRyeShlLCBpbm9kZS1cdTAwM2VpX3NiKTtcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gcmVzO1xuQEAgLTc1OSwxNSArNzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuK1x0Lm9wZW5cdFx0PSBibV9lbnRyeV9vcGVuLFxuK1x0LnJlYWRcdFx0PSBzZXFfcmVhZCxcbiBcdC53cml0ZVx0XHQ9IGJtX2VudHJ5X3dyaXRlLFxuLVx0Lmxsc2Vla1x0XHQ9IGRlZmF1bHRfbGxzZWVrLFxuK1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbitcdC5yZWxlYXNlXHQ9IHNpbmdsZV9yZWxlYXNlLFxuIH07XG4gXG4gLyogL3JlZ2lzdGVyICovXG4gXG4gLyogYWRkIHRvIGZpbGVzeXN0ZW0gKi9cbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3N0YXRpYyBpbnQgYWRkX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBzaW1wbGVfc3RhcnRfY3JlYXRpbmcoc2ItXHUwMDNlc19yb290LCBlLVx1MDAzZW5hbWUpO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbkBAIC03ODksOSArODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGhsaXN0X2FkZF9oZWFkX3JjdShcdTAwMjZlLVx1MDAzZW5vZGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyArODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdE5vZGUgKmU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiO1xuLVx0aW50IGVyciA9IDA7XG4gXHRzdHJ1Y3QgZmlsZSAqZiA9IE5VTEw7XG4rXHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICs4NTMsNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiBcdFx0aWYgKElTX0VSUihmKSkge1xuIFx0XHRcdHByX25vdGljZShcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxuXCIsXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgKzg2NCwxMSBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiBcdFx0XHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XG4gXHRcdFx0ZmlscF9jbG9zZShmLCBOVUxMKTtcbiBcdFx0fVxuLVx0XHRrZnJlZShlKTtcbiBcdFx0cmV0dXJuIGVycjtcbiBcdH1cbitcbitcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuK1x0cmV0YWluX2FuZF9udWxsX3B0cihlKTtcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG5AQCAtODUxLDEwICs4ODMsMTAgQEAgc3RhdGljIHNzaXplX3RcbiBibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKVxuIHtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbi1cdGNoYXIgKnM7XG4rXHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCJlbmFibGVkXFxuXCIgOiBcImRpc2FibGVkXFxuXCI7XG4rXHRzID0gUkVBRF9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCkgPyBcImVuYWJsZWRcXG5cIiA6IFwiZGlzYWJsZWRcXG5cIjtcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICs4OTUsMTcgQEAgc3RhdGljIHNzaXplX3QgYm1fc3RhdHVzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIHtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xuLVx0Tm9kZSAqZSwgKm5leHQ7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gZmFsc2U7XG4rXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxuK1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbitcdGNhc2UgQk1fQ01EX0VOQUJMRTpcbitcdFx0V1JJVEVfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQsIHRydWUpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMzpcbi1cdFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYi1cdTAwM2VzX3Jvb3QpO1xuLVx0XHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Rcbi1cdFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxuLVx0XHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cbi1cdFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuK1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuK1x0XHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiKTtcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gcmVzO1xuQEAgLTkxOCw3ICs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4rc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJtX3N1cGVyX29wcyA9IHtcbiBcdC5zdGF0ZnNcdFx0PSBzaW1wbGVfc3RhdGZzLFxuIFx0LmV2aWN0X2lub2RlXHQ9IGJtX2V2aWN0X2lub2RlLFxuIFx0LnB1dF9zdXBlclx0PSBibV9wdXRfc3VwZXIsXG5AQCAtOTY1LDEwICs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdFx0aWYgKCFtaXNjKVxuIFx0XHRcdHJldHVybiAtRU5PTUVNO1xuIFxuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuLVx0XHRyd2xvY2tfaW5pdChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXG4tXHRcdC8qIFBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGluIGxvYWRfYmluZm10X21pc2MoKS4gKi9cbitcdFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gY3VycmVudF9iaW5mbXRfbWlzYygpLiAqL1xuIFx0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZ1c2VyX25zLVx1MDAzZWJpbmZtdF9taXNjLCBtaXNjKTtcbiBcdH1cbiBcbkBAIC05ODMsMTIgKzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbitcdFdSSVRFX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkLCB0cnVlKTtcbiBcbiBcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdHNiLVx1MDAzZXNfb3AgPSBcdTAwMjZzX29wcztcbi1cdHJldHVybiBlcnI7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0c2ItXHUwMDNlc19vcCA9IFx1MDAyNmJtX3N1cGVyX29wcztcbitcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgYm1fZnJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuaW5kZXggMmM3N2UzODNlNzM3NTcuLjdlNzMzM2I3YmIwZjExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG5AQCAtMTAxLDggKzEwMSw4IEBAIHN0cnVjdCBsaW51eF9iaW5mbXQge1xuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcbiBzdHJ1Y3QgYmluZm10X21pc2Mge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xuLVx0cndsb2NrX3QgZW50cmllc19sb2NrO1xuK1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbitcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xuIFx0Ym9vbCBlbmFibGVkO1xuIH0gX19yYW5kb21pemVfbGF5b3V0O1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvdXNlci5jXG4rKysgYi9rZXJuZWwvdXNlci5jXG5AQCAtMjMsOSArMjMsOSBAQFxuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcbi1cdC5lbnRyaWVzID0gTElTVF9IRUFEX0lOSVQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzKSxcbitcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4rXHQuZW50cmllc19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLFxuIH07XG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XG4gI2VuZGlmXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MDo1Ny44MjEzNzY0NzVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NDgwNDUxNTExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaDogYmluZm10X21pc2MgUmVmYWN0b3IqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIHByZXR0eSBpbnRlcmVzdGluZywgYW5kIGRlZmluaXRlbHkgd2FycmFudHMgYSBjbG9zZXIgbG9vay4gVGhleSdyZSBjaGFuZ2luZyB0aGUgYGJpbmZtdF9taXNjYCBzdWJzeXN0ZW0gaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGBmcy9iaW5mbXRfbWlzYy5jYC4gIEl0J3MgYSBzaWduaWZpY2FudCByZWZhY3Rvciwgc3dpdGNoaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciBoYW5kbGluZyBiaW5hcnkgZm9ybWF0IGVudHJpZXMgZnJvbSBhIGRvdWJseS1saW5rZWQgbGlzdCAoYHN0cnVjdCBsaXN0X2hlYWRgKSB0byBhbiBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdCAoYHN0cnVjdCBobGlzdF9ub2RlYCAvIGBobGlzdF9oZWFkYCkuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IHRvdWNoZXMgY29yZSBrZXJuZWwgbG9naWMgZm9yIGxvYWRpbmcgYW5kIGV4ZWN1dGluZyBiaW5hcmllcy4gSXQgc2VlbXMgbGlrZSBpdCBhbHNvIGNoYW5nZXMgZnJvbSB1c2luZyBgcndsb2NrX3RgIHRvIGBzcGlubG9ja190YC5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiVGhpcyBpcyByZWFjaGFibGUgYW5kICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nIVwiICBBbnkgdGltZSB5b3UgdG91Y2ggc29tZXRoaW5nIGZ1bmRhbWVudGFsIGxpa2UgdGhpcyDigJMgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBiaW5hcnkgZXhlY3V0aW9uIOKAkyB5b3Ugb3BlbiB1cCBwb3RlbnRpYWwgYXR0YWNrIHZlY3RvcnMuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBzcGVjaWZpY2FsbHksIGlzIGEgZ29vZCBpbmRpY2F0b3Igb2Ygd2hlcmUgcmFjZSBjb25kaXRpb25zIG1heSBhcmlzZS5cblxuTGV0J3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhleSd2ZSB0b3VjaGVkLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0byBmb2N1cyBteSBmdXp6aW5nIGVmZm9ydHMuICBUaGV5J3ZlIG1vZGlmaWVkIG9yIGFkZGVkIGEgYm9hdGxvYWQgb2YgZnVuY3Rpb25zOiBldmVyeXRoaW5nIGZyb20gYGVudHJ5X21hdGNoZXNfbWFnaWNgIGFuZCBgZW50cnlfbWF0Y2hlc19leHRlbnNpb25gIHRvIGBsb2FkX21pc2NfYmluYXJ5YCBhbmQgYWxsIHRoZSBmaWxlIG9wZXJhdGlvbiBob29rcyAoIGBibV9nZXRfaW5vZGVgLCBgYm1fZXZpY3RfaW5vZGVgLCBgYm1fZW50cnlfb3BlbmAsIGBibV9lbnRyeV93cml0ZWAsIGV0Yy4pLiAgVGhlcmUgaXMgYSBsb3Qgb2YgbmV3IGNvZGUgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSBgdW5saW5rKDIpYCwgd2hpY2ggbWVhbnMgdGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBgL3Byb2NgIGZpbGVzeXN0ZW0uXG5cbkdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIGVzcGVjaWFsbHkgdGhlIGRhdGEgc3RydWN0dXJlIG1vZGlmaWNhdGlvbnMgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBteSBodW5jaCBpcyB0aGF0IHBhcnNpbmcgYW5kIGZpbGUgb3BlcmF0aW9ucywgYWxvbmcgd2l0aCB0aGUgZXhlY3V0aW9uIHBhdGgsIGFyZSB3aGVyZSB0aGUgbW9zdCBpbnRlcmVzdGluZyBidWdzIG1pZ2h0IGhpZGUuIEkgc2hvdWxkIGNvbmNlbnRyYXRlIG15IGVmZm9ydHMgb24gdGhlc2Ugc3ltYm9sczogYGxvYWRfbWlzY19iaW5hcnlgLCBgY3JlYXRlX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBhbmQgYGJtX2VudHJ5X3Nob3dgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBib3RoIGFkZGluZyBuZXcgaGFuZGxlcnMsIHJlbW92aW5nIGhhbmRsZXJzLCBhbmQgYWN0dWFsbHkgdXNpbmcgdGhlIGhhbmRsZXJzLlxuXG5PbmUgbW9yZSB0aGluZyB0byB2ZXJpZnk6IEkgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBjb25maXJtIHRoZSBuZWNlc3Nhcnkga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBjb2RlLiBJIHNob3VsZCBncmVwIGZvciBgQklORk1UX01JU0NgIHdpdGhpbiBgZnMvS2NvbmZpZy5iaW5mbXRgLCBvciBzaW1pbGFyIGZpbGVzLCB0byBtYWtlIHN1cmUgdGhpcyBtb2R1bGUgaXMgZXZlbiBlbmFibGVkLiBUaGlzIHdpbGwgaGVscCBkZXRlcm1pbmUgd2hlcmUgdGhlIGNvZGUgaXMgY29tcGlsZWQgd2l0aGluIHRoZSBrZXJuZWwgYW5kIHRodXMsIHdoZXJlIEkgd2lsbCBoYXZlIHRoZSBtb3N0IHN1Y2Nlc3MgdHJ5aW5nIHRvIGZpbmQgaXNzdWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY4MSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDA1OjUxOjA3LjMwMTgyOTUwNloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDE0OTAzNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJCSU5GTVRfTUlTQ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZy5iaW5mbXQ9MTM4PWNvbmZpZyBCSU5GTVRfWkZMQVRcXG4tLVxcbmZzL0tjb25maWcuYmluZm10LTE0NC1cXG5mcy9LY29uZmlnLmJpbmZtdDoxNDU6Y29uZmlnIEJJTkZNVF9NSVNDXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTQ2LVxcdHRyaXN0YXRlIFxcXCJLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllc1xcXCJcXG4tLVxcbmZzL01ha2VmaWxlPTM0PW9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgKz0gbG9ja3Mub1xcbmZzL01ha2VmaWxlOjM1Om9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcXHQrPSBiaW5mbXRfbWlzYy5vXFxuZnMvTWFrZWZpbGUtMzYtb2JqLSQoQ09ORklHX0JJTkZNVF9TQ1JJUFQpXFx0Kz0gYmluZm10X3NjcmlwdC5vXFxuLS1cXG5mcy9maWxlX3RhYmxlLmM9MTY1PXN0YXRpYyBpbnQgX19pbml0IGluaXRfZnNfc3RhdF9zeXNjdGxzKHZvaWQpXFxuLS1cXG5mcy9maWxlX3RhYmxlLmMtMTY3LVxcdHJlZ2lzdGVyX3N5c2N0bF9pbml0KFxcXCJmc1xcXCIsIGZzX3N0YXRfc3lzY3Rscyk7XFxuZnMvZmlsZV90YWJsZS5jOjE2ODpcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpKSB7XFxuZnMvZmlsZV90YWJsZS5jLTE2OS1cXHRcXHRzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGRyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MTowNy4zODU5ODQzNjFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDQyMjQ1ODM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgYmluZm10X21pc2MgRmlsZXN5c3RlbSBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBiaW5mbXRfbWlzY2AgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhbGx5IGBCSU5GTVRfTUlTQ2AuIEkndmUgY29uZmlybWVkIHRoYXQgdGhpcyBpcyB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uLCBubyBvdGhlciByZWxldmFudCBjb25maWdzIGFyZSBwcmVzZW50LiBOb3csIEkgbmVlZCB0byBwaW5wb2ludCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgc3ltYm9scyBpbnZvbHZlZC4gSSd2ZSBjb21waWxlZCBhIGxpc3Q6XG5cbiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgXG4qICAgYGJtX2VudHJ5X3dyaXRlYFxuKiAgIGBibV9zdGF0dXNfd3JpdGVgXG4qICAgYGJtX3VubGlua2BcbiogICBgbG9hZF9taXNjX2JpbmFyeWBcbiogICBgY3JlYXRlX2VudHJ5YFxuKiAgIGBwYXJzZV9tYWdpY19maWVsZHNgXG4qICAgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgXG5cbkkgY2hlY2tlZCwgYW5kIHRoZXkncmUgYWxsIHN0YXRpYyBleGNlcHQgZm9yIGBsb2FkX21pc2NfYmluYXJ5YC4gQWgsIGJ1dCAqdGhhdCdzKiByZWdpc3RlcmVkIGluIHRoZSBgbGludXhfYmluZm10YCBzdHJ1Y3QsIHNwZWNpZmljYWxseSBsaWtlIHRoaXM6XG5cbmBgYGNcbnN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0ge1xuXHQubW9kdWxlID0gVEhJU19NT0RVTEUsXG5cdC5sb2FkX2JpbmFyeSA9IGxvYWRfbWlzY19iaW5hcnksXG59O1xuYGBgXG5cblNvIGBsb2FkX21pc2NfYmluYXJ5YCAqaXMqIGV4cG9zZWQ7IGl0J3MgY2FsbGVkIHZpYSBgc2VhcmNoX2JpbmFyeV9oYW5kbGVyYCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gU28gdGhhdCdzIHRoZSBlbnRyeSBwb2ludC5cblxuT2theSwgbGV0J3MgY2lyY2xlIGJhY2sgYW5kIGNvbmZpcm0uIE5vLCBgQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBjb25maWcuXG5cbk5vdywgZm9yIHRoZSByZWFzb25pbmc6IFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3JpbmcgYGJpbmZtdF9taXNjYCB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgZG91Ymx5IGxpbmtlZCBsaXN0cywgaXQgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBpdCBhZGRzIGB1bmxpbmsoMilgIHN1cHBvcnQsIGFuZCBpdCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgYHNlcV9maWxlYCkuIFRoaXMgbWVhbnMgdGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgZXhlY3ZlYCBhbmQgb3BlcmF0aW9ucyBvbiBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL2AuXG5cblRoZXJlZm9yZSwgdGhlIGZvY3VzIHN5bWJvbHMgYXJlOlxuXG4qICAgYGJtX3JlZ2lzdGVyX3dyaXRlYFxuKiAgIGBibV9lbnRyeV93cml0ZWBcbiogICBgYm1fc3RhdHVzX3dyaXRlYFxuKiAgIGBibV91bmxpbmtgXG4qICAgYGxvYWRfbWlzY19iaW5hcnlgXG4qICAgYGNyZWF0ZV9lbnRyeWBcbiogICBgcGFyc2VfbWFnaWNfZmllbGRzYFxuKiAgIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYFxuXG5GaW5hbGx5LCBsZXQncyBhc3Nlc3MgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGFzIGl0IGFmZmVjdHMgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gQW5kIHNpbmNlIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gY2FuIGJlIG1hbmlwdWxhdGVkIGZyb20gdXNlcnNwYWNlICh0aHJvdWdoIGBleGVjdmVgIGFuZCBgL3Byb2NgKSwgaXQgKmNhbiogYmUgZXhlY3V0ZWQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZz10cnVlYC5cblxuTm93IGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgyMjMsIk91dHB1dFRva2VucyI6MjA2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTU1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDA1OjUxOjE2LjQyODIzMTY1N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0ODM1MTIxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCSU5GTVRfTUlTQ1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJtX3JlZ2lzdGVyX3dyaXRlXCIsXG4gICAgXCJibV9lbnRyeV93cml0ZVwiLFxuICAgIFwiYm1fc3RhdHVzX3dyaXRlXCIsXG4gICAgXCJibV91bmxpbmtcIixcbiAgICBcImxvYWRfbWlzY19iaW5hcnlcIixcbiAgICBcImNyZWF0ZV9lbnRyeVwiLFxuICAgIFwicGFyc2VfbWFnaWNfZmllbGRzXCIsXG4gICAgXCJwYXJzZV9leHRlbnNpb25fZmllbGRzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiY3JlYXRlX2VudHJ5XCIsXG4gICAgXCJwYXJzZV9tYWdpY19maWVsZHNcIixcbiAgICBcInBhcnNlX2V4dGVuc2lvbl9maWVsZHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-11 05:39:07 +0000 UTC FinishedAt: 2026-07-11 05:51:18 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "1f9f5986-a7e3-49fa-8960-7724653c73fd" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "bm_register_write", "bm_entry_write", "bm_status_write", "bm_unlink", "load_misc_binary", "create_entry", "parse_magic_fields", "parse_extension_fields" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtsb2FkX21pc2NfYmluYXJ5JiMzNDssCiAgICAmIzM0O2NyZWF0ZV9lbnRyeSYjMzQ7LAogICAgJiMzNDtwYXJzZV9tYWdpY19maWVsZHMmIzM0OywKICAgICYjMzQ7cGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTEgMDU6NTA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5OTQzNjJjZWIzM2ZiOTYxM2RiZjQyMTFlZGQ4Y2M3MTRmNjE2NjRkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBKdWwgMTEgMDU6NTA6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5AQCAtMTMzLDcgJiM0MzsxMzMsOCBAQCBvciAxICh0byBlbmFibGUpIHRvIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgIG9yXG4gQ2F0dGluZyB0aGUgZmlsZSB0ZWxscyB5b3UgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBgYmluZm10X21pc2MvdGhlX2VudHJ5YGAuXG4gXG4gWW91IGNhbiByZW1vdmUgb25lIGVudHJ5IG9yIGFsbCBlbnRyaWVzIGJ5IGVjaG9pbmcgLTEgdG8gYGAvcHJvYy8uLi4vdGhlX25hbWVgYFxuLW9yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLlxuJiM0MztvciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC4gQSBzaW5nbGUgZW50cnkgY2FuIGFsc28gYmUgcmVtb3ZlZFxuJiM0MztieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuXG4gXG4gXG4gSGludHNcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xuaW5kZXggODQzNDlmY2I5M2YxM2EuLmZjYWFkMTRmODFhMzQyIDEwMDY0NFxuLS0tIGEvZnMvYmluZm10X21pc2MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvYmluZm10X21pc2MuY1xuQEAgLTEwLDQ1ICYjNDM7MTAsNDYgQEBcbiBcbiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogXCYjMzQ7IGZtdFxuIFxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL21tLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG9wcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3R5cGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9uYW1laS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW91bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgva3N0cnRveC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2VxX2ZpbGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC91c2VyX25hbWVzcGFjZS5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXCYjMzQ7aW50ZXJuYWwuaFwmIzM0O1xuLVxuLSNpZmRlZiBERUJVR1xuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXG4tI2Vsc2Vcbi0jIGRlZmluZSBVU0VfREVCVUcgMFxuLSNlbmRpZlxuLVxuLWVudW0ge1xuLVx0VkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovXG4mIzQzOy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi9cbiYjNDM7ZW51bSBiaW5mbXRfbWlzY19lbnRyeV9iaXRzIHtcbiYjNDM7XHRNSVNDX0ZNVF9FTkFCTEVEX0JJVFx0PSAwLFxuJiM0MztcdE1JU0NfRk1UX01BR0lDX0JJVFx0PSAxLFxuIH07XG4gXG4tZW51bSB7RW5hYmxlZCwgTWFnaWN9O1xuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcdTAwM2NcdTAwM2MgMzEpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFx1MDAzY1x1MDAzYyAzMClcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXHUwMDNjXHUwMDNjIDI5KVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXHUwMDNjXHUwMDNjIDI4KVxuJiM0MzsvKiBFbnRyeSBiZWhhdmlvciBmbGFncywgZml4ZWQgYXQgcmVnaXN0cmF0aW9uIHRpbWUuICovXG4mIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3Mge1xuJiM0MztcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzEpLFxuJiM0MztcdE1JU0NfRk1UX09QRU5fQklOQVJZXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzApLFxuJiM0MztcdE1JU0NfRk1UX0NSRURFTlRJQUxTXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjkpLFxuJiM0MztcdE1JU0NfRk1UX09QRU5fRklMRVx0PSAoMVUgXHUwMDNjXHUwMDNjIDI4KSxcbiYjNDM7fTtcbiBcbi10eXBlZGVmIHN0cnVjdCB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7XG4mIzQzO3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgbm9kZTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XHRcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xuIFx0aW50IG9mZnNldDtcdFx0XHQvKiBvZmZzZXQgb2YgbWFnaWMgKi9cbiBcdGludCBzaXplO1x0XHRcdC8qIHNpemUgb2YgbWFnaWMvbWFzayAqL1xuQEAgLTU5LDkgJiM0Mzs2MCw5IEBAIHR5cGVkZWYgc3RydWN0IHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcbiBcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHJlZmNvdW50X3QgdXNlcnM7XHRcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xuLX0gTm9kZTtcbi1cbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiYjNDM7XHRzdHJ1Y3QgcmN1X2hlYWQgcmN1O1xuJiM0MztcdGNoYXIgYnVmW107XHRcdFx0LyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqL1xuJiM0Mzt9O1xuIFxuIC8qXG4gICogTWF4IGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc3RyaW5nLiAgRGV0ZXJtaW5lZCBieTpcbkBAIC03NCwxMCAmIzQzOzc1LDM2IEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqICAtIGludGVycDogfjUwIGJ5dGVzXG4gICogIC0gZmxhZ3M6ICA1IGJ5dGVzXG4gICogUm91bmQgdGhhdCB1cCBhIGJpdCwgYW5kIHRoZW4gYmFjayBvZmYgdG8gaG9sZCB0aGUgaW50ZXJuYWwgZGF0YVxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cbiYjNDM7ICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cbiAgKi9cbiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMFxuIFxuJiM0MzsvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXG4mIzQzOyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxuJiM0MztcbiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgbWFnaWMgbWF0Y2hlcyBAYnBybSYjMzk7cyBidWZmZXIsIGFwcGx5aW5nIHRoZSBtYXNrIGlmIHNldC4gKi9cbiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19tYWdpYyhjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXG4mIzQzO1x0XHRcdFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVx1MDAzZWJ1ZiAmIzQzOyBlLVx1MDAzZW9mZnNldDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hc2spXG4mIzQzO1x0XHRyZXR1cm4gIW1lbWNtcChzLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKChzW2ldIF4gZS1cdTAwM2VtYWdpY1tpXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tpXSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDaGVjayBpZiBAZSYjMzk7cyByZWdpc3RlcmVkIGV4dGVuc2lvbiBtYXRjaGVzIEBleHQsIE5VTEwgaWYgdGhlcmUgaXMgbm9uZS4gKi9cbiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuJiM0MztcdFx0XHRcdCAgICBjb25zdCBjaGFyICpleHQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZXh0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGUtXHUwMDNlbWFnaWMsIGV4dCk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbkBAIC04Niw0MyAmIzQzOzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnlcbiAgKiB0eXBlIGhhbmRsZXJzLlxuICAqXG4mIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLlxuJiM0MzsgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxuJiM0MztzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIHtcbi1cdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAmIzM5Oy4mIzM5Oyk7XG4tXHROb2RlICplO1xuJiM0MztcdGNoYXIgKmRvdCA9IHN0cnJjaHIoYnBybS1cdTAwM2VpbnRlcnAsICYjMzk7LiYjMzk7KTtcbiYjNDM7XHRjb25zdCBjaGFyICpleHQgPSBkb3QgPyBkb3QgJiM0MzsgMSA6IE5VTEw7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuIFx0LyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbGlzdCkge1xuLVx0XHRjaGFyICpzO1xuLVx0XHRpbnQgajtcbi1cbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBub2RlKSB7XG4gXHRcdC8qIE1ha2Ugc3VyZSB0aGlzIG9uZSBpcyBjdXJyZW50bHkgZW5hYmxlZC4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0XHRpZiAocCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBwICYjNDM7IDEpKVxuJiM0MztcdFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXG4gXHRcdFx0XHRyZXR1cm4gZTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBtYWdpYyBcdTAwMjYgbWFzay4gKi9cbi1cdFx0cyA9IGJwcm0tXHUwMDNlYnVmICYjNDM7IGUtXHUwMDNlb2Zmc2V0O1xuLVx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqJiM0MzsmIzQzOylcbi1cdFx0XHRcdGlmICgoKnMmIzQzOyYjNDM7IF4gZS1cdTAwM2VtYWdpY1tqXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tqXSlcbi1cdFx0XHRcdFx0YnJlYWs7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqJiM0MzsmIzQzOylcbi1cdFx0XHRcdGlmICgoKnMmIzQzOyYjNDM7IF4gZS1cdTAwM2VtYWdpY1tqXSkpXG4tXHRcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZTtcbiBcdFx0fVxuLVx0XHRpZiAoaiA9PSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0cmV0dXJuIGU7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0xMzQsNjQgJiM0MzsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4gICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlclxuICAqXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXG4tICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLlxuJiM0MzsgKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIFRoZVxuJiM0MzsgKiByZWZjb3VudCBvZiBhbiBlbnRyeSBjYW4gb25seSBkcm9wIHRvIHplcm8gb25jZSBpdCBoYXMgYmVlbiB1bmxpbmtlZCBhbmRcbiYjNDM7ICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wXG4mIzQzOyAqIGlzIGJvdW5kZWQuXG4gICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHRzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbi1cdHJlYWRfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuLVx0aWYgKGUpXG4tXHRcdHJlZmNvdW50X2luYyhcdTAwMjZlLVx1MDAzZXVzZXJzKTtcbi1cdHJlYWRfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRndWFyZChyY3UpKCk7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbiYjNDM7XHR9IHdoaWxlIChlIFx1MDAyNlx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFx1MDAyNmUtXHUwMDNldXNlcnMpKTtcbiBcdHJldHVybiBlO1xuIH1cbiBcbiAvKipcbi0gKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgbm9kZVxuLSAqIEBlOiBub2RlIHRvIHB1dFxuJiM0MzsgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcbiYjNDM7ICogQGU6IGVudHJ5IHRvIHB1dFxuICAqXG4tICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbiYjNDM7ICogRnJlZSBlbnRyeSBzeW5jaW5nIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpIGFuZCBkZWZlciBmaW5hbCBmcmVlIHRvXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxuICAqIHJlcXVlc3RlZCB0byByZW1vdmUuXG4gICovXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuIFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZlLVx1MDAzZXVzZXJzKSkge1xuLVx0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuJiM0MztcdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuJiM0MztcdFx0XHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZS1cdTAwM2VpbnRlcnBfZmlsZSk7XG4gXHRcdFx0ZmlscF9jbG9zZShlLVx1MDAzZWludGVycF9maWxlLCBOVUxMKTtcbi1cdFx0a2ZyZWUoZSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xuJiM0MztcdFx0a2ZyZWVfcmN1KGUsIHJjdSk7XG4gXHR9XG4gfVxuIFxuJiM0MztERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXG4mIzQzO1xuIC8qKlxuLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4mIzQzOyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2VcbiAgKlxuLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLlxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IGNhbiBtYWtlIHVzZVxuLSAqIG9mIGl0cyBhbmNlc3RvciYjMzk7cyBiaW5mbXRfbWlzYyBoYW5kbGVycy4gVGhpcyBtaW1pY2tzIHRoZSBiZWhhdmlvciBvZlxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXG4tICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS5cbiYjNDM7ICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2VzbiYjMzk7dCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcbiYjNDM7ICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxuJiM0MzsgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxuJiM0MzsgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxuJiM0MzsgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxuJiM0MzsgKiBwcmFjdGljZS5cbiAgKlxuICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2VcbiAgKi9cbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4tXHR1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7XG4tXHR3aGlsZSAodXNlcl9ucykge1xuJiM0MztcdGZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQpIHtcbiBcdFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cbiBcdFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYyk7XG4gXHRcdGlmIChtaXNjKVxuIFx0XHRcdHJldHVybiBtaXNjO1xuLVxuLVx0XHR1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQ7XG4gXHR9XG4gXG4gXHRyZXR1cm4gXHUwMDI2aW5pdF9iaW5mbXRfbWlzYztcbkBAIC0yMDIsMzAgJiM0MzsyMjEsMjkgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuICAqL1xuIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIHtcbi1cdE5vZGUgKmZtdDtcbi1cdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XG4tXHRpbnQgcmV0dmFsID0gLUVOT0VYRUM7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiYjNDM7XHRpbnQgcmV0dmFsO1xuIFxuLVx0bWlzYyA9IGxvYWRfYmluZm10X21pc2MoKTtcbi1cdGlmICghbWlzYy1cdTAwM2VlbmFibGVkKVxuLVx0XHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdG1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7XG4mIzQzO1x0aWYgKCFSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSlcbiYjNDM7XHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbiBcdGlmICghZm10KVxuLVx0XHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0LyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqL1xuLVx0cmV0dmFsID0gLUVOT0VOVDtcbiBcdGlmIChicHJtLVx1MDAzZWludGVycF9mbGFncyBcdTAwMjYgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHtcbiBcdFx0YnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmV0dmFsID0gcmVtb3ZlX2FyZ196ZXJvKGJwcm0pO1xuIFx0XHRpZiAocmV0dmFsKVxuLVx0XHRcdGdvdG8gcmV0O1xuJiM0MztcdFx0XHRyZXR1cm4gcmV0dmFsO1xuIFx0fVxuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG5AQCAtMjM0LDU3ICYjNDM7MjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChicHJtLVx1MDAzZWludGVycCwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MmIzQzOyYjNDM7O1xuIFxuIFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xuIFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MmIzQzOyYjNDM7O1xuIFxuIFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXG4gXHRyZXR2YWwgPSBicHJtX2NoYW5nZV9pbnRlcnAoZm10LVx1MDAzZWludGVycHJldGVyLCBicHJtKTtcbiBcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4tXHRcdGdvdG8gcmV0O1xuJiM0MztcdFx0cmV0dXJuIHJldHZhbDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuIFx0XHRpbnRlcnBfZmlsZSA9IGZpbGVfY2xvbmVfb3BlbihmbXQtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuLVx0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpXG4tXHRcdFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuJiM0MztcdFx0aWYgKCFJU19FUlIoaW50ZXJwX2ZpbGUpKSB7XG4mIzQzO1x0XHRcdGludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0ZnB1dChpbnRlcnBfZmlsZSk7XG4mIzQzO1x0XHRcdFx0aW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdH0gZWxzZSB7XG4gXHRcdGludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC1cdTAwM2VpbnRlcnByZXRlcik7XG4gXHR9XG4tXHRyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcbiBcdGJwcm0tXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuIFx0XHRicHJtLVx1MDAzZWV4ZWNmZF9jcmVkcyA9IDE7XG4tXG4tXHRyZXR2YWwgPSAwO1xuLXJldDpcbi1cbi1cdC8qXG4tXHQgKiBJZiB3ZSBhY3R1YWxseSBwdXQgdGhlIG5vZGUgaGVyZSBhbGwgY29uY3VycmVudCBjYWxscyB0b1xuLVx0ICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93XG4tXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxuLVx0ICogcmVtb3ZlZCB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IGFuZCBpdCYjMzk7cyBvdXIgam9iIHRvXG4tXHQgKiBmcmVlIGl0LlxuLVx0ICovXG4tXHRwdXRfYmluZm10X2hhbmRsZXIoZm10KTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIENvbW1hbmQgcGFyc2VycyAqL1xuIFxuIC8qXG4tICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsXG4tICogcmVjb2duaXNpbmcgdGhlIFxceCBzcGVjaWFsLlxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxuLSAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLlxuJiM0MzsgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nXG4mIzQzOyAqIHRoZSBcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxuJiM0MzsgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxuICAqL1xuIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIHtcbkBAIC0yOTksNDYgJiM0MzszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIFx0XHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbiBcdH1cbi1cdHNbLTFdID0mIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNbLTFdID0gJiMzOTtcXDAmIzM5OztcbiBcdHJldHVybiBzO1xuIH1cbiBcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHRjaGFyICpwID0gc2ZzO1xuLVx0aW50IGNvbnQgPSAxO1xuLVxuLVx0Lyogc3BlY2lhbCBmbGFncyAqL1xuLVx0d2hpbGUgKGNvbnQpIHtcbiYjNDM7XHRmb3IgKDs7IHAmIzQzOyYjNDM7KSB7XG4gXHRcdHN3aXRjaCAoKnApIHtcbiBcdFx0Y2FzZSAmIzM5O1AmIzM5OzpcbiBcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7TyYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtDJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxcblwmIzM0Oyk7XG4tXHRcdFx0cCYjNDM7JiM0Mzs7XG4tXHRcdFx0LyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlXG4tXHRcdFx0ICAgb3Blbi1iaW5hcnkgZmxhZyAqL1xuLVx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHxcbi1cdFx0XHRcdFx0TUlTQ19GTVRfT1BFTl9CSU5BUlkpO1xuJiM0MztcdFx0XHQvKiBDIGltcGxpZXMgTyAqL1xuJiM0MztcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtGJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuLVx0XHRcdGNvbnQgPSAwO1xuJiM0MztcdFx0XHRyZXR1cm4gcDtcbiBcdFx0fVxuIFx0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OywgJiMzOTttYWdpYyYjMzk7IGFuZCAmIzM5O21hc2smIzM5OyBmaWVsZHMgb2YgYW4gJiMzOTtNJiMzOTsgZW50cnkuICovXG4mIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnM7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdHMgPSBzdHJjaHIocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXMpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0aWYgKHAgIT0gcykge1xuJiM0MztcdFx0aWYgKGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0cCA9IHMgJiM0MzsgMTtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXG5cJiMzNDssIGUtXHUwMDNlb2Zmc2V0KTtcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hZ2ljID0gcDtcbiYjNDM7XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuJiM0MztcdGlmICghcCB8fCAhZS1cdTAwM2VtYWdpY1swXSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCYjMzQ7LFxuJiM0MztcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljLCB0cnVlKTtcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdGUtXHUwMDNlbWFzayA9IHA7XG4mIzQzO1x0cCA9IHNjYW5hcmcocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXApXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoIWUtXHUwMDNlbWFza1swXSkge1xuJiM0MztcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbiYjNDM7XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxuXCYjMzQ7KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFwmIzM0OyxcbiYjNDM7XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzaywgdHJ1ZSk7XG4mIzQzO1x0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWRcbiYjNDM7XHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XG4mIzQzO1x0ICogdGhlIGZpcnN0IG9uZSB0aGV5IGVuY291bnRlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlLVx1MDAzZXNpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xuJiM0MztcdGlmIChlLVx1MDAzZW1hc2sgXHUwMDI2XHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcXG5cJiMzNDssIGUtXHUwMDNlc2l6ZSk7XG4mIzQzO1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXCYjMzQ7LFxuJiM0MztcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKGUtXHUwMDNlbWFzaylcbiYjNDM7XHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuJiM0MztcdFx0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUsIHRydWUpO1xuJiM0MztcdHJldHVybiBwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkIG9mIGFuICYjMzk7RSYjMzk7IGVudHJ5OiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsXG4mIzQzO1x0XHRcdFx0ICAgIGNoYXIgZGVsKVxuJiM0Mzt7XG4mIzQzO1x0LyogU2tpcCB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XG4mIzQzO1x0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hZ2ljID0gcDtcbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cJiMzNDssIGUtXHUwMDNlbWFnaWMpO1xuJiM0MztcbiYjNDM7XHQvKiBTa2lwIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdHJldHVybiBwO1xuIH1cbiBcbkBAIC0zNDcsNTAgJiM0Mzs0MzMsNTIgQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuICAqICYjMzk7Om5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncyYjMzk7XG4gICogd2hlcmUgdGhlICYjMzk7OiYjMzk7IGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyXG4gICovXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgc2l6ZV90IGNvdW50KVxuIHtcbi1cdE5vZGUgKmU7XG4tXHRpbnQgbWVtc2l6ZSwgZXJyO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdGNoYXIgKmJ1ZiwgKnA7XG4gXHRjaGFyIGRlbDtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcXG5cJiMzNDssIGNvdW50KTtcbiBcbiBcdC8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqL1xuLVx0ZXJyID0gLUVJTlZBTDtcbiBcdGlmICgoY291bnQgXHUwMDNjIDExKSB8fCAoY291bnQgXHUwMDNlIE1BWF9SRUdJU1RFUl9MRU5HVEgpKVxuLVx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0ZXJyID0gLUVOT01FTTtcbi1cdG1lbXNpemUgPSBzaXplb2YoTm9kZSkgJiM0MzsgY291bnQgJiM0MzsgODtcbi1cdGUgPSBrbWFsbG9jKG1lbXNpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4mIzQzO1x0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCAmIzQzOyBNSVNDX0RFTElNX1BBRCksXG4mIzQzO1x0XHQgICAgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbiBcdGlmICghZSlcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdHAgPSBidWYgPSAoY2hhciAqKWUgJiM0Mzsgc2l6ZW9mKE5vZGUpO1xuJiM0MztcdHAgPSBidWYgPSBlLVx1MDAzZWJ1ZjtcbiBcbi1cdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xuJiM0MztcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxuLVx0XHRnb3RvIGVmYXVsdDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuIFxuLVx0ZGVsID0gKnAmIzQzOyYjNDM7O1x0LyogZGVsaW1ldGVyICovXG4mIzQzO1x0ZGVsID0gKnAmIzQzOyYjNDM7O1x0LyogZGVsaW1pdGVyICovXG4gXG4gXHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZGVsaW06ICUjeCB7JWN9XFxuXCYjMzQ7LCBkZWwsIGRlbCk7XG4gXG4mIzQzO1x0LyogQSBmbGFnLWNoYXIgZGVsaW1pdGVyIHJ1bnMgdGhlIGZsYWcgc2NhbiBvZmYgdGhlIGJ1ZmZlci4gKi9cbiYjNDM7XHRpZiAoZGVsID09ICYjMzk7UCYjMzk7IHx8IGRlbCA9PSAmIzM5O08mIzM5OyB8fCBkZWwgPT0gJiMzOTtDJiMzOTsgfHwgZGVsID09ICYjMzk7RiYjMzk7KVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1xuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7XG4mIzQzO1x0bWVtc2V0KGJ1ZiAmIzQzOyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtuYW1lJiMzOTsgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VuYW1lWzBdIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDspIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy4uXCYjMzQ7KSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICYjMzk7LyYjMzk7KSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW5hbWUpO1xuIFxuQEAgLTM5OCwxMzQgJiM0Mzs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwJiM0MzsmIzQzOykge1xuIFx0Y2FzZSAmIzM5O0UmIzM5OzpcbiBcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJiMzOTtNJiMzOTs6XG4gXHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gKDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQpIHwgKDEgXHUwMDNjXHUwMDNjIE1hZ2ljKTtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi9cbi1cdFx0Y2hhciAqcztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwJiM0MzsmIzQzOylcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCYjMzQ7LFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBwIC0gZS1cdTAwM2VtYXNrKTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbi1cdFx0aWYgKFVTRV9ERUJVRykge1xuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgJiM0MzsmIzQzO2kpXG4tXHRcdFx0XHRcdFx0bWFza2VkW2ldID0gZS1cdTAwM2VtYWdpY1tpXSBcdTAwMjYgZS1cdTAwM2VtYXNrW2ldO1xuLVx0XHRcdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbi1cdFx0ZS1cdTAwM2VtYWdpYyA9IHA7XG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VpbnRlcnByZXRlclswXSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqL1xuQEAgLTUzMywyNCAmIzQzOzUyMCwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmICgqcCA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRwJiM0MzsmIzQzOztcbiBcdGlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tZWZhdWx0OlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1laW52YWw6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4mIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4mIzQzO2VudW0gYm1fY29tbWFuZCB7XG4mIzQzO1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4mIzQzO1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcJiMzNDswXCYjMzQ7ICovXG4mIzQzO1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwmIzM0OzFcJiMzNDsgKi9cbiYjNDM7XHRCTV9DTURfUkVNT1ZFLFx0LyogXCYjMzQ7LTFcJiMzNDsgKi9cbiYjNDM7fTtcbiYjNDM7XG4gLypcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxuLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjXG4mIzQzOyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJiMzOTsxJiMzOTsgZW5hYmxlcyxcbiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgJiM0Mzs1NDYsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRpZiAoIWNvdW50KVxuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRjb3VudC0tO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTswJiMzOTspXG4tXHRcdHJldHVybiAxO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9ESVNBQkxFO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTsxJiMzOTspXG4tXHRcdHJldHVybiAyO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9FTkFCTEU7XG4gXHRpZiAoY291bnQgPT0gMiBcdTAwMjZcdTAwMjYgc1swXSA9PSAmIzM5Oy0mIzM5OyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAmIzM5OzEmIzM5Oylcbi1cdFx0cmV0dXJuIDM7XG4mIzQzO1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpXG4ge1xuLVx0Y2hhciAqZHAgPSBwYWdlO1xuLVx0Y29uc3QgY2hhciAqc3RhdHVzID0gXCYjMzQ7ZGlzYWJsZWRcJiMzNDs7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDslMDJ4XCYjMzQ7LCBkYXRhW2ldKTtcbiYjNDM7fVxuIFxuLVx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuLVx0XHRzdGF0dXMgPSBcJiMzNDtlbmFibGVkXCYjMzQ7O1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCYjMzQ7JXNcXG5cJiMzNDssIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZW5hYmxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZGlzYWJsZWRcXG5cJiMzNDspO1xuIFxuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0OyVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cJiMzNDssIHN0YXR1cywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4mIzQzO1x0c2VxX3ByaW50ZihtLCBcJiMzNDtpbnRlcnByZXRlciAlc1xcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBwcmludCB0aGUgc3BlY2lhbCBmbGFncyAqL1xuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuJiM0MztcdHNlcV9wdXRzKG0sIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKVxuLVx0XHQqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O08mIzM5OztcbiYjNDM7XHRcdHNlcV9wdXRjKG0sICYjMzk7TyYjMzk7KTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtDJiMzOTspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7O1xuLVx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7XFxuJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7XG4mIzQzO1x0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcJiMzNDtleHRlbnNpb24gLiVzXFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7ZXh0ZW5zaW9uIC4lc1xcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1x0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4gXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7XFxubWFzayBcJiMzNDspO1xuLVx0XHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcdFx0XHRzZXFfcHV0cyhtLCBcJiMzNDtcXG5tYXNrIFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O1xcbiYjMzk7O1xuLVx0XHQqZHAgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTtcbiBcbkBAIC02NTIsMTQgJiM0Mzs2MzksMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuJiM0MzsgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnlcbiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbiYjNDM7ICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVx1MDAzZWlfcHJpdmF0ZTtcbiBcbiBcdGNsZWFyX2lub2RlKGlub2RlKTtcbiBcbkBAIC02NjcsODkgJiM0Mzs2NTQsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4mIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiYjNDM7ICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXG4mIzQzOyAqXG4mIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbiYjNDM7ICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxuJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuJiM0MzsgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcbiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4mIzQzO3tcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0JiMzOTtzIG5vdCBhIHByZXNzaW5nIGlzc3VlLlxuJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2RlbF9pbml0KFx1MDAyNmUtXHUwMDNlbGlzdCk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuJiM0MzsvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4mIzQzO1x0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xuJiM0MztcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cbiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4mIzQzO1xuJiM0MztcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MzsvKipcbiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4mIzQzOyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZVxuJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbiYjNDM7ICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoIWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcbiYjNDM7XHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcbiYjNDM7XHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4mIzQzO31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0ge1xuJiM0MztcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuJiM0MztcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4mIzQzO307XG4gXG4tXHRyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTtcbiYjNDM7LyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuJiM0MztcdHJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLVx1MDAzZWlfcHJpdmF0ZSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4mIzQzO1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbiYjNDM7XHRcdGZpbGUtXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4mIzQzO1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuJiM0MztcdFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtNzU5LDE1ICYjNDM7Nzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuJiM0MztcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbiYjNDM7XHQucmVhZFx0XHQ9IHNlcV9yZWFkLFxuIFx0LndyaXRlXHRcdD0gYm1fZW50cnlfd3JpdGUsXG4tXHQubGxzZWVrXHRcdD0gZGVmYXVsdF9sbHNlZWssXG4mIzQzO1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbiYjNDM7XHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7c3RhdGljIGludCBhZGRfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHNpbXBsZV9zdGFydF9jcmVhdGluZyhzYi1cdTAwM2VzX3Jvb3QsIGUtXHUwMDNlbmFtZSk7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuQEAgLTc4OSw5ICYjNDM7ODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0aGxpc3RfYWRkX2hlYWRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyAmIzQzOzgzMSwxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2I7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICYjNDM7ODUzLDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCYjMzQ7cmVnaXN0ZXI6IGZhaWxlZCB0byBpbnN0YWxsIGludGVycHJldGVyIGZpbGUgJXNcXG5cJiMzNDssXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgJiM0Mzs4NjQsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuJiM0MztcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCAmIzQzOzg4MywxMCBAQCBzdGF0aWMgc3NpemVfdFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuLVx0Y2hhciAqcztcbiYjNDM7XHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCYjMzQ7ZW5hYmxlZFxcblwmIzM0OyA6IFwmIzM0O2Rpc2FibGVkXFxuXCYjMzQ7O1xuJiM0MztcdHMgPSBSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSA/IFwmIzM0O2VuYWJsZWRcXG5cJiMzNDsgOiBcJiMzNDtkaXNhYmxlZFxcblwmIzM0OztcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICYjNDM7ODk1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgYWxsIGhhbmRsZXJzLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuJiM0MztcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbiYjNDM7XHRcdGJtX3JlbW92ZV9hbGxfZW50cmllcyhtaXNjLCBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtOTE4LDcgJiM0Mzs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCAmIzQzOzk3NywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0XHRpZiAoIW1pc2MpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHRcdHJ3bG9ja19pbml0KFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4mIzQzO1x0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXG4gXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MsIG1pc2MpO1xuIFx0fVxuIFxuQEAgLTk4MywxMiAmIzQzOzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2Ym1fc3VwZXJfb3BzO1xuJiM0MztcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7XG4tXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbiYjNDM7XHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgJiM0MzsyMyw5IEBAXG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0ge1xuLVx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxuJiM0MztcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4mIzQzO1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUwPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtsb2FkX21pc2NfYmluYXJ5JiMzNDssCiAgICAmIzM0O2NyZWF0ZV9lbnRyeSYjMzQ7LAogICAgJiMzNDtwYXJzZV9tYWdpY19maWVsZHMmIzM0OywKICAgICYjMzQ7cGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDk5NDM2MmNlYjMzZmI5NjEzZGJmNDIxMWVkZDhjYzcxNGY2MTY2NGQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEp1bCAxMSAwNTo1MDo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdApAQCAtMTMzLDcgJiM0MzsxMzMsOCBAQCBvciAxICh0byBlbmFibGUpIHRvIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgIG9yCiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC4KIAogWW91IGNhbiByZW1vdmUgb25lIGVudHJ5IG9yIGFsbCBlbnRyaWVzIGJ5IGVjaG9pbmcgLTEgdG8gYGAvcHJvYy8uLi4vdGhlX25hbWVgYAotb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuCiYjNDM7b3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWQKJiM0MztieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuCiAKIAogSGludHMKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mY2FhZDE0ZjgxYTM0MiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0xMCw0NSAmIzQzOzEwLDQ2IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgJiMzNDs6ICYjMzQ7IGZtdAogCi0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvaGV4LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL21tLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9iaW5mbXRzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRvcHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2xlYW51cC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcmVkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3R5cGUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfaGVscGVycy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9wYWdlbWFwLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbmFtZWkuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tb3VudC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zeXNjYWxscy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9rc3RydG94LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmludGsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmN1bGlzdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yZWZjb3VudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zZXFfZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfaGVscGVycy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3VhY2Nlc3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdXNlcl9uYW1lc3BhY2UuaCZndDsKIAotI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBVU0VfREVCVUcgMQotI2Vsc2UKLSMgZGVmaW5lIFVTRV9ERUJVRyAwCi0jZW5kaWYKLQotZW51bSB7Ci0JVkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovCiYjNDM7LyogRW50cnkgc3RhdHVzIGFuZCBtYXRjaCB0eXBlIGJpdCBudW1iZXJzLiAqLwomIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7CiYjNDM7CU1JU0NfRk1UX0VOQUJMRURfQklUCT0gMCwKJiM0MzsJTUlTQ19GTVRfTUFHSUNfQklUCT0gMSwKIH07CiAKLWVudW0ge0VuYWJsZWQsIE1hZ2ljfTsKLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCAmbHQ7Jmx0OyAzMSkKLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDFVTCAmbHQ7Jmx0OyAzMCkKLSNkZWZpbmUgTUlTQ19GTVRfQ1JFREVOVElBTFMgKDFVTCAmbHQ7Jmx0OyAyOSkKLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgJmx0OyZsdDsgMjgpCiYjNDM7LyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqLwomIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3MgewomIzQzOwlNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMAk9ICgxVSAmbHQ7Jmx0OyAzMSksCiYjNDM7CU1JU0NfRk1UX09QRU5fQklOQVJZCT0gKDFVICZsdDsmbHQ7IDMwKSwKJiM0MzsJTUlTQ19GTVRfQ1JFREVOVElBTFMJPSAoMVUgJmx0OyZsdDsgMjkpLAomIzQzOwlNSVNDX0ZNVF9PUEVOX0ZJTEUJPSAoMVUgJmx0OyZsdDsgMjgpLAomIzQzO307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiYjNDM7c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5IHsKJiM0MzsJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdHlwZSwgc3RhdHVzLCBldGMuICovCiAJaW50IG9mZnNldDsJCQkvKiBvZmZzZXQgb2YgbWFnaWMgKi8KIAlpbnQgc2l6ZTsJCQkvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi8KQEAgLTU5LDkgJiM0Mzs2MCw5IEBAIHR5cGVkZWYgc3RydWN0IHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGZpbGUgKmludGVycF9maWxlOwogCXJlZmNvdW50X3QgdXNlcnM7CQkvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi8KLX0gTm9kZTsKLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiYjNDM7CXN0cnVjdCByY3VfaGVhZCByY3U7CiYjNDM7CWNoYXIgYnVmW107CQkJLyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqLwomIzQzO307CiAKIC8qCiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OgpAQCAtNzQsMTAgJiM0Mzs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTsKICAqICAtIGludGVycDogfjUwIGJ5dGVzCiAgKiAgLSBmbGFnczogIDUgYnl0ZXMKICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGEKLSAqIChsaWtlIHN0cnVjdCBOb2RlKS4KJiM0MzsgKiAobGlrZSBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkpLgogICovCiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMAogCiYjNDM7LyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqLwomIzQzOyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOAomIzQzOwomIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIG1hZ2ljIG1hdGNoZXMgQGJwcm0mIzM5O3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovCiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19tYWdpYyhjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsCiYjNDM7CQkJCWNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICpzID0gYnBybS0mZ3Q7YnVmICYjNDM7IGUtJmd0O29mZnNldDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmICghZS0mZ3Q7bWFzaykKJiM0MzsJCXJldHVybiAhbWVtY21wKHMsIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGUtJmd0O3NpemU7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKChzW2ldIF4gZS0mZ3Q7bWFnaWNbaV0pICZhbXA7IGUtJmd0O21hc2tbaV0pCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovCiYjNDM7c3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLAomIzQzOwkJCQkgICAgY29uc3QgY2hhciAqZXh0KQomIzQzO3sKJiM0MzsJcmV0dXJuIGV4dCAmYW1wOyZhbXA7ICFzdHJjbXAoZS0mZ3Q7bWFnaWMsIGV4dCk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBzZWFyY2hfYmluZm10X2hhbmRsZXIgLSBzZWFyY2ggZm9yIGEgYmluYXJ5IGhhbmRsZXIgZm9yIEBicHJtCiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlCkBAIC04Niw0MyAmIzQzOzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTsKICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeQogICogdHlwZSBoYW5kbGVycy4KICAqCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2suCiYjNDM7ICoKICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCi0JCQkJICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICoKJiM0MztzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCWNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tJmd0O2ludGVycCwgJiMzOTsuJiMzOTspOwotCU5vZGUgKmU7CiYjNDM7CWNoYXIgKmRvdCA9IHN0cnJjaHIoYnBybS0mZ3Q7aW50ZXJwLCAmIzM5Oy4mIzM5Oyk7CiYjNDM7CWNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCAmIzQzOyAxIDogTlVMTDsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplOwogCiAJLyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIGxpc3QpIHsKLQkJY2hhciAqczsKLQkJaW50IGo7Ci0KJiM0MzsJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbm9kZSkgewogCQkvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovCi0JCWlmICghdGVzdF9iaXQoRW5hYmxlZCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIERvIG1hdGNoaW5nIGJhc2VkIG9uIGV4dGVuc2lvbiBpZiBhcHBsaWNhYmxlLiAqLwotCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmYW1wO2UtJmd0O2ZsYWdzKSkgewotCQkJaWYgKHAgJmFtcDsmYW1wOyAhc3RyY21wKGUtJmd0O21hZ2ljLCBwICYjNDM7IDEpKQomIzQzOwkJaWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpIHsKJiM0MzsJCQlpZiAoZW50cnlfbWF0Y2hlc19tYWdpYyhlLCBicHJtKSkKIAkJCQlyZXR1cm4gZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgJmFtcDsgbWFzay4gKi8KLQkJcyA9IGJwcm0tJmd0O2J1ZiAmIzQzOyBlLSZndDtvZmZzZXQ7Ci0JCWlmIChlLSZndDttYXNrKSB7Ci0JCQlmb3IgKGogPSAwOyBqICZsdDsgZS0mZ3Q7c2l6ZTsgaiYjNDM7JiM0MzspCi0JCQkJaWYgKCgqcyYjNDM7JiM0MzsgXiBlLSZndDttYWdpY1tqXSkgJmFtcDsgZS0mZ3Q7bWFza1tqXSkKLQkJCQkJYnJlYWs7CiAJCX0gZWxzZSB7Ci0JCQlmb3IgKGogPSAwOyBqICZsdDsgZS0mZ3Q7c2l6ZTsgaiYjNDM7JiM0MzspCi0JCQkJaWYgKCgqcyYjNDM7JiM0MzsgXiBlLSZndDttYWdpY1tqXSkpCi0JCQkJCWJyZWFrOwomIzQzOwkJCWlmIChlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihlLCBleHQpKQomIzQzOwkJCQlyZXR1cm4gZTsKIAkJfQotCQlpZiAoaiA9PSBlLSZndDtzaXplKQotCQkJcmV0dXJuIGU7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0xMzQsNjQgJiM0MzsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiAgKiBAYnBybTogYmluYXJ5IGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgYSBoYW5kbGVyCiAgKgogICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhCi0gKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuCiYjNDM7ICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGUKJiM0MzsgKiByZWZjb3VudCBvZiBhbiBlbnRyeSBjYW4gb25seSBkcm9wIHRvIHplcm8gb25jZSBpdCBoYXMgYmVlbiB1bmxpbmtlZCBhbmQKJiM0MzsgKiBhIHJlc3RhcnRlZCBzZWFyY2ggY2Fubm90IGZpbmQgYW4gdW5saW5rZWQgZW50cnkgYWdhaW4gc28gdGhlIHJldHJ5IGxvb3AKJiM0MzsgKiBpcyBib3VuZGVkLgogICoKICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCi0JCQkJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkJCSAgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCU5vZGUgKmU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKIAotCXJlYWRfbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7Ci0JZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKLQlpZiAoZSkKLQkJcmVmY291bnRfaW5jKCZhbXA7ZS0mZ3Q7dXNlcnMpOwotCXJlYWRfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJZ3VhcmQocmN1KSgpOwomIzQzOwlkbyB7CiYjNDM7CQllID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pOwomIzQzOwl9IHdoaWxlIChlICZhbXA7JmFtcDsgIXJlZmNvdW50X2luY19ub3RfemVybygmYW1wO2UtJmd0O3VzZXJzKSk7CiAJcmV0dXJuIGU7CiB9CiAKIC8qKgotICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGUKLSAqIEBlOiBub2RlIHRvIHB1dAomIzQzOyAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBlbnRyeQomIzQzOyAqIEBlOiBlbnRyeSB0byBwdXQKICAqCi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0bwomIzQzOyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0bwogICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZQogICogcmVxdWVzdGVkIHRvIHJlbW92ZS4KICAqLwotc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpCiYjNDM7c3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKIHsKIAlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZhbXA7ZS0mZ3Q7dXNlcnMpKSB7Ci0JCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpCiYjNDM7CQlpZiAoZS0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKSB7CiYjNDM7CQkJZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtJmd0O2ludGVycF9maWxlKTsKIAkJCWZpbHBfY2xvc2UoZS0mZ3Q7aW50ZXJwX2ZpbGUsIE5VTEwpOwotCQlrZnJlZShlKTsKJiM0MzsJCX0KJiM0MzsJCS8qIExvY2tsZXNzIHdhbGtlcnMgbWF5IHN0aWxsIGRlcmVmZXJlbmNlIHRoaXMgZW50cnkuICovCiYjNDM7CQlrZnJlZV9yY3UoZSwgcmN1KTsKIAl9CiB9CiAKJiM0MztERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpCiYjNDM7CiAvKioKLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlCiYjNDM7ICogY3VycmVudF9iaW5mbXRfbWlzYyAtIGdldCB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZQogICoKLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLgotICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2VzbiYjMzk7dCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlCi0gKiBvZiBpdHMgYW5jZXN0b3ImIzM5O3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2YKLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlCi0gKiBhdmFpbGFibGUgdG8gYWxsIHVzZXIgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLgomIzQzOyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlCiYjNDM7ICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZgomIzQzOyAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIHdlcmUgYXZhaWxhYmxlCiYjNDM7ICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2UKJiM0MzsgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpbgomIzQzOyAqIHByYWN0aWNlLgogICoKICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2UKICAqLwotc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKQomIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZCkKIHsKIAljb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwogCi0JdXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOwotCXdoaWxlICh1c2VyX25zKSB7CiYjNDM7CWZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy0mZ3Q7cGFyZW50KSB7CiAJCS8qIFBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKSBpbiBibV9maWxsX3N1cGVyKCkuICovCiAJCW1pc2MgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7dXNlcl9ucy0mZ3Q7YmluZm10X21pc2MpOwogCQlpZiAobWlzYykKIAkJCXJldHVybiBtaXNjOwotCi0JCXVzZXJfbnMgPSB1c2VyX25zLSZndDtwYXJlbnQ7CiAJfQogCiAJcmV0dXJuICZhbXA7aW5pdF9iaW5mbXRfbWlzYzsKQEAgLTIwMiwzMCAmIzQzOzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpCiAgKi8KIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCU5vZGUgKmZtdDsKLQlzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMOwotCWludCByZXR2YWwgPSAtRU5PRVhFQzsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwomIzQzOwlpbnQgcmV0dmFsOwogCi0JbWlzYyA9IGxvYWRfYmluZm10X21pc2MoKTsKLQlpZiAoIW1pc2MtJmd0O2VuYWJsZWQpCi0JCXJldHVybiByZXR2YWw7CiYjNDM7CW1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7CiYjNDM7CWlmICghUkVBRF9PTkNFKG1pc2MtJmd0O2VuYWJsZWQpKQomIzQzOwkJcmV0dXJuIC1FTk9FWEVDOwogCiAJZm10ID0gZ2V0X2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pOwogCWlmICghZm10KQotCQlyZXR1cm4gcmV0dmFsOwomIzQzOwkJcmV0dXJuIC1FTk9FWEVDOwogCiAJLyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqLwotCXJldHZhbCA9IC1FTk9FTlQ7CiAJaWYgKGJwcm0tJmd0O2ludGVycF9mbGFncyAmYW1wOyBCSU5QUk1fRkxBR1NfUEFUSF9JTkFDQ0VTU0lCTEUpCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkgewogCQlicHJtLSZndDtpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IHJlbW92ZV9hcmdfemVybyhicHJtKTsKIAkJaWYgKHJldHZhbCkKLQkJCWdvdG8gcmV0OwomIzQzOwkJCXJldHVybiByZXR2YWw7CiAJfQogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9CSU5BUlkpCkBAIC0yMzQsNTcgJiM0MzsyNTIsNDggQEAgc3RhdGljIGludCBsb2FkX21pc2NfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiAJLyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi8KIAlyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS0mZ3Q7aW50ZXJwLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCWJwcm0tJmd0O2FyZ2MmIzQzOyYjNDM7OwogCiAJLyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqLwogCXJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtJmd0O2ludGVycHJldGVyLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCWJwcm0tJmd0O2FyZ2MmIzQzOyYjNDM7OwogCiAJLyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovCiAJcmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC0mZ3Q7aW50ZXJwcmV0ZXIsIGJwcm0pOwogCWlmIChyZXR2YWwgJmx0OyAwKQotCQlnb3RvIHJldDsKJiM0MzsJCXJldHVybiByZXR2YWw7CiAKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHsKIAkJaW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LSZndDtpbnRlcnBfZmlsZSk7Ci0JCWlmICghSVNfRVJSKGludGVycF9maWxlKSkKLQkJCWRlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTsKJiM0MzsJCWlmICghSVNfRVJSKGludGVycF9maWxlKSkgewomIzQzOwkJCWludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7CiYjNDM7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlmcHV0KGludGVycF9maWxlKTsKJiM0MzsJCQkJaW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7CiYjNDM7CQkJfQomIzQzOwkJfQogCX0gZWxzZSB7CiAJCWludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC0mZ3Q7aW50ZXJwcmV0ZXIpOwogCX0KLQlyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTsKIAlpZiAoSVNfRVJSKGludGVycF9maWxlKSkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gUFRSX0VSUihpbnRlcnBfZmlsZSk7CiAKIAlicHJtLSZndDtpbnRlcnByZXRlciA9IGludGVycF9maWxlOwogCWlmIChmbXQtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX0NSRURFTlRJQUxTKQogCQlicHJtLSZndDtleGVjZmRfY3JlZHMgPSAxOwotCi0JcmV0dmFsID0gMDsKLXJldDoKLQotCS8qCi0JICogSWYgd2UgYWN0dWFsbHkgcHV0IHRoZSBub2RlIGhlcmUgYWxsIGNvbmN1cnJlbnQgY2FsbHMgdG8KLQkgKiBsb2FkX21pc2NfYmluYXJ5KCkgd2lsbCBoYXZlIGZpbmlzaGVkLiBXZSBhbHNvIGtub3cKLQkgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseQotCSAqIHJlbW92ZWQgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBhbmQgaXQmIzM5O3Mgb3VyIGpvYiB0bwotCSAqIGZyZWUgaXQuCi0JICovCi0JcHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogLyogQ29tbWFuZCBwYXJzZXJzICovCiAKIC8qCi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCwKLSAqIHJlY29nbmlzaW5nIHRoZSBceCBzcGVjaWFsLgotICogcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjb3BpZWQgYXJndW1lbnQgb3IgTlVMTCBpbiBjYXNlIG9mIGFuCi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC4KJiM0MzsgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nCiYjNDM7ICogdGhlIFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKJiM0MzsgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLgogICovCiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKIHsKQEAgLTI5OSw0NiAmIzQzOzMwOCwxMjMgQEAgc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpCiAJCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9Ci0Jc1stMV0gPSYjMzk7XDAmIzM5OzsKJiM0MzsJc1stMV0gPSAmIzM5O1wwJiMzOTs7CiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSkKJiM0MztzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpwLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiB7Ci0JY2hhciAqcCA9IHNmczsKLQlpbnQgY29udCA9IDE7Ci0KLQkvKiBzcGVjaWFsIGZsYWdzICovCi0Jd2hpbGUgKGNvbnQpIHsKJiM0MzsJZm9yICg7OyBwJiM0MzsmIzQzOykgewogCQlzd2l0Y2ggKCpwKSB7CiAJCWNhc2UgJiMzOTtQJiMzOTs6CiAJCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBmbGFnOiBQIChwcmVzZXJ2ZSBhcmd2MClcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O08mIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7CiAJCQllLSZndDtmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7QyYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogQyAocHJlc2VydmUgY3JlZHMpXG4mIzM0Oyk7Ci0JCQlwJiM0MzsmIzQzOzsKLQkJCS8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZQotCQkJICAgb3Blbi1iaW5hcnkgZmxhZyAqLwotCQkJZS0mZ3Q7ZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHwKLQkJCQkJTUlTQ19GTVRfT1BFTl9CSU5BUlkpOwomIzQzOwkJCS8qIEMgaW1wbGllcyBPICovCiYjNDM7CQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7RiYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogRjogb3BlbiBpbnRlcnByZXRlciBmaWxlIG5vd1xuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7CiAJCQllLSZndDtmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0ZJTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWNvbnQgPSAwOwomIzQzOwkJCXJldHVybiBwOwogCQl9CiAJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OywgJiMzOTttYWdpYyYjMzk7IGFuZCAmIzM5O21hc2smIzM5OyBmaWVsZHMgb2YgYW4gJiMzOTtNJiMzOTsgZW50cnkuICovCiYjNDM7c3RhdGljIGNoYXIgKnBhcnNlX21hZ2ljX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsIGNoYXIgZGVsKQomIzQzO3sKJiM0MzsJY2hhciAqczsKJiM0MzsKJiM0MzsJLyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCiYjNDM7CXMgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpzID0gJiMzOTtcMCYjMzk7OwomIzQzOwlpZiAocCAhPSBzKSB7CiYjNDM7CQlpZiAoa3N0cnRvaW50KHAsIDEwLCAmYW1wO2UtJmd0O29mZnNldCkgfHwgZS0mZ3Q7b2Zmc2V0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gTlVMTDsKJiM0MzsJfQomIzQzOwlwID0gcyAmIzQzOyAxOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxuJiMzNDssIGUtJmd0O29mZnNldCk7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hZ2ljID0gcDsKJiM0MzsJcCA9IHNjYW5hcmcocCwgZGVsKTsKJiM0MzsJaWYgKCFwIHx8ICFlLSZndDttYWdpY1swXSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcmludF9oZXhfZHVtcF9kZWJ1ZygKJiM0MzsJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogJiMzNDssCiYjNDM7CQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFnaWMsIHAgLSBlLSZndDttYWdpYywgdHJ1ZSk7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KJiM0MzsJZS0mZ3Q7bWFzayA9IHA7CiYjNDM7CXAgPSBzY2FuYXJnKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZiAoIWUtJmd0O21hc2tbMF0pIHsKJiM0MzsJCWUtJmd0O21hc2sgPSBOVUxMOwomIzQzOwkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxuJiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiAmIzM0OywKJiM0MzsJCQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFzaywgcCAtIGUtJmd0O21hc2ssIHRydWUpOwomIzQzOwl9CiAKJiM0MzsJLyoKJiM0MzsJICogRGVjb2RlIHRoZSBtYWdpYyAmYW1wOyBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZAomIzQzOwkgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0CiYjNDM7CSAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuCiYjNDM7CSAqLwomIzQzOwllLSZndDtzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFnaWMsIFVORVNDQVBFX0hFWCk7CiYjNDM7CWlmIChlLSZndDttYXNrICZhbXA7JmFtcDsgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLSZndDtzaXplKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWlmIChlLSZndDtzaXplICZndDsgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtJmd0O3NpemUgJmx0OyBlLSZndDtvZmZzZXQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXG4mIzM0OywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogJiMzNDssCiYjNDM7CQlEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUsIHRydWUpOwomIzQzOwlpZiAoZS0mZ3Q7bWFzaykKJiM0MzsJCXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06ICYjMzQ7LAomIzQzOwkJCURVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLSZndDttYXNrLCBlLSZndDtzaXplLCB0cnVlKTsKJiM0MzsJcmV0dXJuIHA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQgb2YgYW4gJiMzOTtFJiMzOTsgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovCiYjNDM7c3RhdGljIGNoYXIgKnBhcnNlX2V4dGVuc2lvbl9maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLAomIzQzOwkJCQkgICAgY2hhciBkZWwpCiYjNDM7ewomIzQzOwkvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqLwomIzQzOwlwID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hZ2ljID0gcDsKJiM0MzsJcCA9IHN0cmNocihwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlpZiAoIWUtJmd0O21hZ2ljWzBdIHx8IHN0cmNocihlLSZndDttYWdpYywgJiMzOTsvJiMzOTspKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxuJiMzNDssIGUtJmd0O21hZ2ljKTsKJiM0MzsKJiM0MzsJLyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAlyZXR1cm4gcDsKIH0KIApAQCAtMzQ3LDUwICYjNDM7NDMzLDUyIEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSkKICAqICYjMzk7Om5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncyYjMzk7CiAgKiB3aGVyZSB0aGUgJiMzOTs6JiMzOTsgaXMgdGhlIElGUywgdGhhdCBjYW4gYmUgY2hvc2VuIHdpdGggdGhlIGZpcnN0IGNoYXIKICAqLwotc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiYjNDM7CQkJCQkgICAgICBzaXplX3QgY291bnQpCiB7Ci0JTm9kZSAqZTsKLQlpbnQgbWVtc2l6ZSwgZXJyOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJY2hhciAqYnVmLCAqcDsKIAljaGFyIGRlbDsKIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHJlY2VpdmVkICV6dSBieXRlc1xuJiMzNDssIGNvdW50KTsKIAogCS8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLwotCWVyciA9IC1FSU5WQUw7CiAJaWYgKChjb3VudCAmbHQ7IDExKSB8fCAoY291bnQgJmd0OyBNQVhfUkVHSVNURVJfTEVOR1RIKSkKLQkJZ290byBvdXQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWVyciA9IC1FTk9NRU07Ci0JbWVtc2l6ZSA9IHNpemVvZihOb2RlKSAmIzQzOyBjb3VudCAmIzQzOyA4OwotCWUgPSBrbWFsbG9jKG1lbXNpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7CiYjNDM7CWUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgJiM0MzsgTUlTQ19ERUxJTV9QQUQpLAomIzQzOwkJICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7CiAJaWYgKCFlKQotCQlnb3RvIG91dDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcCA9IGJ1ZiA9IChjaGFyICopZSAmIzQzOyBzaXplb2YoTm9kZSk7CiYjNDM7CXAgPSBidWYgPSBlLSZndDtidWY7CiAKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTsKJiM0MzsJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQotCQlnb3RvIGVmYXVsdDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwogCi0JZGVsID0gKnAmIzQzOyYjNDM7OwkvKiBkZWxpbWV0ZXIgKi8KJiM0MzsJZGVsID0gKnAmIzQzOyYjNDM7OwkvKiBkZWxpbWl0ZXIgKi8KIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGRlbGltOiAlI3ggeyVjfVxuJiMzNDssIGRlbCwgZGVsKTsKIAomIzQzOwkvKiBBIGZsYWctY2hhciBkZWxpbWl0ZXIgcnVucyB0aGUgZmxhZyBzY2FuIG9mZiB0aGUgYnVmZmVyLiAqLwomIzQzOwlpZiAoZGVsID09ICYjMzk7UCYjMzk7IHx8IGRlbCA9PSAmIzM5O08mIzM5OyB8fCBkZWwgPT0gJiMzOTtDJiMzOTsgfHwgZGVsID09ICYjMzk7RiYjMzk7KQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiYjNDM7CiAJLyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi8KLQltZW1zZXQoYnVmICYjNDM7IGNvdW50LCBkZWwsIDgpOwomIzQzOwltZW1zZXQoYnVmICYjNDM7IGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O25hbWUmIzM5OyBmaWVsZC4gKi8KIAllLSZndDtuYW1lID0gcDsKIAlwID0gc3RyY2hyKHAsIGRlbCk7CiAJaWYgKCFwKQotCQlnb3RvIGVpbnZhbDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAlpZiAoIWUtJmd0O25hbWVbMF0gfHwKIAkgICAgIXN0cmNtcChlLSZndDtuYW1lLCAmIzM0Oy4mIzM0OykgfHwKIAkgICAgIXN0cmNtcChlLSZndDtuYW1lLCAmIzM0Oy4uJiMzNDspIHx8CiAJICAgIHN0cmNocihlLSZndDtuYW1lLCAmIzM5Oy8mIzM5OykpCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XG4mIzM0OywgZS0mZ3Q7bmFtZSk7CiAKQEAgLTM5OCwxMzQgJiM0Mzs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiAJc3dpdGNoICgqcCYjNDM7JiM0MzspIHsKIAljYXNlICYjMzk7RSYjMzk7OgogCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiB0eXBlOiBFIChleHRlbnNpb24pXG4mIzM0Oyk7Ci0JCWUtJmd0O2ZsYWdzID0gMSAmbHQ7Jmx0OyBFbmFibGVkOwomIzQzOwkJZS0mZ3Q7ZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpOwogCQlicmVhazsKIAljYXNlICYjMzk7TSYjMzk7OgogCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcbiYjMzQ7KTsKLQkJZS0mZ3Q7ZmxhZ3MgPSAoMSAmbHQ7Jmx0OyBFbmFibGVkKSB8ICgxICZsdDsmbHQ7IE1hZ2ljKTsKJiM0MzsJCWUtJmd0O2ZsYWdzID0gQklUKE1JU0NfRk1UX0VOQUJMRURfQklUKSB8IEJJVChNSVNDX0ZNVF9NQUdJQ19CSVQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlnb3RvIGVpbnZhbDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAlpZiAoKnAmIzQzOyYjNDM7ICE9IGRlbCkKLQkJZ290byBlaW52YWw7Ci0KLQlpZiAodGVzdF9iaXQoTWFnaWMsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKSB7Ci0JCS8qIEhhbmRsZSB0aGUgJiMzOTtNJiMzOTsgKG1hZ2ljKSBmb3JtYXQuICovCi0JCWNoYXIgKnM7Ci0KLQkJLyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCi0JCXMgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFzKQotCQkJZ290byBlaW52YWw7Ci0JCSpzID0gJiMzOTtcMCYjMzk7OwotCQlpZiAocCAhPSBzKSB7Ci0JCQlpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgJmFtcDtlLSZndDtvZmZzZXQpOwotCQkJaWYgKHIgIT0gMCB8fCBlLSZndDtvZmZzZXQgJmx0OyAwKQotCQkJCWdvdG8gZWludmFsOwotCQl9Ci0JCXAgPSBzOwotCQlpZiAoKnAmIzQzOyYjNDM7KQotCQkJZ290byBlaW52YWw7Ci0JCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XG4mIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYWdpYyA9IHA7Ci0JCXAgPSBzY2FuYXJnKHAsIGRlbCk7Ci0JCWlmICghcCkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoIWUtJmd0O21hZ2ljWzBdKQotCQkJZ290byBlaW52YWw7Ci0JCWlmIChVU0VfREVCVUcpCi0JCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106ICYjMzQ7LAotCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hZ2ljLCBwIC0gZS0mZ3Q7bWFnaWMpOwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KLQkJZS0mZ3Q7bWFzayA9IHA7Ci0JCXAgPSBzY2FuYXJnKHAsIGRlbCk7Ci0JCWlmICghcCkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoIWUtJmd0O21hc2tbMF0pIHsKLQkJCWUtJmd0O21hc2sgPSBOVUxMOwotCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxuJiMzNDspOwotCQl9IGVsc2UgaWYgKFVTRV9ERUJVRykKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFzaywgcCAtIGUtJmd0O21hc2spOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQkJLyoKLQkJICogRGVjb2RlIHRoZSBtYWdpYyAmYW1wOyBtYXNrIGZpZWxkcy4KLQkJICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbQotCQkgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZQotCQkgKiBpdCBlbmNvdW50ZXJzLgotCQkgKi8KLQkJZS0mZ3Q7c2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtJmd0O21hZ2ljLCBVTkVTQ0FQRV9IRVgpOwotCQlpZiAoZS0mZ3Q7bWFzayAmYW1wOyZhbXA7Ci0JCSAgICBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtJmd0O3NpemUpCi0JCQlnb3RvIGVpbnZhbDsKLQkJaWYgKGUtJmd0O3NpemUgJmd0OyBCSU5QUk1fQlVGX1NJWkUgfHwKLQkJICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtJmd0O3NpemUgJmx0OyBlLSZndDtvZmZzZXQpCi0JCQlnb3RvIGVpbnZhbDsKLQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXG4mIzM0OywgZS0mZ3Q7c2l6ZSk7Ci0JCWlmIChVU0VfREVCVUcpIHsKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06ICYjMzQ7LAotCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKLQotCQkJaWYgKGUtJmd0O21hc2spIHsKLQkJCQlpbnQgaTsKLQkJCQljaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtJmd0O3NpemUsIEdGUF9LRVJORUxfQUNDT1VOVCk7Ci0KLQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogJiMzNDssCi0JCQkJCURVTVBfUFJFRklYX05PTkUsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwotCi0JCQkJaWYgKG1hc2tlZCkgewotCQkJCQlmb3IgKGkgPSAwOyBpICZsdDsgZS0mZ3Q7c2l6ZTsgJiM0MzsmIzQzO2kpCi0JCQkJCQltYXNrZWRbaV0gPSBlLSZndDttYWdpY1tpXSAmYW1wOyBlLSZndDttYXNrW2ldOwotCQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygKLQkJCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06ICYjMzQ7LAotCQkJCQkJRFVNUF9QUkVGSVhfTk9ORSwgbWFza2VkLCBlLSZndDtzaXplKTsKLQotCQkJCQlrZnJlZShtYXNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqLwotCi0JCS8qIFNraXAgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCi0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYWdpYyA9IHA7Ci0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQkJaWYgKCFlLSZndDttYWdpY1swXSB8fCBzdHJjaHIoZS0mZ3Q7bWFnaWMsICYjMzk7LyYjMzk7KSkKLQkJCWdvdG8gZWludmFsOwotCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cbiYjMzQ7LCBlLSZndDttYWdpYyk7Ci0KLQkJLyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCi0JCXAgPSBzdHJjaHIocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKLQl9CiYjNDM7CWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKQomIzQzOwkJcCA9IHBhcnNlX21hZ2ljX2ZpZWxkcyhlLCBwLCBkZWwpOwomIzQzOwllbHNlCiYjNDM7CQlwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O2ludGVycHJldGVyJiMzOTsgZmllbGQuICovCiAJZS0mZ3Q7aW50ZXJwcmV0ZXIgPSBwOwogCXAgPSBzdHJjaHIocCwgZGVsKTsKIAlpZiAoIXApCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwogCWlmICghZS0mZ3Q7aW50ZXJwcmV0ZXJbMF0pCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cbiYjMzQ7LCBlLSZndDtpbnRlcnByZXRlcik7CiAKIAkvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqLwpAQCAtNTMzLDI0ICYjNDM7NTIwLDIyIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogCWlmICgqcCA9PSAmIzM5O1xuJiMzOTspCiAJCXAmIzQzOyYjNDM7OwogCWlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudCkKLQkJZ290byBlaW52YWw7Ci0KLQlyZXR1cm4gZTsKLQotb3V0OgotCXJldHVybiBFUlJfUFRSKGVycik7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotZWZhdWx0OgotCWtmcmVlKGUpOwotCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotZWludmFsOgotCWtmcmVlKGUpOwotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwlyZXR1cm4gbm9fZnJlZV9wdHIoZSk7CiB9CiAKJiM0MzsvKiBDb21tYW5kcyBhY2NlcHRlZCBieSB0aGUgL3N0YXR1cyBhbmQgLyZsdDtlbnRyeSZndDsgZmlsZXMuICovCiYjNDM7ZW51bSBibV9jb21tYW5kIHsKJiM0MzsJQk1fQ01EX0lHTk9SRSwJLyogZW1wdHkgd3JpdGUgKi8KJiM0MzsJQk1fQ01EX0RJU0FCTEUsCS8qICYjMzQ7MCYjMzQ7ICovCiYjNDM7CUJNX0NNRF9FTkFCTEUsCS8qICYjMzQ7MSYjMzQ7ICovCiYjNDM7CUJNX0NNRF9SRU1PVkUsCS8qICYjMzQ7LTEmIzM0OyAqLwomIzQzO307CiYjNDM7CiAvKgotICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzoKLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjCiYjNDM7ICogUGFyc2Ugd2hhdCB1c2Vyc3BhY2Ugd3JvdGUgdG8gL3N0YXR1cyBvciBhbiBlbnRyeSBmaWxlOiAmIzM5OzEmIzM5OyBlbmFibGVzLAomIzQzOyAqICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiB7CkBAIC01NjEsNjIgJiM0Mzs1NDYsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIAlpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmICghY291bnQpCi0JCXJldHVybiAwOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9JR05PUkU7CiAJaWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xuJiMzOTspCiAJCWNvdW50LS07CiAJaWYgKGNvdW50ID09IDEgJmFtcDsmYW1wOyBzWzBdID09ICYjMzk7MCYjMzk7KQotCQlyZXR1cm4gMTsKJiM0MzsJCXJldHVybiBCTV9DTURfRElTQUJMRTsKIAlpZiAoY291bnQgPT0gMSAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTsxJiMzOTspCi0JCXJldHVybiAyOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9FTkFCTEU7CiAJaWYgKGNvdW50ID09IDIgJmFtcDsmYW1wOyBzWzBdID09ICYjMzk7LSYjMzk7ICZhbXA7JmFtcDsgc1sxXSA9PSAmIzM5OzEmIzM5OykKLQkJcmV0dXJuIDM7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX1JFTU9WRTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogZ2VuZXJpYyBzdHVmZiAqLwogCi1zdGF0aWMgdm9pZCBlbnRyeV9zdGF0dXMoTm9kZSAqZSwgY2hhciAqcGFnZSkKJiM0MztzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKQogewotCWNoYXIgKmRwID0gcGFnZTsKLQljb25zdCBjaGFyICpzdGF0dXMgPSAmIzM0O2Rpc2FibGVkJiMzNDs7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXFfcHJpbnRmKG0sICYjMzQ7JTAyeCYjMzQ7LCBkYXRhW2ldKTsKJiM0Mzt9CiAKLQlpZiAodGVzdF9iaXQoRW5hYmxlZCwgJmFtcDtlLSZndDtmbGFncykpCi0JCXN0YXR1cyA9ICYjMzQ7ZW5hYmxlZCYjMzQ7OwomIzQzO3N0YXRpYyBpbnQgYm1fZW50cnlfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tJmd0O3ByaXZhdGU7CiAKLQlpZiAoIVZFUkJPU0VfU1RBVFVTKSB7Ci0JCXNwcmludGYocGFnZSwgJiMzNDslc1xuJiMzNDssIHN0YXR1cyk7Ci0JCXJldHVybjsKLQl9CiYjNDM7CWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlzZXFfcHV0cyhtLCAmIzM0O2VuYWJsZWRcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJc2VxX3B1dHMobSwgJiMzNDtkaXNhYmxlZFxuJiMzNDspOwogCi0JZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7JXNcbmludGVycHJldGVyICVzXG4mIzM0Oywgc3RhdHVzLCBlLSZndDtpbnRlcnByZXRlcik7CiYjNDM7CXNlcV9wcmludGYobSwgJiMzNDtpbnRlcnByZXRlciAlc1xuJiMzNDssIGUtJmd0O2ludGVycHJldGVyKTsKIAogCS8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovCi0JZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7ZmxhZ3M6ICYjMzQ7KTsKJiM0MzsJc2VxX3B1dHMobSwgJiMzNDtmbGFnczogJiMzNDspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7UCYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtQJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7TyYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtPJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9DUkVERU5USUFMUykKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtDJiMzOTspOwogCWlmIChlLSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9PUEVOX0ZJTEUpCi0JCSpkcCYjNDM7JiM0MzsgPSAmIzM5O0YmIzM5OzsKLQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtcbiYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtGJiMzOTspOwomIzQzOwlzZXFfcHV0YyhtLCAmIzM5O1xuJiMzOTspOwogCi0JaWYgKCF0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJc3ByaW50ZihkcCwgJiMzNDtleHRlbnNpb24gLiVzXG4mIzM0OywgZS0mZ3Q7bWFnaWMpOwomIzQzOwlpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpIHsKJiM0MzsJCXNlcV9wcmludGYobSwgJiMzNDtleHRlbnNpb24gLiVzXG4mIzM0OywgZS0mZ3Q7bWFnaWMpOwogCX0gZWxzZSB7Ci0JCWRwICYjNDM7PSBzcHJpbnRmKGRwLCAmIzM0O29mZnNldCAlaVxubWFnaWMgJiMzNDssIGUtJmd0O29mZnNldCk7Ci0JCWRwID0gYmluMmhleChkcCwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwomIzQzOwkJc2VxX3ByaW50ZihtLCAmIzM0O29mZnNldCAlaVxubWFnaWMgJiMzNDssIGUtJmd0O29mZnNldCk7CiYjNDM7CQlibV9zZXFfaGV4KG0sIGUtJmd0O21hZ2ljLCBlLSZndDtzaXplKTsKIAkJaWYgKGUtJmd0O21hc2spIHsKLQkJCWRwICYjNDM7PSBzcHJpbnRmKGRwLCAmIzM0O1xubWFzayAmIzM0Oyk7Ci0JCQlkcCA9IGJpbjJoZXgoZHAsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwomIzQzOwkJCXNlcV9wdXRzKG0sICYjMzQ7XG5tYXNrICYjMzQ7KTsKJiM0MzsJCQlibV9zZXFfaGV4KG0sIGUtJmd0O21hc2ssIGUtJmd0O3NpemUpOwogCQl9Ci0JCSpkcCYjNDM7JiM0MzsgPSAmIzM5O1xuJiMzOTs7Ci0JCSpkcCA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCXNlcV9wdXRjKG0sICYjMzk7XG4mIzM5Oyk7CiAJfQomIzQzOwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKQomIzQzO3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7CiAKQEAgLTY1MiwxNCAmIzQzOzYzOSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAgKiBlbnRyeSBpcyByZW1vdmVkIG9yIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgdGhlIHN1cGVyIGJsb2NrIGlzCiAgKiBzaHV0ZG93bi4KICAqCi0gKiBJZiB0aGUgLSZndDtldmljdCBjYWxsIHdhcyBub3QgY2F1c2VkIGJ5IGEgc3VwZXIgYmxvY2sgc2h1dGRvd24gYnV0IGJ5IGEgd3JpdGUKLSAqIHRvIHJlbW92ZSB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgdGhlIGVudHJ5Ci0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrCi0gKiB0byBtYWtlIHRoYXQgZXhwbGljaXQuCiYjNDM7ICogSWYgdGhlIC0mZ3Q7ZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieQomIzQzOyAqIHJlbW92aW5nIHRoZSBlbnRyeSB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSBvciB1bmxpbmsoMikgdGhlIGVudHJ5CiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKCkKJiM0MzsgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuCiAqLwogc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlOb2RlICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKIAogCWNsZWFyX2lub2RlKGlub2RlKTsKIApAQCAtNjY3LDg5ICYjNDM7NjU0LDEzMiBAQCBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogCQlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7CiAKIAkJbWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpOwotCQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7ZS0mZ3Q7bGlzdCkpCi0JCQlsaXN0X2RlbF9pbml0KCZhbXA7ZS0mZ3Q7bGlzdCk7Ci0JCXdyaXRlX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlzcGluX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwkJaWYgKCFobGlzdF91bmhhc2hlZCgmYW1wO2UtJmd0O25vZGUpKQomIzQzOwkJCWhsaXN0X2RlbF9pbml0X3JjdSgmYW1wO2UtJmd0O25vZGUpOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwogCQlwdXRfYmluZm10X2hhbmRsZXIoZSk7CiAJfQogfQogCiYjNDM7LyoqCiYjNDM7ICogdW5saW5rX2JpbmZtdF9oYW5kbGVyIC0gdW5oYXNoIGEgYmluYXJ5IHR5cGUgaGFuZGxlcgomIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2UKJiM0MzsgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byB1bmhhc2gKJiM0MzsgKgomIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmQKJiM0MzsgKiB1bmxpbmsoMikgaGFwcGVucyB1bmRlciB0aGUgZXhjbHVzaXZlbHkgaGVsZCBpbm9kZSBsb2NrIG9mIHRoZSByb290CiYjNDM7ICogZGVudHJ5IGtlZXBpbmcgdGhlIGxpc3Qgc3RhYmxlIGZvciB3cml0ZXJzLiBsb2FkX21pc2NfYmluYXJ5KCkgd2Fsa3MgaXQKJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbAomIzQzOyAqIHVubGluayB0byBzZXJpYWxpemUgYWdhaW5zdCBibV9ldmljdF9pbm9kZSgpIHdoaWNoIHVubGlua3MgZW50cmllcwomIzQzOyAqIGR1cmluZyB1bW91bnQgd2l0aG91dCBob2xkaW5nIHRoZSByb290IGlub2RlIGxvY2suCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdW5saW5rX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiYjNDM7ewomIzQzOwlzcGluX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwlobGlzdF9kZWxfaW5pdF9yY3UoJmFtcDtlLSZndDtub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzO30KJiM0MzsKIC8qKgogICogcmVtb3ZlX2JpbmZtdF9oYW5kbGVyIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlcgogICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQogICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlCiAgKgogICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZAotICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbQotICogYmluZm10X3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHdhbnQgdG8gdGhpbmsgYWJvdXQKLSAqIGFkZGluZyBhIHByb3BlciAtJmd0O3VubGluaygpIG1ldGhvZCB0byBiaW5mbXRfbWlzYyBpbnN0ZWFkIG9mIGZvcmNpbmcgY2FsbGVyJiMzOTtzCi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhcwotICogd29ya2VkIGZvciBzbyBsb25nIHRoYXQgaXQmIzM5O3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuCiYjNDM7ICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4KICAqLwotc3RhdGljIHZvaWQgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgTm9kZSAqZSkKJiM0MztzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKIHsKLQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZhbXA7ZS0mZ3Q7bGlzdCk7Ci0Jd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJdW5saW5rX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpOwogCWxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLSZndDtkZW50cnksIE5VTEwpOwogfQogCi0vKiAvJmx0O2VudHJ5Jmd0OyAqLwomIzQzOy8qIFJlbW92ZSBAZSB1bmxlc3MgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZC4gKi8KJiM0MztzdGF0aWMgdm9pZCBibV9yZW1vdmVfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi0mZ3Q7c19yb290KTsKIAotc3RhdGljIHNzaXplX3QKLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKJiM0MzsJaW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpOwomIzQzOwlpZiAoIWhsaXN0X3VuaGFzaGVkKCZhbXA7ZS0mZ3Q7bm9kZSkpCiYjNDM7CQlyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhyb290KSwgZSk7CiYjNDM7CWlub2RlX3VubG9jayhyb290KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVtb3ZlIGFsbCBlbnRyaWVzIG9mIHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBAbWlzYyBiZWxvbmdpbmcgdG8gQHNiLiAqLwomIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9hbGxfZW50cmllcyhzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiYjNDM7CQkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlOb2RlICplID0gZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9wcml2YXRlOwotCXNzaXplX3QgcmVzOwotCWNoYXIgKnBhZ2U7CiYjNDM7CXN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItJmd0O3Nfcm9vdCk7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKJiM0MzsJc3RydWN0IGhsaXN0X25vZGUgKm5leHQ7CiYjNDM7CiYjNDM7CWlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTsKJiM0MzsJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIG5vZGUpCiYjNDM7CQlyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7CiYjNDM7CWlub2RlX3VubG9jayhyb290KTsKJiM0Mzt9CiAKLQlwYWdlID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7LyoqCiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpCiYjNDM7ICogQGRpcjogaW5vZGUgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CiYjNDM7ICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmUKJiM0MzsgKgomIzQzOyAqIFJlbW92aW5nIHRoZSBlbnRyeSBmaWxlIHJlbW92ZXMgaXRzIGJpbmFyeSB0eXBlIGhhbmRsZXIsIGV4YWN0bHkgbGlrZQomIzQzOyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4mIzM5O3QgYmUKJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2gKJiM0MzsgKiBzZXJpYWxpemVzIGFnYWluc3QgdGhlIHdyaXRlIGJhc2VkIGFkZCBhbmQgcmVtb3ZlIHBhdGhzLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktJmd0O2lfcHJpdmF0ZTsKJiM0MzsKJiM0MzsJaWYgKCFlKQomIzQzOwkJcmV0dXJuIC1FUEVSTTsKJiM0MzsKJiM0MzsJdW5saW5rX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoZGlyKSwgZSk7CiYjNDM7CXJldHVybiBzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKJiM0Mzt9CiAKLQllbnRyeV9zdGF0dXMoZSwgcGFnZSk7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewomIzQzOwkubG9va3VwCQk9IHNpbXBsZV9sb29rdXAsCiYjNDM7CS51bmxpbmsJCT0gYm1fdW5saW5rLAomIzQzO307CiAKLQlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTsKJiM0MzsvKiAvJmx0O2VudHJ5Jmd0OyAqLwomIzQzOwomIzQzO3N0YXRpYyBpbnQgYm1fZW50cnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiAKLQlrZnJlZShwYWdlKTsKLQlyZXR1cm4gcmVzOwomIzQzOwlyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS0mZ3Q7aV9wcml2YXRlKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovCiYjNDM7CWlmIChmaWxlLSZndDtmX21vZGUgJmFtcDsgRk1PREVfV1JJVEUpCiYjNDM7CQlmaWxlLSZndDtmX21vZGUgfD0gRk1PREVfUFdSSVRFOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7Ci0JTm9kZSAqZSA9IGlub2RlLSZndDtpX3ByaXZhdGU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLSZndDtpX3ByaXZhdGU7CiAJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CiAKIAlzd2l0Y2ggKHJlcykgewotCWNhc2UgMToKLQkJLyogRGlzYWJsZSB0aGlzIGhhbmRsZXIuICovCi0JCWNsZWFyX2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKTsKJiM0MzsJY2FzZSBCTV9DTURfRElTQUJMRToKJiM0MzsJCWNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMjoKLQkJLyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi8KLQkJc2V0X2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKTsKJiM0MzsJY2FzZSBCTV9DTURfRU5BQkxFOgomIzQzOwkJc2V0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJLyogRGVsZXRlIHRoaXMgaGFuZGxlci4gKi8KLQkJaW5vZGUgPSBkX2lub2RlKGlub2RlLSZndDtpX3NiLSZndDtzX3Jvb3QpOwotCQlpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQkgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlCi0JCSAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLgotCQkgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmUKLQkJICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc28KLQkJICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlCi0JCSAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC4KLQkJICovCi0JCWlmICghbGlzdF9lbXB0eSgmYW1wO2UtJmd0O2xpc3QpKQotCQkJcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTsKLQotCQlpbm9kZV91bmxvY2soaW5vZGUpOwomIzQzOwljYXNlIEJNX0NNRF9SRU1PVkU6CiYjNDM7CQlibV9yZW1vdmVfZW50cnkoZSwgaW5vZGUtJmd0O2lfc2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gcmVzOwpAQCAtNzU5LDE1ICYjNDM7Nzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0gewotCS5yZWFkCQk9IGJtX2VudHJ5X3JlYWQsCiYjNDM7CS5vcGVuCQk9IGJtX2VudHJ5X29wZW4sCiYjNDM7CS5yZWFkCQk9IHNlcV9yZWFkLAogCS53cml0ZQkJPSBibV9lbnRyeV93cml0ZSwKLQkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAomIzQzOwkubGxzZWVrCQk9IHNlcV9sc2VlaywKJiM0MzsJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIC8qIC9yZWdpc3RlciAqLwogCiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqLwotc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKJiM0MztzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLSZndDtzX3Jvb3QsIGUtJmd0O25hbWUpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC03ODksOSAmIzQzOzgyMSw5IEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiAKIAlkX21ha2VfcGVyc2lzdGVudChkZW50cnksIGlub2RlKTsKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7Ci0Jd3JpdGVfbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7Ci0JbGlzdF9hZGQoJmFtcDtlLSZndDtsaXN0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMpOwotCXdyaXRlX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWhsaXN0X2FkZF9oZWFkX3JjdSgmYW1wO2UtJmd0O25vZGUsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKIAlzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpOwogCXJldHVybiAwOwogfQpAQCAtNzk5LDEzICYjNDM7ODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlOb2RlICplOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2I7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IGZpbGUgKmYgPSBOVUxMOwomIzQzOwlpbnQgZXJyOwogCiAJZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTsKLQogCWlmIChJU19FUlIoZSkpCiAJCXJldHVybiBQVFJfRVJSKGUpOwogCkBAIC04MjIsNyAmIzQzOzg1Myw2IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQlpZiAoSVNfRVJSKGYpKSB7CiAJCQlwcl9ub3RpY2UoJiMzNDtyZWdpc3RlcjogZmFpbGVkIHRvIGluc3RhbGwgaW50ZXJwcmV0ZXIgZmlsZSAlc1xuJiMzNDssCiAJCQkJIGUtJmd0O2ludGVycHJldGVyKTsKLQkJCWtmcmVlKGUpOwogCQkJcmV0dXJuIFBUUl9FUlIoZik7CiAJCX0KIAkJZS0mZ3Q7aW50ZXJwX2ZpbGUgPSBmOwpAQCAtODM0LDkgJiM0Mzs4NjQsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQlleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7CiAJCQlmaWxwX2Nsb3NlKGYsIE5VTEwpOwogCQl9Ci0JCWtmcmVlKGUpOwogCQlyZXR1cm4gZXJyOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGVudHJ5IGlzIG93bmVkIGJ5IGl0cyBpbm9kZSBub3cuICovCiYjNDM7CXJldGFpbl9hbmRfbnVsbF9wdHIoZSk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC04NTEsMTAgJiM0Mzs4ODMsMTAgQEAgc3RhdGljIHNzaXplX3QKIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwotCWNoYXIgKnM7CiYjNDM7CWNvbnN0IGNoYXIgKnM7CiAKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTsKLQlzID0gbWlzYy0mZ3Q7ZW5hYmxlZCA/ICYjMzQ7ZW5hYmxlZFxuJiMzNDsgOiAmIzM0O2Rpc2FibGVkXG4mIzM0OzsKJiM0MzsJcyA9IFJFQURfT05DRShtaXNjLSZndDtlbmFibGVkKSA/ICYjMzQ7ZW5hYmxlZFxuJiMzNDsgOiAmIzM0O2Rpc2FibGVkXG4mIzM0OzsKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7CiB9CiAKQEAgLTg2MywzNyAmIzQzOzg5NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiB7CiAJc3RydWN0IGJpbmZtdF9taXNjICptaXNjOwogCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOwotCU5vZGUgKmUsICpuZXh0OwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAltaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTsKIAlzd2l0Y2ggKHJlcykgewotCWNhc2UgMToKLQkJLyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovCi0JCW1pc2MtJmd0O2VuYWJsZWQgPSBmYWxzZTsKJiM0MzsJY2FzZSBCTV9DTURfRElTQUJMRToKJiM0MzsJCVdSSVRFX09OQ0UobWlzYy0mZ3Q7ZW5hYmxlZCwgZmFsc2UpOwogCQlicmVhazsKLQljYXNlIDI6Ci0JCS8qIEVuYWJsZSBhbGwgaGFuZGxlcnMuICovCi0JCW1pc2MtJmd0O2VuYWJsZWQgPSB0cnVlOwomIzQzOwljYXNlIEJNX0NNRF9FTkFCTEU6CiYjNDM7CQlXUklURV9PTkNFKG1pc2MtJmd0O2VuYWJsZWQsIHRydWUpOwogCQlicmVhazsKLQljYXNlIDM6Ci0JCS8qIERlbGV0ZSBhbGwgaGFuZGxlcnMuICovCi0JCWlub2RlID0gZF9pbm9kZShmaWxlX2lub2RlKGZpbGUpLSZndDtpX3NiLSZndDtzX3Jvb3QpOwotCQlpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQkgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlCi0JCSAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLgotCQkgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmUKLQkJICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc28KLQkJICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlCi0JCSAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC4KLQkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIGxpc3QpCi0JCQlyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7Ci0KLQkJaW5vZGVfdW5sb2NrKGlub2RlKTsKJiM0MzsJY2FzZSBCTV9DTURfUkVNT1ZFOgomIzQzOwkJYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKG1pc2MsIGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gcmVzOwpAQCAtOTE4LDcgJiM0Mzs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIAlwdXRfdXNlcl9ucyh1c2VyX25zKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0gewomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAogCS5ldmljdF9pbm9kZQk9IGJtX2V2aWN0X2lub2RlLAogCS5wdXRfc3VwZXIJPSBibV9wdXRfc3VwZXIsCkBAIC05NjUsMTAgJiM0Mzs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYykKIAkJaWYgKCFtaXNjKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKLQkJcndsb2NrX2luaXQoJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwkJSU5JVF9ITElTVF9IRUFEKCZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7CiYjNDM7CQlzcGluX2xvY2tfaW5pdCgmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiAKLQkJLyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqLwomIzQzOwkJLyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gY3VycmVudF9iaW5mbXRfbWlzYygpLiAqLwogCQlzbXBfc3RvcmVfcmVsZWFzZSgmYW1wO3VzZXJfbnMtJmd0O2JpbmZtdF9taXNjLCBtaXNjKTsKIAl9CiAKQEAgLTk4MywxMiAmIzQzOzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKQogCSAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHkKIAkgKiByZXNldCAtJmd0O2VuYWJsZWQgdG8gdHJ1ZS4KIAkgKi8KLQltaXNjLSZndDtlbmFibGVkID0gdHJ1ZTsKJiM0MzsJV1JJVEVfT05DRShtaXNjLSZndDtlbmFibGVkLCB0cnVlKTsKIAogCWVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpOwotCWlmICghZXJyKQotCQlzYi0mZ3Q7c19vcCA9ICZhbXA7c19vcHM7Ci0JcmV0dXJuIGVycjsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CXNiLSZndDtzX29wID0gJmFtcDtibV9zdXBlcl9vcHM7CiYjNDM7CWRfaW5vZGUoc2ItJmd0O3Nfcm9vdCktJmd0O2lfb3AgPSAmYW1wO2JtX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYm1fZnJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykKIHN0cnVjdCBiaW5mbXRfbWlzYyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwotCXJ3bG9ja190IGVudHJpZXNfbG9jazsKJiM0MzsJc3RydWN0IGhsaXN0X2hlYWQgZW50cmllczsKJiM0MzsJc3BpbmxvY2tfdCBlbnRyaWVzX2xvY2s7CiAJYm9vbCBlbmFibGVkOwogfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDdhZWY0ZTY3OWE2YTBjLi4yMWJhZmRjMTEzNzk1NiAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvdXNlci5jCkBAIC0yMyw5ICYjNDM7MjMsOSBAQAogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpCiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHsKLQkuZW50cmllcyA9IExJU1RfSEVBRF9JTklUKGluaXRfYmluZm10X21pc2MuZW50cmllcyksCiYjNDM7CS5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULAogCS5lbmFibGVkID0gdHJ1ZSwKLQkuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSwKJiM0MzsJLmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpbml0X2JpbmZtdF9taXNjKTsKICNlbmRpZgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjY4MQoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDY1NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2g6IGJpbmZtdF9taXNjIFJlZmFjdG9yKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCYjMzk7cyBwcmV0dHkgaW50ZXJlc3RpbmcsIGFuZCBkZWZpbml0ZWx5IHdhcnJhbnRzIGEgY2xvc2VyIGxvb2suIFRoZXkmIzM5O3JlIGNoYW5naW5nIHRoZSBgYmluZm10X21pc2NgIHN1YnN5c3RlbSBpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgYGZzL2JpbmZtdF9taXNjLmNgLiAgSXQmIzM5O3MgYSBzaWduaWZpY2FudCByZWZhY3Rvciwgc3dpdGNoaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciBoYW5kbGluZyBiaW5hcnkgZm9ybWF0IGVudHJpZXMgZnJvbSBhIGRvdWJseS1saW5rZWQgbGlzdCAoYHN0cnVjdCBsaXN0X2hlYWRgKSB0byBhbiBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdCAoYHN0cnVjdCBobGlzdF9ub2RlYCAvIGBobGlzdF9oZWFkYCkuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IHRvdWNoZXMgY29yZSBrZXJuZWwgbG9naWMgZm9yIGxvYWRpbmcgYW5kIGV4ZWN1dGluZyBiaW5hcmllcy4gSXQgc2VlbXMgbGlrZSBpdCBhbHNvIGNoYW5nZXMgZnJvbSB1c2luZyBgcndsb2NrX3RgIHRvIGBzcGlubG9ja190YC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1RoaXMgaXMgcmVhY2hhYmxlIGFuZCAqZGVmaW5pdGVseSogd29ydGggZnV6emluZyEmIzM0OyAgQW55IHRpbWUgeW91IHRvdWNoIHNvbWV0aGluZyBmdW5kYW1lbnRhbCBsaWtlIHRoaXMg4oCTIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgYmluYXJ5IGV4ZWN1dGlvbiDigJMgeW91IG9wZW4gdXAgcG90ZW50aWFsIGF0dGFjayB2ZWN0b3JzLiBUaGUgaW50cm9kdWN0aW9uIG9mIFJDVSwgc3BlY2lmaWNhbGx5LCBpcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHdoZXJlIHJhY2UgY29uZGl0aW9ucyBtYXkgYXJpc2UuCgpMZXQmIzM5O3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhleSYjMzk7dmUgdG91Y2hlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gZm9jdXMgbXkgZnV6emluZyBlZmZvcnRzLiAgVGhleSYjMzk7dmUgbW9kaWZpZWQgb3IgYWRkZWQgYSBib2F0bG9hZCBvZiBmdW5jdGlvbnM6IGV2ZXJ5dGhpbmcgZnJvbSBgZW50cnlfbWF0Y2hlc19tYWdpY2AgYW5kIGBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbmAgdG8gYGxvYWRfbWlzY19iaW5hcnlgIGFuZCBhbGwgdGhlIGZpbGUgb3BlcmF0aW9uIGhvb2tzICggYGJtX2dldF9pbm9kZWAsIGBibV9ldmljdF9pbm9kZWAsIGBibV9lbnRyeV9vcGVuYCwgYGJtX2VudHJ5X3dyaXRlYCwgZXRjLikuICBUaGVyZSBpcyBhIGxvdCBvZiBuZXcgY29kZSBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIGB1bmxpbmsoMilgLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGAvcHJvY2AgZmlsZXN5c3RlbS4KCkdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIGVzcGVjaWFsbHkgdGhlIGRhdGEgc3RydWN0dXJlIG1vZGlmaWNhdGlvbnMgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBteSBodW5jaCBpcyB0aGF0IHBhcnNpbmcgYW5kIGZpbGUgb3BlcmF0aW9ucywgYWxvbmcgd2l0aCB0aGUgZXhlY3V0aW9uIHBhdGgsIGFyZSB3aGVyZSB0aGUgbW9zdCBpbnRlcmVzdGluZyBidWdzIG1pZ2h0IGhpZGUuIEkgc2hvdWxkIGNvbmNlbnRyYXRlIG15IGVmZm9ydHMgb24gdGhlc2Ugc3ltYm9sczogYGxvYWRfbWlzY19iaW5hcnlgLCBgY3JlYXRlX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBhbmQgYGJtX2VudHJ5X3Nob3dgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBib3RoIGFkZGluZyBuZXcgaGFuZGxlcnMsIHJlbW92aW5nIGhhbmRsZXJzLCBhbmQgYWN0dWFsbHkgdXNpbmcgdGhlIGhhbmRsZXJzLgoKT25lIG1vcmUgdGhpbmcgdG8gdmVyaWZ5OiBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgdG8gY29uZmlybSB0aGUgbmVjZXNzYXJ5IGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgY29kZS4gSSBzaG91bGQgZ3JlcCBmb3IgYEJJTkZNVF9NSVNDYCB3aXRoaW4gYGZzL0tjb25maWcuYmluZm10YCwgb3Igc2ltaWxhciBmaWxlcywgdG8gbWFrZSBzdXJlIHRoaXMgbW9kdWxlIGlzIGV2ZW4gZW5hYmxlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIHdoZXJlIHRoZSBjb2RlIGlzIGNvbXBpbGVkIHdpdGhpbiB0aGUga2VybmVsIGFuZCB0aHVzLCB3aGVyZSBJIHdpbGwgaGF2ZSB0aGUgbW9zdCBzdWNjZXNzIHRyeWluZyB0byBmaW5kIGlzc3Vlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtCSU5GTVRfTUlTQyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9LY29uZmlnLmJpbmZtdD0xMzg9Y29uZmlnIEJJTkZNVF9aRkxBVFxuLS1cbmZzL0tjb25maWcuYmluZm10LTE0NC1cbmZzL0tjb25maWcuYmluZm10OjE0NTpjb25maWcgQklORk1UX01JU0NcbmZzL0tjb25maWcuYmluZm10LTE0Ni1cdHRyaXN0YXRlIFwmIzM0O0tlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzXCYjMzQ7XG4tLVxuZnMvTWFrZWZpbGU9MzQ9b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICAmIzQzOz0gbG9ja3Mub1xuZnMvTWFrZWZpbGU6MzU6b2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVx0JiM0Mzs9IGJpbmZtdF9taXNjLm9cbmZzL01ha2VmaWxlLTM2LW9iai0kKENPTkZJR19CSU5GTVRfU0NSSVBUKVx0JiM0Mzs9IGJpbmZtdF9zY3JpcHQub1xuLS1cbmZzL2ZpbGVfdGFibGUuYz0xNjU9c3RhdGljIGludCBfX2luaXQgaW5pdF9mc19zdGF0X3N5c2N0bHModm9pZClcbi0tXG5mcy9maWxlX3RhYmxlLmMtMTY3LVx0cmVnaXN0ZXJfc3lzY3RsX2luaXQoXCYjMzQ7ZnNcJiMzNDssIGZzX3N0YXRfc3lzY3Rscyk7XG5mcy9maWxlX3RhYmxlLmM6MTY4Olx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKSkge1xuZnMvZmlsZV90YWJsZS5jLTE2OS1cdFx0c3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhkcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMSAwNTo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODIyMwoJCQkJCQkJb3V0cHV0OiAyMDYKCQkJCQkJCXRob3VnaHRzOiA1NTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBiaW5mbXRfbWlzYyBGaWxlc3lzdGVtIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBgYmluZm10X21pc2NgIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseSBgQklORk1UX01JU0NgLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCB0aGlzIGlzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24sIG5vIG90aGVyIHJlbGV2YW50IGNvbmZpZ3MgYXJlIHByZXNlbnQuIE5vdywgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIGludm9sdmVkLiBJJiMzOTt2ZSBjb21waWxlZCBhIGxpc3Q6CgoqICAgYGJtX3JlZ2lzdGVyX3dyaXRlYAoqICAgYGJtX2VudHJ5X3dyaXRlYAoqICAgYGJtX3N0YXR1c193cml0ZWAKKiAgIGBibV91bmxpbmtgCiogICBgbG9hZF9taXNjX2JpbmFyeWAKKiAgIGBjcmVhdGVfZW50cnlgCiogICBgcGFyc2VfbWFnaWNfZmllbGRzYAoqICAgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgCgpJIGNoZWNrZWQsIGFuZCB0aGV5JiMzOTtyZSBhbGwgc3RhdGljIGV4Y2VwdCBmb3IgYGxvYWRfbWlzY19iaW5hcnlgLiBBaCwgYnV0ICp0aGF0JiMzOTtzKiByZWdpc3RlcmVkIGluIHRoZSBgbGludXhfYmluZm10YCBzdHJ1Y3QsIHNwZWNpZmljYWxseSBsaWtlIHRoaXM6CgpgYGBjCnN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0gewoJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAoJLmxvYWRfYmluYXJ5ID0gbG9hZF9taXNjX2JpbmFyeSwKfTsKYGBgCgpTbyBgbG9hZF9taXNjX2JpbmFyeWAgKmlzKiBleHBvc2VkOyBpdCYjMzk7cyBjYWxsZWQgdmlhIGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBiaW5hcnkgZm9ybWF0IGhhbmRsaW5nLiBTbyB0aGF0JiMzOTtzIHRoZSBlbnRyeSBwb2ludC4KCk9rYXksIGxldCYjMzk7cyBjaXJjbGUgYmFjayBhbmQgY29uZmlybS4gTm8sIGBCSU5GTVRfTUlTQ2AgaXMgdGhlIHJlbGV2YW50IGNvbmZpZy4KCk5vdywgZm9yIHRoZSByZWFzb25pbmc6IFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3JpbmcgYGJpbmZtdF9taXNjYCB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgZG91Ymx5IGxpbmtlZCBsaXN0cywgaXQgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBpdCBhZGRzIGB1bmxpbmsoMilgIHN1cHBvcnQsIGFuZCBpdCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgYHNlcV9maWxlYCkuIFRoaXMgbWVhbnMgdGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgZXhlY3ZlYCBhbmQgb3BlcmF0aW9ucyBvbiBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL2AuCgpUaGVyZWZvcmUsIHRoZSBmb2N1cyBzeW1ib2xzIGFyZToKCiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgCiogICBgYm1fZW50cnlfd3JpdGVgCiogICBgYm1fc3RhdHVzX3dyaXRlYAoqICAgYGJtX3VubGlua2AKKiAgIGBsb2FkX21pc2NfYmluYXJ5YAoqICAgYGNyZWF0ZV9lbnRyeWAKKiAgIGBwYXJzZV9tYWdpY19maWVsZHNgCiogICBgcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkc2AKCkZpbmFsbHksIGxldCYjMzk7cyBhc3Nlc3MgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGFzIGl0IGFmZmVjdHMgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gQW5kIHNpbmNlIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gY2FuIGJlIG1hbmlwdWxhdGVkIGZyb20gdXNlcnNwYWNlICh0aHJvdWdoIGBleGVjdmVgIGFuZCBgL3Byb2NgKSwgaXQgKmNhbiogYmUgZXhlY3V0ZWQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdyBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDA1OjUxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JtX3JlZ2lzdGVyX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3N0YXR1c193cml0ZSYjMzQ7LAogICAgJiMzNDtibV91bmxpbmsmIzM0OywKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtjcmVhdGVfZW50cnkmIzM0OywKICAgICYjMzQ7cGFyc2VfbWFnaWNfZmllbGRzJiMzNDssCiAgICAmIzM0O3BhcnNlX2V4dGVuc2lvbl9maWVsZHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JtX3JlZ2lzdGVyX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3N0YXR1c193cml0ZSYjMzQ7LAogICAgJiMzNDtibV91bmxpbmsmIzM0OywKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtjcmVhdGVfZW50cnkmIzM0OywKICAgICYjMzQ7cGFyc2VfbWFnaWNfZmllbGRzJiMzNDssCiAgICAmIzM0O3BhcnNlX2V4dGVuc2lvbl9maWVsZHMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMTFUMDU6NTA6NTcuNDc3ODU3MTk0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwNTUyMjUyMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQklORk1UX01JU0NcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJibV9yZWdpc3Rlcl93cml0ZVwiLFxuICAgIFwiYm1fZW50cnlfd3JpdGVcIixcbiAgICBcImJtX3N0YXR1c193cml0ZVwiLFxuICAgIFwiYm1fdW5saW5rXCIsXG4gICAgXCJsb2FkX21pc2NfYmluYXJ5XCIsXG4gICAgXCJjcmVhdGVfZW50cnlcIixcbiAgICBcInBhcnNlX21hZ2ljX2ZpZWxkc1wiLFxuICAgIFwicGFyc2VfZXh0ZW5zaW9uX2ZpZWxkc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgYmluZm10X21pc2MgZmlsZXN5c3RlbSB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgYSBkb3VibHkgbGlua2VkIGxpc3QsIGNoYW5nZXMgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgYWRkcyBzdXBwb3J0IGZvciB1bmxpbmtpbmcgZW50cmllcyB2aWEgdW5saW5rKDIpLCBhbmQgcmVmYWN0b3JzIGVudHJ5IHBhcnNpbmcgYW5kIHJlYWRpbmcgKHVzaW5nIHNlcV9maWxlKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyAoYmluYXJ5IGZvcm1hdCBoYW5kbGluZyBhbmQgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0pIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSAodmlhIGV4ZWN2ZSBhbmQgb3BlcmF0aW9ucyBvbiAvcHJvYy9zeXMvZnMvYmluZm10X21pc2MvKSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTFUMDU6NTA6NTcuNDc3ODY2MzU0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDI2MzY1NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5OTQzNjJjZWIzM2ZiOTYxM2RiZjQyMTFlZGQ4Y2M3MTRmNjE2NjRkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgSnVsIDExIDA1OjUwOjU2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cXG4gXFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXFxuK29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkXFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cXG4gXFxuIFxcbiBIaW50c1xcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mY2FhZDE0ZjgxYTM0MiAxMDA2NDRcXG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXFxuKysrIGIvZnMvYmluZm10X21pc2MuY1xcbkBAIC0xMCw0NSArMTAsNDYgQEBcXG4gXFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXFxcIjogXFxcIiBmbXRcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGV4LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpbmZtdHMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcmVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jdHlwZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25hbWVpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY2FsbHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rc3RydG94LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gXFxuLSNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbi1cXG4tI2lmZGVmIERFQlVHXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXFxuLSNlbHNlXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAwXFxuLSNlbmRpZlxcbi1cXG4tZW51bSB7XFxuLVxcdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xcbisvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXFxuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XFxuK1xcdE1JU0NfRk1UX0VOQUJMRURfQklUXFx0PSAwLFxcbitcXHRNSVNDX0ZNVF9NQUdJQ19CSVRcXHQ9IDEsXFxuIH07XFxuIFxcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XFxuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcXHUwMDNjXFx1MDAzYyAzMSlcXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKVxcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXFx1MDAzY1xcdTAwM2MgMjkpXFxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXFx1MDAzY1xcdTAwM2MgMjgpXFxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cXG4rZW51bSBiaW5mbXRfbWlzY19lbnRyeV9mbGFncyB7XFxuK1xcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXFx0PSAoMVUgXFx1MDAzY1xcdTAwM2MgMzEpLFxcbitcXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDMwKSxcXG4rXFx0TUlTQ19GTVRfQ1JFREVOVElBTFNcXHQ9ICgxVSBcXHUwMDNjXFx1MDAzYyAyOSksXFxuK1xcdE1JU0NfRk1UX09QRU5fRklMRVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDI4KSxcXG4rfTtcXG4gXFxuLXR5cGVkZWYgc3RydWN0IHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xcbitcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcdFxcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xcbiBcXHRpbnQgb2Zmc2V0O1xcdFxcdFxcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xcbiBcXHRpbnQgc2l6ZTtcXHRcXHRcXHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcXG4gXFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xcbiBcXHRyZWZjb3VudF90IHVzZXJzO1xcdFxcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xcbi19IE5vZGU7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0Y2hhciBidWZbXTtcXHRcXHRcXHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXFxuK307XFxuIFxcbiAvKlxcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxcbkBAIC03NCwxMCArNzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqICAtIGludGVycDogfjUwIGJ5dGVzXFxuICAqICAtIGZsYWdzOiAgNSBieXRlc1xcbiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhXFxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cXG4gICovXFxuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXFxuIFxcbisvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXFxuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxcbitcXG4rLyogQ2hlY2sgaWYgQGUncyBtYWdpYyBtYXRjaGVzIEBicHJtJ3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXFxuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxcbitcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVxcdTAwM2VidWYgKyBlLVxcdTAwM2VvZmZzZXQ7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRyZXR1cm4gIW1lbWNtcChzLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaSsrKVxcbitcXHRcXHRpZiAoKHNbaV0gXiBlLVxcdTAwM2VtYWdpY1tpXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2ldKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKiBDaGVjayBpZiBAZSdzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqL1xcbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXFxuK1xcdFxcdFxcdFxcdCAgICBjb25zdCBjaGFyICpleHQpXFxuK3tcXG4rXFx0cmV0dXJuIGV4dCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBleHQpO1xcbit9XFxuK1xcbiAvKipcXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxcbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXFxuQEAgLTg2LDQzICsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxcbiAgKiB0eXBlIGhhbmRsZXJzLlxcbiAgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cXG4rICpcXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxcbitzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbiB7XFxuLVxcdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXFx1MDAzZWludGVycCwgJy4nKTtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVxcdTAwM2VpbnRlcnAsICcuJyk7XFxuK1xcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuIFxcbiBcXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdCkge1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXHRcXHRpbnQgajtcXG4tXFxuK1xcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbm9kZSkge1xcbiBcXHRcXHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXFxuLVxcdFxcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4rXFx0XFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cXG4tXFx0XFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSkge1xcbi1cXHRcXHRcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBwICsgMSkpXFxuK1xcdFxcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXFxuIFxcdFxcdFxcdFxcdHJldHVybiBlO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXFx1MDAyNiBtYXNrLiAqL1xcbi1cXHRcXHRzID0gYnBybS1cXHUwMDNlYnVmICsgZS1cXHUwMDNlb2Zmc2V0O1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzaykge1xcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaisrKVxcbi1cXHRcXHRcXHRcXHRpZiAoKCpzKysgXiBlLVxcdTAwM2VtYWdpY1tqXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2pdKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIGUtXFx1MDAzZXNpemU7IGorKylcXG4tXFx0XFx0XFx0XFx0aWYgKCgqcysrIF4gZS1cXHUwMDNlbWFnaWNbal0pKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGlmIChqID09IGUtXFx1MDAzZXNpemUpXFxuLVxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcXG4gICpcXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXFxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cXG4rICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxcbisgKiBpcyBib3VuZGVkLlxcbiAgKlxcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXFxuICAqL1xcbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xcbiBcXG4tXFx0cmVhZF9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xcbi1cXHRpZiAoZSlcXG4tXFx0XFx0cmVmY291bnRfaW5jKFxcdTAwMjZlLVxcdTAwM2V1c2Vycyk7XFxuLVxcdHJlYWRfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRndWFyZChyY3UpKCk7XFxuK1xcdGRvIHtcXG4rXFx0XFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4rXFx0fSB3aGlsZSAoZSBcXHUwMDI2XFx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZlLVxcdTAwM2V1c2VycykpO1xcbiBcXHRyZXR1cm4gZTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXFxuLSAqIEBlOiBub2RlIHRvIHB1dFxcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcXG4rICogQGU6IGVudHJ5IHRvIHB1dFxcbiAgKlxcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xcbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXFxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXFxuIHtcXG4gXFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcXHUwMDI2ZS1cXHUwMDNldXNlcnMpKSB7XFxuLVxcdFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcXG4rXFx0XFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XFxuK1xcdFxcdFxcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZS1cXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xcbi1cXHRcXHRrZnJlZShlKTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xcbitcXHRcXHRrZnJlZV9yY3UoZSwgcmN1KTtcXG4gXFx0fVxcbiB9XFxuIFxcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXFxuK1xcbiAvKipcXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcXG4gICpcXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXFxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXFxuLSAqIG9mIGl0cyBhbmNlc3RvcidzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mXFxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXFxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXFxuKyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxcbisgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxcbisgKiBwcmFjdGljZS5cXG4gICpcXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4gXFxuLVxcdHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTtcXG4tXFx0d2hpbGUgKHVzZXJfbnMpIHtcXG4rXFx0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVxcdTAwM2VwYXJlbnQpIHtcXG4gXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cXG4gXFx0XFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnVzZXJfbnMtXFx1MDAzZWJpbmZtdF9taXNjKTtcXG4gXFx0XFx0aWYgKG1pc2MpXFxuIFxcdFxcdFxcdHJldHVybiBtaXNjO1xcbi1cXG4tXFx0XFx0dXNlcl9ucyA9IHVzZXJfbnMtXFx1MDAzZXBhcmVudDtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIFxcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuICAqL1xcbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4ge1xcbi1cXHROb2RlICpmbXQ7XFxuLVxcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XFxuLVxcdGludCByZXR2YWwgPSAtRU5PRVhFQztcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4rXFx0aW50IHJldHZhbDtcXG4gXFxuLVxcdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XFxuLVxcdGlmICghbWlzYy1cXHUwMDNlZW5hYmxlZClcXG4tXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4rXFx0bWlzYyA9IGN1cnJlbnRfYmluZm10X21pc2MoKTtcXG4rXFx0aWYgKCFSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkpXFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4gXFx0aWYgKCFmbXQpXFxuLVxcdFxcdHJldHVybiByZXR2YWw7XFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cXG4tXFx0cmV0dmFsID0gLUVOT0VOVDtcXG4gXFx0aWYgKGJwcm0tXFx1MDAzZWludGVycF9mbGFncyBcXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcXG4tXFx0XFx0Z290byByZXQ7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xcbiBcXHRcXHRicHJtLVxcdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XFxuIFxcdFxcdGlmIChyZXR2YWwpXFxuLVxcdFxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoZm10LVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4gXFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cXG4gXFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tXFx1MDAzZWludGVycCwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xcbiBcXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LVxcdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXFxuIFxcdHJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtXFx1MDAzZWludGVycHJldGVyLCBicHJtKTtcXG4gXFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuLVxcdFxcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcXG4tXFx0XFx0XFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xcbitcXHRcXHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcXG4rXFx0XFx0XFx0aW50IGVyciA9IGV4ZV9maWxlX2Rlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0XFx0ZnB1dChpbnRlcnBfZmlsZSk7XFxuK1xcdFxcdFxcdFxcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBvcGVuX2V4ZWMoZm10LVxcdTAwM2VpbnRlcnByZXRlcik7XFxuIFxcdH1cXG4tXFx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XFxuIFxcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xcbiBcXG4gXFx0YnBybS1cXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcXG4gXFx0XFx0YnBybS1cXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcXG4tXFxuLVxcdHJldHZhbCA9IDA7XFxuLXJldDpcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXFxuLVxcdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xcbi1cXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxcbi1cXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xcbi1cXHQgKiBmcmVlIGl0Llxcbi1cXHQgKi9cXG4tXFx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0dmFsO1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gLyogQ29tbWFuZCBwYXJzZXJzICovXFxuIFxcbiAvKlxcbi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCxcXG4tICogcmVjb2duaXNpbmcgdGhlIFxcXFx4IHNwZWNpYWwuXFxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxcbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cXG4rICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xcbisgKiB0aGUgXFxcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxcbiAgKi9cXG4gc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXFxuIHtcXG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNbLTFdID0nXFxcXDAnO1xcbitcXHRzWy0xXSA9ICdcXFxcMCc7XFxuIFxcdHJldHVybiBzO1xcbiB9XFxuIFxcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXFxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHRjaGFyICpwID0gc2ZzO1xcbi1cXHRpbnQgY29udCA9IDE7XFxuLVxcbi1cXHQvKiBzcGVjaWFsIGZsYWdzICovXFxuLVxcdHdoaWxlIChjb250KSB7XFxuK1xcdGZvciAoOzsgcCsrKSB7XFxuIFxcdFxcdHN3aXRjaCAoKnApIHtcXG4gXFx0XFx0Y2FzZSAnUCc6XFxuIFxcdFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0cCsrO1xcbiBcXHRcXHRcXHRlLVxcdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ08nOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHArKztcXG4gXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdDJzpcXG4gXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuLVxcdFxcdFxcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxcbi1cXHRcXHRcXHQgICBvcGVuLWJpbmFyeSBmbGFnICovXFxuLVxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XFxuLVxcdFxcdFxcdFxcdFxcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcXG4rXFx0XFx0XFx0LyogQyBpbXBsaWVzIE8gKi9cXG4rXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ0YnOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuIFxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGRlZmF1bHQ6XFxuLVxcdFxcdFxcdGNvbnQgPSAwO1xcbitcXHRcXHRcXHRyZXR1cm4gcDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuK31cXG4rXFxuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcXG4re1xcbitcXHRjaGFyICpzO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpzID0gJ1xcXFwwJztcXG4rXFx0aWYgKHAgIT0gcykge1xcbitcXHRcXHRpZiAoa3N0cnRvaW50KHAsIDEwLCBcXHUwMDI2ZS1cXHUwMDNlb2Zmc2V0KSB8fCBlLVxcdTAwM2VvZmZzZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRwID0gcyArIDE7XFxuK1xcdHByX2RlYnVnKFxcXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXFxcblxcXCIsIGUtXFx1MDAzZW9mZnNldCk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cXG4rXFx0ZS1cXHUwMDNlbWFnaWMgPSBwO1xcbitcXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xcbitcXHRpZiAoIXAgfHwgIWUtXFx1MDAzZW1hZ2ljWzBdKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXFxuK1xcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tyYXddOiBcXFwiLFxcbitcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFnaWMsIHAgLSBlLVxcdTAwM2VtYWdpYywgdHJ1ZSk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRlLVxcdTAwM2VtYXNrID0gcDtcXG4rXFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrWzBdKSB7XFxuK1xcdFxcdGUtXFx1MDAzZW1hc2sgPSBOVUxMO1xcbitcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXFxcblxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFxcXCIsXFxuK1xcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYXNrLCBwIC0gZS1cXHUwMDNlbWFzaywgdHJ1ZSk7XFxuK1xcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxcbitcXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XFxuK1xcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXFxuK1xcdCAqL1xcbitcXHRlLVxcdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrIFxcdTAwMjZcXHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cXHUwMDNlc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChlLVxcdTAwM2VzaXplIFxcdTAwM2UgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcdHByaW50X2hleF9kdW1wX2RlYnVnKFxcbitcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFxcXCIsXFxuK1xcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcXFwiLFxcbitcXHRcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFzaywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdHJldHVybiBwO1xcbit9XFxuK1xcbisvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZCBvZiBhbiAnRScgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcXG4rXFx0XFx0XFx0XFx0ICAgIGNoYXIgZGVsKVxcbit7XFxuK1xcdC8qIFNraXAgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXFxuK1xcdGUtXFx1MDAzZW1hZ2ljID0gcDtcXG4rXFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbitcXHRpZiAoIXApXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHQqcCsrID0gJ1xcXFwwJztcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cXHUwMDNlbWFnaWMsICcvJykpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbitcXG4rXFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRyZXR1cm4gcDtcXG4gfVxcbiBcXG5AQCAtMzQ3LDUwICs0MzMsNTIgQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBzaXplX3QgY291bnQpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4tXFx0aW50IG1lbXNpemUsIGVycjtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRjaGFyICpidWYsICpwO1xcbiBcXHRjaGFyIGRlbDtcXG4gXFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxcXG5cXFwiLCBjb3VudCk7XFxuIFxcbiBcXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cXG4tXFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0aWYgKChjb3VudCBcXHUwMDNjIDExKSB8fCAoY291bnQgXFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tXFx0ZXJyID0gLUVOT01FTTtcXG4tXFx0bWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODtcXG4tXFx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4rXFx0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcXG4rXFx0XFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuIFxcdGlmICghZSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiBcXG4tXFx0cCA9IGJ1ZiA9IChjaGFyICopZSArIHNpemVvZihOb2RlKTtcXG4rXFx0cCA9IGJ1ZiA9IGUtXFx1MDAzZWJ1ZjtcXG4gXFxuLVxcdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xcbitcXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxcbi1cXHRcXHRnb3RvIGVmYXVsdDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuIFxcbi1cXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltZXRlciAqL1xcbitcXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltaXRlciAqL1xcbiBcXG4gXFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXFxcblxcXCIsIGRlbCwgZGVsKTtcXG4gXFxuK1xcdC8qIEEgZmxhZy1jaGFyIGRlbGltaXRlciBydW5zIHRoZSBmbGFnIHNjYW4gb2ZmIHRoZSBidWZmZXIuICovXFxuK1xcdGlmIChkZWwgPT0gJ1AnIHx8IGRlbCA9PSAnTycgfHwgZGVsID09ICdDJyB8fCBkZWwgPT0gJ0YnKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4rXFxuIFxcdC8qIFBhZCB0aGUgYnVmZmVyIHdpdGggdGhlIGRlbGltIHRvIHNpbXBsaWZ5IHBhcnNpbmcgYmVsb3cuICovXFxuLVxcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcXG4rXFx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXFxuIFxcdGUtXFx1MDAzZW5hbWUgPSBwO1xcbiBcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuIFxcdGlmICghcClcXG4tXFx0XFx0Z290byBlaW52YWw7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXHQqcCsrID0gJ1xcXFwwJztcXG4gXFx0aWYgKCFlLVxcdTAwM2VuYW1lWzBdIHx8XFxuIFxcdCAgICAhc3RyY21wKGUtXFx1MDAzZW5hbWUsIFxcXCIuXFxcIikgfHxcXG4gXFx0ICAgICFzdHJjbXAoZS1cXHUwMDNlbmFtZSwgXFxcIi4uXFxcIikgfHxcXG4gXFx0ICAgIHN0cmNocihlLVxcdTAwM2VuYW1lLCAnLycpKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbiBcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXG5AQCAtMzk4LDEzNCArNDg2LDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiBcXHRzd2l0Y2ggKCpwKyspIHtcXG4gXFx0Y2FzZSAnRSc6XFxuIFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcXFxuXFxcIik7XFxuLVxcdFxcdGUtXFx1MDAzZWZsYWdzID0gMSBcXHUwMDNjXFx1MDAzYyBFbmFibGVkO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRjYXNlICdNJzpcXG4gXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXFxcblxcXCIpO1xcbi1cXHRcXHRlLVxcdTAwM2VmbGFncyA9ICgxIFxcdTAwM2NcXHUwMDNjIEVuYWJsZWQpIHwgKDEgXFx1MDAzY1xcdTAwM2MgTWFnaWMpO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCkgfCBCSVQoTUlTQ19GTVRfTUFHSUNfQklUKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFx0fVxcbiBcXHRpZiAoKnArKyAhPSBkZWwpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0aWYgKHRlc3RfYml0KE1hZ2ljLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKSB7XFxuLVxcdFxcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbi1cXHRcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcylcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdCpzID0gJ1xcXFwwJztcXG4tXFx0XFx0aWYgKHAgIT0gcykge1xcbi1cXHRcXHRcXHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXFx1MDAyNmUtXFx1MDAzZW9mZnNldCk7XFxuLVxcdFxcdFxcdGlmIChyICE9IDAgfHwgZS1cXHUwMDNlb2Zmc2V0IFxcdTAwM2MgMClcXG4tXFx0XFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdH1cXG4tXFx0XFx0cCA9IHM7XFxuLVxcdFxcdGlmICgqcCsrKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcXFxuXFxcIiwgZS1cXHUwMDNlb2Zmc2V0KTtcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0pXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRpZiAoVVNFX0RFQlVHKVxcbi1cXHRcXHRcXHRwcmludF9oZXhfZHVtcF9ieXRlcyhcXG4tXFx0XFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFxcXCIsXFxuLVxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hZ2ljLCBwIC0gZS1cXHUwMDNlbWFnaWMpO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0ZS1cXHUwMDNlbWFzayA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFza1swXSkge1xcbi1cXHRcXHRcXHRlLVxcdTAwM2VtYXNrID0gTlVMTDtcXG4tXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxcXG5cXFwiKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChVU0VfREVCVUcpXFxuLVxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFzaywgcCAtIGUtXFx1MDAzZW1hc2spO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy5cXG4tXFx0XFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxcbi1cXHRcXHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxcbi1cXHRcXHQgKiBpdCBlbmNvdW50ZXJzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZS1cXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzayBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVxcdTAwM2VzaXplKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0aWYgKGUtXFx1MDAzZXNpemUgXFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcXG4tXFx0XFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcdFxcdGlmIChVU0VfREVCVUcpIHtcXG4tXFx0XFx0XFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXFxuLVxcdFxcdFxcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFnaWMsIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0XFx0aW50IGk7XFxuLVxcdFxcdFxcdFxcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hc2ssIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0aWYgKG1hc2tlZCkge1xcbi1cXHRcXHRcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgKytpKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHRtYXNrZWRbaV0gPSBlLVxcdTAwM2VtYWdpY1tpXSBcXHUwMDI2IGUtXFx1MDAzZW1hc2tbaV07XFxuLVxcdFxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcbi1cXHRcXHRcXHRcXHRcXHRrZnJlZShtYXNrZWQpO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKiBIYW5kbGUgdGhlICdFJyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovXFxuLVxcbi1cXHRcXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4tXFx0XFx0aWYgKCFwKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0KnArKyA9ICdcXFxcMCc7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXFx1MDAzZW1hZ2ljLCAnLycpKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4tXFxuLVxcdFxcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFx0fVxcbitcXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnaW50ZXJwcmV0ZXInIGZpZWxkLiAqL1xcbiBcXHRlLVxcdTAwM2VpbnRlcnByZXRlciA9IHA7XFxuIFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4gXFx0aWYgKCFwKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRpZiAoIWUtXFx1MDAzZWludGVycHJldGVyWzBdKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZWludGVycHJldGVyKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xcbkBAIC01MzMsMjQgKzUyMCwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcXG4gXFx0aWYgKCpwID09ICdcXFxcbicpXFxuIFxcdFxcdHArKztcXG4gXFx0aWYgKHAgIT0gYnVmICsgY291bnQpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0cmV0dXJuIGU7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tZWZhdWx0Olxcbi1cXHRrZnJlZShlKTtcXG4tXFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuLWVpbnZhbDpcXG4tXFx0a2ZyZWUoZSk7XFxuLVxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XFxuIH1cXG4gXFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXFx1MDAzY2VudHJ5XFx1MDAzZSBmaWxlcy4gKi9cXG4rZW51bSBibV9jb21tYW5kIHtcXG4rXFx0Qk1fQ01EX0lHTk9SRSxcXHQvKiBlbXB0eSB3cml0ZSAqL1xcbitcXHRCTV9DTURfRElTQUJMRSxcXHQvKiBcXFwiMFxcXCIgKi9cXG4rXFx0Qk1fQ01EX0VOQUJMRSxcXHQvKiBcXFwiMVxcXCIgKi9cXG4rXFx0Qk1fQ01EX1JFTU9WRSxcXHQvKiBcXFwiLTFcXFwiICovXFxuK307XFxuK1xcbiAvKlxcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxcbisgKiAnMCcgZGlzYWJsZXMgYW5kICctMScgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuXFxuICAqL1xcbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiB7XFxuQEAgLTU2MSw2MiArNTQ2LDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdGlmICghY291bnQpXFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcXG4gXFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxcXG4nKVxcbiBcXHRcXHRjb3VudC0tO1xcbiBcXHRpZiAoY291bnQgPT0gMSBcXHUwMDI2XFx1MDAyNiBzWzBdID09ICcwJylcXG4tXFx0XFx0cmV0dXJuIDE7XFxuK1xcdFxcdHJldHVybiBCTV9DTURfRElTQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDEgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAyO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDIgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnLScgXFx1MDAyNlxcdTAwMjYgc1sxXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAzO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcXG4gXFx0cmV0dXJuIC1FSU5WQUw7XFxuIH1cXG4gXFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cXG4gXFxuLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKVxcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxcbiB7XFxuLVxcdGNoYXIgKmRwID0gcGFnZTtcXG4tXFx0Y29uc3QgY2hhciAqc3RhdHVzID0gXFxcImRpc2FibGVkXFxcIjtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspXFxuK1xcdFxcdHNlcV9wcmludGYobSwgXFxcIiUwMnhcXFwiLCBkYXRhW2ldKTtcXG4rfVxcbiBcXG4tXFx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpXFxuLVxcdFxcdHN0YXR1cyA9IFxcXCJlbmFibGVkXFxcIjtcXG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXFx1MDAzZXByaXZhdGU7XFxuIFxcbi1cXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XFxuLVxcdFxcdHNwcmludGYocGFnZSwgXFxcIiVzXFxcXG5cXFwiLCBzdGF0dXMpO1xcbi1cXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4rXFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRzZXFfcHV0cyhtLCBcXFwiZW5hYmxlZFxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c2VxX3B1dHMobSwgXFxcImRpc2FibGVkXFxcXG5cXFwiKTtcXG4gXFxuLVxcdGRwICs9IHNwcmludGYoZHAsIFxcXCIlc1xcXFxuaW50ZXJwcmV0ZXIgJXNcXFxcblxcXCIsIHN0YXR1cywgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbitcXHRzZXFfcHJpbnRmKG0sIFxcXCJpbnRlcnByZXRlciAlc1xcXFxuXFxcIiwgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbiBcXG4gXFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cXG4tXFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcImZsYWdzOiBcXFwiKTtcXG4rXFx0c2VxX3B1dHMobSwgXFxcImZsYWdzOiBcXFwiKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXFxuLVxcdFxcdCpkcCsrID0gJ1AnO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnUCcpO1xcbiBcXHRpZiAoZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcXG4tXFx0XFx0KmRwKysgPSAnTyc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdPJyk7XFxuIFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxcbi1cXHRcXHQqZHArKyA9ICdDJztcXG4rXFx0XFx0c2VxX3B1dGMobSwgJ0MnKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxcbi1cXHRcXHQqZHArKyA9ICdGJztcXG4tXFx0KmRwKysgPSAnXFxcXG4nO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnRicpO1xcbitcXHRzZXFfcHV0YyhtLCAnXFxcXG4nKTtcXG4gXFxuLVxcdGlmICghdGVzdF9iaXQoTWFnaWMsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4tXFx0XFx0c3ByaW50ZihkcCwgXFxcImV4dGVuc2lvbiAuJXNcXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4rXFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiZXh0ZW5zaW9uIC4lc1xcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRkcCArPSBzcHJpbnRmKGRwLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbi1cXHRcXHRkcCA9IGJpbjJoZXgoZHAsIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbitcXHRcXHRibV9zZXFfaGV4KG0sIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4tXFx0XFx0XFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0XFx0c2VxX3B1dHMobSwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4rXFx0XFx0XFx0Ym1fc2VxX2hleChtLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0fVxcbi1cXHRcXHQqZHArKyA9ICdcXFxcbic7XFxuLVxcdFxcdCpkcCA9ICdcXFxcMCc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdcXFxcbicpO1xcbiBcXHR9XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpXFxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXFxuIHtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XFxuIFxcbkBAIC02NTIsMTQgKzYzOSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcXG4gICogc2h1dGRvd24uXFxuICAqXFxuLSAqIElmIHRoZSAtXFx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxcbi0gKiB0byByZW1vdmUgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIHRoZSBlbnRyeVxcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXFxuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cXG4rICogSWYgdGhlIC1cXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxcbisgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKVxcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXFxuICovXFxuIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIHtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcbiBcXHRjbGVhcl9pbm9kZShpbm9kZSk7XFxuIFxcbkBAIC02NjcsODkgKzY1NCwxMzIgQEAgc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gXFx0XFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXG4gXFx0XFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xcbi1cXHRcXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRcXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNmUtXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0XFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdGlmICghaGxpc3RfdW5oYXNoZWQoXFx1MDAyNmUtXFx1MDAzZW5vZGUpKVxcbitcXHRcXHRcXHRobGlzdF9kZWxfaW5pdF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUpO1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4gXFx0XFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xcbiBcXHR9XFxuIH1cXG4gXFxuKy8qKlxcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4rICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXFxuKyAqXFxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcXG4rICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxcbisgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0aGxpc3RfZGVsX2luaXRfcmN1KFxcdTAwMjZlLVxcdTAwM2Vub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4gICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlXFxuICAqXFxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcXG4tICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbVxcbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVxcdTAwM2V1bmxpbmsoKSBtZXRob2QgdG8gYmluZm10X21pc2MgaW5zdGVhZCBvZiBmb3JjaW5nIGNhbGxlcidzXFxuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXFxuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXFxuKyAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuXFxuICAqL1xcbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxcbitzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuIFxcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVxcdTAwM2VkZW50cnksIE5VTEwpO1xcbiB9XFxuIFxcbi0vKiAvXFx1MDAzY2VudHJ5XFx1MDAzZSAqL1xcbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXFxuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuK3tcXG4rXFx0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cXHUwMDNlc19yb290KTtcXG4gXFxuLXN0YXRpYyBzc2l6ZV90XFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFxcdTAwMjZlLVxcdTAwM2Vub2RlKSlcXG4rXFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xcbitcXHRpbm9kZV91bmxvY2socm9vdCk7XFxuK31cXG4rXFxuKy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdE5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX3ByaXZhdGU7XFxuLVxcdHNzaXplX3QgcmVzO1xcbi1cXHRjaGFyICpwYWdlO1xcbitcXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVxcdTAwM2VzX3Jvb3QpO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpuZXh0O1xcbitcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzLCBub2RlKVxcbitcXHRcXHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuK1xcdGlub2RlX3VubG9jayhyb290KTtcXG4rfVxcbiBcXG4tXFx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFwYWdlKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rLyoqXFxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxcbisgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnlcXG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcXG4rICpcXG4rICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlXFxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcXG4rICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cXG4rICovXFxuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXFxuK3tcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcbitcXHRpZiAoIWUpXFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xcbit9XFxuIFxcbi1cXHRlbnRyeV9zdGF0dXMoZSwgcGFnZSk7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gc2ltcGxlX2xvb2t1cCxcXG4rXFx0LnVubGlua1xcdFxcdD0gYm1fdW5saW5rLFxcbit9O1xcbiBcXG4tXFx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XFxuKy8qIC9cXHUwMDNjZW50cnlcXHUwMDNlICovXFxuK1xcbitzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4gXFxuLVxcdGtmcmVlKHBhZ2UpO1xcbi1cXHRyZXR1cm4gcmVzO1xcbitcXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cXHUwMDNlaV9wcml2YXRlKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXFxuK1xcdGlmIChmaWxlLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9XUklURSlcXG4rXFx0XFx0ZmlsZS1cXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcXG4rXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xcbiBcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0Y2xlYXJfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuK1xcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XFxuK1xcdFxcdGNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0c2V0X2JpdChFbmFibGVkLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpO1xcbitcXHRjYXNlIEJNX0NNRF9FTkFCTEU6XFxuK1xcdFxcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuIFxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIDM6XFxuLVxcdFxcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXFxuLVxcdFxcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KTtcXG4tXFx0XFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxcbi1cXHRcXHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXFxuLVxcdFxcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxcbi1cXHRcXHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4ndCBiZVxcbi1cXHRcXHQgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzb1xcbi1cXHRcXHQgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2VcXG4tXFx0XFx0ICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZlLVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTtcXG4tXFxuLVxcdFxcdGlub2RlX3VubG9jayhpbm9kZSk7XFxuK1xcdGNhc2UgQk1fQ01EX1JFTU9WRTpcXG4rXFx0XFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiByZXM7XFxuQEAgLTc1OSwxNSArNzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiB9XFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xcbi1cXHQucmVhZFxcdFxcdD0gYm1fZW50cnlfcmVhZCxcXG4rXFx0Lm9wZW5cXHRcXHQ9IGJtX2VudHJ5X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSBzZXFfcmVhZCxcXG4gXFx0LndyaXRlXFx0XFx0PSBibV9lbnRyeV93cml0ZSxcXG4tXFx0Lmxsc2Vla1xcdFxcdD0gZGVmYXVsdF9sbHNlZWssXFxuK1xcdC5sbHNlZWtcXHRcXHQ9IHNlcV9sc2VlayxcXG4rXFx0LnJlbGVhc2VcXHQ9IHNpbmdsZV9yZWxlYXNlLFxcbiB9O1xcbiBcXG4gLyogL3JlZ2lzdGVyICovXFxuIFxcbiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqL1xcbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHtcXG4gXFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVxcdTAwM2VzX3Jvb3QsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbkBAIC03ODksOSArODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4gXFxuIFxcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7XFxuLVxcdHdyaXRlX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZlLVxcdTAwM2VsaXN0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuLVxcdHdyaXRlX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRobGlzdF9hZGRfaGVhZF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuIFxcdHNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTc5OSwxMyArODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYjtcXG4tXFx0aW50IGVyciA9IDA7XFxuIFxcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcXG4rXFx0aW50IGVycjtcXG4gXFxuIFxcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XFxuLVxcbiBcXHRpZiAoSVNfRVJSKGUpKVxcbiBcXHRcXHRyZXR1cm4gUFRSX0VSUihlKTtcXG4gXFxuQEAgLTgyMiw3ICs4NTMsNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcXG4gXFx0XFx0aWYgKElTX0VSUihmKSkge1xcbiBcXHRcXHRcXHRwcl9ub3RpY2UoXFxcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbi1cXHRcXHRcXHRrZnJlZShlKTtcXG4gXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoZik7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZS1cXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xcbkBAIC04MzQsOSArODY0LDExIEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XFxuIFxcdFxcdH1cXG4tXFx0XFx0a2ZyZWUoZSk7XFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4rXFxuK1xcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xcbitcXHRyZXRhaW5fYW5kX251bGxfcHRyKGUpO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIH1cXG4gXFxuQEAgLTg1MSwxMCArODgzLDEwIEBAIHN0YXRpYyBzc2l6ZV90XFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbi1cXHRjaGFyICpzO1xcbitcXHRjb25zdCBjaGFyICpzO1xcbiBcXG4gXFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XFxuLVxcdHMgPSBtaXNjLVxcdTAwM2VlbmFibGVkID8gXFxcImVuYWJsZWRcXFxcblxcXCIgOiBcXFwiZGlzYWJsZWRcXFxcblxcXCI7XFxuK1xcdHMgPSBSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkgPyBcXFwiZW5hYmxlZFxcXFxuXFxcIiA6IFxcXCJkaXNhYmxlZFxcXFxuXFxcIjtcXG4gXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpO1xcbiB9XFxuIFxcbkBAIC04NjMsMzcgKzg5NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcXG4tXFx0Tm9kZSAqZSwgKm5leHQ7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTtcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xcbitcXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxcbitcXHRcXHRXUklURV9PTkNFKG1pc2MtXFx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IHRydWU7XFxuK1xcdGNhc2UgQk1fQ01EX0VOQUJMRTpcXG4rXFx0XFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMzpcXG4tXFx0XFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCk7XFxuLVxcdFxcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3RcXG4tXFx0XFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxcbi1cXHRcXHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cXG4tXFx0XFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcXG4tXFx0XFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cXG4tXFx0XFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXFxuLVxcdFxcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdClcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xcbi1cXG4tXFx0XFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcXG4rXFx0Y2FzZSBCTV9DTURfUkVNT1ZFOlxcbitcXHRcXHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbkBAIC05MTgsNyArOTMwLDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIFxcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XFxuIFxcdC5zdGF0ZnNcXHRcXHQ9IHNpbXBsZV9zdGF0ZnMsXFxuIFxcdC5ldmljdF9pbm9kZVxcdD0gYm1fZXZpY3RfaW5vZGUsXFxuIFxcdC5wdXRfc3VwZXJcXHQ9IGJtX3B1dF9zdXBlcixcXG5AQCAtOTY1LDEwICs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4gXFx0XFx0aWYgKCFtaXNjKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4tXFx0XFx0cndsb2NrX2luaXQoXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdElOSVRfSExJU1RfSEVBRChcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbiBcXG4tXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqL1xcbitcXHRcXHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXFxuIFxcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZ1c2VyX25zLVxcdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XFxuIFxcdH1cXG4gXFxuQEAgLTk4MywxMiArOTk1LDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuIFxcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcXG4gXFx0ICogcmVzZXQgLVxcdTAwM2VlbmFibGVkIHRvIHRydWUuXFxuIFxcdCAqL1xcbi1cXHRtaXNjLVxcdTAwM2VlbmFibGVkID0gdHJ1ZTtcXG4rXFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFxuIFxcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xcbi1cXHRpZiAoIWVycilcXG4tXFx0XFx0c2ItXFx1MDAzZXNfb3AgPSBcXHUwMDI2c19vcHM7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRzYi1cXHUwMDNlc19vcCA9IFxcdTAwMjZibV9zdXBlcl9vcHM7XFxuK1xcdGRfaW5vZGUoc2ItXFx1MDAzZXNfcm9vdCktXFx1MDAzZWlfb3AgPSBcXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xcbi1cXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XFxuK1xcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XFxuK1xcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xcbiBcXHRib29sIGVuYWJsZWQ7XFxuIH0gX19yYW5kb21pemVfbGF5b3V0O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmNcXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3VzZXIuY1xcbisrKyBiL2tlcm5lbC91c2VyLmNcXG5AQCAtMjMsOSArMjMsOSBAQFxcbiBcXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcXG4tXFx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxcbitcXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcXG4gXFx0LmVuYWJsZWQgPSB0cnVlLFxcbi1cXHQuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4rXFx0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4gfTtcXG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MDo1Ny44MjEzNzQ5NDVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NzExNjk3Nzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiY3JlYXRlX2VudHJ5XCIsXG4gICAgXCJwYXJzZV9tYWdpY19maWVsZHNcIixcbiAgICBcInBhcnNlX2V4dGVuc2lvbl9maWVsZHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOTk0MzYyY2ViMzNmYjk2MTNkYmY0MjExZWRkOGNjNzE0ZjYxNjY0ZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgSnVsIDExIDA1OjUwOjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuaW5kZXggYzBhMzRmYmY4MDIyYjUuLjMwNmVmNDhmNWRlNmRkIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5AQCAtMTMzLDcgKzEzMyw4IEBAIG9yIDEgKHRvIGVuYWJsZSkgdG8gYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAgb3JcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cbiBcbiBZb3UgY2FuIHJlbW92ZSBvbmUgZW50cnkgb3IgYWxsIGVudHJpZXMgYnkgZWNob2luZyAtMSB0byBgYC9wcm9jLy4uLi90aGVfbmFtZWBgXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXG4rb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWRcbitieSBzaW1wbHkgdW5saW5raW5nIChgYHJtYGApIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAuXG4gXG4gXG4gSGludHNcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xuaW5kZXggODQzNDlmY2I5M2YxM2EuLmZjYWFkMTRmODFhMzQyIDEwMDY0NFxuLS0tIGEvZnMvYmluZm10X21pc2MuY1xuKysrIGIvZnMvYmluZm10X21pc2MuY1xuQEAgLTEwLDQ1ICsxMCw0NiBAQFxuIFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXCI6IFwiIGZtdFxuIFxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL21tLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NsZWFudXAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2N0eXBlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjYWxscy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tzdHJ0b3guaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ByaW50ay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmVmY291bnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlcV9maWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC91c2VyX25hbWVzcGFjZS5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXCJpbnRlcm5hbC5oXCJcbi1cbi0jaWZkZWYgREVCVUdcbi0jIGRlZmluZSBVU0VfREVCVUcgMVxuLSNlbHNlXG4tIyBkZWZpbmUgVVNFX0RFQlVHIDBcbi0jZW5kaWZcbi1cbi1lbnVtIHtcbi1cdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xuKy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi9cbitlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2JpdHMge1xuK1x0TUlTQ19GTVRfRU5BQkxFRF9CSVRcdD0gMCxcbitcdE1JU0NfRk1UX01BR0lDX0JJVFx0PSAxLFxuIH07XG4gXG4tZW51bSB7RW5hYmxlZCwgTWFnaWN9O1xuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcdTAwM2NcdTAwM2MgMzEpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFx1MDAzY1x1MDAzYyAzMClcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXHUwMDNjXHUwMDNjIDI5KVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXHUwMDNjXHUwMDNjIDI4KVxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cbitlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHtcbitcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMzEpLFxuK1x0TUlTQ19GTVRfT1BFTl9CSU5BUllcdD0gKDFVIFx1MDAzY1x1MDAzYyAzMCksXG4rXHRNSVNDX0ZNVF9DUkVERU5USUFMU1x0PSAoMVUgXHUwMDNjXHUwMDNjIDI5KSxcbitcdE1JU0NfRk1UX09QRU5fRklMRVx0PSAoMVUgXHUwMDNjXHUwMDNjIDI4KSxcbit9O1xuIFxuLXR5cGVkZWYgc3RydWN0IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xuK1x0c3RydWN0IGhsaXN0X25vZGUgbm9kZTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XHRcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xuIFx0aW50IG9mZnNldDtcdFx0XHQvKiBvZmZzZXQgb2YgbWFnaWMgKi9cbiBcdGludCBzaXplO1x0XHRcdC8qIHNpemUgb2YgbWFnaWMvbWFzayAqL1xuQEAgLTU5LDkgKzYwLDkgQEAgdHlwZWRlZiBzdHJ1Y3Qge1xuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5O1xuIFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xuIFx0cmVmY291bnRfdCB1c2VycztcdFx0Lyogc3luYyByZW1vdmFsIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpICovXG4tfSBOb2RlO1xuLVxuLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuK1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbitcdGNoYXIgYnVmW107XHRcdFx0LyogcmVnaXN0ZXIgc3RyaW5nLCBmaWVsZHMgcG9pbnQgaW4gaGVyZSAqL1xuK307XG4gXG4gLypcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxuQEAgLTc0LDEwICs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiAgLSBpbnRlcnA6IH41MCBieXRlc1xuICAqICAtIGZsYWdzOiAgNSBieXRlc1xuICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGFcbi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cbiAgKi9cbiAjZGVmaW5lIE1BWF9SRUdJU1RFUl9MRU5HVEggMTkyMFxuIFxuKy8qIFRyYWlsaW5nIGRlbGltaXRlciBwYWQgc28gZmllbGQgcGFyc2luZyBhbHdheXMgdGVybWluYXRlcyBhdCBhIGRlbGltaXRlci4gKi9cbisjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDhcbitcbisvKiBDaGVjayBpZiBAZSdzIG1hZ2ljIG1hdGNoZXMgQGJwcm0ncyBidWZmZXIsIGFwcGx5aW5nIHRoZSBtYXNrIGlmIHNldC4gKi9cbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX21hZ2ljKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSxcbitcdFx0XHRcdGNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4re1xuK1x0Y29uc3QgY2hhciAqcyA9IGJwcm0tXHUwMDNlYnVmICsgZS1cdTAwM2VvZmZzZXQ7XG4rXHRpbnQgaTtcbitcbitcdGlmICghZS1cdTAwM2VtYXNrKVxuK1x0XHRyZXR1cm4gIW1lbWNtcChzLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZS1cdTAwM2VzaXplOyBpKyspXG4rXHRcdGlmICgoc1tpXSBeIGUtXHUwMDNlbWFnaWNbaV0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV0pXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qIENoZWNrIGlmIEBlJ3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovXG4rc3RhdGljIGJvb2wgZW50cnlfbWF0Y2hlc19leHRlbnNpb24oY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuK1x0XHRcdFx0ICAgIGNvbnN0IGNoYXIgKmV4dClcbit7XG4rXHRyZXR1cm4gZXh0IFx1MDAyNlx1MDAyNiAhc3RyY21wKGUtXHUwMDNlbWFnaWMsIGV4dCk7XG4rfVxuK1xuIC8qKlxuICAqIHNlYXJjaF9iaW5mbXRfaGFuZGxlciAtIHNlYXJjaCBmb3IgYSBiaW5hcnkgaGFuZGxlciBmb3IgQGJwcm1cbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXG5AQCAtODYsNDMgKzExMywzMCBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnlcbiAgKiB0eXBlIGhhbmRsZXJzLlxuICAqXG4rICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2suXG4rICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxuK3NlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Y2hhciAqcCA9IHN0cnJjaHIoYnBybS1cdTAwM2VpbnRlcnAsICcuJyk7XG4tXHROb2RlICplO1xuK1x0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJy4nKTtcbitcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuIFx0LyogV2FsayBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuICovXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbGlzdCkge1xuLVx0XHRjaGFyICpzO1xuLVx0XHRpbnQgajtcbi1cbitcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIG5vZGUpIHtcbiBcdFx0LyogTWFrZSBzdXJlIHRoaXMgb25lIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqL1xuLVx0XHRpZiAoIXRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gZXh0ZW5zaW9uIGlmIGFwcGxpY2FibGUuICovXG4tXHRcdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdFx0aWYgKHAgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgcCArIDEpKVxuK1x0XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuK1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX21hZ2ljKGUsIGJwcm0pKVxuIFx0XHRcdFx0cmV0dXJuIGU7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXHUwMDI2IG1hc2suICovXG4tXHRcdHMgPSBicHJtLVx1MDAzZWJ1ZiArIGUtXHUwMDNlb2Zmc2V0O1xuLVx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgZS1cdTAwM2VzaXplOyBqKyspXG4tXHRcdFx0XHRpZiAoKCpzKysgXiBlLVx1MDAzZW1hZ2ljW2pdKSBcdTAwMjYgZS1cdTAwM2VtYXNrW2pdKVxuLVx0XHRcdFx0XHRicmVhaztcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBlLVx1MDAzZXNpemU7IGorKylcbi1cdFx0XHRcdGlmICgoKnMrKyBeIGUtXHUwMDNlbWFnaWNbal0pKVxuLVx0XHRcdFx0XHRicmVhaztcbitcdFx0XHRpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSlcbitcdFx0XHRcdHJldHVybiBlO1xuIFx0XHR9XG4tXHRcdGlmIChqID09IGUtXHUwMDNlc2l6ZSlcbi1cdFx0XHRyZXR1cm4gZTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTEzNCw2NCArMTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcbiAgKlxuICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYVxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cbisgKiByZWZlcmVuY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlbW92YWwgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIFRoZVxuKyAqIHJlZmNvdW50IG9mIGFuIGVudHJ5IGNhbiBvbmx5IGRyb3AgdG8gemVybyBvbmNlIGl0IGhhcyBiZWVuIHVubGlua2VkIGFuZFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxuKyAqIGlzIGJvdW5kZWQuXG4gICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHRzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmdldF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZTtcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbi1cdHJlYWRfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuLVx0aWYgKGUpXG4tXHRcdHJlZmNvdW50X2luYyhcdTAwMjZlLVx1MDAzZXVzZXJzKTtcbi1cdHJlYWRfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGd1YXJkKHJjdSkoKTtcbitcdGRvIHtcbitcdFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbitcdH0gd2hpbGUgKGUgXHUwMDI2XHUwMDI2ICFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2ZS1cdTAwM2V1c2VycykpO1xuIFx0cmV0dXJuIGU7XG4gfVxuIFxuIC8qKlxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXG4tICogQGU6IG5vZGUgdG8gcHV0XG4rICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIGVudHJ5XG4rICogQGU6IGVudHJ5IHRvIHB1dFxuICAqXG4tICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cbiAgKiBsb2FkX21pc2NfYmluYXJ5KCkgaW4gY2FzZSBpdCBpcyB1c2luZyB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciB3ZSB3ZXJlXG4gICogcmVxdWVzdGVkIHRvIHJlbW92ZS5cbiAgKi9cbi1zdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoTm9kZSAqZSlcbitzdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbiBcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2ZS1cdTAwM2V1c2VycykpIHtcbi1cdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbitcdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuK1x0XHRcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVx1MDAzZWludGVycF9maWxlKTtcbiBcdFx0XHRmaWxwX2Nsb3NlKGUtXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xuLVx0XHRrZnJlZShlKTtcbitcdFx0fVxuK1x0XHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xuK1x0XHRrZnJlZV9yY3UoZSwgcmN1KTtcbiBcdH1cbiB9XG4gXG4rREVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKVxuK1xuIC8qKlxuLSAqIGxvYWRfYmluZm10X21pc2MgLSBsb2FkIHRoZSBiaW5mbXRfbWlzYyBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcbiAgKlxuLSAqIFRvIGJlIGNhbGxlZCBpbiBsb2FkX21pc2NfYmluYXJ5KCkgdG8gbG9hZCB0aGUgcmVsZXZhbnQgc3RydWN0IGJpbmZtdF9taXNjLlxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXG4tICogb2YgaXRzIGFuY2VzdG9yJ3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2Zcbi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZVxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXG4rICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2Vzbid0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCB1c2VzIHRoZVxuKyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2ZcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxuKyAqIHRvIGFsbCB1c2VycyBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uIFRoZSBpbml0IHVzZXIgbmFtZXNwYWNlXG4rICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW5cbisgKiBwcmFjdGljZS5cbiAgKlxuICAqIFJldHVybjogdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbitzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpXG4ge1xuIFx0Y29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuIFxuLVx0dXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuLVx0d2hpbGUgKHVzZXJfbnMpIHtcbitcdGZvciAodXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOyB1c2VyX25zOyB1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQpIHtcbiBcdFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cbiBcdFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYyk7XG4gXHRcdGlmIChtaXNjKVxuIFx0XHRcdHJldHVybiBtaXNjO1xuLVxuLVx0XHR1c2VyX25zID0gdXNlcl9ucy1cdTAwM2VwYXJlbnQ7XG4gXHR9XG4gXG4gXHRyZXR1cm4gXHUwMDI2aW5pdF9iaW5mbXRfbWlzYztcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXG4gICovXG4gc3RhdGljIGludCBsb2FkX21pc2NfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZm10O1xuLVx0c3RydWN0IGZpbGUgKmludGVycF9maWxlID0gTlVMTDtcbi1cdGludCByZXR2YWwgPSAtRU5PRVhFQztcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDtcbitcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbitcdGludCByZXR2YWw7XG4gXG4tXHRtaXNjID0gbG9hZF9iaW5mbXRfbWlzYygpO1xuLVx0aWYgKCFtaXNjLVx1MDAzZWVuYWJsZWQpXG4tXHRcdHJldHVybiByZXR2YWw7XG4rXHRtaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpO1xuK1x0aWYgKCFSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSlcbitcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0Zm10ID0gZ2V0X2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuIFx0aWYgKCFmbXQpXG4tXHRcdHJldHVybiByZXR2YWw7XG4rXHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cbi1cdHJldHZhbCA9IC1FTk9FTlQ7XG4gXHRpZiAoYnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHtcbiBcdFx0YnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmV0dmFsID0gcmVtb3ZlX2FyZ196ZXJvKGJwcm0pO1xuIFx0XHRpZiAocmV0dmFsKVxuLVx0XHRcdGdvdG8gcmV0O1xuK1x0XHRcdHJldHVybiByZXR2YWw7XG4gXHR9XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiBcdC8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovXG4gXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS1cdTAwM2VpbnRlcnAsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MrKztcbiBcbiBcdC8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtXHUwMDNlaW50ZXJwcmV0ZXIsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiByZXR2YWw7XG4gXHRicHJtLVx1MDAzZWFyZ2MrKztcbiBcbiBcdC8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqL1xuIFx0cmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSkge1xuIFx0XHRpbnRlcnBfZmlsZSA9IGZpbGVfY2xvbmVfb3BlbihmbXQtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuLVx0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpXG4tXHRcdFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuK1x0XHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcbitcdFx0XHRpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuK1xuK1x0XHRcdGlmIChlcnIpIHtcbitcdFx0XHRcdGZwdXQoaW50ZXJwX2ZpbGUpO1xuK1x0XHRcdFx0aW50ZXJwX2ZpbGUgPSBFUlJfUFRSKGVycik7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHR9IGVsc2Uge1xuIFx0XHRpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFx0fVxuLVx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXHRpZiAoSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0Z290byByZXQ7XG4rXHRcdHJldHVybiBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcbiBcdGJwcm0tXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuIFx0XHRicHJtLVx1MDAzZWV4ZWNmZF9jcmVkcyA9IDE7XG4tXG4tXHRyZXR2YWwgPSAwO1xuLXJldDpcbi1cbi1cdC8qXG4tXHQgKiBJZiB3ZSBhY3R1YWxseSBwdXQgdGhlIG5vZGUgaGVyZSBhbGwgY29uY3VycmVudCBjYWxscyB0b1xuLVx0ICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93XG4tXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxuLVx0ICogcmVtb3ZlZCB0aGUgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IGFuZCBpdCdzIG91ciBqb2IgdG9cbi1cdCAqIGZyZWUgaXQuXG4tXHQgKi9cbi1cdHB1dF9iaW5mbXRfaGFuZGxlcihmbXQpO1xuLVxuLVx0cmV0dXJuIHJldHZhbDtcbitcdHJldHVybiAwO1xuIH1cbiBcbiAvKiBDb21tYW5kIHBhcnNlcnMgKi9cbiBcbiAvKlxuLSAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLFxuLSAqIHJlY29nbmlzaW5nIHRoZSBcXHggc3BlY2lhbC5cbi0gKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW5cbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cbisgKiBTY2FuIHRoZSBhcmd1bWVudCBzdGFydGluZyBhdCBAcyB1cCB0byB0aGUgZGVsaW1pdGVyIEBkZWwsIHJlY29nbmlzaW5nXG4rICogdGhlIFxceCBlc2NhcGUuIFRlcm1pbmF0ZXMgdGhlIGFyZ3VtZW50IHdpdGggYSBOVUwgYW5kIHJldHVybnMgYSBwb2ludGVyXG4rICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS5cbiAgKi9cbiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiB7XG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIFx0XHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdH1cbiBcdH1cbi1cdHNbLTFdID0nXFwwJztcbitcdHNbLTFdID0gJ1xcMCc7XG4gXHRyZXR1cm4gcztcbiB9XG4gXG4tc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHRjaGFyICpwID0gc2ZzO1xuLVx0aW50IGNvbnQgPSAxO1xuLVxuLVx0Lyogc3BlY2lhbCBmbGFncyAqL1xuLVx0d2hpbGUgKGNvbnQpIHtcbitcdGZvciAoOzsgcCsrKSB7XG4gXHRcdHN3aXRjaCAoKnApIHtcbiBcdFx0Y2FzZSAnUCc6XG4gXHRcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxuXCIpO1xuLVx0XHRcdHArKztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdPJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ0MnOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxcblwiKTtcbi1cdFx0XHRwKys7XG4tXHRcdFx0LyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlXG4tXHRcdFx0ICAgb3Blbi1iaW5hcnkgZmxhZyAqL1xuLVx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHxcbi1cdFx0XHRcdFx0TUlTQ19GTVRfT1BFTl9CSU5BUlkpO1xuK1x0XHRcdC8qIEMgaW1wbGllcyBPICovXG4rXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9DUkVERU5USUFMUyB8IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdGJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBGOiBvcGVuIGludGVycHJldGVyIGZpbGUgbm93XFxuXCIpO1xuLVx0XHRcdHArKztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbi1cdFx0XHRjb250ID0gMDtcbitcdFx0XHRyZXR1cm4gcDtcbiBcdFx0fVxuIFx0fVxuK31cbitcbisvKiBQYXJzZSB0aGUgJ29mZnNldCcsICdtYWdpYycgYW5kICdtYXNrJyBmaWVsZHMgb2YgYW4gJ00nIGVudHJ5LiAqL1xuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcbit7XG4rXHRjaGFyICpzO1xuK1xuK1x0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xuK1x0cyA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFzKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpzID0gJ1xcMCc7XG4rXHRpZiAocCAhPSBzKSB7XG4rXHRcdGlmIChrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KSB8fCBlLVx1MDAzZW9mZnNldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHAgPSBzICsgMTtcbitcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbitcbitcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuK1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4rXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuK1x0aWYgKCFwIHx8ICFlLVx1MDAzZW1hZ2ljWzBdKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwiLFxuK1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgcCAtIGUtXHUwMDNlbWFnaWMsIHRydWUpO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cbitcdGUtXHUwMDNlbWFzayA9IHA7XG4rXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4rXHRcdGUtXHUwMDNlbWFzayA9IE5VTEw7XG4rXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXG5cIik7XG4rXHR9IGVsc2Uge1xuK1x0XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbitcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFwiLFxuK1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2ssIHRydWUpO1xuK1x0fVxuIFxuK1x0LypcbitcdCAqIERlY29kZSB0aGUgbWFnaWMgXHUwMDI2IG1hc2sgZmllbGRzLiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkXG4rXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XG4rXHQgKiB0aGUgZmlyc3Qgb25lIHRoZXkgZW5jb3VudGVyLlxuK1x0ICovXG4rXHRlLVx1MDAzZXNpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xuK1x0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjYgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtXHUwMDNlc2l6ZSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcXG5cIiwgZS1cdTAwM2VzaXplKTtcbitcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcIixcbitcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4rXHRpZiAoZS1cdTAwM2VtYXNrKVxuK1x0XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbitcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcIixcbitcdFx0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUsIHRydWUpO1xuK1x0cmV0dXJuIHA7XG4rfVxuK1xuKy8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkIG9mIGFuICdFJyBlbnRyeTogdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gKi9cbitzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsXG4rXHRcdFx0XHQgICAgY2hhciBkZWwpXG4re1xuK1x0LyogU2tpcCB0aGUgJ29mZnNldCcgZmllbGQuICovXG4rXHRwID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnArKyA9ICdcXDAnO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4rXHRlLVx1MDAzZW1hZ2ljID0gcDtcbitcdHAgPSBzdHJjaHIocCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHQqcCsrID0gJ1xcMCc7XG4rXHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICcvJykpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0cHJfZGVidWcoXCJyZWdpc3RlcjogZXh0ZW5zaW9uOiB7JXN9XFxuXCIsIGUtXHUwMDNlbWFnaWMpO1xuK1xuK1x0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xuK1x0cCA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpwKysgPSAnXFwwJztcbiBcdHJldHVybiBwO1xuIH1cbiBcbkBAIC0zNDcsNTAgKzQzMyw1MiBAQCBzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4gICogJzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MnXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxuICAqL1xuLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuK1x0XHRcdFx0XHQgICAgICBzaXplX3QgY291bnQpXG4ge1xuLVx0Tm9kZSAqZTtcbi1cdGludCBtZW1zaXplLCBlcnI7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRjaGFyICpidWYsICpwO1xuIFx0Y2hhciBkZWw7XG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcXG5cIiwgY291bnQpO1xuIFxuIFx0Lyogc29tZSBzYW5pdHkgY2hlY2tzICovXG4tXHRlcnIgPSAtRUlOVkFMO1xuIFx0aWYgKChjb3VudCBcdTAwM2MgMTEpIHx8IChjb3VudCBcdTAwM2UgTUFYX1JFR0lTVEVSX0xFTkdUSCkpXG4tXHRcdGdvdG8gb3V0O1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdGVyciA9IC1FTk9NRU07XG4tXHRtZW1zaXplID0gc2l6ZW9mKE5vZGUpICsgY291bnQgKyA4O1xuLVx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbitcdGUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgKyBNSVNDX0RFTElNX1BBRCksXG4rXHRcdCAgICBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuIFx0aWYgKCFlKVxuLVx0XHRnb3RvIG91dDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRwID0gYnVmID0gKGNoYXIgKillICsgc2l6ZW9mKE5vZGUpO1xuK1x0cCA9IGJ1ZiA9IGUtXHUwMDNlYnVmO1xuIFxuLVx0bWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7XG4rXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4gXHRpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSlcbi1cdFx0Z290byBlZmF1bHQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuIFxuLVx0ZGVsID0gKnArKztcdC8qIGRlbGltZXRlciAqL1xuK1x0ZGVsID0gKnArKztcdC8qIGRlbGltaXRlciAqL1xuIFxuIFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZGVsaW06ICUjeCB7JWN9XFxuXCIsIGRlbCwgZGVsKTtcbiBcbitcdC8qIEEgZmxhZy1jaGFyIGRlbGltaXRlciBydW5zIHRoZSBmbGFnIHNjYW4gb2ZmIHRoZSBidWZmZXIuICovXG4rXHRpZiAoZGVsID09ICdQJyB8fCBkZWwgPT0gJ08nIHx8IGRlbCA9PSAnQycgfHwgZGVsID09ICdGJylcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXG4gXHQvKiBQYWQgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWxpbSB0byBzaW1wbGlmeSBwYXJzaW5nIGJlbG93LiAqL1xuLVx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIDgpO1xuK1x0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcbiBcbiBcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHQqcCsrID0gJ1xcMCc7XG4gXHRpZiAoIWUtXHUwMDNlbmFtZVswXSB8fFxuIFx0ICAgICFzdHJjbXAoZS1cdTAwM2VuYW1lLCBcIi5cIikgfHxcbiBcdCAgICAhc3RyY21wKGUtXHUwMDNlbmFtZSwgXCIuLlwiKSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICcvJykpXG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXG5cIiwgZS1cdTAwM2VuYW1lKTtcbiBcbkBAIC0zOTgsMTM0ICs0ODYsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwKyspIHtcbiBcdGNhc2UgJ0UnOlxuIFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiB0eXBlOiBFIChleHRlbnNpb24pXFxuXCIpO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbitcdFx0ZS1cdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSAnTSc6XG4gXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IHR5cGU6IE0gKG1hZ2ljKVxcblwiKTtcbi1cdFx0ZS1cdTAwM2VmbGFncyA9ICgxIFx1MDAzY1x1MDAzYyBFbmFibGVkKSB8ICgxIFx1MDAzY1x1MDAzYyBNYWdpYyk7XG4rXHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0fVxuIFx0aWYgKCpwKysgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAnTScgKG1hZ2ljKSBmb3JtYXQuICovXG4tXHRcdGNoYXIgKnM7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbi1cdFx0cyA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXMpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpzID0gJ1xcMCc7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwKyspXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCIsXG4tXHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFzaycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFzayA9IHA7XG4tXHRcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbi1cdFx0XHRlLVx1MDAzZW1hc2sgPSBOVUxMO1xuLVx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXG5cIik7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCI6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiBcIixcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzayk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogbWFnaWMvbWFzayBsZW5ndGg6ICVpXFxuXCIsIGUtXHUwMDNlc2l6ZSk7XG4tXHRcdGlmIChVU0VfREVCVUcpIHtcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwiLFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0XHRpbnQgaTtcbi1cdFx0XHRcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cdTAwM2VzaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuLVxuLVx0XHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFwiLFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgKytpKVxuLVx0XHRcdFx0XHRcdG1hc2tlZFtpXSA9IGUtXHUwMDNlbWFnaWNbaV0gXHUwMDI2IGUtXHUwMDNlbWFza1tpXTtcbi1cdFx0XHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCI6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCIsXG4tXHRcdFx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgbWFza2VkLCBlLVx1MDAzZXNpemUpO1xuLVxuLVx0XHRcdFx0XHRrZnJlZShtYXNrZWQpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbi1cdFx0fVxuLVx0fSBlbHNlIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAnRScgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnArKyA9ICdcXDAnO1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICcvJykpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnArKyA9ICdcXDAnO1xuLVx0fVxuK1x0aWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbitcdGVsc2VcbitcdFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJ2ludGVycHJldGVyJyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHQqcCsrID0gJ1xcMCc7XG4gXHRpZiAoIWUtXHUwMDNlaW50ZXJwcmV0ZXJbMF0pXG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGludGVycHJldGVyOiB7JXN9XFxuXCIsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFxuIFx0LyogUGFyc2UgdGhlICdmbGFncycgZmllbGQuICovXG5AQCAtNTMzLDI0ICs1MjAsMjIgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRpZiAoKnAgPT0gJ1xcbicpXG4gXHRcdHArKztcbiBcdGlmIChwICE9IGJ1ZiArIGNvdW50KVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdHJldHVybiBlO1xuLVxuLW91dDpcbi1cdHJldHVybiBFUlJfUFRSKGVycik7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLWVmYXVsdDpcbi1cdGtmcmVlKGUpO1xuLVx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4tZWludmFsOlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbitcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4rLyogQ29tbWFuZHMgYWNjZXB0ZWQgYnkgdGhlIC9zdGF0dXMgYW5kIC9cdTAwM2NlbnRyeVx1MDAzZSBmaWxlcy4gKi9cbitlbnVtIGJtX2NvbW1hbmQge1xuK1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4rXHRCTV9DTURfRElTQUJMRSxcdC8qIFwiMFwiICovXG4rXHRCTV9DTURfRU5BQkxFLFx0LyogXCIxXCIgKi9cbitcdEJNX0NNRF9SRU1PVkUsXHQvKiBcIi0xXCIgKi9cbit9O1xuK1xuIC8qXG4tICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzpcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xuKyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJzEnIGVuYWJsZXMsXG4rICogJzAnIGRpc2FibGVzIGFuZCAnLTEnIHJlbW92ZXMgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzLlxuICAqL1xuIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4ge1xuQEAgLTU2MSw2MiArNTQ2LDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0aWYgKCFjb3VudClcbi1cdFx0cmV0dXJuIDA7XG4rXHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxuJylcbiBcdFx0Y291bnQtLTtcbiBcdGlmIChjb3VudCA9PSAxIFx1MDAyNlx1MDAyNiBzWzBdID09ICcwJylcbi1cdFx0cmV0dXJuIDE7XG4rXHRcdHJldHVybiBCTV9DTURfRElTQUJMRTtcbiBcdGlmIChjb3VudCA9PSAxIFx1MDAyNlx1MDAyNiBzWzBdID09ICcxJylcbi1cdFx0cmV0dXJuIDI7XG4rXHRcdHJldHVybiBCTV9DTURfRU5BQkxFO1xuIFx0aWYgKGNvdW50ID09IDIgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJy0nIFx1MDAyNlx1MDAyNiBzWzFdID09ICcxJylcbi1cdFx0cmV0dXJuIDM7XG4rXHRcdHJldHVybiBCTV9DTURfUkVNT1ZFO1xuIFx0cmV0dXJuIC1FSU5WQUw7XG4gfVxuIFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cbiBcbi1zdGF0aWMgdm9pZCBlbnRyeV9zdGF0dXMoTm9kZSAqZSwgY2hhciAqcGFnZSlcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxuIHtcbi1cdGNoYXIgKmRwID0gcGFnZTtcbi1cdGNvbnN0IGNoYXIgKnN0YXR1cyA9IFwiZGlzYWJsZWRcIjtcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpKyspXG4rXHRcdHNlcV9wcmludGYobSwgXCIlMDJ4XCIsIGRhdGFbaV0pO1xuK31cbiBcbi1cdGlmICh0ZXN0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbi1cdFx0c3RhdHVzID0gXCJlbmFibGVkXCI7XG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxuK3tcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXHUwMDNlcHJpdmF0ZTtcbiBcbi1cdGlmICghVkVSQk9TRV9TVEFUVVMpIHtcbi1cdFx0c3ByaW50ZihwYWdlLCBcIiVzXFxuXCIsIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbitcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdHNlcV9wdXRzKG0sIFwiZW5hYmxlZFxcblwiKTtcbitcdGVsc2VcbitcdFx0c2VxX3B1dHMobSwgXCJkaXNhYmxlZFxcblwiKTtcbiBcbi1cdGRwICs9IHNwcmludGYoZHAsIFwiJXNcXG5pbnRlcnByZXRlciAlc1xcblwiLCBzdGF0dXMsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuK1x0c2VxX3ByaW50ZihtLCBcImludGVycHJldGVyICVzXFxuXCIsIGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFxuIFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cbi1cdGRwICs9IHNwcmludGYoZHAsIFwiZmxhZ3M6IFwiKTtcbitcdHNlcV9wdXRzKG0sIFwiZmxhZ3M6IFwiKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMClcbi1cdFx0KmRwKysgPSAnUCc7XG4rXHRcdHNlcV9wdXRjKG0sICdQJyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCsrID0gJ08nO1xuK1x0XHRzZXFfcHV0YyhtLCAnTycpO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxuLVx0XHQqZHArKyA9ICdDJztcbitcdFx0c2VxX3B1dGMobSwgJ0MnKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpXG4tXHRcdCpkcCsrID0gJ0YnO1xuLVx0KmRwKysgPSAnXFxuJztcbitcdFx0c2VxX3B1dGMobSwgJ0YnKTtcbitcdHNlcV9wdXRjKG0sICdcXG4nKTtcbiBcbi1cdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdHNwcmludGYoZHAsIFwiZXh0ZW5zaW9uIC4lc1xcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbitcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuK1x0XHRzZXFfcHJpbnRmKG0sIFwiZXh0ZW5zaW9uIC4lc1xcblwiLCBlLVx1MDAzZW1hZ2ljKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGRwICs9IHNwcmludGYoZHAsIFwib2Zmc2V0ICVpXFxubWFnaWMgXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbi1cdFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuK1x0XHRzZXFfcHJpbnRmKG0sIFwib2Zmc2V0ICVpXFxubWFnaWMgXCIsIGUtXHUwMDNlb2Zmc2V0KTtcbitcdFx0Ym1fc2VxX2hleChtLCBlLVx1MDAzZW1hZ2ljLCBlLVx1MDAzZXNpemUpO1xuIFx0XHRpZiAoZS1cdTAwM2VtYXNrKSB7XG4tXHRcdFx0ZHAgKz0gc3ByaW50ZihkcCwgXCJcXG5tYXNrIFwiKTtcbi1cdFx0XHRkcCA9IGJpbjJoZXgoZHAsIGUtXHUwMDNlbWFzaywgZS1cdTAwM2VzaXplKTtcbitcdFx0XHRzZXFfcHV0cyhtLCBcIlxcbm1hc2sgXCIpO1xuK1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCsrID0gJ1xcbic7XG4tXHRcdCpkcCA9ICdcXDAnO1xuK1x0XHRzZXFfcHV0YyhtLCAnXFxuJyk7XG4gXHR9XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKVxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XG4gXG5AQCAtNjUyLDE0ICs2MzksMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuKyAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxuKyAqIHJlbW92aW5nIHRoZSBlbnRyeSB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSBvciB1bmxpbmsoMikgdGhlIGVudHJ5XG4rICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXG4gKi9cbiBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4gXG4gXHRjbGVhcl9pbm9kZShpbm9kZSk7XG4gXG5AQCAtNjY3LDg5ICs2NTQsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRpZiAoIWhsaXN0X3VuaGFzaGVkKFx1MDAyNmUtXHUwMDNlbm9kZSkpXG4rXHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiBcdFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xuIFx0fVxuIH1cbiBcbisvKipcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4rICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuKyAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHVuaGFzaFxuKyAqXG4rICogQWRkaW5nIGFuZCByZW1vdmluZyBlbnRyaWVzIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGFuZFxuKyAqIHVubGluaygyKSBoYXBwZW5zIHVuZGVyIHRoZSBleGNsdXNpdmVseSBoZWxkIGlub2RlIGxvY2sgb2YgdGhlIHJvb3RcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuKyAqIGNvbmN1cnJlbnRseSB1bmRlciBSQ1UuIFRoZSBlbnRyaWVzX2xvY2sgaXMgb25seSBoZWxkIGFyb3VuZCB0aGUgYWN0dWFsXG4rICogdW5saW5rIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IGJtX2V2aWN0X2lub2RlKCkgd2hpY2ggdW5saW5rcyBlbnRyaWVzXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbisgKi9cbitzdGF0aWMgdm9pZCB1bmxpbmtfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4re1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK31cbitcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXInc1xuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXG4tICogd29ya2VkIGZvciBzbyBsb25nIHRoYXQgaXQncyBub3QgYSBwcmVzc2luZyBpc3N1ZS5cbisgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4rc3RhdGljIHZvaWQgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbi1cdHdyaXRlX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuKy8qIFJlbW92ZSBAZSB1bmxlc3MgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZC4gKi9cbitzdGF0aWMgdm9pZCBibV9yZW1vdmVfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiBcbi1zdGF0aWMgc3NpemVfdFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcbitcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbitcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbitcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xuK1x0aW5vZGVfdW5sb2NrKHJvb3QpO1xuK31cbitcbisvKiBSZW1vdmUgYWxsIGVudHJpZXMgb2YgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIEBtaXNjIGJlbG9uZ2luZyB0byBAc2IuICovXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHROb2RlICplID0gZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3ByaXZhdGU7XG4tXHRzc2l6ZV90IHJlcztcbi1cdGNoYXIgKnBhZ2U7XG4rXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDtcbitcbitcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbitcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgbmV4dCwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBub2RlKVxuK1x0XHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XG4rXHRpbm9kZV91bmxvY2socm9vdCk7XG4rfVxuIFxuLVx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghcGFnZSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4rLyoqXG4rICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4rICogQGRpcjogaW5vZGUgb2YgdGhlIHJvb3QgZGlyZWN0b3J5XG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcbisgKlxuKyAqIFJlbW92aW5nIHRoZSBlbnRyeSBmaWxlIHJlbW92ZXMgaXRzIGJpbmFyeSB0eXBlIGhhbmRsZXIsIGV4YWN0bHkgbGlrZVxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxuKyAqIHJlbW92ZWQuIFRoZSBWRlMgY2FsbHMgdGhpcyB3aXRoIHRoZSByb290IGlub2RlIGxvY2sgaGVsZCB3aGljaFxuKyAqIHNlcmlhbGl6ZXMgYWdhaW5zdCB0aGUgd3JpdGUgYmFzZWQgYWRkIGFuZCByZW1vdmUgcGF0aHMuXG4rICovXG4rc3RhdGljIGludCBibV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcbit7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuK1xuK1x0aWYgKCFlKVxuK1x0XHRyZXR1cm4gLUVQRVJNO1xuK1xuK1x0dW5saW5rX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoZGlyKSwgZSk7XG4rXHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4rfVxuIFxuLVx0ZW50cnlfc3RhdHVzKGUsIHBhZ2UpO1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcbitcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuK1x0LnVubGlua1x0XHQ9IGJtX3VubGluayxcbit9O1xuIFxuLVx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XG4rLyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4rXG4rc3RhdGljIGludCBibV9lbnRyeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuK3tcbitcdGludCByZXQ7XG4gXG4tXHRrZnJlZShwYWdlKTtcbi1cdHJldHVybiByZXM7XG4rXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cdTAwM2VpX3ByaXZhdGUpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4rXHRpZiAoZmlsZS1cdTAwM2VmX21vZGUgXHUwMDI2IEZNT0RFX1dSSVRFKVxuK1x0XHRmaWxlLVx1MDAzZWZfbW9kZSB8PSBGTU9ERV9QV1JJVEU7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbiBcbiBcdHN3aXRjaCAocmVzKSB7XG4tXHRjYXNlIDE6XG4tXHRcdC8qIERpc2FibGUgdGhpcyBoYW5kbGVyLiAqL1xuLVx0XHRjbGVhcl9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4rXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxuK1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbitcdGNhc2UgQk1fQ01EX0VOQUJMRTpcbitcdFx0c2V0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgdGhpcyBoYW5kbGVyLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX3Jvb3QpO1xuLVx0XHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Rcbi1cdFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxuLVx0XHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cbi1cdFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4rXHRjYXNlIEJNX0NNRF9SRU1PVkU6XG4rXHRcdGJtX3JlbW92ZV9lbnRyeShlLCBpbm9kZS1cdTAwM2VpX3NiKTtcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gcmVzO1xuQEAgLTc1OSwxNSArNzg5LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuK1x0Lm9wZW5cdFx0PSBibV9lbnRyeV9vcGVuLFxuK1x0LnJlYWRcdFx0PSBzZXFfcmVhZCxcbiBcdC53cml0ZVx0XHQ9IGJtX2VudHJ5X3dyaXRlLFxuLVx0Lmxsc2Vla1x0XHQ9IGRlZmF1bHRfbGxzZWVrLFxuK1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbitcdC5yZWxlYXNlXHQ9IHNpbmdsZV9yZWxlYXNlLFxuIH07XG4gXG4gLyogL3JlZ2lzdGVyICovXG4gXG4gLyogYWRkIHRvIGZpbGVzeXN0ZW0gKi9cbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3N0YXRpYyBpbnQgYWRkX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBzaW1wbGVfc3RhcnRfY3JlYXRpbmcoc2ItXHUwMDNlc19yb290LCBlLVx1MDAzZW5hbWUpO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbkBAIC03ODksOSArODIxLDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdGhsaXN0X2FkZF9oZWFkX3JjdShcdTAwMjZlLVx1MDAzZW5vZGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyArODMxLDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdE5vZGUgKmU7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiO1xuLVx0aW50IGVyciA9IDA7XG4gXHRzdHJ1Y3QgZmlsZSAqZiA9IE5VTEw7XG4rXHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICs4NTMsNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiBcdFx0aWYgKElTX0VSUihmKSkge1xuIFx0XHRcdHByX25vdGljZShcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxuXCIsXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgKzg2NCwxMSBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiBcdFx0XHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XG4gXHRcdFx0ZmlscF9jbG9zZShmLCBOVUxMKTtcbiBcdFx0fVxuLVx0XHRrZnJlZShlKTtcbiBcdFx0cmV0dXJuIGVycjtcbiBcdH1cbitcbitcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuK1x0cmV0YWluX2FuZF9udWxsX3B0cihlKTtcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG5AQCAtODUxLDEwICs4ODMsMTAgQEAgc3RhdGljIHNzaXplX3RcbiBibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKVxuIHtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbi1cdGNoYXIgKnM7XG4rXHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCJlbmFibGVkXFxuXCIgOiBcImRpc2FibGVkXFxuXCI7XG4rXHRzID0gUkVBRF9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCkgPyBcImVuYWJsZWRcXG5cIiA6IFwiZGlzYWJsZWRcXG5cIjtcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICs4OTUsMTcgQEAgc3RhdGljIHNzaXplX3QgYm1fc3RhdHVzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIHtcbiBcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xuLVx0Tm9kZSAqZSwgKm5leHQ7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gZmFsc2U7XG4rXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxuK1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbitcdGNhc2UgQk1fQ01EX0VOQUJMRTpcbitcdFx0V1JJVEVfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQsIHRydWUpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMzpcbi1cdFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYi1cdTAwM2VzX3Jvb3QpO1xuLVx0XHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9QQVJFTlQpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Rcbi1cdFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxuLVx0XHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cbi1cdFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuK1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuK1x0XHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiKTtcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gcmVzO1xuQEAgLTkxOCw3ICs5MzAsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4rc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJtX3N1cGVyX29wcyA9IHtcbiBcdC5zdGF0ZnNcdFx0PSBzaW1wbGVfc3RhdGZzLFxuIFx0LmV2aWN0X2lub2RlXHQ9IGJtX2V2aWN0X2lub2RlLFxuIFx0LnB1dF9zdXBlclx0PSBibV9wdXRfc3VwZXIsXG5AQCAtOTY1LDEwICs5NzcsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdFx0aWYgKCFtaXNjKVxuIFx0XHRcdHJldHVybiAtRU5PTUVNO1xuIFxuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuLVx0XHRyd2xvY2tfaW5pdChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXG4tXHRcdC8qIFBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGluIGxvYWRfYmluZm10X21pc2MoKS4gKi9cbitcdFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gY3VycmVudF9iaW5mbXRfbWlzYygpLiAqL1xuIFx0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZ1c2VyX25zLVx1MDAzZWJpbmZtdF9taXNjLCBtaXNjKTtcbiBcdH1cbiBcbkBAIC05ODMsMTIgKzk5NSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbitcdFdSSVRFX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkLCB0cnVlKTtcbiBcbiBcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdHNiLVx1MDAzZXNfb3AgPSBcdTAwMjZzX29wcztcbi1cdHJldHVybiBlcnI7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0c2ItXHUwMDNlc19vcCA9IFx1MDAyNmJtX3N1cGVyX29wcztcbitcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgYm1fZnJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuaW5kZXggMmM3N2UzODNlNzM3NTcuLjdlNzMzM2I3YmIwZjExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG5AQCAtMTAxLDggKzEwMSw4IEBAIHN0cnVjdCBsaW51eF9iaW5mbXQge1xuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcbiBzdHJ1Y3QgYmluZm10X21pc2Mge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xuLVx0cndsb2NrX3QgZW50cmllc19sb2NrO1xuK1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbitcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xuIFx0Ym9vbCBlbmFibGVkO1xuIH0gX19yYW5kb21pemVfbGF5b3V0O1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvdXNlci5jXG4rKysgYi9rZXJuZWwvdXNlci5jXG5AQCAtMjMsOSArMjMsOSBAQFxuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcbi1cdC5lbnRyaWVzID0gTElTVF9IRUFEX0lOSVQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzKSxcbitcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4rXHQuZW50cmllc19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLFxuIH07XG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XG4gI2VuZGlmXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MDo1Ny44MjEzNzY0NzVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NDgwNDUxNTExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaDogYmluZm10X21pc2MgUmVmYWN0b3IqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIHByZXR0eSBpbnRlcmVzdGluZywgYW5kIGRlZmluaXRlbHkgd2FycmFudHMgYSBjbG9zZXIgbG9vay4gVGhleSdyZSBjaGFuZ2luZyB0aGUgYGJpbmZtdF9taXNjYCBzdWJzeXN0ZW0gaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGBmcy9iaW5mbXRfbWlzYy5jYC4gIEl0J3MgYSBzaWduaWZpY2FudCByZWZhY3Rvciwgc3dpdGNoaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIGZvciBoYW5kbGluZyBiaW5hcnkgZm9ybWF0IGVudHJpZXMgZnJvbSBhIGRvdWJseS1saW5rZWQgbGlzdCAoYHN0cnVjdCBsaXN0X2hlYWRgKSB0byBhbiBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdCAoYHN0cnVjdCBobGlzdF9ub2RlYCAvIGBobGlzdF9oZWFkYCkuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IHRvdWNoZXMgY29yZSBrZXJuZWwgbG9naWMgZm9yIGxvYWRpbmcgYW5kIGV4ZWN1dGluZyBiaW5hcmllcy4gSXQgc2VlbXMgbGlrZSBpdCBhbHNvIGNoYW5nZXMgZnJvbSB1c2luZyBgcndsb2NrX3RgIHRvIGBzcGlubG9ja190YC5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiVGhpcyBpcyByZWFjaGFibGUgYW5kICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nIVwiICBBbnkgdGltZSB5b3UgdG91Y2ggc29tZXRoaW5nIGZ1bmRhbWVudGFsIGxpa2UgdGhpcyDigJMgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBiaW5hcnkgZXhlY3V0aW9uIOKAkyB5b3Ugb3BlbiB1cCBwb3RlbnRpYWwgYXR0YWNrIHZlY3RvcnMuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBzcGVjaWZpY2FsbHksIGlzIGEgZ29vZCBpbmRpY2F0b3Igb2Ygd2hlcmUgcmFjZSBjb25kaXRpb25zIG1heSBhcmlzZS5cblxuTGV0J3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhleSd2ZSB0b3VjaGVkLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0byBmb2N1cyBteSBmdXp6aW5nIGVmZm9ydHMuICBUaGV5J3ZlIG1vZGlmaWVkIG9yIGFkZGVkIGEgYm9hdGxvYWQgb2YgZnVuY3Rpb25zOiBldmVyeXRoaW5nIGZyb20gYGVudHJ5X21hdGNoZXNfbWFnaWNgIGFuZCBgZW50cnlfbWF0Y2hlc19leHRlbnNpb25gIHRvIGBsb2FkX21pc2NfYmluYXJ5YCBhbmQgYWxsIHRoZSBmaWxlIG9wZXJhdGlvbiBob29rcyAoIGBibV9nZXRfaW5vZGVgLCBgYm1fZXZpY3RfaW5vZGVgLCBgYm1fZW50cnlfb3BlbmAsIGBibV9lbnRyeV93cml0ZWAsIGV0Yy4pLiAgVGhlcmUgaXMgYSBsb3Qgb2YgbmV3IGNvZGUgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSBgdW5saW5rKDIpYCwgd2hpY2ggbWVhbnMgdGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBgL3Byb2NgIGZpbGVzeXN0ZW0uXG5cbkdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIGVzcGVjaWFsbHkgdGhlIGRhdGEgc3RydWN0dXJlIG1vZGlmaWNhdGlvbnMgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgUkNVLCBteSBodW5jaCBpcyB0aGF0IHBhcnNpbmcgYW5kIGZpbGUgb3BlcmF0aW9ucywgYWxvbmcgd2l0aCB0aGUgZXhlY3V0aW9uIHBhdGgsIGFyZSB3aGVyZSB0aGUgbW9zdCBpbnRlcmVzdGluZyBidWdzIG1pZ2h0IGhpZGUuIEkgc2hvdWxkIGNvbmNlbnRyYXRlIG15IGVmZm9ydHMgb24gdGhlc2Ugc3ltYm9sczogYGxvYWRfbWlzY19iaW5hcnlgLCBgY3JlYXRlX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBhbmQgYGJtX2VudHJ5X3Nob3dgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBib3RoIGFkZGluZyBuZXcgaGFuZGxlcnMsIHJlbW92aW5nIGhhbmRsZXJzLCBhbmQgYWN0dWFsbHkgdXNpbmcgdGhlIGhhbmRsZXJzLlxuXG5PbmUgbW9yZSB0aGluZyB0byB2ZXJpZnk6IEkgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBjb25maXJtIHRoZSBuZWNlc3Nhcnkga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBjb2RlLiBJIHNob3VsZCBncmVwIGZvciBgQklORk1UX01JU0NgIHdpdGhpbiBgZnMvS2NvbmZpZy5iaW5mbXRgLCBvciBzaW1pbGFyIGZpbGVzLCB0byBtYWtlIHN1cmUgdGhpcyBtb2R1bGUgaXMgZXZlbiBlbmFibGVkLiBUaGlzIHdpbGwgaGVscCBkZXRlcm1pbmUgd2hlcmUgdGhlIGNvZGUgaXMgY29tcGlsZWQgd2l0aGluIHRoZSBrZXJuZWwgYW5kIHRodXMsIHdoZXJlIEkgd2lsbCBoYXZlIHRoZSBtb3N0IHN1Y2Nlc3MgdHJ5aW5nIHRvIGZpbmQgaXNzdWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY4MSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDA1OjUxOjA3LjMwMTgyOTUwNloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDE0OTAzNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJCSU5GTVRfTUlTQ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZy5iaW5mbXQ9MTM4PWNvbmZpZyBCSU5GTVRfWkZMQVRcXG4tLVxcbmZzL0tjb25maWcuYmluZm10LTE0NC1cXG5mcy9LY29uZmlnLmJpbmZtdDoxNDU6Y29uZmlnIEJJTkZNVF9NSVNDXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTQ2LVxcdHRyaXN0YXRlIFxcXCJLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllc1xcXCJcXG4tLVxcbmZzL01ha2VmaWxlPTM0PW9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgKz0gbG9ja3Mub1xcbmZzL01ha2VmaWxlOjM1Om9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcXHQrPSBiaW5mbXRfbWlzYy5vXFxuZnMvTWFrZWZpbGUtMzYtb2JqLSQoQ09ORklHX0JJTkZNVF9TQ1JJUFQpXFx0Kz0gYmluZm10X3NjcmlwdC5vXFxuLS1cXG5mcy9maWxlX3RhYmxlLmM9MTY1PXN0YXRpYyBpbnQgX19pbml0IGluaXRfZnNfc3RhdF9zeXNjdGxzKHZvaWQpXFxuLS1cXG5mcy9maWxlX3RhYmxlLmMtMTY3LVxcdHJlZ2lzdGVyX3N5c2N0bF9pbml0KFxcXCJmc1xcXCIsIGZzX3N0YXRfc3lzY3Rscyk7XFxuZnMvZmlsZV90YWJsZS5jOjE2ODpcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpKSB7XFxuZnMvZmlsZV90YWJsZS5jLTE2OS1cXHRcXHRzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGRyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwNTo1MTowNy4zODU5ODQzNjFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDQyMjQ1ODM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgYmluZm10X21pc2MgRmlsZXN5c3RlbSBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBiaW5mbXRfbWlzY2AgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhbGx5IGBCSU5GTVRfTUlTQ2AuIEkndmUgY29uZmlybWVkIHRoYXQgdGhpcyBpcyB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uLCBubyBvdGhlciByZWxldmFudCBjb25maWdzIGFyZSBwcmVzZW50LiBOb3csIEkgbmVlZCB0byBwaW5wb2ludCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgc3ltYm9scyBpbnZvbHZlZC4gSSd2ZSBjb21waWxlZCBhIGxpc3Q6XG5cbiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgXG4qICAgYGJtX2VudHJ5X3dyaXRlYFxuKiAgIGBibV9zdGF0dXNfd3JpdGVgXG4qICAgYGJtX3VubGlua2BcbiogICBgbG9hZF9taXNjX2JpbmFyeWBcbiogICBgY3JlYXRlX2VudHJ5YFxuKiAgIGBwYXJzZV9tYWdpY19maWVsZHNgXG4qICAgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgXG5cbkkgY2hlY2tlZCwgYW5kIHRoZXkncmUgYWxsIHN0YXRpYyBleGNlcHQgZm9yIGBsb2FkX21pc2NfYmluYXJ5YC4gQWgsIGJ1dCAqdGhhdCdzKiByZWdpc3RlcmVkIGluIHRoZSBgbGludXhfYmluZm10YCBzdHJ1Y3QsIHNwZWNpZmljYWxseSBsaWtlIHRoaXM6XG5cbmBgYGNcbnN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0ge1xuXHQubW9kdWxlID0gVEhJU19NT0RVTEUsXG5cdC5sb2FkX2JpbmFyeSA9IGxvYWRfbWlzY19iaW5hcnksXG59O1xuYGBgXG5cblNvIGBsb2FkX21pc2NfYmluYXJ5YCAqaXMqIGV4cG9zZWQ7IGl0J3MgY2FsbGVkIHZpYSBgc2VhcmNoX2JpbmFyeV9oYW5kbGVyYCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gU28gdGhhdCdzIHRoZSBlbnRyeSBwb2ludC5cblxuT2theSwgbGV0J3MgY2lyY2xlIGJhY2sgYW5kIGNvbmZpcm0uIE5vLCBgQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBjb25maWcuXG5cbk5vdywgZm9yIHRoZSByZWFzb25pbmc6IFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3JpbmcgYGJpbmZtdF9taXNjYCB0byB1c2UgUkNVLXByb3RlY3RlZCBoYXNoIGxpc3RzIGluc3RlYWQgb2YgZG91Ymx5IGxpbmtlZCBsaXN0cywgaXQgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBpdCBhZGRzIGB1bmxpbmsoMilgIHN1cHBvcnQsIGFuZCBpdCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgYHNlcV9maWxlYCkuIFRoaXMgbWVhbnMgdGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgZXhlY3ZlYCBhbmQgb3BlcmF0aW9ucyBvbiBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL2AuXG5cblRoZXJlZm9yZSwgdGhlIGZvY3VzIHN5bWJvbHMgYXJlOlxuXG4qICAgYGJtX3JlZ2lzdGVyX3dyaXRlYFxuKiAgIGBibV9lbnRyeV93cml0ZWBcbiogICBgYm1fc3RhdHVzX3dyaXRlYFxuKiAgIGBibV91bmxpbmtgXG4qICAgYGxvYWRfbWlzY19iaW5hcnlgXG4qICAgYGNyZWF0ZV9lbnRyeWBcbiogICBgcGFyc2VfbWFnaWNfZmllbGRzYFxuKiAgIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYFxuXG5GaW5hbGx5LCBsZXQncyBhc3Nlc3MgdGhlIGZ1enppbmcgY3JpdGVyaWEuIFRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGFzIGl0IGFmZmVjdHMgYmluYXJ5IGZvcm1hdCBoYW5kbGluZy4gQW5kIHNpbmNlIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gY2FuIGJlIG1hbmlwdWxhdGVkIGZyb20gdXNlcnNwYWNlICh0aHJvdWdoIGBleGVjdmVgIGFuZCBgL3Byb2NgKSwgaXQgKmNhbiogYmUgZXhlY3V0ZWQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZz10cnVlYC5cblxuTm93IGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgyMjMsIk91dHB1dFRva2VucyI6MjA2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTU1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDA1OjUxOjE2LjQyODIzMTY1N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0ODM1MTIxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCSU5GTVRfTUlTQ1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJtX3JlZ2lzdGVyX3dyaXRlXCIsXG4gICAgXCJibV9lbnRyeV93cml0ZVwiLFxuICAgIFwiYm1fc3RhdHVzX3dyaXRlXCIsXG4gICAgXCJibV91bmxpbmtcIixcbiAgICBcImxvYWRfbWlzY19iaW5hcnlcIixcbiAgICBcImNyZWF0ZV9lbnRyeVwiLFxuICAgIFwicGFyc2VfbWFnaWNfZmllbGRzXCIsXG4gICAgXCJwYXJzZV9leHRlbnNpb25fZmllbGRzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtIHRvIHVzZSBSQ1UtcHJvdGVjdGVkIGhhc2ggbGlzdHMgaW5zdGVhZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdCwgY2hhbmdlcyBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBhZGRzIHN1cHBvcnQgZm9yIHVubGlua2luZyBlbnRyaWVzIHZpYSB1bmxpbmsoMiksIGFuZCByZWZhY3RvcnMgZW50cnkgcGFyc2luZyBhbmQgcmVhZGluZyAodXNpbmcgc2VxX2ZpbGUpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIChiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIGFuZCBhIHZpcnR1YWwgZmlsZXN5c3RlbSkgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlICh2aWEgZXhlY3ZlIGFuZCBvcGVyYXRpb25zIG9uIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy8pIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiY3JlYXRlX2VudHJ5XCIsXG4gICAgXCJwYXJzZV9tYWdpY19maWVsZHNcIixcbiAgICBcInBhcnNlX2V4dGVuc2lvbl9maWVsZHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0gdG8gdXNlIFJDVS1wcm90ZWN0ZWQgaGFzaCBsaXN0cyBpbnN0ZWFkIG9mIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBjaGFuZ2VzIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGFkZHMgc3VwcG9ydCBmb3IgdW5saW5raW5nIGVudHJpZXMgdmlhIHVubGluaygyKSwgYW5kIHJlZmFjdG9ycyBlbnRyeSBwYXJzaW5nIGFuZCByZWFkaW5nICh1c2luZyBzZXFfZmlsZSkuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgKGJpbmFyeSBmb3JtYXQgaGFuZGxpbmcgYW5kIGEgdmlydHVhbCBmaWxlc3lzdGVtKSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgKHZpYSBleGVjdmUgYW5kIG9wZXJhdGlvbnMgb24gL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjLykgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[1] Phase: Succeeded StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 05:51:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 05:51:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2] Phase: Succeeded StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 05:51:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-11 05:51:28 +0000 UTC FinishedAt: 2026-07-11 05:51:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4027144234/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-11 05:51:38 +0000 UTC FinishedAt: 2026-07-11 06:28:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-11 05:51:38 +0000 UTC FinishedAt: 2026-07-11 06:28:42 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*942d5266-3087-491d-83f6-dacb0fed17aa,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4027144234/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "3a22cc46-e65f-4c22-876e-d4167f7926e6", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1414451608/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-11 05:51:38 +0000 UTC FinishedAt: 2026-07-11 06:28:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*942d5266-3087-491d-83f6-dacb0fed17aa,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4027144234/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "3a22cc46-e65f-4c22-876e-d4167f7926e6", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1414451608/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-11 06:28:42 +0000 UTC FinishedAt: 2026-07-11 06:28:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-11 06:28:42 +0000 UTC FinishedAt: 2026-07-11 06:28:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-11 06:28:42 +0000 UTC FinishedAt: 2026-07-11 06:28:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-11 06:28:42 +0000 UTC FinishedAt: 2026-07-11 06:28:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4196937285/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-11 06:28:52 +0000 UTC FinishedAt: 2026-07-11 06:30:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-11 06:28:52 +0000 UTC FinishedAt: 2026-07-11 06:30:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*3a22cc46-e65f-4c22-876e-d4167f7926e6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1414451608/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-11 06:30:51 +0000 UTC FinishedAt: 2026-07-11 06:30:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-11 06:30:51 +0000 UTC FinishedAt: 2026-07-11 06:30:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-11 06:30:51 +0000 UTC FinishedAt: 2026-07-11 07:15:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-11 06:30:51 +0000 UTC FinishedAt: 2026-07-11 07:15:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*942d5266-3087-491d-83f6-dacb0fed17aa,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4196937285/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "9616f31d-a22d-4d8d-8ce5-0d3bc0de55f8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1744016017/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-11 06:30:51 +0000 UTC FinishedAt: 2026-07-11 07:14:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*942d5266-3087-491d-83f6-dacb0fed17aa,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-4196937285/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "9616f31d-a22d-4d8d-8ce5-0d3bc0de55f8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1744016017/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-11 07:15:00 +0000 UTC FinishedAt: 2026-07-11 07:15:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-11 07:15:00 +0000 UTC FinishedAt: 2026-07-11 07:15:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-11 07:15:00 +0000 UTC FinishedAt: 2026-07-11 07:17:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-11 07:15:00 +0000 UTC FinishedAt: 2026-07-11 07:17:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9616f31d-a22d-4d8d-8ce5-0d3bc0de55f8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1744016017/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*3a22cc46-e65f-4c22-876e-d4167f7926e6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9616f31d-a22d-4d8d-8ce5-0d3bc0de55f8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1414451608/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1744016017/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 07:17:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 07:17:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-2664817866/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 07:17:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 07:17:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-11 07:17:14 +0000 UTC FinishedAt: 2026-07-11 07:17:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-11 07:17:24 +0000 UTC FinishedAt: 2026-07-11 10:19:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgzj9g[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["bm_register_write","bm_entry_write","bm_status_write","bm_unlink","load_misc_binary","create_entry","parse_magic_fields","parse_extension_fields"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"1f9f5986-a7e3-49fa-8960-7724653c73fd","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-11 07:17:24 +0000 UTC FinishedAt: 2026-07-11 10:19:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*3a22cc46-e65f-4c22-876e-d4167f7926e6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9616f31d-a22d-4d8d-8ce5-0d3bc0de55f8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1414451608/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-build-action-1744016017/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgzj9g/series-workflowgzj9g-convert-artifact-2664817866/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}