Name: series-workflow8cmx2 Phase: Running StartedAt: 2026-07-22 10:52:51 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cmx2[0] Phase: Running StartedAt: 2026-07-22 10:52:51 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cmx2[0].run-triage Phase: Running StartedAt: 2026-07-22 10:52:51 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cmx2[0].run-triage(0) Phase: Running StartedAt: 2026-07-22 10:52:51 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +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": [ "CPA_DEBUG" ], "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": [ "CPA_DEBUG" ], "series_id": "08799ddb-4fca-4e5c-a2a7-a16eb2845851" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "change_page_attr_set_clr", "__change_page_attr_set_clr", "__change_page_attr", "cpa_handle_large_page", "should_split_large_page", "arch_should_split_large_page", "arch_split_large_page", "arch_change_pte", "arch_cpa_process_fault", "arch_cpa_process_alias", "arch_cpa_flush", "lookup_address_in_pgd_attr" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIyIDExOjExPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NQQV9ERUJVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NsciYjMzQ7LAogICAgJiMzNDtfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NsciYjMzQ7LAogICAgJiMzNDtfX2NoYW5nZV9wYWdlX2F0dHImIzM0OywKICAgICYjMzQ7Y3BhX2hhbmRsZV9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O2FyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9zcGxpdF9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O2FyY2hfY2hhbmdlX3B0ZSYjMzQ7LAogICAgJiMzNDthcmNoX2NwYV9wcm9jZXNzX2ZhdWx0JiMzNDssCiAgICAmIzM0O2FyY2hfY3BhX3Byb2Nlc3NfYWxpYXMmIzM0OywKICAgICYjMzQ7YXJjaF9jcGFfZmx1c2gmIzM0OywKICAgICYjMzQ7bG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjaGFuZ2VfcGFnZV9hdHRyIChDUEEpIGxvZ2ljLCBtb3ZpbmcgaXQgZnJvbSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSAoeDg2LCByaXNjdikgdG8gYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGluIG1tL3NldF9tZW1vcnkuYy4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgbmV3IGdlbmVyaWMgZnVuY3Rpb25zIGFuZCB0aGVpciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY2FsbGJhY2tzLiBFbmFibGluZyBDUEFfREVCVUcgd2lsbCBhbHNvIHJ1biB0aGUgQ1BBIHNlbGYtdGVzdHMgdG8gaGVscCB1bmNvdmVyIGlzc3Vlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMiAxMToxMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGQ1NDRiMmJmZjRjMzRmZjRlNDZjYzA4MTUxOGEyNjZhYjMxNjUxNWNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEp1bCAyMiAxMToxMTozOSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9LY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ1xuaW5kZXggZDhkMjUyMzI1MDE3OTEuLjFiZmE5NDc5N2IxYjRiIDEwMDY0NFxuLS0tIGEvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ1xuQEAgLTEwOSw2ICYjNDM7MTA5LDcgQEAgY29uZmlnIExPT05HQVJDSFxuIFx0c2VsZWN0IEdFTkVSSUNfTElCX0RFVk1FTV9JU19BTExPV0VEXG4gXHRzZWxlY3QgR0VORVJJQ19QQ0lfSU9NQVBcbiBcdHNlbGVjdCBHRU5FUklDX1NDSEVEX0NMT0NLXG4mIzQzO1x0c2VsZWN0IEdFTkVSSUNfU0VUX01FTU9SWVxuIFx0c2VsZWN0IEdFTkVSSUNfU01QX0lETEVfVEhSRUFEXG4gXHRzZWxlY3QgR1BJT0xJQlxuIFx0c2VsZWN0IEhBU19JT1BPUlRcbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbmluZGV4IDIyMzUyOGMwNGQ3MzkyLi4zNzdiZWYwODk0ZDc3MSAxMDA2NDRcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG5AQCAtNjM4LDYgJiM0Mzs2MzgsNDggQEAgc3RhdGljIGlubGluZSBsb25nIHBtZF9wcm90bm9uZShwbWRfdCBwbWQpXG4gI2RlZmluZSBwbWRfbGVhZihwbWQpXHRcdCgocG1kX3ZhbChwbWQpIFx1MDAyNiBfUEFHRV9IVUdFKSAhPSAwKVxuICNkZWZpbmUgcHVkX2xlYWYocHVkKVx0XHQoKHB1ZF92YWwocHVkKSBcdTAwMjYgX1BBR0VfSFVHRSkgIT0gMClcbiBcbiYjNDM7I2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gISEocGdkX3ZhbChwZ2QpIFx1MDAyNiBfUEFHRV9XUklURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcDRkX3dyaXRlIHA0ZF93cml0ZVxuJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfd3JpdGUocDRkX3QgcDRkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICEhKHA0ZF92YWwocDRkKSBcdTAwMjYgX1BBR0VfV1JJVEUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIHB1ZF93cml0ZSBwdWRfd3JpdGVcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcHVkX3dyaXRlKHB1ZF90IHB1ZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhIShwdWRfdmFsKHB1ZCkgXHUwMDI2IF9QQUdFX1dSSVRFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gIShwZ2RfdmFsKHBnZCkgXHUwMDI2IF9QQUdFX05PX0VYRUMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIHA0ZF9leGVjIHA0ZF9leGVjXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF9leGVjKHA0ZF90IHA0ZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKHA0ZF92YWwocDRkKSBcdTAwMjYgX1BBR0VfTk9fRVhFQyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcHVkX2V4ZWMgcHVkX2V4ZWNcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcHVkX2V4ZWMocHVkX3QgcHVkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICEocHVkX3ZhbChwdWQpIFx1MDAyNiBfUEFHRV9OT19FWEVDKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gIShwbWRfdmFsKHBtZCkgXHUwMDI2IF9QQUdFX05PX0VYRUMpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogV2UgcHJvdmlkZSBvdXIgb3duIGdldF91bm1hcHBlZCBhcmVhIHRvIGNvcGUgd2l0aCB0aGUgdmlydHVhbCBhbGlhc2luZ1xuICAqIGNvbnN0cmFpbnRzIHBsYWNlZCBvbiB1cyBieSB0aGUgY2FjaGUgYXJjaGl0ZWN0dXJlLlxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaCBiL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuaW5kZXggNTVkZmFlZmQwMmM4YTYuLjZmZmI0ZmU1YTc1YjBlIDEwMDY0NFxuLS0tIGEvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbkBAIC0xOSw0ICYjNDM7MTksMTMgQEAgaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSk7XG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSk7XG4gaW50IHNldF9kaXJlY3RfbWFwX3ZhbGlkX25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG5yLCBib29sIHZhbGlkKTtcbiBcbiYjNDM7LypcbiYjNDM7ICogVGhlIGRpcmVjdCBtYXAgaXMgYSBmaXhlZCBhZGRyZXNzIHdpbmRvdyB0aGF0IGlzIG5vdCBiYWNrZWQgYnkgcGFnZSB0YWJsZXMsXG4mIzQzOyAqIHNvIGEgcGFnZSBuZXZlciBoYXMgYSBzZWNvbmQgbWFwcGluZyB3aG9zZSBwcm90ZWN0aW9uIG11c3QgYmUgc3luY2hyb25pc2VkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGNwYV9zaG91bGRfdXBkYXRlX2FsaWFzKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuICNlbmRpZiAvKiBfQVNNX0xPT05HQVJDSF9TRVRfTUVNT1JZX0ggKi9cbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9tbS9wYWdlYXR0ci5jIGIvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuY1xuaW5kZXggNjE0Y2NjN2FmY2NiZWEuLmRiYmQ0MDhiZDNkNWU2IDEwMDY0NFxuLS0tIGEvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuY1xuQEAgLTQsMTI2ICYjNDM7NCw4MyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWJsb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdld2Fsay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wZ3RhYmxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2V0X21lbW9yeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NldF9tZW1vcnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS90bGJmbHVzaC5oXHUwMDNlXG4gXG4tc3RydWN0IHBhZ2VhdHRyX21hc2tzIHtcbi1cdHBncHJvdF90IHNldF9tYXNrO1xuLVx0cGdwcm90X3QgY2xlYXJfbWFzaztcbi19O1xuLVxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9wYWdlYXR0cl9tYXNrcyh1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9wYWdlYXR0cl9tYXNrcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWwpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBuZXdfdmFsID0gdmFsO1xuLVx0c3RydWN0IHBhZ2VhdHRyX21hc2tzICptYXNrcyA9IHdhbGstXHUwMDNlcHJpdmF0ZTtcbi1cbi1cdG5ld192YWwgXHUwMDI2PSB+KHBncHJvdF92YWwobWFza3MtXHUwMDNlY2xlYXJfbWFzaykpO1xuLVx0bmV3X3ZhbCB8PSAocGdwcm90X3ZhbChtYXNrcy1cdTAwM2VzZXRfbWFzaykpO1xuJiM0MztcdHZhbCBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4mIzQzO1x0dmFsIHw9IHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfc2V0KTtcbiBcbi1cdHJldHVybiBuZXdfdmFsO1xuJiM0MztcdHJldHVybiB2YWw7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcGdkX2VudHJ5KHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuJiM0MztpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcbiB7XG4tXHRwZ2RfdCB2YWwgPSBwZ2RwX2dldChwZ2QpO1xuLVxuLVx0aWYgKHBnZF9sZWFmKHZhbCkpIHtcbi1cdFx0dmFsID0gX19wZ2Qoc2V0X3BhZ2VhdHRyX21hc2tzKHBnZF92YWwodmFsKSwgd2FsaykpO1xuLVx0XHRzZXRfcGdkKHBnZCwgdmFsKTtcbi1cdH1cbi1cbi1cdHJldHVybiAwO1xuLX1cbiYjNDM7XHRwdGVfdCBvbGQgPSBwdGVwX2dldChzZC1cdTAwM2VrcHRlKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5ld192YWwgPSBzZXRfcGFnZWF0dHJfbWFza3MoY3BhLCB2YWwpO1xuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcDRkX2VudHJ5KHA0ZF90ICpwNGQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuLXtcbi1cdHA0ZF90IHZhbCA9IHA0ZHBfZ2V0KHA0ZCk7XG4mIzQzO1x0Y3BhLVx1MDAzZXBmbiA9IHB0ZV9wZm4ob2xkKSAmIzQzOyAoKHNkLVx1MDAzZWFkZHJlc3MgXHUwMDI2IChzZC1cdTAwM2Vwc2l6ZSAtIDEpKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4tXHRpZiAocDRkX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3A0ZChzZXRfcGFnZWF0dHJfbWFza3MocDRkX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wNGQocDRkLCB2YWwpO1xuJiM0MztcdGlmIChuZXdfdmFsICE9IHZhbCkge1xuJiM0MztcdFx0c2V0X3B0ZShzZC1cdTAwM2VrcHRlLCBfX3B0ZShuZXdfdmFsKSk7XG4mIzQzO1x0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHVkX2VudHJ5KHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuJiM0MztpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbi1cdHB1ZF90IHZhbCA9IHB1ZHBfZ2V0KHB1ZCk7XG4tXG4tXHRpZiAocHVkX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3B1ZChzZXRfcGFnZWF0dHJfbWFza3MocHVkX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wdWQocHVkLCB2YWwpO1xuLVx0fVxuJiM0MztcdFdBUk5fT05fT05DRSgxKTtcbiBcbi1cdHJldHVybiAwO1xuJiM0MztcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiYjNDM7dm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiYjNDM7XHRcdCAgICAgcHRlX3QgKmtwdGUsIHB0ZV90IG9sZF9wdGUsIGJvb2wgbngsIGJvb2wgcncpXG4ge1xuLVx0cG1kX3QgdmFsID0gcG1kcF9nZXQocG1kKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkX3B0ZSk7XG4mIzQzO1x0cHRlX3QgbmV3X3B0ZSA9IF9fcHRlKHNldF9wYWdlYXR0cl9tYXNrcyhjcGEsIHZhbCkpO1xuIFxuLVx0aWYgKHBtZF9sZWFmKHZhbCkpIHtcbi1cdFx0dmFsID0gX19wbWQoc2V0X3BhZ2VhdHRyX21hc2tzKHBtZF92YWwodmFsKSwgd2FsaykpO1xuLVx0XHRzZXRfcG1kKHBtZCwgdmFsKTtcbi1cdH1cbiYjNDM7XHRjcGEtXHUwMDNlcGZuID0gcHRlX3BmbihvbGRfcHRlKTtcbiBcbi1cdHJldHVybiAwO1xuJiM0MztcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcbiYjNDM7XHRcdHNldF9wdGUoa3B0ZSwgbmV3X3B0ZSk7XG4mIzQzO1x0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuJiM0MztcdH1cbiB9XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdGVfZW50cnkocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4mIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxuJiM0MztcdFx0XHQgICBpbnQgcHJpbWFyeSlcbiB7XG4tXHRwdGVfdCB2YWwgPSBwdGVwX2dldChwdGUpO1xuLVxuLVx0dmFsID0gX19wdGUoc2V0X3BhZ2VhdHRyX21hc2tzKHB0ZV92YWwodmFsKSwgd2FsaykpO1xuLVx0c2V0X3B0ZShwdGUsIHZhbCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgZGlyZWN0IG1hcCBoYXMgbm8gcGFnZSB0YWJsZXMgYW5kIHZtYWxsb2MgcmFuZ2VzIG1heSBjb250YWluXG4mIzQzO1x0ICogaG9sZXMuIEJvdGggYXJlIHNpbGVudGx5IHNraXBwZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbiBcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B0ZV9ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBuZXh0LFxuLVx0XHRcdCAgICAgaW50IGRlcHRoLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiYjNDM7aW50IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXG4ge1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1fd2Fsa19vcHMgcGFnZWF0dHJfb3BzID0ge1xuLVx0LnBnZF9lbnRyeSA9IHBhZ2VhdHRyX3BnZF9lbnRyeSxcbi1cdC5wNGRfZW50cnkgPSBwYWdlYXR0cl9wNGRfZW50cnksXG4tXHQucHVkX2VudHJ5ID0gcGFnZWF0dHJfcHVkX2VudHJ5LFxuLVx0LnBtZF9lbnRyeSA9IHBhZ2VhdHRyX3BtZF9lbnRyeSxcbi1cdC5wdGVfZW50cnkgPSBwYWdlYXR0cl9wdGVfZW50cnksXG4tXHQucHRlX2hvbGUgPSBwYWdlYXR0cl9wdGVfaG9sZSxcbi1cdC53YWxrX2xvY2sgPSBQR1dBTEtfUkRMT0NLLFxuLX07XG4tXG4tc3RhdGljIGludCBfX3NldF9tZW1vcnkodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsIHBncHJvdF90IHNldF9tYXNrLCBwZ3Byb3RfdCBjbGVhcl9tYXNrKVxuJiM0Mzt2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKVxuIHtcbi1cdGludCByZXQ7XG4tXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcjtcbi1cdHVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgJiM0MzsgUEFHRV9TSVpFICogbnVtcGFnZXM7XG4tXHRzdHJ1Y3QgcGFnZWF0dHJfbWFza3MgbWFza3MgPSB7XG4tXHRcdC5zZXRfbWFzayA9IHNldF9tYXNrLFxuLVx0XHQuY2xlYXJfbWFzayA9IGNsZWFyX21hc2tcbi1cdH07XG4tXG4tXHRpZiAoIW51bXBhZ2VzKVxuLVx0XHRyZXR1cm4gMDtcbi1cbi1cdG1tYXBfd3JpdGVfbG9jayhcdTAwMjZpbml0X21tKTtcbi1cdHJldCA9IHdhbGtfa2VybmVsX3BhZ2VfdGFibGVfcmFuZ2Uoc3RhcnQsIGVuZCwgXHUwMDI2cGFnZWF0dHJfb3BzLCBOVUxMLCBcdTAwMjZtYXNrcyk7XG4tXHRtbWFwX3dyaXRlX3VubG9jayhcdTAwMjZpbml0X21tKTtcbi1cbi1cdGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7XG4mIzQzO1x0aWYgKGVyciB8fCBjcGEtXHUwMDNlZm9yY2VfZmx1c2hfYWxsIHx8XG4mIzQzO1x0ICAgIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKSkge1xuJiM0MztcdFx0Zmx1c2hfdGxiX2FsbCgpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiBcbi1cdHJldHVybiByZXQ7XG4mIzQzO1x0Zmx1c2hfdGxiX2tlcm5lbF9yYW5nZSgqY3BhLVx1MDAzZXZhZGRyLCAqY3BhLVx1MDAzZXZhZGRyICYjNDM7IGNwYS1cdTAwM2VudW1wYWdlcyAqIFBBR0VfU0laRSk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG5AQCAtMTMxLDcgJiM0Mzs4OCw3IEBAIGludCBzZXRfbWVtb3J5X3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpKTtcbiYjNDM7XHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIDApO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV9ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbkBAIC0xMzksNyAmIzQzOzk2LDcgQEAgaW50IHNldF9tZW1vcnlfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIF9fcGdwcm90KDApKTtcbiYjNDM7XHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpLCAwKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG5AQCAtMTQ3LDcgJiM0MzsxMDQsNyBAQCBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbiBcdGlmIChhZGRyIFx1MDAzYyB2bV9tYXBfYmFzZSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSkpO1xuJiM0MztcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSwgMCk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuQEAgLTE1NSw4NCAmIzQzOzExMiw3NSBAQCBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbiBcdGlmIChhZGRyIFx1MDAzYyB2bV9tYXBfYmFzZSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSwgX19wZ3Byb3QoMCkpO1xuJiM0MztcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldChcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIDApO1xuIH1cbiBcbiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuLVx0cGdkX3QgKnBnZDtcbi1cdHA0ZF90ICpwNGQ7XG4tXHRwdWRfdCAqcHVkO1xuLVx0cG1kX3QgKnBtZDtcbi1cdHB0ZV90ICpwdGU7XG4mIzQzO1x0dW5zaWduZWQgaW50IGxldmVsO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuJiM0MztcdHB0ZV90ICpwdGU7XG4gXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiBtZW1ibG9ja19pc19tZW1vcnkoX19wYShhZGRyKSk7XG4gXG4tXHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7XG4tXHRpZiAocGdkX25vbmUocGdkcF9nZXQocGdkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwZ2RfbGVhZihwZ2RwX2dldChwZ2QpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwNGQgPSBwNGRfb2Zmc2V0KHBnZCwgYWRkcik7XG4tXHRpZiAocDRkX25vbmUocDRkcF9nZXQocDRkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwNGRfbGVhZihwNGRwX2dldChwNGQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcik7XG4tXHRpZiAocHVkX25vbmUocHVkcF9nZXQocHVkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwdWRfbGVhZihwdWRwX2dldChwdWQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7XG4tXHRpZiAocG1kX25vbmUocG1kcF9nZXQocG1kKSkpXG4mIzQzO1x0cHRlID0gbG9va3VwX2FkZHJlc3MoYWRkciwgXHUwMDI2bGV2ZWwpO1xuJiM0MztcdGlmICghcHRlKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kKSkpXG4tXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0cHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyKTtcbiBcdHJldHVybiBwdGVfcHJlc2VudChwdGVwX2dldChwdGUpKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2YWRkcixcbiYjNDM7XHRcdFx0XHQucGdkID0gTlVMTCxcbiYjNDM7XHRcdFx0XHQubnVtcGFnZXMgPSAxLFxuJiM0MztcdFx0XHRcdC5tYXNrX3NldCA9IFBBR0VfS0VSTkVMLFxuJiM0MztcdFx0XHRcdC5tYXNrX2NsciA9IF9fcGdwcm90KDApLFxuJiM0MztcdFx0XHRcdC5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9O1xuIFxuIFx0aWYgKGFkZHIgXHUwMDNjIHZtX21hcF9iYXNlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgMSwgUEFHRV9LRVJORUwsIF9fcGdwcm90KDApKTtcbiYjNDM7XHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2YWRkcixcbiYjNDM7XHRcdFx0XHQucGdkID0gTlVMTCxcbiYjNDM7XHRcdFx0XHQubnVtcGFnZXMgPSAxLFxuJiM0MztcdFx0XHRcdC5tYXNrX3NldCA9IF9fcGdwcm90KDApLFxuJiM0MztcdFx0XHRcdC5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCksXG4mIzQzO1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4gXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCAxLCBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKSk7XG4mIzQzO1x0cmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmNwYSwgMSk7XG4gfVxuIFxuIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4tXHRwZ3Byb3RfdCBzZXQsIGNsZWFyO1xuJiM0MztcdHN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9IFx1MDAyNmFkZHIsXG4mIzQzO1x0XHRcdFx0LnBnZCA9IE5VTEwsXG4mIzQzO1x0XHRcdFx0Lm51bXBhZ2VzID0gbnIsXG4mIzQzO1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4gXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHZhbGlkKSB7XG4tXHRcdHNldCA9IFBBR0VfS0VSTkVMO1xuLVx0XHRjbGVhciA9IF9fcGdwcm90KDApO1xuJiM0MztcdFx0Y3BhLm1hc2tfc2V0ID0gUEFHRV9LRVJORUw7XG4mIzQzO1x0XHRjcGEubWFza19jbHIgPSBfX3BncHJvdCgwKTtcbiBcdH0gZWxzZSB7XG4tXHRcdHNldCA9IF9fcGdwcm90KDApO1xuLVx0XHRjbGVhciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7XG4mIzQzO1x0XHRjcGEubWFza19zZXQgPSBfX3BncHJvdCgwKTtcbiYjNDM7XHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7XG4gXHR9XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG5yLCBzZXQsIGNsZWFyKTtcbiYjNDM7XHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29uZmlnXG5pbmRleCAzZjBhNjQ3MjE4ZTQwNy4uNWQwNjliZjI5MGNlNzggMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvS2NvbmZpZ1xuQEAgLTQ4LDYgJiM0Mzs0OCw3IEBAIGNvbmZpZyBSSVNDVlxuIFx0c2VsZWN0IEFSQ0hfSEFTX1BURV9TUEVDSUFMXG4gXHRzZWxlY3QgQVJDSF9IQVNfU0VUX0RJUkVDVF9NQVAgaWYgTU1VXG4gXHRzZWxlY3QgQVJDSF9IQVNfU0VUX01FTU9SWSBpZiBNTVVcbiYjNDM7XHRzZWxlY3QgR0VORVJJQ19TRVRfTUVNT1JZIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9NT0RVTEVfUldYIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NZTkNfQ09SRV9CRUZPUkVfVVNFUk1PREVcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG5pbmRleCA1ZDU3NTZiZGE4MmUzZC4uMDI3YjNlN2U0ZjE3N2QgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbkBAIC04MTksNiAmIzQzOzgxOSw0MiBAQCBzdGF0aWMgaW5saW5lIGludCBwdWRfd3JpdGUocHVkX3QgcHVkKVxuIFx0cmV0dXJuIHB0ZV93cml0ZShwdWRfcHRlKHB1ZCkpO1xuIH1cbiBcbiYjNDM7I2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcGdkX3ZhbChwZ2QpIFx1MDAyNiBfUEFHRV9XUklURTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwNGRfd3JpdGUgcDRkX3dyaXRlXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF93cml0ZShwNGRfdCBwNGQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcDRkX3ZhbChwNGQpIFx1MDAyNiBfUEFHRV9XUklURTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gISEocGdkX3ZhbChwZ2QpIFx1MDAyNiBfUEFHRV9FWEVDKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gISEocDRkX3ZhbChwNGQpIFx1MDAyNiBfUEFHRV9FWEVDKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwdWRfZXhlYyBwdWRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwdWRfZXhlYyhwdWRfdCBwdWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gISEocHVkX3ZhbChwdWQpIFx1MDAyNiBfUEFHRV9FWEVDKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gISEocG1kX3ZhbChwbWQpIFx1MDAyNiBfUEFHRV9FWEVDKTtcbiYjNDM7fVxuJiM0MztcbiAjZGVmaW5lIHBtZF9kaXJ0eSBwbWRfZGlydHlcbiBzdGF0aWMgaW5saW5lIGludCBwbWRfZGlydHkocG1kX3QgcG1kKVxuIHtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG5pbmRleCBlZjU5ZTE3MTZhMmNmZC4uNGJhNDZhMzMxMDM0MzMgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbkBAIC03LDYgJiM0Mzs3LDggQEBcbiAjZGVmaW5lIF9BU01fUklTQ1ZfU0VUX01FTU9SWV9IXG4gXG4gI2lmbmRlZiBfX0FTU0VNQkxFUl9fXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9wYWdlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUuaFx1MDAzZVxuIC8qXG4gICogRnVuY3Rpb25zIHRvIGNoYW5nZSBtZW1vcnkgYXR0cmlidXRlcy5cbiAgKi9cbkBAIC0yNiw2ICYjNDM7MjgsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgc2V0X2tlcm5lbF9tZW1vcnkoY2hhciAqc3RhcnRwLCBjaGFyICplbmRwLFxuIFxuIFx0cmV0dXJuIHNldF9tZW1vcnkoc3RhcnQsIG51bV9wYWdlcyk7XG4gfVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIGNwYV9zaG91bGRfdXBkYXRlX2FsaWFzKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICFpc19saW5lYXJfbWFwcGluZyh2YWRkcik7XG4mIzQzO31cbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpIHsgcmV0dXJuIDA7IH1cbiBzdGF0aWMgaW5saW5lIGludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKSB7IHJldHVybiAwOyB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jIGIvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jXG5pbmRleCAzZjc2ZGIzZDI3Njk5Mi4uNjZhMjBmYzNkODA1NzQgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvbW0vcGFnZWF0dHIuY1xuQEAgLTMsNDAyICYjNDM7MywyNDIgQEBcbiAgKiBDb3B5cmlnaHQgKEMpIDIwMTkgU2lGaXZlXG4gICovXG4gXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZXdhbGsuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGd0YWJsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NldF9tZW1vcnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS90bGJmbHVzaC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjYXNtL2JpdG9wcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NldF9tZW1vcnkuaFx1MDAzZVxuIFxuLXN0cnVjdCBwYWdlYXR0cl9tYXNrcyB7XG4tXHRwZ3Byb3RfdCBzZXRfbWFzaztcbi1cdHBncHJvdF90IGNsZWFyX21hc2s7XG4tfTtcbi1cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcGFnZWF0dHJfbWFza3ModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuLXtcbi1cdHN0cnVjdCBwYWdlYXR0cl9tYXNrcyAqbWFza3MgPSB3YWxrLVx1MDAzZXByaXZhdGU7XG4tXHR1bnNpZ25lZCBsb25nIG5ld192YWwgPSB2YWw7XG4tXG4tXHRuZXdfdmFsIFx1MDAyNj0gfihwZ3Byb3RfdmFsKG1hc2tzLVx1MDAzZWNsZWFyX21hc2spKTtcbi1cdG5ld192YWwgfD0gKHBncHJvdF92YWwobWFza3MtXHUwMDNlc2V0X21hc2spKTtcbi1cbi1cdHJldHVybiBuZXdfdmFsO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3A0ZF9lbnRyeShwNGRfdCAqcDRkLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiYjNDM7aW50IGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXG4ge1xuLVx0cDRkX3QgdmFsID0gcDRkcF9nZXQocDRkKTtcbi1cbi1cdGlmIChwNGRfbGVhZih2YWwpKSB7XG4tXHRcdHZhbCA9IF9fcDRkKHNldF9wYWdlYXR0cl9tYXNrcyhwNGRfdmFsKHZhbCksIHdhbGspKTtcbi1cdFx0c2V0X3A0ZChwNGQsIHZhbCk7XG4tXHR9XG4mIzQzO1x0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXHUwMDNla3B0ZSk7XG4mIzQzO1x0cGdwcm90X3Qgb2xkX3Byb3QgPSBfX3BncHJvdChwdGVfdmFsKG9sZCkgXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XG4mIzQzO1x0cGdwcm90X3QgbmV3X3Byb3QgPSBvbGRfcHJvdDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9sZF9wZm4gPSBwdGVfcGZuKG9sZCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBscGFkZHIsIG51bXBhZ2VzO1xuIFxuLVx0cmV0dXJuIDA7XG4tfVxuJiM0MztcdHBncHJvdF92YWwobmV3X3Byb3QpIFx1MDAyNj0gfnBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfY2xyKTtcbiYjNDM7XHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdWRfZW50cnkocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4te1xuLVx0cHVkX3QgdmFsID0gcHVkcF9nZXQocHVkKTtcbi1cbi1cdGlmIChwdWRfbGVhZih2YWwpKSB7XG4tXHRcdHZhbCA9IF9fcHVkKHNldF9wYWdlYXR0cl9tYXNrcyhwdWRfdmFsKHZhbCksIHdhbGspKTtcbi1cdFx0c2V0X3B1ZChwdWQsIHZhbCk7XG4tXHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBSZWNvcmQgdGhlIHBmbiBtYXBwZWQgYXQgQGFkZHJlc3Mgc28gdGhlIGFsaWFzIGNoZWNrIGNhbiBsb2NhdGUgdGhlXG4mIzQzO1x0ICogbWF0Y2hpbmcgbGluZWFyIG1hcCBlbnRyeS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjcGEtXHUwMDNlcGZuID0gb2xkX3BmbiAmIzQzOyAoKHNkLVx1MDAzZWFkZHJlc3MgXHUwMDI2IChzZC1cdTAwM2Vwc2l6ZSAtIDEpKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4tXHRyZXR1cm4gMDtcbi19XG4mIzQzO1x0LyogSWYgdGhlIHByb3RlY3Rpb25zIGRvIG5vdCBjaGFuZ2UsIGtlZXAgdGhlIGxhcmdlIHBhZ2UgaW50YWN0LiAqL1xuJiM0MztcdGlmIChwZ3Byb3RfdmFsKG5ld19wcm90KSA9PSBwZ3Byb3RfdmFsKG9sZF9wcm90KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuLXtcbi1cdHBtZF90IHZhbCA9IHBtZHBfZ2V0KHBtZCk7XG4mIzQzO1x0LyogSWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgY292ZXIgdGhlIHdob2xlIGxhcmdlIHBhZ2UsIHNwbGl0IGl0LiAqL1xuJiM0MztcdGxwYWRkciA9IHNkLVx1MDAzZWFkZHJlc3MgXHUwMDI2IHNkLVx1MDAzZXBtYXNrO1xuJiM0MztcdG51bXBhZ2VzID0gc2QtXHUwMDNlcHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0aWYgKHNkLVx1MDAzZWFkZHJlc3MgIT0gbHBhZGRyIHx8IGNwYS1cdTAwM2VudW1wYWdlcyAhPSBudW1wYWdlcylcbiYjNDM7XHRcdHJldHVybiAxO1xuIFxuLVx0aWYgKHBtZF9sZWFmKHZhbCkpIHtcbi1cdFx0dmFsID0gX19wbWQoc2V0X3BhZ2VhdHRyX21hc2tzKHBtZF92YWwodmFsKSwgd2FsaykpO1xuLVx0XHRzZXRfcG1kKHBtZCwgdmFsKTtcbi1cdH1cbiYjNDM7XHQvKiBUaGUgd2hvbGUgbGFyZ2UgcGFnZSBpcyBjb3ZlcmVkOiB1cGRhdGUgaXQgaW4gcGxhY2UuICovXG4mIzQzO1x0c2V0X3B0ZShzZC1cdTAwM2VrcHRlLCBwZm5fcHRlKG9sZF9wZm4sIG5ld19wcm90KSk7XG4mIzQzO1x0Y3BhLVx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcbiBcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B0ZV9lbnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfc2V0X3B0ZXMocHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHBmbmluYyxcbiYjNDM7XHRcdFx0ICAgcGdwcm90X3QgcHJvdClcbiB7XG4tXHRwdGVfdCB2YWwgPSBwdGVwX2dldChwdGUpO1xuLVxuLVx0dmFsID0gX19wdGUoc2V0X3BhZ2VhdHRyX21hc2tzKHB0ZV92YWwodmFsKSwgd2FsaykpO1xuLVx0c2V0X3B0ZShwdGUsIHZhbCk7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4gXG4tXHRyZXR1cm4gMDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBQVFJTX1BFUl9QVEU7ICYjNDM7JiM0MztpLCAmIzQzOyYjNDM7cHRlcCwgcGZuICYjNDM7PSBwZm5pbmMpXG4mIzQzO1x0XHRzZXRfcHRlKHB0ZXAsIHBmbl9wdGUocGZuLCBwcm90KSk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHRlX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG5leHQsXG4tXHRcdFx0ICAgICBpbnQgZGVwdGgsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuJiM0MztpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbi1cdC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqL1xuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1fd2Fsa19vcHMgcGFnZWF0dHJfb3BzID0ge1xuLVx0LnA0ZF9lbnRyeSA9IHBhZ2VhdHRyX3A0ZF9lbnRyeSxcbi1cdC5wdWRfZW50cnkgPSBwYWdlYXR0cl9wdWRfZW50cnksXG4tXHQucG1kX2VudHJ5ID0gcGFnZWF0dHJfcG1kX2VudHJ5LFxuLVx0LnB0ZV9lbnRyeSA9IHBhZ2VhdHRyX3B0ZV9lbnRyeSxcbi1cdC5wdGVfaG9sZSA9IHBhZ2VhdHRyX3B0ZV9ob2xlLFxuLVx0LndhbGtfbG9jayA9IFBHV0FMS19SRExPQ0ssXG4tfTtcbi1cbiAjaWZkZWYgQ09ORklHXzY0QklUXG4tc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BtZChwdWRfdCAqcHVkcCxcbi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLXtcbi1cdHBtZF90ICpwbWRwO1xuLVx0dW5zaWduZWQgbG9uZyBuZXh0O1xuLVxuLVx0cG1kcCA9IHBtZF9vZmZzZXQocHVkcCwgdmFkZHIpO1xuLVxuLVx0ZG8ge1xuLVx0XHRuZXh0ID0gcG1kX2FkZHJfZW5kKHZhZGRyLCBlbmQpO1xuLVxuLVx0XHRpZiAobmV4dCAtIHZhZGRyIFx1MDAzZT0gUE1EX1NJWkUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICB2YWRkciBcdTAwM2M9ICh2YWRkciBcdTAwMjYgUE1EX01BU0spIFx1MDAyNlx1MDAyNiBlbmQgXHUwMDNlPSBuZXh0KVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kcCkpKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnB0ZV9wYWdlO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gX3BtZF9wZm4ocG1kcF9nZXQocG1kcCkpO1xuLVx0XHRcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwbWRfdmFsKHBtZHBfZ2V0KHBtZHApKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbi1cdFx0XHRwdGVfdCAqcHRlcF9uZXc7XG4tXHRcdFx0aW50IGk7XG4tXG4tXHRcdFx0cHRlX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xuLVx0XHRcdGlmICghcHRlX3BhZ2UpXG4tXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqYmFzZSA9IHB0ZGVzY19wYWdlKHNkLVx1MDAzZXB0ZGVzYyk7XG4mIzQzO1x0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXHUwMDNla3B0ZSk7XG4mIzQzO1x0cGdwcm90X3QgcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbmluYztcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChzZC1cdTAwM2VsZXZlbCkge1xuJiM0MztcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XG4mIzQzO1x0XHRwZm5pbmMgPSAxO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcbiYjNDM7XHRcdHBmbmluYyA9IFBNRF9TSVpFIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1A0RDpcbiYjNDM7XHRcdHBmbmluYyA9IFBVRF9TSVpFIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiBcbi1cdFx0XHRwdGVwX25ldyA9IChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhwdGVfcGFnZSk7XG4tXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUFRSU19QRVJfUFRFOyAmIzQzOyYjNDM7aSwgJiM0MzsmIzQzO3B0ZXBfbmV3KVxuLVx0XHRcdFx0c2V0X3B0ZShwdGVwX25ldywgcGZuX3B0ZShwZm4gJiM0MzsgaSwgcHJvdCkpO1xuJiM0MztcdHNwbGl0X3NldF9wdGVzKChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhiYXNlKSwgcGZuLCBwZm5pbmMsIHByb3QpO1xuIFxuLVx0XHRcdHNtcF93bWIoKTtcbiYjNDM7XHRzbXBfd21iKCk7XG4mIzQzO1x0c2V0X3B0ZShzZC1cdTAwM2VrcHRlLCBwZm5fcHRlKHBhZ2VfdG9fcGZuKGJhc2UpLCBQQUdFX1RBQkxFKSk7XG4gXG4tXHRcdFx0c2V0X3BtZChwbWRwLCBwZm5fcG1kKHBhZ2VfdG9fcGZuKHB0ZV9wYWdlKSwgUEFHRV9UQUJMRSkpO1xuLVx0XHR9XG4tXHR9IHdoaWxlIChwbWRwJiM0MzsmIzQzOywgdmFkZHIgPSBuZXh0LCB2YWRkciAhPSBlbmQpO1xuJiM0MztcdGNwYS1cdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XG4mIzQzO1x0Y3BhLVx1MDAzZWZvcmNlX2ZsdXNoX2FsbCA9IDE7XG4gXG4gXHRyZXR1cm4gMDtcbiYjNDM7I2Vsc2VcbiYjNDM7XHRXQVJOX09OX09OQ0UoMSk7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzOyNlbmRpZlxuIH1cbiBcbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcHVkKHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpXG4mIzQzO3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHQgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KVxuIHtcbi1cdHB1ZF90ICpwdWRwO1xuLVx0dW5zaWduZWQgbG9uZyBuZXh0O1xuLVx0aW50IHJldDtcbi1cbi1cdHB1ZHAgPSBwdWRfb2Zmc2V0KHA0ZHAsIHZhZGRyKTtcbi1cbi1cdGRvIHtcbi1cdFx0bmV4dCA9IHB1ZF9hZGRyX2VuZCh2YWRkciwgZW5kKTtcbi1cbi1cdFx0aWYgKG5leHQgLSB2YWRkciBcdTAwM2U9IFBVRF9TSVpFIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgdmFkZHIgXHUwMDNjPSAodmFkZHIgXHUwMDI2IFBVRF9NQVNLKSBcdTAwMjZcdTAwMjYgZW5kIFx1MDAzZT0gbmV4dClcbi1cdFx0XHRjb250aW51ZTtcbiYjNDM7XHRwZ3Byb3RfdCBuZXdfcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkX3B0ZSkgXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKG9sZF9wdGUpO1xuJiM0MztcdHB0ZV90IG5ld19wdGU7XG4gXG4tXHRcdGlmIChwdWRfbGVhZihwdWRwX2dldChwdWRwKSkpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqcG1kX3BhZ2U7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBfcHVkX3BmbihwdWRwX2dldChwdWRwKSk7XG4tXHRcdFx0cGdwcm90X3QgcHJvdCA9IF9fcGdwcm90KHB1ZF92YWwocHVkcF9nZXQocHVkcCkpIFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xuLVx0XHRcdHBtZF90ICpwbWRwX25ldztcbi1cdFx0XHRpbnQgaTtcbiYjNDM7XHRwZ3Byb3RfdmFsKG5ld19wcm90KSBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4mIzQzO1x0cGdwcm90X3ZhbChuZXdfcHJvdCkgfD0gcGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19zZXQpO1xuIFxuLVx0XHRcdHBtZF9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTtcbi1cdFx0XHRpZiAoIXBtZF9wYWdlKVxuLVx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0bmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7XG4mIzQzO1x0Y3BhLVx1MDAzZXBmbiA9IHBmbjtcbiBcbi1cdFx0XHRwbWRwX25ldyA9IChwbWRfdCAqKXBhZ2VfYWRkcmVzcyhwbWRfcGFnZSk7XG4tXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUFRSU19QRVJfUE1EOyAmIzQzOyYjNDM7aSwgJiM0MzsmIzQzO3BtZHBfbmV3KVxuLVx0XHRcdFx0c2V0X3BtZChwbWRwX25ldyxcbi1cdFx0XHRcdFx0cGZuX3BtZChwZm4gJiM0MzsgKChpICogUE1EX1NJWkUpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSwgcHJvdCkpO1xuLVxuLVx0XHRcdHNtcF93bWIoKTtcbi1cbi1cdFx0XHRzZXRfcHVkKHB1ZHAsIHBmbl9wdWQocGFnZV90b19wZm4ocG1kX3BhZ2UpLCBQQUdFX1RBQkxFKSk7XG4tXHRcdH1cbi1cbi1cdFx0cmV0ID0gX19zcGxpdF9saW5lYXJfbWFwcGluZ19wbWQocHVkcCwgdmFkZHIsIG5leHQpO1xuLVx0XHRpZiAocmV0KVxuLVx0XHRcdHJldHVybiByZXQ7XG4tXHR9IHdoaWxlIChwdWRwJiM0MzsmIzQzOywgdmFkZHIgPSBuZXh0LCB2YWRkciAhPSBlbmQpO1xuLVxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0aWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkge1xuJiM0MztcdFx0c2V0X3B0ZShrcHRlLCBuZXdfcHRlKTtcbiYjNDM7XHRcdGNwYS1cdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XG4mIzQzO1x0fVxuIH1cbiBcbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcDRkKHBnZF90ICpwZ2RwLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpXG4mIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxuJiM0MztcdFx0XHQgICBpbnQgcHJpbWFyeSlcbiB7XG4tXHRwNGRfdCAqcDRkcDtcbi1cdHVuc2lnbmVkIGxvbmcgbmV4dDtcbi1cdGludCByZXQ7XG4tXG4tXHRwNGRwID0gcDRkX29mZnNldChwZ2RwLCB2YWRkcik7XG4tXG4tXHRkbyB7XG4tXHRcdG5leHQgPSBwNGRfYWRkcl9lbmQodmFkZHIsIGVuZCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIFt2YWRkcjsgZW5kXSBjb250YWlucyBbdmFkZHIgXHUwMDI2IFA0RF9NQVNLOyBuZXh0XSwgd2UgZG9uJiMzOTt0XG4tXHRcdCAqIG5lZWQgdG8gc3BsaXQsIHdlJiMzOTtsbCBjaGFuZ2UgdGhlIHByb3RlY3Rpb25zIG9uIHRoZSB3aG9sZSBQNEQuXG4tXHRcdCAqL1xuLVx0XHRpZiAobmV4dCAtIHZhZGRyIFx1MDAzZT0gUDREX1NJWkUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICB2YWRkciBcdTAwM2M9ICh2YWRkciBcdTAwMjYgUDREX01BU0spIFx1MDAyNlx1MDAyNiBlbmQgXHUwMDNlPSBuZXh0KVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRpZiAocDRkX2xlYWYocDRkcF9nZXQocDRkcCkpKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnB1ZF9wYWdlO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gX3A0ZF9wZm4ocDRkcF9nZXQocDRkcCkpO1xuLVx0XHRcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwNGRfdmFsKHA0ZHBfZ2V0KHA0ZHApKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbi1cdFx0XHRwdWRfdCAqcHVkcF9uZXc7XG4tXHRcdFx0aW50IGk7XG4tXG4tXHRcdFx0cHVkX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xuLVx0XHRcdGlmICghcHVkX3BhZ2UpXG4tXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEZpbGwgdGhlIHB1ZCBsZXZlbCB3aXRoIGxlYWYgcHVkcyB0aGF0IGhhdmUgdGhlIHNhbWVcbi1cdFx0XHQgKiBwcm90ZWN0aW9ucyBhcyB0aGUgbGVhZiBwNGQuXG4tXHRcdFx0ICovXG4tXHRcdFx0cHVkcF9uZXcgPSAocHVkX3QgKilwYWdlX2FkZHJlc3MocHVkX3BhZ2UpO1xuLVx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBUUlNfUEVSX1BVRDsgJiM0MzsmIzQzO2ksICYjNDM7JiM0MztwdWRwX25ldylcbi1cdFx0XHRcdHNldF9wdWQocHVkcF9uZXcsXG4tXHRcdFx0XHRcdHBmbl9wdWQocGZuICYjNDM7ICgoaSAqIFBVRF9TSVpFKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCksIHByb3QpKTtcbi1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIE1ha2Ugc3VyZSB0aGUgcHVkIGZpbGxpbmcgaXMgbm90IHJlb3JkZXJlZCB3aXRoIHRoZVxuLVx0XHRcdCAqIHA0ZCBzdG9yZSB3aGljaCBjb3VsZCByZXN1bHQgaW4gc2VlaW5nIGEgcGFydGlhbGx5XG4tXHRcdFx0ICogZmlsbGVkIHB1ZCBsZXZlbC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRzbXBfd21iKCk7XG4tXG4tXHRcdFx0c2V0X3A0ZChwNGRwLCBwZm5fcDRkKHBhZ2VfdG9fcGZuKHB1ZF9wYWdlKSwgUEFHRV9UQUJMRSkpO1xuLVx0XHR9XG4tXG4tXHRcdHJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcHVkKHA0ZHAsIHZhZGRyLCBuZXh0KTtcbi1cdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuLVx0fSB3aGlsZSAocDRkcCYjNDM7JiM0MzssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTtcbiYjNDM7XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSAxO1xuIFxuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBpbnQgX19zcGxpdF9saW5lYXJfbWFwcGluZ19wZ2QocGdkX3QgKnBnZHAsXG4tXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHZhZGRyLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBlbmQpXG4te1xuLVx0dW5zaWduZWQgbG9uZyBuZXh0O1xuLVx0aW50IHJldDtcbiYjNDM7XHRpZiAoIXByaW1hcnkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcbi1cdGRvIHtcbi1cdFx0bmV4dCA9IHBnZF9hZGRyX2VuZCh2YWRkciwgZW5kKTtcbi1cdFx0LyogV2UgbmV2ZXIgdXNlIFBHRCBtYXBwaW5ncyBmb3IgdGhlIGxpbmVhciBtYXBwaW5nICovXG4tXHRcdHJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcDRkKHBnZHAsIHZhZGRyLCBuZXh0KTtcbi1cdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuLVx0fSB3aGlsZSAocGdkcCYjNDM7JiM0MzssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTtcbiYjNDM7XHQvKiBUaGUgbGluZWFyIG1hcCBpcyBleHBlY3RlZCB0byBoYXZlIGhvbGVzICovXG4mIzQzO1x0aWYgKGlzX2xpbmVhcl9tYXBwaW5nKHZhZGRyKSkge1xuJiM0MztcdFx0Y3BhLVx1MDAzZXBmbiA9IFBGTl9ET1dOKF9fcGEodmFkZHIpKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiBcbi1cdHJldHVybiAwO1xuLX1cbiYjNDM7XHRXQVJOKDEsIFwmIzM0O0NQQTogY2FsbGVkIGZvciB6ZXJvIHB0ZS4gdmFkZHIgPSAlbHggY3BhLVx1MDAzZXZhZGRyID0gJWx4XFxuXCYjMzQ7LFxuJiM0MztcdCAgICAgdmFkZHIsICpjcGEtXHUwMDNldmFkZHIpO1xuIFxuLXN0YXRpYyBpbnQgc3BsaXRfbGluZWFyX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpXG4te1xuLVx0cmV0dXJuIF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcGdkKHBnZF9vZmZzZXRfayhzdGFydCksIHN0YXJ0LCBlbmQpO1xuJiM0MztcdHJldHVybiAtRUZBVUxUO1xuIH1cbi0jZW5kaWZcdC8qIENPTkZJR182NEJJVCAqL1xuIFxuLXN0YXRpYyBpbnQgX19zZXRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzLCBwZ3Byb3RfdCBzZXRfbWFzayxcbi1cdFx0XHRwZ3Byb3RfdCBjbGVhcl9tYXNrKVxuJiM0MztpbnQgYXJjaF9jcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcbiB7XG4tXHRpbnQgcmV0O1xuLVx0dW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHI7XG4tXHR1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICYjNDM7IFBBR0VfU0laRSAqIG51bXBhZ2VzO1xuLVx0dW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCBsbV9zdGFydDtcbi1cdHVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgbG1fZW5kO1xuLVx0c3RydWN0IHBhZ2VhdHRyX21hc2tzIG1hc2tzID0ge1xuLVx0XHQuc2V0X21hc2sgPSBzZXRfbWFzayxcbi1cdFx0LmNsZWFyX21hc2sgPSBjbGVhcl9tYXNrXG4tXHR9O1xuLVxuLVx0aWYgKCFudW1wYWdlcylcbi1cdFx0cmV0dXJuIDA7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGFsaWFzX2NwYTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxhZGRyO1xuIFxuLVx0bW1hcF93cml0ZV9sb2NrKFx1MDAyNmluaXRfbW0pO1xuLVxuLSNpZmRlZiBDT05GSUdfNjRCSVRcbiBcdC8qXG4tXHQgKiBXZSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGtlcm5lbCBtYXBwaW5nLCB3ZSBtdXN0XG4tXHQgKiBhcHBseSB0aGUgc2FtZSBjaGFuZ2VzIHRvIGl0cyBsaW5lYXIgbWFwcGluZyBhbGlhcywgd2hpY2ggbWF5IGltcGx5XG4tXHQgKiBzcGxpdHRpbmcgYSBodWdlIG1hcHBpbmcuXG4mIzQzO1x0ICogY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoKSBvbmx5IGxldHMgbm9uIGxpbmVhciBtYXAgcHJpbWFyaWVzIHJlYWNoXG4mIzQzO1x0ICogaGVyZSwgc28gQGNwYS1cdTAwM2VwZm4gYWx3YXlzIGhhcyBhIGxpbmVhciBtYXAgYWxpYXMgdGhhdCBtdXN0IHJlY2VpdmVcbiYjNDM7XHQgKiB0aGUgc2FtZSBwcm90ZWN0aW9uIGNoYW5nZS5cbiBcdCAqL1xuJiM0MztcdGxhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShQRk5fUEhZUyhjcGEtXHUwMDNlcGZuKSk7XG4gXG4tXHRpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcigodm9pZCAqKXN0YXJ0KSkge1xuLVx0XHRzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhID0gTlVMTDtcbi1cdFx0aW50IGksIHBhZ2Vfc3RhcnQ7XG4tXG4tXHRcdGFyZWEgPSBmaW5kX3ZtX2FyZWEoKHZvaWQgKilzdGFydCk7XG4tXHRcdHBhZ2Vfc3RhcnQgPSAoc3RhcnQgLSAodW5zaWduZWQgbG9uZylhcmVhLVx1MDAzZWFkZHIpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVxuLVx0XHRmb3IgKGkgPSBwYWdlX3N0YXJ0OyBpIFx1MDAzYyBwYWdlX3N0YXJ0ICYjNDM7IG51bXBhZ2VzOyAmIzQzOyYjNDM7aSkge1xuLVx0XHRcdGxtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKGFyZWEtXHUwMDNlcGFnZXNbaV0pO1xuLVx0XHRcdGxtX2VuZCA9IGxtX3N0YXJ0ICYjNDM7IFBBR0VfU0laRTtcbi1cbi1cdFx0XHRyZXQgPSBzcGxpdF9saW5lYXJfbWFwcGluZyhsbV9zdGFydCwgbG1fZW5kKTtcbi1cdFx0XHRpZiAocmV0KVxuLVx0XHRcdFx0Z290byB1bmxvY2s7XG4tXG4tXHRcdFx0cmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShsbV9zdGFydCwgbG1fZW5kLFxuLVx0XHRcdFx0XHRcdCAgICBcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFx1MDAyNm1hc2tzKTtcbi1cdFx0XHRpZiAocmV0KVxuLVx0XHRcdFx0Z290byB1bmxvY2s7XG4tXHRcdH1cbi1cdH0gZWxzZSBpZiAoaXNfa2VybmVsX21hcHBpbmcoc3RhcnQpIHx8IGlzX2xpbmVhcl9tYXBwaW5nKHN0YXJ0KSkge1xuLVx0XHRpZiAoaXNfa2VybmVsX21hcHBpbmcoc3RhcnQpKSB7XG4tXHRcdFx0bG1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylsbV9hbGlhcyhzdGFydCk7XG4tXHRcdFx0bG1fZW5kID0gKHVuc2lnbmVkIGxvbmcpbG1fYWxpYXMoZW5kKTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRsbV9zdGFydCA9IHN0YXJ0O1xuLVx0XHRcdGxtX2VuZCA9IGVuZDtcbi1cdFx0fVxuLVxuLVx0XHRyZXQgPSBzcGxpdF9saW5lYXJfbWFwcGluZyhsbV9zdGFydCwgbG1fZW5kKTtcbi1cdFx0aWYgKHJldClcbi1cdFx0XHRnb3RvIHVubG9jaztcbi1cbi1cdFx0cmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShsbV9zdGFydCwgbG1fZW5kLFxuLVx0XHRcdFx0XHQgICAgXHUwMDI2cGFnZWF0dHJfb3BzLCBOVUxMLCBcdTAwMjZtYXNrcyk7XG4tXHRcdGlmIChyZXQpXG4tXHRcdFx0Z290byB1bmxvY2s7XG4tXHR9XG4tXG4tXHRyZXQgPSAgd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCBcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsXG4tXHRcdFx0XHQgICAgIFx1MDAyNm1hc2tzKTtcbiYjNDM7XHRhbGlhc19jcGEgPSAqY3BhO1xuJiM0MztcdGFsaWFzX2NwYS52YWRkciA9IFx1MDAyNmxhZGRyO1xuJiM0MztcdGFsaWFzX2NwYS5mbGFncyBcdTAwMjY9IH4oQ1BBX1BBR0VTX0FSUkFZIHwgQ1BBX0FSUkFZKTtcbiYjNDM7XHRhbGlhc19jcGEuY3VycGFnZSA9IDA7XG4gXG4tdW5sb2NrOlxuLVx0bW1hcF93cml0ZV91bmxvY2soXHUwMDI2aW5pdF9tbSk7XG4mIzQzO1x0LyogVGhlIGxpbmVhciBtYXAgYWxpYXMgbXVzdCBuZXZlciBiZSBtYWRlIGV4ZWN1dGFibGUgKi9cbiYjNDM7XHRhbGlhc19jcGEubWFza19zZXQgPSBfX3BncHJvdChwZ3Byb3RfdmFsKGFsaWFzX2NwYS5tYXNrX3NldCkgXHUwMDI2IH5fUEFHRV9FWEVDKTtcbiYjNDM7XHRhbGlhc19jcGEubWFza19jbHIgPSBfX3BncHJvdChwZ3Byb3RfdmFsKGFsaWFzX2NwYS5tYXNrX2NscikgXHUwMDI2IH5fUEFHRV9FWEVDKTtcbiBcbi1cdC8qXG4tXHQgKiBXZSBjYW4mIzM5O3QgdXNlIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKSBoZXJlIGFzIHdlIG1heSBoYXZlIHNwbGl0IGFcbi1cdCAqIGh1Z2VwYWdlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhhdCwgc28gbGV0JiMzOTtzIGZsdXNoIGV2ZXJ5dGhpbmcuXG4tXHQgKi9cbi1cdGZsdXNoX3RsYl9hbGwoKTtcbi0jZWxzZVxuLVx0cmV0ID0gIHdhbGtfa2VybmVsX3BhZ2VfdGFibGVfcmFuZ2Uoc3RhcnQsIGVuZCwgXHUwMDI2cGFnZWF0dHJfb3BzLCBOVUxMLFxuLVx0XHRcdFx0ICAgICBcdTAwMjZtYXNrcyk7XG4mIzQzO1x0Y3BhLVx1MDAzZWZvcmNlX2ZsdXNoX2FsbCA9IDE7XG4gXG4tXHRtbWFwX3dyaXRlX3VubG9jayhcdTAwMjZpbml0X21tKTtcbiYjNDM7XHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2YWxpYXNfY3BhLCAwKTtcbiYjNDM7fVxuIFxuLVx0Zmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKTtcbi0jZW5kaWZcbiYjNDM7dm9pZCBhcmNoX2NwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGVycilcbiYjNDM7e1xuJiM0MztcdGlmIChlcnIgfHwgY3BhLVx1MDAzZWZvcmNlX2ZsdXNoX2FsbCB8fFxuJiM0MztcdCAgICAoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiAoQ1BBX0FSUkFZIHwgQ1BBX1BBR0VTX0FSUkFZKSkpIHtcbiYjNDM7XHRcdGZsdXNoX3RsYl9hbGwoKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4gXG4tXHRyZXR1cm4gcmV0O1xuJiM0MztcdGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKmNwYS1cdTAwM2V2YWRkcixcbiYjNDM7XHRcdFx0ICAgICAgICpjcGEtXHUwMDNldmFkZHIgJiM0MzsgY3BhLVx1MDAzZW51bXBhZ2VzICogUEFHRV9TSVpFKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfcndfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4ge1xuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUkVBRCB8IF9QQUdFX1dSSVRFKSxcbi1cdFx0XHQgICAgX19wZ3Byb3QoX1BBR0VfRVhFQykpO1xuJiM0MztcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2YWRkciwgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdFx0XHRfX3BncHJvdChfUEFHRV9SRUFEIHwgX1BBR0VfV1JJVEUpLFxuJiM0MztcdFx0XHRcdFx0X19wZ3Byb3QoX1BBR0VfRVhFQyksIDAsIDAsIE5VTEwpO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbiB7XG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEKSxcbi1cdFx0XHQgICAgX19wZ3Byb3QoX1BBR0VfV1JJVEUpKTtcbiYjNDM7XHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEKSxcbiYjNDM7XHRcdFx0XHRcdF9fcGdwcm90KF9QQUdFX1dSSVRFKSwgMCwgMCwgTlVMTCk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksXG4tXHRcdFx0ICAgIF9fcGdwcm90KDApKTtcbiYjNDM7XHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoXHUwMDI2YWRkciwgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdFx0ICAgIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksIDApO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCBfX3BncHJvdCgwKSk7XG4mIzQzO1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9FWEVDKSwgMCk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9FWEVDKSk7XG4mIzQzO1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIoXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCAwKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgMSxcbi1cdFx0XHQgICAgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuJiM0MztcdHN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9IFx1MDAyNnN0YXJ0LFxuJiM0MztcdFx0XHRcdC5wZ2QgPSBOVUxMLFxuJiM0MztcdFx0XHRcdC5udW1wYWdlcyA9IDEsXG4mIzQzO1x0XHRcdFx0Lm1hc2tfc2V0ID0gX19wZ3Byb3QoMCksXG4mIzQzO1x0XHRcdFx0Lm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCksXG4mIzQzO1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcdTAwMjZjcGEsIDEpO1xuIH1cbiBcbiBpbnQgc2V0X2RpcmVjdF9tYXBfZGVmYXVsdF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpLCAxLFxuLVx0XHRcdCAgICBQQUdFX0tFUk5FTCwgX19wZ3Byb3QoX1BBR0VfRVhFQykpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2c3RhcnQsXG4mIzQzO1x0XHRcdFx0LnBnZCA9IE5VTEwsXG4mIzQzO1x0XHRcdFx0Lm51bXBhZ2VzID0gMSxcbiYjNDM7XHRcdFx0XHQubWFza19zZXQgPSBQQUdFX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9FWEVDKSxcbiYjNDM7XHRcdFx0XHQuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmNwYSwgMSk7XG4gfVxuIFxuIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZClcbiB7XG4tXHRwZ3Byb3RfdCBzZXQsIGNsZWFyO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2c3RhcnQsXG4mIzQzO1x0XHRcdFx0LnBnZCA9IE5VTEwsXG4mIzQzO1x0XHRcdFx0Lm51bXBhZ2VzID0gbnIsXG4mIzQzO1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4gXG4gXHRpZiAodmFsaWQpIHtcbi1cdFx0c2V0ID0gUEFHRV9LRVJORUw7XG4tXHRcdGNsZWFyID0gX19wZ3Byb3QoX1BBR0VfRVhFQyk7XG4mIzQzO1x0XHRjcGEubWFza19zZXQgPSBQQUdFX0tFUk5FTDtcbiYjNDM7XHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX0VYRUMpO1xuIFx0fSBlbHNlIHtcbi1cdFx0c2V0ID0gX19wZ3Byb3QoMCk7XG4tXHRcdGNsZWFyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCk7XG4mIzQzO1x0XHRjcGEubWFza19zZXQgPSBfX3BncHJvdCgwKTtcbiYjNDM7XHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpO1xuIFx0fVxuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSksIG5yLCBzZXQsIGNsZWFyKTtcbiYjNDM7XHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0NcbkBAIC00MzUsMzYgJiM0MzsyNzUsMTEgQEAgdm9pZCBfX2tlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSlcbiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuLVx0cGdkX3QgKnBnZDtcbi1cdHB1ZF90ICpwdWQ7XG4tXHRwNGRfdCAqcDRkO1xuLVx0cG1kX3QgKnBtZDtcbi1cdHB0ZV90ICpwdGU7XG4tXG4tXHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7XG4tXHRpZiAoIXBnZF9wcmVzZW50KHBnZHBfZ2V0KHBnZCkpKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHRpZiAocGdkX2xlYWYocGdkcF9nZXQocGdkKSkpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0cDRkID0gcDRkX29mZnNldChwZ2QsIGFkZHIpO1xuLVx0aWYgKCFwNGRfcHJlc2VudChwNGRwX2dldChwNGQpKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0aWYgKHA0ZF9sZWFmKHA0ZHBfZ2V0KHA0ZCkpKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cbi1cdHB1ZCA9IHB1ZF9vZmZzZXQocDRkLCBhZGRyKTtcbi1cdGlmICghcHVkX3ByZXNlbnQocHVkcF9nZXQocHVkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwdWRfbGVhZihwdWRwX2dldChwdWQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0dW5zaWduZWQgaW50IGxldmVsO1xuJiM0MztcdHB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCBcdTAwMjZsZXZlbCk7XG4gXG4tXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7XG4tXHRpZiAoIXBtZF9wcmVzZW50KHBtZHBfZ2V0KHBtZCkpKVxuJiM0MztcdGlmICghcHRlKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kKSkpXG4tXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0cHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyKTtcbiBcdHJldHVybiBwdGVfcHJlc2VudChwdGVwX2dldChwdGUpKTtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWdcbmluZGV4IGJkYWQ5MGYyMTBlNGJmLi5lMWYxMDVlNTJkNmExMiAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L0tjb25maWdcbkBAIC0zMzYsNiAmIzQzOzMzNiw3IEBAIGNvbmZpZyBYODZcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1NDSEVEX0NMVVNURVJcdGlmIFNNUFxuIFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfU0NIRURfTUNcdFx0aWYgU01QXG4gXHRzZWxlY3QgSEFWRV9TSU5HTEVfRlRSQUNFX0RJUkVDVF9PUFNcdGlmIFg4Nl82NCBcdTAwMjZcdTAwMjYgRFlOQU1JQ19GVFJBQ0VfV0lUSF9ESVJFQ1RfQ0FMTFNcbiYjNDM7XHRzZWxlY3QgR0VORVJJQ19TRVRfTUVNT1JZXG4gXG4gY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVJcbiBcdGRlZl9ib29sIHlcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuaW5kZXggYzk1YzNhYWFkZjk3YzMuLjMxNGI3MmFhZDZmZmY0IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuQEAgLTE1NywxMiAmIzQzOzE1Nyw2IEBAIGNvbmZpZyBERUJVR19CT09UX1BBUkFNU1xuIFx0aGVscFxuIFx0ICBUaGlzIG9wdGlvbiB3aWxsIGNhdXNlIHN0cnVjdCBib290X3BhcmFtcyB0byBiZSBleHBvcnRlZCB2aWEgZGVidWdmcy5cbiBcbi1jb25maWcgQ1BBX0RFQlVHXG4tXHRib29sIFwmIzM0O0NQQSBzZWxmLXRlc3QgY29kZVwmIzM0O1xuLVx0ZGVwZW5kcyBvbiBERUJVR19LRVJORUxcbi1cdGhlbHBcbi1cdCAgRG8gY2hhbmdlX3BhZ2VfYXR0cigpIHNlbGYtdGVzdHMgZXZlcnkgMzAgc2Vjb25kcy5cbi1cbiBjb25maWcgREVCVUdfRU5UUllcbiBcdGJvb2wgXCYjMzQ7RGVidWcgbG93LWxldmVsIGVudHJ5IGNvZGVcJiMzNDtcbiBcdGRlcGVuZHMgb24gREVCVUdfS0VSTkVMXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG5pbmRleCBhYzI5NWNhNmM5MmY5OS4uNDk3YWFmMDhhZDM2MTYgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxuQEAgLTIyNyw2ICYjNDM7MjI3LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXG4gXHRyZXR1cm4gcHVkX2ZsYWdzKHB1ZCkgXHUwMDI2IF9QQUdFX1JXO1xuIH1cbiBcbiYjNDM7I2RlZmluZSBwNGRfd3JpdGUgcDRkX3dyaXRlXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF93cml0ZShwNGRfdCBwNGQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcDRkX2ZsYWdzKHA0ZCkgXHUwMDI2IF9QQUdFX1JXO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIHBnZF93cml0ZSBwZ2Rfd3JpdGVcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcGdkX3dyaXRlKHBnZF90IHBnZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBwZ2RfZmxhZ3MocGdkKSBcdTAwMjYgX1BBR0VfUlc7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcG1kX2V4ZWMgcG1kX2V4ZWNcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcG1kX2V4ZWMocG1kX3QgcG1kKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICEocG1kX2ZsYWdzKHBtZCkgXHUwMDI2IF9QQUdFX05YKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBwdWRfZXhlYyBwdWRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwdWRfZXhlYyhwdWRfdCBwdWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gIShwdWRfZmxhZ3MocHVkKSBcdTAwMjYgX1BBR0VfTlgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIHA0ZF9leGVjIHA0ZF9leGVjXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF9leGVjKHA0ZF90IHA0ZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKHA0ZF9mbGFncyhwNGQpIFx1MDAyNiBfUEFHRV9OWCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcGdkX2V4ZWMgcGdkX2V4ZWNcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcGdkX2V4ZWMocGdkX3QgcGdkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICEocGdkX2ZsYWdzKHBnZCkgXHUwMDI2IF9QQUdFX05YKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpXG4ge1xuIFx0cmV0dXJuIHB0ZV9mbGFncyhwdGUpIFx1MDAyNiBfUEFHRV9QU0U7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG5pbmRleCA0MzYyYzI2YWE5OTJkYi4uMzMyZWMzMDBjMmVkOWMgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuQEAgLTMsMTIgJiM0MzszLDYyIEBAXG4gI2RlZmluZSBfQVNNX1g4Nl9TRVRfTUVNT1JZX0hcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9zZWN0aW9ucy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtLWdlbmVyaWMvc2V0X21lbW9yeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUuaFx1MDAzZVxuIFxuICNkZWZpbmUgc2V0X21lbW9yeV9yb3ggc2V0X21lbW9yeV9yb3hcbiBpbnQgc2V0X21lbW9yeV9yb3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpO1xuIFxuJiM0MzsjaWZkZWYgQ09ORklHX1g4Nl82NFxuJiM0MzsvKlxuJiM0MzsgKiBUaGUga2VybmVsIGltYWdlIGlzIG1hcHBlZCBpbnRvIHR3byBwbGFjZXMgaW4gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZVxuJiM0MzsgKiAoYWRkcmVzc2VzIHdpdGhvdXQgS0FTTFIsIG9mIGNvdXJzZSk6XG4mIzQzOyAqXG4mIzQzOyAqIDEuIFRoZSBrZXJuZWwgZGlyZWN0IG1hcCAoMHhmZmZmODgwMDAwMDAwMDAwKVxuJiM0MzsgKiAyLiBUaGUgXCYjMzQ7aGlnaCBrZXJuZWwgbWFwXCYjMzQ7ICgweGZmZmZmZmZmODEwMDAwMDApXG4mIzQzOyAqXG4mIzQzOyAqIFdlIGFjdHVhbGx5IGV4ZWN1dGUgb3V0IG9mICMyLiBJZiB3ZSBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBrZXJuZWwgc3ltYm9sLCBpdFxuJiM0MzsgKiBwb2ludHMgdG8gIzIsIGJ1dCBhbG1vc3QgYWxsIHBoeXNpY2FsLXRvLXZpcnR1YWwgdHJhbnNsYXRpb25zIHBvaW50IHRvICMxLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYm90aCBhIGRpcmVjdG1hcCBvZiBhbGwgcGh5c2ljYWwgbWVtb3J5ICphbmQqXG4mIzQzOyAqIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgdGhlIGxpbWl0ZWQgKHMzMikgaW1tZWRpYXRlIGFkZHJlc3NpbmcgcmFuZ2UgKDJHKVxuJiM0MzsgKiBvZiB4ODZfNjQuXG4mIzQzOyAqXG4mIzQzOyAqIFNlZSBEb2N1bWVudGF0aW9uL2FyY2gveDg2L3g4Nl82NC9tbS5yc3QgZm9yIG1vcmUgZGV0YWlsLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBmbl9pc19rZXJuZWwodW5zaWduZWQgbG9uZyBwZm4pXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNwZm4gPSBfX3BhX3N5bWJvbChfdGV4dCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0LyogRG8gbm90IHJlZmVyZW5jZSBhIHBoeXNpY2FsIGFkZHJlc3Mgb3V0c2lkZSB0aGUga2VybmVsLiAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZXBmbiA9IF9fcGFfc3ltYm9sKHJvdW5kdXAoX2Jya19lbmQsIFBNRF9TSVpFKSAtIDEpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcGZuIFx1MDAzZT0gc3BmbiBcdTAwMjZcdTAwMjYgcGZuIFx1MDAzYz0gZXBmbjtcbiYjNDM7fVxuJiM0MzsjZWxzZVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGZuX2lzX2tlcm5lbCh1bnNpZ25lZCBsb25nIHBmbilcbiYjNDM7e1xuJiM0MztcdC8qIFRoZXJlIGlzIG5vIGhpZ2htYXAgb24gMzItYml0ICovXG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIGNwYV9zaG91bGRfdXBkYXRlX2FsaWFzKHVuc2lnbmVkIGxvbmcgdmFkZHIsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHBmbilcbiYjNDM7e1xuJiM0MztcdC8qIFByaW1hcnkgaXMgbm90IGluIHRoZSBkaXJlY3QgbWFwLCBpdHMgZGlyZWN0IG1hcCBhbGlhcyBuZWVkcyB1cGRhdGUgKi9cbiYjNDM7XHRpZiAodmFkZHIgXHUwMDNjIFBBR0VfT0ZGU0VUIHx8XG4mIzQzO1x0ICAgIHZhZGRyIFx1MDAzZT0gUEFHRV9PRkZTRVQgJiM0MzsgKG1heF9wZm5fbWFwcGVkIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHQvKiBkaXJlY3QgbWFwIHBhZ2UgdGhhdCBpcyBhbHNvIHBhcnQgb2YgdGhlIGtlcm5lbCBoaWdobWFwICovXG4mIzQzO1x0aWYgKCh2YWRkciBcdTAwM2MgKHVuc2lnbmVkIGxvbmcpX3RleHQgfHwgdmFkZHIgXHUwMDNlPSBfYnJrX2VuZCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHBmbl9pc19rZXJuZWwocGZuKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBUaGUgc2V0X21lbW9yeV8qIEFQSSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIGEgdmlydHVhbFxuICAqIGFkZHJlc3MgcmFuZ2UuIFRoZSBhdHRyaWJ1dGVzIGluY2x1ZGU6XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0L3NldF9tZW1vcnkuYyBiL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbmluZGV4IGQwMjNhNDBhMWUwMzQ1Li5jNDYwMTIxYzk2Yjk0OSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbkBAIC0zOCwyMSAmIzQzOzM4LDYgQEBcbiAvKlxuICAqIFRoZSBjdXJyZW50IGZsdXNoaW5nIGNvbnRleHQgLSB3ZSBwYXNzIGl0IGluc3RlYWQgb2YgNSBhcmd1bWVudHM6XG4gICovXG4tc3RydWN0IGNwYV9kYXRhIHtcbi1cdHVuc2lnbmVkIGxvbmdcdCp2YWRkcjtcbi1cdHBnZF90XHRcdCpwZ2Q7XG4tXHRwZ3Byb3RfdFx0bWFza19zZXQ7XG4tXHRwZ3Byb3RfdFx0bWFza19jbHI7XG4tXHR1bnNpZ25lZCBsb25nXHRudW1wYWdlcztcbi1cdHVuc2lnbmVkIGxvbmdcdGN1cnBhZ2U7XG4tXHR1bnNpZ25lZCBsb25nXHRwZm47XG4tXHR1bnNpZ25lZCBpbnRcdGZsYWdzO1xuLVx0dW5zaWduZWQgaW50XHRmb3JjZV9zcGxpdFx0XHQ6IDEsXG4tXHRcdFx0Zm9yY2Vfc3RhdGljX3Byb3RcdDogMSxcbi1cdFx0XHRmb3JjZV9mbHVzaF9hbGxcdFx0OiAxO1xuLVx0c3RydWN0IHBhZ2VcdCoqcGFnZXM7XG4tfTtcbi1cbiBlbnVtIGNwYV93YXJuIHtcbiBcdENQQV9DT05GTElDVCxcbiBcdENQQV9QUk9URUNULFxuQEAgLTYxLDI3ICYjNDM7NDYsMTMgQEAgZW51bSBjcGFfd2FybiB7XG4gXG4gc3RhdGljIGNvbnN0IGludCBjcGFfd2Fybl9sZXZlbCA9IENQQV9QUk9URUNUO1xuIFxuLS8qXG4tICogU2VyaWFsaXplIGNwYSgpIChmb3IgIURFQlVHX1BBR0VBTExPQyB3aGljaCB1c2VzIGxhcmdlIGlkZW50aXR5IG1hcHBpbmdzKVxuLSAqIHVzaW5nIGNwYV9sb2NrLiBTbyB0aGF0IHdlIGRvbiYjMzk7dCBhbGxvdyBhbnkgb3RoZXIgY3B1LCB3aXRoIHN0YWxlIGxhcmdlIHRsYlxuLSAqIGVudHJpZXMgY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdVxuLSAqIHNwbGl0dGluZyBhIGxhcmdlIHBhZ2UgZW50cnkgYWxvbmcgd2l0aCBjaGFuZ2luZyB0aGUgYXR0cmlidXRlLlxuLSAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spO1xuLVxuLSNkZWZpbmUgQ1BBX0ZMVVNIVExCIDFcbi0jZGVmaW5lIENQQV9BUlJBWSAyXG4tI2RlZmluZSBDUEFfUEFHRVNfQVJSQVkgNFxuLSNkZWZpbmUgQ1BBX05PX0NIRUNLX0FMSUFTIDggLyogRG8gbm90IHNlYXJjaCBmb3IgYWxpYXNlcyAqL1xuLSNkZWZpbmUgQ1BBX0NPTExBUFNFIDE2IC8qIHRyeSB0byBjb2xsYXBzZSBsYXJnZSBwYWdlcyAqL1xuLVxuIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgY2FjaGVtb2RlMnBncHJvdChlbnVtIHBhZ2VfY2FjaGVfbW9kZSBwY20pXG4ge1xuIFx0cmV0dXJuIF9fcGdwcm90KGNhY2hlbW9kZTJwcm90dmFsKHBjbSkpO1xuIH1cbiBcbiAjaWZkZWYgQ09ORklHX1BST0NfRlNcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfTlVNXTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfTlVNXTtcbiBcbiB2b2lkIHVwZGF0ZV9wYWdlX2NvdW50KGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyBwYWdlcylcbiB7XG5AQCAtOTgsOSAmIzQzOzY5LDkgQEAgc3RhdGljIHZvaWQgc3BsaXRfcGFnZV9jb3VudChpbnQgbGV2ZWwpXG4gXG4gXHRkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWxdLS07XG4gXHRpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKSB7XG4tXHRcdGlmIChsZXZlbCA9PSBQR19MRVZFTF8yTSlcbiYjNDM7XHRcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMMl9TUExJVCk7XG4tXHRcdGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuJiM0MztcdFx0ZWxzZSBpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVUQpXG4gXHRcdFx0Y291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDNfU1BMSVQpO1xuIFx0fVxuIFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsIC0gMV0gJiM0Mzs9IFBUUlNfUEVSX1BURTtcbkBAIC0xMTAsOSAmIzQzOzgxLDkgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfcGFnZV9jb3VudChpbnQgbGV2ZWwpXG4ge1xuIFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsXSYjNDM7JiM0Mzs7XG4gXHRpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKSB7XG4tXHRcdGlmIChsZXZlbCA9PSBQR19MRVZFTF8yTSlcbiYjNDM7XHRcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMMl9DT0xMQVBTRSk7XG4tXHRcdGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuJiM0MztcdFx0ZWxzZSBpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVUQpXG4gXHRcdFx0Y291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDNfQ09MTEFQU0UpO1xuIFx0fVxuIFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsIC0gMV0gLT0gUFRSU19QRVJfUFRFO1xuQEAgLTEyMSwxNyAmIzQzOzkyLDE3IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3BhZ2VfY291bnQoaW50IGxldmVsKVxuIHZvaWQgYXJjaF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pXG4ge1xuIFx0c2VxX3ByaW50ZihtLCBcJiMzNDtEaXJlY3RNYXA0azogICAgJThsdSBrQlxcblwmIzM0Oyxcbi1cdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfNEtdIFx1MDAzY1x1MDAzYyAyKTtcbiYjNDM7XHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUFRFXSBcdTAwM2NcdTAwM2MgMik7XG4gI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X1BBRSlcbiBcdHNlcV9wcmludGYobSwgXCYjMzQ7RGlyZWN0TWFwMk06ICAgICU4bHUga0JcXG5cJiMzNDssXG4tXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzJNXSBcdTAwM2NcdTAwM2MgMTEpO1xuJiM0MztcdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9QTURdIFx1MDAzY1x1MDAzYyAxMSk7XG4gI2Vsc2VcbiBcdHNlcV9wcmludGYobSwgXCYjMzQ7RGlyZWN0TWFwNE06ICAgICU4bHUga0JcXG5cJiMzNDssXG4tXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzJNXSBcdTAwM2NcdTAwM2MgMTIpO1xuJiM0MztcdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9QTURdIFx1MDAzY1x1MDAzYyAxMik7XG4gI2VuZGlmXG4gXHRpZiAoZGlyZWN0X2dicGFnZXMpXG4gXHRcdHNlcV9wcmludGYobSwgXCYjMzQ7RGlyZWN0TWFwMUc6ICAgICU4bHUga0JcXG5cJiMzNDssXG4tXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzFHXSBcdTAwM2NcdTAwM2MgMjApO1xuJiM0MztcdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9QVURdIFx1MDAzY1x1MDAzYyAyMCk7XG4gfVxuICNlbHNlXG4gc3RhdGljIGlubGluZSB2b2lkIHNwbGl0X3BhZ2VfY291bnQoaW50IGxldmVsKSB7IH1cbkBAIC0xNjUsNyAmIzQzOzEzNiw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jXzRrX2luc3RhbGwodm9pZClcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY19scF9zYW1lcHJvdChpbnQgbGV2ZWwpXG4ge1xuLVx0aWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuJiM0MztcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRClcbiBcdFx0Y3BhXzFnX3NhbWVwcm90JiM0MzsmIzQzOztcbiBcdGVsc2VcbiBcdFx0Y3BhXzJtX3NhbWVwcm90JiM0MzsmIzQzOztcbkBAIC0xNzMsNyAmIzQzOzE0NCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jX2xwX3NhbWVwcm90KGludCBsZXZlbClcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY19scF9wcmVzZXJ2ZWQoaW50IGxldmVsKVxuIHtcbi1cdGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRylcbiYjNDM7XHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVUQpXG4gXHRcdGNwYV8xZ19wcmVzZXJ2ZWQmIzQzOyYjNDM7O1xuIFx0ZWxzZVxuIFx0XHRjcGFfMm1fcHJlc2VydmVkJiM0MzsmIzQzOztcbkBAIC0yMjUsNjEgJiM0MzsxOTYsNiBAQCB3aXRoaW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcbiBcdHJldHVybiBhZGRyIFx1MDAzZT0gc3RhcnQgXHUwMDI2XHUwMDI2IGFkZHIgXHUwMDNjIGVuZDtcbiB9XG4gXG4tI2lmZGVmIENPTkZJR19YODZfNjRcbi1cbi1zdGF0aWMgaW5saW5lIGludFxuLXdpdGhpbl9pbmNsdXNpdmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcbi17XG4tXHRyZXR1cm4gYWRkciBcdTAwM2U9IHN0YXJ0IFx1MDAyNlx1MDAyNiBhZGRyIFx1MDAzYz0gZW5kO1xuLX1cbi1cbi0vKlxuLSAqIFRoZSBrZXJuZWwgaW1hZ2UgaXMgbWFwcGVkIGludG8gdHdvIHBsYWNlcyBpbiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlXG4tICogKGFkZHJlc3NlcyB3aXRob3V0IEtBU0xSLCBvZiBjb3Vyc2UpOlxuLSAqXG4tICogMS4gVGhlIGtlcm5lbCBkaXJlY3QgbWFwICgweGZmZmY4ODAwMDAwMDAwMDApXG4tICogMi4gVGhlIFwmIzM0O2hpZ2gga2VybmVsIG1hcFwmIzM0OyAoMHhmZmZmZmZmZjgxMDAwMDAwKVxuLSAqXG4tICogV2UgYWN0dWFsbHkgZXhlY3V0ZSBvdXQgb2YgIzIuIElmIHdlIGdldCB0aGUgYWRkcmVzcyBvZiBhIGtlcm5lbCBzeW1ib2wsIGl0XG4tICogcG9pbnRzIHRvICMyLCBidXQgYWxtb3N0IGFsbCBwaHlzaWNhbC10by12aXJ0dWFsIHRyYW5zbGF0aW9ucyBwb2ludCB0byAjMS5cbi0gKlxuLSAqIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGF2ZSBib3RoIGEgZGlyZWN0bWFwIG9mIGFsbCBwaHlzaWNhbCBtZW1vcnkgKmFuZCpcbi0gKiB0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIHRoZSBsaW1pdGVkIChzMzIpIGltbWVkaWF0ZSBhZGRyZXNzaW5nIHJhbmdlICgyRylcbi0gKiBvZiB4ODZfNjQuXG4tICpcbi0gKiBTZWUgRG9jdW1lbnRhdGlvbi9hcmNoL3g4Ni94ODZfNjQvbW0ucnN0IGZvciBtb3JlIGRldGFpbC5cbi0gKi9cbi1cbi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGlnaG1hcF9zdGFydF9wZm4odm9pZClcbi17XG4tXHRyZXR1cm4gX19wYV9zeW1ib2woX3RleHQpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGlnaG1hcF9lbmRfcGZuKHZvaWQpXG4te1xuLVx0LyogRG8gbm90IHJlZmVyZW5jZSBwaHlzaWNhbCBhZGRyZXNzIG91dHNpZGUgdGhlIGtlcm5lbC4gKi9cbi1cdHJldHVybiBfX3BhX3N5bWJvbChyb3VuZHVwKF9icmtfZW5kLCBQTURfU0laRSkgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbi19XG4tXG4tc3RhdGljIGJvb2wgX19jcGFfcGZuX2luX2hpZ2htYXAodW5zaWduZWQgbG9uZyBwZm4pXG4te1xuLVx0Lypcbi1cdCAqIEtlcm5lbCB0ZXh0IGhhcyBhbiBhbGlhcyBtYXBwaW5nIGF0IGEgaGlnaCBhZGRyZXNzLCBrbm93blxuLVx0ICogaGVyZSBhcyBcJiMzNDtoaWdobWFwXCYjMzQ7LlxuLVx0ICovXG4tXHRyZXR1cm4gd2l0aGluX2luY2x1c2l2ZShwZm4sIGhpZ2htYXBfc3RhcnRfcGZuKCksIGhpZ2htYXBfZW5kX3BmbigpKTtcbi19XG4tXG4tI2Vsc2Vcbi1cbi1zdGF0aWMgYm9vbCBfX2NwYV9wZm5faW5faGlnaG1hcCh1bnNpZ25lZCBsb25nIHBmbilcbi17XG4tXHQvKiBUaGVyZSBpcyBubyBoaWdobWFwIG9uIDMyLWJpdCAqL1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbi0jZW5kaWZcbi1cbiAvKlxuICAqIFNlZSBzZXRfbWNlX25vc3BlYygpLlxuICAqXG5AQCAtMzAzLDIzICYjNDM7MjE5LDYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZpeF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcilcbiAjZW5kaWZcbiB9XG4gXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgX19jcGFfYWRkcihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBpZHgpXG4te1xuLVx0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgQ1BBX1BBR0VTX0FSUkFZKSB7XG4tXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gY3BhLVx1MDAzZXBhZ2VzW2lkeF07XG4tXG4tXHRcdGlmICh1bmxpa2VseShQYWdlSGlnaE1lbShwYWdlKSkpXG4tXHRcdFx0cmV0dXJuIDA7XG4tXG4tXHRcdHJldHVybiAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4tXHR9XG4tXG4tXHRpZiAoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiBDUEFfQVJSQVkpXG4tXHRcdHJldHVybiBjcGEtXHUwMDNldmFkZHJbaWR4XTtcbi1cbi1cdHJldHVybiAqY3BhLVx1MDAzZXZhZGRyICYjNDM7IGlkeCAqIFBBR0VfU0laRTtcbi19XG4tXG4gLypcbiAgKiBGbHVzaGluZyBmdW5jdGlvbnNcbiAgKi9cbkBAIC00MDUsNyAmIzQzOzMwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY3BhX2ZsdXNoX3RsYih2b2lkICpkYXRhKVxuIFx0dW5zaWduZWQgaW50IGk7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjcGEtXHUwMDNlbnVtcGFnZXM7IGkmIzQzOyYjNDM7KVxuLVx0XHRmbHVzaF90bGJfb25lX2tlcm5lbChmaXhfYWRkcihfX2NwYV9hZGRyKGNwYSwgaSkpKTtcbiYjNDM7XHRcdGZsdXNoX3RsYl9vbmVfa2VybmVsKGZpeF9hZGRyKGNwYV9hZGRyKGNwYSwgaSkpKTtcbiB9XG4gXG4gc3RhdGljIGludCBjb2xsYXBzZV9sYXJnZV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBsaXN0X2hlYWQgKnBndGFibGVzKTtcbkBAIC00MjAsMTAgJiM0MzszMTksMTAgQEAgc3RhdGljIHZvaWQgY3BhX2NvbGxhcHNlX2xhcmdlX3BhZ2VzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIFxuIFx0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgKENQQV9QQUdFU19BUlJBWSB8IENQQV9BUlJBWSkpIHtcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY3BhLVx1MDAzZW51bXBhZ2VzOyBpJiM0MzsmIzQzOylcbi1cdFx0XHRjb2xsYXBzZWQgJiM0Mzs9IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKF9fY3BhX2FkZHIoY3BhLCBpKSxcbiYjNDM7XHRcdFx0Y29sbGFwc2VkICYjNDM7PSBjb2xsYXBzZV9sYXJnZV9wYWdlcyhjcGFfYWRkcihjcGEsIGkpLFxuIFx0XHRcdFx0XHRcdFx0ICBcdTAwMjZwZ3RhYmxlcyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRhZGRyID0gX19jcGFfYWRkcihjcGEsIDApO1xuJiM0MztcdFx0YWRkciA9IGNwYV9hZGRyKGNwYSwgMCk7XG4gXHRcdHN0YXJ0ID0gYWRkciBcdTAwMjYgUE1EX01BU0s7XG4gXHRcdGVuZCA9IGFkZHIgJiM0MzsgUEFHRV9TSVpFICogY3BhLVx1MDAzZW51bXBhZ2VzO1xuIFxuQEAgLTQ2Myw3ICYjNDM7MzYyLDcgQEAgc3RhdGljIHZvaWQgY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgY2FjaGUpXG4gXG4gXHRtYigpO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY3BhLVx1MDAzZW51bXBhZ2VzOyBpJiM0MzsmIzQzOykge1xuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBfX2NwYV9hZGRyKGNwYSwgaSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBjcGFfYWRkcihjcGEsIGkpO1xuIFx0XHR1bnNpZ25lZCBpbnQgbGV2ZWw7XG4gXG4gXHRcdHB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCBcdTAwMjZsZXZlbCk7XG5AQCAtNTc4LDcgJiM0Mzs0NzcsNyBAQCBzdGF0aWMgcGdwcm90dmFsX3QgcHJvdGVjdF9rZXJuZWxfdGV4dF9ybyh1bnNpZ25lZCBsb25nIHN0YXJ0LFxuIFx0ICogc28gdGhlIHByb3RlY3Rpb25zIGZvciBrZXJuZWwgdGV4dCBhbmQgaWRlbnRpdHkgbWFwcGluZ3MgaGF2ZSB0b1xuIFx0ICogYmUgdGhlIHNhbWUuXG4gXHQgKi9cbi1cdGlmIChsb29rdXBfYWRkcmVzcyhzdGFydCwgXHUwMDI2bGV2ZWwpIFx1MDAyNlx1MDAyNiAobGV2ZWwgIT0gUEdfTEVWRUxfNEspKVxuJiM0MztcdGlmIChsb29rdXBfYWRkcmVzcyhzdGFydCwgXHUwMDI2bGV2ZWwpIFx1MDAyNlx1MDAyNiAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpKVxuIFx0XHRyZXR1cm4gX1BBR0VfUlc7XG4gXHRyZXR1cm4gMDtcbiB9XG5AQCAtNzA5LDEwNCAmIzQzOzYwOCw2IEBAIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgdmVyaWZ5X3J3eChwZ3Byb3RfdCBvbGQsIHBncHJvdF90IG5ldywgdW5zaWduZWQgbG9uZyBzdGFyXG4gXHRyZXR1cm4gbmV3O1xuIH1cbiBcbi0vKlxuLSAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuXG4tICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgKG9yIE5VTEwgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0KSxcbi0gKiB0aGUgbGV2ZWwgb2YgdGhlIGVudHJ5LCBhbmQgdGhlIGVmZmVjdGl2ZSBOWCBhbmQgUlcgYml0cyBvZiBhbGxcbi0gKiBwYWdlIHRhYmxlIGxldmVscy5cbi0gKi9cbi1wdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpXG4te1xuLVx0cDRkX3QgKnA0ZDtcbi1cdHB1ZF90ICpwdWQ7XG4tXHRwbWRfdCAqcG1kO1xuLVxuLVx0KmxldmVsID0gUEdfTEVWRUxfMjU2VDtcbi1cdCpueCA9IGZhbHNlO1xuLVx0KnJ3ID0gdHJ1ZTtcbi1cbi1cdGlmIChwZ2Rfbm9uZSgqcGdkKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXG4tXHQqbGV2ZWwgPSBQR19MRVZFTF81MTJHO1xuLVx0Km54IHw9IHBnZF9mbGFncygqcGdkKSBcdTAwMjYgX1BBR0VfTlg7XG4tXHQqcncgXHUwMDI2PSBwZ2RfZmxhZ3MoKnBnZCkgXHUwMDI2IF9QQUdFX1JXO1xuLVxuLVx0cDRkID0gcDRkX29mZnNldChwZ2QsIGFkZHJlc3MpO1xuLVx0aWYgKHA0ZF9ub25lKCpwNGQpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cbi1cdGlmIChwNGRfbGVhZigqcDRkKSB8fCAhcDRkX3ByZXNlbnQoKnA0ZCkpXG4tXHRcdHJldHVybiAocHRlX3QgKilwNGQ7XG4tXG4tXHQqbGV2ZWwgPSBQR19MRVZFTF8xRztcbi1cdCpueCB8PSBwNGRfZmxhZ3MoKnA0ZCkgXHUwMDI2IF9QQUdFX05YO1xuLVx0KnJ3IFx1MDAyNj0gcDRkX2ZsYWdzKCpwNGQpIFx1MDAyNiBfUEFHRV9SVztcbi1cbi1cdHB1ZCA9IHB1ZF9vZmZzZXQocDRkLCBhZGRyZXNzKTtcbi1cdGlmIChwdWRfbm9uZSgqcHVkKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXG4tXHRpZiAocHVkX2xlYWYoKnB1ZCkgfHwgIXB1ZF9wcmVzZW50KCpwdWQpKVxuLVx0XHRyZXR1cm4gKHB0ZV90ICopcHVkO1xuLVxuLVx0KmxldmVsID0gUEdfTEVWRUxfMk07XG4tXHQqbnggfD0gcHVkX2ZsYWdzKCpwdWQpIFx1MDAyNiBfUEFHRV9OWDtcbi1cdCpydyBcdTAwMjY9IHB1ZF9mbGFncygqcHVkKSBcdTAwMjYgX1BBR0VfUlc7XG4tXG4tXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7XG4tXHRpZiAocG1kX25vbmUoKnBtZCkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKHBtZF9sZWFmKCpwbWQpIHx8ICFwbWRfcHJlc2VudCgqcG1kKSlcbi1cdFx0cmV0dXJuIChwdGVfdCAqKXBtZDtcbi1cbi1cdCpsZXZlbCA9IFBHX0xFVkVMXzRLO1xuLVx0Km54IHw9IHBtZF9mbGFncygqcG1kKSBcdTAwMjYgX1BBR0VfTlg7XG4tXHQqcncgXHUwMDI2PSBwbWRfZmxhZ3MoKnBtZCkgXHUwMDI2IF9QQUdFX1JXO1xuLVxuLVx0cmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7XG4tfVxuLVxuLS8qXG4tICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC5cbi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLlxuLSAqL1xuLXB0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLVx0XHRcdCAgICAgdW5zaWduZWQgaW50ICpsZXZlbClcbi17XG4tXHRib29sIG54LCBydztcbi1cbi1cdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2QsIGFkZHJlc3MsIGxldmVsLCBcdTAwMjZueCwgXHUwMDI2cncpO1xuLX1cbi1cbi0vKlxuLSAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MuIFJldHVybiBhIHBvaW50ZXJcbi0gKiB0byB0aGUgZW50cnkgYW5kIHRoZSBsZXZlbCBvZiB0aGUgbWFwcGluZy5cbi0gKlxuLSAqIE5vdGU6IHRoZSBmdW5jdGlvbiByZXR1cm5zIHA0ZCwgcHVkIG9yIHBtZCBlaXRoZXIgd2hlbiB0aGUgZW50cnkgaXMgbWFya2VkXG4tICogbGFyZ2Ugb3Igd2hlbiB0aGUgcHJlc2VudCBiaXQgaXMgbm90IHNldC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgTlVMTC5cbi0gKi9cbi1wdGVfdCAqbG9va3VwX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgKmxldmVsKVxuLXtcbi1cdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX29mZnNldF9rKGFkZHJlc3MpLCBhZGRyZXNzLCBsZXZlbCk7XG4tfVxuLUVYUE9SVF9TWU1CT0xfR1BMKGxvb2t1cF9hZGRyZXNzKTtcbi1cbi1zdGF0aWMgcHRlX3QgKl9sb29rdXBfYWRkcmVzc19jcGEoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi1cdFx0XHRcdCAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KVxuLXtcbi1cdHBnZF90ICpwZ2Q7XG4tXG4tXHRpZiAoIWNwYS1cdTAwM2VwZ2QpXG4tXHRcdHBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTtcbi1cdGVsc2Vcbi1cdFx0cGdkID0gY3BhLVx1MDAzZXBnZCAmIzQzOyBwZ2RfaW5kZXgoYWRkcmVzcyk7XG4tXG4tXHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgbngsIHJ3KTtcbi19XG4tXG4gLypcbiAgKiBMb29rdXAgdGhlIFBNRCBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MuIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5XG4gICogb3IgTlVMTCBpZiBub3QgcHJlc2VudC5cbkBAIC04NTAsOSAmIzQzOzY1MSw5IEBAIHBtZF90ICpsb29rdXBfcG1kX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKVxuIHBoeXNfYWRkcl90IHNsb3dfdmlydF90b19waHlzKHZvaWQgKl9fdmlydF9hZGRyKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX192aXJ0X2FkZHI7XG4mIzQzO1x0ZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsO1xuIFx0cGh5c19hZGRyX3QgcGh5c19hZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBvZmZzZXQ7XG4tXHRlbnVtIHBnX2xldmVsIGxldmVsO1xuIFx0cHRlX3QgKnB0ZTtcbiBcbiBcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKHZpcnRfYWRkciwgXHUwMDI2bGV2ZWwpO1xuQEAgLTg2NCwxMSAmIzQzOzY2NSwxMSBAQCBwaHlzX2FkZHJfdCBzbG93X3ZpcnRfdG9fcGh5cyh2b2lkICpfX3ZpcnRfYWRkcilcbiBcdCAqIG1ha2UgMzItUEFFIGtlcm5lbCB3b3JrIGNvcnJlY3RseS5cbiBcdCAqL1xuIFx0c3dpdGNoIChsZXZlbCkge1xuLVx0Y2FzZSBQR19MRVZFTF8xRzpcbiYjNDM7XHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxuIFx0XHRwaHlzX2FkZHIgPSAocGh5c19hZGRyX3QpcHVkX3BmbigqKHB1ZF90ICopcHRlKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiBcdFx0b2Zmc2V0ID0gdmlydF9hZGRyIFx1MDAyNiB+UFVEX01BU0s7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSBQR19MRVZFTF8yTTpcbiYjNDM7XHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxuIFx0XHRwaHlzX2FkZHIgPSAocGh5c19hZGRyX3QpcG1kX3BmbigqKHBtZF90ICopcHRlKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiBcdFx0b2Zmc2V0ID0gdmlydF9hZGRyIFx1MDAyNiB+UE1EX01BU0s7XG4gXHRcdGJyZWFrO1xuQEAgLTkyNSwzMCAmIzQzOzcyNiwyNyBAQCBzdGF0aWMgcGdwcm90X3QgcGdwcm90X2NsZWFyX3Byb3Rub25lX2JpdHMocGdwcm90X3QgcHJvdClcbiBcdHJldHVybiBwcm90O1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi1cdFx0XHRcdCAgICAgc3RydWN0IGNwYV9kYXRhICpjcGEpXG4mIzQzO2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgbnVtcGFnZXMsIHBtYXNrLCBwc2l6ZSwgbHBhZGRyLCBwZm4sIG9sZF9wZm47XG4gXHRwZ3Byb3RfdCBvbGRfcHJvdCwgbmV3X3Byb3QsIHJlcV9wcm90LCBjaGtfcHJvdDtcbi1cdHB0ZV90IG5ld19wdGUsICp0bXA7XG4tXHRlbnVtIHBnX2xldmVsIGxldmVsO1xuLVx0Ym9vbCBueCwgcnc7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2sgZm9yIHJhY2VzLCBhbm90aGVyIENQVSBtaWdodCBoYXZlIHNwbGl0IHRoaXMgcGFnZVxuLVx0ICogdXAgYWxyZWFkeTpcbi1cdCAqL1xuLVx0dG1wID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFx1MDAyNmxldmVsLCBcdTAwMjZueCwgXHUwMDI2cncpO1xuLVx0aWYgKHRtcCAhPSBrcHRlKVxuLVx0XHRyZXR1cm4gMTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzLCBscGFkZHIsIHBmbiwgb2xkX3BmbjtcbiYjNDM7XHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cdTAwM2VsZXZlbDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC1cdTAwM2VhZGRyZXNzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBzZC1cdTAwM2Vwc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBtYXNrID0gc2QtXHUwMDNlcG1hc2s7XG4mIzQzO1x0cHRlX3QgKmtwdGUgPSBzZC1cdTAwM2VrcHRlO1xuJiM0MztcdGJvb2wgbnggPSBzZC1cdTAwM2VueDtcbiYjNDM7XHRib29sIHJ3ID0gc2QtXHUwMDNlcnc7XG4mIzQzO1x0cHRlX3QgbmV3X3B0ZTtcbiBcbiBcdHN3aXRjaCAobGV2ZWwpIHtcbi1cdGNhc2UgUEdfTEVWRUxfMk06XG4mIzQzO1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BNRDpcbiBcdFx0b2xkX3Byb3QgPSBwbWRfcGdwcm90KCoocG1kX3QgKilrcHRlKTtcbiBcdFx0b2xkX3BmbiA9IHBtZF9wZm4oKihwbWRfdCAqKWtwdGUpO1xuIFx0XHRjcGFfaW5jXzJtX2NoZWNrZWQoKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIFBHX0xFVkVMXzFHOlxuJiM0MztcdGNhc2UgUEdUQUJMRV9MRVZFTF9QVUQ6XG4gXHRcdG9sZF9wcm90ID0gcHVkX3BncHJvdCgqKHB1ZF90ICopa3B0ZSk7XG4gXHRcdG9sZF9wZm4gPSBwdWRfcGZuKCoocHVkX3QgKilrcHRlKTtcbiBcdFx0Y3BhX2luY18xZ19jaGVja2VkKCk7XG5AQCAtOTU3LDE4ICYjNDM7NzU1LDYgQEAgc3RhdGljIGludCBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuIFxuLVx0cHNpemUgPSBwYWdlX2xldmVsX3NpemUobGV2ZWwpO1xuLVx0cG1hc2sgPSBwYWdlX2xldmVsX21hc2sobGV2ZWwpO1xuLVxuLVx0Lypcbi1cdCAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzLCB3aGljaCBmaXQgaW50byB0aGlzIGxhcmdlXG4tXHQgKiBwYWdlIHN0YXJ0aW5nIGF0IGFkZHJlc3M6XG4tXHQgKi9cbi1cdGxwYWRkciA9IChhZGRyZXNzICYjNDM7IHBzaXplKSBcdTAwMjYgcG1hc2s7XG4tXHRudW1wYWdlcyA9IChscGFkZHIgLSBhZGRyZXNzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbi1cdGlmIChudW1wYWdlcyBcdTAwM2MgY3BhLVx1MDAzZW51bXBhZ2VzKVxuLVx0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbi1cbiBcdC8qXG4gXHQgKiBXZSBhcmUgc2FmZSBub3cuIENoZWNrIHdoZXRoZXIgdGhlIG5ldyBwZ3Byb3QgaXMgdGhlIHNhbWU6XG4gXHQgKiBDb252ZXJ0IHByb3RlY3Rpb24gYXR0cmlidXRlcyB0byA0ay1mb3JtYXQsIGFzIGNwYS1cdTAwM2VtYXNrKiBhcmUgc2V0XG5AQCAtMTA3MiwyMSAmIzQzOzg1OCw2IEBAIHN0YXRpYyBpbnQgX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuLXtcbi1cdGludCBkb19zcGxpdDtcbi1cbi1cdGlmIChjcGEtXHUwMDNlZm9yY2Vfc3BsaXQpXG4tXHRcdHJldHVybiAxO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbi1cdGRvX3NwbGl0ID0gX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShrcHRlLCBhZGRyZXNzLCBjcGEpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuLVxuLVx0cmV0dXJuIGRvX3NwbGl0O1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBzcGxpdF9zZXRfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIHBmbixcbiBcdFx0XHQgIHBncHJvdF90IHJlZl9wcm90LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICB1bnNpZ25lZCBsb25nIHNpemUpXG5AQCAtMTEyMywzMyAmIzQzOzg5NCwyMiBAQCBzdGF0aWMgdm9pZCBzcGxpdF9zZXRfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIHBmbixcbiBcdHNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgcmVmX3Byb3QpKTtcbiB9XG4gXG4tc3RhdGljIGludFxuLV9fc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi1cdFx0ICAgc3RydWN0IHB0ZGVzYyAqcHRkZXNjKVxuJiM0MztpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgbHBhZGRyLCBscGluYywgcmVmX3BmbiwgcGZuLCBwZm5pbmMgPSAxO1xuJiM0MztcdHN0cnVjdCBwdGRlc2MgKnB0ZGVzYyA9IHNkLVx1MDAzZXB0ZGVzYztcbiBcdHN0cnVjdCBwYWdlICpiYXNlID0gcHRkZXNjX3BhZ2UocHRkZXNjKTtcbiBcdHB0ZV90ICpwYmFzZSA9IChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhiYXNlKTtcbi1cdHVuc2lnbmVkIGludCBpLCBsZXZlbDtcbiYjNDM7XHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cdTAwM2VsZXZlbDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC1cdTAwM2VhZGRyZXNzO1xuJiM0MztcdHB0ZV90ICprcHRlID0gc2QtXHUwMDNla3B0ZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaTtcbiBcdHBncHJvdF90IHJlZl9wcm90O1xuLVx0Ym9vbCBueCwgcnc7XG4tXHRwdGVfdCAqdG1wO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbi1cdC8qXG4tXHQgKiBDaGVjayBmb3IgcmFjZXMsIGFub3RoZXIgQ1BVIG1pZ2h0IGhhdmUgc3BsaXQgdGhpcyBwYWdlXG4tXHQgKiB1cCBmb3IgdXMgYWxyZWFkeTpcbi1cdCAqL1xuLVx0dG1wID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFx1MDAyNmxldmVsLCBcdTAwMjZueCwgXHUwMDI2cncpO1xuLVx0aWYgKHRtcCAhPSBrcHRlKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbi1cdFx0cmV0dXJuIDE7XG4tXHR9XG4gXG4gXHRwYXJhdmlydF9hbGxvY19wdGUoXHUwMDI2aW5pdF9tbSwgcGFnZV90b19wZm4oYmFzZSkpO1xuIFxuIFx0c3dpdGNoIChsZXZlbCkge1xuLVx0Y2FzZSBQR19MRVZFTF8yTTpcbiYjNDM7XHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxuIFx0XHRyZWZfcHJvdCA9IHBtZF9wZ3Byb3QoKihwbWRfdCAqKWtwdGUpO1xuIFx0XHQvKlxuIFx0XHQgKiBDbGVhciBQU0UgKGFrYSBfUEFHRV9QQVQpIGFuZCBtb3ZlXG5AQCAtMTE2MSw3ICYjNDM7OTIxLDcgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0XHRscGluYyA9IFBBR0VfU0laRTtcbiBcdFx0YnJlYWs7XG4gXG4tXHRjYXNlIFBHX0xFVkVMXzFHOlxuJiM0MztcdGNhc2UgUEdUQUJMRV9MRVZFTF9QVUQ6XG4gXHRcdHJlZl9wcm90ID0gcHVkX3BncHJvdCgqKHB1ZF90ICopa3B0ZSk7XG4gXHRcdHJlZl9wZm4gPSBwdWRfcGZuKCoocHVkX3QgKilrcHRlKTtcbiBcdFx0cGZuaW5jID0gUE1EX1NJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG5AQCAtMTE3Nyw3ICYjNDM7OTM3LDYgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0XHRicmVhaztcbiBcbiBcdGRlZmF1bHQ6XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbiBcdFx0cmV0dXJuIDE7XG4gXHR9XG4gXG5AQCAtMTIyNSwyNiAmIzQzOzk4NCw2IEBAIF9fc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcdCAqIGp1c3Qgc3BsaXQgbGFyZ2UgcGFnZSBlbnRyeS5cbiBcdCAqL1xuIFx0Zmx1c2hfdGxiX2FsbCgpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuLVxuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBpbnQgc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsXG4tXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbi17XG4tXHRzdHJ1Y3QgcHRkZXNjICpwdGRlc2M7XG4tXG4tXHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbi1cdHB0ZGVzYyA9IHBhZ2V0YWJsZV9hbGxvYyhHRlBfS0VSTkVMLCAwKTtcbi1cdGlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbi1cdGlmICghcHRkZXNjKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdGlmIChfX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzLCBwdGRlc2MpKVxuLVx0XHRwYWdldGFibGVfZnJlZShwdGRlc2MpO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTEzMTQsNyAmIzQzOzEwNTMsNyBAQCBzdGF0aWMgaW50IGNvbGxhcHNlX3BtZF9wYWdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdH1cbiBcbiBcdGlmICh2aXJ0X2FkZHJfdmFsaWQoYWRkcikgXHUwMDI2XHUwMDI2IHBmbl9yYW5nZV9pc19tYXBwZWQocGZuLCBwZm4gJiM0MzsgMSkpXG4tXHRcdGNvbGxhcHNlX3BhZ2VfY291bnQoUEdfTEVWRUxfMk0pO1xuJiM0MztcdFx0Y29sbGFwc2VfcGFnZV9jb3VudChQR1RBQkxFX0xFVkVMX1BNRCk7XG4gXG4gXHRyZXR1cm4gMTtcbiB9XG5AQCAtMTM2MSw3ICYjNDM7MTEwMCw3IEBAIHN0YXRpYyBpbnQgY29sbGFwc2VfcHVkX3BhZ2UocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0c2V0X3B1ZChwdWQsIHBmbl9wdWQocGZuLCBwbWRfcGdwcm90KGZpcnN0KSkpO1xuIFxuIFx0aWYgKHZpcnRfYWRkcl92YWxpZChhZGRyKSBcdTAwMjZcdTAwMjYgcGZuX3JhbmdlX2lzX21hcHBlZChwZm4sIHBmbiAmIzQzOyAxKSlcbi1cdFx0Y29sbGFwc2VfcGFnZV9jb3VudChQR19MRVZFTF8xRyk7XG4mIzQzO1x0XHRjb2xsYXBzZV9wYWdlX2NvdW50KFBHVEFCTEVfTEVWRUxfUFVEKTtcbiBcbiBcdHJldHVybiAxO1xuIH1cbkBAIC0xODAwLDggJiM0MzsxNTM5LDggQEAgc3RhdGljIGludCBwb3B1bGF0ZV9wZ2Qoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcilcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXG4tXHRcdFx0ICAgICAgIGludCBwcmltYXJ5KVxuJiM0MztpbnQgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbiYjNDM7XHRcdFx0ICAgaW50IHByaW1hcnkpXG4ge1xuIFx0aWYgKGNwYS1cdTAwM2VwZ2QpIHtcbiBcdFx0LypcbkBAIC0xODMzLDcgJiM0MzsxNTcyLDcgQEAgc3RhdGljIGludCBfX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxuIFx0XHRjcGEtXHUwMDNlcGZuID0gX19wYSh2YWRkcikgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHJldHVybiAwO1xuIFxuLVx0fSBlbHNlIGlmIChfX2NwYV9wZm5faW5faGlnaG1hcChjcGEtXHUwMDNlcGZuKSkge1xuJiM0MztcdH0gZWxzZSBpZiAocGZuX2lzX2tlcm5lbChjcGEtXHUwMDNlcGZuKSkge1xuIFx0XHQvKiBGYXVsdHMgaW4gdGhlIGhpZ2htYXAgYXJlIE9LLCBzbyBkbyBub3Qgd2FybjogKi9cbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHR9IGVsc2Uge1xuQEAgLTE4NDUsOTAgJiM0MzsxNTg0LDQ1IEBAIHN0YXRpYyBpbnQgX19jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbiBcdH1cbiB9XG4gXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KVxuJiM0Mzt2b2lkIGFyY2hfY2hhbmdlX3B0ZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0ICAgICBwdGVfdCAqa3B0ZSwgcHRlX3Qgb2xkX3B0ZSwgYm9vbCBueCwgYm9vbCBydylcbiB7XG4tXHR1bnNpZ25lZCBsb25nIGFkZHJlc3M7XG4tXHRpbnQgZG9fc3BsaXQsIGVycjtcbi1cdHVuc2lnbmVkIGludCBsZXZlbDtcbi1cdHB0ZV90ICprcHRlLCBvbGRfcHRlO1xuLVx0Ym9vbCBueCwgcnc7XG4tXG4tXHRhZGRyZXNzID0gX19jcGFfYWRkcihjcGEsIGNwYS1cdTAwM2VjdXJwYWdlKTtcbi1yZXBlYXQ6XG4tXHRrcHRlID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFx1MDAyNmxldmVsLCBcdTAwMjZueCwgXHUwMDI2cncpO1xuLVx0aWYgKCFrcHRlKVxuLVx0XHRyZXR1cm4gX19jcGFfcHJvY2Vzc19mYXVsdChjcGEsIGFkZHJlc3MsIHByaW1hcnkpO1xuJiM0MztcdHB0ZV90IG5ld19wdGU7XG4mIzQzO1x0cGdwcm90X3Qgb2xkX3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpO1xuJiM0MztcdHBncHJvdF90IG5ld19wcm90ID0gcHRlX3BncHJvdChvbGRfcHRlKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XG4gXG4tXHRvbGRfcHRlID0gKmtwdGU7XG4tXHRpZiAocHRlX25vbmUob2xkX3B0ZSkpXG4tXHRcdHJldHVybiBfX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XG4mIzQzO1x0cGdwcm90X3ZhbChuZXdfcHJvdCkgXHUwMDI2PSB+cGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19jbHIpO1xuJiM0MztcdHBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfc2V0KTtcbiBcbi1cdGlmIChsZXZlbCA9PSBQR19MRVZFTF80Sykge1xuLVx0XHRwdGVfdCBuZXdfcHRlO1xuLVx0XHRwZ3Byb3RfdCBvbGRfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7XG4tXHRcdHBncHJvdF90IG5ld19wcm90ID0gcHRlX3BncHJvdChvbGRfcHRlKTtcbi1cdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKG9sZF9wdGUpO1xuLVxuLVx0XHRwZ3Byb3RfdmFsKG5ld19wcm90KSBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4tXHRcdHBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfc2V0KTtcbi1cbi1cdFx0Y3BhX2luY180a19pbnN0YWxsKCk7XG4tXHRcdC8qIEhhbmQgaW4gbHBzaXplID0gMCB0byBlbmZvcmNlIHRoZSBwcm90ZWN0aW9uIG1lY2hhbmlzbSAqL1xuLVx0XHRuZXdfcHJvdCA9IHN0YXRpY19wcm90ZWN0aW9ucyhuZXdfcHJvdCwgYWRkcmVzcywgcGZuLCAxLCAwLFxuLVx0XHRcdFx0XHQgICAgICBDUEFfUFJPVEVDVCk7XG4tXG4tXHRcdG5ld19wcm90ID0gdmVyaWZ5X3J3eChvbGRfcHJvdCwgbmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSxcbi1cdFx0XHRcdCAgICAgIG54LCBydyk7XG4mIzQzO1x0Y3BhX2luY180a19pbnN0YWxsKCk7XG4mIzQzO1x0LyogSGFuZCBpbiBscHNpemUgPSAwIHRvIGVuZm9yY2UgdGhlIHByb3RlY3Rpb24gbWVjaGFuaXNtICovXG4mIzQzO1x0bmV3X3Byb3QgPSBzdGF0aWNfcHJvdGVjdGlvbnMobmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgMCxcbiYjNDM7XHRcdFx0XHQgICAgICBDUEFfUFJPVEVDVCk7XG4gXG4tXHRcdG5ld19wcm90ID0gcGdwcm90X2NsZWFyX3Byb3Rub25lX2JpdHMobmV3X3Byb3QpO1xuJiM0MztcdG5ld19wcm90ID0gdmVyaWZ5X3J3eChvbGRfcHJvdCwgbmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgbngsIHJ3KTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2UgbmVlZCB0byBrZWVwIHRoZSBwZm4gZnJvbSB0aGUgZXhpc3RpbmcgUFRFLFxuLVx0XHQgKiBhZnRlciBhbGwgd2UmIzM5O3JlIG9ubHkgZ29pbmcgdG8gY2hhbmdlIGl0cyBhdHRyaWJ1dGVzXG4tXHRcdCAqIG5vdCB0aGUgbWVtb3J5IGl0IHBvaW50cyB0b1xuLVx0XHQgKi9cbi1cdFx0bmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7XG4tXHRcdGNwYS1cdTAwM2VwZm4gPSBwZm47XG4tXHRcdC8qXG4tXHRcdCAqIERvIHdlIHJlYWxseSBjaGFuZ2UgYW55dGhpbmcgP1xuLVx0XHQgKi9cbi1cdFx0aWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkge1xuLVx0XHRcdHNldF9wdGVfYXRvbWljKGtwdGUsIG5ld19wdGUpO1xuLVx0XHRcdGNwYS1cdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XG4tXHRcdH1cbi1cdFx0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9XG4mIzQzO1x0bmV3X3Byb3QgPSBwZ3Byb3RfY2xlYXJfcHJvdG5vbmVfYml0cyhuZXdfcHJvdCk7XG4gXG4gXHQvKlxuLVx0ICogQ2hlY2ssIHdoZXRoZXIgd2UgY2FuIGtlZXAgdGhlIGxhcmdlIHBhZ2UgaW50YWN0XG4tXHQgKiBhbmQganVzdCBjaGFuZ2UgdGhlIHB0ZTpcbi1cdCAqL1xuLVx0ZG9fc3BsaXQgPSBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShrcHRlLCBhZGRyZXNzLCBjcGEpO1xuLVx0Lypcbi1cdCAqIFdoZW4gdGhlIHJhbmdlIGZpdHMgaW50byB0aGUgZXhpc3RpbmcgbGFyZ2UgcGFnZSxcbi1cdCAqIHJldHVybi4gY3AtXHUwMDNlbnVtcGFnZXMgYW5kIGNwYS1cdTAwM2V0bGJmbHVzaCBoYXZlIGJlZW4gdXBkYXRlZCBpblxuLVx0ICogdHJ5X2xhcmdlX3BhZ2U6XG4mIzQzO1x0ICogV2UgbmVlZCB0byBrZWVwIHRoZSBwZm4gZnJvbSB0aGUgZXhpc3RpbmcgUFRFLCBhZnRlciBhbGwgd2UmIzM5O3JlIG9ubHlcbiYjNDM7XHQgKiBnb2luZyB0byBjaGFuZ2UgaXRzIGF0dHJpYnV0ZXMgbm90IHRoZSBtZW1vcnkgaXQgcG9pbnRzIHRvXG4gXHQgKi9cbi1cdGlmIChkb19zcGxpdCBcdTAwM2M9IDApXG4tXHRcdHJldHVybiBkb19zcGxpdDtcbi1cbiYjNDM7XHRuZXdfcHRlID0gcGZuX3B0ZShwZm4sIG5ld19wcm90KTtcbiYjNDM7XHRjcGEtXHUwMDNlcGZuID0gcGZuO1xuIFx0Lypcbi1cdCAqIFdlIGhhdmUgdG8gc3BsaXQgdGhlIGxhcmdlIHBhZ2U6XG4mIzQzO1x0ICogRG8gd2UgcmVhbGx5IGNoYW5nZSBhbnl0aGluZyA/XG4gXHQgKi9cbi1cdGVyciA9IHNwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRnb3RvIHJlcGVhdDtcbi1cbi1cdHJldHVybiBlcnI7XG4mIzQzO1x0aWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkge1xuJiM0MztcdFx0c2V0X3B0ZV9hdG9taWMoa3B0ZSwgbmV3X3B0ZSk7XG4mIzQzO1x0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuJiM0MztcdH1cbiB9XG4gXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpO1xuLVxuIC8qXG4gICogQ2hlY2sgdGhlIGRpcmVjdG1hcCBhbmQgXCYjMzQ7aGlnaCBrZXJuZWwgbWFwXCYjMzQ7ICYjMzk7YWxpYXNlcyYjMzk7LlxuICAqL1xuLXN0YXRpYyBpbnQgY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXG4mIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIHtcbiBcdHN0cnVjdCBjcGFfZGF0YSBhbGlhc19jcGE7XG4gXHR1bnNpZ25lZCBsb25nIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShjcGEtXHUwMDNlcGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKTtcbkBAIC0xOTQyLDcgJiM0MzsxNjM2LDcgQEAgc3RhdGljIGludCBjcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcbiBcdCAqIE5vIG5lZWQgdG8gcmVkbywgd2hlbiB0aGUgcHJpbWFyeSBjYWxsIHRvdWNoZWQgdGhlIGRpcmVjdFxuIFx0ICogbWFwcGluZyBhbHJlYWR5OlxuIFx0ICovXG4tXHR2YWRkciA9IF9fY3BhX2FkZHIoY3BhLCBjcGEtXHUwMDNlY3VycGFnZSk7XG4mIzQzO1x0dmFkZHIgPSBjcGFfYWRkcihjcGEsIGNwYS1cdTAwM2VjdXJwYWdlKTtcbiBcdGlmICghKHdpdGhpbih2YWRkciwgUEFHRV9PRkZTRVQsXG4gXHRcdCAgICBQQUdFX09GRlNFVCAmIzQzOyAobWF4X3Bmbl9tYXBwZWQgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkpIHtcbiBcbkBAIC0xOTcxLDcgJiM0MzsxNjY1LDcgQEAgc3RhdGljIGludCBjcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcbiBcdCAqIHRvIHRvdWNoIHRoZSBoaWdoIG1hcHBlZCBrZXJuZWwgYXMgd2VsbDpcbiBcdCAqL1xuIFx0aWYgKCF3aXRoaW4odmFkZHIsICh1bnNpZ25lZCBsb25nKV90ZXh0LCBfYnJrX2VuZCkgXHUwMDI2XHUwMDI2XG4tXHQgICAgX19jcGFfcGZuX2luX2hpZ2htYXAoY3BhLVx1MDAzZXBmbikpIHtcbiYjNDM7XHQgICAgcGZuX2lzX2tlcm5lbChjcGEtXHUwMDNlcGZuKSkge1xuIFx0XHR1bnNpZ25lZCBsb25nIHRlbXBfY3BhX3ZhZGRyID0gKGNwYS1cdTAwM2VwZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpICYjNDM7XG4gXHRcdFx0XHRcdCAgICAgICBfX1NUQVJUX0tFUk5FTF9tYXAgLSBwaHlzX2Jhc2U7XG4gXHRcdGFsaWFzX2NwYSA9ICpjcGE7XG5AQCAtMjAwMCwxNjggJiM0MzsxNjk0LDI1IEBAIHN0YXRpYyBpbnQgY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpXG4te1xuLVx0dW5zaWduZWQgbG9uZyBudW1wYWdlcyA9IGNwYS1cdTAwM2VudW1wYWdlcztcbi1cdHVuc2lnbmVkIGxvbmcgcmVtcGFnZXMgPSBudW1wYWdlcztcbi1cdGludCByZXQgPSAwO1xuLVxuLVx0Lypcbi1cdCAqIE5vIGNoYW5nZXMsIGVhc3khXG4tXHQgKi9cbi1cdGlmICghKHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfc2V0KSB8IHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfY2xyKSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgIWNwYS1cdTAwM2Vmb3JjZV9zcGxpdClcbi1cdFx0cmV0dXJuIHJldDtcbi1cbi1cdHdoaWxlIChyZW1wYWdlcykge1xuLVx0XHQvKlxuLVx0XHQgKiBTdG9yZSB0aGUgcmVtYWluaW5nIG5yIG9mIHBhZ2VzIGZvciB0aGUgbGFyZ2UgcGFnZVxuLVx0XHQgKiBwcmVzZXJ2YXRpb24gY2hlY2suXG4tXHRcdCAqL1xuLVx0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSByZW1wYWdlcztcbi1cdFx0LyogZm9yIGFycmF5IGNoYW5nZXMsIHdlIGNhbiYjMzk7dCB1c2UgbGFyZ2UgcGFnZSAqL1xuLVx0XHRpZiAoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiAoQ1BBX0FSUkFZIHwgQ1BBX1BBR0VTX0FSUkFZKSlcbi1cdFx0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSAxO1xuLVxuLVx0XHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXG4tXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbi1cdFx0cmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyKGNwYSwgcHJpbWFyeSk7XG4tXHRcdGlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSlcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZjcGFfbG9jayk7XG4tXHRcdGlmIChyZXQpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChwcmltYXJ5IFx1MDAyNlx1MDAyNiAhKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgQ1BBX05PX0NIRUNLX0FMSUFTKSkge1xuLVx0XHRcdHJldCA9IGNwYV9wcm9jZXNzX2FsaWFzKGNwYSk7XG4tXHRcdFx0aWYgKHJldClcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEFkanVzdCB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGVcbi1cdFx0ICogQ1BBIG9wZXJhdGlvbi4gRWl0aGVyIGEgbGFyZ2UgcGFnZSBoYXMgYmVlblxuLVx0XHQgKiBwcmVzZXJ2ZWQgb3IgYSBzaW5nbGUgcGFnZSB1cGRhdGUgaGFwcGVuZWQuXG4tXHRcdCAqL1xuLVx0XHRCVUdfT04oY3BhLVx1MDAzZW51bXBhZ2VzIFx1MDAzZSByZW1wYWdlcyB8fCAhY3BhLVx1MDAzZW51bXBhZ2VzKTtcbi1cdFx0cmVtcGFnZXMgLT0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuLVx0XHRjcGEtXHUwMDNlY3VycGFnZSAmIzQzOz0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuLVx0fVxuLVxuLW91dDpcbi1cdC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIG51bXBhZ2VzICovXG4tXHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbi1cdFx0XHRcdCAgICBwZ3Byb3RfdCBtYXNrX3NldCwgcGdwcm90X3QgbWFza19jbHIsXG4tXHRcdFx0XHQgICAgaW50IGZvcmNlX3NwbGl0LCBpbnQgaW5fZmxhZyxcbi1cdFx0XHRcdCAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKVxuIHtcbi1cdHN0cnVjdCBjcGFfZGF0YSBjcGE7XG4tXHRpbnQgcmV0LCBjYWNoZTtcbi1cbi1cdG1lbXNldChcdTAwMjZjcGEsIDAsIHNpemVvZihjcGEpKTtcbi1cbi1cdC8qXG4tXHQgKiBDaGVjaywgaWYgd2UgYXJlIHJlcXVlc3RlZCB0byBzZXQgYSBub3Qgc3VwcG9ydGVkXG4tXHQgKiBmZWF0dXJlLiAgQ2xlYXJpbmcgbm9uLXN1cHBvcnRlZCBmZWF0dXJlcyBpcyBPSy5cbi1cdCAqL1xuLVx0bWFza19zZXQgPSBjYW5vbl9wZ3Byb3QobWFza19zZXQpO1xuLVxuLVx0aWYgKCFwZ3Byb3RfdmFsKG1hc2tfc2V0KSBcdTAwMjZcdTAwMjYgIXBncHJvdF92YWwobWFza19jbHIpIFx1MDAyNlx1MDAyNiAhZm9yY2Vfc3BsaXQpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0LyogRW5zdXJlIHdlIGFyZSBQQUdFX1NJWkUgYWxpZ25lZCAqL1xuLVx0aWYgKGluX2ZsYWcgXHUwMDI2IENQQV9BUlJBWSkge1xuLVx0XHRpbnQgaTtcbi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdFx0aWYgKGFkZHJbaV0gXHUwMDI2IH5QQUdFX01BU0spIHtcbi1cdFx0XHRcdGFkZHJbaV0gXHUwMDI2PSBQQUdFX01BU0s7XG4tXHRcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHR9IGVsc2UgaWYgKCEoaW5fZmxhZyBcdTAwMjYgQ1BBX1BBR0VTX0FSUkFZKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBpbl9mbGFnIG9mIENQQV9QQUdFU19BUlJBWSBpbXBsaWVzIGl0IGlzIGFsaWduZWQuXG4tXHRcdCAqIE5vIG5lZWQgdG8gY2hlY2sgaW4gdGhhdCBjYXNlXG4tXHRcdCAqL1xuLVx0XHRpZiAoKmFkZHIgXHUwMDI2IH5QQUdFX01BU0spIHtcbi1cdFx0XHQqYWRkciBcdTAwMjY9IFBBR0VfTUFTSztcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFBlb3BsZSBzaG91bGQgbm90IGJlIHBhc3NpbmcgaW4gdW5hbGlnbmVkIGFkZHJlc3Nlczpcbi1cdFx0XHQgKi9cbi1cdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdH1cbi1cdH1cbi1cbi1cdC8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqL1xuLVx0a21hcF9mbHVzaF91bnVzZWQoKTtcbi1cbi1cdHZtX3VubWFwX2FsaWFzZXMoKTtcbi1cbi1cdGNwYS52YWRkciA9IGFkZHI7XG4tXHRjcGEucGFnZXMgPSBwYWdlcztcbi1cdGNwYS5udW1wYWdlcyA9IG51bXBhZ2VzO1xuLVx0Y3BhLm1hc2tfc2V0ID0gbWFza19zZXQ7XG4tXHRjcGEubWFza19jbHIgPSBtYXNrX2Nscjtcbi1cdGNwYS5mbGFncyA9IGluX2ZsYWc7XG4tXHRjcGEuY3VycGFnZSA9IDA7XG4tXHRjcGEuZm9yY2Vfc3BsaXQgPSBmb3JjZV9zcGxpdDtcbi1cbi1cdHJldCA9IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmNwYSwgMSk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2sgd2hldGhlciB3ZSByZWFsbHkgY2hhbmdlZCBzb21ldGhpbmc6XG4tXHQgKi9cbi1cdGlmICghKGNwYS5mbGFncyBcdTAwMjYgQ1BBX0ZMVVNIVExCKSlcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0aW50IGNhY2hlO1xuIFxuIFx0LypcbiBcdCAqIE5vIG5lZWQgdG8gZmx1c2gsIHdoZW4gd2UgZGlkIG5vdCBzZXQgYW55IG9mIHRoZSBjYWNoaW5nXG4gXHQgKiBhdHRyaWJ1dGVzOlxuIFx0ICovXG4tXHRjYWNoZSA9ICEhcGdwcm90MmNhY2hlbW9kZShtYXNrX3NldCk7XG4mIzQzO1x0Y2FjaGUgPSAhIXBncHJvdDJjYWNoZW1vZGUoY3BhLVx1MDAzZW1hc2tfc2V0KTtcbiBcbiBcdC8qXG4gXHQgKiBPbiBlcnJvcjsgZmx1c2ggZXZlcnl0aGluZyB0byBiZSBzdXJlLlxuIFx0ICovXG4tXHRpZiAocmV0KSB7XG4mIzQzO1x0aWYgKGVycikge1xuIFx0XHRjcGFfZmx1c2hfYWxsKGNhY2hlKTtcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRjcGFfZmx1c2goXHUwMDI2Y3BhLCBjYWNoZSk7XG4tb3V0OlxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXQodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxuLVx0XHRcdFx0ICAgICAgIHBncHJvdF90IG1hc2ssIGludCBhcnJheSlcbi17XG4tXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCxcbi1cdFx0KGFycmF5ID8gQ1BBX0FSUkFZIDogMCksIE5VTEwpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbi1cdFx0XHRcdFx0IHBncHJvdF90IG1hc2ssIGludCBhcnJheSlcbi17XG4tXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCxcbi1cdFx0KGFycmF5ID8gQ1BBX0FSUkFZIDogMCksIE5VTEwpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGludCBjcGFfc2V0X3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcyxcbi1cdFx0XHRcdCAgICAgICBwZ3Byb3RfdCBtYXNrKVxuLXtcbi1cdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxuLVx0XHRDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTtcbi19XG4tXG4tc3RhdGljIGlubGluZSBpbnQgY3BhX2NsZWFyX3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcyxcbi1cdFx0XHRcdFx0IHBncHJvdF90IG1hc2spXG4te1xuLVx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihOVUxMLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIG1hc2ssIDAsXG4tXHRcdENQQV9QQUdFU19BUlJBWSwgcGFnZXMpO1xuJiM0MztcdGNwYV9mbHVzaChjcGEsIGNhY2hlKTtcbiB9XG4gXG4gaW50IF9zZXRfbWVtb3J5X3VjKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuQEAgLTI3NzMsMTEgJiM0MzsyMzI0LDMgQEAgaW50IF9faW5pdCBrZXJuZWxfdW5tYXBfcGFnZXNfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcbiBcdHJldHVybiByZXR2YWw7XG4gfVxuLVxuLS8qXG4tICogVGhlIHRlc3RjYXNlcyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZG4mIzM5O3Rcbi0gKiBiZSBleHBvc2VkIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwuIEluY2x1ZGUgdGhlc2UgZGlyZWN0bHkgaGVyZS5cbi0gKi9cbi0jaWZkZWYgQ09ORklHX0NQQV9ERUJVR1xuLSNpbmNsdWRlIFwmIzM0O2NwYS10ZXN0LmNcJiMzNDtcbi0jZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaCBiL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oXG5pbmRleCAyOTgxZTM4NmRhN2IzYy4uZDFkZjgzNDU4NTJiZTggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmhcbkBAIC0xNzgyLDYgJiM0MzsxNzgyLDEwIEBAIHZvaWQgYXJjaF9zeW5jX2tlcm5lbF9tYXBwaW5ncyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7XG4gICogYmVjYXVzZSB0aGVzZSBtYWNyb3MgY2FuIGJlIHVzZWQgZXZlbiBpZiBDT05GSUdfTU1VIGlzIG5vdCBkZWZpbmVkLlxuICAqL1xuIFxuJiM0MzsjaWZuZGVmIGNhbm9uX3BncHJvdFxuJiM0MzsjZGVmaW5lIGNhbm9uX3BncHJvdChwcm90KVx0KHByb3QpXG4mIzQzOyNlbmRpZlxuJiM0MztcbiAjaWZuZGVmIHBncHJvdF9ueFxuICNkZWZpbmUgcGdwcm90X254KHByb3QpXHQocHJvdClcbiAjZW5kaWZcbkBAIC0yMTA1LDYgJiM0MzsyMTA5LDQ2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXG4gfVxuICNlbmRpZiAvKiBwdWRfd3JpdGUgKi9cbiBcbiYjNDM7I2lmbmRlZiBwNGRfd3JpdGVcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZClcbiYjNDM7e1xuJiM0MztcdEJVRygpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBwNGRfd3JpdGUgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgcG1kX2V4ZWNcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcG1kX2V4ZWMocG1kX3QgcG1kKVxuJiM0Mzt7XG4mIzQzO1x0QlVHKCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7I2VuZGlmIC8qIHBtZF9leGVjICovXG4mIzQzO1xuJiM0MzsjaWZuZGVmIHB1ZF9leGVjXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZClcbiYjNDM7e1xuJiM0MztcdEJVRygpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBwdWRfZXhlYyAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBwNGRfZXhlY1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXG4mIzQzO3tcbiYjNDM7XHRCVUcoKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MzsjZW5kaWYgLyogcDRkX2V4ZWMgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgcGdkX2V4ZWNcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcGdkX2V4ZWMocGdkX3QgcGdkKVxuJiM0Mzt7XG4mIzQzO1x0QlVHKCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7I2VuZGlmIC8qIHBnZF9leGVjICovXG4mIzQzO1xuICNpZiAhZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpIHx8IFxcXG4gXHQhZGVmaW5lZChDT05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRClcbiBzdGF0aWMgaW5saW5lIGludCBwdWRfdHJhbnNfaHVnZShwdWRfdCBwdWQpXG5AQCAtMjI5NSwxNiAmIzQzOzIzMzksMjAgQEAgc3RhdGljIGlubGluZSBib29sIGFyY2hfaGFzX3Bmbl9tb2RpZnlfY2hlY2sodm9pZClcbiB0eXBlZGVmIHVuc2lnbmVkIGludCBwZ3RibF9tb2RfbWFzaztcbiBcbiBlbnVtIHBndGFibGVfbGV2ZWwge1xuLVx0UEdUQUJMRV9MRVZFTF9QVEUgPSAwLFxuJiM0MztcdFBHVEFCTEVfTEVWRUxfTk9ORSA9IDAsXG4mIzQzO1x0UEdUQUJMRV9MRVZFTF9QVEUsXG4gXHRQR1RBQkxFX0xFVkVMX1BNRCxcbiBcdFBHVEFCTEVfTEVWRUxfUFVELFxuIFx0UEdUQUJMRV9MRVZFTF9QNEQsXG4gXHRQR1RBQkxFX0xFVkVMX1BHRCxcbiYjNDM7XHRQR1RBQkxFX0xFVkVMX05VTSxcbiB9O1xuIFxuIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqcGd0YWJsZV9sZXZlbF90b19zdHIoZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsKVxuIHtcbiBcdHN3aXRjaCAobGV2ZWwpIHtcbiYjNDM7XHRjYXNlIFBHVEFCTEVfTEVWRUxfTk9ORTpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDtub25lXCYjMzQ7O1xuIFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BURTpcbiBcdFx0cmV0dXJuIFwmIzM0O3B0ZVwmIzM0OztcbiBcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XG5AQCAtMjMyMCw2ICYjNDM7MjM2OCwyOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBndGFibGVfbGV2ZWxfdG9fc3RyKGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbClcbiBcdH1cbiB9XG4gXG4mIzQzOy8qIFNpemUgb2YgdGhlIG1lbW9yeSBtYXBwZWQgYnkgYSBzaW5nbGUgbGVhZiBlbnRyeSBhdCBAbGV2ZWwgKi9cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBndGFibGVfbGV2ZWxfc2l6ZShlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGxldmVsKSB7XG4mIzQzO1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BURTpcbiYjNDM7XHRcdHJldHVybiBQQUdFX1NJWkU7XG4mIzQzO1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BNRDpcbiYjNDM7XHRcdHJldHVybiBQTURfU0laRTtcbiYjNDM7XHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxuJiM0MztcdFx0cmV0dXJuIFBVRF9TSVpFO1xuJiM0MztcdGNhc2UgUEdUQUJMRV9MRVZFTF9QNEQ6XG4mIzQzO1x0XHRyZXR1cm4gUDREX1NJWkU7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBQR0RJUl9TSVpFO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBndGFibGVfbGV2ZWxfbWFzayhlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gfihwZ3RhYmxlX2xldmVsX3NpemUobGV2ZWwpIC0gMSk7XG4mIzQzO31cbiYjNDM7XG4gI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi9cbiBcbiAjaWYgIWRlZmluZWQoTUFYX1BPU1NJQkxFX1BIWVNNRU1fQklUUykgXHUwMDI2XHUwMDI2ICFkZWZpbmVkKENPTkZJR182NEJJVClcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NldF9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oXG5pbmRleCAzMDMwZDkyNDVmNWFjOC4uMTdjYmU2ZTI2Y2I3MzIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NldF9tZW1vcnkuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zZXRfbWVtb3J5LmhcbkBAIC04NCw0ICYjNDM7ODQsMTAxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHNldF9tZW1vcnlfZGVjcnlwdGVkKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIH1cbiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfSEFTX01FTV9FTkNSWVBUICovXG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZ3RhYmxlLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ1BBX0ZMVVNIVExCIDFcbiYjNDM7I2RlZmluZSBDUEFfQVJSQVkgMlxuJiM0MzsjZGVmaW5lIENQQV9QQUdFU19BUlJBWSA0XG4mIzQzOyNkZWZpbmUgQ1BBX05PX0NIRUNLX0FMSUFTIDggLyogRG8gbm90IHNlYXJjaCBmb3IgYWxpYXNlcyAqL1xuJiM0MzsjZGVmaW5lIENQQV9DT0xMQVBTRSAxNiAvKiB0cnkgdG8gY29sbGFwc2UgbGFyZ2UgcGFnZXMgKi9cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBjdXJyZW50IGZsdXNoaW5nIGNvbnRleHQgLSB3ZSBwYXNzIGl0IGluc3RlYWQgb2YgNSBhcmd1bWVudHM6XG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgY3BhX2RhdGEge1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdCp2YWRkcjtcbiYjNDM7XHRwZ2RfdFx0XHQqcGdkO1xuJiM0MztcdHBncHJvdF90XHRtYXNrX3NldDtcbiYjNDM7XHRwZ3Byb3RfdFx0bWFza19jbHI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZ1x0bnVtcGFnZXM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZ1x0Y3VycGFnZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRwZm47XG4mIzQzO1x0dW5zaWduZWQgaW50XHRmbGFncztcbiYjNDM7XHR1bnNpZ25lZCBpbnRcdGZvcmNlX3NwbGl0XHRcdDogMSxcbiYjNDM7XHRcdFx0Zm9yY2Vfc3RhdGljX3Byb3RcdDogMSxcbiYjNDM7XHRcdFx0Zm9yY2VfZmx1c2hfYWxsXHRcdDogMTtcbiYjNDM7XHRzdHJ1Y3QgcGFnZVx0KipwYWdlcztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIGNvbnRleHQgZm9yIGNoZWNraW5nIGZvciBhIHNwbGl0IGEgbGFyZ2UgcGFnZSBhbmQgc3BsaXR0aW5nIGl0IGlmIHJlcXVpcmVkLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHB0ZGVzYztcbiYjNDM7c3RydWN0IGNwYV9zcGxpdF9kYXRhIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRhZGRyZXNzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdHBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdHBtYXNrO1xuJiM0MztcdHB0ZV90XHRcdCprcHRlO1xuJiM0MztcdHN0cnVjdCBwdGRlc2NcdCpwdGRlc2M7XG4mIzQzO1x0ZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsO1xuJiM0MztcdGJvb2xcdFx0bng7XG4mIzQzO1x0Ym9vbFx0XHRydztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgY3BhX2FkZHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgaWR4KTtcbiYjNDM7XG4mIzQzO3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpO1xuJiM0MztwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiYjNDM7XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKTtcbiYjNDM7cHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGludCAqbGV2ZWwsIGJvb2wgKm54LCBib29sICpydyk7XG4mIzQzO1xuJiM0MztpbnQgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbiYjNDM7XHRcdFx0ICAgaW50IHByaW1hcnkpO1xuJiM0MztpbnQgYXJjaF9jcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSk7XG4mIzQzO2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKTtcbiYjNDM7aW50IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZCk7XG4mIzQzO3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHQgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KTtcbiYjNDM7dm9pZCBhcmNoX2NwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGVycik7XG4mIzQzO1xuJiM0MztpbnQgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KTtcbiYjNDM7aW50IGNoYW5nZV9wYWdlX2F0dHJfc2V0X2Nscih1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdCAgICAgcGdwcm90X3QgbWFza19zZXQsIHBncHJvdF90IG1hc2tfY2xyLFxuJiM0MztcdFx0XHQgICAgIGludCBmb3JjZV9zcGxpdCwgaW50IGluX2ZsYWcsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IHBhZ2UgKipwYWdlcyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldCh1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHBncHJvdF90IG1hc2ssIGludCBhcnJheSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxuJiM0MztcdFx0KGFycmF5ID8gQ1BBX0FSUkFZIDogMCksIE5VTEwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbiYjNDM7XHRcdFx0XHRcdCBwZ3Byb3RfdCBtYXNrLCBpbnQgYXJyYXkpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCxcbiYjNDM7XHRcdChhcnJheSA/IENQQV9BUlJBWSA6IDApLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3BhX3NldF9wYWdlc19hcnJheShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdFx0ICAgICAgcGdwcm90X3QgbWFzaylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxuJiM0MztcdFx0Q1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNwYV9jbGVhcl9wYWdlc19hcnJheShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsXG4mIzQzO1x0XHRcdFx0XHRwZ3Byb3RfdCBtYXNrKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihOVUxMLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIG1hc2ssIDAsXG4mIzQzO1x0XHRDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmIC8qIENPTkZJR19HRU5FUklDX1NFVF9NRU1PUlkgKi9cbiYjNDM7XG4gI2VuZGlmIC8qIF9MSU5VWF9TRVRfTUVNT1JZX0hfICovXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWdcbmluZGV4IDllMGNhNDgyNDkwNTRmLi41NDFlZGQxZTExYjYxMCAxMDA2NDRcbi0tLSBhL21tL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL21tL0tjb25maWdcbkBAIC0xNTA5LDYgJiM0MzsxNTA5LDkgQEAgY29uZmlnIExBWllfTU1VX01PREVfS1VOSVRfVEVTVFxuIFxuIFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIFxuJiM0Mztjb25maWcgR0VORVJJQ19TRVRfTUVNT1JZXG4mIzQzO1x0Ym9vbFxuJiM0MztcbiBzb3VyY2UgXCYjMzQ7bW0vZGFtb24vS2NvbmZpZ1wmIzM0O1xuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuaW5kZXggOTFiM2UwMjdiNzUzNTcuLjgzY2ZlZjZiMmQ4Y2ZiIDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZy5kZWJ1Z1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZy5kZWJ1Z1xuQEAgLTMyMCwzICYjNDM7MzIwLDEwIEBAIGNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcbiBcdCAgb3ZlcmhlYWQgaW4gdGhlIHBhZ2UgZmF1bHQgcGF0aC5cbiBcbiBcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxuJiM0MztcbiYjNDM7Y29uZmlnIENQQV9ERUJVR1xuJiM0MztcdGJvb2wgXCYjMzQ7Q1BBIHNlbGYtdGVzdCBjb2RlXCYjMzQ7XG4mIzQzO1x0ZGVwZW5kcyBvbiBHRU5FUklDX1NFVF9NRU1PUllcbiYjNDM7XHRkZXBlbmRzIG9uIERFQlVHX0tFUk5FTFxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIERvIGNoYW5nZV9wYWdlX2F0dHIoKSBzZWxmLXRlc3RzIGV2ZXJ5IDMwIHNlY29uZHMuXG5kaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZVxuaW5kZXggZWZmOWY5ZTdlMDYxYzEuLmUzZjZjMzljMmJhOTkxIDEwMDY0NFxuLS0tIGEvbW0vTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL21tL01ha2VmaWxlXG5AQCAtMTQ3LDMgJiM0MzsxNDcsNCBAQCBvYmotJChDT05GSUdfU0hSSU5LRVJfREVCVUcpICYjNDM7PSBzaHJpbmtlcl9kZWJ1Zy5vXG4gb2JqLSQoQ09ORklHX0VYRUNNRU0pICYjNDM7PSBleGVjbWVtLm9cbiBvYmotJChDT05GSUdfVE1QRlNfUVVPVEEpICYjNDM7PSBzaG1lbV9xdW90YS5vXG4gb2JqLSQoQ09ORklHX0xBWllfTU1VX01PREVfS1VOSVRfVEVTVCkgJiM0Mzs9IHRlc3RzL2xhenlfbW11X21vZGVfa3VuaXQub1xuJiM0MztvYmotJChDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZKSAmIzQzOz0gc2V0X21lbW9yeS5vXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0L2NwYS10ZXN0LmMgYi9tbS9jcGEtdGVzdC5jXG5zaW1pbGFyaXR5IGluZGV4IDgwJVxucmVuYW1lIGZyb20gYXJjaC94ODYvbW0vcGF0L2NwYS10ZXN0LmNcbnJlbmFtZSB0byBtbS9jcGEtdGVzdC5jXG5pbmRleCBhZDNjMWZlZWM5OTBkYi4uNjNjMzQ2M2E1YTdkODUgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9tbS9wYXQvY3BhLXRlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vY3BhLXRlc3QuY1xuQEAgLTEzLDMyICYjNDM7MTMsMjQgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXHUwMDNjYXNtL2NhY2hlZmx1c2guaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2FzbS9rZGVidWcuaFx1MDAzZVxuLVxuIC8qXG4gICogT25seSBwcmludCB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgcGFzczpcbiAgKi9cbiBzdGF0aWMgX19yZWFkX21vc3RseSBpbnQgcHJpbnQgPSAxO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfdGVzdF9wZm47XG4gXG4gZW51bSB7XG4gXHROVEVTVFx0XHRcdD0gMyAqIDEwMCxcbiBcdE5QQUdFU1x0XHRcdD0gMTAwLFxuLSNpZmRlZiBDT05GSUdfWDg2XzY0XG4tXHRMUFNcdFx0XHQ9ICgxIFx1MDAzY1x1MDAzYyBQTURfU0hJRlQpLFxuLSNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl9QQUUpXG4tXHRMUFNcdFx0XHQ9ICgxIFx1MDAzY1x1MDAzYyBQTURfU0hJRlQpLFxuLSNlbHNlXG4tXHRMUFNcdFx0XHQ9ICgxIFx1MDAzY1x1MDAzYyAyMiksXG4tI2VuZGlmXG4tXHRHUFNcdFx0XHQ9ICgxXHUwMDNjXHUwMDNjMzApXG4mIzQzO1x0TFBTXHRcdFx0PSBQTURfU0laRSxcbiYjNDM7XHRHUFNcdFx0XHQ9IFBVRF9TSVpFXG4gfTtcbiBcbi0jZGVmaW5lIFBBR0VfQ1BBX1RFU1RcdF9fcGdwcm90KF9QQUdFX0NQQV9URVNUKVxuJiM0MzsjZGVmaW5lIFBBR0VfQ1BBX1RFU1RcdF9fcGdwcm90KF9QQUdFX1NQRUNJQUwpXG4gXG4gc3RhdGljIGludCBwdGVfdGVzdGJpdChwdGVfdCBwdGUpXG4ge1xuLVx0cmV0dXJuIHB0ZV9mbGFncyhwdGUpIFx1MDAyNiBfUEFHRV9TT0ZUVzE7XG4mIzQzO1x0cmV0dXJuIHB0ZV9zcGVjaWFsKHB0ZSk7XG4gfVxuIFxuIHN0cnVjdCBzcGxpdF9zdGF0ZSB7XG5AQCAtNTQsMTAgJiM0Mzs0NiwxMCBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcbiBcdHMtXHUwMDNlbHBnID0gcy1cdTAwM2VncGcgPSBzLVx1MDAzZXNwZyA9IHMtXHUwMDNlZXhlYyA9IDA7XG4gXHRzLVx1MDAzZW1pbl9leGVjID0gfjBVTDtcbiBcdHMtXHUwMDNlbWF4X2V4ZWMgPSAwO1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X3Bmbl9tYXBwZWQ7ICkge1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF90ZXN0X3BmbjsgKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmEoaSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCk7XG4gXHRcdHVuc2lnbmVkIGludCBsZXZlbDtcbi1cdFx0cHRlX3QgKnB0ZTtcbiYjNDM7XHRcdHB0ZV90ICpwdGUsIHB0ZXZhbDtcbiBcbiBcdFx0cHRlID0gbG9va3VwX2FkZHJlc3MoYWRkciwgXHUwMDI2bGV2ZWwpO1xuIFx0XHRpZiAoIXB0ZSkge1xuQEAgLTY1LDE1ICYjNDM7NTcsMTYgQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpXG4gXHRcdFx0aSYjNDM7JiM0Mzs7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbiYjNDM7XHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB0ZSk7XG4gXG4tXHRcdGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRyBcdTAwMjZcdTAwMjYgc2l6ZW9mKGxvbmcpID09IDgpIHtcbiYjNDM7XHRcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRCBcdTAwMjZcdTAwMjYgc2l6ZW9mKGxvbmcpID09IDgpIHtcbiBcdFx0XHRzLVx1MDAzZWdwZyYjNDM7JiM0Mzs7XG4gXHRcdFx0aSAmIzQzOz0gR1BTL1BBR0VfU0laRTtcbi1cdFx0fSBlbHNlIGlmIChsZXZlbCA9PSBQR19MRVZFTF8yTSkge1xuLVx0XHRcdGlmICgocHRlX3ZhbCgqcHRlKSBcdTAwMjYgX1BBR0VfUFJFU0VOVCkgXHUwMDI2XHUwMDI2ICEocHRlX3ZhbCgqcHRlKSBcdTAwMjYgX1BBR0VfUFNFKSkge1xuJiM0MztcdFx0fSBlbHNlIGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRCkge1xuJiM0MztcdFx0XHRpZiAocHRlX3ByZXNlbnQocHRldmFsKSBcdTAwMjZcdTAwMjYgIXB0ZV9odWdlKHB0ZXZhbCkpIHtcbiBcdFx0XHRcdHByaW50ayhLRVJOX0VSUlxuLVx0XHRcdFx0XHRcJiMzNDslbHggbGV2ZWwgJWQgYnV0IG5vdCBQU0UgJUx4XFxuXCYjMzQ7LFxuLVx0XHRcdFx0XHRhZGRyLCBsZXZlbCwgKHU2NClwdGVfdmFsKCpwdGUpKTtcbiYjNDM7XHRcdFx0XHRcdFwmIzM0OyVseCBsZXZlbCAlZCBidXQgbm90IGxlYWYgJUx4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0YWRkciwgbGV2ZWwsICh1NjQpcHRlX3ZhbChwdGV2YWwpKTtcbiBcdFx0XHRcdGVyciA9IDE7XG4gXHRcdFx0fVxuIFx0XHRcdHMtXHUwMDNlbHBnJiM0MzsmIzQzOztcbkBAIC04Miw3ICYjNDM7NzUsNyBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcbiBcdFx0XHRzLVx1MDAzZXNwZyYjNDM7JiM0Mzs7XG4gXHRcdFx0aSYjNDM7JiM0Mzs7XG4gXHRcdH1cbi1cdFx0aWYgKCEocHRlX3ZhbCgqcHRlKSBcdTAwMjYgX1BBR0VfTlgpKSB7XG4mIzQzO1x0XHRpZiAocHRlX2V4ZWMocHRldmFsKSkge1xuIFx0XHRcdHMtXHUwMDNlZXhlYyYjNDM7JiM0Mzs7XG4gXHRcdFx0aWYgKGFkZHIgXHUwMDNjIHMtXHUwMDNlbWluX2V4ZWMpXG4gXHRcdFx0XHRzLVx1MDAzZW1pbl9leGVjID0gYWRkcjtcbkBAIC0xMDAsOCAmIzQzOzkzLDggQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpXG4gXG4gXHRleHBlY3RlZCA9IChzLVx1MDAzZWdwZypHUFMgJiM0Mzsgcy1cdTAwM2VscGcqTFBTKS9QQUdFX1NJWkUgJiM0Mzsgcy1cdTAwM2VzcGcgJiM0MzsgbWlzc2VkO1xuIFx0aWYgKGV4cGVjdGVkICE9IGkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O0NQQSBtYXhfcGZuX21hcHBlZCAlbHUgYnV0IGV4cGVjdGVkICVsdVxcblwmIzM0Oyxcbi1cdFx0XHRtYXhfcGZuX21hcHBlZCwgZXhwZWN0ZWQpO1xuJiM0MztcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O0NQQSBtYXhfdGVzdF9wZm4gJWx1IGJ1dCBleHBlY3RlZCAlbHVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdG1heF90ZXN0X3BmbiwgZXhwZWN0ZWQpO1xuIFx0XHRyZXR1cm4gMTtcbiBcdH1cbiBcdHJldHVybiBlcnI7XG5AQCAtMTE4LDcgJiM0MzsxMTEsNyBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiB7XG4gXHRzdHJ1Y3Qgc3BsaXRfc3RhdGUgc2EsIHNiLCBzYztcbiBcdHVuc2lnbmVkIGxvbmcgKmJtO1xuLVx0cHRlX3QgKnB0ZSwgcHRlMDtcbiYjNDM7XHRwdGVfdCAqcHRlLCBwdGUwLCBwdGVfdmFsO1xuIFx0aW50IGZhaWxlZCA9IDA7XG4gXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XG4gXHRpbnQgaSwgaztcbkBAIC0xMjcsNyAmIzQzOzEyMCw3IEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKVxuIFx0aWYgKHByaW50KVxuIFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O0NQQSBzZWxmLXRlc3Q6XFxuXCYjMzQ7KTtcbiBcbi1cdGJtID0gdnphbGxvYygobWF4X3Bmbl9tYXBwZWQgJiM0MzsgNykgLyA4KTtcbiYjNDM7XHRibSA9IHZ6YWxsb2MoKG1heF90ZXN0X3BmbiAmIzQzOyA3KSAvIDgpO1xuIFx0aWYgKCFibSkge1xuIFx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7Q1BBIENhbm5vdCB2bWFsbG9jIGJpdG1hcFxcblwmIzM0Oyk7XG4gXHRcdHJldHVybiAtRU5PTUVNO1xuQEAgLTEzNiwxMSAmIzQzOzEyOSwxMSBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiBcdGZhaWxlZCAmIzQzOz0gcHJpbnRfc3BsaXQoXHUwMDI2c2EpO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlRFU1Q7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gZ2V0X3JhbmRvbV91MzJfYmVsb3cobWF4X3Bmbl9tYXBwZWQpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhtYXhfdGVzdF9wZm4pO1xuIFxuIFx0XHRhZGRyW2ldID0gKHVuc2lnbmVkIGxvbmcpX192YShwZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpO1xuIFx0XHRsZW5baV0gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhOUEFHRVMpO1xuLVx0XHRsZW5baV0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW5baV0sIG1heF9wZm5fbWFwcGVkIC0gcGZuIC0gMSk7XG4mIzQzO1x0XHRsZW5baV0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW5baV0sIG1heF90ZXN0X3BmbiAtIHBmbiAtIDEpO1xuIFxuIFx0XHRpZiAobGVuW2ldID09IDApXG4gXHRcdFx0bGVuW2ldID0gMTtcbkBAIC0xNTAsMTUgJiM0MzsxNDMsMjAgQEAgc3RhdGljIGludCBwYWdlYXR0cl90ZXN0KHZvaWQpXG4gXG4gXHRcdGZvciAoayA9IDA7IGsgXHUwMDNjIGxlbltpXTsgayYjNDM7JiM0MzspIHtcbiBcdFx0XHRwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldICYjNDM7IGsqUEFHRV9TSVpFLCBcdTAwMjZsZXZlbCk7XG4tXHRcdFx0aWYgKCFwdGUgfHwgcGdwcm90X3ZhbChwdGVfcGdwcm90KCpwdGUpKSA9PSAwIHx8XG4tXHRcdFx0ICAgICEocHRlX3ZhbCgqcHRlKSBcdTAwMjYgX1BBR0VfUFJFU0VOVCkpIHtcbiYjNDM7XHRcdFx0aWYgKCFwdGUpIHtcbiYjNDM7XHRcdFx0XHRhZGRyW2ldID0gMDtcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRwdGVfdmFsID0gcHRlcF9nZXQocHRlKTtcbiYjNDM7XHRcdFx0aWYgKHBncHJvdF92YWwocHRlX3BncHJvdChwdGVfdmFsKSkgPT0gMCB8fFxuJiM0MztcdFx0XHQgICAgIXB0ZV9wcmVzZW50KHB0ZV92YWwpKSB7XG4gXHRcdFx0XHRhZGRyW2ldID0gMDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0XHRpZiAoayA9PSAwKSB7XG4tXHRcdFx0XHRwdGUwID0gKnB0ZTtcbiYjNDM7XHRcdFx0XHRwdGUwID0gcHRlX3ZhbDtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aWYgKHBncHJvdF92YWwocHRlX3BncHJvdCgqcHRlKSkgIT1cbiYjNDM7XHRcdFx0XHRpZiAocGdwcm90X3ZhbChwdGVfcGdwcm90KHB0ZV92YWwpKSAhPVxuIFx0XHRcdFx0XHRwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlMCkpKSB7XG4gXHRcdFx0XHRcdGxlbltpXSA9IGs7XG4gXHRcdFx0XHRcdGJyZWFrO1xuQEAgLTE5OCwxMiAmIzQzOzE5NiwxMiBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiBcdFx0fVxuIFxuIFx0XHRwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldLCBcdTAwMjZsZXZlbCk7XG4tXHRcdGlmICghcHRlIHx8ICFwdGVfdGVzdGJpdCgqcHRlKSB8fCBwdGVfaHVnZSgqcHRlKSkge1xuJiM0MztcdFx0aWYgKCFwdGUgfHwgIXB0ZV90ZXN0Yml0KCpwdGUpIHx8IGxldmVsICE9IFBHVEFCTEVfTEVWRUxfUFRFKSB7XG4gXHRcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O0NQQSAlbHg6IGJhZCBwdGUgJUx4XFxuXCYjMzQ7LCBhZGRyW2ldLFxuIFx0XHRcdFx0cHRlID8gKHU2NClwdGVfdmFsKCpwdGUpIDogMFVMTCk7XG4gXHRcdFx0ZmFpbGVkJiM0MzsmIzQzOztcbiBcdFx0fVxuLVx0XHRpZiAobGV2ZWwgIT0gUEdfTEVWRUxfNEspIHtcbiYjNDM7XHRcdGlmIChsZXZlbCAhPSBQR1RBQkxFX0xFVkVMX1BURSkge1xuIFx0XHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDtDUEEgJWx4OiB1bmV4cGVjdGVkIGxldmVsICVkXFxuXCYjMzQ7LFxuIFx0XHRcdFx0YWRkcltpXSwgbGV2ZWwpO1xuIFx0XHRcdGZhaWxlZCYjNDM7JiM0Mzs7XG5AQCAtMjY2LDYgJiM0MzsyNjQsOCBAQCBzdGF0aWMgaW50IHN0YXJ0X3BhZ2VhdHRyX3Rlc3Qodm9pZClcbiB7XG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7XG4gXG4mIzQzO1x0bWF4X3Rlc3RfcGZuID0gUEZOX0RPV04oX19wYShoaWdoX21lbW9yeSAtIDEpKTtcbiYjNDM7XG4gXHRwID0ga3RocmVhZF9jcmVhdGUoZG9fcGFnZWF0dHJfdGVzdCwgTlVMTCwgXCYjMzQ7cGFnZWF0dHItdGVzdFwmIzM0Oyk7XG4gXHRpZiAoIUlTX0VSUihwKSlcbiBcdFx0d2FrZV91cF9wcm9jZXNzKHApO1xuZGlmZiAtLWdpdCBhL21tL3NldF9tZW1vcnkuYyBiL21tL3NldF9tZW1vcnkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43NDQ0MDVlZmNjMzQwMVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc2V0X21lbW9yeS5jXG5AQCAtMCwwICYjNDM7MSwzOTYgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZ3RhYmxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0LmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NldF9tZW1vcnkuaFx1MDAzZVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2VyaWFsaXplIGNwYSgpIHNvIHRoYXQgd2UgZG9uJiMzOTt0IGFsbG93IGFueSBvdGhlciBjcHUsIHdpdGggc3RhbGUgbGFyZ2UgdGxiXG4mIzQzOyAqIGVudHJpZXMsIHRvIGNoYW5nZSB0aGUgcGFnZSBhdHRyaWJ1dGUgaW4gcGFyYWxsZWwgdG8gc29tZSBvdGhlciBjcHVcbiYjNDM7ICogc3BsaXR0aW5nIGEgbGFyZ2UgcGFnZSBlbnRyeSBhbG9uZyB3aXRoIGNoYW5naW5nIHRoZSBhdHRyaWJ1dGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwYV9sb2NrKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2sodm9pZClcbiYjNDM7e1xuJiM0MzsjaWZkZWYgQ09ORklHX1g4NlxuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZwZ2RfbG9jayk7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF91bmxvY2sodm9pZClcbiYjNDM7e1xuJiM0MzsjaWZkZWYgQ09ORklHX1g4NlxuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbiYjNDM7I2VuZGlmXG4mIzQzO31cbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgY3BhX2FkZHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgaWR4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgQ1BBX1BBR0VTX0FSUkFZKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwYS1cdTAwM2VwYWdlc1tpZHhdO1xuJiM0MztcbiYjNDM7XHRcdGlmICh1bmxpa2VseShQYWdlSGlnaE1lbShwYWdlKSkpXG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRcdHJldHVybiAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiBDUEFfQVJSQVkpXG4mIzQzO1x0XHRyZXR1cm4gY3BhLVx1MDAzZXZhZGRyW2lkeF07XG4mIzQzO1xuJiM0MztcdHJldHVybiAqY3BhLVx1MDAzZXZhZGRyICYjNDM7IGlkeCAqIFBBR0VfU0laRTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC5cbiYjNDM7ICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgKG9yIE5VTEwgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0KSxcbiYjNDM7ICogdGhlIGxldmVsIG9mIHRoZSBlbnRyeSwgYW5kIHRoZSBlZmZlY3RpdmUgTlggYW5kIFJXIGJpdHMgb2YgYWxsXG4mIzQzOyAqIHBhZ2UgdGFibGUgbGV2ZWxzLlxuJiM0MzsgKi9cbiYjNDM7cHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZF90ICpwZ2RwLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpXG4mIzQzO3tcbiYjNDM7XHRwZ2RfdCBwZ2QgPSBwZ2RwX2dldChwZ2RwKTtcbiYjNDM7XHRwNGRfdCAqcDRkcCwgcDRkO1xuJiM0MztcdHB1ZF90ICpwdWRwLCBwdWQ7XG4mIzQzO1x0cG1kX3QgKnBtZHAsIHBtZDtcbiYjNDM7XG4mIzQzO1x0KmxldmVsID0gUEdUQUJMRV9MRVZFTF9QR0Q7XG4mIzQzO1x0Km54ID0gZmFsc2U7XG4mIzQzO1x0KnJ3ID0gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBnZF9ub25lKHBnZCkpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0KmxldmVsID0gUEdUQUJMRV9MRVZFTF9QNEQ7XG4mIzQzO1x0Km54IHw9ICFwZ2RfZXhlYyhwZ2QpO1xuJiM0MztcdCpydyBcdTAwMjY9ICEhKHBnZF93cml0ZShwZ2QpKTtcbiYjNDM7XG4mIzQzO1x0cDRkcCA9IHA0ZF9vZmZzZXQocGdkcCwgYWRkcmVzcyk7XG4mIzQzO1x0cDRkID0gcDRkcF9nZXQocDRkcCk7XG4mIzQzO1x0aWYgKHA0ZF9ub25lKHA0ZCkpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKHA0ZF9sZWFmKHA0ZCkgfHwgIXA0ZF9wcmVzZW50KHA0ZCkpXG4mIzQzO1x0XHRyZXR1cm4gKHB0ZV90ICopcDRkcDtcbiYjNDM7XG4mIzQzO1x0KmxldmVsID0gUEdUQUJMRV9MRVZFTF9QVUQ7XG4mIzQzO1x0Km54IHw9ICFwNGRfZXhlYyhwNGQpO1xuJiM0MztcdCpydyBcdTAwMjY9ICEhKHA0ZF93cml0ZShwNGQpKTtcbiYjNDM7XG4mIzQzO1x0cHVkcCA9IHB1ZF9vZmZzZXQocDRkcCwgYWRkcmVzcyk7XG4mIzQzO1x0cHVkID0gcHVkcF9nZXQocHVkcCk7XG4mIzQzO1x0aWYgKHB1ZF9ub25lKHB1ZCkpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKHB1ZF9sZWFmKHB1ZCkgfHwgIXB1ZF9wcmVzZW50KHB1ZCkpXG4mIzQzO1x0XHRyZXR1cm4gKHB0ZV90ICopcHVkcDtcbiYjNDM7XG4mIzQzO1x0KmxldmVsID0gUEdUQUJMRV9MRVZFTF9QTUQ7XG4mIzQzO1x0Km54IHw9ICFwdWRfZXhlYyhwdWQpO1xuJiM0MztcdCpydyBcdTAwMjY9ICEhKHB1ZF93cml0ZShwdWQpKTtcbiYjNDM7XG4mIzQzO1x0cG1kcCA9IHBtZF9vZmZzZXQocHVkcCwgYWRkcmVzcyk7XG4mIzQzO1x0cG1kID0gcG1kcF9nZXQocG1kcCk7XG4mIzQzO1x0aWYgKHBtZF9ub25lKHBtZCkpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKHBtZF9sZWFmKHBtZCkgfHwgIXBtZF9wcmVzZW50KHBtZCkpXG4mIzQzO1x0XHRyZXR1cm4gKHB0ZV90ICopcG1kcDtcbiYjNDM7XG4mIzQzO1x0KmxldmVsID0gUEdUQUJMRV9MRVZFTF9QVEU7XG4mIzQzO1x0Km54IHw9ICFwbWRfZXhlYyhwbWQpO1xuJiM0MztcdCpydyBcdTAwMjY9ICEhKHBtZF93cml0ZShwbWQpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZHAsIGFkZHJlc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBMb29rdXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgc3BlY2lmaWMgcGdkLlxuJiM0MzsgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLlxuJiM0MzsgKi9cbiYjNDM7cHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHRcdCAgICAgdW5zaWduZWQgaW50ICpsZXZlbClcbiYjNDM7e1xuJiM0MztcdGJvb2wgbngsIHJ3O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgXHUwMDI2bngsIFx1MDAyNnJ3KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcy4gUmV0dXJuIGEgcG9pbnRlclxuJiM0MzsgKiB0byB0aGUgZW50cnkgYW5kIHRoZSBsZXZlbCBvZiB0aGUgbWFwcGluZy5cbiYjNDM7ICpcbiYjNDM7ICogTm90ZTogdGhlIGZ1bmN0aW9uIHJldHVybnMgcDRkLCBwdWQgb3IgcG1kIGVpdGhlciB3aGVuIHRoZSBlbnRyeSBpcyBtYXJrZWRcbiYjNDM7ICogbGFyZ2Ugb3Igd2hlbiB0aGUgcHJlc2VudCBiaXQgaXMgbm90IHNldC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgTlVMTC5cbiYjNDM7ICovXG4mIzQzO3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcywgbGV2ZWwpO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGxvb2t1cF9hZGRyZXNzKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBwdGVfdCAqX2xvb2t1cF9hZGRyZXNzX2NwYShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuJiM0MztcdFx0XHQgICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpXG4mIzQzO3tcbiYjNDM7XHRwZ2RfdCAqcGdkO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNwYS1cdTAwM2VwZ2QpXG4mIzQzO1x0XHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0cGdkID0gY3BhLVx1MDAzZXBnZCAmIzQzOyBwZ2RfaW5kZXgoYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2QsIGFkZHJlc3MsIGxldmVsLCBueCwgcncpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHNob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXG4mIzQzO3tcbiYjNDM7XHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cdTAwM2VsZXZlbDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC1cdTAwM2VhZGRyZXNzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnVtcGFnZXMsIGxwYWRkcjtcbiYjNDM7XG4mIzQzO1x0aWYgKGNwYS1cdTAwM2Vmb3JjZV9zcGxpdClcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRzZC1cdTAwM2Vwc2l6ZSA9IHBndGFibGVfbGV2ZWxfc2l6ZShsZXZlbCk7XG4mIzQzO1x0c2QtXHUwMDNlcG1hc2sgPSBwZ3RhYmxlX2xldmVsX21hc2sobGV2ZWwpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzLCB3aGljaCBmaXQgaW50byB0aGlzIGxhcmdlXG4mIzQzO1x0ICogcGFnZSBzdGFydGluZyBhdCBhZGRyZXNzOlxuJiM0MztcdCAqL1xuJiM0MztcdGxwYWRkciA9IChhZGRyZXNzICYjNDM7IHNkLVx1MDAzZXBzaXplKSBcdTAwMjYgc2QtXHUwMDNlcG1hc2s7XG4mIzQzO1x0bnVtcGFnZXMgPSAobHBhZGRyIC0gYWRkcmVzcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0aWYgKG51bXBhZ2VzIFx1MDAzYyBjcGEtXHUwMDNlbnVtcGFnZXMpXG4mIzQzO1x0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBzZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3BhX2hhbmRsZV9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjcGFfc3BsaXRfZGF0YSBzZCA9IHtcbiYjNDM7XHRcdC5hZGRyZXNzID0gYWRkcmVzcyxcbiYjNDM7XHRcdC5rcHRlID0ga3B0ZSxcbiYjNDM7XHR9O1xuJiM0MztcdGludCBkb19zcGxpdCwgcmV0ID0gMTtcbiYjNDM7XHRwdGVfdCAqdG1wO1xuJiM0MztcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZjcGFfbG9jayk7XG4mIzQzO1x0c2QucHRkZXNjID0gcGFnZXRhYmxlX2FsbG9jKEdGUF9LRVJORUwsIDApO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZjcGFfbG9jayk7XG4mIzQzO1x0aWYgKCFzZC5wdGRlc2MpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0YXJjaF9sb2NrKCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgZm9yIHJhY2VzLCBhbm90aGVyIENQVSBtaWdodCBoYXZlIHNwbGl0IHRoaXMgcGFnZVxuJiM0MztcdCAqIHVwIGFscmVhZHk6XG4mIzQzO1x0ICovXG4mIzQzO1x0dG1wID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFx1MDAyNnNkLmxldmVsLCBcdTAwMjZzZC5ueCwgXHUwMDI2c2QucncpO1xuJiM0MztcdGlmICh0bXAgIT0ga3B0ZSlcbiYjNDM7XHRcdGdvdG8gb3V0X2ZyZWVfcHRkZXNjO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENoZWNrLCB3aGV0aGVyIHdlIGNhbiBrZWVwIHRoZSBsYXJnZSBwYWdlIGludGFjdFxuJiM0MztcdCAqIGFuZCBqdXN0IGNoYW5nZSB0aGUgcHRlOlxuJiM0MztcdCAqL1xuJiM0MztcdGRvX3NwbGl0ID0gc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBcdTAwMjZzZCk7XG4mIzQzO1x0cmV0ID0gZG9fc3BsaXQ7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXaGVuIHRoZSByYW5nZSBmaXRzIGludG8gdGhlIGV4aXN0aW5nIGxhcmdlIHBhZ2UsIG5vIHNwbGl0IGlzXG4mIzQzO1x0ICogcmVxdWlyZWQuXG4mIzQzO1x0ICogc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoKSB1cGRhdGVkIHRoZSBsYXJnZSBwYWdlIGF0dHJpYnV0ZXMgYW5kXG4mIzQzO1x0ICogY3BhLVx1MDAzZW51bXBhZ2VzIGFuZCBjcGEtXHUwMDNlcGZuLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChkb19zcGxpdCBcdTAwM2M9IDApXG4mIzQzO1x0XHRnb3RvIG91dF9mcmVlX3B0ZGVzYztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXZSBoYXZlIHRvIHNwbGl0IHRoZSBsYXJnZSBwYWdlOlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShjcGEsIFx1MDAyNnNkKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBvdXRfZnJlZV9wdGRlc2M7XG4mIzQzO1xuJiM0MztcdGFyY2hfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIGRvX3NwbGl0O1xuJiM0MztcbiYjNDM7b3V0X2ZyZWVfcHRkZXNjOlxuJiM0MztcdGFyY2hfdW5sb2NrKCk7XG4mIzQzO1x0cGFnZXRhYmxlX2ZyZWUoc2QucHRkZXNjKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJlc3M7XG4mIzQzO1x0aW50IHNwbGl0X3JlcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbGV2ZWw7XG4mIzQzO1x0cHRlX3QgKmtwdGUsIG9sZF9wdGU7XG4mIzQzO1x0Ym9vbCBueCwgcnc7XG4mIzQzO1xuJiM0MztcdGFkZHJlc3MgPSBjcGFfYWRkcihjcGEsIGNwYS1cdTAwM2VjdXJwYWdlKTtcbiYjNDM7cmVwZWF0OlxuJiM0MztcdGtwdGUgPSBfbG9va3VwX2FkZHJlc3NfY3BhKGNwYSwgYWRkcmVzcywgXHUwMDI2bGV2ZWwsIFx1MDAyNm54LCBcdTAwMjZydyk7XG4mIzQzO1x0aWYgKCFrcHRlKVxuJiM0MztcdFx0cmV0dXJuIGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoY3BhLCBhZGRyZXNzLCBwcmltYXJ5KTtcbiYjNDM7XG4mIzQzO1x0b2xkX3B0ZSA9ICprcHRlO1xuJiM0MztcdGlmIChwdGVfbm9uZShvbGRfcHRlKSlcbiYjNDM7XHRcdHJldHVybiBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XG4mIzQzO1xuJiM0MztcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BURSkge1xuJiM0MztcdFx0YXJjaF9jaGFuZ2VfcHRlKGNwYSwgYWRkcmVzcywga3B0ZSwgb2xkX3B0ZSwgbngsIHJ3KTtcbiYjNDM7XHRcdGNwYS1cdTAwM2VudW1wYWdlcyA9IDE7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIGFkZHJlc3MgbWFwcyBhIGxhcmdlIHBhZ2UuIFRyeSB0byBrZWVwIGl0LCBvdGhlcndpc2Ugc3BsaXQgaXRcbiYjNDM7XHQgKiB1cCBhbmQgcmV0cnkgb24gdGhlIGZyZXNobHkgaW5zdGFsbGVkIHNtYWxsZXIgbWFwcGluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzcGxpdF9yZXMgPSBjcGFfaGFuZGxlX2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzKTtcbiYjNDM7XHRpZiAoc3BsaXRfcmVzIFx1MDAzZSAwKVxuJiM0MztcdFx0Z290byByZXBlYXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBzcGxpdF9yZXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzID0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcmVtcGFnZXMgPSBudW1wYWdlcztcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBObyBjaGFuZ2VzLCBlYXN5IVxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfc2V0KSB8IHBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfY2xyKSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFjcGEtXHUwMDNlZm9yY2Vfc3BsaXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAocmVtcGFnZXMpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBTdG9yZSB0aGUgcmVtYWluaW5nIG5yIG9mIHBhZ2VzIGZvciB0aGUgbGFyZ2UgcGFnZVxuJiM0MztcdFx0ICogcHJlc2VydmF0aW9uIGNoZWNrLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSByZW1wYWdlcztcbiYjNDM7XHRcdC8qIGZvciBhcnJheSBjaGFuZ2VzLCB3ZSBjYW4mIzM5O3QgdXNlIGxhcmdlIHBhZ2UgKi9cbiYjNDM7XHRcdGlmIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKVxuJiM0MztcdFx0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSAxO1xuJiM0MztcbiYjNDM7XHRcdHNwaW5fbG9jayhcdTAwMjZjcGFfbG9jayk7XG4mIzQzO1x0XHRyZXQgPSBfX2NoYW5nZV9wYWdlX2F0dHIoY3BhLCBwcmltYXJ5KTtcbiYjNDM7XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRcdGlmIChwcmltYXJ5IFx1MDAyNlx1MDAyNiAhKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgQ1BBX05PX0NIRUNLX0FMSUFTKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjcGFfc2hvdWxkX3VwZGF0ZV9hbGlhcyhjcGFfYWRkcihjcGEsIGNwYS1cdTAwM2VjdXJwYWdlKSwgY3BhLVx1MDAzZXBmbikpIHtcbiYjNDM7XHRcdFx0cmV0ID0gYXJjaF9jcGFfcHJvY2Vzc19hbGlhcyhjcGEpO1xuJiM0MztcdFx0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBBZGp1c3QgdGhlIG51bWJlciBvZiBwYWdlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlXG4mIzQzO1x0XHQgKiBDUEEgb3BlcmF0aW9uLiBFaXRoZXIgYSBsYXJnZSBwYWdlIGhhcyBiZWVuXG4mIzQzO1x0XHQgKiBwcmVzZXJ2ZWQgb3IgYSBzaW5nbGUgcGFnZSB1cGRhdGUgaGFwcGVuZWQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdEJVR19PTihjcGEtXHUwMDNlbnVtcGFnZXMgXHUwMDNlIHJlbXBhZ2VzIHx8ICFjcGEtXHUwMDNlbnVtcGFnZXMpO1xuJiM0MztcdFx0cmVtcGFnZXMgLT0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuJiM0MztcdFx0Y3BhLVx1MDAzZWN1cnBhZ2UgJiM0Mzs9IGNwYS1cdTAwM2VudW1wYWdlcztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0LyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgbnVtcGFnZXMgKi9cbiYjNDM7XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbiYjNDM7XHRcdFx0ICAgICBwZ3Byb3RfdCBtYXNrX3NldCwgcGdwcm90X3QgbWFza19jbHIsXG4mIzQzO1x0XHRcdCAgICAgaW50IGZvcmNlX3NwbGl0LCBpbnQgaW5fZmxhZyxcbiYjNDM7XHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNwYV9kYXRhIGNwYTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2Y3BhLCAwLCBzaXplb2YoY3BhKSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2ssIGlmIHdlIGFyZSByZXF1ZXN0ZWQgdG8gc2V0IGEgbm90IHN1cHBvcnRlZFxuJiM0MztcdCAqIGZlYXR1cmUuICBDbGVhcmluZyBub24tc3VwcG9ydGVkIGZlYXR1cmVzIGlzIE9LLlxuJiM0MztcdCAqL1xuJiM0MztcdG1hc2tfc2V0ID0gY2Fub25fcGdwcm90KG1hc2tfc2V0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwZ3Byb3RfdmFsKG1hc2tfc2V0KSBcdTAwMjZcdTAwMjYgIXBncHJvdF92YWwobWFza19jbHIpIFx1MDAyNlx1MDAyNiAhZm9yY2Vfc3BsaXQpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0LyogRW5zdXJlIHdlIGFyZSBQQUdFX1NJWkUgYWxpZ25lZCAqL1xuJiM0MztcdGlmIChpbl9mbGFnIFx1MDAyNiBDUEFfQVJSQVkpIHtcbiYjNDM7XHRcdGludCBpO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG51bXBhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoYWRkcltpXSBcdTAwMjYgflBBR0VfTUFTSykge1xuJiM0MztcdFx0XHRcdGFkZHJbaV0gXHUwMDI2PSBQQUdFX01BU0s7XG4mIzQzO1x0XHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIGlmICghKGluX2ZsYWcgXHUwMDI2IENQQV9QQUdFU19BUlJBWSkpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBpbl9mbGFnIG9mIENQQV9QQUdFU19BUlJBWSBpbXBsaWVzIGl0IGlzIGFsaWduZWQuXG4mIzQzO1x0XHQgKiBObyBuZWVkIHRvIGNoZWNrIGluIHRoYXQgY2FzZVxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoKmFkZHIgXHUwMDI2IH5QQUdFX01BU0spIHtcbiYjNDM7XHRcdFx0KmFkZHIgXHUwMDI2PSBQQUdFX01BU0s7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIFBlb3BsZSBzaG91bGQgbm90IGJlIHBhc3NpbmcgaW4gdW5hbGlnbmVkIGFkZHJlc3NlczpcbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqL1xuJiM0MztcdGttYXBfZmx1c2hfdW51c2VkKCk7XG4mIzQzO1xuJiM0MztcdHZtX3VubWFwX2FsaWFzZXMoKTtcbiYjNDM7XG4mIzQzO1x0Y3BhLnZhZGRyID0gYWRkcjtcbiYjNDM7XHRjcGEucGFnZXMgPSBwYWdlcztcbiYjNDM7XHRjcGEubnVtcGFnZXMgPSBudW1wYWdlcztcbiYjNDM7XHRjcGEubWFza19zZXQgPSBtYXNrX3NldDtcbiYjNDM7XHRjcGEubWFza19jbHIgPSBtYXNrX2NscjtcbiYjNDM7XHRjcGEuZmxhZ3MgPSBpbl9mbGFnO1xuJiM0MztcdGNwYS5jdXJwYWdlID0gMDtcbiYjNDM7XHRjcGEuZm9yY2Vfc3BsaXQgPSBmb3JjZV9zcGxpdDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzpcbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIShjcGEuZmxhZ3MgXHUwMDI2IENQQV9GTFVTSFRMQikpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YXJjaF9jcGFfZmx1c2goXHUwMDI2Y3BhLCBlcnIpO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB0ZXN0Y2FzZXMgdXNlIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGRuJiMzOTt0XG4mIzQzOyAqIGJlIGV4cG9zZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gSW5jbHVkZSB0aGVzZSBkaXJlY3RseSBoZXJlLlxuJiM0MzsgKi9cbiYjNDM7I2lmZGVmIENPTkZJR19DUEFfREVCVUdcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y3BhLXRlc3QuY1wmIzM0O1xuJiM0MzsjZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMiAxMToxMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7Q1BBX0RFQlVHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyJiMzNDssCiAgICAmIzM0O19fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyJiMzNDssCiAgICAmIzM0O19fY2hhbmdlX3BhZ2VfYXR0ciYjMzQ7LAogICAgJiMzNDtjcGFfaGFuZGxlX2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7c2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZSYjMzQ7LAogICAgJiMzNDthcmNoX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9jaGFuZ2VfcHRlJiMzNDssCiAgICAmIzM0O2FyY2hfY3BhX3Byb2Nlc3NfZmF1bHQmIzM0OywKICAgICYjMzQ7YXJjaF9jcGFfcHJvY2Vzc19hbGlhcyYjMzQ7LAogICAgJiMzNDthcmNoX2NwYV9mbHVzaCYjMzQ7LAogICAgJiMzNDtsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNoYW5nZV9wYWdlX2F0dHIgKENQQSkgbG9naWMsIG1vdmluZyBpdCBmcm9tIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlICh4ODYsIHJpc2N2KSB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaW4gbW0vc2V0X21lbW9yeS5jLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZ2VuZXJpYyBmdW5jdGlvbnMgYW5kIHRoZWlyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjYWxsYmFja3MuIEVuYWJsaW5nIENQQV9ERUJVRyB3aWxsIGFsc28gcnVuIHRoZSBDUEEgc2VsZi10ZXN0cyB0byBoZWxwIHVuY292ZXIgaXNzdWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBkNTQ0YjJiZmY0YzM0ZmY0ZTQ2Y2MwODE1MThhMjY2YWIzMTY1MTVjCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBKdWwgMjIgMTE6MTE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9LY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZwppbmRleCBkOGQyNTIzMjUwMTc5MS4uMWJmYTk0Nzk3YjFiNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZwpAQCAtMTA5LDYgJiM0MzsxMDksNyBAQCBjb25maWcgTE9PTkdBUkNICiAJc2VsZWN0IEdFTkVSSUNfTElCX0RFVk1FTV9JU19BTExPV0VECiAJc2VsZWN0IEdFTkVSSUNfUENJX0lPTUFQCiAJc2VsZWN0IEdFTkVSSUNfU0NIRURfQ0xPQ0sKJiM0MzsJc2VsZWN0IEdFTkVSSUNfU0VUX01FTU9SWQogCXNlbGVjdCBHRU5FUklDX1NNUF9JRExFX1RIUkVBRAogCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IEhBU19JT1BPUlQKZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAyMjM1MjhjMDRkNzM5Mi4uMzc3YmVmMDg5NGQ3NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTYzOCw2ICYjNDM7NjM4LDQ4IEBAIHN0YXRpYyBpbmxpbmUgbG9uZyBwbWRfcHJvdG5vbmUocG1kX3QgcG1kKQogI2RlZmluZSBwbWRfbGVhZihwbWQpCQkoKHBtZF92YWwocG1kKSAmYW1wOyBfUEFHRV9IVUdFKSAhPSAwKQogI2RlZmluZSBwdWRfbGVhZihwdWQpCQkoKHB1ZF92YWwocHVkKSAmYW1wOyBfUEFHRV9IVUdFKSAhPSAwKQogCiYjNDM7I2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcGdkX3dyaXRlKHBnZF90IHBnZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhIShwZ2RfdmFsKHBnZCkgJmFtcDsgX1BBR0VfV1JJVEUpOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGUKJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfd3JpdGUocDRkX3QgcDRkKQomIzQzO3sKJiM0MzsJcmV0dXJuICEhKHA0ZF92YWwocDRkKSAmYW1wOyBfUEFHRV9XUklURSk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgcHVkX3dyaXRlIHB1ZF93cml0ZQomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gISEocHVkX3ZhbChwdWQpICZhbXA7IF9QQUdFX1dSSVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF9leGVjKHBnZF90IHBnZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHBnZF92YWwocGdkKSAmYW1wOyBfUEFHRV9OT19FWEVDKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF9leGVjKHA0ZF90IHA0ZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHA0ZF92YWwocDRkKSAmYW1wOyBfUEFHRV9OT19FWEVDKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwdWRfZXhlYyBwdWRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHB1ZF92YWwocHVkKSAmYW1wOyBfUEFHRV9OT19FWEVDKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBtZF9leGVjKHBtZF90IHBtZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHBtZF92YWwocG1kKSAmYW1wOyBfUEFHRV9OT19FWEVDKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogV2UgcHJvdmlkZSBvdXIgb3duIGdldF91bm1hcHBlZCBhcmVhIHRvIGNvcGUgd2l0aCB0aGUgdmlydHVhbCBhbGlhc2luZwogICogY29uc3RyYWludHMgcGxhY2VkIG9uIHVzIGJ5IHRoZSBjYWNoZSBhcmNoaXRlY3R1cmUuCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmggYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmgKaW5kZXggNTVkZmFlZmQwMmM4YTYuLjZmZmI0ZmU1YTc1YjBlIDEwMDY0NAotLS0gYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oCkBAIC0xOSw0ICYjNDM7MTksMTMgQEAgaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBpbnQgc2V0X2RpcmVjdF9tYXBfaW52YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlKTsKIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZCk7CiAKJiM0MzsvKgomIzQzOyAqIFRoZSBkaXJlY3QgbWFwIGlzIGEgZml4ZWQgYWRkcmVzcyB3aW5kb3cgdGhhdCBpcyBub3QgYmFja2VkIGJ5IHBhZ2UgdGFibGVzLAomIzQzOyAqIHNvIGEgcGFnZSBuZXZlciBoYXMgYSBzZWNvbmQgbWFwcGluZyB3aG9zZSBwcm90ZWN0aW9uIG11c3QgYmUgc3luY2hyb25pc2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBjcGFfc2hvdWxkX3VwZGF0ZV9hbGlhcyh1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYgLyogX0FTTV9MT09OR0FSQ0hfU0VUX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9tbS9wYWdlYXR0ci5jIGIvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuYwppbmRleCA2MTRjY2M3YWZjY2JlYS4uZGJiZDQwOGJkM2Q1ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuYwpAQCAtNCwxMjYgJiM0Mzs0LDgzIEBACiAgKi8KIAogI2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZXdhbGsuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wZ3RhYmxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NldF9tZW1vcnkuaCZndDsKICNpbmNsdWRlICZsdDthc20vc2V0X21lbW9yeS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS90bGJmbHVzaC5oJmd0OwogCi1zdHJ1Y3QgcGFnZWF0dHJfbWFza3MgewotCXBncHJvdF90IHNldF9tYXNrOwotCXBncHJvdF90IGNsZWFyX21hc2s7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcGFnZWF0dHJfbWFza3ModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBtbV93YWxrICp3YWxrKQomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9wYWdlYXR0cl9tYXNrcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBuZXdfdmFsID0gdmFsOwotCXN0cnVjdCBwYWdlYXR0cl9tYXNrcyAqbWFza3MgPSB3YWxrLSZndDtwcml2YXRlOwotCi0JbmV3X3ZhbCAmYW1wOz0gfihwZ3Byb3RfdmFsKG1hc2tzLSZndDtjbGVhcl9tYXNrKSk7Ci0JbmV3X3ZhbCB8PSAocGdwcm90X3ZhbChtYXNrcy0mZ3Q7c2V0X21hc2spKTsKJiM0MzsJdmFsICZhbXA7PSB+cGdwcm90X3ZhbChjcGEtJmd0O21hc2tfY2xyKTsKJiM0MzsJdmFsIHw9IHBncHJvdF92YWwoY3BhLSZndDttYXNrX3NldCk7CiAKLQlyZXR1cm4gbmV3X3ZhbDsKJiM0MzsJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIGludCBwYWdlYXR0cl9wZ2RfZW50cnkocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKJiM0MztpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZCkKIHsKLQlwZ2RfdCB2YWwgPSBwZ2RwX2dldChwZ2QpOwotCi0JaWYgKHBnZF9sZWFmKHZhbCkpIHsKLQkJdmFsID0gX19wZ2Qoc2V0X3BhZ2VhdHRyX21hc2tzKHBnZF92YWwodmFsKSwgd2FsaykpOwotCQlzZXRfcGdkKHBnZCwgdmFsKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KJiM0MzsJcHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtJmd0O2twdGUpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBuZXdfdmFsID0gc2V0X3BhZ2VhdHRyX21hc2tzKGNwYSwgdmFsKTsKIAotc3RhdGljIGludCBwYWdlYXR0cl9wNGRfZW50cnkocDRkX3QgKnA0ZCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKLXsKLQlwNGRfdCB2YWwgPSBwNGRwX2dldChwNGQpOwomIzQzOwljcGEtJmd0O3BmbiA9IHB0ZV9wZm4ob2xkKSAmIzQzOyAoKHNkLSZndDthZGRyZXNzICZhbXA7IChzZC0mZ3Q7cHNpemUgLSAxKSkgJmd0OyZndDsgUEFHRV9TSElGVCk7CiAKLQlpZiAocDRkX2xlYWYodmFsKSkgewotCQl2YWwgPSBfX3A0ZChzZXRfcGFnZWF0dHJfbWFza3MocDRkX3ZhbCh2YWwpLCB3YWxrKSk7Ci0JCXNldF9wNGQocDRkLCB2YWwpOwomIzQzOwlpZiAobmV3X3ZhbCAhPSB2YWwpIHsKJiM0MzsJCXNldF9wdGUoc2QtJmd0O2twdGUsIF9fcHRlKG5ld192YWwpKTsKJiM0MzsJCWNwYS0mZ3Q7ZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B1ZF9lbnRyeShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQomIzQzO2ludCBhcmNoX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpCiB7Ci0JcHVkX3QgdmFsID0gcHVkcF9nZXQocHVkKTsKLQotCWlmIChwdWRfbGVhZih2YWwpKSB7Ci0JCXZhbCA9IF9fcHVkKHNldF9wYWdlYXR0cl9tYXNrcyhwdWRfdmFsKHZhbCksIHdhbGspKTsKLQkJc2V0X3B1ZChwdWQsIHZhbCk7Ci0JfQomIzQzOwlXQVJOX09OX09OQ0UoMSk7CiAKLQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgcGFnZWF0dHJfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspCiYjNDM7dm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKJiM0MzsJCSAgICAgcHRlX3QgKmtwdGUsIHB0ZV90IG9sZF9wdGUsIGJvb2wgbngsIGJvb2wgcncpCiB7Ci0JcG1kX3QgdmFsID0gcG1kcF9nZXQocG1kKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB2YWwgPSBwdGVfdmFsKG9sZF9wdGUpOwomIzQzOwlwdGVfdCBuZXdfcHRlID0gX19wdGUoc2V0X3BhZ2VhdHRyX21hc2tzKGNwYSwgdmFsKSk7CiAKLQlpZiAocG1kX2xlYWYodmFsKSkgewotCQl2YWwgPSBfX3BtZChzZXRfcGFnZWF0dHJfbWFza3MocG1kX3ZhbCh2YWwpLCB3YWxrKSk7Ci0JCXNldF9wbWQocG1kLCB2YWwpOwotCX0KJiM0MzsJY3BhLSZndDtwZm4gPSBwdGVfcGZuKG9sZF9wdGUpOwogCi0JcmV0dXJuIDA7CiYjNDM7CWlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHsKJiM0MzsJCXNldF9wdGUoa3B0ZSwgbmV3X3B0ZSk7CiYjNDM7CQljcGEtJmd0O2ZsYWdzIHw9IENQQV9GTFVTSFRMQjsKJiM0MzsJfQogfQogCi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B0ZV9lbnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQomIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLAomIzQzOwkJCSAgIGludCBwcmltYXJ5KQogewotCXB0ZV90IHZhbCA9IHB0ZXBfZ2V0KHB0ZSk7Ci0KLQl2YWwgPSBfX3B0ZShzZXRfcGFnZWF0dHJfbWFza3MocHRlX3ZhbCh2YWwpLCB3YWxrKSk7Ci0Jc2V0X3B0ZShwdGUsIHZhbCk7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBkaXJlY3QgbWFwIGhhcyBubyBwYWdlIHRhYmxlcyBhbmQgdm1hbGxvYyByYW5nZXMgbWF5IGNvbnRhaW4KJiM0MzsJICogaG9sZXMuIEJvdGggYXJlIHNpbGVudGx5IHNraXBwZWQuCiYjNDM7CSAqLwomIzQzOwljcGEtJmd0O251bXBhZ2VzID0gMTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B0ZV9ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBuZXh0LAotCQkJICAgICBpbnQgZGVwdGgsIHN0cnVjdCBtbV93YWxrICp3YWxrKQomIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIHBhZ2VhdHRyX29wcyA9IHsKLQkucGdkX2VudHJ5ID0gcGFnZWF0dHJfcGdkX2VudHJ5LAotCS5wNGRfZW50cnkgPSBwYWdlYXR0cl9wNGRfZW50cnksCi0JLnB1ZF9lbnRyeSA9IHBhZ2VhdHRyX3B1ZF9lbnRyeSwKLQkucG1kX2VudHJ5ID0gcGFnZWF0dHJfcG1kX2VudHJ5LAotCS5wdGVfZW50cnkgPSBwYWdlYXR0cl9wdGVfZW50cnksCi0JLnB0ZV9ob2xlID0gcGFnZWF0dHJfcHRlX2hvbGUsCi0JLndhbGtfbG9jayA9IFBHV0FMS19SRExPQ0ssCi19OwotCi1zdGF0aWMgaW50IF9fc2V0X21lbW9yeSh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcywgcGdwcm90X3Qgc2V0X21hc2ssIHBncHJvdF90IGNsZWFyX21hc2spCiYjNDM7dm9pZCBhcmNoX2NwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGVycikKIHsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgJiM0MzsgUEFHRV9TSVpFICogbnVtcGFnZXM7Ci0Jc3RydWN0IHBhZ2VhdHRyX21hc2tzIG1hc2tzID0gewotCQkuc2V0X21hc2sgPSBzZXRfbWFzaywKLQkJLmNsZWFyX21hc2sgPSBjbGVhcl9tYXNrCi0JfTsKLQotCWlmICghbnVtcGFnZXMpCi0JCXJldHVybiAwOwotCi0JbW1hcF93cml0ZV9sb2NrKCZhbXA7aW5pdF9tbSk7Ci0JcmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCAmYW1wO3BhZ2VhdHRyX29wcywgTlVMTCwgJmFtcDttYXNrcyk7Ci0JbW1hcF93cml0ZV91bmxvY2soJmFtcDtpbml0X21tKTsKLQotCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7CiYjNDM7CWlmIChlcnIgfHwgY3BhLSZndDtmb3JjZV9mbHVzaF9hbGwgfHwKJiM0MzsJICAgIChjcGEtJmd0O2ZsYWdzICZhbXA7IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKSkgewomIzQzOwkJZmx1c2hfdGxiX2FsbCgpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiAKLQlyZXR1cm4gcmV0OwomIzQzOwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKCpjcGEtJmd0O3ZhZGRyLCAqY3BhLSZndDt2YWRkciAmIzQzOyBjcGEtJmd0O251bXBhZ2VzICogUEFHRV9TSVpFKTsKIH0KIAogaW50IHNldF9tZW1vcnlfeCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKQEAgLTEzMSw3ICYjNDM7ODgsNyBAQCBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogCWlmIChhZGRyICZsdDsgdm1fbWFwX2Jhc2UpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpKTsKJiM0MzsJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIoJmFtcDthZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIDApOwogfQogCiBpbnQgc2V0X21lbW9yeV9ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKQEAgLTEzOSw3ICYjNDM7OTYsNyBAQCBpbnQgc2V0X21lbW9yeV9ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIAlpZiAoYWRkciAmbHQ7IHZtX21hcF9iYXNlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpLCBfX3BncHJvdCgwKSk7CiYjNDM7CXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmYW1wO2FkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9OT19FWEVDKSwgMCk7CiB9CiAKIGludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQpAQCAtMTQ3LDcgJiM0MzsxMDQsNyBAQCBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIAlpZiAoYWRkciAmbHQ7IHZtX21hcF9iYXNlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSk7CiYjNDM7CXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKCZhbXA7YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1dSSVRFIHwgX1BBR0VfRElSVFkpLCAwKTsKIH0KIAogaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCkBAIC0xNTUsODQgJiM0MzsxMTIsNzUgQEAgaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiAJaWYgKGFkZHIgJmx0OyB2bV9tYXBfYmFzZSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSwgX19wZ3Byb3QoMCkpOwomIzQzOwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoJmFtcDthZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIDApOwogfQogCiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcGdkX3QgKnBnZDsKLQlwNGRfdCAqcDRkOwotCXB1ZF90ICpwdWQ7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwomIzQzOwl1bnNpZ25lZCBpbnQgbGV2ZWw7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwomIzQzOwlwdGVfdCAqcHRlOwogCiAJaWYgKGFkZHIgJmx0OyB2bV9tYXBfYmFzZSkKIAkJcmV0dXJuIG1lbWJsb2NrX2lzX21lbW9yeShfX3BhKGFkZHIpKTsKIAotCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKLQlpZiAocGdkX25vbmUocGdkcF9nZXQocGdkKSkpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAocGdkX2xlYWYocGdkcF9nZXQocGdkKSkpCi0JCXJldHVybiB0cnVlOwotCi0JcDRkID0gcDRkX29mZnNldChwZ2QsIGFkZHIpOwotCWlmIChwNGRfbm9uZShwNGRwX2dldChwNGQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmIChwNGRfbGVhZihwNGRwX2dldChwNGQpKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcik7Ci0JaWYgKHB1ZF9ub25lKHB1ZHBfZ2V0KHB1ZCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHB1ZF9sZWFmKHB1ZHBfZ2V0KHB1ZCkpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKLQlpZiAocG1kX25vbmUocG1kcF9nZXQocG1kKSkpCiYjNDM7CXB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsICZhbXA7bGV2ZWwpOwomIzQzOwlpZiAoIXB0ZSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChwbWRfbGVhZihwbWRwX2dldChwbWQpKSkKLQkJcmV0dXJuIHRydWU7CiAKLQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOwogCXJldHVybiBwdGVfcHJlc2VudChwdGVwX2dldChwdGUpKTsKIH0KIAogaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CiYjNDM7CXN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9ICZhbXA7YWRkciwKJiM0MzsJCQkJLnBnZCA9IE5VTEwsCiYjNDM7CQkJCS5udW1wYWdlcyA9IDEsCiYjNDM7CQkJCS5tYXNrX3NldCA9IFBBR0VfS0VSTkVMLAomIzQzOwkJCQkubWFza19jbHIgPSBfX3BncHJvdCgwKSwKJiM0MzsJCQkJLmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07CiAKIAlpZiAoYWRkciAmbHQ7IHZtX21hcF9iYXNlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgMSwgUEFHRV9LRVJORUwsIF9fcGdwcm90KDApKTsKJiM0MzsJcmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZhbXA7Y3BhLCAxKTsKIH0KIAogaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CiYjNDM7CXN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9ICZhbXA7YWRkciwKJiM0MzsJCQkJLnBnZCA9IE5VTEwsCiYjNDM7CQkJCS5udW1wYWdlcyA9IDEsCiYjNDM7CQkJCS5tYXNrX3NldCA9IF9fcGdwcm90KDApLAomIzQzOwkJCQkubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVkFMSUQpLAomIzQzOwkJCQkuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTsKIAogCWlmIChhZGRyICZsdDsgdm1fbWFwX2Jhc2UpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCAxLCBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKSk7CiYjNDM7CXJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscigmYW1wO2NwYSwgMSk7CiB9CiAKIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7Ci0JcGdwcm90X3Qgc2V0LCBjbGVhcjsKJiM0MzsJc3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gJmFtcDthZGRyLAomIzQzOwkJCQkucGdkID0gTlVMTCwKJiM0MzsJCQkJLm51bXBhZ2VzID0gbnIsCiYjNDM7CQkJCS5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9OwogCiAJaWYgKGFkZHIgJmx0OyB2bV9tYXBfYmFzZSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAodmFsaWQpIHsKLQkJc2V0ID0gUEFHRV9LRVJORUw7Ci0JCWNsZWFyID0gX19wZ3Byb3QoMCk7CiYjNDM7CQljcGEubWFza19zZXQgPSBQQUdFX0tFUk5FTDsKJiM0MzsJCWNwYS5tYXNrX2NsciA9IF9fcGdwcm90KDApOwogCX0gZWxzZSB7Ci0JCXNldCA9IF9fcGdwcm90KDApOwotCQljbGVhciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7CiYjNDM7CQljcGEubWFza19zZXQgPSBfX3BncHJvdCgwKTsKJiM0MzsJCWNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7CiAJfQogCi0JcmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBuciwgc2V0LCBjbGVhcik7CiYjNDM7CXJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscigmYW1wO2NwYSwgMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWcKaW5kZXggM2YwYTY0NzIxOGU0MDcuLjVkMDY5YmYyOTBjZTc4IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9LY29uZmlnCkBAIC00OCw2ICYjNDM7NDgsNyBAQCBjb25maWcgUklTQ1YKIAlzZWxlY3QgQVJDSF9IQVNfUFRFX1NQRUNJQUwKIAlzZWxlY3QgQVJDSF9IQVNfU0VUX0RJUkVDVF9NQVAgaWYgTU1VCiAJc2VsZWN0IEFSQ0hfSEFTX1NFVF9NRU1PUlkgaWYgTU1VCiYjNDM7CXNlbGVjdCBHRU5FUklDX1NFVF9NRU1PUlkgaWYgTU1VCiAJc2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYIGlmIE1NVQogCXNlbGVjdCBBUkNIX0hBU19TVFJJQ1RfTU9EVUxFX1JXWCBpZiBNTVUKIAlzZWxlY3QgQVJDSF9IQVNfU1lOQ19DT1JFX0JFRk9SRV9VU0VSTU9ERQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA1ZDU3NTZiZGE4MmUzZC4uMDI3YjNlN2U0ZjE3N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC04MTksNiAmIzQzOzgxOSw0MiBAQCBzdGF0aWMgaW5saW5lIGludCBwdWRfd3JpdGUocHVkX3QgcHVkKQogCXJldHVybiBwdGVfd3JpdGUocHVkX3B0ZShwdWQpKTsKIH0KIAomIzQzOyNkZWZpbmUgcGdkX3dyaXRlIHBnZF93cml0ZQomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpCiYjNDM7ewomIzQzOwlyZXR1cm4gcGdkX3ZhbChwZ2QpICZhbXA7IF9QQUdFX1dSSVRFOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGUKJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfd3JpdGUocDRkX3QgcDRkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHA0ZF92YWwocDRkKSAmYW1wOyBfUEFHRV9XUklURTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF9leGVjKHBnZF90IHBnZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhIShwZ2RfdmFsKHBnZCkgJmFtcDsgX1BBR0VfRVhFQyk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgcDRkX2V4ZWMgcDRkX2V4ZWMKJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpCiYjNDM7ewomIzQzOwlyZXR1cm4gISEocDRkX3ZhbChwNGQpICZhbXA7IF9QQUdFX0VYRUMpOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIHB1ZF9leGVjIHB1ZF9leGVjCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcHVkX2V4ZWMocHVkX3QgcHVkKQomIzQzO3sKJiM0MzsJcmV0dXJuICEhKHB1ZF92YWwocHVkKSAmYW1wOyBfUEFHRV9FWEVDKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBtZF9leGVjKHBtZF90IHBtZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhIShwbWRfdmFsKHBtZCkgJmFtcDsgX1BBR0VfRVhFQyk7CiYjNDM7fQomIzQzOwogI2RlZmluZSBwbWRfZGlydHkgcG1kX2RpcnR5CiBzdGF0aWMgaW5saW5lIGludCBwbWRfZGlydHkocG1kX3QgcG1kKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaAppbmRleCBlZjU5ZTE3MTZhMmNmZC4uNGJhNDZhMzMxMDM0MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oCkBAIC03LDYgJiM0Mzs3LDggQEAKICNkZWZpbmUgX0FTTV9SSVNDVl9TRVRfTUVNT1JZX0gKIAogI2lmbmRlZiBfX0FTU0VNQkxFUl9fCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wYWdlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wZ3RhYmxlLmgmZ3Q7CiAvKgogICogRnVuY3Rpb25zIHRvIGNoYW5nZSBtZW1vcnkgYXR0cmlidXRlcy4KICAqLwpAQCAtMjYsNiAmIzQzOzI4LDExIEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHNldF9rZXJuZWxfbWVtb3J5KGNoYXIgKnN0YXJ0cCwgY2hhciAqZW5kcCwKIAogCXJldHVybiBzZXRfbWVtb3J5KHN0YXJ0LCBudW1fcGFnZXMpOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBjcGFfc2hvdWxkX3VwZGF0ZV9hbGlhcyh1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKJiM0Mzt7CiYjNDM7CXJldHVybiAhaXNfbGluZWFyX21hcHBpbmcodmFkZHIpOwomIzQzO30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMKaW5kZXggM2Y3NmRiM2QyNzY5OTIuLjY2YTIwZmMzZDgwNTc0IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jCkBAIC0zLDQwMiAmIzQzOzMsMjQyIEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTkgU2lGaXZlCiAgKi8KIAotI2luY2x1ZGUgJmx0O2xpbnV4L3BhZ2V3YWxrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcGd0YWJsZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3ZtYWxsb2MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2V0X21lbW9yeS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS90bGJmbHVzaC5oJmd0OwotI2luY2x1ZGUgJmx0O2FzbS9iaXRvcHMuaCZndDsKICNpbmNsdWRlICZsdDthc20vc2V0X21lbW9yeS5oJmd0OwogCi1zdHJ1Y3QgcGFnZWF0dHJfbWFza3MgewotCXBncHJvdF90IHNldF9tYXNrOwotCXBncHJvdF90IGNsZWFyX21hc2s7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcGFnZWF0dHJfbWFza3ModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBtbV93YWxrICp3YWxrKQotewotCXN0cnVjdCBwYWdlYXR0cl9tYXNrcyAqbWFza3MgPSB3YWxrLSZndDtwcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgbmV3X3ZhbCA9IHZhbDsKLQotCW5ld192YWwgJmFtcDs9IH4ocGdwcm90X3ZhbChtYXNrcy0mZ3Q7Y2xlYXJfbWFzaykpOwotCW5ld192YWwgfD0gKHBncHJvdF92YWwobWFza3MtJmd0O3NldF9tYXNrKSk7Ci0KLQlyZXR1cm4gbmV3X3ZhbDsKLX0KLQotc3RhdGljIGludCBwYWdlYXR0cl9wNGRfZW50cnkocDRkX3QgKnA0ZCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKJiM0MztpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZCkKIHsKLQlwNGRfdCB2YWwgPSBwNGRwX2dldChwNGQpOwotCi0JaWYgKHA0ZF9sZWFmKHZhbCkpIHsKLQkJdmFsID0gX19wNGQoc2V0X3BhZ2VhdHRyX21hc2tzKHA0ZF92YWwodmFsKSwgd2FsaykpOwotCQlzZXRfcDRkKHA0ZCwgdmFsKTsKLQl9CiYjNDM7CXB0ZV90IG9sZCA9IHB0ZXBfZ2V0KHNkLSZndDtrcHRlKTsKJiM0MzsJcGdwcm90X3Qgb2xkX3Byb3QgPSBfX3BncHJvdChwdGVfdmFsKG9sZCkgJmFtcDsgfl9QQUdFX1BGTl9NQVNLKTsKJiM0MzsJcGdwcm90X3QgbmV3X3Byb3QgPSBvbGRfcHJvdDsKJiM0MzsJdW5zaWduZWQgbG9uZyBvbGRfcGZuID0gcHRlX3BmbihvbGQpOwomIzQzOwl1bnNpZ25lZCBsb25nIGxwYWRkciwgbnVtcGFnZXM7CiAKLQlyZXR1cm4gMDsKLX0KJiM0MzsJcGdwcm90X3ZhbChuZXdfcHJvdCkgJmFtcDs9IH5wZ3Byb3RfdmFsKGNwYS0mZ3Q7bWFza19jbHIpOwomIzQzOwlwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS0mZ3Q7bWFza19zZXQpOwogCi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B1ZF9lbnRyeShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQotewotCXB1ZF90IHZhbCA9IHB1ZHBfZ2V0KHB1ZCk7Ci0KLQlpZiAocHVkX2xlYWYodmFsKSkgewotCQl2YWwgPSBfX3B1ZChzZXRfcGFnZWF0dHJfbWFza3MocHVkX3ZhbCh2YWwpLCB3YWxrKSk7Ci0JCXNldF9wdWQocHVkLCB2YWwpOwotCX0KJiM0MzsJLyoKJiM0MzsJICogUmVjb3JkIHRoZSBwZm4gbWFwcGVkIGF0IEBhZGRyZXNzIHNvIHRoZSBhbGlhcyBjaGVjayBjYW4gbG9jYXRlIHRoZQomIzQzOwkgKiBtYXRjaGluZyBsaW5lYXIgbWFwIGVudHJ5LgomIzQzOwkgKi8KJiM0MzsJY3BhLSZndDtwZm4gPSBvbGRfcGZuICYjNDM7ICgoc2QtJmd0O2FkZHJlc3MgJmFtcDsgKHNkLSZndDtwc2l6ZSAtIDEpKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKIAotCXJldHVybiAwOwotfQomIzQzOwkvKiBJZiB0aGUgcHJvdGVjdGlvbnMgZG8gbm90IGNoYW5nZSwga2VlcCB0aGUgbGFyZ2UgcGFnZSBpbnRhY3QuICovCiYjNDM7CWlmIChwZ3Byb3RfdmFsKG5ld19wcm90KSA9PSBwZ3Byb3RfdmFsKG9sZF9wcm90KSkKJiM0MzsJCXJldHVybiAwOwogCi1zdGF0aWMgaW50IHBhZ2VhdHRyX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQotewotCXBtZF90IHZhbCA9IHBtZHBfZ2V0KHBtZCk7CiYjNDM7CS8qIElmIHRoZSByZXF1ZXN0IGRvZXMgbm90IGNvdmVyIHRoZSB3aG9sZSBsYXJnZSBwYWdlLCBzcGxpdCBpdC4gKi8KJiM0MzsJbHBhZGRyID0gc2QtJmd0O2FkZHJlc3MgJmFtcDsgc2QtJmd0O3BtYXNrOwomIzQzOwludW1wYWdlcyA9IHNkLSZndDtwc2l6ZSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwlpZiAoc2QtJmd0O2FkZHJlc3MgIT0gbHBhZGRyIHx8IGNwYS0mZ3Q7bnVtcGFnZXMgIT0gbnVtcGFnZXMpCiYjNDM7CQlyZXR1cm4gMTsKIAotCWlmIChwbWRfbGVhZih2YWwpKSB7Ci0JCXZhbCA9IF9fcG1kKHNldF9wYWdlYXR0cl9tYXNrcyhwbWRfdmFsKHZhbCksIHdhbGspKTsKLQkJc2V0X3BtZChwbWQsIHZhbCk7Ci0JfQomIzQzOwkvKiBUaGUgd2hvbGUgbGFyZ2UgcGFnZSBpcyBjb3ZlcmVkOiB1cGRhdGUgaXQgaW4gcGxhY2UuICovCiYjNDM7CXNldF9wdGUoc2QtJmd0O2twdGUsIHBmbl9wdGUob2xkX3BmbiwgbmV3X3Byb3QpKTsKJiM0MzsJY3BhLSZndDtmbGFncyB8PSBDUEFfRkxVU0hUTEI7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwYWdlYXR0cl9wdGVfZW50cnkocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKJiM0MztzdGF0aWMgdm9pZCBzcGxpdF9zZXRfcHRlcyhwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgcGZuaW5jLAomIzQzOwkJCSAgIHBncHJvdF90IHByb3QpCiB7Ci0JcHRlX3QgdmFsID0gcHRlcF9nZXQocHRlKTsKLQotCXZhbCA9IF9fcHRlKHNldF9wYWdlYXR0cl9tYXNrcyhwdGVfdmFsKHZhbCksIHdhbGspKTsKLQlzZXRfcHRlKHB0ZSwgdmFsKTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiAKLQlyZXR1cm4gMDsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFBUUlNfUEVSX1BURTsgJiM0MzsmIzQzO2ksICYjNDM7JiM0MztwdGVwLCBwZm4gJiM0Mzs9IHBmbmluYykKJiM0MzsJCXNldF9wdGUocHRlcCwgcGZuX3B0ZShwZm4sIHByb3QpKTsKIH0KIAotc3RhdGljIGludCBwYWdlYXR0cl9wdGVfaG9sZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbmV4dCwKLQkJCSAgICAgaW50IGRlcHRoLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKJiM0MztpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKQogewotCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIHBhZ2VhdHRyX29wcyA9IHsKLQkucDRkX2VudHJ5ID0gcGFnZWF0dHJfcDRkX2VudHJ5LAotCS5wdWRfZW50cnkgPSBwYWdlYXR0cl9wdWRfZW50cnksCi0JLnBtZF9lbnRyeSA9IHBhZ2VhdHRyX3BtZF9lbnRyeSwKLQkucHRlX2VudHJ5ID0gcGFnZWF0dHJfcHRlX2VudHJ5LAotCS5wdGVfaG9sZSA9IHBhZ2VhdHRyX3B0ZV9ob2xlLAotCS53YWxrX2xvY2sgPSBQR1dBTEtfUkRMT0NLLAotfTsKLQogI2lmZGVmIENPTkZJR182NEJJVAotc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BtZChwdWRfdCAqcHVkcCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlwbWRfdCAqcG1kcDsKLQl1bnNpZ25lZCBsb25nIG5leHQ7Ci0KLQlwbWRwID0gcG1kX29mZnNldChwdWRwLCB2YWRkcik7Ci0KLQlkbyB7Ci0JCW5leHQgPSBwbWRfYWRkcl9lbmQodmFkZHIsIGVuZCk7Ci0KLQkJaWYgKG5leHQgLSB2YWRkciAmZ3Q7PSBQTURfU0laRSAmYW1wOyZhbXA7Ci0JCSAgICB2YWRkciAmbHQ7PSAodmFkZHIgJmFtcDsgUE1EX01BU0spICZhbXA7JmFtcDsgZW5kICZndDs9IG5leHQpCi0JCQljb250aW51ZTsKLQotCQlpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kcCkpKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcHRlX3BhZ2U7Ci0JCQl1bnNpZ25lZCBsb25nIHBmbiA9IF9wbWRfcGZuKHBtZHBfZ2V0KHBtZHApKTsKLQkJCXBncHJvdF90IHByb3QgPSBfX3BncHJvdChwbWRfdmFsKHBtZHBfZ2V0KHBtZHApKSAmYW1wOyB+X1BBR0VfUEZOX01BU0spOwotCQkJcHRlX3QgKnB0ZXBfbmV3OwotCQkJaW50IGk7Ci0KLQkJCXB0ZV9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQkJCWlmICghcHRlX3BhZ2UpCi0JCQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CXN0cnVjdCBwYWdlICpiYXNlID0gcHRkZXNjX3BhZ2Uoc2QtJmd0O3B0ZGVzYyk7CiYjNDM7CXB0ZV90IG9sZCA9IHB0ZXBfZ2V0KHNkLSZndDtrcHRlKTsKJiM0MzsJcGdwcm90X3QgcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkKSAmYW1wOyB+X1BBR0VfUEZOX01BU0spOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm5pbmM7CiYjNDM7CiYjNDM7CXN3aXRjaCAoc2QtJmd0O2xldmVsKSB7CiYjNDM7CWNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6CiYjNDM7CQlwZm5pbmMgPSAxOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUEdUQUJMRV9MRVZFTF9QVUQ6CiYjNDM7CQlwZm5pbmMgPSBQTURfU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUEdUQUJMRV9MRVZFTF9QNEQ6CiYjNDM7CQlwZm5pbmMgPSBQVURfU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJYnJlYWs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQogCi0JCQlwdGVwX25ldyA9IChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhwdGVfcGFnZSk7Ci0JCQlmb3IgKGkgPSAwOyBpICZsdDsgUFRSU19QRVJfUFRFOyAmIzQzOyYjNDM7aSwgJiM0MzsmIzQzO3B0ZXBfbmV3KQotCQkJCXNldF9wdGUocHRlcF9uZXcsIHBmbl9wdGUocGZuICYjNDM7IGksIHByb3QpKTsKJiM0MzsJc3BsaXRfc2V0X3B0ZXMoKHB0ZV90ICopcGFnZV9hZGRyZXNzKGJhc2UpLCBwZm4sIHBmbmluYywgcHJvdCk7CiAKLQkJCXNtcF93bWIoKTsKJiM0MzsJc21wX3dtYigpOwomIzQzOwlzZXRfcHRlKHNkLSZndDtrcHRlLCBwZm5fcHRlKHBhZ2VfdG9fcGZuKGJhc2UpLCBQQUdFX1RBQkxFKSk7CiAKLQkJCXNldF9wbWQocG1kcCwgcGZuX3BtZChwYWdlX3RvX3BmbihwdGVfcGFnZSksIFBBR0VfVEFCTEUpKTsKLQkJfQotCX0gd2hpbGUgKHBtZHAmIzQzOyYjNDM7LCB2YWRkciA9IG5leHQsIHZhZGRyICE9IGVuZCk7CiYjNDM7CWNwYS0mZ3Q7ZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCOwomIzQzOwljcGEtJmd0O2ZvcmNlX2ZsdXNoX2FsbCA9IDE7CiAKIAlyZXR1cm4gMDsKJiM0MzsjZWxzZQomIzQzOwlXQVJOX09OX09OQ0UoMSk7CiYjNDM7CXJldHVybiAtRUlOVkFMOwomIzQzOyNlbmRpZgogfQogCi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcHVkKHA0ZF90ICpwNGRwLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKQomIzQzO3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQkgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KQogewotCXB1ZF90ICpwdWRwOwotCXVuc2lnbmVkIGxvbmcgbmV4dDsKLQlpbnQgcmV0OwotCi0JcHVkcCA9IHB1ZF9vZmZzZXQocDRkcCwgdmFkZHIpOwotCi0JZG8gewotCQluZXh0ID0gcHVkX2FkZHJfZW5kKHZhZGRyLCBlbmQpOwotCi0JCWlmIChuZXh0IC0gdmFkZHIgJmd0Oz0gUFVEX1NJWkUgJmFtcDsmYW1wOwotCQkgICAgdmFkZHIgJmx0Oz0gKHZhZGRyICZhbXA7IFBVRF9NQVNLKSAmYW1wOyZhbXA7IGVuZCAmZ3Q7PSBuZXh0KQotCQkJY29udGludWU7CiYjNDM7CXBncHJvdF90IG5ld19wcm90ID0gX19wZ3Byb3QocHRlX3ZhbChvbGRfcHRlKSAmYW1wOyB+X1BBR0VfUEZOX01BU0spOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7CiYjNDM7CXB0ZV90IG5ld19wdGU7CiAKLQkJaWYgKHB1ZF9sZWFmKHB1ZHBfZ2V0KHB1ZHApKSkgewotCQkJc3RydWN0IHBhZ2UgKnBtZF9wYWdlOwotCQkJdW5zaWduZWQgbG9uZyBwZm4gPSBfcHVkX3BmbihwdWRwX2dldChwdWRwKSk7Ci0JCQlwZ3Byb3RfdCBwcm90ID0gX19wZ3Byb3QocHVkX3ZhbChwdWRwX2dldChwdWRwKSkgJmFtcDsgfl9QQUdFX1BGTl9NQVNLKTsKLQkJCXBtZF90ICpwbWRwX25ldzsKLQkJCWludCBpOwomIzQzOwlwZ3Byb3RfdmFsKG5ld19wcm90KSAmYW1wOz0gfnBncHJvdF92YWwoY3BhLSZndDttYXNrX2Nscik7CiYjNDM7CXBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLSZndDttYXNrX3NldCk7CiAKLQkJCXBtZF9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQkJCWlmICghcG1kX3BhZ2UpCi0JCQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CW5ld19wdGUgPSBwZm5fcHRlKHBmbiwgbmV3X3Byb3QpOwomIzQzOwljcGEtJmd0O3BmbiA9IHBmbjsKIAotCQkJcG1kcF9uZXcgPSAocG1kX3QgKilwYWdlX2FkZHJlc3MocG1kX3BhZ2UpOwotCQkJZm9yIChpID0gMDsgaSAmbHQ7IFBUUlNfUEVSX1BNRDsgJiM0MzsmIzQzO2ksICYjNDM7JiM0MztwbWRwX25ldykKLQkJCQlzZXRfcG1kKHBtZHBfbmV3LAotCQkJCQlwZm5fcG1kKHBmbiAmIzQzOyAoKGkgKiBQTURfU0laRSkgJmd0OyZndDsgUEFHRV9TSElGVCksIHByb3QpKTsKLQotCQkJc21wX3dtYigpOwotCi0JCQlzZXRfcHVkKHB1ZHAsIHBmbl9wdWQocGFnZV90b19wZm4ocG1kX3BhZ2UpLCBQQUdFX1RBQkxFKSk7Ci0JCX0KLQotCQlyZXQgPSBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BtZChwdWRwLCB2YWRkciwgbmV4dCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gd2hpbGUgKHB1ZHAmIzQzOyYjNDM7LCB2YWRkciA9IG5leHQsIHZhZGRyICE9IGVuZCk7Ci0KLQlyZXR1cm4gMDsKJiM0MzsJaWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkgewomIzQzOwkJc2V0X3B0ZShrcHRlLCBuZXdfcHRlKTsKJiM0MzsJCWNwYS0mZ3Q7ZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCOwomIzQzOwl9CiB9CiAKLXN0YXRpYyBpbnQgX19zcGxpdF9saW5lYXJfbWFwcGluZ19wNGQocGdkX3QgKnBnZHAsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCiYjNDM7aW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiYjNDM7CQkJICAgaW50IHByaW1hcnkpCiB7Ci0JcDRkX3QgKnA0ZHA7Ci0JdW5zaWduZWQgbG9uZyBuZXh0OwotCWludCByZXQ7Ci0KLQlwNGRwID0gcDRkX29mZnNldChwZ2RwLCB2YWRkcik7Ci0KLQlkbyB7Ci0JCW5leHQgPSBwNGRfYWRkcl9lbmQodmFkZHIsIGVuZCk7Ci0KLQkJLyoKLQkJICogSWYgW3ZhZGRyOyBlbmRdIGNvbnRhaW5zIFt2YWRkciAmYW1wOyBQNERfTUFTSzsgbmV4dF0sIHdlIGRvbiYjMzk7dAotCQkgKiBuZWVkIHRvIHNwbGl0LCB3ZSYjMzk7bGwgY2hhbmdlIHRoZSBwcm90ZWN0aW9ucyBvbiB0aGUgd2hvbGUgUDRELgotCQkgKi8KLQkJaWYgKG5leHQgLSB2YWRkciAmZ3Q7PSBQNERfU0laRSAmYW1wOyZhbXA7Ci0JCSAgICB2YWRkciAmbHQ7PSAodmFkZHIgJmFtcDsgUDREX01BU0spICZhbXA7JmFtcDsgZW5kICZndDs9IG5leHQpCi0JCQljb250aW51ZTsKLQotCQlpZiAocDRkX2xlYWYocDRkcF9nZXQocDRkcCkpKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcHVkX3BhZ2U7Ci0JCQl1bnNpZ25lZCBsb25nIHBmbiA9IF9wNGRfcGZuKHA0ZHBfZ2V0KHA0ZHApKTsKLQkJCXBncHJvdF90IHByb3QgPSBfX3BncHJvdChwNGRfdmFsKHA0ZHBfZ2V0KHA0ZHApKSAmYW1wOyB+X1BBR0VfUEZOX01BU0spOwotCQkJcHVkX3QgKnB1ZHBfbmV3OwotCQkJaW50IGk7Ci0KLQkJCXB1ZF9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQkJCWlmICghcHVkX3BhZ2UpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCS8qCi0JCQkgKiBGaWxsIHRoZSBwdWQgbGV2ZWwgd2l0aCBsZWFmIHB1ZHMgdGhhdCBoYXZlIHRoZSBzYW1lCi0JCQkgKiBwcm90ZWN0aW9ucyBhcyB0aGUgbGVhZiBwNGQuCi0JCQkgKi8KLQkJCXB1ZHBfbmV3ID0gKHB1ZF90ICopcGFnZV9hZGRyZXNzKHB1ZF9wYWdlKTsKLQkJCWZvciAoaSA9IDA7IGkgJmx0OyBQVFJTX1BFUl9QVUQ7ICYjNDM7JiM0MztpLCAmIzQzOyYjNDM7cHVkcF9uZXcpCi0JCQkJc2V0X3B1ZChwdWRwX25ldywKLQkJCQkJcGZuX3B1ZChwZm4gJiM0MzsgKChpICogUFVEX1NJWkUpICZndDsmZ3Q7IFBBR0VfU0hJRlQpLCBwcm90KSk7Ci0KLQkJCS8qCi0JCQkgKiBNYWtlIHN1cmUgdGhlIHB1ZCBmaWxsaW5nIGlzIG5vdCByZW9yZGVyZWQgd2l0aCB0aGUKLQkJCSAqIHA0ZCBzdG9yZSB3aGljaCBjb3VsZCByZXN1bHQgaW4gc2VlaW5nIGEgcGFydGlhbGx5Ci0JCQkgKiBmaWxsZWQgcHVkIGxldmVsLgotCQkJICovCi0JCQlzbXBfd21iKCk7Ci0KLQkJCXNldF9wNGQocDRkcCwgcGZuX3A0ZChwYWdlX3RvX3BmbihwdWRfcGFnZSksIFBBR0VfVEFCTEUpKTsKLQkJfQotCi0JCXJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcHVkKHA0ZHAsIHZhZGRyLCBuZXh0KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSB3aGlsZSAocDRkcCYjNDM7JiM0MzssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTsKJiM0MzsJY3BhLSZndDtudW1wYWdlcyA9IDE7CiAKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BnZChwZ2RfdCAqcGdkcCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhZGRyLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXVuc2lnbmVkIGxvbmcgbmV4dDsKLQlpbnQgcmV0OwomIzQzOwlpZiAoIXByaW1hcnkpCiYjNDM7CQlyZXR1cm4gMDsKIAotCWRvIHsKLQkJbmV4dCA9IHBnZF9hZGRyX2VuZCh2YWRkciwgZW5kKTsKLQkJLyogV2UgbmV2ZXIgdXNlIFBHRCBtYXBwaW5ncyBmb3IgdGhlIGxpbmVhciBtYXBwaW5nICovCi0JCXJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcDRkKHBnZHAsIHZhZGRyLCBuZXh0KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSB3aGlsZSAocGdkcCYjNDM7JiM0MzssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTsKJiM0MzsJLyogVGhlIGxpbmVhciBtYXAgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBob2xlcyAqLwomIzQzOwlpZiAoaXNfbGluZWFyX21hcHBpbmcodmFkZHIpKSB7CiYjNDM7CQljcGEtJmd0O3BmbiA9IFBGTl9ET1dOKF9fcGEodmFkZHIpKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiAKLQlyZXR1cm4gMDsKLX0KJiM0MzsJV0FSTigxLCAmIzM0O0NQQTogY2FsbGVkIGZvciB6ZXJvIHB0ZS4gdmFkZHIgPSAlbHggY3BhLSZndDt2YWRkciA9ICVseFxuJiMzNDssCiYjNDM7CSAgICAgdmFkZHIsICpjcGEtJmd0O3ZhZGRyKTsKIAotc3RhdGljIGludCBzcGxpdF9saW5lYXJfbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlyZXR1cm4gX19zcGxpdF9saW5lYXJfbWFwcGluZ19wZ2QocGdkX29mZnNldF9rKHN0YXJ0KSwgc3RhcnQsIGVuZCk7CiYjNDM7CXJldHVybiAtRUZBVUxUOwogfQotI2VuZGlmCS8qIENPTkZJR182NEJJVCAqLwogCi1zdGF0aWMgaW50IF9fc2V0X21lbW9yeSh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcywgcGdwcm90X3Qgc2V0X21hc2ssCi0JCQlwZ3Byb3RfdCBjbGVhcl9tYXNrKQomIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKQogewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBzdGFydCAmIzQzOyBQQUdFX1NJWkUgKiBudW1wYWdlczsKLQl1bnNpZ25lZCBsb25nIF9fbWF5YmVfdW51c2VkIGxtX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgbG1fZW5kOwotCXN0cnVjdCBwYWdlYXR0cl9tYXNrcyBtYXNrcyA9IHsKLQkJLnNldF9tYXNrID0gc2V0X21hc2ssCi0JCS5jbGVhcl9tYXNrID0gY2xlYXJfbWFzawotCX07Ci0KLQlpZiAoIW51bXBhZ2VzKQotCQlyZXR1cm4gMDsKJiM0MzsJc3RydWN0IGNwYV9kYXRhIGFsaWFzX2NwYTsKJiM0MzsJdW5zaWduZWQgbG9uZyBsYWRkcjsKIAotCW1tYXBfd3JpdGVfbG9jaygmYW1wO2luaXRfbW0pOwotCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJLyoKLQkgKiBXZSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGtlcm5lbCBtYXBwaW5nLCB3ZSBtdXN0Ci0JICogYXBwbHkgdGhlIHNhbWUgY2hhbmdlcyB0byBpdHMgbGluZWFyIG1hcHBpbmcgYWxpYXMsIHdoaWNoIG1heSBpbXBseQotCSAqIHNwbGl0dGluZyBhIGh1Z2UgbWFwcGluZy4KJiM0MzsJICogY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoKSBvbmx5IGxldHMgbm9uIGxpbmVhciBtYXAgcHJpbWFyaWVzIHJlYWNoCiYjNDM7CSAqIGhlcmUsIHNvIEBjcGEtJmd0O3BmbiBhbHdheXMgaGFzIGEgbGluZWFyIG1hcCBhbGlhcyB0aGF0IG11c3QgcmVjZWl2ZQomIzQzOwkgKiB0aGUgc2FtZSBwcm90ZWN0aW9uIGNoYW5nZS4KIAkgKi8KJiM0MzsJbGFkZHIgPSAodW5zaWduZWQgbG9uZylfX3ZhKFBGTl9QSFlTKGNwYS0mZ3Q7cGZuKSk7CiAKLQlpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcigodm9pZCAqKXN0YXJ0KSkgewotCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhID0gTlVMTDsKLQkJaW50IGksIHBhZ2Vfc3RhcnQ7Ci0KLQkJYXJlYSA9IGZpbmRfdm1fYXJlYSgodm9pZCAqKXN0YXJ0KTsKLQkJcGFnZV9zdGFydCA9IChzdGFydCAtICh1bnNpZ25lZCBsb25nKWFyZWEtJmd0O2FkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7Ci0KLQkJZm9yIChpID0gcGFnZV9zdGFydDsgaSAmbHQ7IHBhZ2Vfc3RhcnQgJiM0MzsgbnVtcGFnZXM7ICYjNDM7JiM0MztpKSB7Ci0JCQlsbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhhcmVhLSZndDtwYWdlc1tpXSk7Ci0JCQlsbV9lbmQgPSBsbV9zdGFydCAmIzQzOyBQQUdFX1NJWkU7Ci0KLQkJCXJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIHVubG9jazsKLQotCQkJcmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShsbV9zdGFydCwgbG1fZW5kLAotCQkJCQkJICAgICZhbXA7cGFnZWF0dHJfb3BzLCBOVUxMLCAmYW1wO21hc2tzKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byB1bmxvY2s7Ci0JCX0KLQl9IGVsc2UgaWYgKGlzX2tlcm5lbF9tYXBwaW5nKHN0YXJ0KSB8fCBpc19saW5lYXJfbWFwcGluZyhzdGFydCkpIHsKLQkJaWYgKGlzX2tlcm5lbF9tYXBwaW5nKHN0YXJ0KSkgewotCQkJbG1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylsbV9hbGlhcyhzdGFydCk7Ci0JCQlsbV9lbmQgPSAodW5zaWduZWQgbG9uZylsbV9hbGlhcyhlbmQpOwotCQl9IGVsc2UgewotCQkJbG1fc3RhcnQgPSBzdGFydDsKLQkJCWxtX2VuZCA9IGVuZDsKLQkJfQotCi0JCXJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpOwotCQlpZiAocmV0KQotCQkJZ290byB1bmxvY2s7Ci0KLQkJcmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShsbV9zdGFydCwgbG1fZW5kLAotCQkJCQkgICAgJmFtcDtwYWdlYXR0cl9vcHMsIE5VTEwsICZhbXA7bWFza3MpOwotCQlpZiAocmV0KQotCQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcmV0ID0gIHdhbGtfa2VybmVsX3BhZ2VfdGFibGVfcmFuZ2Uoc3RhcnQsIGVuZCwgJmFtcDtwYWdlYXR0cl9vcHMsIE5VTEwsCi0JCQkJICAgICAmYW1wO21hc2tzKTsKJiM0MzsJYWxpYXNfY3BhID0gKmNwYTsKJiM0MzsJYWxpYXNfY3BhLnZhZGRyID0gJmFtcDtsYWRkcjsKJiM0MzsJYWxpYXNfY3BhLmZsYWdzICZhbXA7PSB+KENQQV9QQUdFU19BUlJBWSB8IENQQV9BUlJBWSk7CiYjNDM7CWFsaWFzX2NwYS5jdXJwYWdlID0gMDsKIAotdW5sb2NrOgotCW1tYXBfd3JpdGVfdW5sb2NrKCZhbXA7aW5pdF9tbSk7CiYjNDM7CS8qIFRoZSBsaW5lYXIgbWFwIGFsaWFzIG11c3QgbmV2ZXIgYmUgbWFkZSBleGVjdXRhYmxlICovCiYjNDM7CWFsaWFzX2NwYS5tYXNrX3NldCA9IF9fcGdwcm90KHBncHJvdF92YWwoYWxpYXNfY3BhLm1hc2tfc2V0KSAmYW1wOyB+X1BBR0VfRVhFQyk7CiYjNDM7CWFsaWFzX2NwYS5tYXNrX2NsciA9IF9fcGdwcm90KHBncHJvdF92YWwoYWxpYXNfY3BhLm1hc2tfY2xyKSAmYW1wOyB+X1BBR0VfRVhFQyk7CiAKLQkvKgotCSAqIFdlIGNhbiYjMzk7dCB1c2UgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSgpIGhlcmUgYXMgd2UgbWF5IGhhdmUgc3BsaXQgYQotCSAqIGh1Z2VwYWdlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhhdCwgc28gbGV0JiMzOTtzIGZsdXNoIGV2ZXJ5dGhpbmcuCi0JICovCi0JZmx1c2hfdGxiX2FsbCgpOwotI2Vsc2UKLQlyZXQgPSAgd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCAmYW1wO3BhZ2VhdHRyX29wcywgTlVMTCwKLQkJCQkgICAgICZhbXA7bWFza3MpOwomIzQzOwljcGEtJmd0O2ZvcmNlX2ZsdXNoX2FsbCA9IDE7CiAKLQltbWFwX3dyaXRlX3VubG9jaygmYW1wO2luaXRfbW0pOwomIzQzOwlyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmFtcDthbGlhc19jcGEsIDApOwomIzQzO30KIAotCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7Ci0jZW5kaWYKJiM0Mzt2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKQomIzQzO3sKJiM0MzsJaWYgKGVyciB8fCBjcGEtJmd0O2ZvcmNlX2ZsdXNoX2FsbCB8fAomIzQzOwkgICAgKGNwYS0mZ3Q7ZmxhZ3MgJmFtcDsgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpKSB7CiYjNDM7CQlmbHVzaF90bGJfYWxsKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KIAotCXJldHVybiByZXQ7CiYjNDM7CWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKmNwYS0mZ3Q7dmFkZHIsCiYjNDM7CQkJICAgICAgICpjcGEtJmd0O3ZhZGRyICYjNDM7IGNwYS0mZ3Q7bnVtcGFnZXMgKiBQQUdFX1NJWkUpOwogfQogCiBpbnQgc2V0X21lbW9yeV9yd19ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIHsKLQlyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEIHwgX1BBR0VfV1JJVEUpLAotCQkJICAgIF9fcGdwcm90KF9QQUdFX0VYRUMpKTsKJiM0MzsJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscigmYW1wO2FkZHIsIG51bXBhZ2VzLAomIzQzOwkJCQkJX19wZ3Byb3QoX1BBR0VfUkVBRCB8IF9QQUdFX1dSSVRFKSwKJiM0MzsJCQkJCV9fcGdwcm90KF9QQUdFX0VYRUMpLCAwLCAwLCBOVUxMKTsKIH0KIAogaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUkVBRCksCi0JCQkgICAgX19wZ3Byb3QoX1BBR0VfV1JJVEUpKTsKJiM0MzsJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscigmYW1wO2FkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEKSwKJiM0MzsJCQkJCV9fcGdwcm90KF9QQUdFX1dSSVRFKSwgMCwgMCwgTlVMTCk7CiB9CiAKIGludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogewotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksCi0JCQkgICAgX19wZ3Byb3QoMCkpOwomIzQzOwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoJmFtcDthZGRyLCBudW1wYWdlcywKJiM0MzsJCQkJICAgIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksIDApOwogfQogCiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogewotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCBfX3BncHJvdCgwKSk7CiYjNDM7CXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmYW1wO2FkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9FWEVDKSwgMCk7CiB9CiAKIGludCBzZXRfbWVtb3J5X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogewotCXJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9FWEVDKSk7CiYjNDM7CXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKCZhbXA7YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCAwKTsKIH0KIAogaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgMSwKLQkJCSAgICBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCkpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwomIzQzOwlzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSAmYW1wO3N0YXJ0LAomIzQzOwkJCQkucGdkID0gTlVMTCwKJiM0MzsJCQkJLm51bXBhZ2VzID0gMSwKJiM0MzsJCQkJLm1hc2tfc2V0ID0gX19wZ3Byb3QoMCksCiYjNDM7CQkJCS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpLAomIzQzOwkJCQkuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZhbXA7Y3BhLCAxKTsKIH0KIAogaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgMSwKLQkJCSAgICBQQUdFX0tFUk5FTCwgX19wZ3Byb3QoX1BBR0VfRVhFQykpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwomIzQzOwlzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSAmYW1wO3N0YXJ0LAomIzQzOwkJCQkucGdkID0gTlVMTCwKJiM0MzsJCQkJLm51bXBhZ2VzID0gMSwKJiM0MzsJCQkJLm1hc2tfc2V0ID0gUEFHRV9LRVJORUwsCiYjNDM7CQkJCS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX0VYRUMpLAomIzQzOwkJCQkuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZhbXA7Y3BhLCAxKTsKIH0KIAogaW50IHNldF9kaXJlY3RfbWFwX3ZhbGlkX25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG5yLCBib29sIHZhbGlkKQogewotCXBncHJvdF90IHNldCwgY2xlYXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CiYjNDM7CXN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9ICZhbXA7c3RhcnQsCiYjNDM7CQkJCS5wZ2QgPSBOVUxMLAomIzQzOwkJCQkubnVtcGFnZXMgPSBuciwKJiM0MzsJCQkJLmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07CiAKIAlpZiAodmFsaWQpIHsKLQkJc2V0ID0gUEFHRV9LRVJORUw7Ci0JCWNsZWFyID0gX19wZ3Byb3QoX1BBR0VfRVhFQyk7CiYjNDM7CQljcGEubWFza19zZXQgPSBQQUdFX0tFUk5FTDsKJiM0MzsJCWNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX0VYRUMpOwogCX0gZWxzZSB7Ci0JCXNldCA9IF9fcGdwcm90KDApOwotCQljbGVhciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpOwomIzQzOwkJY3BhLm1hc2tfc2V0ID0gX19wZ3Byb3QoMCk7CiYjNDM7CQljcGEubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UKTsKIAl9CiAKLQlyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgbnIsIHNldCwgY2xlYXIpOwomIzQzOwlyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmFtcDtjcGEsIDEpOwogfQogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwpAQCAtNDM1LDM2ICYjNDM7Mjc1LDExIEBAIHZvaWQgX19rZXJuZWxfbWFwX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMsIGludCBlbmFibGUpCiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwotCXBnZF90ICpwZ2Q7Ci0JcHVkX3QgKnB1ZDsKLQlwNGRfdCAqcDRkOwotCXBtZF90ICpwbWQ7Ci0JcHRlX3QgKnB0ZTsKLQotCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKLQlpZiAoIXBnZF9wcmVzZW50KHBnZHBfZ2V0KHBnZCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHBnZF9sZWFmKHBnZHBfZ2V0KHBnZCkpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXA0ZCA9IHA0ZF9vZmZzZXQocGdkLCBhZGRyKTsKLQlpZiAoIXA0ZF9wcmVzZW50KHA0ZHBfZ2V0KHA0ZCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHA0ZF9sZWFmKHA0ZHBfZ2V0KHA0ZCkpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXB1ZCA9IHB1ZF9vZmZzZXQocDRkLCBhZGRyKTsKLQlpZiAoIXB1ZF9wcmVzZW50KHB1ZHBfZ2V0KHB1ZCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHB1ZF9sZWFmKHB1ZHBfZ2V0KHB1ZCkpKQotCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJdW5zaWduZWQgaW50IGxldmVsOwomIzQzOwlwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkciwgJmFtcDtsZXZlbCk7CiAKLQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7Ci0JaWYgKCFwbWRfcHJlc2VudChwbWRwX2dldChwbWQpKSkKJiM0MzsJaWYgKCFwdGUpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kKSkpCi0JCXJldHVybiB0cnVlOwogCi0JcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyKTsKIAlyZXR1cm4gcHRlX3ByZXNlbnQocHRlcF9nZXQocHRlKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBiZGFkOTBmMjEwZTRiZi4uZTFmMTA1ZTUyZDZhMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMzM2LDYgJiM0MzszMzYsNyBAQCBjb25maWcgWDg2CiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfU0NIRURfQ0xVU1RFUglpZiBTTVAKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19TQ0hFRF9NQwkJaWYgU01QCiAJc2VsZWN0IEhBVkVfU0lOR0xFX0ZUUkFDRV9ESVJFQ1RfT1BTCWlmIFg4Nl82NCAmYW1wOyZhbXA7IERZTkFNSUNfRlRSQUNFX1dJVEhfRElSRUNUX0NBTExTCiYjNDM7CXNlbGVjdCBHRU5FUklDX1NFVF9NRU1PUlkKIAogY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVIKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwppbmRleCBjOTVjM2FhYWRmOTdjMy4uMzE0YjcyYWFkNmZmZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuZGVidWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwpAQCAtMTU3LDEyICYjNDM7MTU3LDYgQEAgY29uZmlnIERFQlVHX0JPT1RfUEFSQU1TCiAJaGVscAogCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdHJ1Y3QgYm9vdF9wYXJhbXMgdG8gYmUgZXhwb3J0ZWQgdmlhIGRlYnVnZnMuCiAKLWNvbmZpZyBDUEFfREVCVUcKLQlib29sICYjMzQ7Q1BBIHNlbGYtdGVzdCBjb2RlJiMzNDsKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAotCWhlbHAKLQkgIERvIGNoYW5nZV9wYWdlX2F0dHIoKSBzZWxmLXRlc3RzIGV2ZXJ5IDMwIHNlY29uZHMuCi0KIGNvbmZpZyBERUJVR19FTlRSWQogCWJvb2wgJiMzNDtEZWJ1ZyBsb3ctbGV2ZWwgZW50cnkgY29kZSYjMzQ7CiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBhYzI5NWNhNmM5MmY5OS4uNDk3YWFmMDhhZDM2MTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTIyNyw2ICYjNDM7MjI3LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpCiAJcmV0dXJuIHB1ZF9mbGFncyhwdWQpICZhbXA7IF9QQUdFX1JXOwogfQogCiYjNDM7I2RlZmluZSBwNGRfd3JpdGUgcDRkX3dyaXRlCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwNGRfZmxhZ3MocDRkKSAmYW1wOyBfUEFHRV9SVzsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcGdkX3dyaXRlKHBnZF90IHBnZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwZ2RfZmxhZ3MocGdkKSAmYW1wOyBfUEFHRV9SVzsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBtZF9leGVjKHBtZF90IHBtZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHBtZF9mbGFncyhwbWQpICZhbXA7IF9QQUdFX05YKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwdWRfZXhlYyBwdWRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHB1ZF9mbGFncyhwdWQpICZhbXA7IF9QQUdFX05YKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHA0ZF9leGVjKHA0ZF90IHA0ZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHA0ZF9mbGFncyhwNGQpICZhbXA7IF9QQUdFX05YKTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlYwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHBnZF9leGVjKHBnZF90IHBnZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAhKHBnZF9mbGFncyhwZ2QpICZhbXA7IF9QQUdFX05YKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV9mbGFncyhwdGUpICZhbXA7IF9QQUdFX1BTRTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaAppbmRleCA0MzYyYzI2YWE5OTJkYi4uMzMyZWMzMDBjMmVkOWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmgKQEAgLTMsMTIgJiM0MzszLDYyIEBACiAjZGVmaW5lIF9BU01fWDg2X1NFVF9NRU1PUllfSAogCiAjaW5jbHVkZSAmbHQ7YXNtL3BhZ2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YXNtL3NlY3Rpb25zLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtLWdlbmVyaWMvc2V0X21lbW9yeS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9wZ3RhYmxlLmgmZ3Q7CiAKICNkZWZpbmUgc2V0X21lbW9yeV9yb3ggc2V0X21lbW9yeV9yb3gKIGludCBzZXRfbWVtb3J5X3JveCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcyk7CiAKJiM0MzsjaWZkZWYgQ09ORklHX1g4Nl82NAomIzQzOy8qCiYjNDM7ICogVGhlIGtlcm5lbCBpbWFnZSBpcyBtYXBwZWQgaW50byB0d28gcGxhY2VzIGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKJiM0MzsgKiAoYWRkcmVzc2VzIHdpdGhvdXQgS0FTTFIsIG9mIGNvdXJzZSk6CiYjNDM7ICoKJiM0MzsgKiAxLiBUaGUga2VybmVsIGRpcmVjdCBtYXAgKDB4ZmZmZjg4MDAwMDAwMDAwMCkKJiM0MzsgKiAyLiBUaGUgJiMzNDtoaWdoIGtlcm5lbCBtYXAmIzM0OyAoMHhmZmZmZmZmZjgxMDAwMDAwKQomIzQzOyAqCiYjNDM7ICogV2UgYWN0dWFsbHkgZXhlY3V0ZSBvdXQgb2YgIzIuIElmIHdlIGdldCB0aGUgYWRkcmVzcyBvZiBhIGtlcm5lbCBzeW1ib2wsIGl0CiYjNDM7ICogcG9pbnRzIHRvICMyLCBidXQgYWxtb3N0IGFsbCBwaHlzaWNhbC10by12aXJ0dWFsIHRyYW5zbGF0aW9ucyBwb2ludCB0byAjMS4KJiM0MzsgKgomIzQzOyAqIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGF2ZSBib3RoIGEgZGlyZWN0bWFwIG9mIGFsbCBwaHlzaWNhbCBtZW1vcnkgKmFuZCoKJiM0MzsgKiB0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIHRoZSBsaW1pdGVkIChzMzIpIGltbWVkaWF0ZSBhZGRyZXNzaW5nIHJhbmdlICgyRykKJiM0MzsgKiBvZiB4ODZfNjQuCiYjNDM7ICoKJiM0MzsgKiBTZWUgRG9jdW1lbnRhdGlvbi9hcmNoL3g4Ni94ODZfNjQvbW0ucnN0IGZvciBtb3JlIGRldGFpbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGZuX2lzX2tlcm5lbCh1bnNpZ25lZCBsb25nIHBmbikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3BmbiA9IF9fcGFfc3ltYm9sKF90ZXh0KSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkvKiBEbyBub3QgcmVmZXJlbmNlIGEgcGh5c2ljYWwgYWRkcmVzcyBvdXRzaWRlIHRoZSBrZXJuZWwuICovCiYjNDM7CXVuc2lnbmVkIGxvbmcgZXBmbiA9IF9fcGFfc3ltYm9sKHJvdW5kdXAoX2Jya19lbmQsIFBNRF9TSVpFKSAtIDEpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CXJldHVybiBwZm4gJmd0Oz0gc3BmbiAmYW1wOyZhbXA7IHBmbiAmbHQ7PSBlcGZuOwomIzQzO30KJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwZm5faXNfa2VybmVsKHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJLyogVGhlcmUgaXMgbm8gaGlnaG1hcCBvbiAzMi1iaXQgKi8KJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsjZW5kaWYKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXModW5zaWduZWQgbG9uZyB2YWRkciwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJLyogUHJpbWFyeSBpcyBub3QgaW4gdGhlIGRpcmVjdCBtYXAsIGl0cyBkaXJlY3QgbWFwIGFsaWFzIG5lZWRzIHVwZGF0ZSAqLwomIzQzOwlpZiAodmFkZHIgJmx0OyBQQUdFX09GRlNFVCB8fAomIzQzOwkgICAgdmFkZHIgJmd0Oz0gUEFHRV9PRkZTRVQgJiM0MzsgKG1heF9wZm5fbWFwcGVkICZsdDsmbHQ7IFBBR0VfU0hJRlQpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CS8qIGRpcmVjdCBtYXAgcGFnZSB0aGF0IGlzIGFsc28gcGFydCBvZiB0aGUga2VybmVsIGhpZ2htYXAgKi8KJiM0MzsJaWYgKCh2YWRkciAmbHQ7ICh1bnNpZ25lZCBsb25nKV90ZXh0IHx8IHZhZGRyICZndDs9IF9icmtfZW5kKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBwZm5faXNfa2VybmVsKHBmbikpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIC8qCiAgKiBUaGUgc2V0X21lbW9yeV8qIEFQSSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIGEgdmlydHVhbAogICogYWRkcmVzcyByYW5nZS4gVGhlIGF0dHJpYnV0ZXMgaW5jbHVkZToKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmMgYi9hcmNoL3g4Ni9tbS9wYXQvc2V0X21lbW9yeS5jCmluZGV4IGQwMjNhNDBhMWUwMzQ1Li5jNDYwMTIxYzk2Yjk0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGF0L3NldF9tZW1vcnkuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3g4Ni9tbS9wYXQvc2V0X21lbW9yeS5jCkBAIC0zOCwyMSAmIzQzOzM4LDYgQEAKIC8qCiAgKiBUaGUgY3VycmVudCBmbHVzaGluZyBjb250ZXh0IC0gd2UgcGFzcyBpdCBpbnN0ZWFkIG9mIDUgYXJndW1lbnRzOgogICovCi1zdHJ1Y3QgY3BhX2RhdGEgewotCXVuc2lnbmVkIGxvbmcJKnZhZGRyOwotCXBnZF90CQkqcGdkOwotCXBncHJvdF90CW1hc2tfc2V0OwotCXBncHJvdF90CW1hc2tfY2xyOwotCXVuc2lnbmVkIGxvbmcJbnVtcGFnZXM7Ci0JdW5zaWduZWQgbG9uZwljdXJwYWdlOwotCXVuc2lnbmVkIGxvbmcJcGZuOwotCXVuc2lnbmVkIGludAlmbGFnczsKLQl1bnNpZ25lZCBpbnQJZm9yY2Vfc3BsaXQJCTogMSwKLQkJCWZvcmNlX3N0YXRpY19wcm90CTogMSwKLQkJCWZvcmNlX2ZsdXNoX2FsbAkJOiAxOwotCXN0cnVjdCBwYWdlCSoqcGFnZXM7Ci19OwotCiBlbnVtIGNwYV93YXJuIHsKIAlDUEFfQ09ORkxJQ1QsCiAJQ1BBX1BST1RFQ1QsCkBAIC02MSwyNyAmIzQzOzQ2LDEzIEBAIGVudW0gY3BhX3dhcm4gewogCiBzdGF0aWMgY29uc3QgaW50IGNwYV93YXJuX2xldmVsID0gQ1BBX1BST1RFQ1Q7CiAKLS8qCi0gKiBTZXJpYWxpemUgY3BhKCkgKGZvciAhREVCVUdfUEFHRUFMTE9DIHdoaWNoIHVzZXMgbGFyZ2UgaWRlbnRpdHkgbWFwcGluZ3MpCi0gKiB1c2luZyBjcGFfbG9jay4gU28gdGhhdCB3ZSBkb24mIzM5O3QgYWxsb3cgYW55IG90aGVyIGNwdSwgd2l0aCBzdGFsZSBsYXJnZSB0bGIKLSAqIGVudHJpZXMgY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdQotICogc3BsaXR0aW5nIGEgbGFyZ2UgcGFnZSBlbnRyeSBhbG9uZyB3aXRoIGNoYW5naW5nIHRoZSBhdHRyaWJ1dGUuCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spOwotCi0jZGVmaW5lIENQQV9GTFVTSFRMQiAxCi0jZGVmaW5lIENQQV9BUlJBWSAyCi0jZGVmaW5lIENQQV9QQUdFU19BUlJBWSA0Ci0jZGVmaW5lIENQQV9OT19DSEVDS19BTElBUyA4IC8qIERvIG5vdCBzZWFyY2ggZm9yIGFsaWFzZXMgKi8KLSNkZWZpbmUgQ1BBX0NPTExBUFNFIDE2IC8qIHRyeSB0byBjb2xsYXBzZSBsYXJnZSBwYWdlcyAqLwotCiBzdGF0aWMgaW5saW5lIHBncHJvdF90IGNhY2hlbW9kZTJwZ3Byb3QoZW51bSBwYWdlX2NhY2hlX21vZGUgcGNtKQogewogCXJldHVybiBfX3BncHJvdChjYWNoZW1vZGUycHJvdHZhbChwY20pKTsKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfTlVNXTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9OVU1dOwogCiB2b2lkIHVwZGF0ZV9wYWdlX2NvdW50KGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyBwYWdlcykKIHsKQEAgLTk4LDkgJiM0Mzs2OSw5IEBAIHN0YXRpYyB2b2lkIHNwbGl0X3BhZ2VfY291bnQoaW50IGxldmVsKQogCiAJZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsXS0tOwogCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpIHsKLQkJaWYgKGxldmVsID09IFBHX0xFVkVMXzJNKQomIzQzOwkJaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUE1EKQogCQkJY291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDJfU1BMSVQpOwotCQllbHNlIGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRykKJiM0MzsJCWVsc2UgaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEKQogCQkJY291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDNfU1BMSVQpOwogCX0KIAlkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWwgLSAxXSAmIzQzOz0gUFRSU19QRVJfUFRFOwpAQCAtMTEwLDkgJiM0Mzs4MSw5IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3BhZ2VfY291bnQoaW50IGxldmVsKQogewogCWRpcmVjdF9wYWdlc19jb3VudFtsZXZlbF0mIzQzOyYjNDM7OwogCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpIHsKLQkJaWYgKGxldmVsID09IFBHX0xFVkVMXzJNKQomIzQzOwkJaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUE1EKQogCQkJY291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDJfQ09MTEFQU0UpOwotCQllbHNlIGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRykKJiM0MzsJCWVsc2UgaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEKQogCQkJY291bnRfdm1fZXZlbnQoRElSRUNUX01BUF9MRVZFTDNfQ09MTEFQU0UpOwogCX0KIAlkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWwgLSAxXSAtPSBQVFJTX1BFUl9QVEU7CkBAIC0xMjEsMTcgJiM0Mzs5MiwxNyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9wYWdlX2NvdW50KGludCBsZXZlbCkKIHZvaWQgYXJjaF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc2VxX3ByaW50ZihtLCAmIzM0O0RpcmVjdE1hcDRrOiAgICAlOGx1IGtCXG4mIzM0OywKLQkJCWRpcmVjdF9wYWdlc19jb3VudFtQR19MRVZFTF80S10gJmx0OyZsdDsgMik7CiYjNDM7CQkJZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUFRFXSAmbHQ7Jmx0OyAyKTsKICNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9QQUUpCiAJc2VxX3ByaW50ZihtLCAmIzM0O0RpcmVjdE1hcDJNOiAgICAlOGx1IGtCXG4mIzM0OywKLQkJCWRpcmVjdF9wYWdlc19jb3VudFtQR19MRVZFTF8yTV0gJmx0OyZsdDsgMTEpOwomIzQzOwkJCWRpcmVjdF9wYWdlc19jb3VudFtQR1RBQkxFX0xFVkVMX1BNRF0gJmx0OyZsdDsgMTEpOwogI2Vsc2UKIAlzZXFfcHJpbnRmKG0sICYjMzQ7RGlyZWN0TWFwNE06ICAgICU4bHUga0JcbiYjMzQ7LAotCQkJZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzJNXSAmbHQ7Jmx0OyAxMik7CiYjNDM7CQkJZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUE1EXSAmbHQ7Jmx0OyAxMik7CiAjZW5kaWYKIAlpZiAoZGlyZWN0X2dicGFnZXMpCiAJCXNlcV9wcmludGYobSwgJiMzNDtEaXJlY3RNYXAxRzogICAgJThsdSBrQlxuJiMzNDssCi0JCQlkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfMUddICZsdDsmbHQ7IDIwKTsKJiM0MzsJCQlkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9QVURdICZsdDsmbHQ7IDIwKTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfcGFnZV9jb3VudChpbnQgbGV2ZWwpIHsgfQpAQCAtMTY1LDcgJiM0MzsxMzYsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY180a19pbnN0YWxsKHZvaWQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jX2xwX3NhbWVwcm90KGludCBsZXZlbCkKIHsKLQlpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMUcpCiYjNDM7CWlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRCkKIAkJY3BhXzFnX3NhbWVwcm90JiM0MzsmIzQzOzsKIAllbHNlCiAJCWNwYV8ybV9zYW1lcHJvdCYjNDM7JiM0Mzs7CkBAIC0xNzMsNyAmIzQzOzE0NCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jX2xwX3NhbWVwcm90KGludCBsZXZlbCkKIAogc3RhdGljIGlubGluZSB2b2lkIGNwYV9pbmNfbHBfcHJlc2VydmVkKGludCBsZXZlbCkKIHsKLQlpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMUcpCiYjNDM7CWlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRCkKIAkJY3BhXzFnX3ByZXNlcnZlZCYjNDM7JiM0Mzs7CiAJZWxzZQogCQljcGFfMm1fcHJlc2VydmVkJiM0MzsmIzQzOzsKQEAgLTIyNSw2MSAmIzQzOzE5Niw2IEBAIHdpdGhpbih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogCXJldHVybiBhZGRyICZndDs9IHN0YXJ0ICZhbXA7JmFtcDsgYWRkciAmbHQ7IGVuZDsKIH0KIAotI2lmZGVmIENPTkZJR19YODZfNjQKLQotc3RhdGljIGlubGluZSBpbnQKLXdpdGhpbl9pbmNsdXNpdmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlyZXR1cm4gYWRkciAmZ3Q7PSBzdGFydCAmYW1wOyZhbXA7IGFkZHIgJmx0Oz0gZW5kOwotfQotCi0vKgotICogVGhlIGtlcm5lbCBpbWFnZSBpcyBtYXBwZWQgaW50byB0d28gcGxhY2VzIGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKLSAqIChhZGRyZXNzZXMgd2l0aG91dCBLQVNMUiwgb2YgY291cnNlKToKLSAqCi0gKiAxLiBUaGUga2VybmVsIGRpcmVjdCBtYXAgKDB4ZmZmZjg4MDAwMDAwMDAwMCkKLSAqIDIuIFRoZSAmIzM0O2hpZ2gga2VybmVsIG1hcCYjMzQ7ICgweGZmZmZmZmZmODEwMDAwMDApCi0gKgotICogV2UgYWN0dWFsbHkgZXhlY3V0ZSBvdXQgb2YgIzIuIElmIHdlIGdldCB0aGUgYWRkcmVzcyBvZiBhIGtlcm5lbCBzeW1ib2wsIGl0Ci0gKiBwb2ludHMgdG8gIzIsIGJ1dCBhbG1vc3QgYWxsIHBoeXNpY2FsLXRvLXZpcnR1YWwgdHJhbnNsYXRpb25zIHBvaW50IHRvICMxLgotICoKLSAqIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGF2ZSBib3RoIGEgZGlyZWN0bWFwIG9mIGFsbCBwaHlzaWNhbCBtZW1vcnkgKmFuZCoKLSAqIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgdGhlIGxpbWl0ZWQgKHMzMikgaW1tZWRpYXRlIGFkZHJlc3NpbmcgcmFuZ2UgKDJHKQotICogb2YgeDg2XzY0LgotICoKLSAqIFNlZSBEb2N1bWVudGF0aW9uL2FyY2gveDg2L3g4Nl82NC9tbS5yc3QgZm9yIG1vcmUgZGV0YWlsLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoaWdobWFwX3N0YXJ0X3Bmbih2b2lkKQotewotCXJldHVybiBfX3BhX3N5bWJvbChfdGV4dCkgJmd0OyZndDsgUEFHRV9TSElGVDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhpZ2htYXBfZW5kX3Bmbih2b2lkKQotewotCS8qIERvIG5vdCByZWZlcmVuY2UgcGh5c2ljYWwgYWRkcmVzcyBvdXRzaWRlIHRoZSBrZXJuZWwuICovCi0JcmV0dXJuIF9fcGFfc3ltYm9sKHJvdW5kdXAoX2Jya19lbmQsIFBNRF9TSVpFKSAtIDEpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7Ci19Ci0KLXN0YXRpYyBib29sIF9fY3BhX3Bmbl9pbl9oaWdobWFwKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCS8qCi0JICogS2VybmVsIHRleHQgaGFzIGFuIGFsaWFzIG1hcHBpbmcgYXQgYSBoaWdoIGFkZHJlc3MsIGtub3duCi0JICogaGVyZSBhcyAmIzM0O2hpZ2htYXAmIzM0Oy4KLQkgKi8KLQlyZXR1cm4gd2l0aGluX2luY2x1c2l2ZShwZm4sIGhpZ2htYXBfc3RhcnRfcGZuKCksIGhpZ2htYXBfZW5kX3BmbigpKTsKLX0KLQotI2Vsc2UKLQotc3RhdGljIGJvb2wgX19jcGFfcGZuX2luX2hpZ2htYXAodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JLyogVGhlcmUgaXMgbm8gaGlnaG1hcCBvbiAzMi1iaXQgKi8KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZgotCiAvKgogICogU2VlIHNldF9tY2Vfbm9zcGVjKCkuCiAgKgpAQCAtMzAzLDIzICYjNDM7MjE5LDYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZpeF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKICNlbmRpZgogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2NwYV9hZGRyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGlkeCkKLXsKLQlpZiAoY3BhLSZndDtmbGFncyAmYW1wOyBDUEFfUEFHRVNfQVJSQVkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBjcGEtJmd0O3BhZ2VzW2lkeF07Ci0KLQkJaWYgKHVubGlrZWx5KFBhZ2VIaWdoTWVtKHBhZ2UpKSkKLQkJCXJldHVybiAwOwotCi0JCXJldHVybiAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7Ci0JfQotCi0JaWYgKGNwYS0mZ3Q7ZmxhZ3MgJmFtcDsgQ1BBX0FSUkFZKQotCQlyZXR1cm4gY3BhLSZndDt2YWRkcltpZHhdOwotCi0JcmV0dXJuICpjcGEtJmd0O3ZhZGRyICYjNDM7IGlkeCAqIFBBR0VfU0laRTsKLX0KLQogLyoKICAqIEZsdXNoaW5nIGZ1bmN0aW9ucwogICovCkBAIC00MDUsNyAmIzQzOzMwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY3BhX2ZsdXNoX3RsYih2b2lkICpkYXRhKQogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSAmbHQ7IGNwYS0mZ3Q7bnVtcGFnZXM7IGkmIzQzOyYjNDM7KQotCQlmbHVzaF90bGJfb25lX2tlcm5lbChmaXhfYWRkcihfX2NwYV9hZGRyKGNwYSwgaSkpKTsKJiM0MzsJCWZsdXNoX3RsYl9vbmVfa2VybmVsKGZpeF9hZGRyKGNwYV9hZGRyKGNwYSwgaSkpKTsKIH0KIAogc3RhdGljIGludCBjb2xsYXBzZV9sYXJnZV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBsaXN0X2hlYWQgKnBndGFibGVzKTsKQEAgLTQyMCwxMCAmIzQzOzMxOSwxMCBAQCBzdGF0aWMgdm9pZCBjcGFfY29sbGFwc2VfbGFyZ2VfcGFnZXMoc3RydWN0IGNwYV9kYXRhICpjcGEpCiAKIAlpZiAoY3BhLSZndDtmbGFncyAmYW1wOyAoQ1BBX1BBR0VTX0FSUkFZIHwgQ1BBX0FSUkFZKSkgewogCQlmb3IgKGkgPSAwOyBpICZsdDsgY3BhLSZndDtudW1wYWdlczsgaSYjNDM7JiM0MzspCi0JCQljb2xsYXBzZWQgJiM0Mzs9IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKF9fY3BhX2FkZHIoY3BhLCBpKSwKJiM0MzsJCQljb2xsYXBzZWQgJiM0Mzs9IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKGNwYV9hZGRyKGNwYSwgaSksCiAJCQkJCQkJICAmYW1wO3BndGFibGVzKTsKIAl9IGVsc2UgewotCQlhZGRyID0gX19jcGFfYWRkcihjcGEsIDApOwomIzQzOwkJYWRkciA9IGNwYV9hZGRyKGNwYSwgMCk7CiAJCXN0YXJ0ID0gYWRkciAmYW1wOyBQTURfTUFTSzsKIAkJZW5kID0gYWRkciAmIzQzOyBQQUdFX1NJWkUgKiBjcGEtJmd0O251bXBhZ2VzOwogCkBAIC00NjMsNyAmIzQzOzM2Miw3IEBAIHN0YXRpYyB2b2lkIGNwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGNhY2hlKQogCiAJbWIoKTsKIAlmb3IgKGkgPSAwOyBpICZsdDsgY3BhLSZndDtudW1wYWdlczsgaSYjNDM7JiM0MzspIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyID0gX19jcGFfYWRkcihjcGEsIGkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyID0gY3BhX2FkZHIoY3BhLCBpKTsKIAkJdW5zaWduZWQgaW50IGxldmVsOwogCiAJCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCAmYW1wO2xldmVsKTsKQEAgLTU3OCw3ICYjNDM7NDc3LDcgQEAgc3RhdGljIHBncHJvdHZhbF90IHByb3RlY3Rfa2VybmVsX3RleHRfcm8odW5zaWduZWQgbG9uZyBzdGFydCwKIAkgKiBzbyB0aGUgcHJvdGVjdGlvbnMgZm9yIGtlcm5lbCB0ZXh0IGFuZCBpZGVudGl0eSBtYXBwaW5ncyBoYXZlIHRvCiAJICogYmUgdGhlIHNhbWUuCiAJICovCi0JaWYgKGxvb2t1cF9hZGRyZXNzKHN0YXJ0LCAmYW1wO2xldmVsKSAmYW1wOyZhbXA7IChsZXZlbCAhPSBQR19MRVZFTF80SykpCiYjNDM7CWlmIChsb29rdXBfYWRkcmVzcyhzdGFydCwgJmFtcDtsZXZlbCkgJmFtcDsmYW1wOyAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpKQogCQlyZXR1cm4gX1BBR0VfUlc7CiAJcmV0dXJuIDA7CiB9CkBAIC03MDksMTA0ICYjNDM7NjA4LDYgQEAgc3RhdGljIGlubGluZSBwZ3Byb3RfdCB2ZXJpZnlfcnd4KHBncHJvdF90IG9sZCwgcGdwcm90X3QgbmV3LCB1bnNpZ25lZCBsb25nIHN0YXIKIAlyZXR1cm4gbmV3OwogfQogCi0vKgotICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC4KLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IChvciBOVUxMIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCksCi0gKiB0aGUgbGV2ZWwgb2YgdGhlIGVudHJ5LCBhbmQgdGhlIGVmZmVjdGl2ZSBOWCBhbmQgUlcgYml0cyBvZiBhbGwKLSAqIHBhZ2UgdGFibGUgbGV2ZWxzLgotICovCi1wdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJCSAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KQotewotCXA0ZF90ICpwNGQ7Ci0JcHVkX3QgKnB1ZDsKLQlwbWRfdCAqcG1kOwotCi0JKmxldmVsID0gUEdfTEVWRUxfMjU2VDsKLQkqbnggPSBmYWxzZTsKLQkqcncgPSB0cnVlOwotCi0JaWYgKHBnZF9ub25lKCpwZ2QpKQotCQlyZXR1cm4gTlVMTDsKLQotCSpsZXZlbCA9IFBHX0xFVkVMXzUxMkc7Ci0JKm54IHw9IHBnZF9mbGFncygqcGdkKSAmYW1wOyBfUEFHRV9OWDsKLQkqcncgJmFtcDs9IHBnZF9mbGFncygqcGdkKSAmYW1wOyBfUEFHRV9SVzsKLQotCXA0ZCA9IHA0ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKLQlpZiAocDRkX25vbmUoKnA0ZCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKHA0ZF9sZWFmKCpwNGQpIHx8ICFwNGRfcHJlc2VudCgqcDRkKSkKLQkJcmV0dXJuIChwdGVfdCAqKXA0ZDsKLQotCSpsZXZlbCA9IFBHX0xFVkVMXzFHOwotCSpueCB8PSBwNGRfZmxhZ3MoKnA0ZCkgJmFtcDsgX1BBR0VfTlg7Ci0JKnJ3ICZhbXA7PSBwNGRfZmxhZ3MoKnA0ZCkgJmFtcDsgX1BBR0VfUlc7Ci0KLQlwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcmVzcyk7Ci0JaWYgKHB1ZF9ub25lKCpwdWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChwdWRfbGVhZigqcHVkKSB8fCAhcHVkX3ByZXNlbnQoKnB1ZCkpCi0JCXJldHVybiAocHRlX3QgKilwdWQ7Ci0KLQkqbGV2ZWwgPSBQR19MRVZFTF8yTTsKLQkqbnggfD0gcHVkX2ZsYWdzKCpwdWQpICZhbXA7IF9QQUdFX05YOwotCSpydyAmYW1wOz0gcHVkX2ZsYWdzKCpwdWQpICZhbXA7IF9QQUdFX1JXOwotCi0JcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOwotCWlmIChwbWRfbm9uZSgqcG1kKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAocG1kX2xlYWYoKnBtZCkgfHwgIXBtZF9wcmVzZW50KCpwbWQpKQotCQlyZXR1cm4gKHB0ZV90ICopcG1kOwotCi0JKmxldmVsID0gUEdfTEVWRUxfNEs7Ci0JKm54IHw9IHBtZF9mbGFncygqcG1kKSAmYW1wOyBfUEFHRV9OWDsKLQkqcncgJmFtcDs9IHBtZF9mbGFncygqcG1kKSAmYW1wOyBfUEFHRV9SVzsKLQotCXJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOwotfQotCi0vKgotICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC4KLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuCi0gKi8KLXB0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKQotewotCWJvb2wgbngsIHJ3OwotCi0JcmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZCwgYWRkcmVzcywgbGV2ZWwsICZhbXA7bngsICZhbXA7cncpOwotfQotCi0vKgotICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcy4gUmV0dXJuIGEgcG9pbnRlcgotICogdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuCi0gKgotICogTm90ZTogdGhlIGZ1bmN0aW9uIHJldHVybnMgcDRkLCBwdWQgb3IgcG1kIGVpdGhlciB3aGVuIHRoZSBlbnRyeSBpcyBtYXJrZWQKLSAqIGxhcmdlIG9yIHdoZW4gdGhlIHByZXNlbnQgYml0IGlzIG5vdCBzZXQuIE90aGVyd2lzZSBpdCByZXR1cm5zIE5VTEwuCi0gKi8KLXB0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpCi17Ci0JcmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2Rfb2Zmc2V0X2soYWRkcmVzcyksIGFkZHJlc3MsIGxldmVsKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGxvb2t1cF9hZGRyZXNzKTsKLQotc3RhdGljIHB0ZV90ICpfbG9va3VwX2FkZHJlc3NfY3BhKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpCi17Ci0JcGdkX3QgKnBnZDsKLQotCWlmICghY3BhLSZndDtwZ2QpCi0JCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKLQllbHNlCi0JCXBnZCA9IGNwYS0mZ3Q7cGdkICYjNDM7IHBnZF9pbmRleChhZGRyZXNzKTsKLQotCXJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2QsIGFkZHJlc3MsIGxldmVsLCBueCwgcncpOwotfQotCiAvKgogICogTG9va3VwIHRoZSBQTUQgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzLiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeQogICogb3IgTlVMTCBpZiBub3QgcHJlc2VudC4KQEAgLTg1MCw5ICYjNDM7NjUxLDkgQEAgcG1kX3QgKmxvb2t1cF9wbWRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiBwaHlzX2FkZHJfdCBzbG93X3ZpcnRfdG9fcGh5cyh2b2lkICpfX3ZpcnRfYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmlydF9hZGRyOwomIzQzOwllbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWw7CiAJcGh5c19hZGRyX3QgcGh5c19hZGRyOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCWVudW0gcGdfbGV2ZWwgbGV2ZWw7CiAJcHRlX3QgKnB0ZTsKIAogCXB0ZSA9IGxvb2t1cF9hZGRyZXNzKHZpcnRfYWRkciwgJmFtcDtsZXZlbCk7CkBAIC04NjQsMTEgJiM0Mzs2NjUsMTEgQEAgcGh5c19hZGRyX3Qgc2xvd192aXJ0X3RvX3BoeXModm9pZCAqX192aXJ0X2FkZHIpCiAJICogbWFrZSAzMi1QQUUga2VybmVsIHdvcmsgY29ycmVjdGx5LgogCSAqLwogCXN3aXRjaCAobGV2ZWwpIHsKLQljYXNlIFBHX0xFVkVMXzFHOgomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUFVEOgogCQlwaHlzX2FkZHIgPSAocGh5c19hZGRyX3QpcHVkX3BmbigqKHB1ZF90ICopcHRlKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwogCQlvZmZzZXQgPSB2aXJ0X2FkZHIgJmFtcDsgflBVRF9NQVNLOwogCQlicmVhazsKLQljYXNlIFBHX0xFVkVMXzJNOgomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUE1EOgogCQlwaHlzX2FkZHIgPSAocGh5c19hZGRyX3QpcG1kX3BmbigqKHBtZF90ICopcHRlKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwogCQlvZmZzZXQgPSB2aXJ0X2FkZHIgJmFtcDsgflBNRF9NQVNLOwogCQlicmVhazsKQEAgLTkyNSwzMCAmIzQzOzcyNiwyNyBAQCBzdGF0aWMgcGdwcm90X3QgcGdwcm90X2NsZWFyX3Byb3Rub25lX2JpdHMocGdwcm90X3QgcHJvdCkKIAlyZXR1cm4gcHJvdDsKIH0KIAotc3RhdGljIGludCBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICAgICBzdHJ1Y3QgY3BhX2RhdGEgKmNwYSkKJiM0MztpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwKJiM0MzsJCQkJIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpCiB7Ci0JdW5zaWduZWQgbG9uZyBudW1wYWdlcywgcG1hc2ssIHBzaXplLCBscGFkZHIsIHBmbiwgb2xkX3BmbjsKIAlwZ3Byb3RfdCBvbGRfcHJvdCwgbmV3X3Byb3QsIHJlcV9wcm90LCBjaGtfcHJvdDsKLQlwdGVfdCBuZXdfcHRlLCAqdG1wOwotCWVudW0gcGdfbGV2ZWwgbGV2ZWw7Ci0JYm9vbCBueCwgcnc7Ci0KLQkvKgotCSAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2UKLQkgKiB1cCBhbHJlYWR5OgotCSAqLwotCXRtcCA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCAmYW1wO2xldmVsLCAmYW1wO254LCAmYW1wO3J3KTsKLQlpZiAodG1wICE9IGtwdGUpCi0JCXJldHVybiAxOwomIzQzOwl1bnNpZ25lZCBsb25nIG51bXBhZ2VzLCBscGFkZHIsIHBmbiwgb2xkX3BmbjsKJiM0MzsJZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsID0gc2QtJmd0O2xldmVsOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC0mZ3Q7YWRkcmVzczsKJiM0MzsJdW5zaWduZWQgbG9uZyBwc2l6ZSA9IHNkLSZndDtwc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBwbWFzayA9IHNkLSZndDtwbWFzazsKJiM0MzsJcHRlX3QgKmtwdGUgPSBzZC0mZ3Q7a3B0ZTsKJiM0MzsJYm9vbCBueCA9IHNkLSZndDtueDsKJiM0MzsJYm9vbCBydyA9IHNkLSZndDtydzsKJiM0MzsJcHRlX3QgbmV3X3B0ZTsKIAogCXN3aXRjaCAobGV2ZWwpIHsKLQljYXNlIFBHX0xFVkVMXzJNOgomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUE1EOgogCQlvbGRfcHJvdCA9IHBtZF9wZ3Byb3QoKihwbWRfdCAqKWtwdGUpOwogCQlvbGRfcGZuID0gcG1kX3BmbigqKHBtZF90ICopa3B0ZSk7CiAJCWNwYV9pbmNfMm1fY2hlY2tlZCgpOwogCQlicmVhazsKLQljYXNlIFBHX0xFVkVMXzFHOgomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUFVEOgogCQlvbGRfcHJvdCA9IHB1ZF9wZ3Byb3QoKihwdWRfdCAqKWtwdGUpOwogCQlvbGRfcGZuID0gcHVkX3BmbigqKHB1ZF90ICopa3B0ZSk7CiAJCWNwYV9pbmNfMWdfY2hlY2tlZCgpOwpAQCAtOTU3LDE4ICYjNDM7NzU1LDYgQEAgc3RhdGljIGludCBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBzaXplID0gcGFnZV9sZXZlbF9zaXplKGxldmVsKTsKLQlwbWFzayA9IHBhZ2VfbGV2ZWxfbWFzayhsZXZlbCk7Ci0KLQkvKgotCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzLCB3aGljaCBmaXQgaW50byB0aGlzIGxhcmdlCi0JICogcGFnZSBzdGFydGluZyBhdCBhZGRyZXNzOgotCSAqLwotCWxwYWRkciA9IChhZGRyZXNzICYjNDM7IHBzaXplKSAmYW1wOyBwbWFzazsKLQludW1wYWdlcyA9IChscGFkZHIgLSBhZGRyZXNzKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwotCWlmIChudW1wYWdlcyAmbHQ7IGNwYS0mZ3Q7bnVtcGFnZXMpCi0JCWNwYS0mZ3Q7bnVtcGFnZXMgPSBudW1wYWdlczsKLQogCS8qCiAJICogV2UgYXJlIHNhZmUgbm93LiBDaGVjayB3aGV0aGVyIHRoZSBuZXcgcGdwcm90IGlzIHRoZSBzYW1lOgogCSAqIENvbnZlcnQgcHJvdGVjdGlvbiBhdHRyaWJ1dGVzIHRvIDRrLWZvcm1hdCwgYXMgY3BhLSZndDttYXNrKiBhcmUgc2V0CkBAIC0xMDcyLDIxICYjNDM7ODU4LDYgQEAgc3RhdGljIGludCBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKLQkJCQkgICBzdHJ1Y3QgY3BhX2RhdGEgKmNwYSkKLXsKLQlpbnQgZG9fc3BsaXQ7Ci0KLQlpZiAoY3BhLSZndDtmb3JjZV9zcGxpdCkKLQkJcmV0dXJuIDE7Ci0KLQlzcGluX2xvY2soJmFtcDtwZ2RfbG9jayk7Ci0JZG9fc3BsaXQgPSBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKGtwdGUsIGFkZHJlc3MsIGNwYSk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtwZ2RfbG9jayk7Ci0KLQlyZXR1cm4gZG9fc3BsaXQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHNwbGl0X3NldF9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJICBwZ3Byb3RfdCByZWZfcHJvdCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICB1bnNpZ25lZCBsb25nIHNpemUpCkBAIC0xMTIzLDMzICYjNDM7ODk0LDIyIEBAIHN0YXRpYyB2b2lkIHNwbGl0X3NldF9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuLAogCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgcmVmX3Byb3QpKTsKIH0KIAotc3RhdGljIGludAotX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkgICBzdHJ1Y3QgcHRkZXNjICpwdGRlc2MpCiYjNDM7aW50IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxwYWRkciwgbHBpbmMsIHJlZl9wZm4sIHBmbiwgcGZuaW5jID0gMTsKJiM0MzsJc3RydWN0IHB0ZGVzYyAqcHRkZXNjID0gc2QtJmd0O3B0ZGVzYzsKIAlzdHJ1Y3QgcGFnZSAqYmFzZSA9IHB0ZGVzY19wYWdlKHB0ZGVzYyk7CiAJcHRlX3QgKnBiYXNlID0gKHB0ZV90ICopcGFnZV9hZGRyZXNzKGJhc2UpOwotCXVuc2lnbmVkIGludCBpLCBsZXZlbDsKJiM0MzsJZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsID0gc2QtJmd0O2xldmVsOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC0mZ3Q7YWRkcmVzczsKJiM0MzsJcHRlX3QgKmtwdGUgPSBzZC0mZ3Q7a3B0ZTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiAJcGdwcm90X3QgcmVmX3Byb3Q7Ci0JYm9vbCBueCwgcnc7Ci0JcHRlX3QgKnRtcDsKLQotCXNwaW5fbG9jaygmYW1wO3BnZF9sb2NrKTsKLQkvKgotCSAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2UKLQkgKiB1cCBmb3IgdXMgYWxyZWFkeToKLQkgKi8KLQl0bXAgPSBfbG9va3VwX2FkZHJlc3NfY3BhKGNwYSwgYWRkcmVzcywgJmFtcDtsZXZlbCwgJmFtcDtueCwgJmFtcDtydyk7Ci0JaWYgKHRtcCAhPSBrcHRlKSB7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7cGdkX2xvY2spOwotCQlyZXR1cm4gMTsKLQl9CiAKIAlwYXJhdmlydF9hbGxvY19wdGUoJmFtcDtpbml0X21tLCBwYWdlX3RvX3BmbihiYXNlKSk7CiAKIAlzd2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSBQR19MRVZFTF8yTToKJiM0MzsJY2FzZSBQR1RBQkxFX0xFVkVMX1BNRDoKIAkJcmVmX3Byb3QgPSBwbWRfcGdwcm90KCoocG1kX3QgKilrcHRlKTsKIAkJLyoKIAkJICogQ2xlYXIgUFNFIChha2EgX1BBR0VfUEFUKSBhbmQgbW92ZQpAQCAtMTE2MSw3ICYjNDM7OTIxLDcgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQlscGluYyA9IFBBR0VfU0laRTsKIAkJYnJlYWs7CiAKLQljYXNlIFBHX0xFVkVMXzFHOgomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUFVEOgogCQlyZWZfcHJvdCA9IHB1ZF9wZ3Byb3QoKihwdWRfdCAqKWtwdGUpOwogCQlyZWZfcGZuID0gcHVkX3BmbigqKHB1ZF90ICopa3B0ZSk7CiAJCXBmbmluYyA9IFBNRF9TSVpFICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CkBAIC0xMTc3LDcgJiM0Mzs5MzcsNiBAQCBfX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2soJmFtcDtwZ2RfbG9jayk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMTIyNSwyNiAmIzQzOzk4NCw2IEBAIF9fc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkgKiBqdXN0IHNwbGl0IGxhcmdlIHBhZ2UgZW50cnkuCiAJICovCiAJZmx1c2hfdGxiX2FsbCgpOwotCXNwaW5fdW5sb2NrKCZhbXA7cGdkX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXN0cnVjdCBwdGRlc2MgKnB0ZGVzYzsKLQotCWlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSkKLQkJc3Bpbl91bmxvY2soJmFtcDtjcGFfbG9jayk7Ci0JcHRkZXNjID0gcGFnZXRhYmxlX2FsbG9jKEdGUF9LRVJORUwsIDApOwotCWlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSkKLQkJc3Bpbl9sb2NrKCZhbXA7Y3BhX2xvY2spOwotCWlmICghcHRkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChfX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzLCBwdGRlc2MpKQotCQlwYWdldGFibGVfZnJlZShwdGRlc2MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzE0LDcgJiM0MzsxMDUzLDcgQEAgc3RhdGljIGludCBjb2xsYXBzZV9wbWRfcGFnZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJfQogCiAJaWYgKHZpcnRfYWRkcl92YWxpZChhZGRyKSAmYW1wOyZhbXA7IHBmbl9yYW5nZV9pc19tYXBwZWQocGZuLCBwZm4gJiM0MzsgMSkpCi0JCWNvbGxhcHNlX3BhZ2VfY291bnQoUEdfTEVWRUxfMk0pOwomIzQzOwkJY29sbGFwc2VfcGFnZV9jb3VudChQR1RBQkxFX0xFVkVMX1BNRCk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTEzNjEsNyAmIzQzOzExMDAsNyBAQCBzdGF0aWMgaW50IGNvbGxhcHNlX3B1ZF9wYWdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAlzZXRfcHVkKHB1ZCwgcGZuX3B1ZChwZm4sIHBtZF9wZ3Byb3QoZmlyc3QpKSk7CiAKIAlpZiAodmlydF9hZGRyX3ZhbGlkKGFkZHIpICZhbXA7JmFtcDsgcGZuX3JhbmdlX2lzX21hcHBlZChwZm4sIHBmbiAmIzQzOyAxKSkKLQkJY29sbGFwc2VfcGFnZV9jb3VudChQR19MRVZFTF8xRyk7CiYjNDM7CQljb2xsYXBzZV9wYWdlX2NvdW50KFBHVEFCTEVfTEVWRUxfUFVEKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTgwMCw4ICYjNDM7MTUzOSw4IEBAIHN0YXRpYyBpbnQgcG9wdWxhdGVfcGdkKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkciwKLQkJCSAgICAgICBpbnQgcHJpbWFyeSkKJiM0MztpbnQgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkciwKJiM0MzsJCQkgICBpbnQgcHJpbWFyeSkKIHsKIAlpZiAoY3BhLSZndDtwZ2QpIHsKIAkJLyoKQEAgLTE4MzMsNyAmIzQzOzE1NzIsNyBAQCBzdGF0aWMgaW50IF9fY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJCWNwYS0mZ3Q7cGZuID0gX19wYSh2YWRkcikgJmd0OyZndDsgUEFHRV9TSElGVDsKIAkJcmV0dXJuIDA7CiAKLQl9IGVsc2UgaWYgKF9fY3BhX3Bmbl9pbl9oaWdobWFwKGNwYS0mZ3Q7cGZuKSkgewomIzQzOwl9IGVsc2UgaWYgKHBmbl9pc19rZXJuZWwoY3BhLSZndDtwZm4pKSB7CiAJCS8qIEZhdWx0cyBpbiB0aGUgaGlnaG1hcCBhcmUgT0ssIHNvIGRvIG5vdCB3YXJuOiAqLwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgewpAQCAtMTg0NSw5MCAmIzQzOzE1ODQsNDUgQEAgc3RhdGljIGludCBfX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCX0KIH0KIAotc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KQomIzQzO3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQkgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KQogewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlpbnQgZG9fc3BsaXQsIGVycjsKLQl1bnNpZ25lZCBpbnQgbGV2ZWw7Ci0JcHRlX3QgKmtwdGUsIG9sZF9wdGU7Ci0JYm9vbCBueCwgcnc7Ci0KLQlhZGRyZXNzID0gX19jcGFfYWRkcihjcGEsIGNwYS0mZ3Q7Y3VycGFnZSk7Ci1yZXBlYXQ6Ci0Ja3B0ZSA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCAmYW1wO2xldmVsLCAmYW1wO254LCAmYW1wO3J3KTsKLQlpZiAoIWtwdGUpCi0JCXJldHVybiBfX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7CiYjNDM7CXB0ZV90IG5ld19wdGU7CiYjNDM7CXBncHJvdF90IG9sZF9wcm90ID0gcHRlX3BncHJvdChvbGRfcHRlKTsKJiM0MzsJcGdwcm90X3QgbmV3X3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7CiAKLQlvbGRfcHRlID0gKmtwdGU7Ci0JaWYgKHB0ZV9ub25lKG9sZF9wdGUpKQotCQlyZXR1cm4gX19jcGFfcHJvY2Vzc19mYXVsdChjcGEsIGFkZHJlc3MsIHByaW1hcnkpOwomIzQzOwlwZ3Byb3RfdmFsKG5ld19wcm90KSAmYW1wOz0gfnBncHJvdF92YWwoY3BhLSZndDttYXNrX2Nscik7CiYjNDM7CXBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLSZndDttYXNrX3NldCk7CiAKLQlpZiAobGV2ZWwgPT0gUEdfTEVWRUxfNEspIHsKLQkJcHRlX3QgbmV3X3B0ZTsKLQkJcGdwcm90X3Qgb2xkX3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpOwotCQlwZ3Byb3RfdCBuZXdfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihvbGRfcHRlKTsKLQotCQlwZ3Byb3RfdmFsKG5ld19wcm90KSAmYW1wOz0gfnBncHJvdF92YWwoY3BhLSZndDttYXNrX2Nscik7Ci0JCXBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLSZndDttYXNrX3NldCk7Ci0KLQkJY3BhX2luY180a19pbnN0YWxsKCk7Ci0JCS8qIEhhbmQgaW4gbHBzaXplID0gMCB0byBlbmZvcmNlIHRoZSBwcm90ZWN0aW9uIG1lY2hhbmlzbSAqLwotCQluZXdfcHJvdCA9IHN0YXRpY19wcm90ZWN0aW9ucyhuZXdfcHJvdCwgYWRkcmVzcywgcGZuLCAxLCAwLAotCQkJCQkgICAgICBDUEFfUFJPVEVDVCk7Ci0KLQkJbmV3X3Byb3QgPSB2ZXJpZnlfcnd4KG9sZF9wcm90LCBuZXdfcHJvdCwgYWRkcmVzcywgcGZuLCAxLAotCQkJCSAgICAgIG54LCBydyk7CiYjNDM7CWNwYV9pbmNfNGtfaW5zdGFsbCgpOwomIzQzOwkvKiBIYW5kIGluIGxwc2l6ZSA9IDAgdG8gZW5mb3JjZSB0aGUgcHJvdGVjdGlvbiBtZWNoYW5pc20gKi8KJiM0MzsJbmV3X3Byb3QgPSBzdGF0aWNfcHJvdGVjdGlvbnMobmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgMCwKJiM0MzsJCQkJICAgICAgQ1BBX1BST1RFQ1QpOwogCi0JCW5ld19wcm90ID0gcGdwcm90X2NsZWFyX3Byb3Rub25lX2JpdHMobmV3X3Byb3QpOwomIzQzOwluZXdfcHJvdCA9IHZlcmlmeV9yd3gob2xkX3Byb3QsIG5ld19wcm90LCBhZGRyZXNzLCBwZm4sIDEsIG54LCBydyk7CiAKLQkJLyoKLQkJICogV2UgbmVlZCB0byBrZWVwIHRoZSBwZm4gZnJvbSB0aGUgZXhpc3RpbmcgUFRFLAotCQkgKiBhZnRlciBhbGwgd2UmIzM5O3JlIG9ubHkgZ29pbmcgdG8gY2hhbmdlIGl0cyBhdHRyaWJ1dGVzCi0JCSAqIG5vdCB0aGUgbWVtb3J5IGl0IHBvaW50cyB0bwotCQkgKi8KLQkJbmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7Ci0JCWNwYS0mZ3Q7cGZuID0gcGZuOwotCQkvKgotCQkgKiBEbyB3ZSByZWFsbHkgY2hhbmdlIGFueXRoaW5nID8KLQkJICovCi0JCWlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHsKLQkJCXNldF9wdGVfYXRvbWljKGtwdGUsIG5ld19wdGUpOwotCQkJY3BhLSZndDtmbGFncyB8PSBDUEFfRkxVU0hUTEI7Ci0JCX0KLQkJY3BhLSZndDtudW1wYWdlcyA9IDE7Ci0JCXJldHVybiAwOwotCX0KJiM0MzsJbmV3X3Byb3QgPSBwZ3Byb3RfY2xlYXJfcHJvdG5vbmVfYml0cyhuZXdfcHJvdCk7CiAKIAkvKgotCSAqIENoZWNrLCB3aGV0aGVyIHdlIGNhbiBrZWVwIHRoZSBsYXJnZSBwYWdlIGludGFjdAotCSAqIGFuZCBqdXN0IGNoYW5nZSB0aGUgcHRlOgotCSAqLwotCWRvX3NwbGl0ID0gc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2Uoa3B0ZSwgYWRkcmVzcywgY3BhKTsKLQkvKgotCSAqIFdoZW4gdGhlIHJhbmdlIGZpdHMgaW50byB0aGUgZXhpc3RpbmcgbGFyZ2UgcGFnZSwKLQkgKiByZXR1cm4uIGNwLSZndDtudW1wYWdlcyBhbmQgY3BhLSZndDt0bGJmbHVzaCBoYXZlIGJlZW4gdXBkYXRlZCBpbgotCSAqIHRyeV9sYXJnZV9wYWdlOgomIzQzOwkgKiBXZSBuZWVkIHRvIGtlZXAgdGhlIHBmbiBmcm9tIHRoZSBleGlzdGluZyBQVEUsIGFmdGVyIGFsbCB3ZSYjMzk7cmUgb25seQomIzQzOwkgKiBnb2luZyB0byBjaGFuZ2UgaXRzIGF0dHJpYnV0ZXMgbm90IHRoZSBtZW1vcnkgaXQgcG9pbnRzIHRvCiAJICovCi0JaWYgKGRvX3NwbGl0ICZsdDs9IDApCi0JCXJldHVybiBkb19zcGxpdDsKLQomIzQzOwluZXdfcHRlID0gcGZuX3B0ZShwZm4sIG5ld19wcm90KTsKJiM0MzsJY3BhLSZndDtwZm4gPSBwZm47CiAJLyoKLQkgKiBXZSBoYXZlIHRvIHNwbGl0IHRoZSBsYXJnZSBwYWdlOgomIzQzOwkgKiBEbyB3ZSByZWFsbHkgY2hhbmdlIGFueXRoaW5nID8KIAkgKi8KLQllcnIgPSBzcGxpdF9sYXJnZV9wYWdlKGNwYSwga3B0ZSwgYWRkcmVzcyk7Ci0JaWYgKCFlcnIpCi0JCWdvdG8gcmVwZWF0OwotCi0JcmV0dXJuIGVycjsKJiM0MzsJaWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkgewomIzQzOwkJc2V0X3B0ZV9hdG9taWMoa3B0ZSwgbmV3X3B0ZSk7CiYjNDM7CQljcGEtJmd0O2ZsYWdzIHw9IENQQV9GTFVTSFRMQjsKJiM0MzsJfQogfQogCi1zdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSk7Ci0KIC8qCiAgKiBDaGVjayB0aGUgZGlyZWN0bWFwIGFuZCAmIzM0O2hpZ2gga2VybmVsIG1hcCYjMzQ7ICYjMzk7YWxpYXNlcyYjMzk7LgogICovCi1zdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKQomIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKQogewogCXN0cnVjdCBjcGFfZGF0YSBhbGlhc19jcGE7CiAJdW5zaWduZWQgbG9uZyBsYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmEoY3BhLSZndDtwZm4gJmx0OyZsdDsgUEFHRV9TSElGVCk7CkBAIC0xOTQyLDcgJiM0MzsxNjM2LDcgQEAgc3RhdGljIGludCBjcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSkKIAkgKiBObyBuZWVkIHRvIHJlZG8sIHdoZW4gdGhlIHByaW1hcnkgY2FsbCB0b3VjaGVkIHRoZSBkaXJlY3QKIAkgKiBtYXBwaW5nIGFscmVhZHk6CiAJICovCi0JdmFkZHIgPSBfX2NwYV9hZGRyKGNwYSwgY3BhLSZndDtjdXJwYWdlKTsKJiM0MzsJdmFkZHIgPSBjcGFfYWRkcihjcGEsIGNwYS0mZ3Q7Y3VycGFnZSk7CiAJaWYgKCEod2l0aGluKHZhZGRyLCBQQUdFX09GRlNFVCwKIAkJICAgIFBBR0VfT0ZGU0VUICYjNDM7IChtYXhfcGZuX21hcHBlZCAmbHQ7Jmx0OyBQQUdFX1NISUZUKSkpKSB7CiAKQEAgLTE5NzEsNyAmIzQzOzE2NjUsNyBAQCBzdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKQogCSAqIHRvIHRvdWNoIHRoZSBoaWdoIG1hcHBlZCBrZXJuZWwgYXMgd2VsbDoKIAkgKi8KIAlpZiAoIXdpdGhpbih2YWRkciwgKHVuc2lnbmVkIGxvbmcpX3RleHQsIF9icmtfZW5kKSAmYW1wOyZhbXA7Ci0JICAgIF9fY3BhX3Bmbl9pbl9oaWdobWFwKGNwYS0mZ3Q7cGZuKSkgewomIzQzOwkgICAgcGZuX2lzX2tlcm5lbChjcGEtJmd0O3BmbikpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wX2NwYV92YWRkciA9IChjcGEtJmd0O3BmbiAmbHQ7Jmx0OyBQQUdFX1NISUZUKSAmIzQzOwogCQkJCQkgICAgICAgX19TVEFSVF9LRVJORUxfbWFwIC0gcGh5c19iYXNlOwogCQlhbGlhc19jcGEgPSAqY3BhOwpAQCAtMjAwMCwxNjggJiM0MzsxNjk0LDI1IEBAIHN0YXRpYyBpbnQgY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KQotewotCXVuc2lnbmVkIGxvbmcgbnVtcGFnZXMgPSBjcGEtJmd0O251bXBhZ2VzOwotCXVuc2lnbmVkIGxvbmcgcmVtcGFnZXMgPSBudW1wYWdlczsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogTm8gY2hhbmdlcywgZWFzeSEKLQkgKi8KLQlpZiAoIShwZ3Byb3RfdmFsKGNwYS0mZ3Q7bWFza19zZXQpIHwgcGdwcm90X3ZhbChjcGEtJmd0O21hc2tfY2xyKSkgJmFtcDsmYW1wOwotCSAgICAhY3BhLSZndDtmb3JjZV9zcGxpdCkKLQkJcmV0dXJuIHJldDsKLQotCXdoaWxlIChyZW1wYWdlcykgewotCQkvKgotCQkgKiBTdG9yZSB0aGUgcmVtYWluaW5nIG5yIG9mIHBhZ2VzIGZvciB0aGUgbGFyZ2UgcGFnZQotCQkgKiBwcmVzZXJ2YXRpb24gY2hlY2suCi0JCSAqLwotCQljcGEtJmd0O251bXBhZ2VzID0gcmVtcGFnZXM7Ci0JCS8qIGZvciBhcnJheSBjaGFuZ2VzLCB3ZSBjYW4mIzM5O3QgdXNlIGxhcmdlIHBhZ2UgKi8KLQkJaWYgKGNwYS0mZ3Q7ZmxhZ3MgJmFtcDsgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpCi0JCQljcGEtJmd0O251bXBhZ2VzID0gMTsKLQotCQlpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpCi0JCQlzcGluX2xvY2soJmFtcDtjcGFfbG9jayk7Ci0JCXJldCA9IF9fY2hhbmdlX3BhZ2VfYXR0cihjcGEsIHByaW1hcnkpOwotCQlpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpCi0JCQlzcGluX3VubG9jaygmYW1wO2NwYV9sb2NrKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChwcmltYXJ5ICZhbXA7JmFtcDsgIShjcGEtJmd0O2ZsYWdzICZhbXA7IENQQV9OT19DSEVDS19BTElBUykpIHsKLQkJCXJldCA9IGNwYV9wcm9jZXNzX2FsaWFzKGNwYSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyoKLQkJICogQWRqdXN0IHRoZSBudW1iZXIgb2YgcGFnZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZQotCQkgKiBDUEEgb3BlcmF0aW9uLiBFaXRoZXIgYSBsYXJnZSBwYWdlIGhhcyBiZWVuCi0JCSAqIHByZXNlcnZlZCBvciBhIHNpbmdsZSBwYWdlIHVwZGF0ZSBoYXBwZW5lZC4KLQkJICovCi0JCUJVR19PTihjcGEtJmd0O251bXBhZ2VzICZndDsgcmVtcGFnZXMgfHwgIWNwYS0mZ3Q7bnVtcGFnZXMpOwotCQlyZW1wYWdlcyAtPSBjcGEtJmd0O251bXBhZ2VzOwotCQljcGEtJmd0O2N1cnBhZ2UgJiM0Mzs9IGNwYS0mZ3Q7bnVtcGFnZXM7Ci0JfQotCi1vdXQ6Ci0JLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgbnVtcGFnZXMgKi8KLQljcGEtJmd0O251bXBhZ2VzID0gbnVtcGFnZXM7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLAotCQkJCSAgICBwZ3Byb3RfdCBtYXNrX3NldCwgcGdwcm90X3QgbWFza19jbHIsCi0JCQkJICAgIGludCBmb3JjZV9zcGxpdCwgaW50IGluX2ZsYWcsCi0JCQkJICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7dm9pZCBhcmNoX2NwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGVycikKIHsKLQlzdHJ1Y3QgY3BhX2RhdGEgY3BhOwotCWludCByZXQsIGNhY2hlOwotCi0JbWVtc2V0KCZhbXA7Y3BhLCAwLCBzaXplb2YoY3BhKSk7Ci0KLQkvKgotCSAqIENoZWNrLCBpZiB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNldCBhIG5vdCBzdXBwb3J0ZWQKLQkgKiBmZWF0dXJlLiAgQ2xlYXJpbmcgbm9uLXN1cHBvcnRlZCBmZWF0dXJlcyBpcyBPSy4KLQkgKi8KLQltYXNrX3NldCA9IGNhbm9uX3BncHJvdChtYXNrX3NldCk7Ci0KLQlpZiAoIXBncHJvdF92YWwobWFza19zZXQpICZhbXA7JmFtcDsgIXBncHJvdF92YWwobWFza19jbHIpICZhbXA7JmFtcDsgIWZvcmNlX3NwbGl0KQotCQlyZXR1cm4gMDsKLQotCS8qIEVuc3VyZSB3ZSBhcmUgUEFHRV9TSVpFIGFsaWduZWQgKi8KLQlpZiAoaW5fZmxhZyAmYW1wOyBDUEFfQVJSQVkpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgJmx0OyBudW1wYWdlczsgaSYjNDM7JiM0MzspIHsKLQkJCWlmIChhZGRyW2ldICZhbXA7IH5QQUdFX01BU0spIHsKLQkJCQlhZGRyW2ldICZhbXA7PSBQQUdFX01BU0s7Ci0JCQkJV0FSTl9PTl9PTkNFKDEpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmICghKGluX2ZsYWcgJmFtcDsgQ1BBX1BBR0VTX0FSUkFZKSkgewotCQkvKgotCQkgKiBpbl9mbGFnIG9mIENQQV9QQUdFU19BUlJBWSBpbXBsaWVzIGl0IGlzIGFsaWduZWQuCi0JCSAqIE5vIG5lZWQgdG8gY2hlY2sgaW4gdGhhdCBjYXNlCi0JCSAqLwotCQlpZiAoKmFkZHIgJmFtcDsgflBBR0VfTUFTSykgewotCQkJKmFkZHIgJmFtcDs9IFBBR0VfTUFTSzsKLQkJCS8qCi0JCQkgKiBQZW9wbGUgc2hvdWxkIG5vdCBiZSBwYXNzaW5nIGluIHVuYWxpZ25lZCBhZGRyZXNzZXM6Ci0JCQkgKi8KLQkJCVdBUk5fT05fT05DRSgxKTsKLQkJfQotCX0KLQotCS8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqLwotCWttYXBfZmx1c2hfdW51c2VkKCk7Ci0KLQl2bV91bm1hcF9hbGlhc2VzKCk7Ci0KLQljcGEudmFkZHIgPSBhZGRyOwotCWNwYS5wYWdlcyA9IHBhZ2VzOwotCWNwYS5udW1wYWdlcyA9IG51bXBhZ2VzOwotCWNwYS5tYXNrX3NldCA9IG1hc2tfc2V0OwotCWNwYS5tYXNrX2NsciA9IG1hc2tfY2xyOwotCWNwYS5mbGFncyA9IGluX2ZsYWc7Ci0JY3BhLmN1cnBhZ2UgPSAwOwotCWNwYS5mb3JjZV9zcGxpdCA9IGZvcmNlX3NwbGl0OwotCi0JcmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmFtcDtjcGEsIDEpOwotCi0JLyoKLQkgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzoKLQkgKi8KLQlpZiAoIShjcGEuZmxhZ3MgJmFtcDsgQ1BBX0ZMVVNIVExCKSkKLQkJZ290byBvdXQ7CiYjNDM7CWludCBjYWNoZTsKIAogCS8qCiAJICogTm8gbmVlZCB0byBmbHVzaCwgd2hlbiB3ZSBkaWQgbm90IHNldCBhbnkgb2YgdGhlIGNhY2hpbmcKIAkgKiBhdHRyaWJ1dGVzOgogCSAqLwotCWNhY2hlID0gISFwZ3Byb3QyY2FjaGVtb2RlKG1hc2tfc2V0KTsKJiM0MzsJY2FjaGUgPSAhIXBncHJvdDJjYWNoZW1vZGUoY3BhLSZndDttYXNrX3NldCk7CiAKIAkvKgogCSAqIE9uIGVycm9yOyBmbHVzaCBldmVyeXRoaW5nIHRvIGJlIHN1cmUuCiAJICovCi0JaWYgKHJldCkgewomIzQzOwlpZiAoZXJyKSB7CiAJCWNwYV9mbHVzaF9hbGwoY2FjaGUpOwotCQlnb3RvIG91dDsKJiM0MzsJCXJldHVybjsKIAl9CiAKLQljcGFfZmx1c2goJmFtcDtjcGEsIGNhY2hlKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldCh1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsCi0JCQkJICAgICAgIHBncHJvdF90IG1hc2ssIGludCBhcnJheSkKLXsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCwKLQkJKGFycmF5ID8gQ1BBX0FSUkFZIDogMCksIE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcywKLQkJCQkJIHBncHJvdF90IG1hc2ssIGludCBhcnJheSkKLXsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCwKLQkJKGFycmF5ID8gQ1BBX0FSUkFZIDogMCksIE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcGFfc2V0X3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcywKLQkJCQkgICAgICAgcGdwcm90X3QgbWFzaykKLXsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCwKLQkJQ1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNwYV9jbGVhcl9wYWdlc19hcnJheShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsCi0JCQkJCSBwZ3Byb3RfdCBtYXNrKQotewotCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBtYXNrLCAwLAotCQlDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTsKJiM0MzsJY3BhX2ZsdXNoKGNwYSwgY2FjaGUpOwogfQogCiBpbnQgX3NldF9tZW1vcnlfdWModW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCkBAIC0yNzczLDExICYjNDM7MjMyNCwzIEBAIGludCBfX2luaXQga2VybmVsX3VubWFwX3BhZ2VzX2luX3BnZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAKIAlyZXR1cm4gcmV0dmFsOwogfQotCi0vKgotICogVGhlIHRlc3RjYXNlcyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZG4mIzM5O3QKLSAqIGJlIGV4cG9zZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gSW5jbHVkZSB0aGVzZSBkaXJlY3RseSBoZXJlLgotICovCi0jaWZkZWYgQ09ORklHX0NQQV9ERUJVRwotI2luY2x1ZGUgJiMzNDtjcGEtdGVzdC5jJiMzNDsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmggYi9pbmNsdWRlL2xpbnV4L3BndGFibGUuaAppbmRleCAyOTgxZTM4NmRhN2IzYy4uZDFkZjgzNDU4NTJiZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oCkBAIC0xNzgyLDYgJiM0MzsxNzgyLDEwIEBAIHZvaWQgYXJjaF9zeW5jX2tlcm5lbF9tYXBwaW5ncyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAgKiBiZWNhdXNlIHRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCBldmVuIGlmIENPTkZJR19NTVUgaXMgbm90IGRlZmluZWQuCiAgKi8KIAomIzQzOyNpZm5kZWYgY2Fub25fcGdwcm90CiYjNDM7I2RlZmluZSBjYW5vbl9wZ3Byb3QocHJvdCkJKHByb3QpCiYjNDM7I2VuZGlmCiYjNDM7CiAjaWZuZGVmIHBncHJvdF9ueAogI2RlZmluZSBwZ3Byb3RfbngocHJvdCkJKHByb3QpCiAjZW5kaWYKQEAgLTIxMDUsNiAmIzQzOzIxMDksNDYgQEAgc3RhdGljIGlubGluZSBpbnQgcHVkX3dyaXRlKHB1ZF90IHB1ZCkKIH0KICNlbmRpZiAvKiBwdWRfd3JpdGUgKi8KIAomIzQzOyNpZm5kZWYgcDRkX3dyaXRlCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZCkKJiM0Mzt7CiYjNDM7CUJVRygpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIHA0ZF93cml0ZSAqLwomIzQzOwomIzQzOyNpZm5kZWYgcG1kX2V4ZWMKJiM0MztzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpCiYjNDM7ewomIzQzOwlCVUcoKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBwbWRfZXhlYyAqLwomIzQzOwomIzQzOyNpZm5kZWYgcHVkX2V4ZWMKJiM0MztzdGF0aWMgaW5saW5lIGludCBwdWRfZXhlYyhwdWRfdCBwdWQpCiYjNDM7ewomIzQzOwlCVUcoKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBwdWRfZXhlYyAqLwomIzQzOwomIzQzOyNpZm5kZWYgcDRkX2V4ZWMKJiM0MztzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpCiYjNDM7ewomIzQzOwlCVUcoKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBwNGRfZXhlYyAqLwomIzQzOwomIzQzOyNpZm5kZWYgcGdkX2V4ZWMKJiM0MztzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpCiYjNDM7ewomIzQzOwlCVUcoKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBwZ2RfZXhlYyAqLwomIzQzOwogI2lmICFkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgfHwgXAogCSFkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKQogc3RhdGljIGlubGluZSBpbnQgcHVkX3RyYW5zX2h1Z2UocHVkX3QgcHVkKQpAQCAtMjI5NSwxNiAmIzQzOzIzMzksMjAgQEAgc3RhdGljIGlubGluZSBib29sIGFyY2hfaGFzX3Bmbl9tb2RpZnlfY2hlY2sodm9pZCkKIHR5cGVkZWYgdW5zaWduZWQgaW50IHBndGJsX21vZF9tYXNrOwogCiBlbnVtIHBndGFibGVfbGV2ZWwgewotCVBHVEFCTEVfTEVWRUxfUFRFID0gMCwKJiM0MzsJUEdUQUJMRV9MRVZFTF9OT05FID0gMCwKJiM0MzsJUEdUQUJMRV9MRVZFTF9QVEUsCiAJUEdUQUJMRV9MRVZFTF9QTUQsCiAJUEdUQUJMRV9MRVZFTF9QVUQsCiAJUEdUQUJMRV9MRVZFTF9QNEQsCiAJUEdUQUJMRV9MRVZFTF9QR0QsCiYjNDM7CVBHVEFCTEVfTEVWRUxfTlVNLAogfTsKIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwZ3RhYmxlX2xldmVsX3RvX3N0cihlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpCiB7CiAJc3dpdGNoIChsZXZlbCkgewomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfTk9ORToKJiM0MzsJCXJldHVybiAmIzM0O25vbmUmIzM0OzsKIAljYXNlIFBHVEFCTEVfTEVWRUxfUFRFOgogCQlyZXR1cm4gJiMzNDtwdGUmIzM0OzsKIAljYXNlIFBHVEFCTEVfTEVWRUxfUE1EOgpAQCAtMjMyMCw2ICYjNDM7MjM2OCwyOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBndGFibGVfbGV2ZWxfdG9fc3RyKGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCkKIAl9CiB9CiAKJiM0MzsvKiBTaXplIG9mIHRoZSBtZW1vcnkgbWFwcGVkIGJ5IGEgc2luZ2xlIGxlYWYgZW50cnkgYXQgQGxldmVsICovCiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBndGFibGVfbGV2ZWxfc2l6ZShlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpCiYjNDM7ewomIzQzOwlzd2l0Y2ggKGxldmVsKSB7CiYjNDM7CWNhc2UgUEdUQUJMRV9MRVZFTF9QVEU6CiYjNDM7CQlyZXR1cm4gUEFHRV9TSVpFOwomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUE1EOgomIzQzOwkJcmV0dXJuIFBNRF9TSVpFOwomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUFVEOgomIzQzOwkJcmV0dXJuIFBVRF9TSVpFOwomIzQzOwljYXNlIFBHVEFCTEVfTEVWRUxfUDREOgomIzQzOwkJcmV0dXJuIFA0RF9TSVpFOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIFBHRElSX1NJWkU7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBndGFibGVfbGV2ZWxfbWFzayhlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpCiYjNDM7ewomIzQzOwlyZXR1cm4gfihwZ3RhYmxlX2xldmVsX3NpemUobGV2ZWwpIC0gMSk7CiYjNDM7fQomIzQzOwogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogI2lmICFkZWZpbmVkKE1BWF9QT1NTSUJMRV9QSFlTTUVNX0JJVFMpICZhbXA7JmFtcDsgIWRlZmluZWQoQ09ORklHXzY0QklUKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXRfbWVtb3J5LmggYi9pbmNsdWRlL2xpbnV4L3NldF9tZW1vcnkuaAppbmRleCAzMDMwZDkyNDVmNWFjOC4uMTdjYmU2ZTI2Y2I3MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oCkBAIC04NCw0ICYjNDM7ODQsMTAxIEBAIHN0YXRpYyBpbmxpbmUgaW50IHNldF9tZW1vcnlfZGVjcnlwdGVkKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogfQogI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19NRU1fRU5DUllQVCAqLwogCiYjNDM7I2lmZGVmIENPTkZJR19HRU5FUklDX1NFVF9NRU1PUlkKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcGd0YWJsZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ1BBX0ZMVVNIVExCIDEKJiM0MzsjZGVmaW5lIENQQV9BUlJBWSAyCiYjNDM7I2RlZmluZSBDUEFfUEFHRVNfQVJSQVkgNAomIzQzOyNkZWZpbmUgQ1BBX05PX0NIRUNLX0FMSUFTIDggLyogRG8gbm90IHNlYXJjaCBmb3IgYWxpYXNlcyAqLwomIzQzOyNkZWZpbmUgQ1BBX0NPTExBUFNFIDE2IC8qIHRyeSB0byBjb2xsYXBzZSBsYXJnZSBwYWdlcyAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGN1cnJlbnQgZmx1c2hpbmcgY29udGV4dCAtIHdlIHBhc3MgaXQgaW5zdGVhZCBvZiA1IGFyZ3VtZW50czoKJiM0MzsgKi8KJiM0MztzdHJ1Y3QgY3BhX2RhdGEgewomIzQzOwl1bnNpZ25lZCBsb25nCSp2YWRkcjsKJiM0MzsJcGdkX3QJCSpwZ2Q7CiYjNDM7CXBncHJvdF90CW1hc2tfc2V0OwomIzQzOwlwZ3Byb3RfdAltYXNrX2NscjsKJiM0MzsJdW5zaWduZWQgbG9uZwludW1wYWdlczsKJiM0MzsJdW5zaWduZWQgbG9uZwljdXJwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nCXBmbjsKJiM0MzsJdW5zaWduZWQgaW50CWZsYWdzOwomIzQzOwl1bnNpZ25lZCBpbnQJZm9yY2Vfc3BsaXQJCTogMSwKJiM0MzsJCQlmb3JjZV9zdGF0aWNfcHJvdAk6IDEsCiYjNDM7CQkJZm9yY2VfZmx1c2hfYWxsCQk6IDE7CiYjNDM7CXN0cnVjdCBwYWdlCSoqcGFnZXM7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIGNvbnRleHQgZm9yIGNoZWNraW5nIGZvciBhIHNwbGl0IGEgbGFyZ2UgcGFnZSBhbmQgc3BsaXR0aW5nIGl0IGlmIHJlcXVpcmVkLgomIzQzOyAqLwomIzQzO3N0cnVjdCBwdGRlc2M7CiYjNDM7c3RydWN0IGNwYV9zcGxpdF9kYXRhIHsKJiM0MzsJdW5zaWduZWQgbG9uZwlhZGRyZXNzOwomIzQzOwl1bnNpZ25lZCBsb25nCXBzaXplOwomIzQzOwl1bnNpZ25lZCBsb25nCXBtYXNrOwomIzQzOwlwdGVfdAkJKmtwdGU7CiYjNDM7CXN0cnVjdCBwdGRlc2MJKnB0ZGVzYzsKJiM0MzsJZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsOwomIzQzOwlib29sCQlueDsKJiM0MzsJYm9vbAkJcnc7CiYjNDM7fTsKJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIGNwYV9hZGRyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGlkeCk7CiYjNDM7CiYjNDM7cHRlX3QgKmxvb2t1cF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50ICpsZXZlbCk7CiYjNDM7cHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQkJICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKTsKJiM0MztwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJCQkgIHVuc2lnbmVkIGludCAqbGV2ZWwsIGJvb2wgKm54LCBib29sICpydyk7CiYjNDM7CiYjNDM7aW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiYjNDM7CQkJICAgaW50IHByaW1hcnkpOwomIzQzO2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKTsKJiM0MztpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwKJiM0MzsJCQkJIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpOwomIzQzO2ludCBhcmNoX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpOwomIzQzO3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQkgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KTsKJiM0Mzt2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKTsKJiM0MzsKJiM0MztpbnQgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KTsKJiM0MztpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcywKJiM0MzsJCQkgICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NsciwKJiM0MzsJCQkgICAgIGludCBmb3JjZV9zcGxpdCwgaW50IGluX2ZsYWcsCiYjNDM7CQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldCh1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsCiYjNDM7CQkJCSAgICAgICBwZ3Byb3RfdCBtYXNrLCBpbnQgYXJyYXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCwKJiM0MzsJCShhcnJheSA/IENQQV9BUlJBWSA6IDApLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcih1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsCiYjNDM7CQkJCQkgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KQomIzQzO3sKJiM0MzsJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIG1hc2ssIDAsCiYjNDM7CQkoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNwYV9zZXRfcGFnZXNfYXJyYXkoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLAomIzQzOwkJCQkgICAgICBwZ3Byb3RfdCBtYXNrKQomIzQzO3sKJiM0MzsJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihOVUxMLCBudW1wYWdlcywgbWFzaywgX19wZ3Byb3QoMCksIDAsCiYjNDM7CQlDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3BhX2NsZWFyX3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcywKJiM0MzsJCQkJCXBncHJvdF90IG1hc2spCiYjNDM7ewomIzQzOwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCwKJiM0MzsJCUNQQV9QQUdFU19BUlJBWSwgcGFnZXMpOwomIzQzO30KJiM0MzsKJiM0MzsjZW5kaWYgLyogQ09ORklHX0dFTkVSSUNfU0VUX01FTU9SWSAqLwomIzQzOwogI2VuZGlmIC8qIF9MSU5VWF9TRVRfTUVNT1JZX0hfICovCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCA5ZTBjYTQ4MjQ5MDU0Zi4uNTQxZWRkMWUxMWI2MTAgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZwpAQCAtMTUwOSw2ICYjNDM7MTUwOSw5IEBAIGNvbmZpZyBMQVpZX01NVV9NT0RFX0tVTklUX1RFU1QKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAomIzQzO2NvbmZpZyBHRU5FUklDX1NFVF9NRU1PUlkKJiM0MzsJYm9vbAomIzQzOwogc291cmNlICYjMzQ7bW0vZGFtb24vS2NvbmZpZyYjMzQ7CiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL21tL0tjb25maWcuZGVidWcgYi9tbS9LY29uZmlnLmRlYnVnCmluZGV4IDkxYjNlMDI3Yjc1MzU3Li44M2NmZWY2YjJkOGNmYiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZy5kZWJ1ZwomIzQzOyYjNDM7JiM0MzsgYi9tbS9LY29uZmlnLmRlYnVnCkBAIC0zMjAsMyAmIzQzOzMyMCwxMCBAQCBjb25maWcgUEVSX1ZNQV9MT0NLX1NUQVRTCiAJICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLgogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiYjNDM7CiYjNDM7Y29uZmlnIENQQV9ERUJVRwomIzQzOwlib29sICYjMzQ7Q1BBIHNlbGYtdGVzdCBjb2RlJiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBHRU5FUklDX1NFVF9NRU1PUlkKJiM0MzsJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKJiM0MzsJaGVscAomIzQzOwkgIERvIGNoYW5nZV9wYWdlX2F0dHIoKSBzZWxmLXRlc3RzIGV2ZXJ5IDMwIHNlY29uZHMuCmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IGVmZjlmOWU3ZTA2MWMxLi5lM2Y2YzM5YzJiYTk5MSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGUKQEAgLTE0NywzICYjNDM7MTQ3LDQgQEAgb2JqLSQoQ09ORklHX1NIUklOS0VSX0RFQlVHKSAmIzQzOz0gc2hyaW5rZXJfZGVidWcubwogb2JqLSQoQ09ORklHX0VYRUNNRU0pICYjNDM7PSBleGVjbWVtLm8KIG9iai0kKENPTkZJR19UTVBGU19RVU9UQSkgJiM0Mzs9IHNobWVtX3F1b3RhLm8KIG9iai0kKENPTkZJR19MQVpZX01NVV9NT0RFX0tVTklUX1RFU1QpICYjNDM7PSB0ZXN0cy9sYXp5X21tdV9tb2RlX2t1bml0Lm8KJiM0MztvYmotJChDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZKSAmIzQzOz0gc2V0X21lbW9yeS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQvY3BhLXRlc3QuYyBiL21tL2NwYS10ZXN0LmMKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gYXJjaC94ODYvbW0vcGF0L2NwYS10ZXN0LmMKcmVuYW1lIHRvIG1tL2NwYS10ZXN0LmMKaW5kZXggYWQzYzFmZWVjOTkwZGIuLjYzYzM0NjNhNWE3ZDg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXQvY3BhLXRlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9jcGEtdGVzdC5jCkBAIC0xMywzMiAmIzQzOzEzLDI0IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC92bWFsbG9jLmgmZ3Q7CiAKLSNpbmNsdWRlICZsdDthc20vY2FjaGVmbHVzaC5oJmd0OwotI2luY2x1ZGUgJmx0O2FzbS9rZGVidWcuaCZndDsKLQogLyoKICAqIE9ubHkgcHJpbnQgdGhlIHJlc3VsdHMgb2YgdGhlIGZpcnN0IHBhc3M6CiAgKi8KIHN0YXRpYyBfX3JlYWRfbW9zdGx5IGludCBwcmludCA9IDE7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X3Rlc3RfcGZuOwogCiBlbnVtIHsKIAlOVEVTVAkJCT0gMyAqIDEwMCwKIAlOUEFHRVMJCQk9IDEwMCwKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JTFBTCQkJPSAoMSAmbHQ7Jmx0OyBQTURfU0hJRlQpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2X1BBRSkKLQlMUFMJCQk9ICgxICZsdDsmbHQ7IFBNRF9TSElGVCksCi0jZWxzZQotCUxQUwkJCT0gKDEgJmx0OyZsdDsgMjIpLAotI2VuZGlmCi0JR1BTCQkJPSAoMSZsdDsmbHQ7MzApCiYjNDM7CUxQUwkJCT0gUE1EX1NJWkUsCiYjNDM7CUdQUwkJCT0gUFVEX1NJWkUKIH07CiAKLSNkZWZpbmUgUEFHRV9DUEFfVEVTVAlfX3BncHJvdChfUEFHRV9DUEFfVEVTVCkKJiM0MzsjZGVmaW5lIFBBR0VfQ1BBX1RFU1QJX19wZ3Byb3QoX1BBR0VfU1BFQ0lBTCkKIAogc3RhdGljIGludCBwdGVfdGVzdGJpdChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIHB0ZV9mbGFncyhwdGUpICZhbXA7IF9QQUdFX1NPRlRXMTsKJiM0MzsJcmV0dXJuIHB0ZV9zcGVjaWFsKHB0ZSk7CiB9CiAKIHN0cnVjdCBzcGxpdF9zdGF0ZSB7CkBAIC01NCwxMCAmIzQzOzQ2LDEwIEBAIHN0YXRpYyBpbnQgcHJpbnRfc3BsaXQoc3RydWN0IHNwbGl0X3N0YXRlICpzKQogCXMtJmd0O2xwZyA9IHMtJmd0O2dwZyA9IHMtJmd0O3NwZyA9IHMtJmd0O2V4ZWMgPSAwOwogCXMtJmd0O21pbl9leGVjID0gfjBVTDsKIAlzLSZndDttYXhfZXhlYyA9IDA7Ci0JZm9yIChpID0gMDsgaSAmbHQ7IG1heF9wZm5fbWFwcGVkOyApIHsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG1heF90ZXN0X3BmbjsgKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmEoaSAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKIAkJdW5zaWduZWQgaW50IGxldmVsOwotCQlwdGVfdCAqcHRlOwomIzQzOwkJcHRlX3QgKnB0ZSwgcHRldmFsOwogCiAJCXB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsICZhbXA7bGV2ZWwpOwogCQlpZiAoIXB0ZSkgewpAQCAtNjUsMTUgJiM0Mzs1NywxNiBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcykKIAkJCWkmIzQzOyYjNDM7OwogCQkJY29udGludWU7CiAJCX0KJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KHB0ZSk7CiAKLQkJaWYgKGxldmVsID09IFBHX0xFVkVMXzFHICZhbXA7JmFtcDsgc2l6ZW9mKGxvbmcpID09IDgpIHsKJiM0MzsJCWlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRCAmYW1wOyZhbXA7IHNpemVvZihsb25nKSA9PSA4KSB7CiAJCQlzLSZndDtncGcmIzQzOyYjNDM7OwogCQkJaSAmIzQzOz0gR1BTL1BBR0VfU0laRTsKLQkJfSBlbHNlIGlmIChsZXZlbCA9PSBQR19MRVZFTF8yTSkgewotCQkJaWYgKChwdGVfdmFsKCpwdGUpICZhbXA7IF9QQUdFX1BSRVNFTlQpICZhbXA7JmFtcDsgIShwdGVfdmFsKCpwdGUpICZhbXA7IF9QQUdFX1BTRSkpIHsKJiM0MzsJCX0gZWxzZSBpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpIHsKJiM0MzsJCQlpZiAocHRlX3ByZXNlbnQocHRldmFsKSAmYW1wOyZhbXA7ICFwdGVfaHVnZShwdGV2YWwpKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSYjMzQ7JWx4IGxldmVsICVkIGJ1dCBub3QgUFNFICVMeFxuJiMzNDssCi0JCQkJCWFkZHIsIGxldmVsLCAodTY0KXB0ZV92YWwoKnB0ZSkpOwomIzQzOwkJCQkJJiMzNDslbHggbGV2ZWwgJWQgYnV0IG5vdCBsZWFmICVMeFxuJiMzNDssCiYjNDM7CQkJCQlhZGRyLCBsZXZlbCwgKHU2NClwdGVfdmFsKHB0ZXZhbCkpOwogCQkJCWVyciA9IDE7CiAJCQl9CiAJCQlzLSZndDtscGcmIzQzOyYjNDM7OwpAQCAtODIsNyAmIzQzOzc1LDcgQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpCiAJCQlzLSZndDtzcGcmIzQzOyYjNDM7OwogCQkJaSYjNDM7JiM0Mzs7CiAJCX0KLQkJaWYgKCEocHRlX3ZhbCgqcHRlKSAmYW1wOyBfUEFHRV9OWCkpIHsKJiM0MzsJCWlmIChwdGVfZXhlYyhwdGV2YWwpKSB7CiAJCQlzLSZndDtleGVjJiM0MzsmIzQzOzsKIAkJCWlmIChhZGRyICZsdDsgcy0mZ3Q7bWluX2V4ZWMpCiAJCQkJcy0mZ3Q7bWluX2V4ZWMgPSBhZGRyOwpAQCAtMTAwLDggJiM0Mzs5Myw4IEBAIHN0YXRpYyBpbnQgcHJpbnRfc3BsaXQoc3RydWN0IHNwbGl0X3N0YXRlICpzKQogCiAJZXhwZWN0ZWQgPSAocy0mZ3Q7Z3BnKkdQUyAmIzQzOyBzLSZndDtscGcqTFBTKS9QQUdFX1NJWkUgJiM0Mzsgcy0mZ3Q7c3BnICYjNDM7IG1pc3NlZDsKIAlpZiAoZXhwZWN0ZWQgIT0gaSkgewotCQlwcmludGsoS0VSTl9FUlIgJiMzNDtDUEEgbWF4X3Bmbl9tYXBwZWQgJWx1IGJ1dCBleHBlY3RlZCAlbHVcbiYjMzQ7LAotCQkJbWF4X3Bmbl9tYXBwZWQsIGV4cGVjdGVkKTsKJiM0MzsJCXByaW50ayhLRVJOX0VSUiAmIzM0O0NQQSBtYXhfdGVzdF9wZm4gJWx1IGJ1dCBleHBlY3RlZCAlbHVcbiYjMzQ7LAomIzQzOwkJCW1heF90ZXN0X3BmbiwgZXhwZWN0ZWQpOwogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTExOCw3ICYjNDM7MTExLDcgQEAgc3RhdGljIGludCBwYWdlYXR0cl90ZXN0KHZvaWQpCiB7CiAJc3RydWN0IHNwbGl0X3N0YXRlIHNhLCBzYiwgc2M7CiAJdW5zaWduZWQgbG9uZyAqYm07Ci0JcHRlX3QgKnB0ZSwgcHRlMDsKJiM0MzsJcHRlX3QgKnB0ZSwgcHRlMCwgcHRlX3ZhbDsKIAlpbnQgZmFpbGVkID0gMDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWw7CiAJaW50IGksIGs7CkBAIC0xMjcsNyAmIzQzOzEyMCw3IEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKQogCWlmIChwcmludCkKIAkJcHJpbnRrKEtFUk5fSU5GTyAmIzM0O0NQQSBzZWxmLXRlc3Q6XG4mIzM0Oyk7CiAKLQlibSA9IHZ6YWxsb2MoKG1heF9wZm5fbWFwcGVkICYjNDM7IDcpIC8gOCk7CiYjNDM7CWJtID0gdnphbGxvYygobWF4X3Rlc3RfcGZuICYjNDM7IDcpIC8gOCk7CiAJaWYgKCFibSkgewogCQlwcmludGsoS0VSTl9FUlIgJiMzNDtDUEEgQ2Fubm90IHZtYWxsb2MgYml0bWFwXG4mIzM0Oyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM2LDExICYjNDM7MTI5LDExIEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKQogCWZhaWxlZCAmIzQzOz0gcHJpbnRfc3BsaXQoJmFtcDtzYSk7CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgTlRFU1Q7IGkmIzQzOyYjNDM7KSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gZ2V0X3JhbmRvbV91MzJfYmVsb3cobWF4X3Bmbl9tYXBwZWQpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBwZm4gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhtYXhfdGVzdF9wZm4pOwogCiAJCWFkZHJbaV0gPSAodW5zaWduZWQgbG9uZylfX3ZhKHBmbiAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKIAkJbGVuW2ldID0gZ2V0X3JhbmRvbV91MzJfYmVsb3coTlBBR0VTKTsKLQkJbGVuW2ldID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuW2ldLCBtYXhfcGZuX21hcHBlZCAtIHBmbiAtIDEpOwomIzQzOwkJbGVuW2ldID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuW2ldLCBtYXhfdGVzdF9wZm4gLSBwZm4gLSAxKTsKIAogCQlpZiAobGVuW2ldID09IDApCiAJCQlsZW5baV0gPSAxOwpAQCAtMTUwLDE1ICYjNDM7MTQzLDIwIEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKQogCiAJCWZvciAoayA9IDA7IGsgJmx0OyBsZW5baV07IGsmIzQzOyYjNDM7KSB7CiAJCQlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldICYjNDM7IGsqUEFHRV9TSVpFLCAmYW1wO2xldmVsKTsKLQkJCWlmICghcHRlIHx8IHBncHJvdF92YWwocHRlX3BncHJvdCgqcHRlKSkgPT0gMCB8fAotCQkJICAgICEocHRlX3ZhbCgqcHRlKSAmYW1wOyBfUEFHRV9QUkVTRU5UKSkgewomIzQzOwkJCWlmICghcHRlKSB7CiYjNDM7CQkJCWFkZHJbaV0gPSAwOwomIzQzOwkJCQlicmVhazsKJiM0MzsJCQl9CiYjNDM7CQkJcHRlX3ZhbCA9IHB0ZXBfZ2V0KHB0ZSk7CiYjNDM7CQkJaWYgKHBncHJvdF92YWwocHRlX3BncHJvdChwdGVfdmFsKSkgPT0gMCB8fAomIzQzOwkJCSAgICAhcHRlX3ByZXNlbnQocHRlX3ZhbCkpIHsKIAkJCQlhZGRyW2ldID0gMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChrID09IDApIHsKLQkJCQlwdGUwID0gKnB0ZTsKJiM0MzsJCQkJcHRlMCA9IHB0ZV92YWw7CiAJCQl9IGVsc2UgewotCQkJCWlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QoKnB0ZSkpICE9CiYjNDM7CQkJCWlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlX3ZhbCkpICE9CiAJCQkJCXBncHJvdF92YWwocHRlX3BncHJvdChwdGUwKSkpIHsKIAkJCQkJbGVuW2ldID0gazsKIAkJCQkJYnJlYWs7CkBAIC0xOTgsMTIgJiM0MzsxOTYsMTIgQEAgc3RhdGljIGludCBwYWdlYXR0cl90ZXN0KHZvaWQpCiAJCX0KIAogCQlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldLCAmYW1wO2xldmVsKTsKLQkJaWYgKCFwdGUgfHwgIXB0ZV90ZXN0Yml0KCpwdGUpIHx8IHB0ZV9odWdlKCpwdGUpKSB7CiYjNDM7CQlpZiAoIXB0ZSB8fCAhcHRlX3Rlc3RiaXQoKnB0ZSkgfHwgbGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAmIzM0O0NQQSAlbHg6IGJhZCBwdGUgJUx4XG4mIzM0OywgYWRkcltpXSwKIAkJCQlwdGUgPyAodTY0KXB0ZV92YWwoKnB0ZSkgOiAwVUxMKTsKIAkJCWZhaWxlZCYjNDM7JiM0Mzs7CiAJCX0KLQkJaWYgKGxldmVsICE9IFBHX0xFVkVMXzRLKSB7CiYjNDM7CQlpZiAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAmIzM0O0NQQSAlbHg6IHVuZXhwZWN0ZWQgbGV2ZWwgJWRcbiYjMzQ7LAogCQkJCWFkZHJbaV0sIGxldmVsKTsKIAkJCWZhaWxlZCYjNDM7JiM0Mzs7CkBAIC0yNjYsNiAmIzQzOzI2NCw4IEBAIHN0YXRpYyBpbnQgc3RhcnRfcGFnZWF0dHJfdGVzdCh2b2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAomIzQzOwltYXhfdGVzdF9wZm4gPSBQRk5fRE9XTihfX3BhKGhpZ2hfbWVtb3J5IC0gMSkpOwomIzQzOwogCXAgPSBrdGhyZWFkX2NyZWF0ZShkb19wYWdlYXR0cl90ZXN0LCBOVUxMLCAmIzM0O3BhZ2VhdHRyLXRlc3QmIzM0Oyk7CiAJaWYgKCFJU19FUlIocCkpCiAJCXdha2VfdXBfcHJvY2VzcyhwKTsKZGlmZiAtLWdpdCBhL21tL3NldF9tZW1vcnkuYyBiL21tL3NldF9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNzQ0NDA1ZWZjYzM0MDEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9tbS9zZXRfbWVtb3J5LmMKQEAgLTAsMCAmIzQzOzEsMzk2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9oaWdobWVtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3ZtYWxsb2MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcGd0YWJsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9leHBvcnQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2V0X21lbW9yeS5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogU2VyaWFsaXplIGNwYSgpIHNvIHRoYXQgd2UgZG9uJiMzOTt0IGFsbG93IGFueSBvdGhlciBjcHUsIHdpdGggc3RhbGUgbGFyZ2UgdGxiCiYjNDM7ICogZW50cmllcywgdG8gY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdQomIzQzOyAqIHNwbGl0dGluZyBhIGxhcmdlIHBhZ2UgZW50cnkgYWxvbmcgd2l0aCBjaGFuZ2luZyB0aGUgYXR0cmlidXRlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spOwomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2sodm9pZCkKJiM0Mzt7CiYjNDM7I2lmZGVmIENPTkZJR19YODYKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7cGdkX2xvY2spOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF91bmxvY2sodm9pZCkKJiM0Mzt7CiYjNDM7I2lmZGVmIENPTkZJR19YODYKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtwZ2RfbG9jayk7CiYjNDM7I2VuZGlmCiYjNDM7fQomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgY3BhX2FkZHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgaWR4KQomIzQzO3sKJiM0MzsJaWYgKGNwYS0mZ3Q7ZmxhZ3MgJmFtcDsgQ1BBX1BBR0VTX0FSUkFZKSB7CiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwYS0mZ3Q7cGFnZXNbaWR4XTsKJiM0MzsKJiM0MzsJCWlmICh1bmxpa2VseShQYWdlSGlnaE1lbShwYWdlKSkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjcGEtJmd0O2ZsYWdzICZhbXA7IENQQV9BUlJBWSkKJiM0MzsJCXJldHVybiBjcGEtJmd0O3ZhZGRyW2lkeF07CiYjNDM7CiYjNDM7CXJldHVybiAqY3BhLSZndDt2YWRkciAmIzQzOyBpZHggKiBQQUdFX1NJWkU7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC4KJiM0MzsgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSAob3IgTlVMTCBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QpLAomIzQzOyAqIHRoZSBsZXZlbCBvZiB0aGUgZW50cnksIGFuZCB0aGUgZWZmZWN0aXZlIE5YIGFuZCBSVyBiaXRzIG9mIGFsbAomIzQzOyAqIHBhZ2UgdGFibGUgbGV2ZWxzLgomIzQzOyAqLwomIzQzO3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2RfdCAqcGdkcCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJCQkgIHVuc2lnbmVkIGludCAqbGV2ZWwsIGJvb2wgKm54LCBib29sICpydykKJiM0Mzt7CiYjNDM7CXBnZF90IHBnZCA9IHBnZHBfZ2V0KHBnZHApOwomIzQzOwlwNGRfdCAqcDRkcCwgcDRkOwomIzQzOwlwdWRfdCAqcHVkcCwgcHVkOwomIzQzOwlwbWRfdCAqcG1kcCwgcG1kOwomIzQzOwomIzQzOwkqbGV2ZWwgPSBQR1RBQkxFX0xFVkVMX1BHRDsKJiM0MzsJKm54ID0gZmFsc2U7CiYjNDM7CSpydyA9IHRydWU7CiYjNDM7CiYjNDM7CWlmIChwZ2Rfbm9uZShwZ2QpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CSpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUDREOwomIzQzOwkqbnggfD0gIXBnZF9leGVjKHBnZCk7CiYjNDM7CSpydyAmYW1wOz0gISEocGdkX3dyaXRlKHBnZCkpOwomIzQzOwomIzQzOwlwNGRwID0gcDRkX29mZnNldChwZ2RwLCBhZGRyZXNzKTsKJiM0MzsJcDRkID0gcDRkcF9nZXQocDRkcCk7CiYjNDM7CWlmIChwNGRfbm9uZShwNGQpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmIChwNGRfbGVhZihwNGQpIHx8ICFwNGRfcHJlc2VudChwNGQpKQomIzQzOwkJcmV0dXJuIChwdGVfdCAqKXA0ZHA7CiYjNDM7CiYjNDM7CSpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFVEOwomIzQzOwkqbnggfD0gIXA0ZF9leGVjKHA0ZCk7CiYjNDM7CSpydyAmYW1wOz0gISEocDRkX3dyaXRlKHA0ZCkpOwomIzQzOwomIzQzOwlwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTsKJiM0MzsJcHVkID0gcHVkcF9nZXQocHVkcCk7CiYjNDM7CWlmIChwdWRfbm9uZShwdWQpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmIChwdWRfbGVhZihwdWQpIHx8ICFwdWRfcHJlc2VudChwdWQpKQomIzQzOwkJcmV0dXJuIChwdGVfdCAqKXB1ZHA7CiYjNDM7CiYjNDM7CSpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUE1EOwomIzQzOwkqbnggfD0gIXB1ZF9leGVjKHB1ZCk7CiYjNDM7CSpydyAmYW1wOz0gISEocHVkX3dyaXRlKHB1ZCkpOwomIzQzOwomIzQzOwlwbWRwID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTsKJiM0MzsJcG1kID0gcG1kcF9nZXQocG1kcCk7CiYjNDM7CWlmIChwbWRfbm9uZShwbWQpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmIChwbWRfbGVhZihwbWQpIHx8ICFwbWRfcHJlc2VudChwbWQpKQomIzQzOwkJcmV0dXJuIChwdGVfdCAqKXBtZHA7CiYjNDM7CiYjNDM7CSpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFRFOwomIzQzOwkqbnggfD0gIXBtZF9leGVjKHBtZCk7CiYjNDM7CSpydyAmYW1wOz0gISEocG1kX3dyaXRlKHBtZCkpOwomIzQzOwomIzQzOwlyZXR1cm4gcHRlX29mZnNldF9rZXJuZWwocG1kcCwgYWRkcmVzcyk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC4KJiM0MzsgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLgomIzQzOyAqLwomIzQzO3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJCSAgICAgdW5zaWduZWQgaW50ICpsZXZlbCkKJiM0Mzt7CiYjNDM7CWJvb2wgbngsIHJ3OwomIzQzOwomIzQzOwlyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgJmFtcDtueCwgJmFtcDtydyk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcy4gUmV0dXJuIGEgcG9pbnRlcgomIzQzOyAqIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLgomIzQzOyAqCiYjNDM7ICogTm90ZTogdGhlIGZ1bmN0aW9uIHJldHVybnMgcDRkLCBwdWQgb3IgcG1kIGVpdGhlciB3aGVuIHRoZSBlbnRyeSBpcyBtYXJrZWQKJiM0MzsgKiBsYXJnZSBvciB3aGVuIHRoZSBwcmVzZW50IGJpdCBpcyBub3Qgc2V0LiBPdGhlcndpc2UgaXQgcmV0dXJucyBOVUxMLgomIzQzOyAqLwomIzQzO3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpCiYjNDM7ewomIzQzOwlyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcywgbGV2ZWwpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfYWRkcmVzcyk7CiYjNDM7CiYjNDM7c3RhdGljIHB0ZV90ICpfbG9va3VwX2FkZHJlc3NfY3BhKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiYjNDM7CQkJICAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KQomIzQzO3sKJiM0MzsJcGdkX3QgKnBnZDsKJiM0MzsKJiM0MzsJaWYgKCFjcGEtJmd0O3BnZCkKJiM0MzsJCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKJiM0MzsJZWxzZQomIzQzOwkJcGdkID0gY3BhLSZndDtwZ2QgJiM0MzsgcGdkX2luZGV4KGFkZHJlc3MpOwomIzQzOwomIzQzOwlyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgbngsIHJ3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwKJiM0MzsJCQkJICAgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZCkKJiM0Mzt7CiYjNDM7CWVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCA9IHNkLSZndDtsZXZlbDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gc2QtJmd0O2FkZHJlc3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnVtcGFnZXMsIGxwYWRkcjsKJiM0MzsKJiM0MzsJaWYgKGNwYS0mZ3Q7Zm9yY2Vfc3BsaXQpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJc2QtJmd0O3BzaXplID0gcGd0YWJsZV9sZXZlbF9zaXplKGxldmVsKTsKJiM0MzsJc2QtJmd0O3BtYXNrID0gcGd0YWJsZV9sZXZlbF9tYXNrKGxldmVsKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMsIHdoaWNoIGZpdCBpbnRvIHRoaXMgbGFyZ2UKJiM0MzsJICogcGFnZSBzdGFydGluZyBhdCBhZGRyZXNzOgomIzQzOwkgKi8KJiM0MzsJbHBhZGRyID0gKGFkZHJlc3MgJiM0Mzsgc2QtJmd0O3BzaXplKSAmYW1wOyBzZC0mZ3Q7cG1hc2s7CiYjNDM7CW51bXBhZ2VzID0gKGxwYWRkciAtIGFkZHJlc3MpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CWlmIChudW1wYWdlcyAmbHQ7IGNwYS0mZ3Q7bnVtcGFnZXMpCiYjNDM7CQljcGEtJmd0O251bXBhZ2VzID0gbnVtcGFnZXM7CiYjNDM7CiYjNDM7CXJldHVybiBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKGNwYSwgc2QpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNwYV9oYW5kbGVfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQomIzQzO3sKJiM0MzsJc3RydWN0IGNwYV9zcGxpdF9kYXRhIHNkID0gewomIzQzOwkJLmFkZHJlc3MgPSBhZGRyZXNzLAomIzQzOwkJLmtwdGUgPSBrcHRlLAomIzQzOwl9OwomIzQzOwlpbnQgZG9fc3BsaXQsIHJldCA9IDE7CiYjNDM7CXB0ZV90ICp0bXA7CiYjNDM7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7Y3BhX2xvY2spOwomIzQzOwlzZC5wdGRlc2MgPSBwYWdldGFibGVfYWxsb2MoR0ZQX0tFUk5FTCwgMCk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2NwYV9sb2NrKTsKJiM0MzsJaWYgKCFzZC5wdGRlc2MpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJYXJjaF9sb2NrKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2UKJiM0MzsJICogdXAgYWxyZWFkeToKJiM0MzsJICovCiYjNDM7CXRtcCA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCAmYW1wO3NkLmxldmVsLCAmYW1wO3NkLm54LCAmYW1wO3NkLnJ3KTsKJiM0MzsJaWYgKHRtcCAhPSBrcHRlKQomIzQzOwkJZ290byBvdXRfZnJlZV9wdGRlc2M7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrLCB3aGV0aGVyIHdlIGNhbiBrZWVwIHRoZSBsYXJnZSBwYWdlIGludGFjdAomIzQzOwkgKiBhbmQganVzdCBjaGFuZ2UgdGhlIHB0ZToKJiM0MzsJICovCiYjNDM7CWRvX3NwbGl0ID0gc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCAmYW1wO3NkKTsKJiM0MzsJcmV0ID0gZG9fc3BsaXQ7CiYjNDM7CS8qCiYjNDM7CSAqIFdoZW4gdGhlIHJhbmdlIGZpdHMgaW50byB0aGUgZXhpc3RpbmcgbGFyZ2UgcGFnZSwgbm8gc3BsaXQgaXMKJiM0MzsJICogcmVxdWlyZWQuCiYjNDM7CSAqIHNob3VsZF9zcGxpdF9sYXJnZV9wYWdlKCkgdXBkYXRlZCB0aGUgbGFyZ2UgcGFnZSBhdHRyaWJ1dGVzIGFuZAomIzQzOwkgKiBjcGEtJmd0O251bXBhZ2VzIGFuZCBjcGEtJmd0O3Bmbi4KJiM0MzsJICovCiYjNDM7CWlmIChkb19zcGxpdCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXRfZnJlZV9wdGRlc2M7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGhhdmUgdG8gc3BsaXQgdGhlIGxhcmdlIHBhZ2U6CiYjNDM7CSAqLwomIzQzOwlyZXQgPSBhcmNoX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCAmYW1wO3NkKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gb3V0X2ZyZWVfcHRkZXNjOwomIzQzOwomIzQzOwlhcmNoX3VubG9jaygpOwomIzQzOwlyZXR1cm4gZG9fc3BsaXQ7CiYjNDM7CiYjNDM7b3V0X2ZyZWVfcHRkZXNjOgomIzQzOwlhcmNoX3VubG9jaygpOwomIzQzOwlwYWdldGFibGVfZnJlZShzZC5wdGRlc2MpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiYjNDM7CWludCBzcGxpdF9yZXM7CiYjNDM7CXVuc2lnbmVkIGludCBsZXZlbDsKJiM0MzsJcHRlX3QgKmtwdGUsIG9sZF9wdGU7CiYjNDM7CWJvb2wgbngsIHJ3OwomIzQzOwomIzQzOwlhZGRyZXNzID0gY3BhX2FkZHIoY3BhLCBjcGEtJmd0O2N1cnBhZ2UpOwomIzQzO3JlcGVhdDoKJiM0MzsJa3B0ZSA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCAmYW1wO2xldmVsLCAmYW1wO254LCAmYW1wO3J3KTsKJiM0MzsJaWYgKCFrcHRlKQomIzQzOwkJcmV0dXJuIGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoY3BhLCBhZGRyZXNzLCBwcmltYXJ5KTsKJiM0MzsKJiM0MzsJb2xkX3B0ZSA9ICprcHRlOwomIzQzOwlpZiAocHRlX25vbmUob2xkX3B0ZSkpCiYjNDM7CQlyZXR1cm4gYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChjcGEsIGFkZHJlc3MsIHByaW1hcnkpOwomIzQzOwomIzQzOwlpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVEUpIHsKJiM0MzsJCWFyY2hfY2hhbmdlX3B0ZShjcGEsIGFkZHJlc3MsIGtwdGUsIG9sZF9wdGUsIG54LCBydyk7CiYjNDM7CQljcGEtJmd0O251bXBhZ2VzID0gMTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBhZGRyZXNzIG1hcHMgYSBsYXJnZSBwYWdlLiBUcnkgdG8ga2VlcCBpdCwgb3RoZXJ3aXNlIHNwbGl0IGl0CiYjNDM7CSAqIHVwIGFuZCByZXRyeSBvbiB0aGUgZnJlc2hseSBpbnN0YWxsZWQgc21hbGxlciBtYXBwaW5nLgomIzQzOwkgKi8KJiM0MzsJc3BsaXRfcmVzID0gY3BhX2hhbmRsZV9sYXJnZV9wYWdlKGNwYSwga3B0ZSwgYWRkcmVzcyk7CiYjNDM7CWlmIChzcGxpdF9yZXMgJmd0OyAwKQomIzQzOwkJZ290byByZXBlYXQ7CiYjNDM7CiYjNDM7CXJldHVybiBzcGxpdF9yZXM7CiYjNDM7fQomIzQzOwomIzQzO2ludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG51bXBhZ2VzID0gY3BhLSZndDtudW1wYWdlczsKJiM0MzsJdW5zaWduZWQgbG9uZyByZW1wYWdlcyA9IG51bXBhZ2VzOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTm8gY2hhbmdlcywgZWFzeSEKJiM0MzsJICovCiYjNDM7CWlmICghKHBncHJvdF92YWwoY3BhLSZndDttYXNrX3NldCkgfCBwZ3Byb3RfdmFsKGNwYS0mZ3Q7bWFza19jbHIpKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhY3BhLSZndDtmb3JjZV9zcGxpdCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlIChyZW1wYWdlcykgewomIzQzOwkJLyoKJiM0MzsJCSAqIFN0b3JlIHRoZSByZW1haW5pbmcgbnIgb2YgcGFnZXMgZm9yIHRoZSBsYXJnZSBwYWdlCiYjNDM7CQkgKiBwcmVzZXJ2YXRpb24gY2hlY2suCiYjNDM7CQkgKi8KJiM0MzsJCWNwYS0mZ3Q7bnVtcGFnZXMgPSByZW1wYWdlczsKJiM0MzsJCS8qIGZvciBhcnJheSBjaGFuZ2VzLCB3ZSBjYW4mIzM5O3QgdXNlIGxhcmdlIHBhZ2UgKi8KJiM0MzsJCWlmIChjcGEtJmd0O2ZsYWdzICZhbXA7IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKQomIzQzOwkJCWNwYS0mZ3Q7bnVtcGFnZXMgPSAxOwomIzQzOwomIzQzOwkJc3Bpbl9sb2NrKCZhbXA7Y3BhX2xvY2spOwomIzQzOwkJcmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyKGNwYSwgcHJpbWFyeSk7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO2NwYV9sb2NrKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CQlpZiAocHJpbWFyeSAmYW1wOyZhbXA7ICEoY3BhLSZndDtmbGFncyAmYW1wOyBDUEFfTk9fQ0hFQ0tfQUxJQVMpICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjcGFfc2hvdWxkX3VwZGF0ZV9hbGlhcyhjcGFfYWRkcihjcGEsIGNwYS0mZ3Q7Y3VycGFnZSksIGNwYS0mZ3Q7cGZuKSkgewomIzQzOwkJCXJldCA9IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoY3BhKTsKJiM0MzsJCQlpZiAocmV0KQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBBZGp1c3QgdGhlIG51bWJlciBvZiBwYWdlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlCiYjNDM7CQkgKiBDUEEgb3BlcmF0aW9uLiBFaXRoZXIgYSBsYXJnZSBwYWdlIGhhcyBiZWVuCiYjNDM7CQkgKiBwcmVzZXJ2ZWQgb3IgYSBzaW5nbGUgcGFnZSB1cGRhdGUgaGFwcGVuZWQuCiYjNDM7CQkgKi8KJiM0MzsJCUJVR19PTihjcGEtJmd0O251bXBhZ2VzICZndDsgcmVtcGFnZXMgfHwgIWNwYS0mZ3Q7bnVtcGFnZXMpOwomIzQzOwkJcmVtcGFnZXMgLT0gY3BhLSZndDtudW1wYWdlczsKJiM0MzsJCWNwYS0mZ3Q7Y3VycGFnZSAmIzQzOz0gY3BhLSZndDtudW1wYWdlczsKJiM0MzsJfQomIzQzOwomIzQzO291dDoKJiM0MzsJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgbnVtcGFnZXMgKi8KJiM0MzsJY3BhLSZndDtudW1wYWdlcyA9IG51bXBhZ2VzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcywKJiM0MzsJCQkgICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NsciwKJiM0MzsJCQkgICAgIGludCBmb3JjZV9zcGxpdCwgaW50IGluX2ZsYWcsCiYjNDM7CQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQomIzQzO3sKJiM0MzsJc3RydWN0IGNwYV9kYXRhIGNwYTsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7Y3BhLCAwLCBzaXplb2YoY3BhKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrLCBpZiB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNldCBhIG5vdCBzdXBwb3J0ZWQKJiM0MzsJICogZmVhdHVyZS4gIENsZWFyaW5nIG5vbi1zdXBwb3J0ZWQgZmVhdHVyZXMgaXMgT0suCiYjNDM7CSAqLwomIzQzOwltYXNrX3NldCA9IGNhbm9uX3BncHJvdChtYXNrX3NldCk7CiYjNDM7CiYjNDM7CWlmICghcGdwcm90X3ZhbChtYXNrX3NldCkgJmFtcDsmYW1wOyAhcGdwcm90X3ZhbChtYXNrX2NscikgJmFtcDsmYW1wOyAhZm9yY2Vfc3BsaXQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyogRW5zdXJlIHdlIGFyZSBQQUdFX1NJWkUgYWxpZ25lZCAqLwomIzQzOwlpZiAoaW5fZmxhZyAmYW1wOyBDUEFfQVJSQVkpIHsKJiM0MzsJCWludCBpOwomIzQzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG51bXBhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChhZGRyW2ldICZhbXA7IH5QQUdFX01BU0spIHsKJiM0MzsJCQkJYWRkcltpXSAmYW1wOz0gUEFHRV9NQVNLOwomIzQzOwkJCQlXQVJOX09OX09OQ0UoMSk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9IGVsc2UgaWYgKCEoaW5fZmxhZyAmYW1wOyBDUEFfUEFHRVNfQVJSQVkpKSB7CiYjNDM7CQkvKgomIzQzOwkJICogaW5fZmxhZyBvZiBDUEFfUEFHRVNfQVJSQVkgaW1wbGllcyBpdCBpcyBhbGlnbmVkLgomIzQzOwkJICogTm8gbmVlZCB0byBjaGVjayBpbiB0aGF0IGNhc2UKJiM0MzsJCSAqLwomIzQzOwkJaWYgKCphZGRyICZhbXA7IH5QQUdFX01BU0spIHsKJiM0MzsJCQkqYWRkciAmYW1wOz0gUEFHRV9NQVNLOwomIzQzOwkJCS8qCiYjNDM7CQkJICogUGVvcGxlIHNob3VsZCBub3QgYmUgcGFzc2luZyBpbiB1bmFsaWduZWQgYWRkcmVzc2VzOgomIzQzOwkJCSAqLwomIzQzOwkJCVdBUk5fT05fT05DRSgxKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBNdXN0IGF2b2lkIGFsaWFzaW5nIG1hcHBpbmdzIGluIHRoZSBoaWdobWVtIGNvZGUgKi8KJiM0MzsJa21hcF9mbHVzaF91bnVzZWQoKTsKJiM0MzsKJiM0MzsJdm1fdW5tYXBfYWxpYXNlcygpOwomIzQzOwomIzQzOwljcGEudmFkZHIgPSBhZGRyOwomIzQzOwljcGEucGFnZXMgPSBwYWdlczsKJiM0MzsJY3BhLm51bXBhZ2VzID0gbnVtcGFnZXM7CiYjNDM7CWNwYS5tYXNrX3NldCA9IG1hc2tfc2V0OwomIzQzOwljcGEubWFza19jbHIgPSBtYXNrX2NscjsKJiM0MzsJY3BhLmZsYWdzID0gaW5fZmxhZzsKJiM0MzsJY3BhLmN1cnBhZ2UgPSAwOwomIzQzOwljcGEuZm9yY2Vfc3BsaXQgPSBmb3JjZV9zcGxpdDsKJiM0MzsKJiM0MzsJZXJyID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmFtcDtjcGEsIDEpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzoKJiM0MzsJICovCiYjNDM7CWlmICghKGNwYS5mbGFncyAmYW1wOyBDUEFfRkxVU0hUTEIpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWFyY2hfY3BhX2ZsdXNoKCZhbXA7Y3BhLCBlcnIpOwomIzQzOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgdGVzdGNhc2VzIHVzZSBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkbiYjMzk7dAomIzQzOyAqIGJlIGV4cG9zZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gSW5jbHVkZSB0aGVzZSBkaXJlY3RseSBoZXJlLgomIzQzOyAqLwomIzQzOyNpZmRlZiBDT05GSUdfQ1BBX0RFQlVHCiYjNDM7I2luY2x1ZGUgJiMzNDtjcGEtdGVzdC5jJiMzNDsKJiM0MzsjZW5kaWYKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjIgMTE6MTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzYzOTQKCQkJCQkJCW91dHB1dDogMjU1CgkJCQkJCQl0aG91Z2h0czogOTg0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmFjdG9yaW5nIENvcmUgTWVtb3J5IE1hbmFnZW1lbnQgZm9yIEVuaGFuY2VkIFRlc3RpbmcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2guIEl0JiMzOTtzIHJlZmFjdG9yaW5nIHRoZSBgY2hhbmdlX3BhZ2VfYXR0cmAgKENQQSkgbG9naWMsIG1vdmluZyBpdCBpbnRvIGEgbW9yZSBnZW5lcmljIGBtbS9zZXRfbWVtb3J5LmNgIGZyb20gdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBsb2NhdGlvbnMuIFRoaXMgaW50cm9kdWNlcyBgQ09ORklHX0dFTkVSSUNfU0VUX01FTU9SWWAgYW5kIHVwZGF0ZXMgYSBmZXcgYXJjaGl0ZWN0dXJlIEtjb25maWcgZmlsZXMgKGBhcmNoL2xvb25nYXJjaC9LY29uZmlnYCwgYGFyY2gvcmlzY3YvS2NvbmZpZ2AsIGFuZCBgYXJjaC94ODYvS2NvbmZpZ2ApIHRvIHNlbGVjdCBpdC4gVGhleSYjMzk7cmUgYWxzbyBtb3ZpbmcgdGhlIHRlc3QgZmlsZSwgYGNwYS10ZXN0LmNgLCBpbnRvIHRoZSBgbW1gIGRpcmVjdG9yeS4gSXQgbG9va3MgbGlrZSB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgZXhwZWN0ZWQgdG8gcHJvdmlkZSBzb21lIG5ldyBmdW5jdGlvbnMgbm93IHRvbzogYGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VgLCBgYXJjaF9zcGxpdF9sYXJnZV9wYWdlYCwgYGFyY2hfY2hhbmdlX3B0ZWAsIGBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0YCwgYGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXNgLCBhbmQgYGFyY2hfY3BhX2ZsdXNoYC4KClRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgY2hhbmdlIHRvIGhvdyB3ZSBoYW5kbGUgcGFnZSBhdHRyaWJ1dGVzLCBzbyBmdXp6aW5nIGlzIGRlZmluaXRlbHkgYSBwcmlvcml0eSBoZXJlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmlnaHQgYXBwcm9hY2guIExldCYjMzk7cyBzdGFydCBieSBpZGVudGlmeWluZyB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHRoYXQgYXJlIGJlaW5nIHJlZmFjdG9yZWQuIEZ1bmN0aW9ucyB0aGF0IEkgbmVlZCB0byBrZWVwIGEgY2xvc2UgZXllIG9uIGFyZTogYGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscmAsIGBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscmAsIGBfX2NoYW5nZV9wYWdlX2F0dHJgLCBgY3BhX2hhbmRsZV9sYXJnZV9wYWdlYCwgYHNob3VsZF9zcGxpdF9sYXJnZV9wYWdlYCwgYGxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyYCwgYGxvb2t1cF9hZGRyZXNzX2luX3BnZGAsIGBsb29rdXBfYWRkcmVzc2AsIGFuZCBgY3BhX2FkZHJgLiBBbHNvIHRoZSBuZXcgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZjogYGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VgLCBgYXJjaF9zcGxpdF9sYXJnZV9wYWdlYCwgYGFyY2hfY2hhbmdlX3B0ZWAsIGBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0YCwgYGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXNgLCBhbmQgYGFyY2hfY3BhX2ZsdXNoYC4KCk5vdywgaXMgYENPTkZJR19HRU5FUklDX1NFVF9NRU1PUllgIHNvbWV0aGluZyBJIGNhbiBlbmFibGUgZGlyZWN0bHk/IE5vLCBpdCYjMzk7cyBzZWxlY3RlZCBieSB0aGUgYXJjaGl0ZWN0dXJlcywgc28gaXQgc2hvdWxkIGFscmVhZHkgYmUgZW5hYmxlZCBvbiB4ODYsIFJJU0MtViwgYW5kIExvb25nYXJjaC4gSG93ZXZlciwgaGFuZyBvbuKApiBpdCBsb29rcyBsaWtlIHdlIGFsc28gaGF2ZSBhIGBDT05GSUdfQ1BBX0RFQlVHYCBub3csIGF2YWlsYWJsZSBmb3IgYWxsIGFyY2hpdGVjdHVyZXMgdGhhdCBzZWxlY3QgYEdFTkVSSUNfU0VUX01FTU9SWWAuIFRoYXQgc291bmRzIGxpa2UgYSBnaWZ0ISBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIHRoZSBLY29uZmlnLmRlYnVnIGZpbGUgaW4gYG1tYDoKCmBgYApjb25maWcgQ1BBX0RFQlVHCglib29sICYjMzQ7Q1BBIHNlbGYtdGVzdCBjb2RlJiMzNDsKCWRlcGVuZHMgb24gR0VORVJJQ19TRVRfTUVNT1JZCglkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApgYGAKClllcywgZW5hYmxpbmcgYENQQV9ERUJVR2Agd291bGQgYmUgYSBncmVhdCB3YXkgdG8gZXhlcmNpc2UgdGhpcyBuZXcgY29kZS4gTGV0JiMzOTtzIHNlZSBpZiBpdCYjMzk7cyBhbHJlYWR5IHVzZWQgYW55d2hlcmUsIG9yIGlmIEkgbmVlZCB0byBhZGQgaXQuIEkmIzM5O2xsIHNlYXJjaCBmb3IgYENQQV9ERUJVR2AgaW4gdGhlIGtlcm5lbCBhbmQgdXNlIGBzZXQtcmVzdWx0c2Agd2l0aCBgV29ydGhGdXp6aW5nPXRydWVgLgoKRm9yIHRoZSBmb2N1cyBzeW1ib2xzLCBJJiMzOTtsbCB1c2UgdGhvc2UgY29yZSBmdW5jdGlvbiBuYW1lcyBJIGlkZW50aWZpZWQgYmVmb3JlOiBgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyYCwgYF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyYCwgYF9fY2hhbmdlX3BhZ2VfYXR0cmAsIGBjcGFfaGFuZGxlX2xhcmdlX3BhZ2VgLCBgc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VgLCBgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZWAsIGBhcmNoX3NwbGl0X2xhcmdlX3BhZ2VgLCBgYXJjaF9jaGFuZ2VfcHRlYCwgYGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHRgLCBgYXJjaF9jcGFfcHJvY2Vzc19hbGlhc2AsIGBhcmNoX2NwYV9mbHVzaGAsIGFuZCBgbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHJgLgoKTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRob3NlIG5hbWVz4oCmIHllcCwgdGhleSBhbGwgbG9vayBnb29kLiBJJiMzOTtsbCBhZGQgYGxvb2t1cF9hZGRyZXNzX2luX3BnZGAsIGFuZCBgbG9va3VwX2FkZHJlc3NgIHdoaWxlIEkmIzM5O20gYXQgaXQuCgpDb25maWdzOiBgQ1BBX0RFQlVHYAoKTGV0IG1lIG1ha2Ugc3VyZSB0aGF0IGBDUEFfREVCVUdgIGlzIGEgdmFsaWQgY29uZmlnLiBZZXMsIGl0JiMzOTtzIGRlZmluZWQgaW4gYG1tL0tjb25maWcuZGVidWdgLgoKQWxyaWdodCwgSSBkb24mIzM5O3Qgc2VlIGFueSBvdGhlciByZWxldmFudCBjb25maWdzLCBgR0VORVJJQ19TRVRfTUVNT1JZYCBpcyBzZWxlY3RlZCBieSB0aGUgYXJjaGl0ZWN0dXJlcy4gSSYjMzk7bGwgcnVuIGBzZXQtcmVzdWx0c2Agd2l0aCB0aG9zZSBwYXJhbWV0ZXJzLCBhbmQgaG9wZWZ1bGx5LCB0aGlzIHdpbGwgaGlnaGxpZ2h0IHRoZSBiZXN0IGFyZWFzIGZvciBmb2N1c2VkIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjIgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NQQV9ERUJVRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NsciYjMzQ7LAogICAgJiMzNDtfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NsciYjMzQ7LAogICAgJiMzNDtfX2NoYW5nZV9wYWdlX2F0dHImIzM0OywKICAgICYjMzQ7Y3BhX2hhbmRsZV9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O2FyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9zcGxpdF9sYXJnZV9wYWdlJiMzNDssCiAgICAmIzM0O2FyY2hfY2hhbmdlX3B0ZSYjMzQ7LAogICAgJiMzNDthcmNoX2NwYV9wcm9jZXNzX2ZhdWx0JiMzNDssCiAgICAmIzM0O2FyY2hfY3BhX3Byb2Nlc3NfYWxpYXMmIzM0OywKICAgICYjMzQ7YXJjaF9jcGFfZmx1c2gmIzM0OywKICAgICYjMzQ7bG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjaGFuZ2VfcGFnZV9hdHRyIChDUEEpIGxvZ2ljLCBtb3ZpbmcgaXQgZnJvbSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSAoeDg2LCByaXNjdikgdG8gYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGluIG1tL3NldF9tZW1vcnkuYy4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgbmV3IGdlbmVyaWMgZnVuY3Rpb25zIGFuZCB0aGVpciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY2FsbGJhY2tzLiBFbmFibGluZyBDUEFfREVCVUcgd2lsbCBhbHNvIHJ1biB0aGUgQ1BBIHNlbGYtdGVzdHMgdG8gaGVscCB1bmNvdmVyIGlzc3Vlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7Q1BBX0RFQlVHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyJiMzNDssCiAgICAmIzM0O19fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyJiMzNDssCiAgICAmIzM0O19fY2hhbmdlX3BhZ2VfYXR0ciYjMzQ7LAogICAgJiMzNDtjcGFfaGFuZGxlX2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7c2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZSYjMzQ7LAogICAgJiMzNDthcmNoX3NwbGl0X2xhcmdlX3BhZ2UmIzM0OywKICAgICYjMzQ7YXJjaF9jaGFuZ2VfcHRlJiMzNDssCiAgICAmIzM0O2FyY2hfY3BhX3Byb2Nlc3NfZmF1bHQmIzM0OywKICAgICYjMzQ7YXJjaF9jcGFfcHJvY2Vzc19hbGlhcyYjMzQ7LAogICAgJiMzNDthcmNoX2NwYV9mbHVzaCYjMzQ7LAogICAgJiMzNDtsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0ciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNoYW5nZV9wYWdlX2F0dHIgKENQQSkgbG9naWMsIG1vdmluZyBpdCBmcm9tIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlICh4ODYsIHJpc2N2KSB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaW4gbW0vc2V0X21lbW9yeS5jLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZ2VuZXJpYyBmdW5jdGlvbnMgYW5kIHRoZWlyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjYWxsYmFja3MuIEVuYWJsaW5nIENQQV9ERUJVRyB3aWxsIGFsc28gcnVuIHRoZSBDUEEgc2VsZi10ZXN0cyB0byBoZWxwIHVuY292ZXIgaXNzdWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMjJUMTE6MTE6NDAuNTg0OTE3NjlaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTY5Nzk5NTQzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDUEFfREVCVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJcIixcbiAgICBcIl9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyXCIsXG4gICAgXCJfX2NoYW5nZV9wYWdlX2F0dHJcIixcbiAgICBcImNwYV9oYW5kbGVfbGFyZ2VfcGFnZVwiLFxuICAgIFwic2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VcIixcbiAgICBcImFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VcIixcbiAgICBcImFyY2hfc3BsaXRfbGFyZ2VfcGFnZVwiLFxuICAgIFwiYXJjaF9jaGFuZ2VfcHRlXCIsXG4gICAgXCJhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0XCIsXG4gICAgXCJhcmNoX2NwYV9wcm9jZXNzX2FsaWFzXCIsXG4gICAgXCJhcmNoX2NwYV9mbHVzaFwiLFxuICAgIFwibG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNoYW5nZV9wYWdlX2F0dHIgKENQQSkgbG9naWMsIG1vdmluZyBpdCBmcm9tIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlICh4ODYsIHJpc2N2KSB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaW4gbW0vc2V0X21lbW9yeS5jLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZ2VuZXJpYyBmdW5jdGlvbnMgYW5kIHRoZWlyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjYWxsYmFja3MuIEVuYWJsaW5nIENQQV9ERUJVRyB3aWxsIGFsc28gcnVuIHRoZSBDUEEgc2VsZi10ZXN0cyB0byBoZWxwIHVuY292ZXIgaXNzdWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yMlQxMToxMTo0MC41ODQ5MjQzOVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY4ODU2ODQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZDU0NGIyYmZmNGMzNGZmNGU0NmNjMDgxNTE4YTI2NmFiMzE2NTE1Y1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEp1bCAyMiAxMToxMTozOSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9LY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ1xcbmluZGV4IGQ4ZDI1MjMyNTAxNzkxLi4xYmZhOTQ3OTdiMWI0YiAxMDA2NDRcXG4tLS0gYS9hcmNoL2xvb25nYXJjaC9LY29uZmlnXFxuKysrIGIvYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ1xcbkBAIC0xMDksNiArMTA5LDcgQEAgY29uZmlnIExPT05HQVJDSFxcbiBcXHRzZWxlY3QgR0VORVJJQ19MSUJfREVWTUVNX0lTX0FMTE9XRURcXG4gXFx0c2VsZWN0IEdFTkVSSUNfUENJX0lPTUFQXFxuIFxcdHNlbGVjdCBHRU5FUklDX1NDSEVEX0NMT0NLXFxuK1xcdHNlbGVjdCBHRU5FUklDX1NFVF9NRU1PUllcXG4gXFx0c2VsZWN0IEdFTkVSSUNfU01QX0lETEVfVEhSRUFEXFxuIFxcdHNlbGVjdCBHUElPTElCXFxuIFxcdHNlbGVjdCBIQVNfSU9QT1JUXFxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaFxcbmluZGV4IDIyMzUyOGMwNGQ3MzkyLi4zNzdiZWYwODk0ZDc3MSAxMDA2NDRcXG4tLS0gYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcXG4rKysgYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcXG5AQCAtNjM4LDYgKzYzOCw0OCBAQCBzdGF0aWMgaW5saW5lIGxvbmcgcG1kX3Byb3Rub25lKHBtZF90IHBtZClcXG4gI2RlZmluZSBwbWRfbGVhZihwbWQpXFx0XFx0KChwbWRfdmFsKHBtZCkgXFx1MDAyNiBfUEFHRV9IVUdFKSAhPSAwKVxcbiAjZGVmaW5lIHB1ZF9sZWFmKHB1ZClcXHRcXHQoKHB1ZF92YWwocHVkKSBcXHUwMDI2IF9QQUdFX0hVR0UpICE9IDApXFxuIFxcbisjZGVmaW5lIHBnZF93cml0ZSBwZ2Rfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcGdkX3dyaXRlKHBnZF90IHBnZClcXG4re1xcbitcXHRyZXR1cm4gISEocGdkX3ZhbChwZ2QpIFxcdTAwMjYgX1BBR0VfV1JJVEUpO1xcbit9XFxuK1xcbisjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZClcXG4re1xcbitcXHRyZXR1cm4gISEocDRkX3ZhbChwNGQpIFxcdTAwMjYgX1BBR0VfV1JJVEUpO1xcbit9XFxuK1xcbisjZGVmaW5lIHB1ZF93cml0ZSBwdWRfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcHVkX3dyaXRlKHB1ZF90IHB1ZClcXG4re1xcbitcXHRyZXR1cm4gISEocHVkX3ZhbChwdWQpIFxcdTAwMjYgX1BBR0VfV1JJVEUpO1xcbit9XFxuK1xcbisjZGVmaW5lIHBnZF9leGVjIHBnZF9leGVjXFxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF9leGVjKHBnZF90IHBnZClcXG4re1xcbitcXHRyZXR1cm4gIShwZ2RfdmFsKHBnZCkgXFx1MDAyNiBfUEFHRV9OT19FWEVDKTtcXG4rfVxcbitcXG4rI2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXFxuK3tcXG4rXFx0cmV0dXJuICEocDRkX3ZhbChwNGQpIFxcdTAwMjYgX1BBR0VfTk9fRVhFQyk7XFxuK31cXG4rXFxuKyNkZWZpbmUgcHVkX2V4ZWMgcHVkX2V4ZWNcXG4rc3RhdGljIGlubGluZSBpbnQgcHVkX2V4ZWMocHVkX3QgcHVkKVxcbit7XFxuK1xcdHJldHVybiAhKHB1ZF92YWwocHVkKSBcXHUwMDI2IF9QQUdFX05PX0VYRUMpO1xcbit9XFxuK1xcbisjZGVmaW5lIHBtZF9leGVjIHBtZF9leGVjXFxuK3N0YXRpYyBpbmxpbmUgaW50IHBtZF9leGVjKHBtZF90IHBtZClcXG4re1xcbitcXHRyZXR1cm4gIShwbWRfdmFsKHBtZCkgXFx1MDAyNiBfUEFHRV9OT19FWEVDKTtcXG4rfVxcbitcXG4gLypcXG4gICogV2UgcHJvdmlkZSBvdXIgb3duIGdldF91bm1hcHBlZCBhcmVhIHRvIGNvcGUgd2l0aCB0aGUgdmlydHVhbCBhbGlhc2luZ1xcbiAgKiBjb25zdHJhaW50cyBwbGFjZWQgb24gdXMgYnkgdGhlIGNhY2hlIGFyY2hpdGVjdHVyZS5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oIGIvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXFxuaW5kZXggNTVkZmFlZmQwMmM4YTYuLjZmZmI0ZmU1YTc1YjBlIDEwMDY0NFxcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxcbisrKyBiL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxcbkBAIC0xOSw0ICsxOSwxMyBAQCBpbnQgc2V0X2RpcmVjdF9tYXBfZGVmYXVsdF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlKTtcXG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSk7XFxuIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZCk7XFxuIFxcbisvKlxcbisgKiBUaGUgZGlyZWN0IG1hcCBpcyBhIGZpeGVkIGFkZHJlc3Mgd2luZG93IHRoYXQgaXMgbm90IGJhY2tlZCBieSBwYWdlIHRhYmxlcyxcXG4rICogc28gYSBwYWdlIG5ldmVyIGhhcyBhIHNlY29uZCBtYXBwaW5nIHdob3NlIHByb3RlY3Rpb24gbXVzdCBiZSBzeW5jaHJvbmlzZWQuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXModW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4pXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiAjZW5kaWYgLyogX0FTTV9MT09OR0FSQ0hfU0VUX01FTU9SWV9IICovXFxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmMgYi9hcmNoL2xvb25nYXJjaC9tbS9wYWdlYXR0ci5jXFxuaW5kZXggNjE0Y2NjN2FmY2NiZWEuLmRiYmQ0MDhiZDNkNWU2IDEwMDY0NFxcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmNcXG4rKysgYi9hcmNoL2xvb25nYXJjaC9tbS9wYWdlYXR0ci5jXFxuQEAgLTQsMTI2ICs0LDgzIEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbWJsb2NrLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9wYWdld2Fsay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BndGFibGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NldF9tZW1vcnkuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9zZXRfbWVtb3J5LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vdGxiZmx1c2guaFxcdTAwM2VcXG4gXFxuLXN0cnVjdCBwYWdlYXR0cl9tYXNrcyB7XFxuLVxcdHBncHJvdF90IHNldF9tYXNrO1xcbi1cXHRwZ3Byb3RfdCBjbGVhcl9tYXNrO1xcbi19O1xcbi1cXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X3BhZ2VhdHRyX21hc2tzKHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X3BhZ2VhdHRyX21hc2tzKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhbClcXG4ge1xcbi1cXHR1bnNpZ25lZCBsb25nIG5ld192YWwgPSB2YWw7XFxuLVxcdHN0cnVjdCBwYWdlYXR0cl9tYXNrcyAqbWFza3MgPSB3YWxrLVxcdTAwM2Vwcml2YXRlO1xcbi1cXG4tXFx0bmV3X3ZhbCBcXHUwMDI2PSB+KHBncHJvdF92YWwobWFza3MtXFx1MDAzZWNsZWFyX21hc2spKTtcXG4tXFx0bmV3X3ZhbCB8PSAocGdwcm90X3ZhbChtYXNrcy1cXHUwMDNlc2V0X21hc2spKTtcXG4rXFx0dmFsIFxcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19jbHIpO1xcbitcXHR2YWwgfD0gcGdwcm90X3ZhbChjcGEtXFx1MDAzZW1hc2tfc2V0KTtcXG4gXFxuLVxcdHJldHVybiBuZXdfdmFsO1xcbitcXHRyZXR1cm4gdmFsO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3BnZF9lbnRyeShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXFxuK2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxcbiB7XFxuLVxcdHBnZF90IHZhbCA9IHBnZHBfZ2V0KHBnZCk7XFxuLVxcbi1cXHRpZiAocGdkX2xlYWYodmFsKSkge1xcbi1cXHRcXHR2YWwgPSBfX3BnZChzZXRfcGFnZWF0dHJfbWFza3MocGdkX3ZhbCh2YWwpLCB3YWxrKSk7XFxuLVxcdFxcdHNldF9wZ2QocGdkLCB2YWwpO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbitcXHRwdGVfdCBvbGQgPSBwdGVwX2dldChzZC1cXHUwMDNla3B0ZSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdmFsID0gcHRlX3ZhbChvbGQpO1xcbitcXHR1bnNpZ25lZCBsb25nIG5ld192YWwgPSBzZXRfcGFnZWF0dHJfbWFza3MoY3BhLCB2YWwpO1xcbiBcXG4tc3RhdGljIGludCBwYWdlYXR0cl9wNGRfZW50cnkocDRkX3QgKnA0ZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi1cXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxcbi17XFxuLVxcdHA0ZF90IHZhbCA9IHA0ZHBfZ2V0KHA0ZCk7XFxuK1xcdGNwYS1cXHUwMDNlcGZuID0gcHRlX3BmbihvbGQpICsgKChzZC1cXHUwMDNlYWRkcmVzcyBcXHUwMDI2IChzZC1cXHUwMDNlcHNpemUgLSAxKSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuIFxcbi1cXHRpZiAocDRkX2xlYWYodmFsKSkge1xcbi1cXHRcXHR2YWwgPSBfX3A0ZChzZXRfcGFnZWF0dHJfbWFza3MocDRkX3ZhbCh2YWwpLCB3YWxrKSk7XFxuLVxcdFxcdHNldF9wNGQocDRkLCB2YWwpO1xcbitcXHRpZiAobmV3X3ZhbCAhPSB2YWwpIHtcXG4rXFx0XFx0c2V0X3B0ZShzZC1cXHUwMDNla3B0ZSwgX19wdGUobmV3X3ZhbCkpO1xcbitcXHRcXHRjcGEtXFx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHVkX2VudHJ5KHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcXG4raW50IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcXG4ge1xcbi1cXHRwdWRfdCB2YWwgPSBwdWRwX2dldChwdWQpO1xcbi1cXG4tXFx0aWYgKHB1ZF9sZWFmKHZhbCkpIHtcXG4tXFx0XFx0dmFsID0gX19wdWQoc2V0X3BhZ2VhdHRyX21hc2tzKHB1ZF92YWwodmFsKSwgd2FsaykpO1xcbi1cXHRcXHRzZXRfcHVkKHB1ZCwgdmFsKTtcXG4tXFx0fVxcbitcXHRXQVJOX09OX09OQ0UoMSk7XFxuIFxcbi1cXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIC1FSU5WQUw7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcXG4rdm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0ICAgICBwdGVfdCAqa3B0ZSwgcHRlX3Qgb2xkX3B0ZSwgYm9vbCBueCwgYm9vbCBydylcXG4ge1xcbi1cXHRwbWRfdCB2YWwgPSBwbWRwX2dldChwbWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkX3B0ZSk7XFxuK1xcdHB0ZV90IG5ld19wdGUgPSBfX3B0ZShzZXRfcGFnZWF0dHJfbWFza3MoY3BhLCB2YWwpKTtcXG4gXFxuLVxcdGlmIChwbWRfbGVhZih2YWwpKSB7XFxuLVxcdFxcdHZhbCA9IF9fcG1kKHNldF9wYWdlYXR0cl9tYXNrcyhwbWRfdmFsKHZhbCksIHdhbGspKTtcXG4tXFx0XFx0c2V0X3BtZChwbWQsIHZhbCk7XFxuLVxcdH1cXG4rXFx0Y3BhLVxcdTAwM2VwZm4gPSBwdGVfcGZuKG9sZF9wdGUpO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuK1xcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcXG4rXFx0XFx0c2V0X3B0ZShrcHRlLCBuZXdfcHRlKTtcXG4rXFx0XFx0Y3BhLVxcdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XFxuK1xcdH1cXG4gfVxcbiBcXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdGVfZW50cnkocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi1cXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxcbitpbnQgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcXG4rXFx0XFx0XFx0ICAgaW50IHByaW1hcnkpXFxuIHtcXG4tXFx0cHRlX3QgdmFsID0gcHRlcF9nZXQocHRlKTtcXG4tXFxuLVxcdHZhbCA9IF9fcHRlKHNldF9wYWdlYXR0cl9tYXNrcyhwdGVfdmFsKHZhbCksIHdhbGspKTtcXG4tXFx0c2V0X3B0ZShwdGUsIHZhbCk7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBkaXJlY3QgbWFwIGhhcyBubyBwYWdlIHRhYmxlcyBhbmQgdm1hbGxvYyByYW5nZXMgbWF5IGNvbnRhaW5cXG4rXFx0ICogaG9sZXMuIEJvdGggYXJlIHNpbGVudGx5IHNraXBwZWQuXFxuK1xcdCAqL1xcbitcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gMTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B0ZV9ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBuZXh0LFxcbi1cXHRcXHRcXHQgICAgIGludCBkZXB0aCwgc3RydWN0IG1tX3dhbGsgKndhbGspXFxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxcbiB7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIHBhZ2VhdHRyX29wcyA9IHtcXG4tXFx0LnBnZF9lbnRyeSA9IHBhZ2VhdHRyX3BnZF9lbnRyeSxcXG4tXFx0LnA0ZF9lbnRyeSA9IHBhZ2VhdHRyX3A0ZF9lbnRyeSxcXG4tXFx0LnB1ZF9lbnRyeSA9IHBhZ2VhdHRyX3B1ZF9lbnRyeSxcXG4tXFx0LnBtZF9lbnRyeSA9IHBhZ2VhdHRyX3BtZF9lbnRyeSxcXG4tXFx0LnB0ZV9lbnRyeSA9IHBhZ2VhdHRyX3B0ZV9lbnRyeSxcXG4tXFx0LnB0ZV9ob2xlID0gcGFnZWF0dHJfcHRlX2hvbGUsXFxuLVxcdC53YWxrX2xvY2sgPSBQR1dBTEtfUkRMT0NLLFxcbi19O1xcbi1cXG4tc3RhdGljIGludCBfX3NldF9tZW1vcnkodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsIHBncHJvdF90IHNldF9tYXNrLCBwZ3Byb3RfdCBjbGVhcl9tYXNrKVxcbit2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKVxcbiB7XFxuLVxcdGludCByZXQ7XFxuLVxcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyO1xcbi1cXHR1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgUEFHRV9TSVpFICogbnVtcGFnZXM7XFxuLVxcdHN0cnVjdCBwYWdlYXR0cl9tYXNrcyBtYXNrcyA9IHtcXG4tXFx0XFx0LnNldF9tYXNrID0gc2V0X21hc2ssXFxuLVxcdFxcdC5jbGVhcl9tYXNrID0gY2xlYXJfbWFza1xcbi1cXHR9O1xcbi1cXG4tXFx0aWYgKCFudW1wYWdlcylcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcbi1cXHRtbWFwX3dyaXRlX2xvY2soXFx1MDAyNmluaXRfbW0pO1xcbi1cXHRyZXQgPSB3YWxrX2tlcm5lbF9wYWdlX3RhYmxlX3JhbmdlKHN0YXJ0LCBlbmQsIFxcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFxcdTAwMjZtYXNrcyk7XFxuLVxcdG1tYXBfd3JpdGVfdW5sb2NrKFxcdTAwMjZpbml0X21tKTtcXG4tXFxuLVxcdGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7XFxuK1xcdGlmIChlcnIgfHwgY3BhLVxcdTAwM2Vmb3JjZV9mbHVzaF9hbGwgfHxcXG4rXFx0ICAgIChjcGEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpKSB7XFxuK1xcdFxcdGZsdXNoX3RsYl9hbGwoKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuIFxcbi1cXHRyZXR1cm4gcmV0O1xcbitcXHRmbHVzaF90bGJfa2VybmVsX3JhbmdlKCpjcGEtXFx1MDAzZXZhZGRyLCAqY3BhLVxcdTAwM2V2YWRkciArIGNwYS1cXHUwMDNlbnVtcGFnZXMgKiBQQUdFX1NJWkUpO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxcbkBAIC0xMzEsNyArODgsNyBAQCBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxcbiBcXHRpZiAoYWRkciBcXHUwMDNjIHZtX21hcF9iYXNlKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9OT19FWEVDKSk7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKFxcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIDApO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV9ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcXG5AQCAtMTM5LDcgKzk2LDcgQEAgaW50IHNldF9tZW1vcnlfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXFxuIFxcdGlmIChhZGRyIFxcdTAwM2Mgdm1fbWFwX2Jhc2UpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIF9fcGdwcm90KDApKTtcXG4rXFx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFxcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTk9fRVhFQyksIDApO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcXG5AQCAtMTQ3LDcgKzEwNCw3IEBAIGludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxcbiBcXHRpZiAoYWRkciBcXHUwMDNjIHZtX21hcF9iYXNlKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSk7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKFxcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIDApO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcXG5AQCAtMTU1LDg0ICsxMTIsNzUgQEAgaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXFxuIFxcdGlmIChhZGRyIFxcdTAwM2Mgdm1fbWFwX2Jhc2UpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIF9fcGdwcm90KDApKTtcXG4rXFx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFxcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIDApO1xcbiB9XFxuIFxcbiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpXFxuIHtcXG4tXFx0cGdkX3QgKnBnZDtcXG4tXFx0cDRkX3QgKnA0ZDtcXG4tXFx0cHVkX3QgKnB1ZDtcXG4tXFx0cG1kX3QgKnBtZDtcXG4tXFx0cHRlX3QgKnB0ZTtcXG4rXFx0dW5zaWduZWQgaW50IGxldmVsO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XFxuK1xcdHB0ZV90ICpwdGU7XFxuIFxcbiBcXHRpZiAoYWRkciBcXHUwMDNjIHZtX21hcF9iYXNlKVxcbiBcXHRcXHRyZXR1cm4gbWVtYmxvY2tfaXNfbWVtb3J5KF9fcGEoYWRkcikpO1xcbiBcXG4tXFx0cGdkID0gcGdkX29mZnNldF9rKGFkZHIpO1xcbi1cXHRpZiAocGdkX25vbmUocGdkcF9nZXQocGdkKSkpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0aWYgKHBnZF9sZWFmKHBnZHBfZ2V0KHBnZCkpKVxcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tXFxuLVxcdHA0ZCA9IHA0ZF9vZmZzZXQocGdkLCBhZGRyKTtcXG4tXFx0aWYgKHA0ZF9ub25lKHA0ZHBfZ2V0KHA0ZCkpKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdGlmIChwNGRfbGVhZihwNGRwX2dldChwNGQpKSlcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHRwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcik7XFxuLVxcdGlmIChwdWRfbm9uZShwdWRwX2dldChwdWQpKSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHRpZiAocHVkX2xlYWYocHVkcF9nZXQocHVkKSkpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0cG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpO1xcbi1cXHRpZiAocG1kX25vbmUocG1kcF9nZXQocG1kKSkpXFxuK1xcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdGlmICghcHRlKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdGlmIChwbWRfbGVhZihwbWRwX2dldChwbWQpKSlcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcbi1cXHRwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpO1xcbiBcXHRyZXR1cm4gcHRlX3ByZXNlbnQocHRlcF9nZXQocHRlKSk7XFxuIH1cXG4gXFxuIGludCBzZXRfZGlyZWN0X21hcF9kZWZhdWx0X25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xcbitcXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcXHUwMDI2YWRkcixcXG4rXFx0XFx0XFx0XFx0LnBnZCA9IE5VTEwsXFxuK1xcdFxcdFxcdFxcdC5udW1wYWdlcyA9IDEsXFxuK1xcdFxcdFxcdFxcdC5tYXNrX3NldCA9IFBBR0VfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHQubWFza19jbHIgPSBfX3BncHJvdCgwKSxcXG4rXFx0XFx0XFx0XFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XFxuIFxcbiBcXHRpZiAoYWRkciBcXHUwMDNjIHZtX21hcF9iYXNlKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgMSwgUEFHRV9LRVJORUwsIF9fcGdwcm90KDApKTtcXG4rXFx0cmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFxcdTAwMjZjcGEsIDEpO1xcbiB9XFxuIFxcbiBpbnQgc2V0X2RpcmVjdF9tYXBfaW52YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcXG4rXFx0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXFx1MDAyNmFkZHIsXFxuK1xcdFxcdFxcdFxcdC5wZ2QgPSBOVUxMLFxcbitcXHRcXHRcXHRcXHQubnVtcGFnZXMgPSAxLFxcbitcXHRcXHRcXHRcXHQubWFza19zZXQgPSBfX3BncHJvdCgwKSxcXG4rXFx0XFx0XFx0XFx0Lm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKSxcXG4rXFx0XFx0XFx0XFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XFxuIFxcbiBcXHRpZiAoYWRkciBcXHUwMDNjIHZtX21hcF9iYXNlKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgMSwgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCkpO1xcbitcXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXFx1MDAyNmNwYSwgMSk7XFxuIH1cXG4gXFxuIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XFxuLVxcdHBncHJvdF90IHNldCwgY2xlYXI7XFxuK1xcdHN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9IFxcdTAwMjZhZGRyLFxcbitcXHRcXHRcXHRcXHQucGdkID0gTlVMTCxcXG4rXFx0XFx0XFx0XFx0Lm51bXBhZ2VzID0gbnIsXFxuK1xcdFxcdFxcdFxcdC5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9O1xcbiBcXG4gXFx0aWYgKGFkZHIgXFx1MDAzYyB2bV9tYXBfYmFzZSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcbiBcXHRpZiAodmFsaWQpIHtcXG4tXFx0XFx0c2V0ID0gUEFHRV9LRVJORUw7XFxuLVxcdFxcdGNsZWFyID0gX19wZ3Byb3QoMCk7XFxuK1xcdFxcdGNwYS5tYXNrX3NldCA9IFBBR0VfS0VSTkVMO1xcbitcXHRcXHRjcGEubWFza19jbHIgPSBfX3BncHJvdCgwKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0c2V0ID0gX19wZ3Byb3QoMCk7XFxuLVxcdFxcdGNsZWFyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKTtcXG4rXFx0XFx0Y3BhLm1hc2tfc2V0ID0gX19wZ3Byb3QoMCk7XFxuK1xcdFxcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7XFxuIFxcdH1cXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnIsIHNldCwgY2xlYXIpO1xcbitcXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXFx1MDAyNmNwYSwgMSk7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29uZmlnXFxuaW5kZXggM2YwYTY0NzIxOGU0MDcuLjVkMDY5YmYyOTBjZTc4IDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3YvS2NvbmZpZ1xcbisrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZ1xcbkBAIC00OCw2ICs0OCw3IEBAIGNvbmZpZyBSSVNDVlxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfUFRFX1NQRUNJQUxcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX1NFVF9ESVJFQ1RfTUFQIGlmIE1NVVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfU0VUX01FTU9SWSBpZiBNTVVcXG4rXFx0c2VsZWN0IEdFTkVSSUNfU0VUX01FTU9SWSBpZiBNTVVcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYIGlmIE1NVVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfU1RSSUNUX01PRFVMRV9SV1ggaWYgTU1VXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19TWU5DX0NPUkVfQkVGT1JFX1VTRVJNT0RFXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcXG5pbmRleCA1ZDU3NTZiZGE4MmUzZC4uMDI3YjNlN2U0ZjE3N2QgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxcbkBAIC04MTksNiArODE5LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXFxuIFxcdHJldHVybiBwdGVfd3JpdGUocHVkX3B0ZShwdWQpKTtcXG4gfVxcbiBcXG4rI2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlXFxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXFxuK3tcXG4rXFx0cmV0dXJuIHBnZF92YWwocGdkKSBcXHUwMDI2IF9QQUdFX1dSSVRFO1xcbit9XFxuK1xcbisjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZClcXG4re1xcbitcXHRyZXR1cm4gcDRkX3ZhbChwNGQpIFxcdTAwMjYgX1BBR0VfV1JJVEU7XFxuK31cXG4rXFxuKyNkZWZpbmUgcGdkX2V4ZWMgcGdkX2V4ZWNcXG4rc3RhdGljIGlubGluZSBpbnQgcGdkX2V4ZWMocGdkX3QgcGdkKVxcbit7XFxuK1xcdHJldHVybiAhIShwZ2RfdmFsKHBnZCkgXFx1MDAyNiBfUEFHRV9FWEVDKTtcXG4rfVxcbitcXG4rI2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXFxuK3tcXG4rXFx0cmV0dXJuICEhKHA0ZF92YWwocDRkKSBcXHUwMDI2IF9QQUdFX0VYRUMpO1xcbit9XFxuK1xcbisjZGVmaW5lIHB1ZF9leGVjIHB1ZF9leGVjXFxuK3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZClcXG4re1xcbitcXHRyZXR1cm4gISEocHVkX3ZhbChwdWQpIFxcdTAwMjYgX1BBR0VfRVhFQyk7XFxuK31cXG4rXFxuKyNkZWZpbmUgcG1kX2V4ZWMgcG1kX2V4ZWNcXG4rc3RhdGljIGlubGluZSBpbnQgcG1kX2V4ZWMocG1kX3QgcG1kKVxcbit7XFxuK1xcdHJldHVybiAhIShwbWRfdmFsKHBtZCkgXFx1MDAyNiBfUEFHRV9FWEVDKTtcXG4rfVxcbitcXG4gI2RlZmluZSBwbWRfZGlydHkgcG1kX2RpcnR5XFxuIHN0YXRpYyBpbmxpbmUgaW50IHBtZF9kaXJ0eShwbWRfdCBwbWQpXFxuIHtcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxcbmluZGV4IGVmNTllMTcxNmEyY2ZkLi40YmE0NmEzMzEwMzQzMyAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXFxuQEAgLTcsNiArNyw4IEBAXFxuICNkZWZpbmUgX0FTTV9SSVNDVl9TRVRfTUVNT1JZX0hcXG4gXFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3BhZ2UuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wZ3RhYmxlLmhcXHUwMDNlXFxuIC8qXFxuICAqIEZ1bmN0aW9ucyB0byBjaGFuZ2UgbWVtb3J5IGF0dHJpYnV0ZXMuXFxuICAqL1xcbkBAIC0yNiw2ICsyOCwxMSBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBzZXRfa2VybmVsX21lbW9yeShjaGFyICpzdGFydHAsIGNoYXIgKmVuZHAsXFxuIFxcbiBcXHRyZXR1cm4gc2V0X21lbW9yeShzdGFydCwgbnVtX3BhZ2VzKTtcXG4gfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIGNwYV9zaG91bGRfdXBkYXRlX2FsaWFzKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKVxcbit7XFxuK1xcdHJldHVybiAhaXNfbGluZWFyX21hcHBpbmcodmFkZHIpO1xcbit9XFxuICNlbHNlXFxuIHN0YXRpYyBpbmxpbmUgaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpIHsgcmV0dXJuIDA7IH1cXG4gc3RhdGljIGlubGluZSBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykgeyByZXR1cm4gMDsgfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmNcXG5pbmRleCAzZjc2ZGIzZDI3Njk5Mi4uNjZhMjBmYzNkODA1NzQgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jXFxuKysrIGIvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jXFxuQEAgLTMsNDAyICszLDI0MiBAQFxcbiAgKiBDb3B5cmlnaHQgKEMpIDIwMTkgU2lGaXZlXFxuICAqL1xcbiBcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2V3YWxrLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGd0YWJsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvdm1hbGxvYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2V0X21lbW9yeS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3RsYmZsdXNoLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2Nhc20vYml0b3BzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vc2V0X21lbW9yeS5oXFx1MDAzZVxcbiBcXG4tc3RydWN0IHBhZ2VhdHRyX21hc2tzIHtcXG4tXFx0cGdwcm90X3Qgc2V0X21hc2s7XFxuLVxcdHBncHJvdF90IGNsZWFyX21hc2s7XFxuLX07XFxuLVxcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcGFnZWF0dHJfbWFza3ModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxcbi17XFxuLVxcdHN0cnVjdCBwYWdlYXR0cl9tYXNrcyAqbWFza3MgPSB3YWxrLVxcdTAwM2Vwcml2YXRlO1xcbi1cXHR1bnNpZ25lZCBsb25nIG5ld192YWwgPSB2YWw7XFxuLVxcbi1cXHRuZXdfdmFsIFxcdTAwMjY9IH4ocGdwcm90X3ZhbChtYXNrcy1cXHUwMDNlY2xlYXJfbWFzaykpO1xcbi1cXHRuZXdfdmFsIHw9IChwZ3Byb3RfdmFsKG1hc2tzLVxcdTAwM2VzZXRfbWFzaykpO1xcbi1cXG4tXFx0cmV0dXJuIG5ld192YWw7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcDRkX2VudHJ5KHA0ZF90ICpwNGQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcXG4raW50IGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXFxuIHtcXG4tXFx0cDRkX3QgdmFsID0gcDRkcF9nZXQocDRkKTtcXG4tXFxuLVxcdGlmIChwNGRfbGVhZih2YWwpKSB7XFxuLVxcdFxcdHZhbCA9IF9fcDRkKHNldF9wYWdlYXR0cl9tYXNrcyhwNGRfdmFsKHZhbCksIHdhbGspKTtcXG4tXFx0XFx0c2V0X3A0ZChwNGQsIHZhbCk7XFxuLVxcdH1cXG4rXFx0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXFx1MDAzZWtwdGUpO1xcbitcXHRwZ3Byb3RfdCBvbGRfcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkKSBcXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XFxuK1xcdHBncHJvdF90IG5ld19wcm90ID0gb2xkX3Byb3Q7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2xkX3BmbiA9IHB0ZV9wZm4ob2xkKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBscGFkZHIsIG51bXBhZ2VzO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4rXFx0cGdwcm90X3ZhbChuZXdfcHJvdCkgXFx1MDAyNj0gfnBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX2Nscik7XFxuK1xcdHBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX3NldCk7XFxuIFxcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3B1ZF9lbnRyeShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXFxuLXtcXG4tXFx0cHVkX3QgdmFsID0gcHVkcF9nZXQocHVkKTtcXG4tXFxuLVxcdGlmIChwdWRfbGVhZih2YWwpKSB7XFxuLVxcdFxcdHZhbCA9IF9fcHVkKHNldF9wYWdlYXR0cl9tYXNrcyhwdWRfdmFsKHZhbCksIHdhbGspKTtcXG4tXFx0XFx0c2V0X3B1ZChwdWQsIHZhbCk7XFxuLVxcdH1cXG4rXFx0LypcXG4rXFx0ICogUmVjb3JkIHRoZSBwZm4gbWFwcGVkIGF0IEBhZGRyZXNzIHNvIHRoZSBhbGlhcyBjaGVjayBjYW4gbG9jYXRlIHRoZVxcbitcXHQgKiBtYXRjaGluZyBsaW5lYXIgbWFwIGVudHJ5LlxcbitcXHQgKi9cXG4rXFx0Y3BhLVxcdTAwM2VwZm4gPSBvbGRfcGZuICsgKChzZC1cXHUwMDNlYWRkcmVzcyBcXHUwMDI2IChzZC1cXHUwMDNlcHNpemUgLSAxKSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuIFxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbitcXHQvKiBJZiB0aGUgcHJvdGVjdGlvbnMgZG8gbm90IGNoYW5nZSwga2VlcCB0aGUgbGFyZ2UgcGFnZSBpbnRhY3QuICovXFxuK1xcdGlmIChwZ3Byb3RfdmFsKG5ld19wcm90KSA9PSBwZ3Byb3RfdmFsKG9sZF9wcm90KSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuIFxcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXFxuLXtcXG4tXFx0cG1kX3QgdmFsID0gcG1kcF9nZXQocG1kKTtcXG4rXFx0LyogSWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgY292ZXIgdGhlIHdob2xlIGxhcmdlIHBhZ2UsIHNwbGl0IGl0LiAqL1xcbitcXHRscGFkZHIgPSBzZC1cXHUwMDNlYWRkcmVzcyBcXHUwMDI2IHNkLVxcdTAwM2VwbWFzaztcXG4rXFx0bnVtcGFnZXMgPSBzZC1cXHUwMDNlcHNpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0aWYgKHNkLVxcdTAwM2VhZGRyZXNzICE9IGxwYWRkciB8fCBjcGEtXFx1MDAzZW51bXBhZ2VzICE9IG51bXBhZ2VzKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4gXFxuLVxcdGlmIChwbWRfbGVhZih2YWwpKSB7XFxuLVxcdFxcdHZhbCA9IF9fcG1kKHNldF9wYWdlYXR0cl9tYXNrcyhwbWRfdmFsKHZhbCksIHdhbGspKTtcXG4tXFx0XFx0c2V0X3BtZChwbWQsIHZhbCk7XFxuLVxcdH1cXG4rXFx0LyogVGhlIHdob2xlIGxhcmdlIHBhZ2UgaXMgY292ZXJlZDogdXBkYXRlIGl0IGluIHBsYWNlLiAqL1xcbitcXHRzZXRfcHRlKHNkLVxcdTAwM2VrcHRlLCBwZm5fcHRlKG9sZF9wZm4sIG5ld19wcm90KSk7XFxuK1xcdGNwYS1cXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHRlX2VudHJ5KHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcXG4rc3RhdGljIHZvaWQgc3BsaXRfc2V0X3B0ZXMocHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHBmbmluYyxcXG4rXFx0XFx0XFx0ICAgcGdwcm90X3QgcHJvdClcXG4ge1xcbi1cXHRwdGVfdCB2YWwgPSBwdGVwX2dldChwdGUpO1xcbi1cXG4tXFx0dmFsID0gX19wdGUoc2V0X3BhZ2VhdHRyX21hc2tzKHB0ZV92YWwodmFsKSwgd2FsaykpO1xcbi1cXHRzZXRfcHRlKHB0ZSwgdmFsKTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuIFxcbi1cXHRyZXR1cm4gMDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFBUUlNfUEVSX1BURTsgKytpLCArK3B0ZXAsIHBmbiArPSBwZm5pbmMpXFxuK1xcdFxcdHNldF9wdGUocHRlcCwgcGZuX3B0ZShwZm4sIHByb3QpKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdGVfaG9sZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbmV4dCxcXG4tXFx0XFx0XFx0ICAgICBpbnQgZGVwdGgsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxcbitpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxcbiB7XFxuLVxcdC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqL1xcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBtbV93YWxrX29wcyBwYWdlYXR0cl9vcHMgPSB7XFxuLVxcdC5wNGRfZW50cnkgPSBwYWdlYXR0cl9wNGRfZW50cnksXFxuLVxcdC5wdWRfZW50cnkgPSBwYWdlYXR0cl9wdWRfZW50cnksXFxuLVxcdC5wbWRfZW50cnkgPSBwYWdlYXR0cl9wbWRfZW50cnksXFxuLVxcdC5wdGVfZW50cnkgPSBwYWdlYXR0cl9wdGVfZW50cnksXFxuLVxcdC5wdGVfaG9sZSA9IHBhZ2VhdHRyX3B0ZV9ob2xlLFxcbi1cXHQud2Fsa19sb2NrID0gUEdXQUxLX1JETE9DSyxcXG4tfTtcXG4tXFxuICNpZmRlZiBDT05GSUdfNjRCSVRcXG4tc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BtZChwdWRfdCAqcHVkcCxcXG4tXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpXFxuLXtcXG4tXFx0cG1kX3QgKnBtZHA7XFxuLVxcdHVuc2lnbmVkIGxvbmcgbmV4dDtcXG4tXFxuLVxcdHBtZHAgPSBwbWRfb2Zmc2V0KHB1ZHAsIHZhZGRyKTtcXG4tXFxuLVxcdGRvIHtcXG4tXFx0XFx0bmV4dCA9IHBtZF9hZGRyX2VuZCh2YWRkciwgZW5kKTtcXG4tXFxuLVxcdFxcdGlmIChuZXh0IC0gdmFkZHIgXFx1MDAzZT0gUE1EX1NJWkUgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIHZhZGRyIFxcdTAwM2M9ICh2YWRkciBcXHUwMDI2IFBNRF9NQVNLKSBcXHUwMDI2XFx1MDAyNiBlbmQgXFx1MDAzZT0gbmV4dClcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcbi1cXHRcXHRpZiAocG1kX2xlYWYocG1kcF9nZXQocG1kcCkpKSB7XFxuLVxcdFxcdFxcdHN0cnVjdCBwYWdlICpwdGVfcGFnZTtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBwZm4gPSBfcG1kX3BmbihwbWRwX2dldChwbWRwKSk7XFxuLVxcdFxcdFxcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwbWRfdmFsKHBtZHBfZ2V0KHBtZHApKSBcXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XFxuLVxcdFxcdFxcdHB0ZV90ICpwdGVwX25ldztcXG4tXFx0XFx0XFx0aW50IGk7XFxuLVxcbi1cXHRcXHRcXHRwdGVfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuLVxcdFxcdFxcdGlmICghcHRlX3BhZ2UpXFxuLVxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRzdHJ1Y3QgcGFnZSAqYmFzZSA9IHB0ZGVzY19wYWdlKHNkLVxcdTAwM2VwdGRlc2MpO1xcbitcXHRwdGVfdCBvbGQgPSBwdGVwX2dldChzZC1cXHUwMDNla3B0ZSk7XFxuK1xcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwdGVfdmFsKG9sZCkgXFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5pbmM7XFxuK1xcbitcXHRzd2l0Y2ggKHNkLVxcdTAwM2VsZXZlbCkge1xcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxcbitcXHRcXHRwZm5pbmMgPSAxO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcXG4rXFx0XFx0cGZuaW5jID0gUE1EX1NJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUEdUQUJMRV9MRVZFTF9QNEQ6XFxuK1xcdFxcdHBmbmluYyA9IFBVRF9TSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0XFx0cHRlcF9uZXcgPSAocHRlX3QgKilwYWdlX2FkZHJlc3MocHRlX3BhZ2UpO1xcbi1cXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUFRSU19QRVJfUFRFOyArK2ksICsrcHRlcF9uZXcpXFxuLVxcdFxcdFxcdFxcdHNldF9wdGUocHRlcF9uZXcsIHBmbl9wdGUocGZuICsgaSwgcHJvdCkpO1xcbitcXHRzcGxpdF9zZXRfcHRlcygocHRlX3QgKilwYWdlX2FkZHJlc3MoYmFzZSksIHBmbiwgcGZuaW5jLCBwcm90KTtcXG4gXFxuLVxcdFxcdFxcdHNtcF93bWIoKTtcXG4rXFx0c21wX3dtYigpO1xcbitcXHRzZXRfcHRlKHNkLVxcdTAwM2VrcHRlLCBwZm5fcHRlKHBhZ2VfdG9fcGZuKGJhc2UpLCBQQUdFX1RBQkxFKSk7XFxuIFxcbi1cXHRcXHRcXHRzZXRfcG1kKHBtZHAsIHBmbl9wbWQocGFnZV90b19wZm4ocHRlX3BhZ2UpLCBQQUdFX1RBQkxFKSk7XFxuLVxcdFxcdH1cXG4tXFx0fSB3aGlsZSAocG1kcCsrLCB2YWRkciA9IG5leHQsIHZhZGRyICE9IGVuZCk7XFxuK1xcdGNwYS1cXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xcbitcXHRjcGEtXFx1MDAzZWZvcmNlX2ZsdXNoX2FsbCA9IDE7XFxuIFxcbiBcXHRyZXR1cm4gMDtcXG4rI2Vsc2VcXG4rXFx0V0FSTl9PTl9PTkNFKDEpO1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rI2VuZGlmXFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgX19zcGxpdF9saW5lYXJfbWFwcGluZ19wdWQocDRkX3QgKnA0ZHAsXFxuLVxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKVxcbit2b2lkIGFyY2hfY2hhbmdlX3B0ZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHQgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KVxcbiB7XFxuLVxcdHB1ZF90ICpwdWRwO1xcbi1cXHR1bnNpZ25lZCBsb25nIG5leHQ7XFxuLVxcdGludCByZXQ7XFxuLVxcbi1cXHRwdWRwID0gcHVkX29mZnNldChwNGRwLCB2YWRkcik7XFxuLVxcbi1cXHRkbyB7XFxuLVxcdFxcdG5leHQgPSBwdWRfYWRkcl9lbmQodmFkZHIsIGVuZCk7XFxuLVxcbi1cXHRcXHRpZiAobmV4dCAtIHZhZGRyIFxcdTAwM2U9IFBVRF9TSVpFIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICB2YWRkciBcXHUwMDNjPSAodmFkZHIgXFx1MDAyNiBQVURfTUFTSykgXFx1MDAyNlxcdTAwMjYgZW5kIFxcdTAwM2U9IG5leHQpXFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRwZ3Byb3RfdCBuZXdfcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkX3B0ZSkgXFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XFxuK1xcdHB0ZV90IG5ld19wdGU7XFxuIFxcbi1cXHRcXHRpZiAocHVkX2xlYWYocHVkcF9nZXQocHVkcCkpKSB7XFxuLVxcdFxcdFxcdHN0cnVjdCBwYWdlICpwbWRfcGFnZTtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBwZm4gPSBfcHVkX3BmbihwdWRwX2dldChwdWRwKSk7XFxuLVxcdFxcdFxcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwdWRfdmFsKHB1ZHBfZ2V0KHB1ZHApKSBcXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XFxuLVxcdFxcdFxcdHBtZF90ICpwbWRwX25ldztcXG4tXFx0XFx0XFx0aW50IGk7XFxuK1xcdHBncHJvdF92YWwobmV3X3Byb3QpIFxcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19jbHIpO1xcbitcXHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19zZXQpO1xcbiBcXG4tXFx0XFx0XFx0cG1kX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xcbi1cXHRcXHRcXHRpZiAoIXBtZF9wYWdlKVxcbi1cXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0bmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7XFxuK1xcdGNwYS1cXHUwMDNlcGZuID0gcGZuO1xcbiBcXG4tXFx0XFx0XFx0cG1kcF9uZXcgPSAocG1kX3QgKilwYWdlX2FkZHJlc3MocG1kX3BhZ2UpO1xcbi1cXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUFRSU19QRVJfUE1EOyArK2ksICsrcG1kcF9uZXcpXFxuLVxcdFxcdFxcdFxcdHNldF9wbWQocG1kcF9uZXcsXFxuLVxcdFxcdFxcdFxcdFxcdHBmbl9wbWQocGZuICsgKChpICogUE1EX1NJWkUpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpLCBwcm90KSk7XFxuLVxcbi1cXHRcXHRcXHRzbXBfd21iKCk7XFxuLVxcbi1cXHRcXHRcXHRzZXRfcHVkKHB1ZHAsIHBmbl9wdWQocGFnZV90b19wZm4ocG1kX3BhZ2UpLCBQQUdFX1RBQkxFKSk7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcG1kKHB1ZHAsIHZhZGRyLCBuZXh0KTtcXG4tXFx0XFx0aWYgKHJldClcXG4tXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4tXFx0fSB3aGlsZSAocHVkcCsrLCB2YWRkciA9IG5leHQsIHZhZGRyICE9IGVuZCk7XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4rXFx0aWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkge1xcbitcXHRcXHRzZXRfcHRlKGtwdGUsIG5ld19wdGUpO1xcbitcXHRcXHRjcGEtXFx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcXG4rXFx0fVxcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcDRkKHBnZF90ICpwZ2RwLFxcbi1cXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIGVuZClcXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXFxuK1xcdFxcdFxcdCAgIGludCBwcmltYXJ5KVxcbiB7XFxuLVxcdHA0ZF90ICpwNGRwO1xcbi1cXHR1bnNpZ25lZCBsb25nIG5leHQ7XFxuLVxcdGludCByZXQ7XFxuLVxcbi1cXHRwNGRwID0gcDRkX29mZnNldChwZ2RwLCB2YWRkcik7XFxuLVxcbi1cXHRkbyB7XFxuLVxcdFxcdG5leHQgPSBwNGRfYWRkcl9lbmQodmFkZHIsIGVuZCk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiBbdmFkZHI7IGVuZF0gY29udGFpbnMgW3ZhZGRyIFxcdTAwMjYgUDREX01BU0s7IG5leHRdLCB3ZSBkb24ndFxcbi1cXHRcXHQgKiBuZWVkIHRvIHNwbGl0LCB3ZSdsbCBjaGFuZ2UgdGhlIHByb3RlY3Rpb25zIG9uIHRoZSB3aG9sZSBQNEQuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAobmV4dCAtIHZhZGRyIFxcdTAwM2U9IFA0RF9TSVpFIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICB2YWRkciBcXHUwMDNjPSAodmFkZHIgXFx1MDAyNiBQNERfTUFTSykgXFx1MDAyNlxcdTAwMjYgZW5kIFxcdTAwM2U9IG5leHQpXFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0aWYgKHA0ZF9sZWFmKHA0ZHBfZ2V0KHA0ZHApKSkge1xcbi1cXHRcXHRcXHRzdHJ1Y3QgcGFnZSAqcHVkX3BhZ2U7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gX3A0ZF9wZm4ocDRkcF9nZXQocDRkcCkpO1xcbi1cXHRcXHRcXHRwZ3Byb3RfdCBwcm90ID0gX19wZ3Byb3QocDRkX3ZhbChwNGRwX2dldChwNGRwKSkgXFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xcbi1cXHRcXHRcXHRwdWRfdCAqcHVkcF9uZXc7XFxuLVxcdFxcdFxcdGludCBpO1xcbi1cXG4tXFx0XFx0XFx0cHVkX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xcbi1cXHRcXHRcXHRpZiAoIXB1ZF9wYWdlKVxcbi1cXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIEZpbGwgdGhlIHB1ZCBsZXZlbCB3aXRoIGxlYWYgcHVkcyB0aGF0IGhhdmUgdGhlIHNhbWVcXG4tXFx0XFx0XFx0ICogcHJvdGVjdGlvbnMgYXMgdGhlIGxlYWYgcDRkLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cHVkcF9uZXcgPSAocHVkX3QgKilwYWdlX2FkZHJlc3MocHVkX3BhZ2UpO1xcbi1cXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUFRSU19QRVJfUFVEOyArK2ksICsrcHVkcF9uZXcpXFxuLVxcdFxcdFxcdFxcdHNldF9wdWQocHVkcF9uZXcsXFxuLVxcdFxcdFxcdFxcdFxcdHBmbl9wdWQocGZuICsgKChpICogUFVEX1NJWkUpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpLCBwcm90KSk7XFxuLVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIHB1ZCBmaWxsaW5nIGlzIG5vdCByZW9yZGVyZWQgd2l0aCB0aGVcXG4tXFx0XFx0XFx0ICogcDRkIHN0b3JlIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBzZWVpbmcgYSBwYXJ0aWFsbHlcXG4tXFx0XFx0XFx0ICogZmlsbGVkIHB1ZCBsZXZlbC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdHNtcF93bWIoKTtcXG4tXFxuLVxcdFxcdFxcdHNldF9wNGQocDRkcCwgcGZuX3A0ZChwYWdlX3RvX3BmbihwdWRfcGFnZSksIFBBR0VfVEFCTEUpKTtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0cmV0ID0gX19zcGxpdF9saW5lYXJfbWFwcGluZ19wdWQocDRkcCwgdmFkZHIsIG5leHQpO1xcbi1cXHRcXHRpZiAocmV0KVxcbi1cXHRcXHRcXHRyZXR1cm4gcmV0O1xcbi1cXHR9IHdoaWxlIChwNGRwKyssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTtcXG4rXFx0Y3BhLVxcdTAwM2VudW1wYWdlcyA9IDE7XFxuIFxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BnZChwZ2RfdCAqcGdkcCxcXG4tXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkcixcXG4tXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBlbmQpXFxuLXtcXG4tXFx0dW5zaWduZWQgbG9uZyBuZXh0O1xcbi1cXHRpbnQgcmV0O1xcbitcXHRpZiAoIXByaW1hcnkpXFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0ZG8ge1xcbi1cXHRcXHRuZXh0ID0gcGdkX2FkZHJfZW5kKHZhZGRyLCBlbmQpO1xcbi1cXHRcXHQvKiBXZSBuZXZlciB1c2UgUEdEIG1hcHBpbmdzIGZvciB0aGUgbGluZWFyIG1hcHBpbmcgKi9cXG4tXFx0XFx0cmV0ID0gX19zcGxpdF9saW5lYXJfbWFwcGluZ19wNGQocGdkcCwgdmFkZHIsIG5leHQpO1xcbi1cXHRcXHRpZiAocmV0KVxcbi1cXHRcXHRcXHRyZXR1cm4gcmV0O1xcbi1cXHR9IHdoaWxlIChwZ2RwKyssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTtcXG4rXFx0LyogVGhlIGxpbmVhciBtYXAgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBob2xlcyAqL1xcbitcXHRpZiAoaXNfbGluZWFyX21hcHBpbmcodmFkZHIpKSB7XFxuK1xcdFxcdGNwYS1cXHUwMDNlcGZuID0gUEZOX0RPV04oX19wYSh2YWRkcikpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbiBcXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4rXFx0V0FSTigxLCBcXFwiQ1BBOiBjYWxsZWQgZm9yIHplcm8gcHRlLiB2YWRkciA9ICVseCBjcGEtXFx1MDAzZXZhZGRyID0gJWx4XFxcXG5cXFwiLFxcbitcXHQgICAgIHZhZGRyLCAqY3BhLVxcdTAwM2V2YWRkcik7XFxuIFxcbi1zdGF0aWMgaW50IHNwbGl0X2xpbmVhcl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxcbi17XFxuLVxcdHJldHVybiBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3BnZChwZ2Rfb2Zmc2V0X2soc3RhcnQpLCBzdGFydCwgZW5kKTtcXG4rXFx0cmV0dXJuIC1FRkFVTFQ7XFxuIH1cXG4tI2VuZGlmXFx0LyogQ09ORklHXzY0QklUICovXFxuIFxcbi1zdGF0aWMgaW50IF9fc2V0X21lbW9yeSh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcywgcGdwcm90X3Qgc2V0X21hc2ssXFxuLVxcdFxcdFxcdHBncHJvdF90IGNsZWFyX21hc2spXFxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxcbiB7XFxuLVxcdGludCByZXQ7XFxuLVxcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyO1xcbi1cXHR1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgUEFHRV9TSVpFICogbnVtcGFnZXM7XFxuLVxcdHVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgbG1fc3RhcnQ7XFxuLVxcdHVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgbG1fZW5kO1xcbi1cXHRzdHJ1Y3QgcGFnZWF0dHJfbWFza3MgbWFza3MgPSB7XFxuLVxcdFxcdC5zZXRfbWFzayA9IHNldF9tYXNrLFxcbi1cXHRcXHQuY2xlYXJfbWFzayA9IGNsZWFyX21hc2tcXG4tXFx0fTtcXG4tXFxuLVxcdGlmICghbnVtcGFnZXMpXFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRzdHJ1Y3QgY3BhX2RhdGEgYWxpYXNfY3BhO1xcbitcXHR1bnNpZ25lZCBsb25nIGxhZGRyO1xcbiBcXG4tXFx0bW1hcF93cml0ZV9sb2NrKFxcdTAwMjZpbml0X21tKTtcXG4tXFxuLSNpZmRlZiBDT05GSUdfNjRCSVRcXG4gXFx0LypcXG4tXFx0ICogV2UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgcGVybWlzc2lvbnMgb2YgYSBrZXJuZWwgbWFwcGluZywgd2UgbXVzdFxcbi1cXHQgKiBhcHBseSB0aGUgc2FtZSBjaGFuZ2VzIHRvIGl0cyBsaW5lYXIgbWFwcGluZyBhbGlhcywgd2hpY2ggbWF5IGltcGx5XFxuLVxcdCAqIHNwbGl0dGluZyBhIGh1Z2UgbWFwcGluZy5cXG4rXFx0ICogY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoKSBvbmx5IGxldHMgbm9uIGxpbmVhciBtYXAgcHJpbWFyaWVzIHJlYWNoXFxuK1xcdCAqIGhlcmUsIHNvIEBjcGEtXFx1MDAzZXBmbiBhbHdheXMgaGFzIGEgbGluZWFyIG1hcCBhbGlhcyB0aGF0IG11c3QgcmVjZWl2ZVxcbitcXHQgKiB0aGUgc2FtZSBwcm90ZWN0aW9uIGNoYW5nZS5cXG4gXFx0ICovXFxuK1xcdGxhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShQRk5fUEhZUyhjcGEtXFx1MDAzZXBmbikpO1xcbiBcXG4tXFx0aWYgKGlzX3ZtYWxsb2Nfb3JfbW9kdWxlX2FkZHIoKHZvaWQgKilzdGFydCkpIHtcXG4tXFx0XFx0c3RydWN0IHZtX3N0cnVjdCAqYXJlYSA9IE5VTEw7XFxuLVxcdFxcdGludCBpLCBwYWdlX3N0YXJ0O1xcbi1cXG4tXFx0XFx0YXJlYSA9IGZpbmRfdm1fYXJlYSgodm9pZCAqKXN0YXJ0KTtcXG4tXFx0XFx0cGFnZV9zdGFydCA9IChzdGFydCAtICh1bnNpZ25lZCBsb25nKWFyZWEtXFx1MDAzZWFkZHIpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuLVxcbi1cXHRcXHRmb3IgKGkgPSBwYWdlX3N0YXJ0OyBpIFxcdTAwM2MgcGFnZV9zdGFydCArIG51bXBhZ2VzOyArK2kpIHtcXG4tXFx0XFx0XFx0bG1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MoYXJlYS1cXHUwMDNlcGFnZXNbaV0pO1xcbi1cXHRcXHRcXHRsbV9lbmQgPSBsbV9zdGFydCArIFBBR0VfU0laRTtcXG4tXFxuLVxcdFxcdFxcdHJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpO1xcbi1cXHRcXHRcXHRpZiAocmV0KVxcbi1cXHRcXHRcXHRcXHRnb3RvIHVubG9jaztcXG4tXFxuLVxcdFxcdFxcdHJldCA9IHdhbGtfa2VybmVsX3BhZ2VfdGFibGVfcmFuZ2UobG1fc3RhcnQsIGxtX2VuZCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFxcdTAwMjZtYXNrcyk7XFxuLVxcdFxcdFxcdGlmIChyZXQpXFxuLVxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbi1cXHRcXHR9XFxuLVxcdH0gZWxzZSBpZiAoaXNfa2VybmVsX21hcHBpbmcoc3RhcnQpIHx8IGlzX2xpbmVhcl9tYXBwaW5nKHN0YXJ0KSkge1xcbi1cXHRcXHRpZiAoaXNfa2VybmVsX21hcHBpbmcoc3RhcnQpKSB7XFxuLVxcdFxcdFxcdGxtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpbG1fYWxpYXMoc3RhcnQpO1xcbi1cXHRcXHRcXHRsbV9lbmQgPSAodW5zaWduZWQgbG9uZylsbV9hbGlhcyhlbmQpO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRsbV9zdGFydCA9IHN0YXJ0O1xcbi1cXHRcXHRcXHRsbV9lbmQgPSBlbmQ7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpO1xcbi1cXHRcXHRpZiAocmV0KVxcbi1cXHRcXHRcXHRnb3RvIHVubG9jaztcXG4tXFxuLVxcdFxcdHJldCA9IHdhbGtfa2VybmVsX3BhZ2VfdGFibGVfcmFuZ2UobG1fc3RhcnQsIGxtX2VuZCxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFxcdTAwMjZtYXNrcyk7XFxuLVxcdFxcdGlmIChyZXQpXFxuLVxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXQgPSAgd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCBcXHUwMDI2cGFnZWF0dHJfb3BzLCBOVUxMLFxcbi1cXHRcXHRcXHRcXHQgICAgIFxcdTAwMjZtYXNrcyk7XFxuK1xcdGFsaWFzX2NwYSA9ICpjcGE7XFxuK1xcdGFsaWFzX2NwYS52YWRkciA9IFxcdTAwMjZsYWRkcjtcXG4rXFx0YWxpYXNfY3BhLmZsYWdzIFxcdTAwMjY9IH4oQ1BBX1BBR0VTX0FSUkFZIHwgQ1BBX0FSUkFZKTtcXG4rXFx0YWxpYXNfY3BhLmN1cnBhZ2UgPSAwO1xcbiBcXG4tdW5sb2NrOlxcbi1cXHRtbWFwX3dyaXRlX3VubG9jayhcXHUwMDI2aW5pdF9tbSk7XFxuK1xcdC8qIFRoZSBsaW5lYXIgbWFwIGFsaWFzIG11c3QgbmV2ZXIgYmUgbWFkZSBleGVjdXRhYmxlICovXFxuK1xcdGFsaWFzX2NwYS5tYXNrX3NldCA9IF9fcGdwcm90KHBncHJvdF92YWwoYWxpYXNfY3BhLm1hc2tfc2V0KSBcXHUwMDI2IH5fUEFHRV9FWEVDKTtcXG4rXFx0YWxpYXNfY3BhLm1hc2tfY2xyID0gX19wZ3Byb3QocGdwcm90X3ZhbChhbGlhc19jcGEubWFza19jbHIpIFxcdTAwMjYgfl9QQUdFX0VYRUMpO1xcbiBcXG4tXFx0LypcXG4tXFx0ICogV2UgY2FuJ3QgdXNlIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKSBoZXJlIGFzIHdlIG1heSBoYXZlIHNwbGl0IGFcXG4tXFx0ICogaHVnZXBhZ2UgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGF0LCBzbyBsZXQncyBmbHVzaCBldmVyeXRoaW5nLlxcbi1cXHQgKi9cXG4tXFx0Zmx1c2hfdGxiX2FsbCgpO1xcbi0jZWxzZVxcbi1cXHRyZXQgPSAgd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCBcXHUwMDI2cGFnZWF0dHJfb3BzLCBOVUxMLFxcbi1cXHRcXHRcXHRcXHQgICAgIFxcdTAwMjZtYXNrcyk7XFxuK1xcdGNwYS1cXHUwMDNlZm9yY2VfZmx1c2hfYWxsID0gMTtcXG4gXFxuLVxcdG1tYXBfd3JpdGVfdW5sb2NrKFxcdTAwMjZpbml0X21tKTtcXG4rXFx0cmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFxcdTAwMjZhbGlhc19jcGEsIDApO1xcbit9XFxuIFxcbi1cXHRmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpO1xcbi0jZW5kaWZcXG4rdm9pZCBhcmNoX2NwYV9mbHVzaChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGVycilcXG4re1xcbitcXHRpZiAoZXJyIHx8IGNwYS1cXHUwMDNlZm9yY2VfZmx1c2hfYWxsIHx8XFxuK1xcdCAgICAoY3BhLVxcdTAwM2VmbGFncyBcXHUwMDI2IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKSkge1xcbitcXHRcXHRmbHVzaF90bGJfYWxsKCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbiBcXG4tXFx0cmV0dXJuIHJldDtcXG4rXFx0Zmx1c2hfdGxiX2tlcm5lbF9yYW5nZSgqY3BhLVxcdTAwM2V2YWRkcixcXG4rXFx0XFx0XFx0ICAgICAgICpjcGEtXFx1MDAzZXZhZGRyICsgY3BhLVxcdTAwM2VudW1wYWdlcyAqIFBBR0VfU0laRSk7XFxuIH1cXG4gXFxuIGludCBzZXRfbWVtb3J5X3J3X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxcbiB7XFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksXFxuLVxcdFxcdFxcdCAgICBfX3BncHJvdChfUEFHRV9FWEVDKSk7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXFx1MDAyNmFkZHIsIG51bXBhZ2VzLFxcbitcXHRcXHRcXHRcXHRcXHRfX3BncHJvdChfUEFHRV9SRUFEIHwgX1BBR0VfV1JJVEUpLFxcbitcXHRcXHRcXHRcXHRcXHRfX3BncHJvdChfUEFHRV9FWEVDKSwgMCwgMCwgTlVMTCk7XFxuIH1cXG4gXFxuIGludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxcbiB7XFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQpLFxcbi1cXHRcXHRcXHQgICAgX19wZ3Byb3QoX1BBR0VfV1JJVEUpKTtcXG4rXFx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQpLFxcbitcXHRcXHRcXHRcXHRcXHRfX3BncHJvdChfUEFHRV9XUklURSksIDAsIDAsIE5VTEwpO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcXG4ge1xcbi1cXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEIHwgX1BBR0VfV1JJVEUpLFxcbi1cXHRcXHRcXHQgICAgX19wZ3Byb3QoMCkpO1xcbitcXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoXFx1MDAyNmFkZHIsIG51bXBhZ2VzLFxcbitcXHRcXHRcXHRcXHQgICAgX19wZ3Byb3QoX1BBR0VfUkVBRCB8IF9QQUdFX1dSSVRFKSwgMCk7XFxuIH1cXG4gXFxuIGludCBzZXRfbWVtb3J5X3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXFxuIHtcXG4tXFx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfRVhFQyksIF9fcGdwcm90KDApKTtcXG4rXFx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFxcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfRVhFQyksIDApO1xcbiB9XFxuIFxcbiBpbnQgc2V0X21lbW9yeV9ueCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcXG4ge1xcbi1cXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfRVhFQykpO1xcbitcXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihcXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCAwKTtcXG4gfVxcbiBcXG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4ge1xcbi1cXHRyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgMSxcXG4tXFx0XFx0XFx0ICAgIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9QUkVTRU5UKSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XFxuK1xcdHN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9IFxcdTAwMjZzdGFydCxcXG4rXFx0XFx0XFx0XFx0LnBnZCA9IE5VTEwsXFxuK1xcdFxcdFxcdFxcdC5udW1wYWdlcyA9IDEsXFxuK1xcdFxcdFxcdFxcdC5tYXNrX3NldCA9IF9fcGdwcm90KDApLFxcbitcXHRcXHRcXHRcXHQubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UKSxcXG4rXFx0XFx0XFx0XFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XFxuK1xcbitcXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXFx1MDAyNmNwYSwgMSk7XFxuIH1cXG4gXFxuIGludCBzZXRfZGlyZWN0X21hcF9kZWZhdWx0X25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpXFxuIHtcXG4tXFx0cmV0dXJuIF9fc2V0X21lbW9yeSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSksIDEsXFxuLVxcdFxcdFxcdCAgICBQQUdFX0tFUk5FTCwgX19wZ3Byb3QoX1BBR0VfRVhFQykpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xcbitcXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcXHUwMDI2c3RhcnQsXFxuK1xcdFxcdFxcdFxcdC5wZ2QgPSBOVUxMLFxcbitcXHRcXHRcXHRcXHQubnVtcGFnZXMgPSAxLFxcbitcXHRcXHRcXHRcXHQubWFza19zZXQgPSBQQUdFX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0Lm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfRVhFQyksXFxuK1xcdFxcdFxcdFxcdC5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9O1xcbitcXG4rXFx0cmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFxcdTAwMjZjcGEsIDEpO1xcbiB9XFxuIFxcbiBpbnQgc2V0X2RpcmVjdF9tYXBfdmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbnIsIGJvb2wgdmFsaWQpXFxuIHtcXG4tXFx0cGdwcm90X3Qgc2V0LCBjbGVhcjtcXG4rXFx0dW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcXG4rXFx0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXFx1MDAyNnN0YXJ0LFxcbitcXHRcXHRcXHRcXHQucGdkID0gTlVMTCxcXG4rXFx0XFx0XFx0XFx0Lm51bXBhZ2VzID0gbnIsXFxuK1xcdFxcdFxcdFxcdC5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9O1xcbiBcXG4gXFx0aWYgKHZhbGlkKSB7XFxuLVxcdFxcdHNldCA9IFBBR0VfS0VSTkVMO1xcbi1cXHRcXHRjbGVhciA9IF9fcGdwcm90KF9QQUdFX0VYRUMpO1xcbitcXHRcXHRjcGEubWFza19zZXQgPSBQQUdFX0tFUk5FTDtcXG4rXFx0XFx0Y3BhLm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfRVhFQyk7XFxuIFxcdH0gZWxzZSB7XFxuLVxcdFxcdHNldCA9IF9fcGdwcm90KDApO1xcbi1cXHRcXHRjbGVhciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpO1xcbitcXHRcXHRjcGEubWFza19zZXQgPSBfX3BncHJvdCgwKTtcXG4rXFx0XFx0Y3BhLm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCk7XFxuIFxcdH1cXG4gXFxuLVxcdHJldHVybiBfX3NldF9tZW1vcnkoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpLCBuciwgc2V0LCBjbGVhcik7XFxuK1xcdHJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcXHUwMDI2Y3BhLCAxKTtcXG4gfVxcbiBcXG4gI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0NcXG5AQCAtNDM1LDM2ICsyNzUsMTEgQEAgdm9pZCBfX2tlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSlcXG4gYm9vbCBrZXJuZWxfcGFnZV9wcmVzZW50KHN0cnVjdCBwYWdlICpwYWdlKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcXG4tXFx0cGdkX3QgKnBnZDtcXG4tXFx0cHVkX3QgKnB1ZDtcXG4tXFx0cDRkX3QgKnA0ZDtcXG4tXFx0cG1kX3QgKnBtZDtcXG4tXFx0cHRlX3QgKnB0ZTtcXG4tXFxuLVxcdHBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTtcXG4tXFx0aWYgKCFwZ2RfcHJlc2VudChwZ2RwX2dldChwZ2QpKSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHRpZiAocGdkX2xlYWYocGdkcF9nZXQocGdkKSkpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0cDRkID0gcDRkX29mZnNldChwZ2QsIGFkZHIpO1xcbi1cXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZHBfZ2V0KHA0ZCkpKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdGlmIChwNGRfbGVhZihwNGRwX2dldChwNGQpKSlcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHRwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcik7XFxuLVxcdGlmICghcHVkX3ByZXNlbnQocHVkcF9nZXQocHVkKSkpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0aWYgKHB1ZF9sZWFmKHB1ZHBfZ2V0KHB1ZCkpKVxcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0dW5zaWduZWQgaW50IGxldmVsO1xcbitcXHRwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkciwgXFx1MDAyNmxldmVsKTtcXG4gXFxuLVxcdHBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTtcXG4tXFx0aWYgKCFwbWRfcHJlc2VudChwbWRwX2dldChwbWQpKSlcXG4rXFx0aWYgKCFwdGUpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0aWYgKHBtZF9sZWFmKHBtZHBfZ2V0KHBtZCkpKVxcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuLVxcdHB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7XFxuIFxcdHJldHVybiBwdGVfcHJlc2VudChwdGVwX2dldChwdGUpKTtcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZ1xcbmluZGV4IGJkYWQ5MGYyMTBlNGJmLi5lMWYxMDVlNTJkNmExMiAxMDA2NDRcXG4tLS0gYS9hcmNoL3g4Ni9LY29uZmlnXFxuKysrIGIvYXJjaC94ODYvS2NvbmZpZ1xcbkBAIC0zMzYsNiArMzM2LDcgQEAgY29uZmlnIFg4NlxcbiBcXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19TQ0hFRF9DTFVTVEVSXFx0aWYgU01QXFxuIFxcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1NDSEVEX01DXFx0XFx0aWYgU01QXFxuIFxcdHNlbGVjdCBIQVZFX1NJTkdMRV9GVFJBQ0VfRElSRUNUX09QU1xcdGlmIFg4Nl82NCBcXHUwMDI2XFx1MDAyNiBEWU5BTUlDX0ZUUkFDRV9XSVRIX0RJUkVDVF9DQUxMU1xcbitcXHRzZWxlY3QgR0VORVJJQ19TRVRfTUVNT1JZXFxuIFxcbiBjb25maWcgSU5TVFJVQ1RJT05fREVDT0RFUlxcbiBcXHRkZWZfYm9vbCB5XFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuZGVidWcgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnXFxuaW5kZXggYzk1YzNhYWFkZjk3YzMuLjMxNGI3MmFhZDZmZmY0IDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L0tjb25maWcuZGVidWdcXG4rKysgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnXFxuQEAgLTE1NywxMiArMTU3LDYgQEAgY29uZmlnIERFQlVHX0JPT1RfUEFSQU1TXFxuIFxcdGhlbHBcXG4gXFx0ICBUaGlzIG9wdGlvbiB3aWxsIGNhdXNlIHN0cnVjdCBib290X3BhcmFtcyB0byBiZSBleHBvcnRlZCB2aWEgZGVidWdmcy5cXG4gXFxuLWNvbmZpZyBDUEFfREVCVUdcXG4tXFx0Ym9vbCBcXFwiQ1BBIHNlbGYtdGVzdCBjb2RlXFxcIlxcbi1cXHRkZXBlbmRzIG9uIERFQlVHX0tFUk5FTFxcbi1cXHRoZWxwXFxuLVxcdCAgRG8gY2hhbmdlX3BhZ2VfYXR0cigpIHNlbGYtdGVzdHMgZXZlcnkgMzAgc2Vjb25kcy5cXG4tXFxuIGNvbmZpZyBERUJVR19FTlRSWVxcbiBcXHRib29sIFxcXCJEZWJ1ZyBsb3ctbGV2ZWwgZW50cnkgY29kZVxcXCJcXG4gXFx0ZGVwZW5kcyBvbiBERUJVR19LRVJORUxcXG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oXFxuaW5kZXggYWMyOTVjYTZjOTJmOTkuLjQ5N2FhZjA4YWQzNjE2IDEwMDY0NFxcbi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxcbkBAIC0yMjcsNiArMjI3LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXFxuIFxcdHJldHVybiBwdWRfZmxhZ3MocHVkKSBcXHUwMDI2IF9QQUdFX1JXO1xcbiB9XFxuIFxcbisjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZClcXG4re1xcbitcXHRyZXR1cm4gcDRkX2ZsYWdzKHA0ZCkgXFx1MDAyNiBfUEFHRV9SVztcXG4rfVxcbitcXG4rI2RlZmluZSBwZ2Rfd3JpdGUgcGdkX3dyaXRlXFxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXFxuK3tcXG4rXFx0cmV0dXJuIHBnZF9mbGFncyhwZ2QpIFxcdTAwMjYgX1BBR0VfUlc7XFxuK31cXG4rXFxuKyNkZWZpbmUgcG1kX2V4ZWMgcG1kX2V4ZWNcXG4rc3RhdGljIGlubGluZSBpbnQgcG1kX2V4ZWMocG1kX3QgcG1kKVxcbit7XFxuK1xcdHJldHVybiAhKHBtZF9mbGFncyhwbWQpIFxcdTAwMjYgX1BBR0VfTlgpO1xcbit9XFxuK1xcbisjZGVmaW5lIHB1ZF9leGVjIHB1ZF9leGVjXFxuK3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZClcXG4re1xcbitcXHRyZXR1cm4gIShwdWRfZmxhZ3MocHVkKSBcXHUwMDI2IF9QQUdFX05YKTtcXG4rfVxcbitcXG4rI2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXFxuK3tcXG4rXFx0cmV0dXJuICEocDRkX2ZsYWdzKHA0ZCkgXFx1MDAyNiBfUEFHRV9OWCk7XFxuK31cXG4rXFxuKyNkZWZpbmUgcGdkX2V4ZWMgcGdkX2V4ZWNcXG4rc3RhdGljIGlubGluZSBpbnQgcGdkX2V4ZWMocGdkX3QgcGdkKVxcbit7XFxuK1xcdHJldHVybiAhKHBnZF9mbGFncyhwZ2QpIFxcdTAwMjYgX1BBR0VfTlgpO1xcbit9XFxuK1xcbiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpXFxuIHtcXG4gXFx0cmV0dXJuIHB0ZV9mbGFncyhwdGUpIFxcdTAwMjYgX1BBR0VfUFNFO1xcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcXG5pbmRleCA0MzYyYzI2YWE5OTJkYi4uMzMyZWMzMDBjMmVkOWMgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXFxuKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXFxuQEAgLTMsMTIgKzMsNjIgQEBcXG4gI2RlZmluZSBfQVNNX1g4Nl9TRVRfTUVNT1JZX0hcXG4gXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vcGFnZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3NlY3Rpb25zLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20tZ2VuZXJpYy9zZXRfbWVtb3J5LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vcGd0YWJsZS5oXFx1MDAzZVxcbiBcXG4gI2RlZmluZSBzZXRfbWVtb3J5X3JveCBzZXRfbWVtb3J5X3JveFxcbiBpbnQgc2V0X21lbW9yeV9yb3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpO1xcbiBcXG4rI2lmZGVmIENPTkZJR19YODZfNjRcXG4rLypcXG4rICogVGhlIGtlcm5lbCBpbWFnZSBpcyBtYXBwZWQgaW50byB0d28gcGxhY2VzIGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2VcXG4rICogKGFkZHJlc3NlcyB3aXRob3V0IEtBU0xSLCBvZiBjb3Vyc2UpOlxcbisgKlxcbisgKiAxLiBUaGUga2VybmVsIGRpcmVjdCBtYXAgKDB4ZmZmZjg4MDAwMDAwMDAwMClcXG4rICogMi4gVGhlIFxcXCJoaWdoIGtlcm5lbCBtYXBcXFwiICgweGZmZmZmZmZmODEwMDAwMDApXFxuKyAqXFxuKyAqIFdlIGFjdHVhbGx5IGV4ZWN1dGUgb3V0IG9mICMyLiBJZiB3ZSBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBrZXJuZWwgc3ltYm9sLCBpdFxcbisgKiBwb2ludHMgdG8gIzIsIGJ1dCBhbG1vc3QgYWxsIHBoeXNpY2FsLXRvLXZpcnR1YWwgdHJhbnNsYXRpb25zIHBvaW50IHRvICMxLlxcbisgKlxcbisgKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYm90aCBhIGRpcmVjdG1hcCBvZiBhbGwgcGh5c2ljYWwgbWVtb3J5ICphbmQqXFxuKyAqIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgdGhlIGxpbWl0ZWQgKHMzMikgaW1tZWRpYXRlIGFkZHJlc3NpbmcgcmFuZ2UgKDJHKVxcbisgKiBvZiB4ODZfNjQuXFxuKyAqXFxuKyAqIFNlZSBEb2N1bWVudGF0aW9uL2FyY2gveDg2L3g4Nl82NC9tbS5yc3QgZm9yIG1vcmUgZGV0YWlsLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIHBmbl9pc19rZXJuZWwodW5zaWduZWQgbG9uZyBwZm4pXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBzcGZuID0gX19wYV9zeW1ib2woX3RleHQpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdC8qIERvIG5vdCByZWZlcmVuY2UgYSBwaHlzaWNhbCBhZGRyZXNzIG91dHNpZGUgdGhlIGtlcm5lbC4gKi9cXG4rXFx0dW5zaWduZWQgbG9uZyBlcGZuID0gX19wYV9zeW1ib2wocm91bmR1cChfYnJrX2VuZCwgUE1EX1NJWkUpIC0gMSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFxuK1xcdHJldHVybiBwZm4gXFx1MDAzZT0gc3BmbiBcXHUwMDI2XFx1MDAyNiBwZm4gXFx1MDAzYz0gZXBmbjtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgaW5saW5lIGJvb2wgcGZuX2lzX2tlcm5lbCh1bnNpZ25lZCBsb25nIHBmbilcXG4re1xcbitcXHQvKiBUaGVyZSBpcyBubyBoaWdobWFwIG9uIDMyLWJpdCAqL1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rI2VuZGlmXFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXModW5zaWduZWQgbG9uZyB2YWRkcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBwZm4pXFxuK3tcXG4rXFx0LyogUHJpbWFyeSBpcyBub3QgaW4gdGhlIGRpcmVjdCBtYXAsIGl0cyBkaXJlY3QgbWFwIGFsaWFzIG5lZWRzIHVwZGF0ZSAqL1xcbitcXHRpZiAodmFkZHIgXFx1MDAzYyBQQUdFX09GRlNFVCB8fFxcbitcXHQgICAgdmFkZHIgXFx1MDAzZT0gUEFHRV9PRkZTRVQgKyAobWF4X3Bmbl9tYXBwZWQgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0LyogZGlyZWN0IG1hcCBwYWdlIHRoYXQgaXMgYWxzbyBwYXJ0IG9mIHRoZSBrZXJuZWwgaGlnaG1hcCAqL1xcbitcXHRpZiAoKHZhZGRyIFxcdTAwM2MgKHVuc2lnbmVkIGxvbmcpX3RleHQgfHwgdmFkZHIgXFx1MDAzZT0gX2Jya19lbmQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBwZm5faXNfa2VybmVsKHBmbikpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBUaGUgc2V0X21lbW9yeV8qIEFQSSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIGEgdmlydHVhbFxcbiAgKiBhZGRyZXNzIHJhbmdlLiBUaGUgYXR0cmlidXRlcyBpbmNsdWRlOlxcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQvc2V0X21lbW9yeS5jIGIvYXJjaC94ODYvbW0vcGF0L3NldF9tZW1vcnkuY1xcbmluZGV4IGQwMjNhNDBhMWUwMzQ1Li5jNDYwMTIxYzk2Yjk0OSAxMDA2NDRcXG4tLS0gYS9hcmNoL3g4Ni9tbS9wYXQvc2V0X21lbW9yeS5jXFxuKysrIGIvYXJjaC94ODYvbW0vcGF0L3NldF9tZW1vcnkuY1xcbkBAIC0zOCwyMSArMzgsNiBAQFxcbiAvKlxcbiAgKiBUaGUgY3VycmVudCBmbHVzaGluZyBjb250ZXh0IC0gd2UgcGFzcyBpdCBpbnN0ZWFkIG9mIDUgYXJndW1lbnRzOlxcbiAgKi9cXG4tc3RydWN0IGNwYV9kYXRhIHtcXG4tXFx0dW5zaWduZWQgbG9uZ1xcdCp2YWRkcjtcXG4tXFx0cGdkX3RcXHRcXHQqcGdkO1xcbi1cXHRwZ3Byb3RfdFxcdG1hc2tfc2V0O1xcbi1cXHRwZ3Byb3RfdFxcdG1hc2tfY2xyO1xcbi1cXHR1bnNpZ25lZCBsb25nXFx0bnVtcGFnZXM7XFxuLVxcdHVuc2lnbmVkIGxvbmdcXHRjdXJwYWdlO1xcbi1cXHR1bnNpZ25lZCBsb25nXFx0cGZuO1xcbi1cXHR1bnNpZ25lZCBpbnRcXHRmbGFncztcXG4tXFx0dW5zaWduZWQgaW50XFx0Zm9yY2Vfc3BsaXRcXHRcXHQ6IDEsXFxuLVxcdFxcdFxcdGZvcmNlX3N0YXRpY19wcm90XFx0OiAxLFxcbi1cXHRcXHRcXHRmb3JjZV9mbHVzaF9hbGxcXHRcXHQ6IDE7XFxuLVxcdHN0cnVjdCBwYWdlXFx0KipwYWdlcztcXG4tfTtcXG4tXFxuIGVudW0gY3BhX3dhcm4ge1xcbiBcXHRDUEFfQ09ORkxJQ1QsXFxuIFxcdENQQV9QUk9URUNULFxcbkBAIC02MSwyNyArNDYsMTMgQEAgZW51bSBjcGFfd2FybiB7XFxuIFxcbiBzdGF0aWMgY29uc3QgaW50IGNwYV93YXJuX2xldmVsID0gQ1BBX1BST1RFQ1Q7XFxuIFxcbi0vKlxcbi0gKiBTZXJpYWxpemUgY3BhKCkgKGZvciAhREVCVUdfUEFHRUFMTE9DIHdoaWNoIHVzZXMgbGFyZ2UgaWRlbnRpdHkgbWFwcGluZ3MpXFxuLSAqIHVzaW5nIGNwYV9sb2NrLiBTbyB0aGF0IHdlIGRvbid0IGFsbG93IGFueSBvdGhlciBjcHUsIHdpdGggc3RhbGUgbGFyZ2UgdGxiXFxuLSAqIGVudHJpZXMgY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdVxcbi0gKiBzcGxpdHRpbmcgYSBsYXJnZSBwYWdlIGVudHJ5IGFsb25nIHdpdGggY2hhbmdpbmcgdGhlIGF0dHJpYnV0ZS5cXG4tICovXFxuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spO1xcbi1cXG4tI2RlZmluZSBDUEFfRkxVU0hUTEIgMVxcbi0jZGVmaW5lIENQQV9BUlJBWSAyXFxuLSNkZWZpbmUgQ1BBX1BBR0VTX0FSUkFZIDRcXG4tI2RlZmluZSBDUEFfTk9fQ0hFQ0tfQUxJQVMgOCAvKiBEbyBub3Qgc2VhcmNoIGZvciBhbGlhc2VzICovXFxuLSNkZWZpbmUgQ1BBX0NPTExBUFNFIDE2IC8qIHRyeSB0byBjb2xsYXBzZSBsYXJnZSBwYWdlcyAqL1xcbi1cXG4gc3RhdGljIGlubGluZSBwZ3Byb3RfdCBjYWNoZW1vZGUycGdwcm90KGVudW0gcGFnZV9jYWNoZV9tb2RlIHBjbSlcXG4ge1xcbiBcXHRyZXR1cm4gX19wZ3Byb3QoY2FjaGVtb2RlMnByb3R2YWwocGNtKSk7XFxuIH1cXG4gXFxuICNpZmRlZiBDT05GSUdfUFJPQ19GU1xcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfTlVNXTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfTlVNXTtcXG4gXFxuIHZvaWQgdXBkYXRlX3BhZ2VfY291bnQoaW50IGxldmVsLCB1bnNpZ25lZCBsb25nIHBhZ2VzKVxcbiB7XFxuQEAgLTk4LDkgKzY5LDkgQEAgc3RhdGljIHZvaWQgc3BsaXRfcGFnZV9jb3VudChpbnQgbGV2ZWwpXFxuIFxcbiBcXHRkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWxdLS07XFxuIFxcdGlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpIHtcXG4tXFx0XFx0aWYgKGxldmVsID09IFBHX0xFVkVMXzJNKVxcbitcXHRcXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXFxuIFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KERJUkVDVF9NQVBfTEVWRUwyX1NQTElUKTtcXG4tXFx0XFx0ZWxzZSBpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMUcpXFxuK1xcdFxcdGVsc2UgaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEKVxcbiBcXHRcXHRcXHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMM19TUExJVCk7XFxuIFxcdH1cXG4gXFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsIC0gMV0gKz0gUFRSU19QRVJfUFRFO1xcbkBAIC0xMTAsOSArODEsOSBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9wYWdlX2NvdW50KGludCBsZXZlbClcXG4ge1xcbiBcXHRkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWxdKys7XFxuIFxcdGlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpIHtcXG4tXFx0XFx0aWYgKGxldmVsID09IFBHX0xFVkVMXzJNKVxcbitcXHRcXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXFxuIFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KERJUkVDVF9NQVBfTEVWRUwyX0NPTExBUFNFKTtcXG4tXFx0XFx0ZWxzZSBpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMUcpXFxuK1xcdFxcdGVsc2UgaWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEKVxcbiBcXHRcXHRcXHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMM19DT0xMQVBTRSk7XFxuIFxcdH1cXG4gXFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsIC0gMV0gLT0gUFRSU19QRVJfUFRFO1xcbkBAIC0xMjEsMTcgKzkyLDE3IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3BhZ2VfY291bnQoaW50IGxldmVsKVxcbiB2b2lkIGFyY2hfcmVwb3J0X21lbWluZm8oc3RydWN0IHNlcV9maWxlICptKVxcbiB7XFxuIFxcdHNlcV9wcmludGYobSwgXFxcIkRpcmVjdE1hcDRrOiAgICAlOGx1IGtCXFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfNEtdIFxcdTAwM2NcXHUwMDNjIDIpO1xcbitcXHRcXHRcXHRkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9QVEVdIFxcdTAwM2NcXHUwMDNjIDIpO1xcbiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfUEFFKVxcbiBcXHRzZXFfcHJpbnRmKG0sIFxcXCJEaXJlY3RNYXAyTTogICAgJThsdSBrQlxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzJNXSBcXHUwMDNjXFx1MDAzYyAxMSk7XFxuK1xcdFxcdFxcdGRpcmVjdF9wYWdlc19jb3VudFtQR1RBQkxFX0xFVkVMX1BNRF0gXFx1MDAzY1xcdTAwM2MgMTEpO1xcbiAjZWxzZVxcbiBcXHRzZXFfcHJpbnRmKG0sIFxcXCJEaXJlY3RNYXA0TTogICAgJThsdSBrQlxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzJNXSBcXHUwMDNjXFx1MDAzYyAxMik7XFxuK1xcdFxcdFxcdGRpcmVjdF9wYWdlc19jb3VudFtQR1RBQkxFX0xFVkVMX1BNRF0gXFx1MDAzY1xcdTAwM2MgMTIpO1xcbiAjZW5kaWZcXG4gXFx0aWYgKGRpcmVjdF9nYnBhZ2VzKVxcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCJEaXJlY3RNYXAxRzogICAgJThsdSBrQlxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzFHXSBcXHUwMDNjXFx1MDAzYyAyMCk7XFxuK1xcdFxcdFxcdGRpcmVjdF9wYWdlc19jb3VudFtQR1RBQkxFX0xFVkVMX1BVRF0gXFx1MDAzY1xcdTAwM2MgMjApO1xcbiB9XFxuICNlbHNlXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGxpdF9wYWdlX2NvdW50KGludCBsZXZlbCkgeyB9XFxuQEAgLTE2NSw3ICsxMzYsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY180a19pbnN0YWxsKHZvaWQpXFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY19scF9zYW1lcHJvdChpbnQgbGV2ZWwpXFxuIHtcXG4tXFx0aWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxcbitcXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVUQpXFxuIFxcdFxcdGNwYV8xZ19zYW1lcHJvdCsrO1xcbiBcXHRlbHNlXFxuIFxcdFxcdGNwYV8ybV9zYW1lcHJvdCsrO1xcbkBAIC0xNzMsNyArMTQ0LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGNwYV9pbmNfbHBfc2FtZXByb3QoaW50IGxldmVsKVxcbiBcXG4gc3RhdGljIGlubGluZSB2b2lkIGNwYV9pbmNfbHBfcHJlc2VydmVkKGludCBsZXZlbClcXG4ge1xcbi1cXHRpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMUcpXFxuK1xcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRClcXG4gXFx0XFx0Y3BhXzFnX3ByZXNlcnZlZCsrO1xcbiBcXHRlbHNlXFxuIFxcdFxcdGNwYV8ybV9wcmVzZXJ2ZWQrKztcXG5AQCAtMjI1LDYxICsxOTYsNiBAQCB3aXRoaW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcXG4gXFx0cmV0dXJuIGFkZHIgXFx1MDAzZT0gc3RhcnQgXFx1MDAyNlxcdTAwMjYgYWRkciBcXHUwMDNjIGVuZDtcXG4gfVxcbiBcXG4tI2lmZGVmIENPTkZJR19YODZfNjRcXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50XFxuLXdpdGhpbl9pbmNsdXNpdmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcXG4te1xcbi1cXHRyZXR1cm4gYWRkciBcXHUwMDNlPSBzdGFydCBcXHUwMDI2XFx1MDAyNiBhZGRyIFxcdTAwM2M9IGVuZDtcXG4tfVxcbi1cXG4tLypcXG4tICogVGhlIGtlcm5lbCBpbWFnZSBpcyBtYXBwZWQgaW50byB0d28gcGxhY2VzIGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2VcXG4tICogKGFkZHJlc3NlcyB3aXRob3V0IEtBU0xSLCBvZiBjb3Vyc2UpOlxcbi0gKlxcbi0gKiAxLiBUaGUga2VybmVsIGRpcmVjdCBtYXAgKDB4ZmZmZjg4MDAwMDAwMDAwMClcXG4tICogMi4gVGhlIFxcXCJoaWdoIGtlcm5lbCBtYXBcXFwiICgweGZmZmZmZmZmODEwMDAwMDApXFxuLSAqXFxuLSAqIFdlIGFjdHVhbGx5IGV4ZWN1dGUgb3V0IG9mICMyLiBJZiB3ZSBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBrZXJuZWwgc3ltYm9sLCBpdFxcbi0gKiBwb2ludHMgdG8gIzIsIGJ1dCBhbG1vc3QgYWxsIHBoeXNpY2FsLXRvLXZpcnR1YWwgdHJhbnNsYXRpb25zIHBvaW50IHRvICMxLlxcbi0gKlxcbi0gKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYm90aCBhIGRpcmVjdG1hcCBvZiBhbGwgcGh5c2ljYWwgbWVtb3J5ICphbmQqXFxuLSAqIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgdGhlIGxpbWl0ZWQgKHMzMikgaW1tZWRpYXRlIGFkZHJlc3NpbmcgcmFuZ2UgKDJHKVxcbi0gKiBvZiB4ODZfNjQuXFxuLSAqXFxuLSAqIFNlZSBEb2N1bWVudGF0aW9uL2FyY2gveDg2L3g4Nl82NC9tbS5yc3QgZm9yIG1vcmUgZGV0YWlsLlxcbi0gKi9cXG4tXFxuLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoaWdobWFwX3N0YXJ0X3Bmbih2b2lkKVxcbi17XFxuLVxcdHJldHVybiBfX3BhX3N5bWJvbChfdGV4dCkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhpZ2htYXBfZW5kX3Bmbih2b2lkKVxcbi17XFxuLVxcdC8qIERvIG5vdCByZWZlcmVuY2UgcGh5c2ljYWwgYWRkcmVzcyBvdXRzaWRlIHRoZSBrZXJuZWwuICovXFxuLVxcdHJldHVybiBfX3BhX3N5bWJvbChyb3VuZHVwKF9icmtfZW5kLCBQTURfU0laRSkgLSAxKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbi19XFxuLVxcbi1zdGF0aWMgYm9vbCBfX2NwYV9wZm5faW5faGlnaG1hcCh1bnNpZ25lZCBsb25nIHBmbilcXG4te1xcbi1cXHQvKlxcbi1cXHQgKiBLZXJuZWwgdGV4dCBoYXMgYW4gYWxpYXMgbWFwcGluZyBhdCBhIGhpZ2ggYWRkcmVzcywga25vd25cXG4tXFx0ICogaGVyZSBhcyBcXFwiaGlnaG1hcFxcXCIuXFxuLVxcdCAqL1xcbi1cXHRyZXR1cm4gd2l0aGluX2luY2x1c2l2ZShwZm4sIGhpZ2htYXBfc3RhcnRfcGZuKCksIGhpZ2htYXBfZW5kX3BmbigpKTtcXG4tfVxcbi1cXG4tI2Vsc2VcXG4tXFxuLXN0YXRpYyBib29sIF9fY3BhX3Bmbl9pbl9oaWdobWFwKHVuc2lnbmVkIGxvbmcgcGZuKVxcbi17XFxuLVxcdC8qIFRoZXJlIGlzIG5vIGhpZ2htYXAgb24gMzItYml0ICovXFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbi1cXG4tI2VuZGlmXFxuLVxcbiAvKlxcbiAgKiBTZWUgc2V0X21jZV9ub3NwZWMoKS5cXG4gICpcXG5AQCAtMzAzLDIzICsyMTksNiBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZml4X2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKVxcbiAjZW5kaWZcXG4gfVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgX19jcGFfYWRkcihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBpZHgpXFxuLXtcXG4tXFx0aWYgKGNwYS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBDUEFfUEFHRVNfQVJSQVkpIHtcXG4tXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBjcGEtXFx1MDAzZXBhZ2VzW2lkeF07XFxuLVxcbi1cXHRcXHRpZiAodW5saWtlbHkoUGFnZUhpZ2hNZW0ocGFnZSkpKVxcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdFxcdHJldHVybiAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XFxuLVxcdH1cXG4tXFxuLVxcdGlmIChjcGEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQ1BBX0FSUkFZKVxcbi1cXHRcXHRyZXR1cm4gY3BhLVxcdTAwM2V2YWRkcltpZHhdO1xcbi1cXG4tXFx0cmV0dXJuICpjcGEtXFx1MDAzZXZhZGRyICsgaWR4ICogUEFHRV9TSVpFO1xcbi19XFxuLVxcbiAvKlxcbiAgKiBGbHVzaGluZyBmdW5jdGlvbnNcXG4gICovXFxuQEAgLTQwNSw3ICszMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NwYV9mbHVzaF90bGIodm9pZCAqZGF0YSlcXG4gXFx0dW5zaWduZWQgaW50IGk7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY3BhLVxcdTAwM2VudW1wYWdlczsgaSsrKVxcbi1cXHRcXHRmbHVzaF90bGJfb25lX2tlcm5lbChmaXhfYWRkcihfX2NwYV9hZGRyKGNwYSwgaSkpKTtcXG4rXFx0XFx0Zmx1c2hfdGxiX29uZV9rZXJuZWwoZml4X2FkZHIoY3BhX2FkZHIoY3BhLCBpKSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGxpc3RfaGVhZCAqcGd0YWJsZXMpO1xcbkBAIC00MjAsMTAgKzMxOSwxMCBAQCBzdGF0aWMgdm9pZCBjcGFfY29sbGFwc2VfbGFyZ2VfcGFnZXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXFxuIFxcbiBcXHRpZiAoY3BhLVxcdTAwM2VmbGFncyBcXHUwMDI2IChDUEFfUEFHRVNfQVJSQVkgfCBDUEFfQVJSQVkpKSB7XFxuIFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjcGEtXFx1MDAzZW51bXBhZ2VzOyBpKyspXFxuLVxcdFxcdFxcdGNvbGxhcHNlZCArPSBjb2xsYXBzZV9sYXJnZV9wYWdlcyhfX2NwYV9hZGRyKGNwYSwgaSksXFxuK1xcdFxcdFxcdGNvbGxhcHNlZCArPSBjb2xsYXBzZV9sYXJnZV9wYWdlcyhjcGFfYWRkcihjcGEsIGkpLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIFxcdTAwMjZwZ3RhYmxlcyk7XFxuIFxcdH0gZWxzZSB7XFxuLVxcdFxcdGFkZHIgPSBfX2NwYV9hZGRyKGNwYSwgMCk7XFxuK1xcdFxcdGFkZHIgPSBjcGFfYWRkcihjcGEsIDApO1xcbiBcXHRcXHRzdGFydCA9IGFkZHIgXFx1MDAyNiBQTURfTUFTSztcXG4gXFx0XFx0ZW5kID0gYWRkciArIFBBR0VfU0laRSAqIGNwYS1cXHUwMDNlbnVtcGFnZXM7XFxuIFxcbkBAIC00NjMsNyArMzYyLDcgQEAgc3RhdGljIHZvaWQgY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgY2FjaGUpXFxuIFxcbiBcXHRtYigpO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY3BhLVxcdTAwM2VudW1wYWdlczsgaSsrKSB7XFxuLVxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciA9IF9fY3BhX2FkZHIoY3BhLCBpKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyID0gY3BhX2FkZHIoY3BhLCBpKTtcXG4gXFx0XFx0dW5zaWduZWQgaW50IGxldmVsO1xcbiBcXG4gXFx0XFx0cHRlX3QgKnB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsIFxcdTAwMjZsZXZlbCk7XFxuQEAgLTU3OCw3ICs0NzcsNyBAQCBzdGF0aWMgcGdwcm90dmFsX3QgcHJvdGVjdF9rZXJuZWxfdGV4dF9ybyh1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbiBcXHQgKiBzbyB0aGUgcHJvdGVjdGlvbnMgZm9yIGtlcm5lbCB0ZXh0IGFuZCBpZGVudGl0eSBtYXBwaW5ncyBoYXZlIHRvXFxuIFxcdCAqIGJlIHRoZSBzYW1lLlxcbiBcXHQgKi9cXG4tXFx0aWYgKGxvb2t1cF9hZGRyZXNzKHN0YXJ0LCBcXHUwMDI2bGV2ZWwpIFxcdTAwMjZcXHUwMDI2IChsZXZlbCAhPSBQR19MRVZFTF80SykpXFxuK1xcdGlmIChsb29rdXBfYWRkcmVzcyhzdGFydCwgXFx1MDAyNmxldmVsKSBcXHUwMDI2XFx1MDAyNiAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpKVxcbiBcXHRcXHRyZXR1cm4gX1BBR0VfUlc7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTcwOSwxMDQgKzYwOCw2IEBAIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgdmVyaWZ5X3J3eChwZ3Byb3RfdCBvbGQsIHBncHJvdF90IG5ldywgdW5zaWduZWQgbG9uZyBzdGFyXFxuIFxcdHJldHVybiBuZXc7XFxuIH1cXG4gXFxuLS8qXFxuLSAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuXFxuLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IChvciBOVUxMIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCksXFxuLSAqIHRoZSBsZXZlbCBvZiB0aGUgZW50cnksIGFuZCB0aGUgZWZmZWN0aXZlIE5YIGFuZCBSVyBiaXRzIG9mIGFsbFxcbi0gKiBwYWdlIHRhYmxlIGxldmVscy5cXG4tICovXFxuLXB0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdCAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KVxcbi17XFxuLVxcdHA0ZF90ICpwNGQ7XFxuLVxcdHB1ZF90ICpwdWQ7XFxuLVxcdHBtZF90ICpwbWQ7XFxuLVxcbi1cXHQqbGV2ZWwgPSBQR19MRVZFTF8yNTZUO1xcbi1cXHQqbnggPSBmYWxzZTtcXG4tXFx0KnJ3ID0gdHJ1ZTtcXG4tXFxuLVxcdGlmIChwZ2Rfbm9uZSgqcGdkKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuLVxcbi1cXHQqbGV2ZWwgPSBQR19MRVZFTF81MTJHO1xcbi1cXHQqbnggfD0gcGdkX2ZsYWdzKCpwZ2QpIFxcdTAwMjYgX1BBR0VfTlg7XFxuLVxcdCpydyBcXHUwMDI2PSBwZ2RfZmxhZ3MoKnBnZCkgXFx1MDAyNiBfUEFHRV9SVztcXG4tXFxuLVxcdHA0ZCA9IHA0ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTtcXG4tXFx0aWYgKHA0ZF9ub25lKCpwNGQpKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFxuLVxcdGlmIChwNGRfbGVhZigqcDRkKSB8fCAhcDRkX3ByZXNlbnQoKnA0ZCkpXFxuLVxcdFxcdHJldHVybiAocHRlX3QgKilwNGQ7XFxuLVxcbi1cXHQqbGV2ZWwgPSBQR19MRVZFTF8xRztcXG4tXFx0Km54IHw9IHA0ZF9mbGFncygqcDRkKSBcXHUwMDI2IF9QQUdFX05YO1xcbi1cXHQqcncgXFx1MDAyNj0gcDRkX2ZsYWdzKCpwNGQpIFxcdTAwMjYgX1BBR0VfUlc7XFxuLVxcbi1cXHRwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcmVzcyk7XFxuLVxcdGlmIChwdWRfbm9uZSgqcHVkKSlcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuLVxcbi1cXHRpZiAocHVkX2xlYWYoKnB1ZCkgfHwgIXB1ZF9wcmVzZW50KCpwdWQpKVxcbi1cXHRcXHRyZXR1cm4gKHB0ZV90ICopcHVkO1xcbi1cXG4tXFx0KmxldmVsID0gUEdfTEVWRUxfMk07XFxuLVxcdCpueCB8PSBwdWRfZmxhZ3MoKnB1ZCkgXFx1MDAyNiBfUEFHRV9OWDtcXG4tXFx0KnJ3IFxcdTAwMjY9IHB1ZF9mbGFncygqcHVkKSBcXHUwMDI2IF9QQUdFX1JXO1xcbi1cXG4tXFx0cG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpO1xcbi1cXHRpZiAocG1kX25vbmUoKnBtZCkpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXG4tXFx0aWYgKHBtZF9sZWFmKCpwbWQpIHx8ICFwbWRfcHJlc2VudCgqcG1kKSlcXG4tXFx0XFx0cmV0dXJuIChwdGVfdCAqKXBtZDtcXG4tXFxuLVxcdCpsZXZlbCA9IFBHX0xFVkVMXzRLO1xcbi1cXHQqbnggfD0gcG1kX2ZsYWdzKCpwbWQpIFxcdTAwMjYgX1BBR0VfTlg7XFxuLVxcdCpydyBcXHUwMDI2PSBwbWRfZmxhZ3MoKnBtZCkgXFx1MDAyNiBfUEFHRV9SVztcXG4tXFxuLVxcdHJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpO1xcbi19XFxuLVxcbi0vKlxcbi0gKiBMb29rdXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgc3BlY2lmaWMgcGdkLlxcbi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLlxcbi0gKi9cXG4tcHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuLVxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50ICpsZXZlbClcXG4te1xcbi1cXHRib29sIG54LCBydztcXG4tXFxuLVxcdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2QsIGFkZHJlc3MsIGxldmVsLCBcXHUwMDI2bngsIFxcdTAwMjZydyk7XFxuLX1cXG4tXFxuLS8qXFxuLSAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MuIFJldHVybiBhIHBvaW50ZXJcXG4tICogdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuXFxuLSAqXFxuLSAqIE5vdGU6IHRoZSBmdW5jdGlvbiByZXR1cm5zIHA0ZCwgcHVkIG9yIHBtZCBlaXRoZXIgd2hlbiB0aGUgZW50cnkgaXMgbWFya2VkXFxuLSAqIGxhcmdlIG9yIHdoZW4gdGhlIHByZXNlbnQgYml0IGlzIG5vdCBzZXQuIE90aGVyd2lzZSBpdCByZXR1cm5zIE5VTEwuXFxuLSAqL1xcbi1wdGVfdCAqbG9va3VwX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgKmxldmVsKVxcbi17XFxuLVxcdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX29mZnNldF9rKGFkZHJlc3MpLCBhZGRyZXNzLCBsZXZlbCk7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTF9HUEwobG9va3VwX2FkZHJlc3MpO1xcbi1cXG4tc3RhdGljIHB0ZV90ICpfbG9va3VwX2FkZHJlc3NfY3BhKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdCAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KVxcbi17XFxuLVxcdHBnZF90ICpwZ2Q7XFxuLVxcbi1cXHRpZiAoIWNwYS1cXHUwMDNlcGdkKVxcbi1cXHRcXHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cGdkID0gY3BhLVxcdTAwM2VwZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcyk7XFxuLVxcbi1cXHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgbngsIHJ3KTtcXG4tfVxcbi1cXG4gLypcXG4gICogTG9va3VwIHRoZSBQTUQgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzLiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeVxcbiAgKiBvciBOVUxMIGlmIG5vdCBwcmVzZW50LlxcbkBAIC04NTAsOSArNjUxLDkgQEAgcG1kX3QgKmxvb2t1cF9wbWRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpXFxuIHBoeXNfYWRkcl90IHNsb3dfdmlydF90b19waHlzKHZvaWQgKl9fdmlydF9hZGRyKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX192aXJ0X2FkZHI7XFxuK1xcdGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbDtcXG4gXFx0cGh5c19hZGRyX3QgcGh5c19hZGRyO1xcbiBcXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcXG4tXFx0ZW51bSBwZ19sZXZlbCBsZXZlbDtcXG4gXFx0cHRlX3QgKnB0ZTtcXG4gXFxuIFxcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKHZpcnRfYWRkciwgXFx1MDAyNmxldmVsKTtcXG5AQCAtODY0LDExICs2NjUsMTEgQEAgcGh5c19hZGRyX3Qgc2xvd192aXJ0X3RvX3BoeXModm9pZCAqX192aXJ0X2FkZHIpXFxuIFxcdCAqIG1ha2UgMzItUEFFIGtlcm5lbCB3b3JrIGNvcnJlY3RseS5cXG4gXFx0ICovXFxuIFxcdHN3aXRjaCAobGV2ZWwpIHtcXG4tXFx0Y2FzZSBQR19MRVZFTF8xRzpcXG4rXFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcXG4gXFx0XFx0cGh5c19hZGRyID0gKHBoeXNfYWRkcl90KXB1ZF9wZm4oKihwdWRfdCAqKXB0ZSkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gXFx0XFx0b2Zmc2V0ID0gdmlydF9hZGRyIFxcdTAwMjYgflBVRF9NQVNLO1xcbiBcXHRcXHRicmVhaztcXG4tXFx0Y2FzZSBQR19MRVZFTF8yTTpcXG4rXFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BNRDpcXG4gXFx0XFx0cGh5c19hZGRyID0gKHBoeXNfYWRkcl90KXBtZF9wZm4oKihwbWRfdCAqKXB0ZSkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gXFx0XFx0b2Zmc2V0ID0gdmlydF9hZGRyIFxcdTAwMjYgflBNRF9NQVNLO1xcbiBcXHRcXHRicmVhaztcXG5AQCAtOTI1LDMwICs3MjYsMjcgQEAgc3RhdGljIHBncHJvdF90IHBncHJvdF9jbGVhcl9wcm90bm9uZV9iaXRzKHBncHJvdF90IHByb3QpXFxuIFxcdHJldHVybiBwcm90O1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9fc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcXG4raW50IGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsXFxuK1xcdFxcdFxcdFxcdCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxcbiB7XFxuLVxcdHVuc2lnbmVkIGxvbmcgbnVtcGFnZXMsIHBtYXNrLCBwc2l6ZSwgbHBhZGRyLCBwZm4sIG9sZF9wZm47XFxuIFxcdHBncHJvdF90IG9sZF9wcm90LCBuZXdfcHJvdCwgcmVxX3Byb3QsIGNoa19wcm90O1xcbi1cXHRwdGVfdCBuZXdfcHRlLCAqdG1wO1xcbi1cXHRlbnVtIHBnX2xldmVsIGxldmVsO1xcbi1cXHRib29sIG54LCBydztcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2VcXG4tXFx0ICogdXAgYWxyZWFkeTpcXG4tXFx0ICovXFxuLVxcdHRtcCA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCBcXHUwMDI2bGV2ZWwsIFxcdTAwMjZueCwgXFx1MDAyNnJ3KTtcXG4tXFx0aWYgKHRtcCAhPSBrcHRlKVxcbi1cXHRcXHRyZXR1cm4gMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBudW1wYWdlcywgbHBhZGRyLCBwZm4sIG9sZF9wZm47XFxuK1xcdGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCA9IHNkLVxcdTAwM2VsZXZlbDtcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzID0gc2QtXFx1MDAzZWFkZHJlc3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBzZC1cXHUwMDNlcHNpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcG1hc2sgPSBzZC1cXHUwMDNlcG1hc2s7XFxuK1xcdHB0ZV90ICprcHRlID0gc2QtXFx1MDAzZWtwdGU7XFxuK1xcdGJvb2wgbnggPSBzZC1cXHUwMDNlbng7XFxuK1xcdGJvb2wgcncgPSBzZC1cXHUwMDNlcnc7XFxuK1xcdHB0ZV90IG5ld19wdGU7XFxuIFxcbiBcXHRzd2l0Y2ggKGxldmVsKSB7XFxuLVxcdGNhc2UgUEdfTEVWRUxfMk06XFxuK1xcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XFxuIFxcdFxcdG9sZF9wcm90ID0gcG1kX3BncHJvdCgqKHBtZF90ICopa3B0ZSk7XFxuIFxcdFxcdG9sZF9wZm4gPSBwbWRfcGZuKCoocG1kX3QgKilrcHRlKTtcXG4gXFx0XFx0Y3BhX2luY18ybV9jaGVja2VkKCk7XFxuIFxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIFBHX0xFVkVMXzFHOlxcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxcbiBcXHRcXHRvbGRfcHJvdCA9IHB1ZF9wZ3Byb3QoKihwdWRfdCAqKWtwdGUpO1xcbiBcXHRcXHRvbGRfcGZuID0gcHVkX3BmbigqKHB1ZF90ICopa3B0ZSk7XFxuIFxcdFxcdGNwYV9pbmNfMWdfY2hlY2tlZCgpO1xcbkBAIC05NTcsMTggKzc1NSw2IEBAIHN0YXRpYyBpbnQgX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0fVxcbiBcXG4tXFx0cHNpemUgPSBwYWdlX2xldmVsX3NpemUobGV2ZWwpO1xcbi1cXHRwbWFzayA9IHBhZ2VfbGV2ZWxfbWFzayhsZXZlbCk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggZml0IGludG8gdGhpcyBsYXJnZVxcbi1cXHQgKiBwYWdlIHN0YXJ0aW5nIGF0IGFkZHJlc3M6XFxuLVxcdCAqL1xcbi1cXHRscGFkZHIgPSAoYWRkcmVzcyArIHBzaXplKSBcXHUwMDI2IHBtYXNrO1xcbi1cXHRudW1wYWdlcyA9IChscGFkZHIgLSBhZGRyZXNzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbi1cXHRpZiAobnVtcGFnZXMgXFx1MDAzYyBjcGEtXFx1MDAzZW51bXBhZ2VzKVxcbi1cXHRcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gbnVtcGFnZXM7XFxuLVxcbiBcXHQvKlxcbiBcXHQgKiBXZSBhcmUgc2FmZSBub3cuIENoZWNrIHdoZXRoZXIgdGhlIG5ldyBwZ3Byb3QgaXMgdGhlIHNhbWU6XFxuIFxcdCAqIENvbnZlcnQgcHJvdGVjdGlvbiBhdHRyaWJ1dGVzIHRvIDRrLWZvcm1hdCwgYXMgY3BhLVxcdTAwM2VtYXNrKiBhcmUgc2V0XFxuQEAgLTEwNzIsMjEgKzg1OCw2IEBAIHN0YXRpYyBpbnQgX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi1cXHRcXHRcXHRcXHQgICBzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcXG4te1xcbi1cXHRpbnQgZG9fc3BsaXQ7XFxuLVxcbi1cXHRpZiAoY3BhLVxcdTAwM2Vmb3JjZV9zcGxpdClcXG4tXFx0XFx0cmV0dXJuIDE7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnBnZF9sb2NrKTtcXG4tXFx0ZG9fc3BsaXQgPSBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKGtwdGUsIGFkZHJlc3MsIGNwYSk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwZ2RfbG9jayk7XFxuLVxcbi1cXHRyZXR1cm4gZG9fc3BsaXQ7XFxuLX1cXG4tXFxuIHN0YXRpYyB2b2lkIHNwbGl0X3NldF9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXHRcXHRcXHQgIHBncHJvdF90IHJlZl9wcm90LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuIFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBzaXplKVxcbkBAIC0xMTIzLDMzICs4OTQsMjIgQEAgc3RhdGljIHZvaWQgc3BsaXRfc2V0X3B0ZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBwZm4sXFxuIFxcdHNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgcmVmX3Byb3QpKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludFxcbi1fX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuLVxcdFxcdCAgIHN0cnVjdCBwdGRlc2MgKnB0ZGVzYylcXG4raW50IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGxwYWRkciwgbHBpbmMsIHJlZl9wZm4sIHBmbiwgcGZuaW5jID0gMTtcXG4rXFx0c3RydWN0IHB0ZGVzYyAqcHRkZXNjID0gc2QtXFx1MDAzZXB0ZGVzYztcXG4gXFx0c3RydWN0IHBhZ2UgKmJhc2UgPSBwdGRlc2NfcGFnZShwdGRlc2MpO1xcbiBcXHRwdGVfdCAqcGJhc2UgPSAocHRlX3QgKilwYWdlX2FkZHJlc3MoYmFzZSk7XFxuLVxcdHVuc2lnbmVkIGludCBpLCBsZXZlbDtcXG4rXFx0ZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsID0gc2QtXFx1MDAzZWxldmVsO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzZC1cXHUwMDNlYWRkcmVzcztcXG4rXFx0cHRlX3QgKmtwdGUgPSBzZC1cXHUwMDNla3B0ZTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuIFxcdHBncHJvdF90IHJlZl9wcm90O1xcbi1cXHRib29sIG54LCBydztcXG4tXFx0cHRlX3QgKnRtcDtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2cGdkX2xvY2spO1xcbi1cXHQvKlxcbi1cXHQgKiBDaGVjayBmb3IgcmFjZXMsIGFub3RoZXIgQ1BVIG1pZ2h0IGhhdmUgc3BsaXQgdGhpcyBwYWdlXFxuLVxcdCAqIHVwIGZvciB1cyBhbHJlYWR5Olxcbi1cXHQgKi9cXG4tXFx0dG1wID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFxcdTAwMjZsZXZlbCwgXFx1MDAyNm54LCBcXHUwMDI2cncpO1xcbi1cXHRpZiAodG1wICE9IGtwdGUpIHtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnBnZF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIDE7XFxuLVxcdH1cXG4gXFxuIFxcdHBhcmF2aXJ0X2FsbG9jX3B0ZShcXHUwMDI2aW5pdF9tbSwgcGFnZV90b19wZm4oYmFzZSkpO1xcbiBcXG4gXFx0c3dpdGNoIChsZXZlbCkge1xcbi1cXHRjYXNlIFBHX0xFVkVMXzJNOlxcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxcbiBcXHRcXHRyZWZfcHJvdCA9IHBtZF9wZ3Byb3QoKihwbWRfdCAqKWtwdGUpO1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBDbGVhciBQU0UgKGFrYSBfUEFHRV9QQVQpIGFuZCBtb3ZlXFxuQEAgLTExNjEsNyArOTIxLDcgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiBcXHRcXHRscGluYyA9IFBBR0VfU0laRTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbi1cXHRjYXNlIFBHX0xFVkVMXzFHOlxcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxcbiBcXHRcXHRyZWZfcHJvdCA9IHB1ZF9wZ3Byb3QoKihwdWRfdCAqKWtwdGUpO1xcbiBcXHRcXHRyZWZfcGZuID0gcHVkX3BmbigqKHB1ZF90ICopa3B0ZSk7XFxuIFxcdFxcdHBmbmluYyA9IFBNRF9TSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuQEAgLTExNzcsNyArOTM3LDYgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGRlZmF1bHQ6XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwZ2RfbG9jayk7XFxuIFxcdFxcdHJldHVybiAxO1xcbiBcXHR9XFxuIFxcbkBAIC0xMjI1LDI2ICs5ODQsNiBAQCBfX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxuIFxcdCAqIGp1c3Qgc3BsaXQgbGFyZ2UgcGFnZSBlbnRyeS5cXG4gXFx0ICovXFxuIFxcdGZsdXNoX3RsYl9hbGwoKTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnBnZF9sb2NrKTtcXG4tXFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHNwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICprcHRlLFxcbi1cXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxcbi17XFxuLVxcdHN0cnVjdCBwdGRlc2MgKnB0ZGVzYztcXG4tXFxuLVxcdGlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSlcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmNwYV9sb2NrKTtcXG4tXFx0cHRkZXNjID0gcGFnZXRhYmxlX2FsbG9jKEdGUF9LRVJORUwsIDApO1xcbi1cXHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2Y3BhX2xvY2spO1xcbi1cXHRpZiAoIXB0ZGVzYylcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcbi1cXHRpZiAoX19zcGxpdF9sYXJnZV9wYWdlKGNwYSwga3B0ZSwgYWRkcmVzcywgcHRkZXNjKSlcXG4tXFx0XFx0cGFnZXRhYmxlX2ZyZWUocHRkZXNjKTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTEzMTQsNyArMTA1Myw3IEBAIHN0YXRpYyBpbnQgY29sbGFwc2VfcG1kX3BhZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbiBcXHR9XFxuIFxcbiBcXHRpZiAodmlydF9hZGRyX3ZhbGlkKGFkZHIpIFxcdTAwMjZcXHUwMDI2IHBmbl9yYW5nZV9pc19tYXBwZWQocGZuLCBwZm4gKyAxKSlcXG4tXFx0XFx0Y29sbGFwc2VfcGFnZV9jb3VudChQR19MRVZFTF8yTSk7XFxuK1xcdFxcdGNvbGxhcHNlX3BhZ2VfY291bnQoUEdUQUJMRV9MRVZFTF9QTUQpO1xcbiBcXG4gXFx0cmV0dXJuIDE7XFxuIH1cXG5AQCAtMTM2MSw3ICsxMTAwLDcgQEAgc3RhdGljIGludCBjb2xsYXBzZV9wdWRfcGFnZShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuIFxcdHNldF9wdWQocHVkLCBwZm5fcHVkKHBmbiwgcG1kX3BncHJvdChmaXJzdCkpKTtcXG4gXFxuIFxcdGlmICh2aXJ0X2FkZHJfdmFsaWQoYWRkcikgXFx1MDAyNlxcdTAwMjYgcGZuX3JhbmdlX2lzX21hcHBlZChwZm4sIHBmbiArIDEpKVxcbi1cXHRcXHRjb2xsYXBzZV9wYWdlX2NvdW50KFBHX0xFVkVMXzFHKTtcXG4rXFx0XFx0Y29sbGFwc2VfcGFnZV9jb3VudChQR1RBQkxFX0xFVkVMX1BVRCk7XFxuIFxcbiBcXHRyZXR1cm4gMTtcXG4gfVxcbkBAIC0xODAwLDggKzE1MzksOCBAQCBzdGF0aWMgaW50IHBvcHVsYXRlX3BnZChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxcbi1cXHRcXHRcXHQgICAgICAgaW50IHByaW1hcnkpXFxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxcbitcXHRcXHRcXHQgICBpbnQgcHJpbWFyeSlcXG4ge1xcbiBcXHRpZiAoY3BhLVxcdTAwM2VwZ2QpIHtcXG4gXFx0XFx0LypcXG5AQCAtMTgzMyw3ICsxNTcyLDcgQEAgc3RhdGljIGludCBfX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxcbiBcXHRcXHRjcGEtXFx1MDAzZXBmbiA9IF9fcGEodmFkZHIpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0fSBlbHNlIGlmIChfX2NwYV9wZm5faW5faGlnaG1hcChjcGEtXFx1MDAzZXBmbikpIHtcXG4rXFx0fSBlbHNlIGlmIChwZm5faXNfa2VybmVsKGNwYS1cXHUwMDNlcGZuKSkge1xcbiBcXHRcXHQvKiBGYXVsdHMgaW4gdGhlIGhpZ2htYXAgYXJlIE9LLCBzbyBkbyBub3Qgd2FybjogKi9cXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTE4NDUsOTAgKzE1ODQsNDUgQEAgc3RhdGljIGludCBfX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxcbiBcXHR9XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgX19jaGFuZ2VfcGFnZV9hdHRyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSlcXG4rdm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0ICAgICBwdGVfdCAqa3B0ZSwgcHRlX3Qgb2xkX3B0ZSwgYm9vbCBueCwgYm9vbCBydylcXG4ge1xcbi1cXHR1bnNpZ25lZCBsb25nIGFkZHJlc3M7XFxuLVxcdGludCBkb19zcGxpdCwgZXJyO1xcbi1cXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XFxuLVxcdHB0ZV90ICprcHRlLCBvbGRfcHRlO1xcbi1cXHRib29sIG54LCBydztcXG4tXFxuLVxcdGFkZHJlc3MgPSBfX2NwYV9hZGRyKGNwYSwgY3BhLVxcdTAwM2VjdXJwYWdlKTtcXG4tcmVwZWF0Olxcbi1cXHRrcHRlID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFxcdTAwMjZsZXZlbCwgXFx1MDAyNm54LCBcXHUwMDI2cncpO1xcbi1cXHRpZiAoIWtwdGUpXFxuLVxcdFxcdHJldHVybiBfX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XFxuK1xcdHB0ZV90IG5ld19wdGU7XFxuK1xcdHBncHJvdF90IG9sZF9wcm90ID0gcHRlX3BncHJvdChvbGRfcHRlKTtcXG4rXFx0cGdwcm90X3QgbmV3X3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XFxuIFxcbi1cXHRvbGRfcHRlID0gKmtwdGU7XFxuLVxcdGlmIChwdGVfbm9uZShvbGRfcHRlKSlcXG4tXFx0XFx0cmV0dXJuIF9fY3BhX3Byb2Nlc3NfZmF1bHQoY3BhLCBhZGRyZXNzLCBwcmltYXJ5KTtcXG4rXFx0cGdwcm90X3ZhbChuZXdfcHJvdCkgXFx1MDAyNj0gfnBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX2Nscik7XFxuK1xcdHBncHJvdF92YWwobmV3X3Byb3QpIHw9IHBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX3NldCk7XFxuIFxcbi1cXHRpZiAobGV2ZWwgPT0gUEdfTEVWRUxfNEspIHtcXG4tXFx0XFx0cHRlX3QgbmV3X3B0ZTtcXG4tXFx0XFx0cGdwcm90X3Qgb2xkX3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpO1xcbi1cXHRcXHRwZ3Byb3RfdCBuZXdfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7XFxuLVxcdFxcdHVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihvbGRfcHRlKTtcXG4tXFxuLVxcdFxcdHBncHJvdF92YWwobmV3X3Byb3QpIFxcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19jbHIpO1xcbi1cXHRcXHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19zZXQpO1xcbi1cXG4tXFx0XFx0Y3BhX2luY180a19pbnN0YWxsKCk7XFxuLVxcdFxcdC8qIEhhbmQgaW4gbHBzaXplID0gMCB0byBlbmZvcmNlIHRoZSBwcm90ZWN0aW9uIG1lY2hhbmlzbSAqL1xcbi1cXHRcXHRuZXdfcHJvdCA9IHN0YXRpY19wcm90ZWN0aW9ucyhuZXdfcHJvdCwgYWRkcmVzcywgcGZuLCAxLCAwLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgICBDUEFfUFJPVEVDVCk7XFxuLVxcbi1cXHRcXHRuZXdfcHJvdCA9IHZlcmlmeV9yd3gob2xkX3Byb3QsIG5ld19wcm90LCBhZGRyZXNzLCBwZm4sIDEsXFxuLVxcdFxcdFxcdFxcdCAgICAgIG54LCBydyk7XFxuK1xcdGNwYV9pbmNfNGtfaW5zdGFsbCgpO1xcbitcXHQvKiBIYW5kIGluIGxwc2l6ZSA9IDAgdG8gZW5mb3JjZSB0aGUgcHJvdGVjdGlvbiBtZWNoYW5pc20gKi9cXG4rXFx0bmV3X3Byb3QgPSBzdGF0aWNfcHJvdGVjdGlvbnMobmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgMCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgQ1BBX1BST1RFQ1QpO1xcbiBcXG4tXFx0XFx0bmV3X3Byb3QgPSBwZ3Byb3RfY2xlYXJfcHJvdG5vbmVfYml0cyhuZXdfcHJvdCk7XFxuK1xcdG5ld19wcm90ID0gdmVyaWZ5X3J3eChvbGRfcHJvdCwgbmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgbngsIHJ3KTtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIG5lZWQgdG8ga2VlcCB0aGUgcGZuIGZyb20gdGhlIGV4aXN0aW5nIFBURSxcXG4tXFx0XFx0ICogYWZ0ZXIgYWxsIHdlJ3JlIG9ubHkgZ29pbmcgdG8gY2hhbmdlIGl0cyBhdHRyaWJ1dGVzXFxuLVxcdFxcdCAqIG5vdCB0aGUgbWVtb3J5IGl0IHBvaW50cyB0b1xcbi1cXHRcXHQgKi9cXG4tXFx0XFx0bmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7XFxuLVxcdFxcdGNwYS1cXHUwMDNlcGZuID0gcGZuO1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBEbyB3ZSByZWFsbHkgY2hhbmdlIGFueXRoaW5nID9cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcXG4tXFx0XFx0XFx0c2V0X3B0ZV9hdG9taWMoa3B0ZSwgbmV3X3B0ZSk7XFxuLVxcdFxcdFxcdGNwYS1cXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGNwYS1cXHUwMDNlbnVtcGFnZXMgPSAxO1xcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFx0fVxcbitcXHRuZXdfcHJvdCA9IHBncHJvdF9jbGVhcl9wcm90bm9uZV9iaXRzKG5ld19wcm90KTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIENoZWNrLCB3aGV0aGVyIHdlIGNhbiBrZWVwIHRoZSBsYXJnZSBwYWdlIGludGFjdFxcbi1cXHQgKiBhbmQganVzdCBjaGFuZ2UgdGhlIHB0ZTpcXG4tXFx0ICovXFxuLVxcdGRvX3NwbGl0ID0gc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2Uoa3B0ZSwgYWRkcmVzcywgY3BhKTtcXG4tXFx0LypcXG4tXFx0ICogV2hlbiB0aGUgcmFuZ2UgZml0cyBpbnRvIHRoZSBleGlzdGluZyBsYXJnZSBwYWdlLFxcbi1cXHQgKiByZXR1cm4uIGNwLVxcdTAwM2VudW1wYWdlcyBhbmQgY3BhLVxcdTAwM2V0bGJmbHVzaCBoYXZlIGJlZW4gdXBkYXRlZCBpblxcbi1cXHQgKiB0cnlfbGFyZ2VfcGFnZTpcXG4rXFx0ICogV2UgbmVlZCB0byBrZWVwIHRoZSBwZm4gZnJvbSB0aGUgZXhpc3RpbmcgUFRFLCBhZnRlciBhbGwgd2UncmUgb25seVxcbitcXHQgKiBnb2luZyB0byBjaGFuZ2UgaXRzIGF0dHJpYnV0ZXMgbm90IHRoZSBtZW1vcnkgaXQgcG9pbnRzIHRvXFxuIFxcdCAqL1xcbi1cXHRpZiAoZG9fc3BsaXQgXFx1MDAzYz0gMClcXG4tXFx0XFx0cmV0dXJuIGRvX3NwbGl0O1xcbi1cXG4rXFx0bmV3X3B0ZSA9IHBmbl9wdGUocGZuLCBuZXdfcHJvdCk7XFxuK1xcdGNwYS1cXHUwMDNlcGZuID0gcGZuO1xcbiBcXHQvKlxcbi1cXHQgKiBXZSBoYXZlIHRvIHNwbGl0IHRoZSBsYXJnZSBwYWdlOlxcbitcXHQgKiBEbyB3ZSByZWFsbHkgY2hhbmdlIGFueXRoaW5nID9cXG4gXFx0ICovXFxuLVxcdGVyciA9IHNwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzKTtcXG4tXFx0aWYgKCFlcnIpXFxuLVxcdFxcdGdvdG8gcmVwZWF0O1xcbi1cXG4tXFx0cmV0dXJuIGVycjtcXG4rXFx0aWYgKHB0ZV92YWwob2xkX3B0ZSkgIT0gcHRlX3ZhbChuZXdfcHRlKSkge1xcbitcXHRcXHRzZXRfcHRlX2F0b21pYyhrcHRlLCBuZXdfcHRlKTtcXG4rXFx0XFx0Y3BhLVxcdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XFxuK1xcdH1cXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpO1xcbi1cXG4gLypcXG4gICogQ2hlY2sgdGhlIGRpcmVjdG1hcCBhbmQgXFxcImhpZ2gga2VybmVsIG1hcFxcXCIgJ2FsaWFzZXMnLlxcbiAgKi9cXG4tc3RhdGljIGludCBjcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXFxuIHtcXG4gXFx0c3RydWN0IGNwYV9kYXRhIGFsaWFzX2NwYTtcXG4gXFx0dW5zaWduZWQgbG9uZyBsYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmEoY3BhLVxcdTAwM2VwZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCk7XFxuQEAgLTE5NDIsNyArMTYzNiw3IEBAIHN0YXRpYyBpbnQgY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXFxuIFxcdCAqIE5vIG5lZWQgdG8gcmVkbywgd2hlbiB0aGUgcHJpbWFyeSBjYWxsIHRvdWNoZWQgdGhlIGRpcmVjdFxcbiBcXHQgKiBtYXBwaW5nIGFscmVhZHk6XFxuIFxcdCAqL1xcbi1cXHR2YWRkciA9IF9fY3BhX2FkZHIoY3BhLCBjcGEtXFx1MDAzZWN1cnBhZ2UpO1xcbitcXHR2YWRkciA9IGNwYV9hZGRyKGNwYSwgY3BhLVxcdTAwM2VjdXJwYWdlKTtcXG4gXFx0aWYgKCEod2l0aGluKHZhZGRyLCBQQUdFX09GRlNFVCxcXG4gXFx0XFx0ICAgIFBBR0VfT0ZGU0VUICsgKG1heF9wZm5fbWFwcGVkIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpKSkpIHtcXG4gXFxuQEAgLTE5NzEsNyArMTY2NSw3IEBAIHN0YXRpYyBpbnQgY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXFxuIFxcdCAqIHRvIHRvdWNoIHRoZSBoaWdoIG1hcHBlZCBrZXJuZWwgYXMgd2VsbDpcXG4gXFx0ICovXFxuIFxcdGlmICghd2l0aGluKHZhZGRyLCAodW5zaWduZWQgbG9uZylfdGV4dCwgX2Jya19lbmQpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICBfX2NwYV9wZm5faW5faGlnaG1hcChjcGEtXFx1MDAzZXBmbikpIHtcXG4rXFx0ICAgIHBmbl9pc19rZXJuZWwoY3BhLVxcdTAwM2VwZm4pKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgdGVtcF9jcGFfdmFkZHIgPSAoY3BhLVxcdTAwM2VwZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkgK1xcbiBcXHRcXHRcXHRcXHRcXHQgICAgICAgX19TVEFSVF9LRVJORUxfbWFwIC0gcGh5c19iYXNlO1xcbiBcXHRcXHRhbGlhc19jcGEgPSAqY3BhO1xcbkBAIC0yMDAwLDE2OCArMTY5NCwyNSBAQCBzdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpXFxuLXtcXG4tXFx0dW5zaWduZWQgbG9uZyBudW1wYWdlcyA9IGNwYS1cXHUwMDNlbnVtcGFnZXM7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcmVtcGFnZXMgPSBudW1wYWdlcztcXG4tXFx0aW50IHJldCA9IDA7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBObyBjaGFuZ2VzLCBlYXN5IVxcbi1cXHQgKi9cXG4tXFx0aWYgKCEocGdwcm90X3ZhbChjcGEtXFx1MDAzZW1hc2tfc2V0KSB8IHBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX2NscikpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICAhY3BhLVxcdTAwM2Vmb3JjZV9zcGxpdClcXG4tXFx0XFx0cmV0dXJuIHJldDtcXG4tXFxuLVxcdHdoaWxlIChyZW1wYWdlcykge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBTdG9yZSB0aGUgcmVtYWluaW5nIG5yIG9mIHBhZ2VzIGZvciB0aGUgbGFyZ2UgcGFnZVxcbi1cXHRcXHQgKiBwcmVzZXJ2YXRpb24gY2hlY2suXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gcmVtcGFnZXM7XFxuLVxcdFxcdC8qIGZvciBhcnJheSBjaGFuZ2VzLCB3ZSBjYW4ndCB1c2UgbGFyZ2UgcGFnZSAqL1xcbi1cXHRcXHRpZiAoY3BhLVxcdTAwM2VmbGFncyBcXHUwMDI2IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKVxcbi1cXHRcXHRcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gMTtcXG4tXFxuLVxcdFxcdGlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSlcXG4tXFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZjcGFfbG9jayk7XFxuLVxcdFxcdHJldCA9IF9fY2hhbmdlX3BhZ2VfYXR0cihjcGEsIHByaW1hcnkpO1xcbi1cXHRcXHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZjcGFfbG9jayk7XFxuLVxcdFxcdGlmIChyZXQpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXG4tXFx0XFx0aWYgKHByaW1hcnkgXFx1MDAyNlxcdTAwMjYgIShjcGEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQ1BBX05PX0NIRUNLX0FMSUFTKSkge1xcbi1cXHRcXHRcXHRyZXQgPSBjcGFfcHJvY2Vzc19hbGlhcyhjcGEpO1xcbi1cXHRcXHRcXHRpZiAocmV0KVxcbi1cXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogQWRqdXN0IHRoZSBudW1iZXIgb2YgcGFnZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxcbi1cXHRcXHQgKiBDUEEgb3BlcmF0aW9uLiBFaXRoZXIgYSBsYXJnZSBwYWdlIGhhcyBiZWVuXFxuLVxcdFxcdCAqIHByZXNlcnZlZCBvciBhIHNpbmdsZSBwYWdlIHVwZGF0ZSBoYXBwZW5lZC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdEJVR19PTihjcGEtXFx1MDAzZW51bXBhZ2VzIFxcdTAwM2UgcmVtcGFnZXMgfHwgIWNwYS1cXHUwMDNlbnVtcGFnZXMpO1xcbi1cXHRcXHRyZW1wYWdlcyAtPSBjcGEtXFx1MDAzZW51bXBhZ2VzO1xcbi1cXHRcXHRjcGEtXFx1MDAzZWN1cnBhZ2UgKz0gY3BhLVxcdTAwM2VudW1wYWdlcztcXG4tXFx0fVxcbi1cXG4tb3V0Olxcbi1cXHQvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBudW1wYWdlcyAqL1xcbi1cXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gbnVtcGFnZXM7XFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcXG4tXFx0XFx0XFx0XFx0ICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NscixcXG4tXFx0XFx0XFx0XFx0ICAgIGludCBmb3JjZV9zcGxpdCwgaW50IGluX2ZsYWcsXFxuLVxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxcbit2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKVxcbiB7XFxuLVxcdHN0cnVjdCBjcGFfZGF0YSBjcGE7XFxuLVxcdGludCByZXQsIGNhY2hlO1xcbi1cXG4tXFx0bWVtc2V0KFxcdTAwMjZjcGEsIDAsIHNpemVvZihjcGEpKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIENoZWNrLCBpZiB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNldCBhIG5vdCBzdXBwb3J0ZWRcXG4tXFx0ICogZmVhdHVyZS4gIENsZWFyaW5nIG5vbi1zdXBwb3J0ZWQgZmVhdHVyZXMgaXMgT0suXFxuLVxcdCAqL1xcbi1cXHRtYXNrX3NldCA9IGNhbm9uX3BncHJvdChtYXNrX3NldCk7XFxuLVxcbi1cXHRpZiAoIXBncHJvdF92YWwobWFza19zZXQpIFxcdTAwMjZcXHUwMDI2ICFwZ3Byb3RfdmFsKG1hc2tfY2xyKSBcXHUwMDI2XFx1MDAyNiAhZm9yY2Vfc3BsaXQpXFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXG4tXFx0LyogRW5zdXJlIHdlIGFyZSBQQUdFX1NJWkUgYWxpZ25lZCAqL1xcbi1cXHRpZiAoaW5fZmxhZyBcXHUwMDI2IENQQV9BUlJBWSkge1xcbi1cXHRcXHRpbnQgaTtcXG4tXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG51bXBhZ2VzOyBpKyspIHtcXG4tXFx0XFx0XFx0aWYgKGFkZHJbaV0gXFx1MDAyNiB+UEFHRV9NQVNLKSB7XFxuLVxcdFxcdFxcdFxcdGFkZHJbaV0gXFx1MDAyNj0gUEFHRV9NQVNLO1xcbi1cXHRcXHRcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2UgaWYgKCEoaW5fZmxhZyBcXHUwMDI2IENQQV9QQUdFU19BUlJBWSkpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogaW5fZmxhZyBvZiBDUEFfUEFHRVNfQVJSQVkgaW1wbGllcyBpdCBpcyBhbGlnbmVkLlxcbi1cXHRcXHQgKiBObyBuZWVkIHRvIGNoZWNrIGluIHRoYXQgY2FzZVxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCphZGRyIFxcdTAwMjYgflBBR0VfTUFTSykge1xcbi1cXHRcXHRcXHQqYWRkciBcXHUwMDI2PSBQQUdFX01BU0s7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFBlb3BsZSBzaG91bGQgbm90IGJlIHBhc3NpbmcgaW4gdW5hbGlnbmVkIGFkZHJlc3NlczpcXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcbi1cXHQvKiBNdXN0IGF2b2lkIGFsaWFzaW5nIG1hcHBpbmdzIGluIHRoZSBoaWdobWVtIGNvZGUgKi9cXG4tXFx0a21hcF9mbHVzaF91bnVzZWQoKTtcXG4tXFxuLVxcdHZtX3VubWFwX2FsaWFzZXMoKTtcXG4tXFxuLVxcdGNwYS52YWRkciA9IGFkZHI7XFxuLVxcdGNwYS5wYWdlcyA9IHBhZ2VzO1xcbi1cXHRjcGEubnVtcGFnZXMgPSBudW1wYWdlcztcXG4tXFx0Y3BhLm1hc2tfc2V0ID0gbWFza19zZXQ7XFxuLVxcdGNwYS5tYXNrX2NsciA9IG1hc2tfY2xyO1xcbi1cXHRjcGEuZmxhZ3MgPSBpbl9mbGFnO1xcbi1cXHRjcGEuY3VycGFnZSA9IDA7XFxuLVxcdGNwYS5mb3JjZV9zcGxpdCA9IGZvcmNlX3NwbGl0O1xcbi1cXG4tXFx0cmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXFx1MDAyNmNwYSwgMSk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzpcXG4tXFx0ICovXFxuLVxcdGlmICghKGNwYS5mbGFncyBcXHUwMDI2IENQQV9GTFVTSFRMQikpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbitcXHRpbnQgY2FjaGU7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBObyBuZWVkIHRvIGZsdXNoLCB3aGVuIHdlIGRpZCBub3Qgc2V0IGFueSBvZiB0aGUgY2FjaGluZ1xcbiBcXHQgKiBhdHRyaWJ1dGVzOlxcbiBcXHQgKi9cXG4tXFx0Y2FjaGUgPSAhIXBncHJvdDJjYWNoZW1vZGUobWFza19zZXQpO1xcbitcXHRjYWNoZSA9ICEhcGdwcm90MmNhY2hlbW9kZShjcGEtXFx1MDAzZW1hc2tfc2V0KTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIE9uIGVycm9yOyBmbHVzaCBldmVyeXRoaW5nIHRvIGJlIHN1cmUuXFxuIFxcdCAqL1xcbi1cXHRpZiAocmV0KSB7XFxuK1xcdGlmIChlcnIpIHtcXG4gXFx0XFx0Y3BhX2ZsdXNoX2FsbChjYWNoZSk7XFxuLVxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRyZXR1cm47XFxuIFxcdH1cXG4gXFxuLVxcdGNwYV9mbHVzaChcXHUwMDI2Y3BhLCBjYWNoZSk7XFxuLW91dDpcXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXQodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxcbi17XFxuLVxcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxcbi1cXHRcXHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50IGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbi1cXHRcXHRcXHRcXHRcXHQgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxcbi17XFxuLVxcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBtYXNrLCAwLFxcbi1cXHRcXHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50IGNwYV9zZXRfcGFnZXNfYXJyYXkoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgcGdwcm90X3QgbWFzaylcXG4te1xcbi1cXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCxcXG4tXFx0XFx0Q1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50IGNwYV9jbGVhcl9wYWdlc19hcnJheShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsXFxuLVxcdFxcdFxcdFxcdFxcdCBwZ3Byb3RfdCBtYXNrKVxcbi17XFxuLVxcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBtYXNrLCAwLFxcbi1cXHRcXHRDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTtcXG4rXFx0Y3BhX2ZsdXNoKGNwYSwgY2FjaGUpO1xcbiB9XFxuIFxcbiBpbnQgX3NldF9tZW1vcnlfdWModW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXFxuQEAgLTI3NzMsMTEgKzIzMjQsMyBAQCBpbnQgX19pbml0IGtlcm5lbF91bm1hcF9wYWdlc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiBcXG4gXFx0cmV0dXJuIHJldHZhbDtcXG4gfVxcbi1cXG4tLypcXG4tICogVGhlIHRlc3RjYXNlcyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZG4ndFxcbi0gKiBiZSBleHBvc2VkIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwuIEluY2x1ZGUgdGhlc2UgZGlyZWN0bHkgaGVyZS5cXG4tICovXFxuLSNpZmRlZiBDT05GSUdfQ1BBX0RFQlVHXFxuLSNpbmNsdWRlIFxcXCJjcGEtdGVzdC5jXFxcIlxcbi0jZW5kaWZcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmggYi9pbmNsdWRlL2xpbnV4L3BndGFibGUuaFxcbmluZGV4IDI5ODFlMzg2ZGE3YjNjLi5kMWRmODM0NTg1MmJlOCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oXFxuQEAgLTE3ODIsNiArMTc4MiwxMCBAQCB2b2lkIGFyY2hfc3luY19rZXJuZWxfbWFwcGluZ3ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpO1xcbiAgKiBiZWNhdXNlIHRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCBldmVuIGlmIENPTkZJR19NTVUgaXMgbm90IGRlZmluZWQuXFxuICAqL1xcbiBcXG4rI2lmbmRlZiBjYW5vbl9wZ3Byb3RcXG4rI2RlZmluZSBjYW5vbl9wZ3Byb3QocHJvdClcXHQocHJvdClcXG4rI2VuZGlmXFxuK1xcbiAjaWZuZGVmIHBncHJvdF9ueFxcbiAjZGVmaW5lIHBncHJvdF9ueChwcm90KVxcdChwcm90KVxcbiAjZW5kaWZcXG5AQCAtMjEwNSw2ICsyMTA5LDQ2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXFxuIH1cXG4gI2VuZGlmIC8qIHB1ZF93cml0ZSAqL1xcbiBcXG4rI2lmbmRlZiBwNGRfd3JpdGVcXG4rc3RhdGljIGlubGluZSBpbnQgcDRkX3dyaXRlKHA0ZF90IHA0ZClcXG4re1xcbitcXHRCVUcoKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rI2VuZGlmIC8qIHA0ZF93cml0ZSAqL1xcbitcXG4rI2lmbmRlZiBwbWRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXFxuK3tcXG4rXFx0QlVHKCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZiAvKiBwbWRfZXhlYyAqL1xcbitcXG4rI2lmbmRlZiBwdWRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwdWRfZXhlYyhwdWRfdCBwdWQpXFxuK3tcXG4rXFx0QlVHKCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZiAvKiBwdWRfZXhlYyAqL1xcbitcXG4rI2lmbmRlZiBwNGRfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXFxuK3tcXG4rXFx0QlVHKCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZiAvKiBwNGRfZXhlYyAqL1xcbitcXG4rI2lmbmRlZiBwZ2RfZXhlY1xcbitzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXFxuK3tcXG4rXFx0QlVHKCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZiAvKiBwZ2RfZXhlYyAqL1xcbitcXG4gI2lmICFkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgfHwgXFxcXFxcbiBcXHQhZGVmaW5lZChDT05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRClcXG4gc3RhdGljIGlubGluZSBpbnQgcHVkX3RyYW5zX2h1Z2UocHVkX3QgcHVkKVxcbkBAIC0yMjk1LDE2ICsyMzM5LDIwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBhcmNoX2hhc19wZm5fbW9kaWZ5X2NoZWNrKHZvaWQpXFxuIHR5cGVkZWYgdW5zaWduZWQgaW50IHBndGJsX21vZF9tYXNrO1xcbiBcXG4gZW51bSBwZ3RhYmxlX2xldmVsIHtcXG4tXFx0UEdUQUJMRV9MRVZFTF9QVEUgPSAwLFxcbitcXHRQR1RBQkxFX0xFVkVMX05PTkUgPSAwLFxcbitcXHRQR1RBQkxFX0xFVkVMX1BURSxcXG4gXFx0UEdUQUJMRV9MRVZFTF9QTUQsXFxuIFxcdFBHVEFCTEVfTEVWRUxfUFVELFxcbiBcXHRQR1RBQkxFX0xFVkVMX1A0RCxcXG4gXFx0UEdUQUJMRV9MRVZFTF9QR0QsXFxuK1xcdFBHVEFCTEVfTEVWRUxfTlVNLFxcbiB9O1xcbiBcXG4gc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwZ3RhYmxlX2xldmVsX3RvX3N0cihlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuIHtcXG4gXFx0c3dpdGNoIChsZXZlbCkge1xcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfTk9ORTpcXG4rXFx0XFx0cmV0dXJuIFxcXCJub25lXFxcIjtcXG4gXFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BURTpcXG4gXFx0XFx0cmV0dXJuIFxcXCJwdGVcXFwiO1xcbiBcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxcbkBAIC0yMzIwLDYgKzIzNjgsMjggQEAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwZ3RhYmxlX2xldmVsX3RvX3N0cihlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLyogU2l6ZSBvZiB0aGUgbWVtb3J5IG1hcHBlZCBieSBhIHNpbmdsZSBsZWFmIGVudHJ5IGF0IEBsZXZlbCAqL1xcbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGd0YWJsZV9sZXZlbF9zaXplKGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbClcXG4re1xcbitcXHRzd2l0Y2ggKGxldmVsKSB7XFxuK1xcdGNhc2UgUEdUQUJMRV9MRVZFTF9QVEU6XFxuK1xcdFxcdHJldHVybiBQQUdFX1NJWkU7XFxuK1xcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XFxuK1xcdFxcdHJldHVybiBQTURfU0laRTtcXG4rXFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcXG4rXFx0XFx0cmV0dXJuIFBVRF9TSVpFO1xcbitcXHRjYXNlIFBHVEFCTEVfTEVWRUxfUDREOlxcbitcXHRcXHRyZXR1cm4gUDREX1NJWkU7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBQR0RJUl9TSVpFO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ3RhYmxlX2xldmVsX21hc2soZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsKVxcbit7XFxuK1xcdHJldHVybiB+KHBndGFibGVfbGV2ZWxfc2l6ZShsZXZlbCkgLSAxKTtcXG4rfVxcbitcXG4gI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi9cXG4gXFxuICNpZiAhZGVmaW5lZChNQVhfUE9TU0lCTEVfUEhZU01FTV9CSVRTKSBcXHUwMDI2XFx1MDAyNiAhZGVmaW5lZChDT05GSUdfNjRCSVQpXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oIGIvaW5jbHVkZS9saW51eC9zZXRfbWVtb3J5LmhcXG5pbmRleCAzMDMwZDkyNDVmNWFjOC4uMTdjYmU2ZTI2Y2I3MzIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9zZXRfbWVtb3J5LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NldF9tZW1vcnkuaFxcbkBAIC04NCw0ICs4NCwxMDEgQEAgc3RhdGljIGlubGluZSBpbnQgc2V0X21lbW9yeV9kZWNyeXB0ZWQodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXFxuIH1cXG4gI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19NRU1fRU5DUllQVCAqL1xcbiBcXG4rI2lmZGVmIENPTkZJR19HRU5FUklDX1NFVF9NRU1PUllcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wZ3RhYmxlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIENQQV9GTFVTSFRMQiAxXFxuKyNkZWZpbmUgQ1BBX0FSUkFZIDJcXG4rI2RlZmluZSBDUEFfUEFHRVNfQVJSQVkgNFxcbisjZGVmaW5lIENQQV9OT19DSEVDS19BTElBUyA4IC8qIERvIG5vdCBzZWFyY2ggZm9yIGFsaWFzZXMgKi9cXG4rI2RlZmluZSBDUEFfQ09MTEFQU0UgMTYgLyogdHJ5IHRvIGNvbGxhcHNlIGxhcmdlIHBhZ2VzICovXFxuK1xcbisvKlxcbisgKiBUaGUgY3VycmVudCBmbHVzaGluZyBjb250ZXh0IC0gd2UgcGFzcyBpdCBpbnN0ZWFkIG9mIDUgYXJndW1lbnRzOlxcbisgKi9cXG4rc3RydWN0IGNwYV9kYXRhIHtcXG4rXFx0dW5zaWduZWQgbG9uZ1xcdCp2YWRkcjtcXG4rXFx0cGdkX3RcXHRcXHQqcGdkO1xcbitcXHRwZ3Byb3RfdFxcdG1hc2tfc2V0O1xcbitcXHRwZ3Byb3RfdFxcdG1hc2tfY2xyO1xcbitcXHR1bnNpZ25lZCBsb25nXFx0bnVtcGFnZXM7XFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRjdXJwYWdlO1xcbitcXHR1bnNpZ25lZCBsb25nXFx0cGZuO1xcbitcXHR1bnNpZ25lZCBpbnRcXHRmbGFncztcXG4rXFx0dW5zaWduZWQgaW50XFx0Zm9yY2Vfc3BsaXRcXHRcXHQ6IDEsXFxuK1xcdFxcdFxcdGZvcmNlX3N0YXRpY19wcm90XFx0OiAxLFxcbitcXHRcXHRcXHRmb3JjZV9mbHVzaF9hbGxcXHRcXHQ6IDE7XFxuK1xcdHN0cnVjdCBwYWdlXFx0KipwYWdlcztcXG4rfTtcXG4rXFxuKy8qXFxuKyAqIGNvbnRleHQgZm9yIGNoZWNraW5nIGZvciBhIHNwbGl0IGEgbGFyZ2UgcGFnZSBhbmQgc3BsaXR0aW5nIGl0IGlmIHJlcXVpcmVkLlxcbisgKi9cXG4rc3RydWN0IHB0ZGVzYztcXG4rc3RydWN0IGNwYV9zcGxpdF9kYXRhIHtcXG4rXFx0dW5zaWduZWQgbG9uZ1xcdGFkZHJlc3M7XFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRwc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZ1xcdHBtYXNrO1xcbitcXHRwdGVfdFxcdFxcdCprcHRlO1xcbitcXHRzdHJ1Y3QgcHRkZXNjXFx0KnB0ZGVzYztcXG4rXFx0ZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsO1xcbitcXHRib29sXFx0XFx0bng7XFxuK1xcdGJvb2xcXHRcXHRydztcXG4rfTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgY3BhX2FkZHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgaWR4KTtcXG4rXFxuK3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpO1xcbitwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKTtcXG4rcHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpO1xcbitcXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXFxuK1xcdFxcdFxcdCAgIGludCBwcmltYXJ5KTtcXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpO1xcbitpbnQgYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpO1xcbitpbnQgYXJjaF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKTtcXG4rdm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0ICAgICBwdGVfdCAqa3B0ZSwgcHRlX3Qgb2xkX3B0ZSwgYm9vbCBueCwgYm9vbCBydyk7XFxuK3ZvaWQgYXJjaF9jcGFfZmx1c2goc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBlcnIpO1xcbitcXG4raW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSk7XFxuK2ludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbitcXHRcXHRcXHQgICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NscixcXG4rXFx0XFx0XFx0ICAgICBpbnQgZm9yY2Vfc3BsaXQsIGludCBpbl9mbGFnLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXQodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbitcXHRcXHRcXHRcXHQgICAgICAgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxcbit7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxcbitcXHRcXHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbitcXHRcXHRcXHRcXHRcXHQgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxcbit7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBtYXNrLCAwLFxcbitcXHRcXHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IGNwYV9zZXRfcGFnZXNfYXJyYXkoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLFxcbitcXHRcXHRcXHRcXHQgICAgICBwZ3Byb3RfdCBtYXNrKVxcbit7XFxuK1xcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxcbitcXHRcXHRDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgY3BhX2NsZWFyX3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcyxcXG4rXFx0XFx0XFx0XFx0XFx0cGdwcm90X3QgbWFzaylcXG4re1xcbitcXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCxcXG4rXFx0XFx0Q1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7XFxuK31cXG4rXFxuKyNlbmRpZiAvKiBDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZICovXFxuK1xcbiAjZW5kaWYgLyogX0xJTlVYX1NFVF9NRU1PUllfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWdcXG5pbmRleCA5ZTBjYTQ4MjQ5MDU0Zi4uNTQxZWRkMWUxMWI2MTAgMTAwNjQ0XFxuLS0tIGEvbW0vS2NvbmZpZ1xcbisrKyBiL21tL0tjb25maWdcXG5AQCAtMTUwOSw2ICsxNTA5LDkgQEAgY29uZmlnIExBWllfTU1VX01PREVfS1VOSVRfVEVTVFxcbiBcXG4gXFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiBcXG4rY29uZmlnIEdFTkVSSUNfU0VUX01FTU9SWVxcbitcXHRib29sXFxuK1xcbiBzb3VyY2UgXFxcIm1tL2RhbW9uL0tjb25maWdcXFwiXFxuIFxcbiBlbmRtZW51XFxuZGlmZiAtLWdpdCBhL21tL0tjb25maWcuZGVidWcgYi9tbS9LY29uZmlnLmRlYnVnXFxuaW5kZXggOTFiM2UwMjdiNzUzNTcuLjgzY2ZlZjZiMmQ4Y2ZiIDEwMDY0NFxcbi0tLSBhL21tL0tjb25maWcuZGVidWdcXG4rKysgYi9tbS9LY29uZmlnLmRlYnVnXFxuQEAgLTMyMCwzICszMjAsMTAgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUU1xcbiBcXHQgIG92ZXJoZWFkIGluIHRoZSBwYWdlIGZhdWx0IHBhdGguXFxuIFxcbiBcXHQgIElmIGluIGRvdWJ0LCBzYXkgTi5cXG4rXFxuK2NvbmZpZyBDUEFfREVCVUdcXG4rXFx0Ym9vbCBcXFwiQ1BBIHNlbGYtdGVzdCBjb2RlXFxcIlxcbitcXHRkZXBlbmRzIG9uIEdFTkVSSUNfU0VUX01FTU9SWVxcbitcXHRkZXBlbmRzIG9uIERFQlVHX0tFUk5FTFxcbitcXHRoZWxwXFxuK1xcdCAgRG8gY2hhbmdlX3BhZ2VfYXR0cigpIHNlbGYtdGVzdHMgZXZlcnkgMzAgc2Vjb25kcy5cXG5kaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZVxcbmluZGV4IGVmZjlmOWU3ZTA2MWMxLi5lM2Y2YzM5YzJiYTk5MSAxMDA2NDRcXG4tLS0gYS9tbS9NYWtlZmlsZVxcbisrKyBiL21tL01ha2VmaWxlXFxuQEAgLTE0NywzICsxNDcsNCBAQCBvYmotJChDT05GSUdfU0hSSU5LRVJfREVCVUcpICs9IHNocmlua2VyX2RlYnVnLm9cXG4gb2JqLSQoQ09ORklHX0VYRUNNRU0pICs9IGV4ZWNtZW0ub1xcbiBvYmotJChDT05GSUdfVE1QRlNfUVVPVEEpICs9IHNobWVtX3F1b3RhLm9cXG4gb2JqLSQoQ09ORklHX0xBWllfTU1VX01PREVfS1VOSVRfVEVTVCkgKz0gdGVzdHMvbGF6eV9tbXVfbW9kZV9rdW5pdC5vXFxuK29iai0kKENPTkZJR19HRU5FUklDX1NFVF9NRU1PUlkpICs9IHNldF9tZW1vcnkub1xcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQvY3BhLXRlc3QuYyBiL21tL2NwYS10ZXN0LmNcXG5zaW1pbGFyaXR5IGluZGV4IDgwJVxcbnJlbmFtZSBmcm9tIGFyY2gveDg2L21tL3BhdC9jcGEtdGVzdC5jXFxucmVuYW1lIHRvIG1tL2NwYS10ZXN0LmNcXG5pbmRleCBhZDNjMWZlZWM5OTBkYi4uNjNjMzQ2M2E1YTdkODUgMTAwNjQ0XFxuLS0tIGEvYXJjaC94ODYvbW0vcGF0L2NwYS10ZXN0LmNcXG4rKysgYi9tbS9jcGEtdGVzdC5jXFxuQEAgLTEzLDMyICsxMywyNCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2Nhc20vY2FjaGVmbHVzaC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjYXNtL2tkZWJ1Zy5oXFx1MDAzZVxcbi1cXG4gLypcXG4gICogT25seSBwcmludCB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgcGFzczpcXG4gICovXFxuIHN0YXRpYyBfX3JlYWRfbW9zdGx5IGludCBwcmludCA9IDE7XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF90ZXN0X3BmbjtcXG4gXFxuIGVudW0ge1xcbiBcXHROVEVTVFxcdFxcdFxcdD0gMyAqIDEwMCxcXG4gXFx0TlBBR0VTXFx0XFx0XFx0PSAxMDAsXFxuLSNpZmRlZiBDT05GSUdfWDg2XzY0XFxuLVxcdExQU1xcdFxcdFxcdD0gKDEgXFx1MDAzY1xcdTAwM2MgUE1EX1NISUZUKSxcXG4tI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2X1BBRSlcXG4tXFx0TFBTXFx0XFx0XFx0PSAoMSBcXHUwMDNjXFx1MDAzYyBQTURfU0hJRlQpLFxcbi0jZWxzZVxcbi1cXHRMUFNcXHRcXHRcXHQ9ICgxIFxcdTAwM2NcXHUwMDNjIDIyKSxcXG4tI2VuZGlmXFxuLVxcdEdQU1xcdFxcdFxcdD0gKDFcXHUwMDNjXFx1MDAzYzMwKVxcbitcXHRMUFNcXHRcXHRcXHQ9IFBNRF9TSVpFLFxcbitcXHRHUFNcXHRcXHRcXHQ9IFBVRF9TSVpFXFxuIH07XFxuIFxcbi0jZGVmaW5lIFBBR0VfQ1BBX1RFU1RcXHRfX3BncHJvdChfUEFHRV9DUEFfVEVTVClcXG4rI2RlZmluZSBQQUdFX0NQQV9URVNUXFx0X19wZ3Byb3QoX1BBR0VfU1BFQ0lBTClcXG4gXFxuIHN0YXRpYyBpbnQgcHRlX3Rlc3RiaXQocHRlX3QgcHRlKVxcbiB7XFxuLVxcdHJldHVybiBwdGVfZmxhZ3MocHRlKSBcXHUwMDI2IF9QQUdFX1NPRlRXMTtcXG4rXFx0cmV0dXJuIHB0ZV9zcGVjaWFsKHB0ZSk7XFxuIH1cXG4gXFxuIHN0cnVjdCBzcGxpdF9zdGF0ZSB7XFxuQEAgLTU0LDEwICs0NiwxMCBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcXG4gXFx0cy1cXHUwMDNlbHBnID0gcy1cXHUwMDNlZ3BnID0gcy1cXHUwMDNlc3BnID0gcy1cXHUwMDNlZXhlYyA9IDA7XFxuIFxcdHMtXFx1MDAzZW1pbl9leGVjID0gfjBVTDtcXG4gXFx0cy1cXHUwMDNlbWF4X2V4ZWMgPSAwO1xcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X3Bmbl9tYXBwZWQ7ICkge1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X3Rlc3RfcGZuOyApIHtcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpO1xcbiBcXHRcXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XFxuLVxcdFxcdHB0ZV90ICpwdGU7XFxuK1xcdFxcdHB0ZV90ICpwdGUsIHB0ZXZhbDtcXG4gXFxuIFxcdFxcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsIFxcdTAwMjZsZXZlbCk7XFxuIFxcdFxcdGlmICghcHRlKSB7XFxuQEAgLTY1LDE1ICs1NywxNiBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcXG4gXFx0XFx0XFx0aSsrO1xcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0fVxcbitcXHRcXHRwdGV2YWwgPSBwdGVwX2dldChwdGUpO1xcbiBcXG4tXFx0XFx0aWYgKGxldmVsID09IFBHX0xFVkVMXzFHIFxcdTAwMjZcXHUwMDI2IHNpemVvZihsb25nKSA9PSA4KSB7XFxuK1xcdFxcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRCBcXHUwMDI2XFx1MDAyNiBzaXplb2YobG9uZykgPT0gOCkge1xcbiBcXHRcXHRcXHRzLVxcdTAwM2VncGcrKztcXG4gXFx0XFx0XFx0aSArPSBHUFMvUEFHRV9TSVpFO1xcbi1cXHRcXHR9IGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzJNKSB7XFxuLVxcdFxcdFxcdGlmICgocHRlX3ZhbCgqcHRlKSBcXHUwMDI2IF9QQUdFX1BSRVNFTlQpIFxcdTAwMjZcXHUwMDI2ICEocHRlX3ZhbCgqcHRlKSBcXHUwMDI2IF9QQUdFX1BTRSkpIHtcXG4rXFx0XFx0fSBlbHNlIGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRCkge1xcbitcXHRcXHRcXHRpZiAocHRlX3ByZXNlbnQocHRldmFsKSBcXHUwMDI2XFx1MDAyNiAhcHRlX2h1Z2UocHRldmFsKSkge1xcbiBcXHRcXHRcXHRcXHRwcmludGsoS0VSTl9FUlJcXG4tXFx0XFx0XFx0XFx0XFx0XFxcIiVseCBsZXZlbCAlZCBidXQgbm90IFBTRSAlTHhcXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdGFkZHIsIGxldmVsLCAodTY0KXB0ZV92YWwoKnB0ZSkpO1xcbitcXHRcXHRcXHRcXHRcXHRcXFwiJWx4IGxldmVsICVkIGJ1dCBub3QgbGVhZiAlTHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdGFkZHIsIGxldmVsLCAodTY0KXB0ZV92YWwocHRldmFsKSk7XFxuIFxcdFxcdFxcdFxcdGVyciA9IDE7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0cy1cXHUwMDNlbHBnKys7XFxuQEAgLTgyLDcgKzc1LDcgQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpXFxuIFxcdFxcdFxcdHMtXFx1MDAzZXNwZysrO1xcbiBcXHRcXHRcXHRpKys7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCEocHRlX3ZhbCgqcHRlKSBcXHUwMDI2IF9QQUdFX05YKSkge1xcbitcXHRcXHRpZiAocHRlX2V4ZWMocHRldmFsKSkge1xcbiBcXHRcXHRcXHRzLVxcdTAwM2VleGVjKys7XFxuIFxcdFxcdFxcdGlmIChhZGRyIFxcdTAwM2Mgcy1cXHUwMDNlbWluX2V4ZWMpXFxuIFxcdFxcdFxcdFxcdHMtXFx1MDAzZW1pbl9leGVjID0gYWRkcjtcXG5AQCAtMTAwLDggKzkzLDggQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpXFxuIFxcbiBcXHRleHBlY3RlZCA9IChzLVxcdTAwM2VncGcqR1BTICsgcy1cXHUwMDNlbHBnKkxQUykvUEFHRV9TSVpFICsgcy1cXHUwMDNlc3BnICsgbWlzc2VkO1xcbiBcXHRpZiAoZXhwZWN0ZWQgIT0gaSkge1xcbi1cXHRcXHRwcmludGsoS0VSTl9FUlIgXFxcIkNQQSBtYXhfcGZuX21hcHBlZCAlbHUgYnV0IGV4cGVjdGVkICVsdVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0bWF4X3Bmbl9tYXBwZWQsIGV4cGVjdGVkKTtcXG4rXFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJDUEEgbWF4X3Rlc3RfcGZuICVsdSBidXQgZXhwZWN0ZWQgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRtYXhfdGVzdF9wZm4sIGV4cGVjdGVkKTtcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcdH1cXG4gXFx0cmV0dXJuIGVycjtcXG5AQCAtMTE4LDcgKzExMSw3IEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKVxcbiB7XFxuIFxcdHN0cnVjdCBzcGxpdF9zdGF0ZSBzYSwgc2IsIHNjO1xcbiBcXHR1bnNpZ25lZCBsb25nICpibTtcXG4tXFx0cHRlX3QgKnB0ZSwgcHRlMDtcXG4rXFx0cHRlX3QgKnB0ZSwgcHRlMCwgcHRlX3ZhbDtcXG4gXFx0aW50IGZhaWxlZCA9IDA7XFxuIFxcdHVuc2lnbmVkIGludCBsZXZlbDtcXG4gXFx0aW50IGksIGs7XFxuQEAgLTEyNyw3ICsxMjAsNyBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcXG4gXFx0aWYgKHByaW50KVxcbiBcXHRcXHRwcmludGsoS0VSTl9JTkZPIFxcXCJDUEEgc2VsZi10ZXN0OlxcXFxuXFxcIik7XFxuIFxcbi1cXHRibSA9IHZ6YWxsb2MoKG1heF9wZm5fbWFwcGVkICsgNykgLyA4KTtcXG4rXFx0Ym0gPSB2emFsbG9jKChtYXhfdGVzdF9wZm4gKyA3KSAvIDgpO1xcbiBcXHRpZiAoIWJtKSB7XFxuIFxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiQ1BBIENhbm5vdCB2bWFsbG9jIGJpdG1hcFxcXFxuXFxcIik7XFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbkBAIC0xMzYsMTEgKzEyOSwxMSBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcXG4gXFx0ZmFpbGVkICs9IHByaW50X3NwbGl0KFxcdTAwMjZzYSk7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlRFU1Q7IGkrKykge1xcbi1cXHRcXHR1bnNpZ25lZCBsb25nIHBmbiA9IGdldF9yYW5kb21fdTMyX2JlbG93KG1heF9wZm5fbWFwcGVkKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwZm4gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhtYXhfdGVzdF9wZm4pO1xcbiBcXG4gXFx0XFx0YWRkcltpXSA9ICh1bnNpZ25lZCBsb25nKV9fdmEocGZuIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpO1xcbiBcXHRcXHRsZW5baV0gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhOUEFHRVMpO1xcbi1cXHRcXHRsZW5baV0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW5baV0sIG1heF9wZm5fbWFwcGVkIC0gcGZuIC0gMSk7XFxuK1xcdFxcdGxlbltpXSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbltpXSwgbWF4X3Rlc3RfcGZuIC0gcGZuIC0gMSk7XFxuIFxcbiBcXHRcXHRpZiAobGVuW2ldID09IDApXFxuIFxcdFxcdFxcdGxlbltpXSA9IDE7XFxuQEAgLTE1MCwxNSArMTQzLDIwIEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKVxcbiBcXG4gXFx0XFx0Zm9yIChrID0gMDsgayBcXHUwMDNjIGxlbltpXTsgaysrKSB7XFxuIFxcdFxcdFxcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHJbaV0gKyBrKlBBR0VfU0laRSwgXFx1MDAyNmxldmVsKTtcXG4tXFx0XFx0XFx0aWYgKCFwdGUgfHwgcGdwcm90X3ZhbChwdGVfcGdwcm90KCpwdGUpKSA9PSAwIHx8XFxuLVxcdFxcdFxcdCAgICAhKHB0ZV92YWwoKnB0ZSkgXFx1MDAyNiBfUEFHRV9QUkVTRU5UKSkge1xcbitcXHRcXHRcXHRpZiAoIXB0ZSkge1xcbitcXHRcXHRcXHRcXHRhZGRyW2ldID0gMDtcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0cHRlX3ZhbCA9IHB0ZXBfZ2V0KHB0ZSk7XFxuK1xcdFxcdFxcdGlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlX3ZhbCkpID09IDAgfHxcXG4rXFx0XFx0XFx0ICAgICFwdGVfcHJlc2VudChwdGVfdmFsKSkge1xcbiBcXHRcXHRcXHRcXHRhZGRyW2ldID0gMDtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0aWYgKGsgPT0gMCkge1xcbi1cXHRcXHRcXHRcXHRwdGUwID0gKnB0ZTtcXG4rXFx0XFx0XFx0XFx0cHRlMCA9IHB0ZV92YWw7XFxuIFxcdFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdFxcdGlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QoKnB0ZSkpICE9XFxuK1xcdFxcdFxcdFxcdGlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlX3ZhbCkpICE9XFxuIFxcdFxcdFxcdFxcdFxcdHBncHJvdF92YWwocHRlX3BncHJvdChwdGUwKSkpIHtcXG4gXFx0XFx0XFx0XFx0XFx0bGVuW2ldID0gaztcXG4gXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuQEAgLTE5OCwxMiArMTk2LDEyIEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKVxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldLCBcXHUwMDI2bGV2ZWwpO1xcbi1cXHRcXHRpZiAoIXB0ZSB8fCAhcHRlX3Rlc3RiaXQoKnB0ZSkgfHwgcHRlX2h1Z2UoKnB0ZSkpIHtcXG4rXFx0XFx0aWYgKCFwdGUgfHwgIXB0ZV90ZXN0Yml0KCpwdGUpIHx8IGxldmVsICE9IFBHVEFCTEVfTEVWRUxfUFRFKSB7XFxuIFxcdFxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiQ1BBICVseDogYmFkIHB0ZSAlTHhcXFxcblxcXCIsIGFkZHJbaV0sXFxuIFxcdFxcdFxcdFxcdHB0ZSA/ICh1NjQpcHRlX3ZhbCgqcHRlKSA6IDBVTEwpO1xcbiBcXHRcXHRcXHRmYWlsZWQrKztcXG4gXFx0XFx0fVxcbi1cXHRcXHRpZiAobGV2ZWwgIT0gUEdfTEVWRUxfNEspIHtcXG4rXFx0XFx0aWYgKGxldmVsICE9IFBHVEFCTEVfTEVWRUxfUFRFKSB7XFxuIFxcdFxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiQ1BBICVseDogdW5leHBlY3RlZCBsZXZlbCAlZFxcXFxuXFxcIixcXG4gXFx0XFx0XFx0XFx0YWRkcltpXSwgbGV2ZWwpO1xcbiBcXHRcXHRcXHRmYWlsZWQrKztcXG5AQCAtMjY2LDYgKzI2NCw4IEBAIHN0YXRpYyBpbnQgc3RhcnRfcGFnZWF0dHJfdGVzdCh2b2lkKVxcbiB7XFxuIFxcdHN0cnVjdCB0YXNrX3N0cnVjdCAqcDtcXG4gXFxuK1xcdG1heF90ZXN0X3BmbiA9IFBGTl9ET1dOKF9fcGEoaGlnaF9tZW1vcnkgLSAxKSk7XFxuK1xcbiBcXHRwID0ga3RocmVhZF9jcmVhdGUoZG9fcGFnZWF0dHJfdGVzdCwgTlVMTCwgXFxcInBhZ2VhdHRyLXRlc3RcXFwiKTtcXG4gXFx0aWYgKCFJU19FUlIocCkpXFxuIFxcdFxcdHdha2VfdXBfcHJvY2VzcyhwKTtcXG5kaWZmIC0tZ2l0IGEvbW0vc2V0X21lbW9yeS5jIGIvbW0vc2V0X21lbW9yeS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNzQ0NDA1ZWZjYzM0MDFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvbW0vc2V0X21lbW9yeS5jXFxuQEAgLTAsMCArMSwzOTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hpZ2htZW0uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BndGFibGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V4cG9ydC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NldF9tZW1vcnkuaFxcdTAwM2VcXG4rXFxuKy8qXFxuKyAqIFNlcmlhbGl6ZSBjcGEoKSBzbyB0aGF0IHdlIGRvbid0IGFsbG93IGFueSBvdGhlciBjcHUsIHdpdGggc3RhbGUgbGFyZ2UgdGxiXFxuKyAqIGVudHJpZXMsIHRvIGNoYW5nZSB0aGUgcGFnZSBhdHRyaWJ1dGUgaW4gcGFyYWxsZWwgdG8gc29tZSBvdGhlciBjcHVcXG4rICogc3BsaXR0aW5nIGEgbGFyZ2UgcGFnZSBlbnRyeSBhbG9uZyB3aXRoIGNoYW5naW5nIHRoZSBhdHRyaWJ1dGUuXFxuKyAqL1xcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwYV9sb2NrKTtcXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2sodm9pZClcXG4re1xcbisjaWZkZWYgQ09ORklHX1g4NlxcbitcXHRzcGluX2xvY2soXFx1MDAyNnBnZF9sb2NrKTtcXG4rI2VuZGlmXFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3VubG9jayh2b2lkKVxcbit7XFxuKyNpZmRlZiBDT05GSUdfWDg2XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZwZ2RfbG9jayk7XFxuKyNlbmRpZlxcbit9XFxuK1xcbit1bnNpZ25lZCBsb25nIGNwYV9hZGRyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGlkeClcXG4re1xcbitcXHRpZiAoY3BhLVxcdTAwM2VmbGFncyBcXHUwMDI2IENQQV9QQUdFU19BUlJBWSkge1xcbitcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwYS1cXHUwMDNlcGFnZXNbaWR4XTtcXG4rXFxuK1xcdFxcdGlmICh1bmxpa2VseShQYWdlSGlnaE1lbShwYWdlKSkpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0XFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNwYS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBDUEFfQVJSQVkpXFxuK1xcdFxcdHJldHVybiBjcGEtXFx1MDAzZXZhZGRyW2lkeF07XFxuK1xcbitcXHRyZXR1cm4gKmNwYS1cXHUwMDNldmFkZHIgKyBpZHggKiBQQUdFX1NJWkU7XFxuK31cXG4rXFxuKy8qXFxuKyAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuXFxuKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IChvciBOVUxMIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCksXFxuKyAqIHRoZSBsZXZlbCBvZiB0aGUgZW50cnksIGFuZCB0aGUgZWZmZWN0aXZlIE5YIGFuZCBSVyBiaXRzIG9mIGFsbFxcbisgKiBwYWdlIHRhYmxlIGxldmVscy5cXG4rICovXFxuK3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2RfdCAqcGdkcCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCAqbGV2ZWwsIGJvb2wgKm54LCBib29sICpydylcXG4re1xcbitcXHRwZ2RfdCBwZ2QgPSBwZ2RwX2dldChwZ2RwKTtcXG4rXFx0cDRkX3QgKnA0ZHAsIHA0ZDtcXG4rXFx0cHVkX3QgKnB1ZHAsIHB1ZDtcXG4rXFx0cG1kX3QgKnBtZHAsIHBtZDtcXG4rXFxuK1xcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUEdEO1xcbitcXHQqbnggPSBmYWxzZTtcXG4rXFx0KnJ3ID0gdHJ1ZTtcXG4rXFxuK1xcdGlmIChwZ2Rfbm9uZShwZ2QpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUDREO1xcbitcXHQqbnggfD0gIXBnZF9leGVjKHBnZCk7XFxuK1xcdCpydyBcXHUwMDI2PSAhIShwZ2Rfd3JpdGUocGdkKSk7XFxuK1xcbitcXHRwNGRwID0gcDRkX29mZnNldChwZ2RwLCBhZGRyZXNzKTtcXG4rXFx0cDRkID0gcDRkcF9nZXQocDRkcCk7XFxuK1xcdGlmIChwNGRfbm9uZShwNGQpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmIChwNGRfbGVhZihwNGQpIHx8ICFwNGRfcHJlc2VudChwNGQpKVxcbitcXHRcXHRyZXR1cm4gKHB0ZV90ICopcDRkcDtcXG4rXFxuK1xcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFVEO1xcbitcXHQqbnggfD0gIXA0ZF9leGVjKHA0ZCk7XFxuK1xcdCpydyBcXHUwMDI2PSAhIShwNGRfd3JpdGUocDRkKSk7XFxuK1xcbitcXHRwdWRwID0gcHVkX29mZnNldChwNGRwLCBhZGRyZXNzKTtcXG4rXFx0cHVkID0gcHVkcF9nZXQocHVkcCk7XFxuK1xcdGlmIChwdWRfbm9uZShwdWQpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmIChwdWRfbGVhZihwdWQpIHx8ICFwdWRfcHJlc2VudChwdWQpKVxcbitcXHRcXHRyZXR1cm4gKHB0ZV90ICopcHVkcDtcXG4rXFxuK1xcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUE1EO1xcbitcXHQqbnggfD0gIXB1ZF9leGVjKHB1ZCk7XFxuK1xcdCpydyBcXHUwMDI2PSAhIShwdWRfd3JpdGUocHVkKSk7XFxuK1xcbitcXHRwbWRwID0gcG1kX29mZnNldChwdWRwLCBhZGRyZXNzKTtcXG4rXFx0cG1kID0gcG1kcF9nZXQocG1kcCk7XFxuK1xcdGlmIChwbWRfbm9uZShwbWQpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmIChwbWRfbGVhZihwbWQpIHx8ICFwbWRfcHJlc2VudChwbWQpKVxcbitcXHRcXHRyZXR1cm4gKHB0ZV90ICopcG1kcDtcXG4rXFxuK1xcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFRFO1xcbitcXHQqbnggfD0gIXBtZF9leGVjKHBtZCk7XFxuK1xcdCpydyBcXHUwMDI2PSAhIShwbWRfd3JpdGUocG1kKSk7XFxuK1xcbitcXHRyZXR1cm4gcHRlX29mZnNldF9rZXJuZWwocG1kcCwgYWRkcmVzcyk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuXFxuKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuXFxuKyAqL1xcbitwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKVxcbit7XFxuK1xcdGJvb2wgbngsIHJ3O1xcbitcXG4rXFx0cmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZCwgYWRkcmVzcywgbGV2ZWwsIFxcdTAwMjZueCwgXFx1MDAyNnJ3KTtcXG4rfVxcbitcXG4rLypcXG4rICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcy4gUmV0dXJuIGEgcG9pbnRlclxcbisgKiB0byB0aGUgZW50cnkgYW5kIHRoZSBsZXZlbCBvZiB0aGUgbWFwcGluZy5cXG4rICpcXG4rICogTm90ZTogdGhlIGZ1bmN0aW9uIHJldHVybnMgcDRkLCBwdWQgb3IgcG1kIGVpdGhlciB3aGVuIHRoZSBlbnRyeSBpcyBtYXJrZWRcXG4rICogbGFyZ2Ugb3Igd2hlbiB0aGUgcHJlc2VudCBiaXQgaXMgbm90IHNldC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgTlVMTC5cXG4rICovXFxuK3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpXFxuK3tcXG4rXFx0cmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2Rfb2Zmc2V0X2soYWRkcmVzcyksIGFkZHJlc3MsIGxldmVsKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfYWRkcmVzcyk7XFxuK1xcbitzdGF0aWMgcHRlX3QgKl9sb29rdXBfYWRkcmVzc19jcGEoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4rXFx0XFx0XFx0ICAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KVxcbit7XFxuK1xcdHBnZF90ICpwZ2Q7XFxuK1xcbitcXHRpZiAoIWNwYS1cXHUwMDNlcGdkKVxcbitcXHRcXHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cGdkID0gY3BhLVxcdTAwM2VwZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcyk7XFxuK1xcbitcXHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgbngsIHJ3KTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSxcXG4rXFx0XFx0XFx0XFx0ICAgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcXG4re1xcbitcXHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cXHUwMDNlbGV2ZWw7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHNkLVxcdTAwM2VhZGRyZXNzO1xcbitcXHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzLCBscGFkZHI7XFxuK1xcbitcXHRpZiAoY3BhLVxcdTAwM2Vmb3JjZV9zcGxpdClcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRzZC1cXHUwMDNlcHNpemUgPSBwZ3RhYmxlX2xldmVsX3NpemUobGV2ZWwpO1xcbitcXHRzZC1cXHUwMDNlcG1hc2sgPSBwZ3RhYmxlX2xldmVsX21hc2sobGV2ZWwpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMsIHdoaWNoIGZpdCBpbnRvIHRoaXMgbGFyZ2VcXG4rXFx0ICogcGFnZSBzdGFydGluZyBhdCBhZGRyZXNzOlxcbitcXHQgKi9cXG4rXFx0bHBhZGRyID0gKGFkZHJlc3MgKyBzZC1cXHUwMDNlcHNpemUpIFxcdTAwMjYgc2QtXFx1MDAzZXBtYXNrO1xcbitcXHRudW1wYWdlcyA9IChscGFkZHIgLSBhZGRyZXNzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRpZiAobnVtcGFnZXMgXFx1MDAzYyBjcGEtXFx1MDAzZW51bXBhZ2VzKVxcbitcXHRcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gbnVtcGFnZXM7XFxuK1xcbitcXHRyZXR1cm4gYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShjcGEsIHNkKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBjcGFfaGFuZGxlX2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICprcHRlLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcXG4re1xcbitcXHRzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgc2QgPSB7XFxuK1xcdFxcdC5hZGRyZXNzID0gYWRkcmVzcyxcXG4rXFx0XFx0LmtwdGUgPSBrcHRlLFxcbitcXHR9O1xcbitcXHRpbnQgZG9fc3BsaXQsIHJldCA9IDE7XFxuK1xcdHB0ZV90ICp0bXA7XFxuK1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2Y3BhX2xvY2spO1xcbitcXHRzZC5wdGRlc2MgPSBwYWdldGFibGVfYWxsb2MoR0ZQX0tFUk5FTCwgMCk7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2Y3BhX2xvY2spO1xcbitcXHRpZiAoIXNkLnB0ZGVzYylcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRhcmNoX2xvY2soKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2VcXG4rXFx0ICogdXAgYWxyZWFkeTpcXG4rXFx0ICovXFxuK1xcdHRtcCA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCBcXHUwMDI2c2QubGV2ZWwsIFxcdTAwMjZzZC5ueCwgXFx1MDAyNnNkLnJ3KTtcXG4rXFx0aWYgKHRtcCAhPSBrcHRlKVxcbitcXHRcXHRnb3RvIG91dF9mcmVlX3B0ZGVzYztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENoZWNrLCB3aGV0aGVyIHdlIGNhbiBrZWVwIHRoZSBsYXJnZSBwYWdlIGludGFjdFxcbitcXHQgKiBhbmQganVzdCBjaGFuZ2UgdGhlIHB0ZTpcXG4rXFx0ICovXFxuK1xcdGRvX3NwbGl0ID0gc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBcXHUwMDI2c2QpO1xcbitcXHRyZXQgPSBkb19zcGxpdDtcXG4rXFx0LypcXG4rXFx0ICogV2hlbiB0aGUgcmFuZ2UgZml0cyBpbnRvIHRoZSBleGlzdGluZyBsYXJnZSBwYWdlLCBubyBzcGxpdCBpc1xcbitcXHQgKiByZXF1aXJlZC5cXG4rXFx0ICogc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UoKSB1cGRhdGVkIHRoZSBsYXJnZSBwYWdlIGF0dHJpYnV0ZXMgYW5kXFxuK1xcdCAqIGNwYS1cXHUwMDNlbnVtcGFnZXMgYW5kIGNwYS1cXHUwMDNlcGZuLlxcbitcXHQgKi9cXG4rXFx0aWYgKGRvX3NwbGl0IFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0X2ZyZWVfcHRkZXNjO1xcbitcXG4rXFx0LypcXG4rXFx0ICogV2UgaGF2ZSB0byBzcGxpdCB0aGUgbGFyZ2UgcGFnZTpcXG4rXFx0ICovXFxuK1xcdHJldCA9IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShjcGEsIFxcdTAwMjZzZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gb3V0X2ZyZWVfcHRkZXNjO1xcbitcXG4rXFx0YXJjaF91bmxvY2soKTtcXG4rXFx0cmV0dXJuIGRvX3NwbGl0O1xcbitcXG4rb3V0X2ZyZWVfcHRkZXNjOlxcbitcXHRhcmNoX3VubG9jaygpO1xcbitcXHRwYWdldGFibGVfZnJlZShzZC5wdGRlc2MpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzO1xcbitcXHRpbnQgc3BsaXRfcmVzO1xcbitcXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XFxuK1xcdHB0ZV90ICprcHRlLCBvbGRfcHRlO1xcbitcXHRib29sIG54LCBydztcXG4rXFxuK1xcdGFkZHJlc3MgPSBjcGFfYWRkcihjcGEsIGNwYS1cXHUwMDNlY3VycGFnZSk7XFxuK3JlcGVhdDpcXG4rXFx0a3B0ZSA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCBcXHUwMDI2bGV2ZWwsIFxcdTAwMjZueCwgXFx1MDAyNnJ3KTtcXG4rXFx0aWYgKCFrcHRlKVxcbitcXHRcXHRyZXR1cm4gYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChjcGEsIGFkZHJlc3MsIHByaW1hcnkpO1xcbitcXG4rXFx0b2xkX3B0ZSA9ICprcHRlO1xcbitcXHRpZiAocHRlX25vbmUob2xkX3B0ZSkpXFxuK1xcdFxcdHJldHVybiBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XFxuK1xcbitcXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVEUpIHtcXG4rXFx0XFx0YXJjaF9jaGFuZ2VfcHRlKGNwYSwgYWRkcmVzcywga3B0ZSwgb2xkX3B0ZSwgbngsIHJ3KTtcXG4rXFx0XFx0Y3BhLVxcdTAwM2VudW1wYWdlcyA9IDE7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgYWRkcmVzcyBtYXBzIGEgbGFyZ2UgcGFnZS4gVHJ5IHRvIGtlZXAgaXQsIG90aGVyd2lzZSBzcGxpdCBpdFxcbitcXHQgKiB1cCBhbmQgcmV0cnkgb24gdGhlIGZyZXNobHkgaW5zdGFsbGVkIHNtYWxsZXIgbWFwcGluZy5cXG4rXFx0ICovXFxuK1xcdHNwbGl0X3JlcyA9IGNwYV9oYW5kbGVfbGFyZ2VfcGFnZShjcGEsIGtwdGUsIGFkZHJlc3MpO1xcbitcXHRpZiAoc3BsaXRfcmVzIFxcdTAwM2UgMClcXG4rXFx0XFx0Z290byByZXBlYXQ7XFxuK1xcbitcXHRyZXR1cm4gc3BsaXRfcmVzO1xcbit9XFxuK1xcbitpbnQgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnVtcGFnZXMgPSBjcGEtXFx1MDAzZW51bXBhZ2VzO1xcbitcXHR1bnNpZ25lZCBsb25nIHJlbXBhZ2VzID0gbnVtcGFnZXM7XFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTm8gY2hhbmdlcywgZWFzeSFcXG4rXFx0ICovXFxuK1xcdGlmICghKHBncHJvdF92YWwoY3BhLVxcdTAwM2VtYXNrX3NldCkgfCBwZ3Byb3RfdmFsKGNwYS1cXHUwMDNlbWFza19jbHIpKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIWNwYS1cXHUwMDNlZm9yY2Vfc3BsaXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3aGlsZSAocmVtcGFnZXMpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogU3RvcmUgdGhlIHJlbWFpbmluZyBuciBvZiBwYWdlcyBmb3IgdGhlIGxhcmdlIHBhZ2VcXG4rXFx0XFx0ICogcHJlc2VydmF0aW9uIGNoZWNrLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0Y3BhLVxcdTAwM2VudW1wYWdlcyA9IHJlbXBhZ2VzO1xcbitcXHRcXHQvKiBmb3IgYXJyYXkgY2hhbmdlcywgd2UgY2FuJ3QgdXNlIGxhcmdlIHBhZ2UgKi9cXG4rXFx0XFx0aWYgKGNwYS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiAoQ1BBX0FSUkFZIHwgQ1BBX1BBR0VTX0FSUkFZKSlcXG4rXFx0XFx0XFx0Y3BhLVxcdTAwM2VudW1wYWdlcyA9IDE7XFxuK1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNmNwYV9sb2NrKTtcXG4rXFx0XFx0cmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyKGNwYSwgcHJpbWFyeSk7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZjcGFfbG9jayk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0aWYgKHByaW1hcnkgXFx1MDAyNlxcdTAwMjYgIShjcGEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQ1BBX05PX0NIRUNLX0FMSUFTKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoY3BhX2FkZHIoY3BhLCBjcGEtXFx1MDAzZWN1cnBhZ2UpLCBjcGEtXFx1MDAzZXBmbikpIHtcXG4rXFx0XFx0XFx0cmV0ID0gYXJjaF9jcGFfcHJvY2Vzc19hbGlhcyhjcGEpO1xcbitcXHRcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQWRqdXN0IHRoZSBudW1iZXIgb2YgcGFnZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxcbitcXHRcXHQgKiBDUEEgb3BlcmF0aW9uLiBFaXRoZXIgYSBsYXJnZSBwYWdlIGhhcyBiZWVuXFxuK1xcdFxcdCAqIHByZXNlcnZlZCBvciBhIHNpbmdsZSBwYWdlIHVwZGF0ZSBoYXBwZW5lZC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdEJVR19PTihjcGEtXFx1MDAzZW51bXBhZ2VzIFxcdTAwM2UgcmVtcGFnZXMgfHwgIWNwYS1cXHUwMDNlbnVtcGFnZXMpO1xcbitcXHRcXHRyZW1wYWdlcyAtPSBjcGEtXFx1MDAzZW51bXBhZ2VzO1xcbitcXHRcXHRjcGEtXFx1MDAzZWN1cnBhZ2UgKz0gY3BhLVxcdTAwM2VudW1wYWdlcztcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHQvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBudW1wYWdlcyAqL1xcbitcXHRjcGEtXFx1MDAzZW51bXBhZ2VzID0gbnVtcGFnZXM7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK2ludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxcbitcXHRcXHRcXHQgICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NscixcXG4rXFx0XFx0XFx0ICAgICBpbnQgZm9yY2Vfc3BsaXQsIGludCBpbl9mbGFnLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK3tcXG4rXFx0c3RydWN0IGNwYV9kYXRhIGNwYTtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2Y3BhLCAwLCBzaXplb2YoY3BhKSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjaywgaWYgd2UgYXJlIHJlcXVlc3RlZCB0byBzZXQgYSBub3Qgc3VwcG9ydGVkXFxuK1xcdCAqIGZlYXR1cmUuICBDbGVhcmluZyBub24tc3VwcG9ydGVkIGZlYXR1cmVzIGlzIE9LLlxcbitcXHQgKi9cXG4rXFx0bWFza19zZXQgPSBjYW5vbl9wZ3Byb3QobWFza19zZXQpO1xcbitcXG4rXFx0aWYgKCFwZ3Byb3RfdmFsKG1hc2tfc2V0KSBcXHUwMDI2XFx1MDAyNiAhcGdwcm90X3ZhbChtYXNrX2NscikgXFx1MDAyNlxcdTAwMjYgIWZvcmNlX3NwbGl0KVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdC8qIEVuc3VyZSB3ZSBhcmUgUEFHRV9TSVpFIGFsaWduZWQgKi9cXG4rXFx0aWYgKGluX2ZsYWcgXFx1MDAyNiBDUEFfQVJSQVkpIHtcXG4rXFx0XFx0aW50IGk7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnVtcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAoYWRkcltpXSBcXHUwMDI2IH5QQUdFX01BU0spIHtcXG4rXFx0XFx0XFx0XFx0YWRkcltpXSBcXHUwMDI2PSBQQUdFX01BU0s7XFxuK1xcdFxcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSBpZiAoIShpbl9mbGFnIFxcdTAwMjYgQ1BBX1BBR0VTX0FSUkFZKSkge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBpbl9mbGFnIG9mIENQQV9QQUdFU19BUlJBWSBpbXBsaWVzIGl0IGlzIGFsaWduZWQuXFxuK1xcdFxcdCAqIE5vIG5lZWQgdG8gY2hlY2sgaW4gdGhhdCBjYXNlXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoKmFkZHIgXFx1MDAyNiB+UEFHRV9NQVNLKSB7XFxuK1xcdFxcdFxcdCphZGRyIFxcdTAwMjY9IFBBR0VfTUFTSztcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogUGVvcGxlIHNob3VsZCBub3QgYmUgcGFzc2luZyBpbiB1bmFsaWduZWQgYWRkcmVzc2VzOlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0V0FSTl9PTl9PTkNFKDEpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqL1xcbitcXHRrbWFwX2ZsdXNoX3VudXNlZCgpO1xcbitcXG4rXFx0dm1fdW5tYXBfYWxpYXNlcygpO1xcbitcXG4rXFx0Y3BhLnZhZGRyID0gYWRkcjtcXG4rXFx0Y3BhLnBhZ2VzID0gcGFnZXM7XFxuK1xcdGNwYS5udW1wYWdlcyA9IG51bXBhZ2VzO1xcbitcXHRjcGEubWFza19zZXQgPSBtYXNrX3NldDtcXG4rXFx0Y3BhLm1hc2tfY2xyID0gbWFza19jbHI7XFxuK1xcdGNwYS5mbGFncyA9IGluX2ZsYWc7XFxuK1xcdGNwYS5jdXJwYWdlID0gMDtcXG4rXFx0Y3BhLmZvcmNlX3NwbGl0ID0gZm9yY2Vfc3BsaXQ7XFxuK1xcbitcXHRlcnIgPSBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcXHUwMDI2Y3BhLCAxKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IGNoYW5nZWQgc29tZXRoaW5nOlxcbitcXHQgKi9cXG4rXFx0aWYgKCEoY3BhLmZsYWdzIFxcdTAwMjYgQ1BBX0ZMVVNIVExCKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRhcmNoX2NwYV9mbHVzaChcXHUwMDI2Y3BhLCBlcnIpO1xcbitcXG4rb3V0OlxcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK1xcbisvKlxcbisgKiBUaGUgdGVzdGNhc2VzIHVzZSBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkbid0XFxuKyAqIGJlIGV4cG9zZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gSW5jbHVkZSB0aGVzZSBkaXJlY3RseSBoZXJlLlxcbisgKi9cXG4rI2lmZGVmIENPTkZJR19DUEFfREVCVUdcXG4rI2luY2x1ZGUgXFxcImNwYS10ZXN0LmNcXFwiXFxuKyNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yMlQxMToxMTo0MS4xNTQ0MDc0MTVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxOTEyODQ5NjI0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDUEFfREVCVUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJcIixcbiAgICBcIl9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyXCIsXG4gICAgXCJfX2NoYW5nZV9wYWdlX2F0dHJcIixcbiAgICBcImNwYV9oYW5kbGVfbGFyZ2VfcGFnZVwiLFxuICAgIFwic2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VcIixcbiAgICBcImFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VcIixcbiAgICBcImFyY2hfc3BsaXRfbGFyZ2VfcGFnZVwiLFxuICAgIFwiYXJjaF9jaGFuZ2VfcHRlXCIsXG4gICAgXCJhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0XCIsXG4gICAgXCJhcmNoX2NwYV9wcm9jZXNzX2FsaWFzXCIsXG4gICAgXCJhcmNoX2NwYV9mbHVzaFwiLFxuICAgIFwibG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGNoYW5nZV9wYWdlX2F0dHIgKENQQSkgbG9naWMsIG1vdmluZyBpdCBmcm9tIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlICh4ODYsIHJpc2N2KSB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaW4gbW0vc2V0X21lbW9yeS5jLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gY29yZSBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIEZ1enppbmcgc2hvdWxkIGZvY3VzIG9uIHRoZSBuZXcgZ2VuZXJpYyBmdW5jdGlvbnMgYW5kIHRoZWlyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjYWxsYmFja3MuIEVuYWJsaW5nIENQQV9ERUJVRyB3aWxsIGFsc28gcnVuIHRoZSBDUEEgc2VsZi10ZXN0cyB0byBoZWxwIHVuY292ZXIgaXNzdWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGQ1NDRiMmJmZjRjMzRmZjRlNDZjYzA4MTUxOGEyNjZhYjMxNjUxNWNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEp1bCAyMiAxMToxMTozOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL0tjb25maWcgYi9hcmNoL2xvb25nYXJjaC9LY29uZmlnXG5pbmRleCBkOGQyNTIzMjUwMTc5MS4uMWJmYTk0Nzk3YjFiNGIgMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9LY29uZmlnXG4rKysgYi9hcmNoL2xvb25nYXJjaC9LY29uZmlnXG5AQCAtMTA5LDYgKzEwOSw3IEBAIGNvbmZpZyBMT09OR0FSQ0hcbiBcdHNlbGVjdCBHRU5FUklDX0xJQl9ERVZNRU1fSVNfQUxMT1dFRFxuIFx0c2VsZWN0IEdFTkVSSUNfUENJX0lPTUFQXG4gXHRzZWxlY3QgR0VORVJJQ19TQ0hFRF9DTE9DS1xuK1x0c2VsZWN0IEdFTkVSSUNfU0VUX01FTU9SWVxuIFx0c2VsZWN0IEdFTkVSSUNfU01QX0lETEVfVEhSRUFEXG4gXHRzZWxlY3QgR1BJT0xJQlxuIFx0c2VsZWN0IEhBU19JT1BPUlRcbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbmluZGV4IDIyMzUyOGMwNGQ3MzkyLi4zNzdiZWYwODk0ZDc3MSAxMDA2NDRcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3BndGFibGUuaFxuKysrIGIvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG5AQCAtNjM4LDYgKzYzOCw0OCBAQCBzdGF0aWMgaW5saW5lIGxvbmcgcG1kX3Byb3Rub25lKHBtZF90IHBtZClcbiAjZGVmaW5lIHBtZF9sZWFmKHBtZClcdFx0KChwbWRfdmFsKHBtZCkgXHUwMDI2IF9QQUdFX0hVR0UpICE9IDApXG4gI2RlZmluZSBwdWRfbGVhZihwdWQpXHRcdCgocHVkX3ZhbChwdWQpIFx1MDAyNiBfUEFHRV9IVUdFKSAhPSAwKVxuIFxuKyNkZWZpbmUgcGdkX3dyaXRlIHBnZF93cml0ZVxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXG4re1xuK1x0cmV0dXJuICEhKHBnZF92YWwocGdkKSBcdTAwMjYgX1BBR0VfV1JJVEUpO1xuK31cbitcbisjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGVcbitzdGF0aWMgaW5saW5lIGludCBwNGRfd3JpdGUocDRkX3QgcDRkKVxuK3tcbitcdHJldHVybiAhIShwNGRfdmFsKHA0ZCkgXHUwMDI2IF9QQUdFX1dSSVRFKTtcbit9XG4rXG4rI2RlZmluZSBwdWRfd3JpdGUgcHVkX3dyaXRlXG4rc3RhdGljIGlubGluZSBpbnQgcHVkX3dyaXRlKHB1ZF90IHB1ZClcbit7XG4rXHRyZXR1cm4gISEocHVkX3ZhbChwdWQpIFx1MDAyNiBfUEFHRV9XUklURSk7XG4rfVxuK1xuKyNkZWZpbmUgcGdkX2V4ZWMgcGdkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXG4re1xuK1x0cmV0dXJuICEocGdkX3ZhbChwZ2QpIFx1MDAyNiBfUEFHRV9OT19FWEVDKTtcbit9XG4rXG4rI2RlZmluZSBwNGRfZXhlYyBwNGRfZXhlY1xuK3N0YXRpYyBpbmxpbmUgaW50IHA0ZF9leGVjKHA0ZF90IHA0ZClcbit7XG4rXHRyZXR1cm4gIShwNGRfdmFsKHA0ZCkgXHUwMDI2IF9QQUdFX05PX0VYRUMpO1xuK31cbitcbisjZGVmaW5lIHB1ZF9leGVjIHB1ZF9leGVjXG4rc3RhdGljIGlubGluZSBpbnQgcHVkX2V4ZWMocHVkX3QgcHVkKVxuK3tcbitcdHJldHVybiAhKHB1ZF92YWwocHVkKSBcdTAwMjYgX1BBR0VfTk9fRVhFQyk7XG4rfVxuK1xuKyNkZWZpbmUgcG1kX2V4ZWMgcG1kX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXG4re1xuK1x0cmV0dXJuICEocG1kX3ZhbChwbWQpIFx1MDAyNiBfUEFHRV9OT19FWEVDKTtcbit9XG4rXG4gLypcbiAgKiBXZSBwcm92aWRlIG91ciBvd24gZ2V0X3VubWFwcGVkIGFyZWEgdG8gY29wZSB3aXRoIHRoZSB2aXJ0dWFsIGFsaWFzaW5nXG4gICogY29uc3RyYWludHMgcGxhY2VkIG9uIHVzIGJ5IHRoZSBjYWNoZSBhcmNoaXRlY3R1cmUuXG5kaWZmIC0tZ2l0IGEvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oIGIvYXJjaC9sb29uZ2FyY2gvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG5pbmRleCA1NWRmYWVmZDAyYzhhNi4uNmZmYjRmZTVhNzViMGUgMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbisrKyBiL2FyY2gvbG9vbmdhcmNoL2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuQEAgLTE5LDQgKzE5LDEzIEBAIGludCBzZXRfZGlyZWN0X21hcF9kZWZhdWx0X25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpO1xuIGludCBzZXRfZGlyZWN0X21hcF9pbnZhbGlkX25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpO1xuIGludCBzZXRfZGlyZWN0X21hcF92YWxpZF9ub2ZsdXNoKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBuciwgYm9vbCB2YWxpZCk7XG4gXG4rLypcbisgKiBUaGUgZGlyZWN0IG1hcCBpcyBhIGZpeGVkIGFkZHJlc3Mgd2luZG93IHRoYXQgaXMgbm90IGJhY2tlZCBieSBwYWdlIHRhYmxlcyxcbisgKiBzbyBhIHBhZ2UgbmV2ZXIgaGFzIGEgc2Vjb25kIG1hcHBpbmcgd2hvc2UgcHJvdGVjdGlvbiBtdXN0IGJlIHN5bmNocm9uaXNlZC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXModW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4pXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiAjZW5kaWYgLyogX0FTTV9MT09OR0FSQ0hfU0VUX01FTU9SWV9IICovXG5kaWZmIC0tZ2l0IGEvYXJjaC9sb29uZ2FyY2gvbW0vcGFnZWF0dHIuYyBiL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmNcbmluZGV4IDYxNGNjYzdhZmNjYmVhLi5kYmJkNDA4YmQzZDVlNiAxMDA2NDRcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmNcbisrKyBiL2FyY2gvbG9vbmdhcmNoL21tL3BhZ2VhdHRyLmNcbkBAIC00LDEyNiArNCw4MyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWJsb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdld2Fsay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BndGFibGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NldF9tZW1vcnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9zZXRfbWVtb3J5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuIFxuLXN0cnVjdCBwYWdlYXR0cl9tYXNrcyB7XG4tXHRwZ3Byb3RfdCBzZXRfbWFzaztcbi1cdHBncHJvdF90IGNsZWFyX21hc2s7XG4tfTtcbi1cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcGFnZWF0dHJfbWFza3ModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9wYWdlYXR0cl9tYXNrcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWwpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBuZXdfdmFsID0gdmFsO1xuLVx0c3RydWN0IHBhZ2VhdHRyX21hc2tzICptYXNrcyA9IHdhbGstXHUwMDNlcHJpdmF0ZTtcbi1cbi1cdG5ld192YWwgXHUwMDI2PSB+KHBncHJvdF92YWwobWFza3MtXHUwMDNlY2xlYXJfbWFzaykpO1xuLVx0bmV3X3ZhbCB8PSAocGdwcm90X3ZhbChtYXNrcy1cdTAwM2VzZXRfbWFzaykpO1xuK1x0dmFsIFx1MDAyNj0gfnBncHJvdF92YWwoY3BhLVx1MDAzZW1hc2tfY2xyKTtcbitcdHZhbCB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4tXHRyZXR1cm4gbmV3X3ZhbDtcbitcdHJldHVybiB2YWw7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcGdkX2VudHJ5KHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbi1cdHBnZF90IHZhbCA9IHBnZHBfZ2V0KHBnZCk7XG4tXG4tXHRpZiAocGdkX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3BnZChzZXRfcGFnZWF0dHJfbWFza3MocGdkX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wZ2QocGdkLCB2YWwpO1xuLVx0fVxuLVxuLVx0cmV0dXJuIDA7XG4tfVxuK1x0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXHUwMDNla3B0ZSk7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkKTtcbitcdHVuc2lnbmVkIGxvbmcgbmV3X3ZhbCA9IHNldF9wYWdlYXR0cl9tYXNrcyhjcGEsIHZhbCk7XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wNGRfZW50cnkocDRkX3QgKnA0ZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4te1xuLVx0cDRkX3QgdmFsID0gcDRkcF9nZXQocDRkKTtcbitcdGNwYS1cdTAwM2VwZm4gPSBwdGVfcGZuKG9sZCkgKyAoKHNkLVx1MDAzZWFkZHJlc3MgXHUwMDI2IChzZC1cdTAwM2Vwc2l6ZSAtIDEpKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4tXHRpZiAocDRkX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3A0ZChzZXRfcGFnZWF0dHJfbWFza3MocDRkX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wNGQocDRkLCB2YWwpO1xuK1x0aWYgKG5ld192YWwgIT0gdmFsKSB7XG4rXHRcdHNldF9wdGUoc2QtXHUwMDNla3B0ZSwgX19wdGUobmV3X3ZhbCkpO1xuK1x0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHVkX2VudHJ5KHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK2ludCBhcmNoX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXG4ge1xuLVx0cHVkX3QgdmFsID0gcHVkcF9nZXQocHVkKTtcbi1cbi1cdGlmIChwdWRfbGVhZih2YWwpKSB7XG4tXHRcdHZhbCA9IF9fcHVkKHNldF9wYWdlYXR0cl9tYXNrcyhwdWRfdmFsKHZhbCksIHdhbGspKTtcbi1cdFx0c2V0X3B1ZChwdWQsIHZhbCk7XG4tXHR9XG4rXHRXQVJOX09OX09OQ0UoMSk7XG4gXG4tXHRyZXR1cm4gMDtcbitcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbi1zdGF0aWMgaW50IHBhZ2VhdHRyX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBuZXh0LCBzdHJ1Y3QgbW1fd2FsayAqd2Fsaylcbit2b2lkIGFyY2hfY2hhbmdlX3B0ZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHQgICAgIHB0ZV90ICprcHRlLCBwdGVfdCBvbGRfcHRlLCBib29sIG54LCBib29sIHJ3KVxuIHtcbi1cdHBtZF90IHZhbCA9IHBtZHBfZ2V0KHBtZCk7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCA9IHB0ZV92YWwob2xkX3B0ZSk7XG4rXHRwdGVfdCBuZXdfcHRlID0gX19wdGUoc2V0X3BhZ2VhdHRyX21hc2tzKGNwYSwgdmFsKSk7XG4gXG4tXHRpZiAocG1kX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3BtZChzZXRfcGFnZWF0dHJfbWFza3MocG1kX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wbWQocG1kLCB2YWwpO1xuLVx0fVxuK1x0Y3BhLVx1MDAzZXBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XG4gXG4tXHRyZXR1cm4gMDtcbitcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcbitcdFx0c2V0X3B0ZShrcHRlLCBuZXdfcHRlKTtcbitcdFx0Y3BhLVx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcbitcdH1cbiB9XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdGVfZW50cnkocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXG4rXHRcdFx0ICAgaW50IHByaW1hcnkpXG4ge1xuLVx0cHRlX3QgdmFsID0gcHRlcF9nZXQocHRlKTtcbi1cbi1cdHZhbCA9IF9fcHRlKHNldF9wYWdlYXR0cl9tYXNrcyhwdGVfdmFsKHZhbCksIHdhbGspKTtcbi1cdHNldF9wdGUocHRlLCB2YWwpO1xuK1x0LypcbitcdCAqIFRoZSBkaXJlY3QgbWFwIGhhcyBubyBwYWdlIHRhYmxlcyBhbmQgdm1hbGxvYyByYW5nZXMgbWF5IGNvbnRhaW5cbitcdCAqIGhvbGVzLiBCb3RoIGFyZSBzaWxlbnRseSBza2lwcGVkLlxuK1x0ICovXG4rXHRjcGEtXHUwMDNlbnVtcGFnZXMgPSAxO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHRlX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG5leHQsXG4tXHRcdFx0ICAgICBpbnQgZGVwdGgsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIHtcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IG1tX3dhbGtfb3BzIHBhZ2VhdHRyX29wcyA9IHtcbi1cdC5wZ2RfZW50cnkgPSBwYWdlYXR0cl9wZ2RfZW50cnksXG4tXHQucDRkX2VudHJ5ID0gcGFnZWF0dHJfcDRkX2VudHJ5LFxuLVx0LnB1ZF9lbnRyeSA9IHBhZ2VhdHRyX3B1ZF9lbnRyeSxcbi1cdC5wbWRfZW50cnkgPSBwYWdlYXR0cl9wbWRfZW50cnksXG4tXHQucHRlX2VudHJ5ID0gcGFnZWF0dHJfcHRlX2VudHJ5LFxuLVx0LnB0ZV9ob2xlID0gcGFnZWF0dHJfcHRlX2hvbGUsXG4tXHQud2Fsa19sb2NrID0gUEdXQUxLX1JETE9DSyxcbi19O1xuLVxuLXN0YXRpYyBpbnQgX19zZXRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzLCBwZ3Byb3RfdCBzZXRfbWFzaywgcGdwcm90X3QgY2xlYXJfbWFzaylcbit2b2lkIGFyY2hfY3BhX2ZsdXNoKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgZXJyKVxuIHtcbi1cdGludCByZXQ7XG4tXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcjtcbi1cdHVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBQQUdFX1NJWkUgKiBudW1wYWdlcztcbi1cdHN0cnVjdCBwYWdlYXR0cl9tYXNrcyBtYXNrcyA9IHtcbi1cdFx0LnNldF9tYXNrID0gc2V0X21hc2ssXG4tXHRcdC5jbGVhcl9tYXNrID0gY2xlYXJfbWFza1xuLVx0fTtcbi1cbi1cdGlmICghbnVtcGFnZXMpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0bW1hcF93cml0ZV9sb2NrKFx1MDAyNmluaXRfbW0pO1xuLVx0cmV0ID0gd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCBcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFx1MDAyNm1hc2tzKTtcbi1cdG1tYXBfd3JpdGVfdW5sb2NrKFx1MDAyNmluaXRfbW0pO1xuLVxuLVx0Zmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKTtcbitcdGlmIChlcnIgfHwgY3BhLVx1MDAzZWZvcmNlX2ZsdXNoX2FsbCB8fFxuK1x0ICAgIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IChDUEFfQVJSQVkgfCBDUEFfUEFHRVNfQVJSQVkpKSkge1xuK1x0XHRmbHVzaF90bGJfYWxsKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbiBcbi1cdHJldHVybiByZXQ7XG4rXHRmbHVzaF90bGJfa2VybmVsX3JhbmdlKCpjcGEtXHUwMDNldmFkZHIsICpjcGEtXHUwMDNldmFkZHIgKyBjcGEtXHUwMDNlbnVtcGFnZXMgKiBQQUdFX1NJWkUpO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuQEAgLTEzMSw3ICs4OCw3IEBAIGludCBzZXRfbWVtb3J5X3godW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpKTtcbitcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9OT19FWEVDKSwgMCk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuQEAgLTEzOSw3ICs5Niw3IEBAIGludCBzZXRfbWVtb3J5X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIFx0aWYgKGFkZHIgXHUwMDNjIHZtX21hcF9iYXNlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpLCBfX3BncHJvdCgwKSk7XG4rXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX05PX0VYRUMpLCAwKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG5AQCAtMTQ3LDcgKzEwNCw3IEBAIGludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIFx0aWYgKGFkZHIgXHUwMDNjIHZtX21hcF9iYXNlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSk7XG4rXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihcdTAwMjZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfV1JJVEUgfCBfUEFHRV9ESVJUWSksIDApO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbkBAIC0xNTUsODQgKzExMiw3NSBAQCBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbiBcdGlmIChhZGRyIFx1MDAzYyB2bV9tYXBfYmFzZSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSwgX19wZ3Byb3QoMCkpO1xuK1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9XUklURSB8IF9QQUdFX0RJUlRZKSwgMCk7XG4gfVxuIFxuIGJvb2wga2VybmVsX3BhZ2VfcHJlc2VudChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4tXHRwZ2RfdCAqcGdkO1xuLVx0cDRkX3QgKnA0ZDtcbi1cdHB1ZF90ICpwdWQ7XG4tXHRwbWRfdCAqcG1kO1xuLVx0cHRlX3QgKnB0ZTtcbitcdHVuc2lnbmVkIGludCBsZXZlbDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcbitcdHB0ZV90ICpwdGU7XG4gXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiBtZW1ibG9ja19pc19tZW1vcnkoX19wYShhZGRyKSk7XG4gXG4tXHRwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7XG4tXHRpZiAocGdkX25vbmUocGdkcF9nZXQocGdkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwZ2RfbGVhZihwZ2RwX2dldChwZ2QpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwNGQgPSBwNGRfb2Zmc2V0KHBnZCwgYWRkcik7XG4tXHRpZiAocDRkX25vbmUocDRkcF9nZXQocDRkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwNGRfbGVhZihwNGRwX2dldChwNGQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwdWQgPSBwdWRfb2Zmc2V0KHA0ZCwgYWRkcik7XG4tXHRpZiAocHVkX25vbmUocHVkcF9nZXQocHVkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwdWRfbGVhZihwdWRwX2dldChwdWQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7XG4tXHRpZiAocG1kX25vbmUocG1kcF9nZXQocG1kKSkpXG4rXHRwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCBcdTAwMjZsZXZlbCk7XG4rXHRpZiAoIXB0ZSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuLVx0aWYgKHBtZF9sZWFmKHBtZHBfZ2V0KHBtZCkpKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbiBcbi1cdHB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7XG4gXHRyZXR1cm4gcHRlX3ByZXNlbnQocHRlcF9nZXQocHRlKSk7XG4gfVxuIFxuIGludCBzZXRfZGlyZWN0X21hcF9kZWZhdWx0X25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuK1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2YWRkcixcbitcdFx0XHRcdC5wZ2QgPSBOVUxMLFxuK1x0XHRcdFx0Lm51bXBhZ2VzID0gMSxcbitcdFx0XHRcdC5tYXNrX3NldCA9IFBBR0VfS0VSTkVMLFxuK1x0XHRcdFx0Lm1hc2tfY2xyID0gX19wZ3Byb3QoMCksXG4rXHRcdFx0XHQuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTtcbiBcbiBcdGlmIChhZGRyIFx1MDAzYyB2bV9tYXBfYmFzZSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIDEsIFBBR0VfS0VSTkVMLCBfX3BncHJvdCgwKSk7XG4rXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX2ludmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4rXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcdTAwMjZhZGRyLFxuK1x0XHRcdFx0LnBnZCA9IE5VTEwsXG4rXHRcdFx0XHQubnVtcGFnZXMgPSAxLFxuK1x0XHRcdFx0Lm1hc2tfc2V0ID0gX19wZ3Byb3QoMCksXG4rXHRcdFx0XHQubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVkFMSUQpLFxuK1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4gXG4gXHRpZiAoYWRkciBcdTAwM2Mgdm1fbWFwX2Jhc2UpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCAxLCBfX3BncHJvdCgwKSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKSk7XG4rXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX3ZhbGlkX25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG5yLCBib29sIHZhbGlkKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcbi1cdHBncHJvdF90IHNldCwgY2xlYXI7XG4rXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcdTAwMjZhZGRyLFxuK1x0XHRcdFx0LnBnZCA9IE5VTEwsXG4rXHRcdFx0XHQubnVtcGFnZXMgPSBucixcbitcdFx0XHRcdC5mbGFncyA9IENQQV9OT19DSEVDS19BTElBUyB9O1xuIFxuIFx0aWYgKGFkZHIgXHUwMDNjIHZtX21hcF9iYXNlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiBcdGlmICh2YWxpZCkge1xuLVx0XHRzZXQgPSBQQUdFX0tFUk5FTDtcbi1cdFx0Y2xlYXIgPSBfX3BncHJvdCgwKTtcbitcdFx0Y3BhLm1hc2tfc2V0ID0gUEFHRV9LRVJORUw7XG4rXHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KDApO1xuIFx0fSBlbHNlIHtcbi1cdFx0c2V0ID0gX19wZ3Byb3QoMCk7XG4tXHRcdGNsZWFyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1ZBTElEKTtcbitcdFx0Y3BhLm1hc2tfc2V0ID0gX19wZ3Byb3QoMCk7XG4rXHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9WQUxJRCk7XG4gXHR9XG4gXG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KGFkZHIsIG5yLCBzZXQsIGNsZWFyKTtcbitcdHJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcdTAwMjZjcGEsIDEpO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWdcbmluZGV4IDNmMGE2NDcyMThlNDA3Li41ZDA2OWJmMjkwY2U3OCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvS2NvbmZpZ1xuKysrIGIvYXJjaC9yaXNjdi9LY29uZmlnXG5AQCAtNDgsNiArNDgsNyBAQCBjb25maWcgUklTQ1ZcbiBcdHNlbGVjdCBBUkNIX0hBU19QVEVfU1BFQ0lBTFxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NFVF9ESVJFQ1RfTUFQIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NFVF9NRU1PUlkgaWYgTU1VXG4rXHRzZWxlY3QgR0VORVJJQ19TRVRfTUVNT1JZIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NUUklDVF9NT0RVTEVfUldYIGlmIE1NVVxuIFx0c2VsZWN0IEFSQ0hfSEFTX1NZTkNfQ09SRV9CRUZPUkVfVVNFUk1PREVcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG5pbmRleCA1ZDU3NTZiZGE4MmUzZC4uMDI3YjNlN2U0ZjE3N2QgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxuKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbkBAIC04MTksNiArODE5LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXG4gXHRyZXR1cm4gcHRlX3dyaXRlKHB1ZF9wdGUocHVkKSk7XG4gfVxuIFxuKyNkZWZpbmUgcGdkX3dyaXRlIHBnZF93cml0ZVxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXG4re1xuK1x0cmV0dXJuIHBnZF92YWwocGdkKSBcdTAwMjYgX1BBR0VfV1JJVEU7XG4rfVxuK1xuKyNkZWZpbmUgcDRkX3dyaXRlIHA0ZF93cml0ZVxuK3N0YXRpYyBpbmxpbmUgaW50IHA0ZF93cml0ZShwNGRfdCBwNGQpXG4re1xuK1x0cmV0dXJuIHA0ZF92YWwocDRkKSBcdTAwMjYgX1BBR0VfV1JJVEU7XG4rfVxuK1xuKyNkZWZpbmUgcGdkX2V4ZWMgcGdkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXG4re1xuK1x0cmV0dXJuICEhKHBnZF92YWwocGdkKSBcdTAwMjYgX1BBR0VfRVhFQyk7XG4rfVxuK1xuKyNkZWZpbmUgcDRkX2V4ZWMgcDRkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXG4re1xuK1x0cmV0dXJuICEhKHA0ZF92YWwocDRkKSBcdTAwMjYgX1BBR0VfRVhFQyk7XG4rfVxuK1xuKyNkZWZpbmUgcHVkX2V4ZWMgcHVkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwdWRfZXhlYyhwdWRfdCBwdWQpXG4re1xuK1x0cmV0dXJuICEhKHB1ZF92YWwocHVkKSBcdTAwMjYgX1BBR0VfRVhFQyk7XG4rfVxuK1xuKyNkZWZpbmUgcG1kX2V4ZWMgcG1kX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXG4re1xuK1x0cmV0dXJuICEhKHBtZF92YWwocG1kKSBcdTAwMjYgX1BBR0VfRVhFQyk7XG4rfVxuK1xuICNkZWZpbmUgcG1kX2RpcnR5IHBtZF9kaXJ0eVxuIHN0YXRpYyBpbmxpbmUgaW50IHBtZF9kaXJ0eShwbWRfdCBwbWQpXG4ge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbmluZGV4IGVmNTllMTcxNmEyY2ZkLi40YmE0NmEzMzEwMzQzMyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuQEAgLTcsNiArNyw4IEBAXG4gI2RlZmluZSBfQVNNX1JJU0NWX1NFVF9NRU1PUllfSFxuIFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xuKyNpbmNsdWRlIFx1MDAzY2FzbS9wYWdlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS5oXHUwMDNlXG4gLypcbiAgKiBGdW5jdGlvbnMgdG8gY2hhbmdlIG1lbW9yeSBhdHRyaWJ1dGVzLlxuICAqL1xuQEAgLTI2LDYgKzI4LDExIEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHNldF9rZXJuZWxfbWVtb3J5KGNoYXIgKnN0YXJ0cCwgY2hhciAqZW5kcCxcbiBcbiBcdHJldHVybiBzZXRfbWVtb3J5KHN0YXJ0LCBudW1fcGFnZXMpO1xuIH1cbitcbitzdGF0aWMgaW5saW5lIGJvb2wgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXModW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4pXG4re1xuK1x0cmV0dXJuICFpc19saW5lYXJfbWFwcGluZyh2YWRkcik7XG4rfVxuICNlbHNlXG4gc3RhdGljIGlubGluZSBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykgeyByZXR1cm4gMDsgfVxuIHN0YXRpYyBpbmxpbmUgaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpIHsgcmV0dXJuIDA7IH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmNcbmluZGV4IDNmNzZkYjNkMjc2OTkyLi42NmEyMGZjM2Q4MDU3NCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvbW0vcGFnZWF0dHIuY1xuKysrIGIvYXJjaC9yaXNjdi9tbS9wYWdlYXR0ci5jXG5AQCAtMyw0MDIgKzMsMjQyIEBAXG4gICogQ29weXJpZ2h0IChDKSAyMDE5IFNpRml2ZVxuICAqL1xuIFxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2V3YWxrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGd0YWJsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2V0X21lbW9yeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3RsYmZsdXNoLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2Nhc20vYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vc2V0X21lbW9yeS5oXHUwMDNlXG4gXG4tc3RydWN0IHBhZ2VhdHRyX21hc2tzIHtcbi1cdHBncHJvdF90IHNldF9tYXNrO1xuLVx0cGdwcm90X3QgY2xlYXJfbWFzaztcbi19O1xuLVxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9wYWdlYXR0cl9tYXNrcyh1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4te1xuLVx0c3RydWN0IHBhZ2VhdHRyX21hc2tzICptYXNrcyA9IHdhbGstXHUwMDNlcHJpdmF0ZTtcbi1cdHVuc2lnbmVkIGxvbmcgbmV3X3ZhbCA9IHZhbDtcbi1cbi1cdG5ld192YWwgXHUwMDI2PSB+KHBncHJvdF92YWwobWFza3MtXHUwMDNlY2xlYXJfbWFzaykpO1xuLVx0bmV3X3ZhbCB8PSAocGdwcm90X3ZhbChtYXNrcy1cdTAwM2VzZXRfbWFzaykpO1xuLVxuLVx0cmV0dXJuIG5ld192YWw7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcDRkX2VudHJ5KHA0ZF90ICpwNGQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgKnNkKVxuIHtcbi1cdHA0ZF90IHZhbCA9IHA0ZHBfZ2V0KHA0ZCk7XG4tXG4tXHRpZiAocDRkX2xlYWYodmFsKSkge1xuLVx0XHR2YWwgPSBfX3A0ZChzZXRfcGFnZWF0dHJfbWFza3MocDRkX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRcdHNldF9wNGQocDRkLCB2YWwpO1xuLVx0fVxuK1x0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXHUwMDNla3B0ZSk7XG4rXHRwZ3Byb3RfdCBvbGRfcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbitcdHBncHJvdF90IG5ld19wcm90ID0gb2xkX3Byb3Q7XG4rXHR1bnNpZ25lZCBsb25nIG9sZF9wZm4gPSBwdGVfcGZuKG9sZCk7XG4rXHR1bnNpZ25lZCBsb25nIGxwYWRkciwgbnVtcGFnZXM7XG4gXG4tXHRyZXR1cm4gMDtcbi19XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdWRfZW50cnkocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4te1xuLVx0cHVkX3QgdmFsID0gcHVkcF9nZXQocHVkKTtcbi1cbi1cdGlmIChwdWRfbGVhZih2YWwpKSB7XG4tXHRcdHZhbCA9IF9fcHVkKHNldF9wYWdlYXR0cl9tYXNrcyhwdWRfdmFsKHZhbCksIHdhbGspKTtcbi1cdFx0c2V0X3B1ZChwdWQsIHZhbCk7XG4tXHR9XG4rXHQvKlxuK1x0ICogUmVjb3JkIHRoZSBwZm4gbWFwcGVkIGF0IEBhZGRyZXNzIHNvIHRoZSBhbGlhcyBjaGVjayBjYW4gbG9jYXRlIHRoZVxuK1x0ICogbWF0Y2hpbmcgbGluZWFyIG1hcCBlbnRyeS5cbitcdCAqL1xuK1x0Y3BhLVx1MDAzZXBmbiA9IG9sZF9wZm4gKyAoKHNkLVx1MDAzZWFkZHJlc3MgXHUwMDI2IChzZC1cdTAwM2Vwc2l6ZSAtIDEpKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXG4tXHRyZXR1cm4gMDtcbi19XG4rXHQvKiBJZiB0aGUgcHJvdGVjdGlvbnMgZG8gbm90IGNoYW5nZSwga2VlcCB0aGUgbGFyZ2UgcGFnZSBpbnRhY3QuICovXG4rXHRpZiAocGdwcm90X3ZhbChuZXdfcHJvdCkgPT0gcGdwcm90X3ZhbChvbGRfcHJvdCkpXG4rXHRcdHJldHVybiAwO1xuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi1cdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuLXtcbi1cdHBtZF90IHZhbCA9IHBtZHBfZ2V0KHBtZCk7XG4rXHQvKiBJZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBjb3ZlciB0aGUgd2hvbGUgbGFyZ2UgcGFnZSwgc3BsaXQgaXQuICovXG4rXHRscGFkZHIgPSBzZC1cdTAwM2VhZGRyZXNzIFx1MDAyNiBzZC1cdTAwM2VwbWFzaztcbitcdG51bXBhZ2VzID0gc2QtXHUwMDNlcHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRpZiAoc2QtXHUwMDNlYWRkcmVzcyAhPSBscGFkZHIgfHwgY3BhLVx1MDAzZW51bXBhZ2VzICE9IG51bXBhZ2VzKVxuK1x0XHRyZXR1cm4gMTtcbiBcbi1cdGlmIChwbWRfbGVhZih2YWwpKSB7XG4tXHRcdHZhbCA9IF9fcG1kKHNldF9wYWdlYXR0cl9tYXNrcyhwbWRfdmFsKHZhbCksIHdhbGspKTtcbi1cdFx0c2V0X3BtZChwbWQsIHZhbCk7XG4tXHR9XG4rXHQvKiBUaGUgd2hvbGUgbGFyZ2UgcGFnZSBpcyBjb3ZlcmVkOiB1cGRhdGUgaXQgaW4gcGxhY2UuICovXG4rXHRzZXRfcHRlKHNkLVx1MDAzZWtwdGUsIHBmbl9wdGUob2xkX3BmbiwgbmV3X3Byb3QpKTtcbitcdGNwYS1cdTAwM2VmbGFncyB8PSBDUEFfRkxVU0hUTEI7XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBwYWdlYXR0cl9wdGVfZW50cnkocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbmV4dCwgc3RydWN0IG1tX3dhbGsgKndhbGspXG4rc3RhdGljIHZvaWQgc3BsaXRfc2V0X3B0ZXMocHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHBmbmluYyxcbitcdFx0XHQgICBwZ3Byb3RfdCBwcm90KVxuIHtcbi1cdHB0ZV90IHZhbCA9IHB0ZXBfZ2V0KHB0ZSk7XG4tXG4tXHR2YWwgPSBfX3B0ZShzZXRfcGFnZWF0dHJfbWFza3MocHRlX3ZhbCh2YWwpLCB3YWxrKSk7XG4tXHRzZXRfcHRlKHB0ZSwgdmFsKTtcbitcdHVuc2lnbmVkIGludCBpO1xuIFxuLVx0cmV0dXJuIDA7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBQVFJTX1BFUl9QVEU7ICsraSwgKytwdGVwLCBwZm4gKz0gcGZuaW5jKVxuK1x0XHRzZXRfcHRlKHB0ZXAsIHBmbl9wdGUocGZuLCBwcm90KSk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcGFnZWF0dHJfcHRlX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG5leHQsXG4tXHRcdFx0ICAgICBpbnQgZGVwdGgsIHN0cnVjdCBtbV93YWxrICp3YWxrKVxuK2ludCBhcmNoX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXG4ge1xuLVx0LyogTm90aGluZyB0byBkbyBoZXJlICovXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBtbV93YWxrX29wcyBwYWdlYXR0cl9vcHMgPSB7XG4tXHQucDRkX2VudHJ5ID0gcGFnZWF0dHJfcDRkX2VudHJ5LFxuLVx0LnB1ZF9lbnRyeSA9IHBhZ2VhdHRyX3B1ZF9lbnRyeSxcbi1cdC5wbWRfZW50cnkgPSBwYWdlYXR0cl9wbWRfZW50cnksXG4tXHQucHRlX2VudHJ5ID0gcGFnZWF0dHJfcHRlX2VudHJ5LFxuLVx0LnB0ZV9ob2xlID0gcGFnZWF0dHJfcHRlX2hvbGUsXG4tXHQud2Fsa19sb2NrID0gUEdXQUxLX1JETE9DSyxcbi19O1xuLVxuICNpZmRlZiBDT05GSUdfNjRCSVRcbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcG1kKHB1ZF90ICpwdWRwLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpXG4te1xuLVx0cG1kX3QgKnBtZHA7XG4tXHR1bnNpZ25lZCBsb25nIG5leHQ7XG4tXG4tXHRwbWRwID0gcG1kX29mZnNldChwdWRwLCB2YWRkcik7XG4tXG4tXHRkbyB7XG4tXHRcdG5leHQgPSBwbWRfYWRkcl9lbmQodmFkZHIsIGVuZCk7XG4tXG4tXHRcdGlmIChuZXh0IC0gdmFkZHIgXHUwMDNlPSBQTURfU0laRSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHZhZGRyIFx1MDAzYz0gKHZhZGRyIFx1MDAyNiBQTURfTUFTSykgXHUwMDI2XHUwMDI2IGVuZCBcdTAwM2U9IG5leHQpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdGlmIChwbWRfbGVhZihwbWRwX2dldChwbWRwKSkpIHtcbi1cdFx0XHRzdHJ1Y3QgcGFnZSAqcHRlX3BhZ2U7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBfcG1kX3BmbihwbWRwX2dldChwbWRwKSk7XG4tXHRcdFx0cGdwcm90X3QgcHJvdCA9IF9fcGdwcm90KHBtZF92YWwocG1kcF9nZXQocG1kcCkpIFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xuLVx0XHRcdHB0ZV90ICpwdGVwX25ldztcbi1cdFx0XHRpbnQgaTtcbi1cbi1cdFx0XHRwdGVfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7XG4tXHRcdFx0aWYgKCFwdGVfcGFnZSlcbi1cdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuK1x0c3RydWN0IHBhZ2UgKmJhc2UgPSBwdGRlc2NfcGFnZShzZC1cdTAwM2VwdGRlc2MpO1xuK1x0cHRlX3Qgb2xkID0gcHRlcF9nZXQoc2QtXHUwMDNla3B0ZSk7XG4rXHRwZ3Byb3RfdCBwcm90ID0gX19wZ3Byb3QocHRlX3ZhbChvbGQpIFx1MDAyNiB+X1BBR0VfUEZOX01BU0spO1xuK1x0dW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKG9sZCk7XG4rXHR1bnNpZ25lZCBsb25nIHBmbmluYztcbitcbitcdHN3aXRjaCAoc2QtXHUwMDNlbGV2ZWwpIHtcbitcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XG4rXHRcdHBmbmluYyA9IDE7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcbitcdFx0cGZuaW5jID0gUE1EX1NJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1A0RDpcbitcdFx0cGZuaW5jID0gUFVEX1NJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4gXG4tXHRcdFx0cHRlcF9uZXcgPSAocHRlX3QgKilwYWdlX2FkZHJlc3MocHRlX3BhZ2UpO1xuLVx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBUUlNfUEVSX1BURTsgKytpLCArK3B0ZXBfbmV3KVxuLVx0XHRcdFx0c2V0X3B0ZShwdGVwX25ldywgcGZuX3B0ZShwZm4gKyBpLCBwcm90KSk7XG4rXHRzcGxpdF9zZXRfcHRlcygocHRlX3QgKilwYWdlX2FkZHJlc3MoYmFzZSksIHBmbiwgcGZuaW5jLCBwcm90KTtcbiBcbi1cdFx0XHRzbXBfd21iKCk7XG4rXHRzbXBfd21iKCk7XG4rXHRzZXRfcHRlKHNkLVx1MDAzZWtwdGUsIHBmbl9wdGUocGFnZV90b19wZm4oYmFzZSksIFBBR0VfVEFCTEUpKTtcbiBcbi1cdFx0XHRzZXRfcG1kKHBtZHAsIHBmbl9wbWQocGFnZV90b19wZm4ocHRlX3BhZ2UpLCBQQUdFX1RBQkxFKSk7XG4tXHRcdH1cbi1cdH0gd2hpbGUgKHBtZHArKywgdmFkZHIgPSBuZXh0LCB2YWRkciAhPSBlbmQpO1xuK1x0Y3BhLVx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcbitcdGNwYS1cdTAwM2Vmb3JjZV9mbHVzaF9hbGwgPSAxO1xuIFxuIFx0cmV0dXJuIDA7XG4rI2Vsc2VcbitcdFdBUk5fT05fT05DRSgxKTtcbitcdHJldHVybiAtRUlOVkFMO1xuKyNlbmRpZlxuIH1cbiBcbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcHVkKHA0ZF90ICpwNGRwLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBlbmQpXG4rdm9pZCBhcmNoX2NoYW5nZV9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0ICAgICBwdGVfdCAqa3B0ZSwgcHRlX3Qgb2xkX3B0ZSwgYm9vbCBueCwgYm9vbCBydylcbiB7XG4tXHRwdWRfdCAqcHVkcDtcbi1cdHVuc2lnbmVkIGxvbmcgbmV4dDtcbi1cdGludCByZXQ7XG4tXG4tXHRwdWRwID0gcHVkX29mZnNldChwNGRwLCB2YWRkcik7XG4tXG4tXHRkbyB7XG4tXHRcdG5leHQgPSBwdWRfYWRkcl9lbmQodmFkZHIsIGVuZCk7XG4tXG4tXHRcdGlmIChuZXh0IC0gdmFkZHIgXHUwMDNlPSBQVURfU0laRSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHZhZGRyIFx1MDAzYz0gKHZhZGRyIFx1MDAyNiBQVURfTUFTSykgXHUwMDI2XHUwMDI2IGVuZCBcdTAwM2U9IG5leHQpXG4tXHRcdFx0Y29udGludWU7XG4rXHRwZ3Byb3RfdCBuZXdfcHJvdCA9IF9fcGdwcm90KHB0ZV92YWwob2xkX3B0ZSkgXHUwMDI2IH5fUEFHRV9QRk5fTUFTSyk7XG4rXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XG4rXHRwdGVfdCBuZXdfcHRlO1xuIFxuLVx0XHRpZiAocHVkX2xlYWYocHVkcF9nZXQocHVkcCkpKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnBtZF9wYWdlO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gX3B1ZF9wZm4ocHVkcF9nZXQocHVkcCkpO1xuLVx0XHRcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwdWRfdmFsKHB1ZHBfZ2V0KHB1ZHApKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbi1cdFx0XHRwbWRfdCAqcG1kcF9uZXc7XG4tXHRcdFx0aW50IGk7XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4tXHRcdFx0cG1kX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xuLVx0XHRcdGlmICghcG1kX3BhZ2UpXG4tXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcdG5ld19wdGUgPSBwZm5fcHRlKHBmbiwgbmV3X3Byb3QpO1xuK1x0Y3BhLVx1MDAzZXBmbiA9IHBmbjtcbiBcbi1cdFx0XHRwbWRwX25ldyA9IChwbWRfdCAqKXBhZ2VfYWRkcmVzcyhwbWRfcGFnZSk7XG4tXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUFRSU19QRVJfUE1EOyArK2ksICsrcG1kcF9uZXcpXG4tXHRcdFx0XHRzZXRfcG1kKHBtZHBfbmV3LFxuLVx0XHRcdFx0XHRwZm5fcG1kKHBmbiArICgoaSAqIFBNRF9TSVpFKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCksIHByb3QpKTtcbi1cbi1cdFx0XHRzbXBfd21iKCk7XG4tXG4tXHRcdFx0c2V0X3B1ZChwdWRwLCBwZm5fcHVkKHBhZ2VfdG9fcGZuKHBtZF9wYWdlKSwgUEFHRV9UQUJMRSkpO1xuLVx0XHR9XG4tXG4tXHRcdHJldCA9IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcG1kKHB1ZHAsIHZhZGRyLCBuZXh0KTtcbi1cdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuLVx0fSB3aGlsZSAocHVkcCsrLCB2YWRkciA9IG5leHQsIHZhZGRyICE9IGVuZCk7XG4tXG4tXHRyZXR1cm4gMDtcbitcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcbitcdFx0c2V0X3B0ZShrcHRlLCBuZXdfcHRlKTtcbitcdFx0Y3BhLVx1MDAzZWZsYWdzIHw9IENQQV9GTFVTSFRMQjtcbitcdH1cbiB9XG4gXG4tc3RhdGljIGludCBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3A0ZChwZ2RfdCAqcGdkcCxcbi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKVxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHZhZGRyLFxuK1x0XHRcdCAgIGludCBwcmltYXJ5KVxuIHtcbi1cdHA0ZF90ICpwNGRwO1xuLVx0dW5zaWduZWQgbG9uZyBuZXh0O1xuLVx0aW50IHJldDtcbi1cbi1cdHA0ZHAgPSBwNGRfb2Zmc2V0KHBnZHAsIHZhZGRyKTtcbi1cbi1cdGRvIHtcbi1cdFx0bmV4dCA9IHA0ZF9hZGRyX2VuZCh2YWRkciwgZW5kKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgW3ZhZGRyOyBlbmRdIGNvbnRhaW5zIFt2YWRkciBcdTAwMjYgUDREX01BU0s7IG5leHRdLCB3ZSBkb24ndFxuLVx0XHQgKiBuZWVkIHRvIHNwbGl0LCB3ZSdsbCBjaGFuZ2UgdGhlIHByb3RlY3Rpb25zIG9uIHRoZSB3aG9sZSBQNEQuXG4tXHRcdCAqL1xuLVx0XHRpZiAobmV4dCAtIHZhZGRyIFx1MDAzZT0gUDREX1NJWkUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICB2YWRkciBcdTAwM2M9ICh2YWRkciBcdTAwMjYgUDREX01BU0spIFx1MDAyNlx1MDAyNiBlbmQgXHUwMDNlPSBuZXh0KVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRpZiAocDRkX2xlYWYocDRkcF9nZXQocDRkcCkpKSB7XG4tXHRcdFx0c3RydWN0IHBhZ2UgKnB1ZF9wYWdlO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gX3A0ZF9wZm4ocDRkcF9nZXQocDRkcCkpO1xuLVx0XHRcdHBncHJvdF90IHByb3QgPSBfX3BncHJvdChwNGRfdmFsKHA0ZHBfZ2V0KHA0ZHApKSBcdTAwMjYgfl9QQUdFX1BGTl9NQVNLKTtcbi1cdFx0XHRwdWRfdCAqcHVkcF9uZXc7XG4tXHRcdFx0aW50IGk7XG4tXG4tXHRcdFx0cHVkX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpO1xuLVx0XHRcdGlmICghcHVkX3BhZ2UpXG4tXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEZpbGwgdGhlIHB1ZCBsZXZlbCB3aXRoIGxlYWYgcHVkcyB0aGF0IGhhdmUgdGhlIHNhbWVcbi1cdFx0XHQgKiBwcm90ZWN0aW9ucyBhcyB0aGUgbGVhZiBwNGQuXG4tXHRcdFx0ICovXG4tXHRcdFx0cHVkcF9uZXcgPSAocHVkX3QgKilwYWdlX2FkZHJlc3MocHVkX3BhZ2UpO1xuLVx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBUUlNfUEVSX1BVRDsgKytpLCArK3B1ZHBfbmV3KVxuLVx0XHRcdFx0c2V0X3B1ZChwdWRwX25ldyxcbi1cdFx0XHRcdFx0cGZuX3B1ZChwZm4gKyAoKGkgKiBQVURfU0laRSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpLCBwcm90KSk7XG4tXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBNYWtlIHN1cmUgdGhlIHB1ZCBmaWxsaW5nIGlzIG5vdCByZW9yZGVyZWQgd2l0aCB0aGVcbi1cdFx0XHQgKiBwNGQgc3RvcmUgd2hpY2ggY291bGQgcmVzdWx0IGluIHNlZWluZyBhIHBhcnRpYWxseVxuLVx0XHRcdCAqIGZpbGxlZCBwdWQgbGV2ZWwuXG4tXHRcdFx0ICovXG4tXHRcdFx0c21wX3dtYigpO1xuLVxuLVx0XHRcdHNldF9wNGQocDRkcCwgcGZuX3A0ZChwYWdlX3RvX3BmbihwdWRfcGFnZSksIFBBR0VfVEFCTEUpKTtcbi1cdFx0fVxuLVxuLVx0XHRyZXQgPSBfX3NwbGl0X2xpbmVhcl9tYXBwaW5nX3B1ZChwNGRwLCB2YWRkciwgbmV4dCk7XG4tXHRcdGlmIChyZXQpXG4tXHRcdFx0cmV0dXJuIHJldDtcbi1cdH0gd2hpbGUgKHA0ZHArKywgdmFkZHIgPSBuZXh0LCB2YWRkciAhPSBlbmQpO1xuK1x0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbiBcbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcGdkKHBnZF90ICpwZ2RwLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB2YWRkcixcbi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKVxuLXtcbi1cdHVuc2lnbmVkIGxvbmcgbmV4dDtcbi1cdGludCByZXQ7XG4rXHRpZiAoIXByaW1hcnkpXG4rXHRcdHJldHVybiAwO1xuIFxuLVx0ZG8ge1xuLVx0XHRuZXh0ID0gcGdkX2FkZHJfZW5kKHZhZGRyLCBlbmQpO1xuLVx0XHQvKiBXZSBuZXZlciB1c2UgUEdEIG1hcHBpbmdzIGZvciB0aGUgbGluZWFyIG1hcHBpbmcgKi9cbi1cdFx0cmV0ID0gX19zcGxpdF9saW5lYXJfbWFwcGluZ19wNGQocGdkcCwgdmFkZHIsIG5leHQpO1xuLVx0XHRpZiAocmV0KVxuLVx0XHRcdHJldHVybiByZXQ7XG4tXHR9IHdoaWxlIChwZ2RwKyssIHZhZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTtcbitcdC8qIFRoZSBsaW5lYXIgbWFwIGlzIGV4cGVjdGVkIHRvIGhhdmUgaG9sZXMgKi9cbitcdGlmIChpc19saW5lYXJfbWFwcGluZyh2YWRkcikpIHtcbitcdFx0Y3BhLVx1MDAzZXBmbiA9IFBGTl9ET1dOKF9fcGEodmFkZHIpKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4gXG4tXHRyZXR1cm4gMDtcbi19XG4rXHRXQVJOKDEsIFwiQ1BBOiBjYWxsZWQgZm9yIHplcm8gcHRlLiB2YWRkciA9ICVseCBjcGEtXHUwMDNldmFkZHIgPSAlbHhcXG5cIixcbitcdCAgICAgdmFkZHIsICpjcGEtXHUwMDNldmFkZHIpO1xuIFxuLXN0YXRpYyBpbnQgc3BsaXRfbGluZWFyX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpXG4te1xuLVx0cmV0dXJuIF9fc3BsaXRfbGluZWFyX21hcHBpbmdfcGdkKHBnZF9vZmZzZXRfayhzdGFydCksIHN0YXJ0LCBlbmQpO1xuK1x0cmV0dXJuIC1FRkFVTFQ7XG4gfVxuLSNlbmRpZlx0LyogQ09ORklHXzY0QklUICovXG4gXG4tc3RhdGljIGludCBfX3NldF9tZW1vcnkodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsIHBncHJvdF90IHNldF9tYXNrLFxuLVx0XHRcdHBncHJvdF90IGNsZWFyX21hc2spXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpXG4ge1xuLVx0aW50IHJldDtcbi1cdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyO1xuLVx0dW5zaWduZWQgbG9uZyBlbmQgPSBzdGFydCArIFBBR0VfU0laRSAqIG51bXBhZ2VzO1xuLVx0dW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCBsbV9zdGFydDtcbi1cdHVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgbG1fZW5kO1xuLVx0c3RydWN0IHBhZ2VhdHRyX21hc2tzIG1hc2tzID0ge1xuLVx0XHQuc2V0X21hc2sgPSBzZXRfbWFzayxcbi1cdFx0LmNsZWFyX21hc2sgPSBjbGVhcl9tYXNrXG4tXHR9O1xuLVxuLVx0aWYgKCFudW1wYWdlcylcbi1cdFx0cmV0dXJuIDA7XG4rXHRzdHJ1Y3QgY3BhX2RhdGEgYWxpYXNfY3BhO1xuK1x0dW5zaWduZWQgbG9uZyBsYWRkcjtcbiBcbi1cdG1tYXBfd3JpdGVfbG9jayhcdTAwMjZpbml0X21tKTtcbi1cbi0jaWZkZWYgQ09ORklHXzY0QklUXG4gXHQvKlxuLVx0ICogV2UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgcGVybWlzc2lvbnMgb2YgYSBrZXJuZWwgbWFwcGluZywgd2UgbXVzdFxuLVx0ICogYXBwbHkgdGhlIHNhbWUgY2hhbmdlcyB0byBpdHMgbGluZWFyIG1hcHBpbmcgYWxpYXMsIHdoaWNoIG1heSBpbXBseVxuLVx0ICogc3BsaXR0aW5nIGEgaHVnZSBtYXBwaW5nLlxuK1x0ICogY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoKSBvbmx5IGxldHMgbm9uIGxpbmVhciBtYXAgcHJpbWFyaWVzIHJlYWNoXG4rXHQgKiBoZXJlLCBzbyBAY3BhLVx1MDAzZXBmbiBhbHdheXMgaGFzIGEgbGluZWFyIG1hcCBhbGlhcyB0aGF0IG11c3QgcmVjZWl2ZVxuK1x0ICogdGhlIHNhbWUgcHJvdGVjdGlvbiBjaGFuZ2UuXG4gXHQgKi9cbitcdGxhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShQRk5fUEhZUyhjcGEtXHUwMDNlcGZuKSk7XG4gXG4tXHRpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcigodm9pZCAqKXN0YXJ0KSkge1xuLVx0XHRzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhID0gTlVMTDtcbi1cdFx0aW50IGksIHBhZ2Vfc3RhcnQ7XG4tXG4tXHRcdGFyZWEgPSBmaW5kX3ZtX2FyZWEoKHZvaWQgKilzdGFydCk7XG4tXHRcdHBhZ2Vfc3RhcnQgPSAoc3RhcnQgLSAodW5zaWduZWQgbG9uZylhcmVhLVx1MDAzZWFkZHIpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuLVxuLVx0XHRmb3IgKGkgPSBwYWdlX3N0YXJ0OyBpIFx1MDAzYyBwYWdlX3N0YXJ0ICsgbnVtcGFnZXM7ICsraSkge1xuLVx0XHRcdGxtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKGFyZWEtXHUwMDNlcGFnZXNbaV0pO1xuLVx0XHRcdGxtX2VuZCA9IGxtX3N0YXJ0ICsgUEFHRV9TSVpFO1xuLVxuLVx0XHRcdHJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpO1xuLVx0XHRcdGlmIChyZXQpXG4tXHRcdFx0XHRnb3RvIHVubG9jaztcbi1cbi1cdFx0XHRyZXQgPSB3YWxrX2tlcm5lbF9wYWdlX3RhYmxlX3JhbmdlKGxtX3N0YXJ0LCBsbV9lbmQsXG4tXHRcdFx0XHRcdFx0ICAgIFx1MDAyNnBhZ2VhdHRyX29wcywgTlVMTCwgXHUwMDI2bWFza3MpO1xuLVx0XHRcdGlmIChyZXQpXG4tXHRcdFx0XHRnb3RvIHVubG9jaztcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChpc19rZXJuZWxfbWFwcGluZyhzdGFydCkgfHwgaXNfbGluZWFyX21hcHBpbmcoc3RhcnQpKSB7XG4tXHRcdGlmIChpc19rZXJuZWxfbWFwcGluZyhzdGFydCkpIHtcbi1cdFx0XHRsbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWxtX2FsaWFzKHN0YXJ0KTtcbi1cdFx0XHRsbV9lbmQgPSAodW5zaWduZWQgbG9uZylsbV9hbGlhcyhlbmQpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGxtX3N0YXJ0ID0gc3RhcnQ7XG4tXHRcdFx0bG1fZW5kID0gZW5kO1xuLVx0XHR9XG4tXG4tXHRcdHJldCA9IHNwbGl0X2xpbmVhcl9tYXBwaW5nKGxtX3N0YXJ0LCBsbV9lbmQpO1xuLVx0XHRpZiAocmV0KVxuLVx0XHRcdGdvdG8gdW5sb2NrO1xuLVxuLVx0XHRyZXQgPSB3YWxrX2tlcm5lbF9wYWdlX3RhYmxlX3JhbmdlKGxtX3N0YXJ0LCBsbV9lbmQsXG4tXHRcdFx0XHRcdCAgICBcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsIFx1MDAyNm1hc2tzKTtcbi1cdFx0aWYgKHJldClcbi1cdFx0XHRnb3RvIHVubG9jaztcbi1cdH1cbi1cbi1cdHJldCA9ICB3YWxrX2tlcm5lbF9wYWdlX3RhYmxlX3JhbmdlKHN0YXJ0LCBlbmQsIFx1MDAyNnBhZ2VhdHRyX29wcywgTlVMTCxcbi1cdFx0XHRcdCAgICAgXHUwMDI2bWFza3MpO1xuK1x0YWxpYXNfY3BhID0gKmNwYTtcbitcdGFsaWFzX2NwYS52YWRkciA9IFx1MDAyNmxhZGRyO1xuK1x0YWxpYXNfY3BhLmZsYWdzIFx1MDAyNj0gfihDUEFfUEFHRVNfQVJSQVkgfCBDUEFfQVJSQVkpO1xuK1x0YWxpYXNfY3BhLmN1cnBhZ2UgPSAwO1xuIFxuLXVubG9jazpcbi1cdG1tYXBfd3JpdGVfdW5sb2NrKFx1MDAyNmluaXRfbW0pO1xuK1x0LyogVGhlIGxpbmVhciBtYXAgYWxpYXMgbXVzdCBuZXZlciBiZSBtYWRlIGV4ZWN1dGFibGUgKi9cbitcdGFsaWFzX2NwYS5tYXNrX3NldCA9IF9fcGdwcm90KHBncHJvdF92YWwoYWxpYXNfY3BhLm1hc2tfc2V0KSBcdTAwMjYgfl9QQUdFX0VYRUMpO1xuK1x0YWxpYXNfY3BhLm1hc2tfY2xyID0gX19wZ3Byb3QocGdwcm90X3ZhbChhbGlhc19jcGEubWFza19jbHIpIFx1MDAyNiB+X1BBR0VfRVhFQyk7XG4gXG4tXHQvKlxuLVx0ICogV2UgY2FuJ3QgdXNlIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKSBoZXJlIGFzIHdlIG1heSBoYXZlIHNwbGl0IGFcbi1cdCAqIGh1Z2VwYWdlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhhdCwgc28gbGV0J3MgZmx1c2ggZXZlcnl0aGluZy5cbi1cdCAqL1xuLVx0Zmx1c2hfdGxiX2FsbCgpO1xuLSNlbHNlXG4tXHRyZXQgPSAgd2Fsa19rZXJuZWxfcGFnZV90YWJsZV9yYW5nZShzdGFydCwgZW5kLCBcdTAwMjZwYWdlYXR0cl9vcHMsIE5VTEwsXG4tXHRcdFx0XHQgICAgIFx1MDAyNm1hc2tzKTtcbitcdGNwYS1cdTAwM2Vmb3JjZV9mbHVzaF9hbGwgPSAxO1xuIFxuLVx0bW1hcF93cml0ZV91bmxvY2soXHUwMDI2aW5pdF9tbSk7XG4rXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2YWxpYXNfY3BhLCAwKTtcbit9XG4gXG4tXHRmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpO1xuLSNlbmRpZlxuK3ZvaWQgYXJjaF9jcGFfZmx1c2goc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBlcnIpXG4re1xuK1x0aWYgKGVyciB8fCBjcGEtXHUwMDNlZm9yY2VfZmx1c2hfYWxsIHx8XG4rXHQgICAgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpKSB7XG4rXHRcdGZsdXNoX3RsYl9hbGwoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuIFxuLVx0cmV0dXJuIHJldDtcbitcdGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKmNwYS1cdTAwM2V2YWRkcixcbitcdFx0XHQgICAgICAgKmNwYS1cdTAwM2V2YWRkciArIGNwYS1cdTAwM2VudW1wYWdlcyAqIFBBR0VfU0laRSk7XG4gfVxuIFxuIGludCBzZXRfbWVtb3J5X3J3X254KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksXG4tXHRcdFx0ICAgIF9fcGdwcm90KF9QQUdFX0VYRUMpKTtcbitcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2YWRkciwgbnVtcGFnZXMsXG4rXHRcdFx0XHRcdF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksXG4rXHRcdFx0XHRcdF9fcGdwcm90KF9QQUdFX0VYRUMpLCAwLCAwLCBOVUxMKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfcm8odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4ge1xuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUkVBRCksXG4tXHRcdFx0ICAgIF9fcGdwcm90KF9QQUdFX1dSSVRFKSk7XG4rXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SRUFEKSxcbitcdFx0XHRcdFx0X19wZ3Byb3QoX1BBR0VfV1JJVEUpLCAwLCAwLCBOVUxMKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4ge1xuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUkVBRCB8IF9QQUdFX1dSSVRFKSxcbi1cdFx0XHQgICAgX19wZ3Byb3QoMCkpO1xuK1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KFx1MDAyNmFkZHIsIG51bXBhZ2VzLFxuK1x0XHRcdFx0ICAgIF9fcGdwcm90KF9QQUdFX1JFQUQgfCBfUEFHRV9XUklURSksIDApO1xuIH1cbiBcbiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKVxuIHtcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCBfX3BncHJvdCgwKSk7XG4rXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoXHUwMDI2YWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX0VYRUMpLCAwKTtcbiB9XG4gXG4gaW50IHNldF9tZW1vcnlfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpXG4ge1xuLVx0cmV0dXJuIF9fc2V0X21lbW9yeShhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIF9fcGdwcm90KF9QQUdFX0VYRUMpKTtcbitcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKFx1MDAyNmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9FWEVDKSwgMCk7XG4gfVxuIFxuIGludCBzZXRfZGlyZWN0X21hcF9pbnZhbGlkX25vZmx1c2goc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuLVx0cmV0dXJuIF9fc2V0X21lbW9yeSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSksIDEsXG4tXHRcdFx0ICAgIF9fcGdwcm90KDApLCBfX3BncHJvdChfUEFHRV9QUkVTRU5UKSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuK1x0c3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gXHUwMDI2c3RhcnQsXG4rXHRcdFx0XHQucGdkID0gTlVMTCxcbitcdFx0XHRcdC5udW1wYWdlcyA9IDEsXG4rXHRcdFx0XHQubWFza19zZXQgPSBfX3BncHJvdCgwKSxcbitcdFx0XHRcdC5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpLFxuK1x0XHRcdFx0LmZsYWdzID0gQ1BBX05PX0NIRUNLX0FMSUFTIH07XG4rXG4rXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gaW50IHNldF9kaXJlY3RfbWFwX2RlZmF1bHRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4tXHRyZXR1cm4gX19zZXRfbWVtb3J5KCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKSwgMSxcbi1cdFx0XHQgICAgUEFHRV9LRVJORUwsIF9fcGdwcm90KF9QQUdFX0VYRUMpKTtcbitcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4rXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcdTAwMjZzdGFydCxcbitcdFx0XHRcdC5wZ2QgPSBOVUxMLFxuK1x0XHRcdFx0Lm51bXBhZ2VzID0gMSxcbitcdFx0XHRcdC5tYXNrX3NldCA9IFBBR0VfS0VSTkVMLFxuK1x0XHRcdFx0Lm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfRVhFQyksXG4rXHRcdFx0XHQuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTtcbitcbitcdHJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihcdTAwMjZjcGEsIDEpO1xuIH1cbiBcbiBpbnQgc2V0X2RpcmVjdF9tYXBfdmFsaWRfbm9mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbnIsIGJvb2wgdmFsaWQpXG4ge1xuLVx0cGdwcm90X3Qgc2V0LCBjbGVhcjtcbitcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4rXHRzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSBcdTAwMjZzdGFydCxcbitcdFx0XHRcdC5wZ2QgPSBOVUxMLFxuK1x0XHRcdFx0Lm51bXBhZ2VzID0gbnIsXG4rXHRcdFx0XHQuZmxhZ3MgPSBDUEFfTk9fQ0hFQ0tfQUxJQVMgfTtcbiBcbiBcdGlmICh2YWxpZCkge1xuLVx0XHRzZXQgPSBQQUdFX0tFUk5FTDtcbi1cdFx0Y2xlYXIgPSBfX3BncHJvdChfUEFHRV9FWEVDKTtcbitcdFx0Y3BhLm1hc2tfc2V0ID0gUEFHRV9LRVJORUw7XG4rXHRcdGNwYS5tYXNrX2NsciA9IF9fcGdwcm90KF9QQUdFX0VYRUMpO1xuIFx0fSBlbHNlIHtcbi1cdFx0c2V0ID0gX19wZ3Byb3QoMCk7XG4tXHRcdGNsZWFyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCk7XG4rXHRcdGNwYS5tYXNrX3NldCA9IF9fcGdwcm90KDApO1xuK1x0XHRjcGEubWFza19jbHIgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UKTtcbiBcdH1cbiBcbi1cdHJldHVybiBfX3NldF9tZW1vcnkoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpLCBuciwgc2V0LCBjbGVhcik7XG4rXHRyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0NcbkBAIC00MzUsMzYgKzI3NSwxMSBAQCB2b2lkIF9fa2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKVxuIGJvb2wga2VybmVsX3BhZ2VfcHJlc2VudChzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7XG4tXHRwZ2RfdCAqcGdkO1xuLVx0cHVkX3QgKnB1ZDtcbi1cdHA0ZF90ICpwNGQ7XG4tXHRwbWRfdCAqcG1kO1xuLVx0cHRlX3QgKnB0ZTtcbi1cbi1cdHBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTtcbi1cdGlmICghcGdkX3ByZXNlbnQocGdkcF9nZXQocGdkKSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwZ2RfbGVhZihwZ2RwX2dldChwZ2QpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHRwNGQgPSBwNGRfb2Zmc2V0KHBnZCwgYWRkcik7XG4tXHRpZiAoIXA0ZF9wcmVzZW50KHA0ZHBfZ2V0KHA0ZCkpKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHRpZiAocDRkX2xlYWYocDRkcF9nZXQocDRkKSkpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0cHVkID0gcHVkX29mZnNldChwNGQsIGFkZHIpO1xuLVx0aWYgKCFwdWRfcHJlc2VudChwdWRwX2dldChwdWQpKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0aWYgKHB1ZF9sZWFmKHB1ZHBfZ2V0KHB1ZCkpKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbitcdHVuc2lnbmVkIGludCBsZXZlbDtcbitcdHB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCBcdTAwMjZsZXZlbCk7XG4gXG4tXHRwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7XG4tXHRpZiAoIXBtZF9wcmVzZW50KHBtZHBfZ2V0KHBtZCkpKVxuK1x0aWYgKCFwdGUpXG4gXHRcdHJldHVybiBmYWxzZTtcbi1cdGlmIChwbWRfbGVhZihwbWRwX2dldChwbWQpKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4gXG4tXHRwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpO1xuIFx0cmV0dXJuIHB0ZV9wcmVzZW50KHB0ZXBfZ2V0KHB0ZSkpO1xuIH1cbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZ1xuaW5kZXggYmRhZDkwZjIxMGU0YmYuLmUxZjEwNWU1MmQ2YTEyIDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvS2NvbmZpZ1xuKysrIGIvYXJjaC94ODYvS2NvbmZpZ1xuQEAgLTMzNiw2ICszMzYsNyBAQCBjb25maWcgWDg2XG4gXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19TQ0hFRF9DTFVTVEVSXHRpZiBTTVBcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1NDSEVEX01DXHRcdGlmIFNNUFxuIFx0c2VsZWN0IEhBVkVfU0lOR0xFX0ZUUkFDRV9ESVJFQ1RfT1BTXHRpZiBYODZfNjQgXHUwMDI2XHUwMDI2IERZTkFNSUNfRlRSQUNFX1dJVEhfRElSRUNUX0NBTExTXG4rXHRzZWxlY3QgR0VORVJJQ19TRVRfTUVNT1JZXG4gXG4gY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVJcbiBcdGRlZl9ib29sIHlcbmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuaW5kZXggYzk1YzNhYWFkZjk3YzMuLjMxNGI3MmFhZDZmZmY0IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuKysrIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1Z1xuQEAgLTE1NywxMiArMTU3LDYgQEAgY29uZmlnIERFQlVHX0JPT1RfUEFSQU1TXG4gXHRoZWxwXG4gXHQgIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2Ugc3RydWN0IGJvb3RfcGFyYW1zIHRvIGJlIGV4cG9ydGVkIHZpYSBkZWJ1Z2ZzLlxuIFxuLWNvbmZpZyBDUEFfREVCVUdcbi1cdGJvb2wgXCJDUEEgc2VsZi10ZXN0IGNvZGVcIlxuLVx0ZGVwZW5kcyBvbiBERUJVR19LRVJORUxcbi1cdGhlbHBcbi1cdCAgRG8gY2hhbmdlX3BhZ2VfYXR0cigpIHNlbGYtdGVzdHMgZXZlcnkgMzAgc2Vjb25kcy5cbi1cbiBjb25maWcgREVCVUdfRU5UUllcbiBcdGJvb2wgXCJEZWJ1ZyBsb3ctbGV2ZWwgZW50cnkgY29kZVwiXG4gXHRkZXBlbmRzIG9uIERFQlVHX0tFUk5FTFxuZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaFxuaW5kZXggYWMyOTVjYTZjOTJmOTkuLjQ5N2FhZjA4YWQzNjE2IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oXG4rKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmhcbkBAIC0yMjcsNiArMjI3LDQyIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXG4gXHRyZXR1cm4gcHVkX2ZsYWdzKHB1ZCkgXHUwMDI2IF9QQUdFX1JXO1xuIH1cbiBcbisjZGVmaW5lIHA0ZF93cml0ZSBwNGRfd3JpdGVcbitzdGF0aWMgaW5saW5lIGludCBwNGRfd3JpdGUocDRkX3QgcDRkKVxuK3tcbitcdHJldHVybiBwNGRfZmxhZ3MocDRkKSBcdTAwMjYgX1BBR0VfUlc7XG4rfVxuK1xuKyNkZWZpbmUgcGdkX3dyaXRlIHBnZF93cml0ZVxuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF93cml0ZShwZ2RfdCBwZ2QpXG4re1xuK1x0cmV0dXJuIHBnZF9mbGFncyhwZ2QpIFx1MDAyNiBfUEFHRV9SVztcbit9XG4rXG4rI2RlZmluZSBwbWRfZXhlYyBwbWRfZXhlY1xuK3N0YXRpYyBpbmxpbmUgaW50IHBtZF9leGVjKHBtZF90IHBtZClcbit7XG4rXHRyZXR1cm4gIShwbWRfZmxhZ3MocG1kKSBcdTAwMjYgX1BBR0VfTlgpO1xuK31cbitcbisjZGVmaW5lIHB1ZF9leGVjIHB1ZF9leGVjXG4rc3RhdGljIGlubGluZSBpbnQgcHVkX2V4ZWMocHVkX3QgcHVkKVxuK3tcbitcdHJldHVybiAhKHB1ZF9mbGFncyhwdWQpIFx1MDAyNiBfUEFHRV9OWCk7XG4rfVxuK1xuKyNkZWZpbmUgcDRkX2V4ZWMgcDRkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwNGRfZXhlYyhwNGRfdCBwNGQpXG4re1xuK1x0cmV0dXJuICEocDRkX2ZsYWdzKHA0ZCkgXHUwMDI2IF9QQUdFX05YKTtcbit9XG4rXG4rI2RlZmluZSBwZ2RfZXhlYyBwZ2RfZXhlY1xuK3N0YXRpYyBpbmxpbmUgaW50IHBnZF9leGVjKHBnZF90IHBnZClcbit7XG4rXHRyZXR1cm4gIShwZ2RfZmxhZ3MocGdkKSBcdTAwMjYgX1BBR0VfTlgpO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpXG4ge1xuIFx0cmV0dXJuIHB0ZV9mbGFncyhwdGUpIFx1MDAyNiBfUEFHRV9QU0U7XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0X21lbW9yeS5oXG5pbmRleCA0MzYyYzI2YWE5OTJkYi4uMzMyZWMzMDBjMmVkOWMgMTAwNjQ0XG4tLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXRfbWVtb3J5LmhcbisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldF9tZW1vcnkuaFxuQEAgLTMsMTIgKzMsNjIgQEBcbiAjZGVmaW5lIF9BU01fWDg2X1NFVF9NRU1PUllfSFxuIFxuICNpbmNsdWRlIFx1MDAzY2FzbS9wYWdlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nhc20vc2VjdGlvbnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS1nZW5lcmljL3NldF9tZW1vcnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9wZ3RhYmxlLmhcdTAwM2VcbiBcbiAjZGVmaW5lIHNldF9tZW1vcnlfcm94IHNldF9tZW1vcnlfcm94XG4gaW50IHNldF9tZW1vcnlfcm94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKTtcbiBcbisjaWZkZWYgQ09ORklHX1g4Nl82NFxuKy8qXG4rICogVGhlIGtlcm5lbCBpbWFnZSBpcyBtYXBwZWQgaW50byB0d28gcGxhY2VzIGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2VcbisgKiAoYWRkcmVzc2VzIHdpdGhvdXQgS0FTTFIsIG9mIGNvdXJzZSk6XG4rICpcbisgKiAxLiBUaGUga2VybmVsIGRpcmVjdCBtYXAgKDB4ZmZmZjg4MDAwMDAwMDAwMClcbisgKiAyLiBUaGUgXCJoaWdoIGtlcm5lbCBtYXBcIiAoMHhmZmZmZmZmZjgxMDAwMDAwKVxuKyAqXG4rICogV2UgYWN0dWFsbHkgZXhlY3V0ZSBvdXQgb2YgIzIuIElmIHdlIGdldCB0aGUgYWRkcmVzcyBvZiBhIGtlcm5lbCBzeW1ib2wsIGl0XG4rICogcG9pbnRzIHRvICMyLCBidXQgYWxtb3N0IGFsbCBwaHlzaWNhbC10by12aXJ0dWFsIHRyYW5zbGF0aW9ucyBwb2ludCB0byAjMS5cbisgKlxuKyAqIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGF2ZSBib3RoIGEgZGlyZWN0bWFwIG9mIGFsbCBwaHlzaWNhbCBtZW1vcnkgKmFuZCpcbisgKiB0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIHRoZSBsaW1pdGVkIChzMzIpIGltbWVkaWF0ZSBhZGRyZXNzaW5nIHJhbmdlICgyRylcbisgKiBvZiB4ODZfNjQuXG4rICpcbisgKiBTZWUgRG9jdW1lbnRhdGlvbi9hcmNoL3g4Ni94ODZfNjQvbW0ucnN0IGZvciBtb3JlIGRldGFpbC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgcGZuX2lzX2tlcm5lbCh1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHR1bnNpZ25lZCBsb25nIHNwZm4gPSBfX3BhX3N5bWJvbChfdGV4dCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHQvKiBEbyBub3QgcmVmZXJlbmNlIGEgcGh5c2ljYWwgYWRkcmVzcyBvdXRzaWRlIHRoZSBrZXJuZWwuICovXG4rXHR1bnNpZ25lZCBsb25nIGVwZm4gPSBfX3BhX3N5bWJvbChyb3VuZHVwKF9icmtfZW5kLCBQTURfU0laRSkgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcbitcdHJldHVybiBwZm4gXHUwMDNlPSBzcGZuIFx1MDAyNlx1MDAyNiBwZm4gXHUwMDNjPSBlcGZuO1xuK31cbisjZWxzZVxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwZm5faXNfa2VybmVsKHVuc2lnbmVkIGxvbmcgcGZuKVxuK3tcbitcdC8qIFRoZXJlIGlzIG5vIGhpZ2htYXAgb24gMzItYml0ICovXG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuKyNlbmRpZlxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBjcGFfc2hvdWxkX3VwZGF0ZV9hbGlhcyh1bnNpZ25lZCBsb25nIHZhZGRyLFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHQvKiBQcmltYXJ5IGlzIG5vdCBpbiB0aGUgZGlyZWN0IG1hcCwgaXRzIGRpcmVjdCBtYXAgYWxpYXMgbmVlZHMgdXBkYXRlICovXG4rXHRpZiAodmFkZHIgXHUwMDNjIFBBR0VfT0ZGU0VUIHx8XG4rXHQgICAgdmFkZHIgXHUwMDNlPSBQQUdFX09GRlNFVCArIChtYXhfcGZuX21hcHBlZCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1xuK1x0LyogZGlyZWN0IG1hcCBwYWdlIHRoYXQgaXMgYWxzbyBwYXJ0IG9mIHRoZSBrZXJuZWwgaGlnaG1hcCAqL1xuK1x0aWYgKCh2YWRkciBcdTAwM2MgKHVuc2lnbmVkIGxvbmcpX3RleHQgfHwgdmFkZHIgXHUwMDNlPSBfYnJrX2VuZCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgcGZuX2lzX2tlcm5lbChwZm4pKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4gLypcbiAgKiBUaGUgc2V0X21lbW9yeV8qIEFQSSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIGEgdmlydHVhbFxuICAqIGFkZHJlc3MgcmFuZ2UuIFRoZSBhdHRyaWJ1dGVzIGluY2x1ZGU6XG5kaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0L3NldF9tZW1vcnkuYyBiL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbmluZGV4IGQwMjNhNDBhMWUwMzQ1Li5jNDYwMTIxYzk2Yjk0OSAxMDA2NDRcbi0tLSBhL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbisrKyBiL2FyY2gveDg2L21tL3BhdC9zZXRfbWVtb3J5LmNcbkBAIC0zOCwyMSArMzgsNiBAQFxuIC8qXG4gICogVGhlIGN1cnJlbnQgZmx1c2hpbmcgY29udGV4dCAtIHdlIHBhc3MgaXQgaW5zdGVhZCBvZiA1IGFyZ3VtZW50czpcbiAgKi9cbi1zdHJ1Y3QgY3BhX2RhdGEge1xuLVx0dW5zaWduZWQgbG9uZ1x0KnZhZGRyO1xuLVx0cGdkX3RcdFx0KnBnZDtcbi1cdHBncHJvdF90XHRtYXNrX3NldDtcbi1cdHBncHJvdF90XHRtYXNrX2Nscjtcbi1cdHVuc2lnbmVkIGxvbmdcdG51bXBhZ2VzO1xuLVx0dW5zaWduZWQgbG9uZ1x0Y3VycGFnZTtcbi1cdHVuc2lnbmVkIGxvbmdcdHBmbjtcbi1cdHVuc2lnbmVkIGludFx0ZmxhZ3M7XG4tXHR1bnNpZ25lZCBpbnRcdGZvcmNlX3NwbGl0XHRcdDogMSxcbi1cdFx0XHRmb3JjZV9zdGF0aWNfcHJvdFx0OiAxLFxuLVx0XHRcdGZvcmNlX2ZsdXNoX2FsbFx0XHQ6IDE7XG4tXHRzdHJ1Y3QgcGFnZVx0KipwYWdlcztcbi19O1xuLVxuIGVudW0gY3BhX3dhcm4ge1xuIFx0Q1BBX0NPTkZMSUNULFxuIFx0Q1BBX1BST1RFQ1QsXG5AQCAtNjEsMjcgKzQ2LDEzIEBAIGVudW0gY3BhX3dhcm4ge1xuIFxuIHN0YXRpYyBjb25zdCBpbnQgY3BhX3dhcm5fbGV2ZWwgPSBDUEFfUFJPVEVDVDtcbiBcbi0vKlxuLSAqIFNlcmlhbGl6ZSBjcGEoKSAoZm9yICFERUJVR19QQUdFQUxMT0Mgd2hpY2ggdXNlcyBsYXJnZSBpZGVudGl0eSBtYXBwaW5ncylcbi0gKiB1c2luZyBjcGFfbG9jay4gU28gdGhhdCB3ZSBkb24ndCBhbGxvdyBhbnkgb3RoZXIgY3B1LCB3aXRoIHN0YWxlIGxhcmdlIHRsYlxuLSAqIGVudHJpZXMgY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdVxuLSAqIHNwbGl0dGluZyBhIGxhcmdlIHBhZ2UgZW50cnkgYWxvbmcgd2l0aCBjaGFuZ2luZyB0aGUgYXR0cmlidXRlLlxuLSAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spO1xuLVxuLSNkZWZpbmUgQ1BBX0ZMVVNIVExCIDFcbi0jZGVmaW5lIENQQV9BUlJBWSAyXG4tI2RlZmluZSBDUEFfUEFHRVNfQVJSQVkgNFxuLSNkZWZpbmUgQ1BBX05PX0NIRUNLX0FMSUFTIDggLyogRG8gbm90IHNlYXJjaCBmb3IgYWxpYXNlcyAqL1xuLSNkZWZpbmUgQ1BBX0NPTExBUFNFIDE2IC8qIHRyeSB0byBjb2xsYXBzZSBsYXJnZSBwYWdlcyAqL1xuLVxuIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgY2FjaGVtb2RlMnBncHJvdChlbnVtIHBhZ2VfY2FjaGVfbW9kZSBwY20pXG4ge1xuIFx0cmV0dXJuIF9fcGdwcm90KGNhY2hlbW9kZTJwcm90dmFsKHBjbSkpO1xuIH1cbiBcbiAjaWZkZWYgQ09ORklHX1BST0NfRlNcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfTlVNXTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJlY3RfcGFnZXNfY291bnRbUEdUQUJMRV9MRVZFTF9OVU1dO1xuIFxuIHZvaWQgdXBkYXRlX3BhZ2VfY291bnQoaW50IGxldmVsLCB1bnNpZ25lZCBsb25nIHBhZ2VzKVxuIHtcbkBAIC05OCw5ICs2OSw5IEBAIHN0YXRpYyB2b2lkIHNwbGl0X3BhZ2VfY291bnQoaW50IGxldmVsKVxuIFxuIFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsXS0tO1xuIFx0aWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykge1xuLVx0XHRpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMk0pXG4rXHRcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMMl9TUExJVCk7XG4tXHRcdGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuK1x0XHRlbHNlIGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMM19TUExJVCk7XG4gXHR9XG4gXHRkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWwgLSAxXSArPSBQVFJTX1BFUl9QVEU7XG5AQCAtMTEwLDkgKzgxLDkgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfcGFnZV9jb3VudChpbnQgbGV2ZWwpXG4ge1xuIFx0ZGlyZWN0X3BhZ2VzX2NvdW50W2xldmVsXSsrO1xuIFx0aWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykge1xuLVx0XHRpZiAobGV2ZWwgPT0gUEdfTEVWRUxfMk0pXG4rXHRcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMMl9DT0xMQVBTRSk7XG4tXHRcdGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuK1x0XHRlbHNlIGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRClcbiBcdFx0XHRjb3VudF92bV9ldmVudChESVJFQ1RfTUFQX0xFVkVMM19DT0xMQVBTRSk7XG4gXHR9XG4gXHRkaXJlY3RfcGFnZXNfY291bnRbbGV2ZWwgLSAxXSAtPSBQVFJTX1BFUl9QVEU7XG5AQCAtMTIxLDE3ICs5MiwxNyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9wYWdlX2NvdW50KGludCBsZXZlbClcbiB2b2lkIGFyY2hfcmVwb3J0X21lbWluZm8oc3RydWN0IHNlcV9maWxlICptKVxuIHtcbiBcdHNlcV9wcmludGYobSwgXCJEaXJlY3RNYXA0azogICAgJThsdSBrQlxcblwiLFxuLVx0XHRcdGRpcmVjdF9wYWdlc19jb3VudFtQR19MRVZFTF80S10gXHUwMDNjXHUwMDNjIDIpO1xuK1x0XHRcdGRpcmVjdF9wYWdlc19jb3VudFtQR1RBQkxFX0xFVkVMX1BURV0gXHUwMDNjXHUwMDNjIDIpO1xuICNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9QQUUpXG4gXHRzZXFfcHJpbnRmKG0sIFwiRGlyZWN0TWFwMk06ICAgICU4bHUga0JcXG5cIixcbi1cdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfMk1dIFx1MDAzY1x1MDAzYyAxMSk7XG4rXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUE1EXSBcdTAwM2NcdTAwM2MgMTEpO1xuICNlbHNlXG4gXHRzZXFfcHJpbnRmKG0sIFwiRGlyZWN0TWFwNE06ICAgICU4bHUga0JcXG5cIixcbi1cdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfMk1dIFx1MDAzY1x1MDAzYyAxMik7XG4rXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUE1EXSBcdTAwM2NcdTAwM2MgMTIpO1xuICNlbmRpZlxuIFx0aWYgKGRpcmVjdF9nYnBhZ2VzKVxuIFx0XHRzZXFfcHJpbnRmKG0sIFwiRGlyZWN0TWFwMUc6ICAgICU4bHUga0JcXG5cIixcbi1cdFx0XHRkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfMUddIFx1MDAzY1x1MDAzYyAyMCk7XG4rXHRcdFx0ZGlyZWN0X3BhZ2VzX2NvdW50W1BHVEFCTEVfTEVWRUxfUFVEXSBcdTAwM2NcdTAwM2MgMjApO1xuIH1cbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGxpdF9wYWdlX2NvdW50KGludCBsZXZlbCkgeyB9XG5AQCAtMTY1LDcgKzEzNiw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jXzRrX2luc3RhbGwodm9pZClcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY19scF9zYW1lcHJvdChpbnQgbGV2ZWwpXG4ge1xuLVx0aWYgKGxldmVsID09IFBHX0xFVkVMXzFHKVxuK1x0aWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEKVxuIFx0XHRjcGFfMWdfc2FtZXByb3QrKztcbiBcdGVsc2VcbiBcdFx0Y3BhXzJtX3NhbWVwcm90Kys7XG5AQCAtMTczLDcgKzE0NCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjcGFfaW5jX2xwX3NhbWVwcm90KGludCBsZXZlbClcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgY3BhX2luY19scF9wcmVzZXJ2ZWQoaW50IGxldmVsKVxuIHtcbi1cdGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRylcbitcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BVRClcbiBcdFx0Y3BhXzFnX3ByZXNlcnZlZCsrO1xuIFx0ZWxzZVxuIFx0XHRjcGFfMm1fcHJlc2VydmVkKys7XG5AQCAtMjI1LDYxICsxOTYsNiBAQCB3aXRoaW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcbiBcdHJldHVybiBhZGRyIFx1MDAzZT0gc3RhcnQgXHUwMDI2XHUwMDI2IGFkZHIgXHUwMDNjIGVuZDtcbiB9XG4gXG4tI2lmZGVmIENPTkZJR19YODZfNjRcbi1cbi1zdGF0aWMgaW5saW5lIGludFxuLXdpdGhpbl9pbmNsdXNpdmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcbi17XG4tXHRyZXR1cm4gYWRkciBcdTAwM2U9IHN0YXJ0IFx1MDAyNlx1MDAyNiBhZGRyIFx1MDAzYz0gZW5kO1xuLX1cbi1cbi0vKlxuLSAqIFRoZSBrZXJuZWwgaW1hZ2UgaXMgbWFwcGVkIGludG8gdHdvIHBsYWNlcyBpbiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlXG4tICogKGFkZHJlc3NlcyB3aXRob3V0IEtBU0xSLCBvZiBjb3Vyc2UpOlxuLSAqXG4tICogMS4gVGhlIGtlcm5lbCBkaXJlY3QgbWFwICgweGZmZmY4ODAwMDAwMDAwMDApXG4tICogMi4gVGhlIFwiaGlnaCBrZXJuZWwgbWFwXCIgKDB4ZmZmZmZmZmY4MTAwMDAwMClcbi0gKlxuLSAqIFdlIGFjdHVhbGx5IGV4ZWN1dGUgb3V0IG9mICMyLiBJZiB3ZSBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBrZXJuZWwgc3ltYm9sLCBpdFxuLSAqIHBvaW50cyB0byAjMiwgYnV0IGFsbW9zdCBhbGwgcGh5c2ljYWwtdG8tdmlydHVhbCB0cmFuc2xhdGlvbnMgcG9pbnQgdG8gIzEuXG4tICpcbi0gKiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhdmUgYm90aCBhIGRpcmVjdG1hcCBvZiBhbGwgcGh5c2ljYWwgbWVtb3J5ICphbmQqXG4tICogdGFrZSBmdWxsIGFkdmFudGFnZSBvZiB0aGUgbGltaXRlZCAoczMyKSBpbW1lZGlhdGUgYWRkcmVzc2luZyByYW5nZSAoMkcpXG4tICogb2YgeDg2XzY0LlxuLSAqXG4tICogU2VlIERvY3VtZW50YXRpb24vYXJjaC94ODYveDg2XzY0L21tLnJzdCBmb3IgbW9yZSBkZXRhaWwuXG4tICovXG4tXG4tc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhpZ2htYXBfc3RhcnRfcGZuKHZvaWQpXG4te1xuLVx0cmV0dXJuIF9fcGFfc3ltYm9sKF90ZXh0KSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbi19XG4tXG4tc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhpZ2htYXBfZW5kX3Bmbih2b2lkKVxuLXtcbi1cdC8qIERvIG5vdCByZWZlcmVuY2UgcGh5c2ljYWwgYWRkcmVzcyBvdXRzaWRlIHRoZSBrZXJuZWwuICovXG4tXHRyZXR1cm4gX19wYV9zeW1ib2wocm91bmR1cChfYnJrX2VuZCwgUE1EX1NJWkUpIC0gMSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tfVxuLVxuLXN0YXRpYyBib29sIF9fY3BhX3Bmbl9pbl9oaWdobWFwKHVuc2lnbmVkIGxvbmcgcGZuKVxuLXtcbi1cdC8qXG4tXHQgKiBLZXJuZWwgdGV4dCBoYXMgYW4gYWxpYXMgbWFwcGluZyBhdCBhIGhpZ2ggYWRkcmVzcywga25vd25cbi1cdCAqIGhlcmUgYXMgXCJoaWdobWFwXCIuXG4tXHQgKi9cbi1cdHJldHVybiB3aXRoaW5faW5jbHVzaXZlKHBmbiwgaGlnaG1hcF9zdGFydF9wZm4oKSwgaGlnaG1hcF9lbmRfcGZuKCkpO1xuLX1cbi1cbi0jZWxzZVxuLVxuLXN0YXRpYyBib29sIF9fY3BhX3Bmbl9pbl9oaWdobWFwKHVuc2lnbmVkIGxvbmcgcGZuKVxuLXtcbi1cdC8qIFRoZXJlIGlzIG5vIGhpZ2htYXAgb24gMzItYml0ICovXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuLSNlbmRpZlxuLVxuIC8qXG4gICogU2VlIHNldF9tY2Vfbm9zcGVjKCkuXG4gICpcbkBAIC0zMDMsMjMgKzIxOSw2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaXhfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpXG4gI2VuZGlmXG4gfVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fY3BhX2FkZHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgaWR4KVxuLXtcbi1cdGlmIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IENQQV9QQUdFU19BUlJBWSkge1xuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwYS1cdTAwM2VwYWdlc1tpZHhdO1xuLVxuLVx0XHRpZiAodW5saWtlbHkoUGFnZUhpZ2hNZW0ocGFnZSkpKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpO1xuLVx0fVxuLVxuLVx0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgQ1BBX0FSUkFZKVxuLVx0XHRyZXR1cm4gY3BhLVx1MDAzZXZhZGRyW2lkeF07XG4tXG4tXHRyZXR1cm4gKmNwYS1cdTAwM2V2YWRkciArIGlkeCAqIFBBR0VfU0laRTtcbi19XG4tXG4gLypcbiAgKiBGbHVzaGluZyBmdW5jdGlvbnNcbiAgKi9cbkBAIC00MDUsNyArMzA0LDcgQEAgc3RhdGljIHZvaWQgX19jcGFfZmx1c2hfdGxiKHZvaWQgKmRhdGEpXG4gXHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNwYS1cdTAwM2VudW1wYWdlczsgaSsrKVxuLVx0XHRmbHVzaF90bGJfb25lX2tlcm5lbChmaXhfYWRkcihfX2NwYV9hZGRyKGNwYSwgaSkpKTtcbitcdFx0Zmx1c2hfdGxiX29uZV9rZXJuZWwoZml4X2FkZHIoY3BhX2FkZHIoY3BhLCBpKSkpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGxpc3RfaGVhZCAqcGd0YWJsZXMpO1xuQEAgLTQyMCwxMCArMzE5LDEwIEBAIHN0YXRpYyB2b2lkIGNwYV9jb2xsYXBzZV9sYXJnZV9wYWdlcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcbiBcbiBcdGlmIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IChDUEFfUEFHRVNfQVJSQVkgfCBDUEFfQVJSQVkpKSB7XG4gXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNwYS1cdTAwM2VudW1wYWdlczsgaSsrKVxuLVx0XHRcdGNvbGxhcHNlZCArPSBjb2xsYXBzZV9sYXJnZV9wYWdlcyhfX2NwYV9hZGRyKGNwYSwgaSksXG4rXHRcdFx0Y29sbGFwc2VkICs9IGNvbGxhcHNlX2xhcmdlX3BhZ2VzKGNwYV9hZGRyKGNwYSwgaSksXG4gXHRcdFx0XHRcdFx0XHQgIFx1MDAyNnBndGFibGVzKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGFkZHIgPSBfX2NwYV9hZGRyKGNwYSwgMCk7XG4rXHRcdGFkZHIgPSBjcGFfYWRkcihjcGEsIDApO1xuIFx0XHRzdGFydCA9IGFkZHIgXHUwMDI2IFBNRF9NQVNLO1xuIFx0XHRlbmQgPSBhZGRyICsgUEFHRV9TSVpFICogY3BhLVx1MDAzZW51bXBhZ2VzO1xuIFxuQEAgLTQ2Myw3ICszNjIsNyBAQCBzdGF0aWMgdm9pZCBjcGFfZmx1c2goc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBjYWNoZSlcbiBcbiBcdG1iKCk7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjcGEtXHUwMDNlbnVtcGFnZXM7IGkrKykge1xuLVx0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBfX2NwYV9hZGRyKGNwYSwgaSk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciA9IGNwYV9hZGRyKGNwYSwgaSk7XG4gXHRcdHVuc2lnbmVkIGludCBsZXZlbDtcbiBcbiBcdFx0cHRlX3QgKnB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsIFx1MDAyNmxldmVsKTtcbkBAIC01NzgsNyArNDc3LDcgQEAgc3RhdGljIHBncHJvdHZhbF90IHByb3RlY3Rfa2VybmVsX3RleHRfcm8odW5zaWduZWQgbG9uZyBzdGFydCxcbiBcdCAqIHNvIHRoZSBwcm90ZWN0aW9ucyBmb3Iga2VybmVsIHRleHQgYW5kIGlkZW50aXR5IG1hcHBpbmdzIGhhdmUgdG9cbiBcdCAqIGJlIHRoZSBzYW1lLlxuIFx0ICovXG4tXHRpZiAobG9va3VwX2FkZHJlc3Moc3RhcnQsIFx1MDAyNmxldmVsKSBcdTAwMjZcdTAwMjYgKGxldmVsICE9IFBHX0xFVkVMXzRLKSlcbitcdGlmIChsb29rdXBfYWRkcmVzcyhzdGFydCwgXHUwMDI2bGV2ZWwpIFx1MDAyNlx1MDAyNiAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpKVxuIFx0XHRyZXR1cm4gX1BBR0VfUlc7XG4gXHRyZXR1cm4gMDtcbiB9XG5AQCAtNzA5LDEwNCArNjA4LDYgQEAgc3RhdGljIGlubGluZSBwZ3Byb3RfdCB2ZXJpZnlfcnd4KHBncHJvdF90IG9sZCwgcGdwcm90X3QgbmV3LCB1bnNpZ25lZCBsb25nIHN0YXJcbiBcdHJldHVybiBuZXc7XG4gfVxuIFxuLS8qXG4tICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC5cbi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSAob3IgTlVMTCBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QpLFxuLSAqIHRoZSBsZXZlbCBvZiB0aGUgZW50cnksIGFuZCB0aGUgZWZmZWN0aXZlIE5YIGFuZCBSVyBiaXRzIG9mIGFsbFxuLSAqIHBhZ2UgdGFibGUgbGV2ZWxzLlxuLSAqL1xuLXB0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tXHRcdFx0XHQgIHVuc2lnbmVkIGludCAqbGV2ZWwsIGJvb2wgKm54LCBib29sICpydylcbi17XG4tXHRwNGRfdCAqcDRkO1xuLVx0cHVkX3QgKnB1ZDtcbi1cdHBtZF90ICpwbWQ7XG4tXG4tXHQqbGV2ZWwgPSBQR19MRVZFTF8yNTZUO1xuLVx0Km54ID0gZmFsc2U7XG4tXHQqcncgPSB0cnVlO1xuLVxuLVx0aWYgKHBnZF9ub25lKCpwZ2QpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cbi1cdCpsZXZlbCA9IFBHX0xFVkVMXzUxMkc7XG4tXHQqbnggfD0gcGdkX2ZsYWdzKCpwZ2QpIFx1MDAyNiBfUEFHRV9OWDtcbi1cdCpydyBcdTAwMjY9IHBnZF9mbGFncygqcGdkKSBcdTAwMjYgX1BBR0VfUlc7XG4tXG4tXHRwNGQgPSBwNGRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7XG4tXHRpZiAocDRkX25vbmUoKnA0ZCkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKHA0ZF9sZWFmKCpwNGQpIHx8ICFwNGRfcHJlc2VudCgqcDRkKSlcbi1cdFx0cmV0dXJuIChwdGVfdCAqKXA0ZDtcbi1cbi1cdCpsZXZlbCA9IFBHX0xFVkVMXzFHO1xuLVx0Km54IHw9IHA0ZF9mbGFncygqcDRkKSBcdTAwMjYgX1BBR0VfTlg7XG4tXHQqcncgXHUwMDI2PSBwNGRfZmxhZ3MoKnA0ZCkgXHUwMDI2IF9QQUdFX1JXO1xuLVxuLVx0cHVkID0gcHVkX29mZnNldChwNGQsIGFkZHJlc3MpO1xuLVx0aWYgKHB1ZF9ub25lKCpwdWQpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cbi1cdGlmIChwdWRfbGVhZigqcHVkKSB8fCAhcHVkX3ByZXNlbnQoKnB1ZCkpXG4tXHRcdHJldHVybiAocHRlX3QgKilwdWQ7XG4tXG4tXHQqbGV2ZWwgPSBQR19MRVZFTF8yTTtcbi1cdCpueCB8PSBwdWRfZmxhZ3MoKnB1ZCkgXHUwMDI2IF9QQUdFX05YO1xuLVx0KnJ3IFx1MDAyNj0gcHVkX2ZsYWdzKCpwdWQpIFx1MDAyNiBfUEFHRV9SVztcbi1cbi1cdHBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTtcbi1cdGlmIChwbWRfbm9uZSgqcG1kKSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXG4tXHRpZiAocG1kX2xlYWYoKnBtZCkgfHwgIXBtZF9wcmVzZW50KCpwbWQpKVxuLVx0XHRyZXR1cm4gKHB0ZV90ICopcG1kO1xuLVxuLVx0KmxldmVsID0gUEdfTEVWRUxfNEs7XG4tXHQqbnggfD0gcG1kX2ZsYWdzKCpwbWQpIFx1MDAyNiBfUEFHRV9OWDtcbi1cdCpydyBcdTAwMjY9IHBtZF9mbGFncygqcG1kKSBcdTAwMjYgX1BBR0VfUlc7XG4tXG4tXHRyZXR1cm4gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyZXNzKTtcbi19XG4tXG4tLypcbi0gKiBMb29rdXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgc3BlY2lmaWMgcGdkLlxuLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuXG4tICovXG4tcHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tXHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKVxuLXtcbi1cdGJvb2wgbngsIHJ3O1xuLVxuLVx0cmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZCwgYWRkcmVzcywgbGV2ZWwsIFx1MDAyNm54LCBcdTAwMjZydyk7XG4tfVxuLVxuLS8qXG4tICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcy4gUmV0dXJuIGEgcG9pbnRlclxuLSAqIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLlxuLSAqXG4tICogTm90ZTogdGhlIGZ1bmN0aW9uIHJldHVybnMgcDRkLCBwdWQgb3IgcG1kIGVpdGhlciB3aGVuIHRoZSBlbnRyeSBpcyBtYXJrZWRcbi0gKiBsYXJnZSBvciB3aGVuIHRoZSBwcmVzZW50IGJpdCBpcyBub3Qgc2V0LiBPdGhlcndpc2UgaXQgcmV0dXJucyBOVUxMLlxuLSAqL1xuLXB0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpXG4te1xuLVx0cmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZChwZ2Rfb2Zmc2V0X2soYWRkcmVzcyksIGFkZHJlc3MsIGxldmVsKTtcbi19XG4tRVhQT1JUX1NZTUJPTF9HUEwobG9va3VwX2FkZHJlc3MpO1xuLVxuLXN0YXRpYyBwdGVfdCAqX2xvb2t1cF9hZGRyZXNzX2NwYShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpXG4te1xuLVx0cGdkX3QgKnBnZDtcbi1cbi1cdGlmICghY3BhLVx1MDAzZXBnZClcbi1cdFx0cGdkID0gcGdkX29mZnNldF9rKGFkZHJlc3MpO1xuLVx0ZWxzZVxuLVx0XHRwZ2QgPSBjcGEtXHUwMDNlcGdkICsgcGdkX2luZGV4KGFkZHJlc3MpO1xuLVxuLVx0cmV0dXJuIGxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZCwgYWRkcmVzcywgbGV2ZWwsIG54LCBydyk7XG4tfVxuLVxuIC8qXG4gICogTG9va3VwIHRoZSBQTUQgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzLiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeVxuICAqIG9yIE5VTEwgaWYgbm90IHByZXNlbnQuXG5AQCAtODUwLDkgKzY1MSw5IEBAIHBtZF90ICpsb29rdXBfcG1kX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKVxuIHBoeXNfYWRkcl90IHNsb3dfdmlydF90b19waHlzKHZvaWQgKl9fdmlydF9hZGRyKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX192aXJ0X2FkZHI7XG4rXHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWw7XG4gXHRwaHlzX2FkZHJfdCBwaHlzX2FkZHI7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbi1cdGVudW0gcGdfbGV2ZWwgbGV2ZWw7XG4gXHRwdGVfdCAqcHRlO1xuIFxuIFx0cHRlID0gbG9va3VwX2FkZHJlc3ModmlydF9hZGRyLCBcdTAwMjZsZXZlbCk7XG5AQCAtODY0LDExICs2NjUsMTEgQEAgcGh5c19hZGRyX3Qgc2xvd192aXJ0X3RvX3BoeXModm9pZCAqX192aXJ0X2FkZHIpXG4gXHQgKiBtYWtlIDMyLVBBRSBrZXJuZWwgd29yayBjb3JyZWN0bHkuXG4gXHQgKi9cbiBcdHN3aXRjaCAobGV2ZWwpIHtcbi1cdGNhc2UgUEdfTEVWRUxfMUc6XG4rXHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxuIFx0XHRwaHlzX2FkZHIgPSAocGh5c19hZGRyX3QpcHVkX3BmbigqKHB1ZF90ICopcHRlKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiBcdFx0b2Zmc2V0ID0gdmlydF9hZGRyIFx1MDAyNiB+UFVEX01BU0s7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSBQR19MRVZFTF8yTTpcbitcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XG4gXHRcdHBoeXNfYWRkciA9IChwaHlzX2FkZHJfdClwbWRfcGZuKCoocG1kX3QgKilwdGUpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuIFx0XHRvZmZzZXQgPSB2aXJ0X2FkZHIgXHUwMDI2IH5QTURfTUFTSztcbiBcdFx0YnJlYWs7XG5AQCAtOTI1LDMwICs3MjYsMjcgQEAgc3RhdGljIHBncHJvdF90IHBncHJvdF9jbGVhcl9wcm90bm9uZV9iaXRzKHBncHJvdF90IHByb3QpXG4gXHRyZXR1cm4gcHJvdDtcbiB9XG4gXG4tc3RhdGljIGludCBfX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHB0ZV90ICprcHRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tXHRcdFx0XHQgICAgIHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuK2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuK1x0XHRcdFx0IHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBudW1wYWdlcywgcG1hc2ssIHBzaXplLCBscGFkZHIsIHBmbiwgb2xkX3BmbjtcbiBcdHBncHJvdF90IG9sZF9wcm90LCBuZXdfcHJvdCwgcmVxX3Byb3QsIGNoa19wcm90O1xuLVx0cHRlX3QgbmV3X3B0ZSwgKnRtcDtcbi1cdGVudW0gcGdfbGV2ZWwgbGV2ZWw7XG4tXHRib29sIG54LCBydztcbi1cbi1cdC8qXG4tXHQgKiBDaGVjayBmb3IgcmFjZXMsIGFub3RoZXIgQ1BVIG1pZ2h0IGhhdmUgc3BsaXQgdGhpcyBwYWdlXG4tXHQgKiB1cCBhbHJlYWR5OlxuLVx0ICovXG4tXHR0bXAgPSBfbG9va3VwX2FkZHJlc3NfY3BhKGNwYSwgYWRkcmVzcywgXHUwMDI2bGV2ZWwsIFx1MDAyNm54LCBcdTAwMjZydyk7XG4tXHRpZiAodG1wICE9IGtwdGUpXG4tXHRcdHJldHVybiAxO1xuK1x0dW5zaWduZWQgbG9uZyBudW1wYWdlcywgbHBhZGRyLCBwZm4sIG9sZF9wZm47XG4rXHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cdTAwM2VsZXZlbDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHNkLVx1MDAzZWFkZHJlc3M7XG4rXHR1bnNpZ25lZCBsb25nIHBzaXplID0gc2QtXHUwMDNlcHNpemU7XG4rXHR1bnNpZ25lZCBsb25nIHBtYXNrID0gc2QtXHUwMDNlcG1hc2s7XG4rXHRwdGVfdCAqa3B0ZSA9IHNkLVx1MDAzZWtwdGU7XG4rXHRib29sIG54ID0gc2QtXHUwMDNlbng7XG4rXHRib29sIHJ3ID0gc2QtXHUwMDNlcnc7XG4rXHRwdGVfdCBuZXdfcHRlO1xuIFxuIFx0c3dpdGNoIChsZXZlbCkge1xuLVx0Y2FzZSBQR19MRVZFTF8yTTpcbitcdGNhc2UgUEdUQUJMRV9MRVZFTF9QTUQ6XG4gXHRcdG9sZF9wcm90ID0gcG1kX3BncHJvdCgqKHBtZF90ICopa3B0ZSk7XG4gXHRcdG9sZF9wZm4gPSBwbWRfcGZuKCoocG1kX3QgKilrcHRlKTtcbiBcdFx0Y3BhX2luY18ybV9jaGVja2VkKCk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSBQR19MRVZFTF8xRzpcbitcdGNhc2UgUEdUQUJMRV9MRVZFTF9QVUQ6XG4gXHRcdG9sZF9wcm90ID0gcHVkX3BncHJvdCgqKHB1ZF90ICopa3B0ZSk7XG4gXHRcdG9sZF9wZm4gPSBwdWRfcGZuKCoocHVkX3QgKilrcHRlKTtcbiBcdFx0Y3BhX2luY18xZ19jaGVja2VkKCk7XG5AQCAtOTU3LDE4ICs3NTUsNiBAQCBzdGF0aWMgaW50IF9fc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHR9XG4gXG4tXHRwc2l6ZSA9IHBhZ2VfbGV2ZWxfc2l6ZShsZXZlbCk7XG4tXHRwbWFzayA9IHBhZ2VfbGV2ZWxfbWFzayhsZXZlbCk7XG4tXG4tXHQvKlxuLVx0ICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMsIHdoaWNoIGZpdCBpbnRvIHRoaXMgbGFyZ2Vcbi1cdCAqIHBhZ2Ugc3RhcnRpbmcgYXQgYWRkcmVzczpcbi1cdCAqL1xuLVx0bHBhZGRyID0gKGFkZHJlc3MgKyBwc2l6ZSkgXHUwMDI2IHBtYXNrO1xuLVx0bnVtcGFnZXMgPSAobHBhZGRyIC0gYWRkcmVzcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4tXHRpZiAobnVtcGFnZXMgXHUwMDNjIGNwYS1cdTAwM2VudW1wYWdlcylcbi1cdFx0Y3BhLVx1MDAzZW51bXBhZ2VzID0gbnVtcGFnZXM7XG4tXG4gXHQvKlxuIFx0ICogV2UgYXJlIHNhZmUgbm93LiBDaGVjayB3aGV0aGVyIHRoZSBuZXcgcGdwcm90IGlzIHRoZSBzYW1lOlxuIFx0ICogQ29udmVydCBwcm90ZWN0aW9uIGF0dHJpYnV0ZXMgdG8gNGstZm9ybWF0LCBhcyBjcGEtXHUwMDNlbWFzayogYXJlIHNldFxuQEAgLTEwNzIsMjEgKzg1OCw2IEBAIHN0YXRpYyBpbnQgX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2UocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuLXtcbi1cdGludCBkb19zcGxpdDtcbi1cbi1cdGlmIChjcGEtXHUwMDNlZm9yY2Vfc3BsaXQpXG4tXHRcdHJldHVybiAxO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBnZF9sb2NrKTtcbi1cdGRvX3NwbGl0ID0gX19zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShrcHRlLCBhZGRyZXNzLCBjcGEpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuLVxuLVx0cmV0dXJuIGRvX3NwbGl0O1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBzcGxpdF9zZXRfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIHBmbixcbiBcdFx0XHQgIHBncHJvdF90IHJlZl9wcm90LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICB1bnNpZ25lZCBsb25nIHNpemUpXG5AQCAtMTEyMywzMyArODk0LDIyIEBAIHN0YXRpYyB2b2lkIHNwbGl0X3NldF9wdGUoc3RydWN0IGNwYV9kYXRhICpjcGEsIHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0c2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCByZWZfcHJvdCkpO1xuIH1cbiBcbi1zdGF0aWMgaW50XG4tX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLVx0XHQgICBzdHJ1Y3QgcHRkZXNjICpwdGRlc2MpXG4raW50IGFyY2hfc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGxwYWRkciwgbHBpbmMsIHJlZl9wZm4sIHBmbiwgcGZuaW5jID0gMTtcbitcdHN0cnVjdCBwdGRlc2MgKnB0ZGVzYyA9IHNkLVx1MDAzZXB0ZGVzYztcbiBcdHN0cnVjdCBwYWdlICpiYXNlID0gcHRkZXNjX3BhZ2UocHRkZXNjKTtcbiBcdHB0ZV90ICpwYmFzZSA9IChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhiYXNlKTtcbi1cdHVuc2lnbmVkIGludCBpLCBsZXZlbDtcbitcdGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCA9IHNkLVx1MDAzZWxldmVsO1xuK1x0dW5zaWduZWQgbG9uZyBhZGRyZXNzID0gc2QtXHUwMDNlYWRkcmVzcztcbitcdHB0ZV90ICprcHRlID0gc2QtXHUwMDNla3B0ZTtcbitcdHVuc2lnbmVkIGludCBpO1xuIFx0cGdwcm90X3QgcmVmX3Byb3Q7XG4tXHRib29sIG54LCBydztcbi1cdHB0ZV90ICp0bXA7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2cGdkX2xvY2spO1xuLVx0Lypcbi1cdCAqIENoZWNrIGZvciByYWNlcywgYW5vdGhlciBDUFUgbWlnaHQgaGF2ZSBzcGxpdCB0aGlzIHBhZ2Vcbi1cdCAqIHVwIGZvciB1cyBhbHJlYWR5OlxuLVx0ICovXG4tXHR0bXAgPSBfbG9va3VwX2FkZHJlc3NfY3BhKGNwYSwgYWRkcmVzcywgXHUwMDI2bGV2ZWwsIFx1MDAyNm54LCBcdTAwMjZydyk7XG4tXHRpZiAodG1wICE9IGtwdGUpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuLVx0XHRyZXR1cm4gMTtcbi1cdH1cbiBcbiBcdHBhcmF2aXJ0X2FsbG9jX3B0ZShcdTAwMjZpbml0X21tLCBwYWdlX3RvX3BmbihiYXNlKSk7XG4gXG4gXHRzd2l0Y2ggKGxldmVsKSB7XG4tXHRjYXNlIFBHX0xFVkVMXzJNOlxuK1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BNRDpcbiBcdFx0cmVmX3Byb3QgPSBwbWRfcGdwcm90KCoocG1kX3QgKilrcHRlKTtcbiBcdFx0LypcbiBcdFx0ICogQ2xlYXIgUFNFIChha2EgX1BBR0VfUEFUKSBhbmQgbW92ZVxuQEAgLTExNjEsNyArOTIxLDcgQEAgX19zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0XHRscGluYyA9IFBBR0VfU0laRTtcbiBcdFx0YnJlYWs7XG4gXG4tXHRjYXNlIFBHX0xFVkVMXzFHOlxuK1x0Y2FzZSBQR1RBQkxFX0xFVkVMX1BVRDpcbiBcdFx0cmVmX3Byb3QgPSBwdWRfcGdwcm90KCoocHVkX3QgKilrcHRlKTtcbiBcdFx0cmVmX3BmbiA9IHB1ZF9wZm4oKihwdWRfdCAqKWtwdGUpO1xuIFx0XHRwZm5pbmMgPSBQTURfU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbkBAIC0xMTc3LDcgKzkzNyw2IEBAIF9fc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcdFx0YnJlYWs7XG4gXG4gXHRkZWZhdWx0OlxuLVx0XHRzcGluX3VubG9jayhcdTAwMjZwZ2RfbG9jayk7XG4gXHRcdHJldHVybiAxO1xuIFx0fVxuIFxuQEAgLTEyMjUsMjYgKzk4NCw2IEBAIF9fc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcdCAqIGp1c3Qgc3BsaXQgbGFyZ2UgcGFnZSBlbnRyeS5cbiBcdCAqL1xuIFx0Zmx1c2hfdGxiX2FsbCgpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuLVxuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBpbnQgc3BsaXRfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsXG4tXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbi17XG4tXHRzdHJ1Y3QgcHRkZXNjICpwdGRlc2M7XG4tXG4tXHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbi1cdHB0ZGVzYyA9IHBhZ2V0YWJsZV9hbGxvYyhHRlBfS0VSTkVMLCAwKTtcbi1cdGlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbi1cdGlmICghcHRkZXNjKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdGlmIChfX3NwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzLCBwdGRlc2MpKVxuLVx0XHRwYWdldGFibGVfZnJlZShwdGRlc2MpO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTEzMTQsNyArMTA1Myw3IEBAIHN0YXRpYyBpbnQgY29sbGFwc2VfcG1kX3BhZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0fVxuIFxuIFx0aWYgKHZpcnRfYWRkcl92YWxpZChhZGRyKSBcdTAwMjZcdTAwMjYgcGZuX3JhbmdlX2lzX21hcHBlZChwZm4sIHBmbiArIDEpKVxuLVx0XHRjb2xsYXBzZV9wYWdlX2NvdW50KFBHX0xFVkVMXzJNKTtcbitcdFx0Y29sbGFwc2VfcGFnZV9jb3VudChQR1RBQkxFX0xFVkVMX1BNRCk7XG4gXG4gXHRyZXR1cm4gMTtcbiB9XG5AQCAtMTM2MSw3ICsxMTAwLDcgQEAgc3RhdGljIGludCBjb2xsYXBzZV9wdWRfcGFnZShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHRzZXRfcHVkKHB1ZCwgcGZuX3B1ZChwZm4sIHBtZF9wZ3Byb3QoZmlyc3QpKSk7XG4gXG4gXHRpZiAodmlydF9hZGRyX3ZhbGlkKGFkZHIpIFx1MDAyNlx1MDAyNiBwZm5fcmFuZ2VfaXNfbWFwcGVkKHBmbiwgcGZuICsgMSkpXG4tXHRcdGNvbGxhcHNlX3BhZ2VfY291bnQoUEdfTEVWRUxfMUcpO1xuK1x0XHRjb2xsYXBzZV9wYWdlX2NvdW50KFBHVEFCTEVfTEVWRUxfUFVEKTtcbiBcbiBcdHJldHVybiAxO1xuIH1cbkBAIC0xODAwLDggKzE1MzksOCBAQCBzdGF0aWMgaW50IHBvcHVsYXRlX3BnZChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbi1cdFx0XHQgICAgICAgaW50IHByaW1hcnkpXG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXG4rXHRcdFx0ICAgaW50IHByaW1hcnkpXG4ge1xuIFx0aWYgKGNwYS1cdTAwM2VwZ2QpIHtcbiBcdFx0LypcbkBAIC0xODMzLDcgKzE1NzIsNyBAQCBzdGF0aWMgaW50IF9fY3BhX3Byb2Nlc3NfZmF1bHQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgdmFkZHIsXG4gXHRcdGNwYS1cdTAwM2VwZm4gPSBfX3BhKHZhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHR9IGVsc2UgaWYgKF9fY3BhX3Bmbl9pbl9oaWdobWFwKGNwYS1cdTAwM2VwZm4pKSB7XG4rXHR9IGVsc2UgaWYgKHBmbl9pc19rZXJuZWwoY3BhLVx1MDAzZXBmbikpIHtcbiBcdFx0LyogRmF1bHRzIGluIHRoZSBoaWdobWFwIGFyZSBPSywgc28gZG8gbm90IHdhcm46ICovXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fSBlbHNlIHtcbkBAIC0xODQ1LDkwICsxNTg0LDQ1IEBAIHN0YXRpYyBpbnQgX19jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbiBcdH1cbiB9XG4gXG4tc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KVxuK3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdCAgICAgcHRlX3QgKmtwdGUsIHB0ZV90IG9sZF9wdGUsIGJvb2wgbngsIGJvb2wgcncpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyZXNzO1xuLVx0aW50IGRvX3NwbGl0LCBlcnI7XG4tXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XG4tXHRwdGVfdCAqa3B0ZSwgb2xkX3B0ZTtcbi1cdGJvb2wgbngsIHJ3O1xuLVxuLVx0YWRkcmVzcyA9IF9fY3BhX2FkZHIoY3BhLCBjcGEtXHUwMDNlY3VycGFnZSk7XG4tcmVwZWF0OlxuLVx0a3B0ZSA9IF9sb29rdXBfYWRkcmVzc19jcGEoY3BhLCBhZGRyZXNzLCBcdTAwMjZsZXZlbCwgXHUwMDI2bngsIFx1MDAyNnJ3KTtcbi1cdGlmICgha3B0ZSlcbi1cdFx0cmV0dXJuIF9fY3BhX3Byb2Nlc3NfZmF1bHQoY3BhLCBhZGRyZXNzLCBwcmltYXJ5KTtcbitcdHB0ZV90IG5ld19wdGU7XG4rXHRwZ3Byb3RfdCBvbGRfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7XG4rXHRwZ3Byb3RfdCBuZXdfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7XG4rXHR1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ob2xkX3B0ZSk7XG4gXG4tXHRvbGRfcHRlID0gKmtwdGU7XG4tXHRpZiAocHRlX25vbmUob2xkX3B0ZSkpXG4tXHRcdHJldHVybiBfX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSBcdTAwMjY9IH5wZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX2Nscik7XG4rXHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4tXHRpZiAobGV2ZWwgPT0gUEdfTEVWRUxfNEspIHtcbi1cdFx0cHRlX3QgbmV3X3B0ZTtcbi1cdFx0cGdwcm90X3Qgb2xkX3Byb3QgPSBwdGVfcGdwcm90KG9sZF9wdGUpO1xuLVx0XHRwZ3Byb3RfdCBuZXdfcHJvdCA9IHB0ZV9wZ3Byb3Qob2xkX3B0ZSk7XG4tXHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihvbGRfcHRlKTtcbi1cbi1cdFx0cGdwcm90X3ZhbChuZXdfcHJvdCkgXHUwMDI2PSB+cGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19jbHIpO1xuLVx0XHRwZ3Byb3RfdmFsKG5ld19wcm90KSB8PSBwZ3Byb3RfdmFsKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4tXG4tXHRcdGNwYV9pbmNfNGtfaW5zdGFsbCgpO1xuLVx0XHQvKiBIYW5kIGluIGxwc2l6ZSA9IDAgdG8gZW5mb3JjZSB0aGUgcHJvdGVjdGlvbiBtZWNoYW5pc20gKi9cbi1cdFx0bmV3X3Byb3QgPSBzdGF0aWNfcHJvdGVjdGlvbnMobmV3X3Byb3QsIGFkZHJlc3MsIHBmbiwgMSwgMCxcbi1cdFx0XHRcdFx0ICAgICAgQ1BBX1BST1RFQ1QpO1xuLVxuLVx0XHRuZXdfcHJvdCA9IHZlcmlmeV9yd3gob2xkX3Byb3QsIG5ld19wcm90LCBhZGRyZXNzLCBwZm4sIDEsXG4tXHRcdFx0XHQgICAgICBueCwgcncpO1xuK1x0Y3BhX2luY180a19pbnN0YWxsKCk7XG4rXHQvKiBIYW5kIGluIGxwc2l6ZSA9IDAgdG8gZW5mb3JjZSB0aGUgcHJvdGVjdGlvbiBtZWNoYW5pc20gKi9cbitcdG5ld19wcm90ID0gc3RhdGljX3Byb3RlY3Rpb25zKG5ld19wcm90LCBhZGRyZXNzLCBwZm4sIDEsIDAsXG4rXHRcdFx0XHQgICAgICBDUEFfUFJPVEVDVCk7XG4gXG4tXHRcdG5ld19wcm90ID0gcGdwcm90X2NsZWFyX3Byb3Rub25lX2JpdHMobmV3X3Byb3QpO1xuK1x0bmV3X3Byb3QgPSB2ZXJpZnlfcnd4KG9sZF9wcm90LCBuZXdfcHJvdCwgYWRkcmVzcywgcGZuLCAxLCBueCwgcncpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBXZSBuZWVkIHRvIGtlZXAgdGhlIHBmbiBmcm9tIHRoZSBleGlzdGluZyBQVEUsXG4tXHRcdCAqIGFmdGVyIGFsbCB3ZSdyZSBvbmx5IGdvaW5nIHRvIGNoYW5nZSBpdHMgYXR0cmlidXRlc1xuLVx0XHQgKiBub3QgdGhlIG1lbW9yeSBpdCBwb2ludHMgdG9cbi1cdFx0ICovXG4tXHRcdG5ld19wdGUgPSBwZm5fcHRlKHBmbiwgbmV3X3Byb3QpO1xuLVx0XHRjcGEtXHUwMDNlcGZuID0gcGZuO1xuLVx0XHQvKlxuLVx0XHQgKiBEbyB3ZSByZWFsbHkgY2hhbmdlIGFueXRoaW5nID9cbi1cdFx0ICovXG4tXHRcdGlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHtcbi1cdFx0XHRzZXRfcHRlX2F0b21pYyhrcHRlLCBuZXdfcHRlKTtcbi1cdFx0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuLVx0XHR9XG4tXHRcdGNwYS1cdTAwM2VudW1wYWdlcyA9IDE7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuK1x0bmV3X3Byb3QgPSBwZ3Byb3RfY2xlYXJfcHJvdG5vbmVfYml0cyhuZXdfcHJvdCk7XG4gXG4gXHQvKlxuLVx0ICogQ2hlY2ssIHdoZXRoZXIgd2UgY2FuIGtlZXAgdGhlIGxhcmdlIHBhZ2UgaW50YWN0XG4tXHQgKiBhbmQganVzdCBjaGFuZ2UgdGhlIHB0ZTpcbi1cdCAqL1xuLVx0ZG9fc3BsaXQgPSBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZShrcHRlLCBhZGRyZXNzLCBjcGEpO1xuLVx0Lypcbi1cdCAqIFdoZW4gdGhlIHJhbmdlIGZpdHMgaW50byB0aGUgZXhpc3RpbmcgbGFyZ2UgcGFnZSxcbi1cdCAqIHJldHVybi4gY3AtXHUwMDNlbnVtcGFnZXMgYW5kIGNwYS1cdTAwM2V0bGJmbHVzaCBoYXZlIGJlZW4gdXBkYXRlZCBpblxuLVx0ICogdHJ5X2xhcmdlX3BhZ2U6XG4rXHQgKiBXZSBuZWVkIHRvIGtlZXAgdGhlIHBmbiBmcm9tIHRoZSBleGlzdGluZyBQVEUsIGFmdGVyIGFsbCB3ZSdyZSBvbmx5XG4rXHQgKiBnb2luZyB0byBjaGFuZ2UgaXRzIGF0dHJpYnV0ZXMgbm90IHRoZSBtZW1vcnkgaXQgcG9pbnRzIHRvXG4gXHQgKi9cbi1cdGlmIChkb19zcGxpdCBcdTAwM2M9IDApXG4tXHRcdHJldHVybiBkb19zcGxpdDtcbi1cbitcdG5ld19wdGUgPSBwZm5fcHRlKHBmbiwgbmV3X3Byb3QpO1xuK1x0Y3BhLVx1MDAzZXBmbiA9IHBmbjtcbiBcdC8qXG4tXHQgKiBXZSBoYXZlIHRvIHNwbGl0IHRoZSBsYXJnZSBwYWdlOlxuK1x0ICogRG8gd2UgcmVhbGx5IGNoYW5nZSBhbnl0aGluZyA/XG4gXHQgKi9cbi1cdGVyciA9IHNwbGl0X2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRnb3RvIHJlcGVhdDtcbi1cbi1cdHJldHVybiBlcnI7XG4rXHRpZiAocHRlX3ZhbChvbGRfcHRlKSAhPSBwdGVfdmFsKG5ld19wdGUpKSB7XG4rXHRcdHNldF9wdGVfYXRvbWljKGtwdGUsIG5ld19wdGUpO1xuK1x0XHRjcGEtXHUwMDNlZmxhZ3MgfD0gQ1BBX0ZMVVNIVExCO1xuK1x0fVxuIH1cbiBcbi1zdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSk7XG4tXG4gLypcbiAgKiBDaGVjayB0aGUgZGlyZWN0bWFwIGFuZCBcImhpZ2gga2VybmVsIG1hcFwiICdhbGlhc2VzJy5cbiAgKi9cbi1zdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuK2ludCBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIHtcbiBcdHN0cnVjdCBjcGFfZGF0YSBhbGlhc19jcGE7XG4gXHR1bnNpZ25lZCBsb25nIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShjcGEtXHUwMDNlcGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKTtcbkBAIC0xOTQyLDcgKzE2MzYsNyBAQCBzdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIFx0ICogTm8gbmVlZCB0byByZWRvLCB3aGVuIHRoZSBwcmltYXJ5IGNhbGwgdG91Y2hlZCB0aGUgZGlyZWN0XG4gXHQgKiBtYXBwaW5nIGFscmVhZHk6XG4gXHQgKi9cbi1cdHZhZGRyID0gX19jcGFfYWRkcihjcGEsIGNwYS1cdTAwM2VjdXJwYWdlKTtcbitcdHZhZGRyID0gY3BhX2FkZHIoY3BhLCBjcGEtXHUwMDNlY3VycGFnZSk7XG4gXHRpZiAoISh3aXRoaW4odmFkZHIsIFBBR0VfT0ZGU0VULFxuIFx0XHQgICAgUEFHRV9PRkZTRVQgKyAobWF4X3Bmbl9tYXBwZWQgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkpIHtcbiBcbkBAIC0xOTcxLDcgKzE2NjUsNyBAQCBzdGF0aWMgaW50IGNwYV9wcm9jZXNzX2FsaWFzKHN0cnVjdCBjcGFfZGF0YSAqY3BhKVxuIFx0ICogdG8gdG91Y2ggdGhlIGhpZ2ggbWFwcGVkIGtlcm5lbCBhcyB3ZWxsOlxuIFx0ICovXG4gXHRpZiAoIXdpdGhpbih2YWRkciwgKHVuc2lnbmVkIGxvbmcpX3RleHQsIF9icmtfZW5kKSBcdTAwMjZcdTAwMjZcbi1cdCAgICBfX2NwYV9wZm5faW5faGlnaG1hcChjcGEtXHUwMDNlcGZuKSkge1xuK1x0ICAgIHBmbl9pc19rZXJuZWwoY3BhLVx1MDAzZXBmbikpIHtcbiBcdFx0dW5zaWduZWQgbG9uZyB0ZW1wX2NwYV92YWRkciA9IChjcGEtXHUwMDNlcGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSArXG4gXHRcdFx0XHRcdCAgICAgICBfX1NUQVJUX0tFUk5FTF9tYXAgLSBwaHlzX2Jhc2U7XG4gXHRcdGFsaWFzX2NwYSA9ICpjcGE7XG5AQCAtMjAwMCwxNjggKzE2OTQsMjUgQEAgc3RhdGljIGludCBjcGFfcHJvY2Vzc19hbGlhcyhzdHJ1Y3QgY3BhX2RhdGEgKmNwYSlcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSlcbi17XG4tXHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzID0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuLVx0dW5zaWduZWQgbG9uZyByZW1wYWdlcyA9IG51bXBhZ2VzO1xuLVx0aW50IHJldCA9IDA7XG4tXG4tXHQvKlxuLVx0ICogTm8gY2hhbmdlcywgZWFzeSFcbi1cdCAqL1xuLVx0aWYgKCEocGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19zZXQpIHwgcGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19jbHIpKSBcdTAwMjZcdTAwMjZcbi1cdCAgICAhY3BhLVx1MDAzZWZvcmNlX3NwbGl0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0d2hpbGUgKHJlbXBhZ2VzKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFN0b3JlIHRoZSByZW1haW5pbmcgbnIgb2YgcGFnZXMgZm9yIHRoZSBsYXJnZSBwYWdlXG4tXHRcdCAqIHByZXNlcnZhdGlvbiBjaGVjay5cbi1cdFx0ICovXG4tXHRcdGNwYS1cdTAwM2VudW1wYWdlcyA9IHJlbXBhZ2VzO1xuLVx0XHQvKiBmb3IgYXJyYXkgY2hhbmdlcywgd2UgY2FuJ3QgdXNlIGxhcmdlIHBhZ2UgKi9cbi1cdFx0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpXG4tXHRcdFx0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbi1cbi1cdFx0aWYgKCFkZWJ1Z19wYWdlYWxsb2NfZW5hYmxlZCgpKVxuLVx0XHRcdHNwaW5fbG9jayhcdTAwMjZjcGFfbG9jayk7XG4tXHRcdHJldCA9IF9fY2hhbmdlX3BhZ2VfYXR0cihjcGEsIHByaW1hcnkpO1xuLVx0XHRpZiAoIWRlYnVnX3BhZ2VhbGxvY19lbmFibGVkKCkpXG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2Y3BhX2xvY2spO1xuLVx0XHRpZiAocmV0KVxuLVx0XHRcdGdvdG8gb3V0O1xuLVxuLVx0XHRpZiAocHJpbWFyeSBcdTAwMjZcdTAwMjYgIShjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IENQQV9OT19DSEVDS19BTElBUykpIHtcbi1cdFx0XHRyZXQgPSBjcGFfcHJvY2Vzc19hbGlhcyhjcGEpO1xuLVx0XHRcdGlmIChyZXQpXG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHQvKlxuLVx0XHQgKiBBZGp1c3QgdGhlIG51bWJlciBvZiBwYWdlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlXG4tXHRcdCAqIENQQSBvcGVyYXRpb24uIEVpdGhlciBhIGxhcmdlIHBhZ2UgaGFzIGJlZW5cbi1cdFx0ICogcHJlc2VydmVkIG9yIGEgc2luZ2xlIHBhZ2UgdXBkYXRlIGhhcHBlbmVkLlxuLVx0XHQgKi9cbi1cdFx0QlVHX09OKGNwYS1cdTAwM2VudW1wYWdlcyBcdTAwM2UgcmVtcGFnZXMgfHwgIWNwYS1cdTAwM2VudW1wYWdlcyk7XG4tXHRcdHJlbXBhZ2VzIC09IGNwYS1cdTAwM2VudW1wYWdlcztcbi1cdFx0Y3BhLVx1MDAzZWN1cnBhZ2UgKz0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuLVx0fVxuLVxuLW91dDpcbi1cdC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIG51bXBhZ2VzICovXG4tXHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbi1cdFx0XHRcdCAgICBwZ3Byb3RfdCBtYXNrX3NldCwgcGdwcm90X3QgbWFza19jbHIsXG4tXHRcdFx0XHQgICAgaW50IGZvcmNlX3NwbGl0LCBpbnQgaW5fZmxhZyxcbi1cdFx0XHRcdCAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuK3ZvaWQgYXJjaF9jcGFfZmx1c2goc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBlcnIpXG4ge1xuLVx0c3RydWN0IGNwYV9kYXRhIGNwYTtcbi1cdGludCByZXQsIGNhY2hlO1xuLVxuLVx0bWVtc2V0KFx1MDAyNmNwYSwgMCwgc2l6ZW9mKGNwYSkpO1xuLVxuLVx0Lypcbi1cdCAqIENoZWNrLCBpZiB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNldCBhIG5vdCBzdXBwb3J0ZWRcbi1cdCAqIGZlYXR1cmUuICBDbGVhcmluZyBub24tc3VwcG9ydGVkIGZlYXR1cmVzIGlzIE9LLlxuLVx0ICovXG4tXHRtYXNrX3NldCA9IGNhbm9uX3BncHJvdChtYXNrX3NldCk7XG4tXG4tXHRpZiAoIXBncHJvdF92YWwobWFza19zZXQpIFx1MDAyNlx1MDAyNiAhcGdwcm90X3ZhbChtYXNrX2NscikgXHUwMDI2XHUwMDI2ICFmb3JjZV9zcGxpdClcbi1cdFx0cmV0dXJuIDA7XG4tXG4tXHQvKiBFbnN1cmUgd2UgYXJlIFBBR0VfU0laRSBhbGlnbmVkICovXG4tXHRpZiAoaW5fZmxhZyBcdTAwMjYgQ1BBX0FSUkFZKSB7XG4tXHRcdGludCBpO1xuLVx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1wYWdlczsgaSsrKSB7XG4tXHRcdFx0aWYgKGFkZHJbaV0gXHUwMDI2IH5QQUdFX01BU0spIHtcbi1cdFx0XHRcdGFkZHJbaV0gXHUwMDI2PSBQQUdFX01BU0s7XG4tXHRcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHR9IGVsc2UgaWYgKCEoaW5fZmxhZyBcdTAwMjYgQ1BBX1BBR0VTX0FSUkFZKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBpbl9mbGFnIG9mIENQQV9QQUdFU19BUlJBWSBpbXBsaWVzIGl0IGlzIGFsaWduZWQuXG4tXHRcdCAqIE5vIG5lZWQgdG8gY2hlY2sgaW4gdGhhdCBjYXNlXG4tXHRcdCAqL1xuLVx0XHRpZiAoKmFkZHIgXHUwMDI2IH5QQUdFX01BU0spIHtcbi1cdFx0XHQqYWRkciBcdTAwMjY9IFBBR0VfTUFTSztcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFBlb3BsZSBzaG91bGQgbm90IGJlIHBhc3NpbmcgaW4gdW5hbGlnbmVkIGFkZHJlc3Nlczpcbi1cdFx0XHQgKi9cbi1cdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdH1cbi1cdH1cbi1cbi1cdC8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqL1xuLVx0a21hcF9mbHVzaF91bnVzZWQoKTtcbi1cbi1cdHZtX3VubWFwX2FsaWFzZXMoKTtcbi1cbi1cdGNwYS52YWRkciA9IGFkZHI7XG4tXHRjcGEucGFnZXMgPSBwYWdlcztcbi1cdGNwYS5udW1wYWdlcyA9IG51bXBhZ2VzO1xuLVx0Y3BhLm1hc2tfc2V0ID0gbWFza19zZXQ7XG4tXHRjcGEubWFza19jbHIgPSBtYXNrX2Nscjtcbi1cdGNwYS5mbGFncyA9IGluX2ZsYWc7XG4tXHRjcGEuY3VycGFnZSA9IDA7XG4tXHRjcGEuZm9yY2Vfc3BsaXQgPSBmb3JjZV9zcGxpdDtcbi1cbi1cdHJldCA9IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKFx1MDAyNmNwYSwgMSk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2sgd2hldGhlciB3ZSByZWFsbHkgY2hhbmdlZCBzb21ldGhpbmc6XG4tXHQgKi9cbi1cdGlmICghKGNwYS5mbGFncyBcdTAwMjYgQ1BBX0ZMVVNIVExCKSlcbi1cdFx0Z290byBvdXQ7XG4rXHRpbnQgY2FjaGU7XG4gXG4gXHQvKlxuIFx0ICogTm8gbmVlZCB0byBmbHVzaCwgd2hlbiB3ZSBkaWQgbm90IHNldCBhbnkgb2YgdGhlIGNhY2hpbmdcbiBcdCAqIGF0dHJpYnV0ZXM6XG4gXHQgKi9cbi1cdGNhY2hlID0gISFwZ3Byb3QyY2FjaGVtb2RlKG1hc2tfc2V0KTtcbitcdGNhY2hlID0gISFwZ3Byb3QyY2FjaGVtb2RlKGNwYS1cdTAwM2VtYXNrX3NldCk7XG4gXG4gXHQvKlxuIFx0ICogT24gZXJyb3I7IGZsdXNoIGV2ZXJ5dGhpbmcgdG8gYmUgc3VyZS5cbiBcdCAqL1xuLVx0aWYgKHJldCkge1xuK1x0aWYgKGVycikge1xuIFx0XHRjcGFfZmx1c2hfYWxsKGNhY2hlKTtcbi1cdFx0Z290byBvdXQ7XG4rXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdGNwYV9mbHVzaChcdTAwMjZjcGEsIGNhY2hlKTtcbi1vdXQ6XG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldCh1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsXG4tXHRcdFx0XHQgICAgICAgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxuLXtcbi1cdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxuLVx0XHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgaW50IGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxuLVx0XHRcdFx0XHQgcGdwcm90X3QgbWFzaywgaW50IGFycmF5KVxuLXtcbi1cdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KDApLCBtYXNrLCAwLFxuLVx0XHQoYXJyYXkgPyBDUEFfQVJSQVkgOiAwKSwgTlVMTCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgaW50IGNwYV9zZXRfcGFnZXNfYXJyYXkoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLFxuLVx0XHRcdFx0ICAgICAgIHBncHJvdF90IG1hc2spXG4te1xuLVx0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihOVUxMLCBudW1wYWdlcywgbWFzaywgX19wZ3Byb3QoMCksIDAsXG4tXHRcdENQQV9QQUdFU19BUlJBWSwgcGFnZXMpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGludCBjcGFfY2xlYXJfcGFnZXNfYXJyYXkoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLFxuLVx0XHRcdFx0XHQgcGdwcm90X3QgbWFzaylcbi17XG4tXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCxcbi1cdFx0Q1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7XG4rXHRjcGFfZmx1c2goY3BhLCBjYWNoZSk7XG4gfVxuIFxuIGludCBfc2V0X21lbW9yeV91Yyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbkBAIC0yNzczLDExICsyMzI0LDMgQEAgaW50IF9faW5pdCBrZXJuZWxfdW5tYXBfcGFnZXNfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiBcbiBcdHJldHVybiByZXR2YWw7XG4gfVxuLVxuLS8qXG4tICogVGhlIHRlc3RjYXNlcyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZG4ndFxuLSAqIGJlIGV4cG9zZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gSW5jbHVkZSB0aGVzZSBkaXJlY3RseSBoZXJlLlxuLSAqL1xuLSNpZmRlZiBDT05GSUdfQ1BBX0RFQlVHXG4tI2luY2x1ZGUgXCJjcGEtdGVzdC5jXCJcbi0jZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaCBiL2luY2x1ZGUvbGludXgvcGd0YWJsZS5oXG5pbmRleCAyOTgxZTM4NmRhN2IzYy4uZDFkZjgzNDU4NTJiZTggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BndGFibGUuaFxuKysrIGIvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmhcbkBAIC0xNzgyLDYgKzE3ODIsMTAgQEAgdm9pZCBhcmNoX3N5bmNfa2VybmVsX21hcHBpbmdzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTtcbiAgKiBiZWNhdXNlIHRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCBldmVuIGlmIENPTkZJR19NTVUgaXMgbm90IGRlZmluZWQuXG4gICovXG4gXG4rI2lmbmRlZiBjYW5vbl9wZ3Byb3RcbisjZGVmaW5lIGNhbm9uX3BncHJvdChwcm90KVx0KHByb3QpXG4rI2VuZGlmXG4rXG4gI2lmbmRlZiBwZ3Byb3RfbnhcbiAjZGVmaW5lIHBncHJvdF9ueChwcm90KVx0KHByb3QpXG4gI2VuZGlmXG5AQCAtMjEwNSw2ICsyMTA5LDQ2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF93cml0ZShwdWRfdCBwdWQpXG4gfVxuICNlbmRpZiAvKiBwdWRfd3JpdGUgKi9cbiBcbisjaWZuZGVmIHA0ZF93cml0ZVxuK3N0YXRpYyBpbmxpbmUgaW50IHA0ZF93cml0ZShwNGRfdCBwNGQpXG4re1xuK1x0QlVHKCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rI2VuZGlmIC8qIHA0ZF93cml0ZSAqL1xuK1xuKyNpZm5kZWYgcG1kX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwbWRfZXhlYyhwbWRfdCBwbWQpXG4re1xuK1x0QlVHKCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rI2VuZGlmIC8qIHBtZF9leGVjICovXG4rXG4rI2lmbmRlZiBwdWRfZXhlY1xuK3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9leGVjKHB1ZF90IHB1ZClcbit7XG4rXHRCVUcoKTtcbitcdHJldHVybiAwO1xuK31cbisjZW5kaWYgLyogcHVkX2V4ZWMgKi9cbitcbisjaWZuZGVmIHA0ZF9leGVjXG4rc3RhdGljIGlubGluZSBpbnQgcDRkX2V4ZWMocDRkX3QgcDRkKVxuK3tcbitcdEJVRygpO1xuK1x0cmV0dXJuIDA7XG4rfVxuKyNlbmRpZiAvKiBwNGRfZXhlYyAqL1xuK1xuKyNpZm5kZWYgcGdkX2V4ZWNcbitzdGF0aWMgaW5saW5lIGludCBwZ2RfZXhlYyhwZ2RfdCBwZ2QpXG4re1xuK1x0QlVHKCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rI2VuZGlmIC8qIHBnZF9leGVjICovXG4rXG4gI2lmICFkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgfHwgXFxcbiBcdCFkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKVxuIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF90cmFuc19odWdlKHB1ZF90IHB1ZClcbkBAIC0yMjk1LDE2ICsyMzM5LDIwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBhcmNoX2hhc19wZm5fbW9kaWZ5X2NoZWNrKHZvaWQpXG4gdHlwZWRlZiB1bnNpZ25lZCBpbnQgcGd0YmxfbW9kX21hc2s7XG4gXG4gZW51bSBwZ3RhYmxlX2xldmVsIHtcbi1cdFBHVEFCTEVfTEVWRUxfUFRFID0gMCxcbitcdFBHVEFCTEVfTEVWRUxfTk9ORSA9IDAsXG4rXHRQR1RBQkxFX0xFVkVMX1BURSxcbiBcdFBHVEFCTEVfTEVWRUxfUE1ELFxuIFx0UEdUQUJMRV9MRVZFTF9QVUQsXG4gXHRQR1RBQkxFX0xFVkVMX1A0RCxcbiBcdFBHVEFCTEVfTEVWRUxfUEdELFxuK1x0UEdUQUJMRV9MRVZFTF9OVU0sXG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBndGFibGVfbGV2ZWxfdG9fc3RyKGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbClcbiB7XG4gXHRzd2l0Y2ggKGxldmVsKSB7XG4rXHRjYXNlIFBHVEFCTEVfTEVWRUxfTk9ORTpcbitcdFx0cmV0dXJuIFwibm9uZVwiO1xuIFx0Y2FzZSBQR1RBQkxFX0xFVkVMX1BURTpcbiBcdFx0cmV0dXJuIFwicHRlXCI7XG4gXHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxuQEAgLTIzMjAsNiArMjM2OCwyOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBndGFibGVfbGV2ZWxfdG9fc3RyKGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbClcbiBcdH1cbiB9XG4gXG4rLyogU2l6ZSBvZiB0aGUgbWVtb3J5IG1hcHBlZCBieSBhIHNpbmdsZSBsZWFmIGVudHJ5IGF0IEBsZXZlbCAqL1xuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ3RhYmxlX2xldmVsX3NpemUoZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsKVxuK3tcbitcdHN3aXRjaCAobGV2ZWwpIHtcbitcdGNhc2UgUEdUQUJMRV9MRVZFTF9QVEU6XG4rXHRcdHJldHVybiBQQUdFX1NJWkU7XG4rXHRjYXNlIFBHVEFCTEVfTEVWRUxfUE1EOlxuK1x0XHRyZXR1cm4gUE1EX1NJWkU7XG4rXHRjYXNlIFBHVEFCTEVfTEVWRUxfUFVEOlxuK1x0XHRyZXR1cm4gUFVEX1NJWkU7XG4rXHRjYXNlIFBHVEFCTEVfTEVWRUxfUDREOlxuK1x0XHRyZXR1cm4gUDREX1NJWkU7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gUEdESVJfU0laRTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBndGFibGVfbGV2ZWxfbWFzayhlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4re1xuK1x0cmV0dXJuIH4ocGd0YWJsZV9sZXZlbF9zaXplKGxldmVsKSAtIDEpO1xuK31cbitcbiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqL1xuIFxuICNpZiAhZGVmaW5lZChNQVhfUE9TU0lCTEVfUEhZU01FTV9CSVRTKSBcdTAwMjZcdTAwMjYgIWRlZmluZWQoQ09ORklHXzY0QklUKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oIGIvaW5jbHVkZS9saW51eC9zZXRfbWVtb3J5LmhcbmluZGV4IDMwMzBkOTI0NWY1YWM4Li4xN2NiZTZlMjZjYjczMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2V0X21lbW9yeS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NldF9tZW1vcnkuaFxuQEAgLTg0LDQgKzg0LDEwMSBAQCBzdGF0aWMgaW5saW5lIGludCBzZXRfbWVtb3J5X2RlY3J5cHRlZCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcylcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19NRU1fRU5DUllQVCAqL1xuIFxuKyNpZmRlZiBDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGd0YWJsZS5oXHUwMDNlXG4rXG4rI2RlZmluZSBDUEFfRkxVU0hUTEIgMVxuKyNkZWZpbmUgQ1BBX0FSUkFZIDJcbisjZGVmaW5lIENQQV9QQUdFU19BUlJBWSA0XG4rI2RlZmluZSBDUEFfTk9fQ0hFQ0tfQUxJQVMgOCAvKiBEbyBub3Qgc2VhcmNoIGZvciBhbGlhc2VzICovXG4rI2RlZmluZSBDUEFfQ09MTEFQU0UgMTYgLyogdHJ5IHRvIGNvbGxhcHNlIGxhcmdlIHBhZ2VzICovXG4rXG4rLypcbisgKiBUaGUgY3VycmVudCBmbHVzaGluZyBjb250ZXh0IC0gd2UgcGFzcyBpdCBpbnN0ZWFkIG9mIDUgYXJndW1lbnRzOlxuKyAqL1xuK3N0cnVjdCBjcGFfZGF0YSB7XG4rXHR1bnNpZ25lZCBsb25nXHQqdmFkZHI7XG4rXHRwZ2RfdFx0XHQqcGdkO1xuK1x0cGdwcm90X3RcdG1hc2tfc2V0O1xuK1x0cGdwcm90X3RcdG1hc2tfY2xyO1xuK1x0dW5zaWduZWQgbG9uZ1x0bnVtcGFnZXM7XG4rXHR1bnNpZ25lZCBsb25nXHRjdXJwYWdlO1xuK1x0dW5zaWduZWQgbG9uZ1x0cGZuO1xuK1x0dW5zaWduZWQgaW50XHRmbGFncztcbitcdHVuc2lnbmVkIGludFx0Zm9yY2Vfc3BsaXRcdFx0OiAxLFxuK1x0XHRcdGZvcmNlX3N0YXRpY19wcm90XHQ6IDEsXG4rXHRcdFx0Zm9yY2VfZmx1c2hfYWxsXHRcdDogMTtcbitcdHN0cnVjdCBwYWdlXHQqKnBhZ2VzO1xuK307XG4rXG4rLypcbisgKiBjb250ZXh0IGZvciBjaGVja2luZyBmb3IgYSBzcGxpdCBhIGxhcmdlIHBhZ2UgYW5kIHNwbGl0dGluZyBpdCBpZiByZXF1aXJlZC5cbisgKi9cbitzdHJ1Y3QgcHRkZXNjO1xuK3N0cnVjdCBjcGFfc3BsaXRfZGF0YSB7XG4rXHR1bnNpZ25lZCBsb25nXHRhZGRyZXNzO1xuK1x0dW5zaWduZWQgbG9uZ1x0cHNpemU7XG4rXHR1bnNpZ25lZCBsb25nXHRwbWFzaztcbitcdHB0ZV90XHRcdCprcHRlO1xuK1x0c3RydWN0IHB0ZGVzY1x0KnB0ZGVzYztcbitcdGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbDtcbitcdGJvb2xcdFx0bng7XG4rXHRib29sXHRcdHJ3O1xuK307XG4rXG4rdW5zaWduZWQgbG9uZyBjcGFfYWRkcihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyBpZHgpO1xuK1xuK3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpO1xuK3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRcdCAgICAgdW5zaWduZWQgaW50ICpsZXZlbCk7XG4rcHRlX3QgKmxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0XHRcdCAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KTtcbitcbitpbnQgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgdW5zaWduZWQgbG9uZyB2YWRkcixcbitcdFx0XHQgICBpbnQgcHJpbWFyeSk7XG4raW50IGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXMoc3RydWN0IGNwYV9kYXRhICpjcGEpO1xuK2ludCBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuK1x0XHRcdFx0IHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpO1xuK2ludCBhcmNoX3NwbGl0X2xhcmdlX3BhZ2Uoc3RydWN0IGNwYV9kYXRhICpjcGEsIHN0cnVjdCBjcGFfc3BsaXRfZGF0YSAqc2QpO1xuK3ZvaWQgYXJjaF9jaGFuZ2VfcHRlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdCAgICAgcHRlX3QgKmtwdGUsIHB0ZV90IG9sZF9wdGUsIGJvb2wgbngsIGJvb2wgcncpO1xuK3ZvaWQgYXJjaF9jcGFfZmx1c2goc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBlcnIpO1xuK1xuK2ludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IHByaW1hcnkpO1xuK2ludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxuK1x0XHRcdCAgICAgcGdwcm90X3QgbWFza19zZXQsIHBncHJvdF90IG1hc2tfY2xyLFxuK1x0XHRcdCAgICAgaW50IGZvcmNlX3NwbGl0LCBpbnQgaW5fZmxhZyxcbitcdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpO1xuK1xuK3N0YXRpYyBpbmxpbmUgaW50IGNoYW5nZV9wYWdlX2F0dHJfc2V0KHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcyxcbitcdFx0XHRcdCAgICAgICBwZ3Byb3RfdCBtYXNrLCBpbnQgYXJyYXkpXG4re1xuK1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgbWFzaywgX19wZ3Byb3QoMCksIDAsXG4rXHRcdChhcnJheSA/IENQQV9BUlJBWSA6IDApLCBOVUxMKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcih1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsXG4rXHRcdFx0XHRcdCBwZ3Byb3RfdCBtYXNrLCBpbnQgYXJyYXkpXG4re1xuK1x0cmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIG1hc2ssIDAsXG4rXHRcdChhcnJheSA/IENQQV9BUlJBWSA6IDApLCBOVUxMKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgY3BhX3NldF9wYWdlc19hcnJheShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsXG4rXHRcdFx0XHQgICAgICBwZ3Byb3RfdCBtYXNrKVxuK3tcbitcdHJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoTlVMTCwgbnVtcGFnZXMsIG1hc2ssIF9fcGdwcm90KDApLCAwLFxuK1x0XHRDUEFfUEFHRVNfQVJSQVksIHBhZ2VzKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgY3BhX2NsZWFyX3BhZ2VzX2FycmF5KHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcyxcbitcdFx0XHRcdFx0cGdwcm90X3QgbWFzaylcbit7XG4rXHRyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKE5VTEwsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCxcbitcdFx0Q1BBX1BBR0VTX0FSUkFZLCBwYWdlcyk7XG4rfVxuK1xuKyNlbmRpZiAvKiBDT05GSUdfR0VORVJJQ19TRVRfTUVNT1JZICovXG4rXG4gI2VuZGlmIC8qIF9MSU5VWF9TRVRfTUVNT1JZX0hfICovXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWdcbmluZGV4IDllMGNhNDgyNDkwNTRmLi41NDFlZGQxZTExYjYxMCAxMDA2NDRcbi0tLSBhL21tL0tjb25maWdcbisrKyBiL21tL0tjb25maWdcbkBAIC0xNTA5LDYgKzE1MDksOSBAQCBjb25maWcgTEFaWV9NTVVfTU9ERV9LVU5JVF9URVNUXG4gXG4gXHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gXG4rY29uZmlnIEdFTkVSSUNfU0VUX01FTU9SWVxuK1x0Ym9vbFxuK1xuIHNvdXJjZSBcIm1tL2RhbW9uL0tjb25maWdcIlxuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuaW5kZXggOTFiM2UwMjdiNzUzNTcuLjgzY2ZlZjZiMmQ4Y2ZiIDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZy5kZWJ1Z1xuKysrIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuQEAgLTMyMCwzICszMjAsMTAgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUU1xuIFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxuIFxuIFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4rXG4rY29uZmlnIENQQV9ERUJVR1xuK1x0Ym9vbCBcIkNQQSBzZWxmLXRlc3QgY29kZVwiXG4rXHRkZXBlbmRzIG9uIEdFTkVSSUNfU0VUX01FTU9SWVxuK1x0ZGVwZW5kcyBvbiBERUJVR19LRVJORUxcbitcdGhlbHBcbitcdCAgRG8gY2hhbmdlX3BhZ2VfYXR0cigpIHNlbGYtdGVzdHMgZXZlcnkgMzAgc2Vjb25kcy5cbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXG5pbmRleCBlZmY5ZjllN2UwNjFjMS4uZTNmNmMzOWMyYmE5OTEgMTAwNjQ0XG4tLS0gYS9tbS9NYWtlZmlsZVxuKysrIGIvbW0vTWFrZWZpbGVcbkBAIC0xNDcsMyArMTQ3LDQgQEAgb2JqLSQoQ09ORklHX1NIUklOS0VSX0RFQlVHKSArPSBzaHJpbmtlcl9kZWJ1Zy5vXG4gb2JqLSQoQ09ORklHX0VYRUNNRU0pICs9IGV4ZWNtZW0ub1xuIG9iai0kKENPTkZJR19UTVBGU19RVU9UQSkgKz0gc2htZW1fcXVvdGEub1xuIG9iai0kKENPTkZJR19MQVpZX01NVV9NT0RFX0tVTklUX1RFU1QpICs9IHRlc3RzL2xhenlfbW11X21vZGVfa3VuaXQub1xuK29iai0kKENPTkZJR19HRU5FUklDX1NFVF9NRU1PUlkpICs9IHNldF9tZW1vcnkub1xuZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdC9jcGEtdGVzdC5jIGIvbW0vY3BhLXRlc3QuY1xuc2ltaWxhcml0eSBpbmRleCA4MCVcbnJlbmFtZSBmcm9tIGFyY2gveDg2L21tL3BhdC9jcGEtdGVzdC5jXG5yZW5hbWUgdG8gbW0vY3BhLXRlc3QuY1xuaW5kZXggYWQzYzFmZWVjOTkwZGIuLjYzYzM0NjNhNWE3ZDg1IDEwMDY0NFxuLS0tIGEvYXJjaC94ODYvbW0vcGF0L2NwYS10ZXN0LmNcbisrKyBiL21tL2NwYS10ZXN0LmNcbkBAIC0xMywzMiArMTMsMjQgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4gXG4tI2luY2x1ZGUgXHUwMDNjYXNtL2NhY2hlZmx1c2guaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2FzbS9rZGVidWcuaFx1MDAzZVxuLVxuIC8qXG4gICogT25seSBwcmludCB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgcGFzczpcbiAgKi9cbiBzdGF0aWMgX19yZWFkX21vc3RseSBpbnQgcHJpbnQgPSAxO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF90ZXN0X3BmbjtcbiBcbiBlbnVtIHtcbiBcdE5URVNUXHRcdFx0PSAzICogMTAwLFxuIFx0TlBBR0VTXHRcdFx0PSAxMDAsXG4tI2lmZGVmIENPTkZJR19YODZfNjRcbi1cdExQU1x0XHRcdD0gKDEgXHUwMDNjXHUwMDNjIFBNRF9TSElGVCksXG4tI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2X1BBRSlcbi1cdExQU1x0XHRcdD0gKDEgXHUwMDNjXHUwMDNjIFBNRF9TSElGVCksXG4tI2Vsc2Vcbi1cdExQU1x0XHRcdD0gKDEgXHUwMDNjXHUwMDNjIDIyKSxcbi0jZW5kaWZcbi1cdEdQU1x0XHRcdD0gKDFcdTAwM2NcdTAwM2MzMClcbitcdExQU1x0XHRcdD0gUE1EX1NJWkUsXG4rXHRHUFNcdFx0XHQ9IFBVRF9TSVpFXG4gfTtcbiBcbi0jZGVmaW5lIFBBR0VfQ1BBX1RFU1RcdF9fcGdwcm90KF9QQUdFX0NQQV9URVNUKVxuKyNkZWZpbmUgUEFHRV9DUEFfVEVTVFx0X19wZ3Byb3QoX1BBR0VfU1BFQ0lBTClcbiBcbiBzdGF0aWMgaW50IHB0ZV90ZXN0Yml0KHB0ZV90IHB0ZSlcbiB7XG4tXHRyZXR1cm4gcHRlX2ZsYWdzKHB0ZSkgXHUwMDI2IF9QQUdFX1NPRlRXMTtcbitcdHJldHVybiBwdGVfc3BlY2lhbChwdGUpO1xuIH1cbiBcbiBzdHJ1Y3Qgc3BsaXRfc3RhdGUge1xuQEAgLTU0LDEwICs0NiwxMCBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcbiBcdHMtXHUwMDNlbHBnID0gcy1cdTAwM2VncGcgPSBzLVx1MDAzZXNwZyA9IHMtXHUwMDNlZXhlYyA9IDA7XG4gXHRzLVx1MDAzZW1pbl9leGVjID0gfjBVTDtcbiBcdHMtXHUwMDNlbWF4X2V4ZWMgPSAwO1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X3Bmbl9tYXBwZWQ7ICkge1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X3Rlc3RfcGZuOyApIHtcbiBcdFx0dW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpX192YShpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKTtcbiBcdFx0dW5zaWduZWQgaW50IGxldmVsO1xuLVx0XHRwdGVfdCAqcHRlO1xuK1x0XHRwdGVfdCAqcHRlLCBwdGV2YWw7XG4gXG4gXHRcdHB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsIFx1MDAyNmxldmVsKTtcbiBcdFx0aWYgKCFwdGUpIHtcbkBAIC02NSwxNSArNTcsMTYgQEAgc3RhdGljIGludCBwcmludF9zcGxpdChzdHJ1Y3Qgc3BsaXRfc3RhdGUgKnMpXG4gXHRcdFx0aSsrO1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB0ZSk7XG4gXG4tXHRcdGlmIChsZXZlbCA9PSBQR19MRVZFTF8xRyBcdTAwMjZcdTAwMjYgc2l6ZW9mKGxvbmcpID09IDgpIHtcbitcdFx0aWYgKGxldmVsID09IFBHVEFCTEVfTEVWRUxfUFVEIFx1MDAyNlx1MDAyNiBzaXplb2YobG9uZykgPT0gOCkge1xuIFx0XHRcdHMtXHUwMDNlZ3BnKys7XG4gXHRcdFx0aSArPSBHUFMvUEFHRV9TSVpFO1xuLVx0XHR9IGVsc2UgaWYgKGxldmVsID09IFBHX0xFVkVMXzJNKSB7XG4tXHRcdFx0aWYgKChwdGVfdmFsKCpwdGUpIFx1MDAyNiBfUEFHRV9QUkVTRU5UKSBcdTAwMjZcdTAwMjYgIShwdGVfdmFsKCpwdGUpIFx1MDAyNiBfUEFHRV9QU0UpKSB7XG4rXHRcdH0gZWxzZSBpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpIHtcbitcdFx0XHRpZiAocHRlX3ByZXNlbnQocHRldmFsKSBcdTAwMjZcdTAwMjYgIXB0ZV9odWdlKHB0ZXZhbCkpIHtcbiBcdFx0XHRcdHByaW50ayhLRVJOX0VSUlxuLVx0XHRcdFx0XHRcIiVseCBsZXZlbCAlZCBidXQgbm90IFBTRSAlTHhcXG5cIixcbi1cdFx0XHRcdFx0YWRkciwgbGV2ZWwsICh1NjQpcHRlX3ZhbCgqcHRlKSk7XG4rXHRcdFx0XHRcdFwiJWx4IGxldmVsICVkIGJ1dCBub3QgbGVhZiAlTHhcXG5cIixcbitcdFx0XHRcdFx0YWRkciwgbGV2ZWwsICh1NjQpcHRlX3ZhbChwdGV2YWwpKTtcbiBcdFx0XHRcdGVyciA9IDE7XG4gXHRcdFx0fVxuIFx0XHRcdHMtXHUwMDNlbHBnKys7XG5AQCAtODIsNyArNzUsNyBAQCBzdGF0aWMgaW50IHByaW50X3NwbGl0KHN0cnVjdCBzcGxpdF9zdGF0ZSAqcylcbiBcdFx0XHRzLVx1MDAzZXNwZysrO1xuIFx0XHRcdGkrKztcbiBcdFx0fVxuLVx0XHRpZiAoIShwdGVfdmFsKCpwdGUpIFx1MDAyNiBfUEFHRV9OWCkpIHtcbitcdFx0aWYgKHB0ZV9leGVjKHB0ZXZhbCkpIHtcbiBcdFx0XHRzLVx1MDAzZWV4ZWMrKztcbiBcdFx0XHRpZiAoYWRkciBcdTAwM2Mgcy1cdTAwM2VtaW5fZXhlYylcbiBcdFx0XHRcdHMtXHUwMDNlbWluX2V4ZWMgPSBhZGRyO1xuQEAgLTEwMCw4ICs5Myw4IEBAIHN0YXRpYyBpbnQgcHJpbnRfc3BsaXQoc3RydWN0IHNwbGl0X3N0YXRlICpzKVxuIFxuIFx0ZXhwZWN0ZWQgPSAocy1cdTAwM2VncGcqR1BTICsgcy1cdTAwM2VscGcqTFBTKS9QQUdFX1NJWkUgKyBzLVx1MDAzZXNwZyArIG1pc3NlZDtcbiBcdGlmIChleHBlY3RlZCAhPSBpKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcIkNQQSBtYXhfcGZuX21hcHBlZCAlbHUgYnV0IGV4cGVjdGVkICVsdVxcblwiLFxuLVx0XHRcdG1heF9wZm5fbWFwcGVkLCBleHBlY3RlZCk7XG4rXHRcdHByaW50ayhLRVJOX0VSUiBcIkNQQSBtYXhfdGVzdF9wZm4gJWx1IGJ1dCBleHBlY3RlZCAlbHVcXG5cIixcbitcdFx0XHRtYXhfdGVzdF9wZm4sIGV4cGVjdGVkKTtcbiBcdFx0cmV0dXJuIDE7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuQEAgLTExOCw3ICsxMTEsNyBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiB7XG4gXHRzdHJ1Y3Qgc3BsaXRfc3RhdGUgc2EsIHNiLCBzYztcbiBcdHVuc2lnbmVkIGxvbmcgKmJtO1xuLVx0cHRlX3QgKnB0ZSwgcHRlMDtcbitcdHB0ZV90ICpwdGUsIHB0ZTAsIHB0ZV92YWw7XG4gXHRpbnQgZmFpbGVkID0gMDtcbiBcdHVuc2lnbmVkIGludCBsZXZlbDtcbiBcdGludCBpLCBrO1xuQEAgLTEyNyw3ICsxMjAsNyBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiBcdGlmIChwcmludClcbiBcdFx0cHJpbnRrKEtFUk5fSU5GTyBcIkNQQSBzZWxmLXRlc3Q6XFxuXCIpO1xuIFxuLVx0Ym0gPSB2emFsbG9jKChtYXhfcGZuX21hcHBlZCArIDcpIC8gOCk7XG4rXHRibSA9IHZ6YWxsb2MoKG1heF90ZXN0X3BmbiArIDcpIC8gOCk7XG4gXHRpZiAoIWJtKSB7XG4gXHRcdHByaW50ayhLRVJOX0VSUiBcIkNQQSBDYW5ub3Qgdm1hbGxvYyBiaXRtYXBcXG5cIik7XG4gXHRcdHJldHVybiAtRU5PTUVNO1xuQEAgLTEzNiwxMSArMTI5LDExIEBAIHN0YXRpYyBpbnQgcGFnZWF0dHJfdGVzdCh2b2lkKVxuIFx0ZmFpbGVkICs9IHByaW50X3NwbGl0KFx1MDAyNnNhKTtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5URVNUOyBpKyspIHtcbi1cdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBnZXRfcmFuZG9tX3UzMl9iZWxvdyhtYXhfcGZuX21hcHBlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gZ2V0X3JhbmRvbV91MzJfYmVsb3cobWF4X3Rlc3RfcGZuKTtcbiBcbiBcdFx0YWRkcltpXSA9ICh1bnNpZ25lZCBsb25nKV9fdmEocGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKTtcbiBcdFx0bGVuW2ldID0gZ2V0X3JhbmRvbV91MzJfYmVsb3coTlBBR0VTKTtcbi1cdFx0bGVuW2ldID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuW2ldLCBtYXhfcGZuX21hcHBlZCAtIHBmbiAtIDEpO1xuK1x0XHRsZW5baV0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW5baV0sIG1heF90ZXN0X3BmbiAtIHBmbiAtIDEpO1xuIFxuIFx0XHRpZiAobGVuW2ldID09IDApXG4gXHRcdFx0bGVuW2ldID0gMTtcbkBAIC0xNTAsMTUgKzE0MywyMCBAQCBzdGF0aWMgaW50IHBhZ2VhdHRyX3Rlc3Qodm9pZClcbiBcbiBcdFx0Zm9yIChrID0gMDsgayBcdTAwM2MgbGVuW2ldOyBrKyspIHtcbiBcdFx0XHRwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyW2ldICsgaypQQUdFX1NJWkUsIFx1MDAyNmxldmVsKTtcbi1cdFx0XHRpZiAoIXB0ZSB8fCBwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QoKnB0ZSkpID09IDAgfHxcbi1cdFx0XHQgICAgIShwdGVfdmFsKCpwdGUpIFx1MDAyNiBfUEFHRV9QUkVTRU5UKSkge1xuK1x0XHRcdGlmICghcHRlKSB7XG4rXHRcdFx0XHRhZGRyW2ldID0gMDtcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0XHRwdGVfdmFsID0gcHRlcF9nZXQocHRlKTtcbitcdFx0XHRpZiAocGdwcm90X3ZhbChwdGVfcGdwcm90KHB0ZV92YWwpKSA9PSAwIHx8XG4rXHRcdFx0ICAgICFwdGVfcHJlc2VudChwdGVfdmFsKSkge1xuIFx0XHRcdFx0YWRkcltpXSA9IDA7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdFx0aWYgKGsgPT0gMCkge1xuLVx0XHRcdFx0cHRlMCA9ICpwdGU7XG4rXHRcdFx0XHRwdGUwID0gcHRlX3ZhbDtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aWYgKHBncHJvdF92YWwocHRlX3BncHJvdCgqcHRlKSkgIT1cbitcdFx0XHRcdGlmIChwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlX3ZhbCkpICE9XG4gXHRcdFx0XHRcdHBncHJvdF92YWwocHRlX3BncHJvdChwdGUwKSkpIHtcbiBcdFx0XHRcdFx0bGVuW2ldID0gaztcbiBcdFx0XHRcdFx0YnJlYWs7XG5AQCAtMTk4LDEyICsxOTYsMTIgQEAgc3RhdGljIGludCBwYWdlYXR0cl90ZXN0KHZvaWQpXG4gXHRcdH1cbiBcbiBcdFx0cHRlID0gbG9va3VwX2FkZHJlc3MoYWRkcltpXSwgXHUwMDI2bGV2ZWwpO1xuLVx0XHRpZiAoIXB0ZSB8fCAhcHRlX3Rlc3RiaXQoKnB0ZSkgfHwgcHRlX2h1Z2UoKnB0ZSkpIHtcbitcdFx0aWYgKCFwdGUgfHwgIXB0ZV90ZXN0Yml0KCpwdGUpIHx8IGxldmVsICE9IFBHVEFCTEVfTEVWRUxfUFRFKSB7XG4gXHRcdFx0cHJpbnRrKEtFUk5fRVJSIFwiQ1BBICVseDogYmFkIHB0ZSAlTHhcXG5cIiwgYWRkcltpXSxcbiBcdFx0XHRcdHB0ZSA/ICh1NjQpcHRlX3ZhbCgqcHRlKSA6IDBVTEwpO1xuIFx0XHRcdGZhaWxlZCsrO1xuIFx0XHR9XG4tXHRcdGlmIChsZXZlbCAhPSBQR19MRVZFTF80Sykge1xuK1x0XHRpZiAobGV2ZWwgIT0gUEdUQUJMRV9MRVZFTF9QVEUpIHtcbiBcdFx0XHRwcmludGsoS0VSTl9FUlIgXCJDUEEgJWx4OiB1bmV4cGVjdGVkIGxldmVsICVkXFxuXCIsXG4gXHRcdFx0XHRhZGRyW2ldLCBsZXZlbCk7XG4gXHRcdFx0ZmFpbGVkKys7XG5AQCAtMjY2LDYgKzI2NCw4IEBAIHN0YXRpYyBpbnQgc3RhcnRfcGFnZWF0dHJfdGVzdCh2b2lkKVxuIHtcbiBcdHN0cnVjdCB0YXNrX3N0cnVjdCAqcDtcbiBcbitcdG1heF90ZXN0X3BmbiA9IFBGTl9ET1dOKF9fcGEoaGlnaF9tZW1vcnkgLSAxKSk7XG4rXG4gXHRwID0ga3RocmVhZF9jcmVhdGUoZG9fcGFnZWF0dHJfdGVzdCwgTlVMTCwgXCJwYWdlYXR0ci10ZXN0XCIpO1xuIFx0aWYgKCFJU19FUlIocCkpXG4gXHRcdHdha2VfdXBfcHJvY2VzcyhwKTtcbmRpZmYgLS1naXQgYS9tbS9zZXRfbWVtb3J5LmMgYi9tbS9zZXRfbWVtb3J5LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNzQ0NDA1ZWZjYzM0MDFcbi0tLSAvZGV2L251bGxcbisrKyBiL21tL3NldF9tZW1vcnkuY1xuQEAgLTAsMCArMSwzOTYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGd0YWJsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0LmhcdTAwM2VcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zZXRfbWVtb3J5LmhcdTAwM2VcbitcbisvKlxuKyAqIFNlcmlhbGl6ZSBjcGEoKSBzbyB0aGF0IHdlIGRvbid0IGFsbG93IGFueSBvdGhlciBjcHUsIHdpdGggc3RhbGUgbGFyZ2UgdGxiXG4rICogZW50cmllcywgdG8gY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdVxuKyAqIHNwbGl0dGluZyBhIGxhcmdlIHBhZ2UgZW50cnkgYWxvbmcgd2l0aCBjaGFuZ2luZyB0aGUgYXR0cmlidXRlLlxuKyAqL1xuK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spO1xuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2sodm9pZClcbit7XG4rI2lmZGVmIENPTkZJR19YODZcbitcdHNwaW5fbG9jayhcdTAwMjZwZ2RfbG9jayk7XG4rI2VuZGlmXG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3VubG9jayh2b2lkKVxuK3tcbisjaWZkZWYgQ09ORklHX1g4NlxuK1x0c3Bpbl91bmxvY2soXHUwMDI2cGdkX2xvY2spO1xuKyNlbmRpZlxuK31cbitcbit1bnNpZ25lZCBsb25nIGNwYV9hZGRyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGlkeClcbit7XG4rXHRpZiAoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiBDUEFfUEFHRVNfQVJSQVkpIHtcbitcdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBjcGEtXHUwMDNlcGFnZXNbaWR4XTtcbitcbitcdFx0aWYgKHVubGlrZWx5KFBhZ2VIaWdoTWVtKHBhZ2UpKSlcbitcdFx0XHRyZXR1cm4gMDtcbitcbitcdFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTtcbitcdH1cbitcbitcdGlmIChjcGEtXHUwMDNlZmxhZ3MgXHUwMDI2IENQQV9BUlJBWSlcbitcdFx0cmV0dXJuIGNwYS1cdTAwM2V2YWRkcltpZHhdO1xuK1xuK1x0cmV0dXJuICpjcGEtXHUwMDNldmFkZHIgKyBpZHggKiBQQUdFX1NJWkU7XG4rfVxuK1xuKy8qXG4rICogTG9va3VwIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhIHNwZWNpZmljIHBnZC5cbisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSAob3IgTlVMTCBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QpLFxuKyAqIHRoZSBsZXZlbCBvZiB0aGUgZW50cnksIGFuZCB0aGUgZWZmZWN0aXZlIE5YIGFuZCBSVyBiaXRzIG9mIGFsbFxuKyAqIHBhZ2UgdGFibGUgbGV2ZWxzLlxuKyAqL1xuK3B0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2RfdCAqcGdkcCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBpbnQgKmxldmVsLCBib29sICpueCwgYm9vbCAqcncpXG4re1xuK1x0cGdkX3QgcGdkID0gcGdkcF9nZXQocGdkcCk7XG4rXHRwNGRfdCAqcDRkcCwgcDRkO1xuK1x0cHVkX3QgKnB1ZHAsIHB1ZDtcbitcdHBtZF90ICpwbWRwLCBwbWQ7XG4rXG4rXHQqbGV2ZWwgPSBQR1RBQkxFX0xFVkVMX1BHRDtcbitcdCpueCA9IGZhbHNlO1xuK1x0KnJ3ID0gdHJ1ZTtcbitcbitcdGlmIChwZ2Rfbm9uZShwZ2QpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUDREO1xuK1x0Km54IHw9ICFwZ2RfZXhlYyhwZ2QpO1xuK1x0KnJ3IFx1MDAyNj0gISEocGdkX3dyaXRlKHBnZCkpO1xuK1xuK1x0cDRkcCA9IHA0ZF9vZmZzZXQocGdkcCwgYWRkcmVzcyk7XG4rXHRwNGQgPSBwNGRwX2dldChwNGRwKTtcbitcdGlmIChwNGRfbm9uZShwNGQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmIChwNGRfbGVhZihwNGQpIHx8ICFwNGRfcHJlc2VudChwNGQpKVxuK1x0XHRyZXR1cm4gKHB0ZV90ICopcDRkcDtcbitcbitcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFVEO1xuK1x0Km54IHw9ICFwNGRfZXhlYyhwNGQpO1xuK1x0KnJ3IFx1MDAyNj0gISEocDRkX3dyaXRlKHA0ZCkpO1xuK1xuK1x0cHVkcCA9IHB1ZF9vZmZzZXQocDRkcCwgYWRkcmVzcyk7XG4rXHRwdWQgPSBwdWRwX2dldChwdWRwKTtcbitcdGlmIChwdWRfbm9uZShwdWQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmIChwdWRfbGVhZihwdWQpIHx8ICFwdWRfcHJlc2VudChwdWQpKVxuK1x0XHRyZXR1cm4gKHB0ZV90ICopcHVkcDtcbitcbitcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUE1EO1xuK1x0Km54IHw9ICFwdWRfZXhlYyhwdWQpO1xuK1x0KnJ3IFx1MDAyNj0gISEocHVkX3dyaXRlKHB1ZCkpO1xuK1xuK1x0cG1kcCA9IHBtZF9vZmZzZXQocHVkcCwgYWRkcmVzcyk7XG4rXHRwbWQgPSBwbWRwX2dldChwbWRwKTtcbitcdGlmIChwbWRfbm9uZShwbWQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmIChwbWRfbGVhZihwbWQpIHx8ICFwbWRfcHJlc2VudChwbWQpKVxuK1x0XHRyZXR1cm4gKHB0ZV90ICopcG1kcDtcbitcbitcdCpsZXZlbCA9IFBHVEFCTEVfTEVWRUxfUFRFO1xuK1x0Km54IHw9ICFwbWRfZXhlYyhwbWQpO1xuK1x0KnJ3IFx1MDAyNj0gISEocG1kX3dyaXRlKHBtZCkpO1xuK1xuK1x0cmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZHAsIGFkZHJlc3MpO1xuK31cbitcbisvKlxuKyAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuXG4rICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgYW5kIHRoZSBsZXZlbCBvZiB0aGUgbWFwcGluZy5cbisgKi9cbitwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbitcdFx0XHQgICAgIHVuc2lnbmVkIGludCAqbGV2ZWwpXG4re1xuK1x0Ym9vbCBueCwgcnc7XG4rXG4rXHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkX2F0dHIocGdkLCBhZGRyZXNzLCBsZXZlbCwgXHUwMDI2bngsIFx1MDAyNnJ3KTtcbit9XG4rXG4rLypcbisgKiBMb29rdXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmlydHVhbCBhZGRyZXNzLiBSZXR1cm4gYSBwb2ludGVyXG4rICogdG8gdGhlIGVudHJ5IGFuZCB0aGUgbGV2ZWwgb2YgdGhlIG1hcHBpbmcuXG4rICpcbisgKiBOb3RlOiB0aGUgZnVuY3Rpb24gcmV0dXJucyBwNGQsIHB1ZCBvciBwbWQgZWl0aGVyIHdoZW4gdGhlIGVudHJ5IGlzIG1hcmtlZFxuKyAqIGxhcmdlIG9yIHdoZW4gdGhlIHByZXNlbnQgYml0IGlzIG5vdCBzZXQuIE90aGVyd2lzZSBpdCByZXR1cm5zIE5VTEwuXG4rICovXG4rcHRlX3QgKmxvb2t1cF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50ICpsZXZlbClcbit7XG4rXHRyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcywgbGV2ZWwpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfYWRkcmVzcyk7XG4rXG4rc3RhdGljIHB0ZV90ICpfbG9va3VwX2FkZHJlc3NfY3BhKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4rXHRcdFx0ICAgdW5zaWduZWQgaW50ICpsZXZlbCwgYm9vbCAqbngsIGJvb2wgKnJ3KVxuK3tcbitcdHBnZF90ICpwZ2Q7XG4rXG4rXHRpZiAoIWNwYS1cdTAwM2VwZ2QpXG4rXHRcdHBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTtcbitcdGVsc2VcbitcdFx0cGdkID0gY3BhLVx1MDAzZXBnZCArIHBnZF9pbmRleChhZGRyZXNzKTtcbitcbitcdHJldHVybiBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cihwZ2QsIGFkZHJlc3MsIGxldmVsLCBueCwgcncpO1xuK31cbitcbitzdGF0aWMgaW50IHNob3VsZF9zcGxpdF9sYXJnZV9wYWdlKHN0cnVjdCBjcGFfZGF0YSAqY3BhLFxuK1x0XHRcdFx0ICAgc3RydWN0IGNwYV9zcGxpdF9kYXRhICpzZClcbit7XG4rXHRlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwgPSBzZC1cdTAwM2VsZXZlbDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHNkLVx1MDAzZWFkZHJlc3M7XG4rXHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzLCBscGFkZHI7XG4rXG4rXHRpZiAoY3BhLVx1MDAzZWZvcmNlX3NwbGl0KVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdHNkLVx1MDAzZXBzaXplID0gcGd0YWJsZV9sZXZlbF9zaXplKGxldmVsKTtcbitcdHNkLVx1MDAzZXBtYXNrID0gcGd0YWJsZV9sZXZlbF9tYXNrKGxldmVsKTtcbitcbitcdC8qXG4rXHQgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggZml0IGludG8gdGhpcyBsYXJnZVxuK1x0ICogcGFnZSBzdGFydGluZyBhdCBhZGRyZXNzOlxuK1x0ICovXG4rXHRscGFkZHIgPSAoYWRkcmVzcyArIHNkLVx1MDAzZXBzaXplKSBcdTAwMjYgc2QtXHUwMDNlcG1hc2s7XG4rXHRudW1wYWdlcyA9IChscGFkZHIgLSBhZGRyZXNzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdGlmIChudW1wYWdlcyBcdTAwM2MgY3BhLVx1MDAzZW51bXBhZ2VzKVxuK1x0XHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbitcbitcdHJldHVybiBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlKGNwYSwgc2QpO1xuK31cbitcbitzdGF0aWMgaW50IGNwYV9oYW5kbGVfbGFyZ2VfcGFnZShzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgcHRlX3QgKmtwdGUsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbit7XG4rXHRzdHJ1Y3QgY3BhX3NwbGl0X2RhdGEgc2QgPSB7XG4rXHRcdC5hZGRyZXNzID0gYWRkcmVzcyxcbitcdFx0LmtwdGUgPSBrcHRlLFxuK1x0fTtcbitcdGludCBkb19zcGxpdCwgcmV0ID0gMTtcbitcdHB0ZV90ICp0bXA7XG4rXG4rXHRzcGluX3VubG9jayhcdTAwMjZjcGFfbG9jayk7XG4rXHRzZC5wdGRlc2MgPSBwYWdldGFibGVfYWxsb2MoR0ZQX0tFUk5FTCwgMCk7XG4rXHRzcGluX2xvY2soXHUwMDI2Y3BhX2xvY2spO1xuK1x0aWYgKCFzZC5wdGRlc2MpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0YXJjaF9sb2NrKCk7XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2sgZm9yIHJhY2VzLCBhbm90aGVyIENQVSBtaWdodCBoYXZlIHNwbGl0IHRoaXMgcGFnZVxuK1x0ICogdXAgYWxyZWFkeTpcbitcdCAqL1xuK1x0dG1wID0gX2xvb2t1cF9hZGRyZXNzX2NwYShjcGEsIGFkZHJlc3MsIFx1MDAyNnNkLmxldmVsLCBcdTAwMjZzZC5ueCwgXHUwMDI2c2QucncpO1xuK1x0aWYgKHRtcCAhPSBrcHRlKVxuK1x0XHRnb3RvIG91dF9mcmVlX3B0ZGVzYztcbitcbitcdC8qXG4rXHQgKiBDaGVjaywgd2hldGhlciB3ZSBjYW4ga2VlcCB0aGUgbGFyZ2UgcGFnZSBpbnRhY3RcbitcdCAqIGFuZCBqdXN0IGNoYW5nZSB0aGUgcHRlOlxuK1x0ICovXG4rXHRkb19zcGxpdCA9IHNob3VsZF9zcGxpdF9sYXJnZV9wYWdlKGNwYSwgXHUwMDI2c2QpO1xuK1x0cmV0ID0gZG9fc3BsaXQ7XG4rXHQvKlxuK1x0ICogV2hlbiB0aGUgcmFuZ2UgZml0cyBpbnRvIHRoZSBleGlzdGluZyBsYXJnZSBwYWdlLCBubyBzcGxpdCBpc1xuK1x0ICogcmVxdWlyZWQuXG4rXHQgKiBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZSgpIHVwZGF0ZWQgdGhlIGxhcmdlIHBhZ2UgYXR0cmlidXRlcyBhbmRcbitcdCAqIGNwYS1cdTAwM2VudW1wYWdlcyBhbmQgY3BhLVx1MDAzZXBmbi5cbitcdCAqL1xuK1x0aWYgKGRvX3NwbGl0IFx1MDAzYz0gMClcbitcdFx0Z290byBvdXRfZnJlZV9wdGRlc2M7XG4rXG4rXHQvKlxuK1x0ICogV2UgaGF2ZSB0byBzcGxpdCB0aGUgbGFyZ2UgcGFnZTpcbitcdCAqL1xuK1x0cmV0ID0gYXJjaF9zcGxpdF9sYXJnZV9wYWdlKGNwYSwgXHUwMDI2c2QpO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBvdXRfZnJlZV9wdGRlc2M7XG4rXG4rXHRhcmNoX3VubG9jaygpO1xuK1x0cmV0dXJuIGRvX3NwbGl0O1xuK1xuK291dF9mcmVlX3B0ZGVzYzpcbitcdGFyY2hfdW5sb2NrKCk7XG4rXHRwYWdldGFibGVfZnJlZShzZC5wdGRlc2MpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcztcbitcdGludCBzcGxpdF9yZXM7XG4rXHR1bnNpZ25lZCBpbnQgbGV2ZWw7XG4rXHRwdGVfdCAqa3B0ZSwgb2xkX3B0ZTtcbitcdGJvb2wgbngsIHJ3O1xuK1xuK1x0YWRkcmVzcyA9IGNwYV9hZGRyKGNwYSwgY3BhLVx1MDAzZWN1cnBhZ2UpO1xuK3JlcGVhdDpcbitcdGtwdGUgPSBfbG9va3VwX2FkZHJlc3NfY3BhKGNwYSwgYWRkcmVzcywgXHUwMDI2bGV2ZWwsIFx1MDAyNm54LCBcdTAwMjZydyk7XG4rXHRpZiAoIWtwdGUpXG4rXHRcdHJldHVybiBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XG4rXG4rXHRvbGRfcHRlID0gKmtwdGU7XG4rXHRpZiAocHRlX25vbmUob2xkX3B0ZSkpXG4rXHRcdHJldHVybiBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0KGNwYSwgYWRkcmVzcywgcHJpbWFyeSk7XG4rXG4rXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QVEUpIHtcbitcdFx0YXJjaF9jaGFuZ2VfcHRlKGNwYSwgYWRkcmVzcywga3B0ZSwgb2xkX3B0ZSwgbngsIHJ3KTtcbitcdFx0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogVGhlIGFkZHJlc3MgbWFwcyBhIGxhcmdlIHBhZ2UuIFRyeSB0byBrZWVwIGl0LCBvdGhlcndpc2Ugc3BsaXQgaXRcbitcdCAqIHVwIGFuZCByZXRyeSBvbiB0aGUgZnJlc2hseSBpbnN0YWxsZWQgc21hbGxlciBtYXBwaW5nLlxuK1x0ICovXG4rXHRzcGxpdF9yZXMgPSBjcGFfaGFuZGxlX2xhcmdlX3BhZ2UoY3BhLCBrcHRlLCBhZGRyZXNzKTtcbitcdGlmIChzcGxpdF9yZXMgXHUwMDNlIDApXG4rXHRcdGdvdG8gcmVwZWF0O1xuK1xuK1x0cmV0dXJuIHNwbGl0X3Jlcztcbit9XG4rXG4raW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgcHJpbWFyeSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG51bXBhZ2VzID0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuK1x0dW5zaWduZWQgbG9uZyByZW1wYWdlcyA9IG51bXBhZ2VzO1xuK1x0aW50IHJldCA9IDA7XG4rXG4rXHQvKlxuK1x0ICogTm8gY2hhbmdlcywgZWFzeSFcbitcdCAqL1xuK1x0aWYgKCEocGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19zZXQpIHwgcGdwcm90X3ZhbChjcGEtXHUwMDNlbWFza19jbHIpKSBcdTAwMjZcdTAwMjZcbitcdCAgICAhY3BhLVx1MDAzZWZvcmNlX3NwbGl0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0d2hpbGUgKHJlbXBhZ2VzKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFN0b3JlIHRoZSByZW1haW5pbmcgbnIgb2YgcGFnZXMgZm9yIHRoZSBsYXJnZSBwYWdlXG4rXHRcdCAqIHByZXNlcnZhdGlvbiBjaGVjay5cbitcdFx0ICovXG4rXHRcdGNwYS1cdTAwM2VudW1wYWdlcyA9IHJlbXBhZ2VzO1xuK1x0XHQvKiBmb3IgYXJyYXkgY2hhbmdlcywgd2UgY2FuJ3QgdXNlIGxhcmdlIHBhZ2UgKi9cbitcdFx0aWYgKGNwYS1cdTAwM2VmbGFncyBcdTAwMjYgKENQQV9BUlJBWSB8IENQQV9QQUdFU19BUlJBWSkpXG4rXHRcdFx0Y3BhLVx1MDAzZW51bXBhZ2VzID0gMTtcbitcbitcdFx0c3Bpbl9sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbitcdFx0cmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyKGNwYSwgcHJpbWFyeSk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNwYV9sb2NrKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0aWYgKHByaW1hcnkgXHUwMDI2XHUwMDI2ICEoY3BhLVx1MDAzZWZsYWdzIFx1MDAyNiBDUEFfTk9fQ0hFQ0tfQUxJQVMpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgY3BhX3Nob3VsZF91cGRhdGVfYWxpYXMoY3BhX2FkZHIoY3BhLCBjcGEtXHUwMDNlY3VycGFnZSksIGNwYS1cdTAwM2VwZm4pKSB7XG4rXHRcdFx0cmV0ID0gYXJjaF9jcGFfcHJvY2Vzc19hbGlhcyhjcGEpO1xuK1x0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHQvKlxuK1x0XHQgKiBBZGp1c3QgdGhlIG51bWJlciBvZiBwYWdlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlXG4rXHRcdCAqIENQQSBvcGVyYXRpb24uIEVpdGhlciBhIGxhcmdlIHBhZ2UgaGFzIGJlZW5cbitcdFx0ICogcHJlc2VydmVkIG9yIGEgc2luZ2xlIHBhZ2UgdXBkYXRlIGhhcHBlbmVkLlxuK1x0XHQgKi9cbitcdFx0QlVHX09OKGNwYS1cdTAwM2VudW1wYWdlcyBcdTAwM2UgcmVtcGFnZXMgfHwgIWNwYS1cdTAwM2VudW1wYWdlcyk7XG4rXHRcdHJlbXBhZ2VzIC09IGNwYS1cdTAwM2VudW1wYWdlcztcbitcdFx0Y3BhLVx1MDAzZWN1cnBhZ2UgKz0gY3BhLVx1MDAzZW51bXBhZ2VzO1xuK1x0fVxuK1xuK291dDpcbitcdC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIG51bXBhZ2VzICovXG4rXHRjcGEtXHUwMDNlbnVtcGFnZXMgPSBudW1wYWdlcztcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2ludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG51bXBhZ2VzLFxuK1x0XHRcdCAgICAgcGdwcm90X3QgbWFza19zZXQsIHBncHJvdF90IG1hc2tfY2xyLFxuK1x0XHRcdCAgICAgaW50IGZvcmNlX3NwbGl0LCBpbnQgaW5fZmxhZyxcbitcdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4re1xuK1x0c3RydWN0IGNwYV9kYXRhIGNwYTtcbitcdGludCBlcnI7XG4rXG4rXHRtZW1zZXQoXHUwMDI2Y3BhLCAwLCBzaXplb2YoY3BhKSk7XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2ssIGlmIHdlIGFyZSByZXF1ZXN0ZWQgdG8gc2V0IGEgbm90IHN1cHBvcnRlZFxuK1x0ICogZmVhdHVyZS4gIENsZWFyaW5nIG5vbi1zdXBwb3J0ZWQgZmVhdHVyZXMgaXMgT0suXG4rXHQgKi9cbitcdG1hc2tfc2V0ID0gY2Fub25fcGdwcm90KG1hc2tfc2V0KTtcbitcbitcdGlmICghcGdwcm90X3ZhbChtYXNrX3NldCkgXHUwMDI2XHUwMDI2ICFwZ3Byb3RfdmFsKG1hc2tfY2xyKSBcdTAwMjZcdTAwMjYgIWZvcmNlX3NwbGl0KVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qIEVuc3VyZSB3ZSBhcmUgUEFHRV9TSVpFIGFsaWduZWQgKi9cbitcdGlmIChpbl9mbGFnIFx1MDAyNiBDUEFfQVJSQVkpIHtcbitcdFx0aW50IGk7XG4rXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG51bXBhZ2VzOyBpKyspIHtcbitcdFx0XHRpZiAoYWRkcltpXSBcdTAwMjYgflBBR0VfTUFTSykge1xuK1x0XHRcdFx0YWRkcltpXSBcdTAwMjY9IFBBR0VfTUFTSztcbitcdFx0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH0gZWxzZSBpZiAoIShpbl9mbGFnIFx1MDAyNiBDUEFfUEFHRVNfQVJSQVkpKSB7XG4rXHRcdC8qXG4rXHRcdCAqIGluX2ZsYWcgb2YgQ1BBX1BBR0VTX0FSUkFZIGltcGxpZXMgaXQgaXMgYWxpZ25lZC5cbitcdFx0ICogTm8gbmVlZCB0byBjaGVjayBpbiB0aGF0IGNhc2VcbitcdFx0ICovXG4rXHRcdGlmICgqYWRkciBcdTAwMjYgflBBR0VfTUFTSykge1xuK1x0XHRcdCphZGRyIFx1MDAyNj0gUEFHRV9NQVNLO1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogUGVvcGxlIHNob3VsZCBub3QgYmUgcGFzc2luZyBpbiB1bmFsaWduZWQgYWRkcmVzc2VzOlxuK1x0XHRcdCAqL1xuK1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0LyogTXVzdCBhdm9pZCBhbGlhc2luZyBtYXBwaW5ncyBpbiB0aGUgaGlnaG1lbSBjb2RlICovXG4rXHRrbWFwX2ZsdXNoX3VudXNlZCgpO1xuK1xuK1x0dm1fdW5tYXBfYWxpYXNlcygpO1xuK1xuK1x0Y3BhLnZhZGRyID0gYWRkcjtcbitcdGNwYS5wYWdlcyA9IHBhZ2VzO1xuK1x0Y3BhLm51bXBhZ2VzID0gbnVtcGFnZXM7XG4rXHRjcGEubWFza19zZXQgPSBtYXNrX3NldDtcbitcdGNwYS5tYXNrX2NsciA9IG1hc2tfY2xyO1xuK1x0Y3BhLmZsYWdzID0gaW5fZmxhZztcbitcdGNwYS5jdXJwYWdlID0gMDtcbitcdGNwYS5mb3JjZV9zcGxpdCA9IGZvcmNlX3NwbGl0O1xuK1xuK1x0ZXJyID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoXHUwMDI2Y3BhLCAxKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzpcbitcdCAqL1xuK1x0aWYgKCEoY3BhLmZsYWdzIFx1MDAyNiBDUEFfRkxVU0hUTEIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGFyY2hfY3BhX2ZsdXNoKFx1MDAyNmNwYSwgZXJyKTtcbitcbitvdXQ6XG4rXHRyZXR1cm4gZXJyO1xuK31cbitcbisvKlxuKyAqIFRoZSB0ZXN0Y2FzZXMgdXNlIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGRuJ3RcbisgKiBiZSBleHBvc2VkIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwuIEluY2x1ZGUgdGhlc2UgZGlyZWN0bHkgaGVyZS5cbisgKi9cbisjaWZkZWYgQ09ORklHX0NQQV9ERUJVR1xuKyNpbmNsdWRlIFwiY3BhLXRlc3QuY1wiXG4rI2VuZGlmXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yMlQxMToxMTo0MS4xNTQ0MDg0NjVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxODc0ODgzNzYyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipSZWZhY3RvcmluZyBDb3JlIE1lbW9yeSBNYW5hZ2VtZW50IGZvciBFbmhhbmNlZCBUZXN0aW5nKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaC4gSXQncyByZWZhY3RvcmluZyB0aGUgYGNoYW5nZV9wYWdlX2F0dHJgIChDUEEpIGxvZ2ljLCBtb3ZpbmcgaXQgaW50byBhIG1vcmUgZ2VuZXJpYyBgbW0vc2V0X21lbW9yeS5jYCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgbG9jYXRpb25zLiBUaGlzIGludHJvZHVjZXMgYENPTkZJR19HRU5FUklDX1NFVF9NRU1PUllgIGFuZCB1cGRhdGVzIGEgZmV3IGFyY2hpdGVjdHVyZSBLY29uZmlnIGZpbGVzIChgYXJjaC9sb29uZ2FyY2gvS2NvbmZpZ2AsIGBhcmNoL3Jpc2N2L0tjb25maWdgLCBhbmQgYGFyY2gveDg2L0tjb25maWdgKSB0byBzZWxlY3QgaXQuIFRoZXkncmUgYWxzbyBtb3ZpbmcgdGhlIHRlc3QgZmlsZSwgYGNwYS10ZXN0LmNgLCBpbnRvIHRoZSBgbW1gIGRpcmVjdG9yeS4gSXQgbG9va3MgbGlrZSB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgZXhwZWN0ZWQgdG8gcHJvdmlkZSBzb21lIG5ldyBmdW5jdGlvbnMgbm93IHRvbzogYGFyY2hfc2hvdWxkX3NwbGl0X2xhcmdlX3BhZ2VgLCBgYXJjaF9zcGxpdF9sYXJnZV9wYWdlYCwgYGFyY2hfY2hhbmdlX3B0ZWAsIGBhcmNoX2NwYV9wcm9jZXNzX2ZhdWx0YCwgYGFyY2hfY3BhX3Byb2Nlc3NfYWxpYXNgLCBhbmQgYGFyY2hfY3BhX2ZsdXNoYC5cblxuVGhpcyBpcyBhIHByZXR0eSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gaG93IHdlIGhhbmRsZSBwYWdlIGF0dHJpYnV0ZXMsIHNvIGZ1enppbmcgaXMgZGVmaW5pdGVseSBhIHByaW9yaXR5IGhlcmUuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByaWdodCBhcHByb2FjaC4gTGV0J3Mgc3RhcnQgYnkgaWRlbnRpZnlpbmcgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyB0aGF0IGFyZSBiZWluZyByZWZhY3RvcmVkLiBGdW5jdGlvbnMgdGhhdCBJIG5lZWQgdG8ga2VlcCBhIGNsb3NlIGV5ZSBvbiBhcmU6IGBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJgLCBgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJgLCBgX19jaGFuZ2VfcGFnZV9hdHRyYCwgYGNwYV9oYW5kbGVfbGFyZ2VfcGFnZWAsIGBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZWAsIGBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cmAsIGBsb29rdXBfYWRkcmVzc19pbl9wZ2RgLCBgbG9va3VwX2FkZHJlc3NgLCBhbmQgYGNwYV9hZGRyYC4gQWxzbyB0aGUgbmV3IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgb2Y6IGBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlYCwgYGFyY2hfc3BsaXRfbGFyZ2VfcGFnZWAsIGBhcmNoX2NoYW5nZV9wdGVgLCBgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdGAsIGBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzYCwgYW5kIGBhcmNoX2NwYV9mbHVzaGAuXG5cbk5vdywgaXMgYENPTkZJR19HRU5FUklDX1NFVF9NRU1PUllgIHNvbWV0aGluZyBJIGNhbiBlbmFibGUgZGlyZWN0bHk/IE5vLCBpdCdzIHNlbGVjdGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmVzLCBzbyBpdCBzaG91bGQgYWxyZWFkeSBiZSBlbmFibGVkIG9uIHg4NiwgUklTQy1WLCBhbmQgTG9vbmdhcmNoLiBIb3dldmVyLCBoYW5nIG9u4oCmIGl0IGxvb2tzIGxpa2Ugd2UgYWxzbyBoYXZlIGEgYENPTkZJR19DUEFfREVCVUdgIG5vdywgYXZhaWxhYmxlIGZvciBhbGwgYXJjaGl0ZWN0dXJlcyB0aGF0IHNlbGVjdCBgR0VORVJJQ19TRVRfTUVNT1JZYC4gVGhhdCBzb3VuZHMgbGlrZSBhIGdpZnQhIEknbGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZy5kZWJ1ZyBmaWxlIGluIGBtbWA6XG5cbmBgYFxuY29uZmlnIENQQV9ERUJVR1xuXHRib29sIFwiQ1BBIHNlbGYtdGVzdCBjb2RlXCJcblx0ZGVwZW5kcyBvbiBHRU5FUklDX1NFVF9NRU1PUllcblx0ZGVwZW5kcyBvbiBERUJVR19LRVJORUxcbmBgYFxuXG5ZZXMsIGVuYWJsaW5nIGBDUEFfREVCVUdgIHdvdWxkIGJlIGEgZ3JlYXQgd2F5IHRvIGV4ZXJjaXNlIHRoaXMgbmV3IGNvZGUuIExldCdzIHNlZSBpZiBpdCdzIGFscmVhZHkgdXNlZCBhbnl3aGVyZSwgb3IgaWYgSSBuZWVkIHRvIGFkZCBpdC4gSSdsbCBzZWFyY2ggZm9yIGBDUEFfREVCVUdgIGluIHRoZSBrZXJuZWwgYW5kIHVzZSBgc2V0LXJlc3VsdHNgIHdpdGggYFdvcnRoRnV6emluZz10cnVlYC5cblxuRm9yIHRoZSBmb2N1cyBzeW1ib2xzLCBJJ2xsIHVzZSB0aG9zZSBjb3JlIGZ1bmN0aW9uIG5hbWVzIEkgaWRlbnRpZmllZCBiZWZvcmU6IGBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJgLCBgX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJgLCBgX19jaGFuZ2VfcGFnZV9hdHRyYCwgYGNwYV9oYW5kbGVfbGFyZ2VfcGFnZWAsIGBzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZWAsIGBhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlYCwgYGFyY2hfc3BsaXRfbGFyZ2VfcGFnZWAsIGBhcmNoX2NoYW5nZV9wdGVgLCBgYXJjaF9jcGFfcHJvY2Vzc19mYXVsdGAsIGBhcmNoX2NwYV9wcm9jZXNzX2FsaWFzYCwgYGFyY2hfY3BhX2ZsdXNoYCwgYW5kIGBsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0cmAuXG5cbkxldCBtZSBqdXN0IGRvdWJsZS1jaGVjayB0aG9zZSBuYW1lc+KApiB5ZXAsIHRoZXkgYWxsIGxvb2sgZ29vZC4gSSdsbCBhZGQgYGxvb2t1cF9hZGRyZXNzX2luX3BnZGAsIGFuZCBgbG9va3VwX2FkZHJlc3NgIHdoaWxlIEknbSBhdCBpdC5cblxuQ29uZmlnczogYENQQV9ERUJVR2BcblxuTGV0IG1lIG1ha2Ugc3VyZSB0aGF0IGBDUEFfREVCVUdgIGlzIGEgdmFsaWQgY29uZmlnLiBZZXMsIGl0J3MgZGVmaW5lZCBpbiBgbW0vS2NvbmZpZy5kZWJ1Z2AuXG5cbkFscmlnaHQsIEkgZG9uJ3Qgc2VlIGFueSBvdGhlciByZWxldmFudCBjb25maWdzLCBgR0VORVJJQ19TRVRfTUVNT1JZYCBpcyBzZWxlY3RlZCBieSB0aGUgYXJjaGl0ZWN0dXJlcy4gSSdsbCBydW4gYHNldC1yZXN1bHRzYCB3aXRoIHRob3NlIHBhcmFtZXRlcnMsIGFuZCBob3BlZnVsbHksIHRoaXMgd2lsbCBoaWdobGlnaHQgdGhlIGJlc3QgYXJlYXMgZm9yIGZvY3VzZWQgZnV6emluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzYzOTQsIk91dHB1dFRva2VucyI6MjU1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTg0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjJUMTE6MTE6NTkuOTAzMjQ4Mjk0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzk2NTEyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNQQV9ERUJVR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNoYW5nZV9wYWdlX2F0dHJfc2V0X2NsclwiLFxuICAgIFwiX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHJcIixcbiAgICBcIl9fY2hhbmdlX3BhZ2VfYXR0clwiLFxuICAgIFwiY3BhX2hhbmRsZV9sYXJnZV9wYWdlXCIsXG4gICAgXCJzaG91bGRfc3BsaXRfbGFyZ2VfcGFnZVwiLFxuICAgIFwiYXJjaF9zaG91bGRfc3BsaXRfbGFyZ2VfcGFnZVwiLFxuICAgIFwiYXJjaF9zcGxpdF9sYXJnZV9wYWdlXCIsXG4gICAgXCJhcmNoX2NoYW5nZV9wdGVcIixcbiAgICBcImFyY2hfY3BhX3Byb2Nlc3NfZmF1bHRcIixcbiAgICBcImFyY2hfY3BhX3Byb2Nlc3NfYWxpYXNcIixcbiAgICBcImFyY2hfY3BhX2ZsdXNoXCIsXG4gICAgXCJsb29rdXBfYWRkcmVzc19pbl9wZ2RfYXR0clwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgY2hhbmdlX3BhZ2VfYXR0ciAoQ1BBKSBsb2dpYywgbW92aW5nIGl0IGZyb20gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgKHg4NiwgcmlzY3YpIHRvIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBpbiBtbS9zZXRfbWVtb3J5LmMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byBjb3JlIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudC4gRnV6emluZyBzaG91bGQgZm9jdXMgb24gdGhlIG5ldyBnZW5lcmljIGZ1bmN0aW9ucyBhbmQgdGhlaXIgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNhbGxiYWNrcy4gRW5hYmxpbmcgQ1BBX0RFQlVHIHdpbGwgYWxzbyBydW4gdGhlIENQQSBzZWxmLXRlc3RzIHRvIGhlbHAgdW5jb3ZlciBpc3N1ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ1BBX0RFQlVHXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyXCIsXG4gICAgXCJfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NsclwiLFxuICAgIFwiX19jaGFuZ2VfcGFnZV9hdHRyXCIsXG4gICAgXCJjcGFfaGFuZGxlX2xhcmdlX3BhZ2VcIixcbiAgICBcInNob3VsZF9zcGxpdF9sYXJnZV9wYWdlXCIsXG4gICAgXCJhcmNoX3Nob3VsZF9zcGxpdF9sYXJnZV9wYWdlXCIsXG4gICAgXCJhcmNoX3NwbGl0X2xhcmdlX3BhZ2VcIixcbiAgICBcImFyY2hfY2hhbmdlX3B0ZVwiLFxuICAgIFwiYXJjaF9jcGFfcHJvY2Vzc19mYXVsdFwiLFxuICAgIFwiYXJjaF9jcGFfcHJvY2Vzc19hbGlhc1wiLFxuICAgIFwiYXJjaF9jcGFfZmx1c2hcIixcbiAgICBcImxvb2t1cF9hZGRyZXNzX2luX3BnZF9hdHRyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBjaGFuZ2VfcGFnZV9hdHRyIChDUEEpIGxvZ2ljLCBtb3ZpbmcgaXQgZnJvbSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSAoeDg2LCByaXNjdikgdG8gYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGluIG1tL3NldF9tZW1vcnkuYy4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIGNvcmUga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LiBGdXp6aW5nIHNob3VsZCBmb2N1cyBvbiB0aGUgbmV3IGdlbmVyaWMgZnVuY3Rpb25zIGFuZCB0aGVpciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY2FsbGJhY2tzLiBFbmFibGluZyBDUEFfREVCVUcgd2lsbCBhbHNvIHJ1biB0aGUgQ1BBIHNlbGYtdGVzdHMgdG8gaGVscCB1bmNvdmVyIGlzc3Vlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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:nil,}