Name: series-workflowwvsfz Phase: Succeeded StartedAt: 2026-08-31 03:09:07 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[0] Phase: Succeeded StartedAt: 2026-08-31 03:09:07 +0000 UTC FinishedAt: 2026-08-31 03:27:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[0].run-triage Phase: Succeeded StartedAt: 2026-08-31 03:09:07 +0000 UTC FinishedAt: 2026-08-31 03:27:38 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "c2127e0eaf7eaa86e54c43b2794df55317d3f74f", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "c2127e0eaf7eaa86e54c43b2794df55317d3f74f", "config_name": "upstream-apparmor-kasan.config", "series_id": "97674aba-5691-41af-91c1-3b34a67c9ac1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "get_task_root", "get_task_pwd", "get_task_exe_path" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcyYjMzk7cyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6MjY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjOGUyNTJhOTcyZmMwMDM4ZTc4MDU2MTRhN2YxYjQ3MmIzMTU4YzY3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMzEgMDM6MjY6NTIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZnNfc3RydWN0LmMgYi9mcy9mc19zdHJ1Y3QuY1xuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcbi0tLSBhL2ZzL2ZzX3N0cnVjdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9mc19zdHJ1Y3QuY1xuQEAgLTEwLDYgJiM0MzsxMCw1MCBAQFxuICNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDttb3VudC5oXCYjMzQ7XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyByb290IHBhdGhcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAcm9vdDogVGhlIHRhc2smIzM5O3Mgcm9vdCBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGVcbiYjNDM7ICogY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcGF0aCB0aHJvdWdoIHBhdGhfcHV0KCkgb24gc3VjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0dGFza19sb2NrKHRhc2spO1xuJiM0MztcdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbiYjNDM7XHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4mIzQzO1x0XHRyZXQgPSAwO1xuJiM0MztcdH1cbiYjNDM7XHR0YXNrX3VubG9jayh0YXNrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnlcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAcHdkOiBUaGUgdGFzayYjMzk7cyB3b3JraW5nIGRpcmVjdG9yeS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcGF0aCB0aHJvdWdoIHBhdGhfcHV0KCkgb24gc3VjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHRhc2tfbG9jayh0YXNrKTtcbiYjNDM7XHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4mIzQzO1x0XHRnZXRfZnNfcHdkKHRhc2stXHUwMDNlcmVhbF9mcywgcHdkKTtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0fVxuJiM0MztcdHRhc2tfdW5sb2NrKHRhc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogUmVwbGFjZSB0aGUgZnMtXHUwMDNle3Jvb3RtbnQscm9vdH0gd2l0aCB7bW50LGRlbnRyeX0uIFB1dCB0aGUgb2xkIHZhbHVlcy5cbiAgKiBJdCBjYW4gYmxvY2suXG5kaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmNcbmluZGV4IGE2YTY0M2YxNWQwOGEuLmIyMTM3NGYwMDAwMmUgMTAwNjQ0XG4tLS0gYS9mcy9waWRmcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jXG5AQCAtNCw2ICYjNDM7NCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0ZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvZnNfc3RydWN0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb3VudC5oXHUwMDNlXG5AQCAtNTEwLDYgJiM0Mzs1MTEsOSBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0Y2FzZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRTpcbiBcdGNhc2UgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFOlxuIFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcbiYjNDM7XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuJiM0MztcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0fVxuIFxuQEAgLTUyNyw2MiAmIzQzOzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDtcbi1cdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuLVx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuLVxuLVx0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuLVx0XHRpZiAoIWFyZylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbi1cdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbiYjNDM7XHRpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7XG4mIzQzO1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuJiM0MztcdFx0cHV0X3Rhc2tfc3RydWN0KHRhc2spO1xuIFx0fVxuJiM0Mzt9XG4gXG4tXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cbi1cdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXG4tXHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiYjNDM7LypcbiYjNDM7ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuJiM0MzsgKiBhbmQgdGhlIGNhbGxlcnMmIzM5OyB0YXNrIHN0YXRlIGxvb2t1cCBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSB0aGUgbG9jayBpcyBoZWxkXG4mIzQzOyAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZGZkX2dldF90YXNrX2xvY2tlZChzdHJ1Y3QgcGlkICpwaWQsXG4mIzQzO1x0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cbiYjNDM7XHRcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcbiYjNDM7XHRpbnQgZXJyb3I7XG4gXG4tXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xuIFx0aWYgKCF0YXNrKVxuLVx0XHRyZXR1cm4gLUVTUkNIO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTtcbiBcbiBcdGlmIChhcmcpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tXHQvKlxuLVx0ICogV2UmIzM5O3JlIHRyeWluZyB0byBvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBuYW1lc3BhY2Ugc28gcGVyZm9ybSBhXG4tXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgZm9yIHRoZVxuLVx0ICogZHVyYXRpb24gb2YgdGhlIHB0cmFjZSBjaGVjayBhbmQgdGhlIG5hbWVzcGFjZSBsb29rdXAgc28gdGhhdCB0aGVcbi1cdCAqIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHRoZSBhY2Nlc3MgZGVjaXNpb24gbWF0Y2ggdGhvc2Ugb2YgQHRhc2sgYXQgdGhlXG4tXHQgKiB0aW1lIGl0cyBuYW1lc3BhY2UgaXMgcmVhZCwgcHJldmVudGluZyBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkgZnJvbVxuLVx0ICogc3dhcHBpbmcgdGhlIHRhc2smIzM5O3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXG4tXHQgKiBtaXJyb3IgbnNmcyBiZWhhdmlvci5cbi1cdCAqL1xuIFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4gXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcbiBcbiBcdGlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkge1xuLVx0XHRlcnJvciA9IC1FQUNDRVM7XG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHRcdHVwX3JlYWQoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcbiBcdH1cbiBcbiYjNDM7XHRyZXR1cm5fcHRyKHRhc2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuJiM0MztcdCAgICAgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKF9UKSxcbiYjNDM7XHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXG4mIzQzO1x0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxuJiM0MztcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuJiM0MztcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiYjNDM7XHRpZiAoSVNfRVJSKHRhc2spKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9DQVNUKHRhc2spO1xuJiM0MztcbiBcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiBcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIFx0XHRpZiAobnNwKVxuIFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gXHR9XG4tXHRpZiAoIW5zcCkge1xuLVx0XHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuJiM0MztcdGlmICghbnNwKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHQvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqL1xuQEAgLTY2NCwxNiAmIzQzOzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gI2VuZGlmXG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0ZXJyb3IgPSAtRU5PSU9DVExDTUQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpO1xuIFx0fVxuIFxuLVx0aWYgKCFlcnJvciBcdTAwMjZcdTAwMjYgIW5zX2NvbW1vbilcbi1cdFx0ZXJyb3IgPSAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAoIW5zX2NvbW1vbilcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTtcbiBcbi1vdXRfdW5sb2NrOlxuLVx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0cmV0dXJuIGVycm9yO1xuJiM0MztcdHJldHVybiBuc19jb21tb247XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXG4mIzQzO3tcbiYjNDM7XHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuJiM0MztcbiYjNDM7XHRpZiAoSVNfRVJSKHRhc2spKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIodGFzayk7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoY21kKSB7XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuJiM0MztcdFx0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIHBhdGgpO1xuJiM0MztcdGNhc2UgUElERkRfR0VUX0NXRDpcbiYjNDM7XHRcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiYjNDM7XHRcdHJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4mIzQzO1x0aW50IGVycm9yO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuJiM0MztcbiYjNDM7XHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4mIzQzO1x0XHRpZiAoIWFyZylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbiYjNDM7XG4mIzQzO1x0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4mIzQzO1x0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbiYjNDM7XHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChjbWQpIHtcbiYjNDM7XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuJiM0MztcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4mIzQzO1x0XHRlcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgXHUwMDI2cGF0aCk7XG4mIzQzO1x0XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XG4mIzQzO1x0XHRyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQyxcbiYjNDM7XHRcdFx0ICAgICAgZGVudHJ5X29wZW4oXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTtcbiYjNDM7XHRpZiAoSVNfRVJSKG5zX2NvbW1vbikpXG4mIzQzO1x0XHRyZXR1cm4gUFRSX0VSUihuc19jb21tb24pO1xuIFxuIFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xuIFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuY1xuaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDRcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9wcm9jL2Jhc2UuY1xuQEAgLTIwNiwzMSAmIzQzOzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcyxcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4te1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4tXHRcdHJlc3VsdCA9IDA7XG4tXHR9XG4tXHR0YXNrX3VubG9jayh0YXNrKTtcbi1cdHJldHVybiByZXN1bHQ7XG4tfVxuLVxuIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuIFx0XHRcdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwYXRoKTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbiYjNDM7XHRyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpO1xuIH1cbiBcbiBzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsXG5AQCAtMTc2MSwxNiAmIzQzOzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0ge1xuIHN0YXRpYyBpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpleGVfcGF0aCxcbiBcdFx0XHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4tXHRpZiAoZXhlX2ZpbGUpIHtcbi1cdFx0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0XHRwYXRoX2dldChcdTAwMjZleGVfZmlsZS1cdTAwM2VmX3BhdGgpO1xuLVx0XHRmcHV0KGV4ZV9maWxlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9IGVsc2Vcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIGV4ZV9wYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBjYWxsX3Byb2NfZ2V0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aF9vdXQpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG5AQCAtNDIsNiAmIzQzOzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpXG4gXHRyZWFkX3NlcXVubG9ja19leGNsKFx1MDAyNmZzLVx1MDAzZXNlcSk7XG4gfVxuIFxuJiM0MztpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcbiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xuJiM0MztcbiBzdHJ1Y3QgZnNfc3RydWN0ICpzd2l0Y2hfZnNfc3RydWN0KHN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcyk7XG4gXG4gZXh0ZXJuIGJvb2wgY3VycmVudF9jaHJvb3RlZCh2b2lkKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcbmluZGV4IGRkMDljNDM4ZmEyM2UuLmE2NWYyNGIyZTY1YmYgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbW0uaFxuQEAgLTQyMzksNiAmIzQzOzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIGludCByZXBsYWNlX21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuJiM0MztpbnQgZ2V0X3Rhc2tfZXhlX3BhdGgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgpO1xuIFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5AQCAtMTIxLDQgJiM0MzsxMjEsMTEgQEAgc3RydWN0IHBpZGZkX2luZm8ge1xuICNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxuICNkZWZpbmUgUElERkRfR0VUX0lORk8gICAgICAgICAgICAgICAgICAgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKVxuIFxuJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIGV4ZWN1dGFibGUuICovXG4mIzQzOyNkZWZpbmUgUElERkRfR0VUX0VYRSAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEyKVxuJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xuJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9DV0QgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMylcbiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyByb290IGRpcmVjdG9yeS4gKi9cbiYjNDM7I2RlZmluZSBQSURGRF9HRVRfUk9PVCAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTQpXG4mIzQzO1xuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDQxNjc1OGM4YTNkNDMuLmE0OTNkZTNhZTVjMjAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jXG5AQCAtMTM3MSw2ICYjNDM7MTM3MSwyNyBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIFx0cmV0dXJuIGV4ZV9maWxlO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIGdldF90YXNrX2V4ZV9wYXRoIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyBleGVjdXRhYmxlIHBhdGhcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4mIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuJiM0MzsgKi9cbiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGUgKmV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4mIzQzO1xuJiM0MztcdGlmICghZXhlX2ZpbGUpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuJiM0MztcdHBhdGhfZ2V0KGV4ZV9wYXRoKTtcbiYjNDM7XHRmcHV0KGV4ZV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgbW1cbiAgKiBAdGFzazogVGhlIHRhc2suXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG5pbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NFxuLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbkBAIC0xMyw2ICYjNDM7MTMsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wdHJhY2UuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gXG5AQCAtMzMwLDIyICYjNDM7MzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsXG4gXG4gc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jdXJyZW50X2V4ZV9wYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cdHN0cnVjdCBwYXRoIHA7XG4mIzQzO1x0c3RydWN0IHBhdGggcCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4gXHRjb25zdCBjaGFyICpwYXRoX3N0cjtcbiBcbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUoY3VycmVudCk7XG4tXHRpZiAoIWV4ZV9maWxlKVxuJiM0MztcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcdTAwMjZwKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tXHRwID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0cGF0aF9nZXQoXHUwMDI2cCk7XG4gXG4gXHRpZiAoYWFfcGF0aF9uYW1lKFx1MDAyNnAsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCBcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXG4gXHRcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdGZwdXQoZXhlX2ZpbGUpO1xuLVx0cGF0aF9wdXQoXHUwMDI2cCk7XG4tXG4gXHRyZXR1cm4gcGF0aF9zdHI7XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgcGlkZmQgaW9jdGxzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBhbmQgUElERkRfR0VUX1JPT1QpIGFsbG93aW5nIHVzZXJzcGFjZSB0byByZXRyaWV2ZSBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSBwcm9jZXNzJiMzOTtzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGM4ZTI1MmE5NzJmYzAwMzhlNzgwNTYxNGE3ZjFiNDcyYjMxNThjNjcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2ZzX3N0cnVjdC5jIGIvZnMvZnNfc3RydWN0LmMKaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDQKLS0tIGEvZnMvZnNfc3RydWN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnNfc3RydWN0LmMKQEAgLTEwLDYgJiM0MzsxMCw1MCBAQAogI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bW91bnQuaCYjMzQ7CiAKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyByb290IHBhdGgKJiM0MzsgKiBAdGFzazogVGhlIHRhc2suCiYjNDM7ICogQHJvb3Q6IFRoZSB0YXNrJiMzOTtzIHJvb3QgcGF0aC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYSByb290IHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuIFRoZQomIzQzOyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtRU5PRU5UOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodGFzayk7CiYjNDM7CWlmICh0YXNrLSZndDtyZWFsX2ZzKSB7CiYjNDM7CQlnZXRfZnNfcm9vdCh0YXNrLSZndDtyZWFsX2ZzLCByb290KTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CX0KJiM0MzsJdGFza191bmxvY2sodGFzayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkKJiM0MzsgKiBAdGFzazogVGhlIHRhc2suCiYjNDM7ICogQHB3ZDogVGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLUVOT0VOVDsKJiM0MzsKJiM0MzsJdGFza19sb2NrKHRhc2spOwomIzQzOwlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewomIzQzOwkJZ2V0X2ZzX3B3ZCh0YXNrLSZndDtyZWFsX2ZzLCBwd2QpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJfQomIzQzOwl0YXNrX3VubG9jayh0YXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiAvKgogICogUmVwbGFjZSB0aGUgZnMtJmd0O3tyb290bW50LHJvb3R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuCiAgKiBJdCBjYW4gYmxvY2suCmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuYwppbmRleCBhNmE2NDNmMTVkMDhhLi5iMjEzNzRmMDAwMDJlIDEwMDY0NAotLS0gYS9mcy9waWRmcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3BpZGZzLmMKQEAgLTQsNiAmIzQzOzQsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L2V4cG9ydGZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZzX3N0cnVjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Nncm91cC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW91bnQuaCZndDsKQEAgLTUxMCw2ICYjNDM7NTExLDkgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZCkKIAljYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOgogCWNhc2UgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFOgogCWNhc2UgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0U6CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwljYXNlIFBJREZEX0dFVF9ST09UOgogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTUyNyw2MiAmIzQzOzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKQogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDsKLQlzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMOwotCXN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7Ci0JaW50IGVycm9yOwotCi0JaWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKQotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCi0JaWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikgewotCQlpZiAoIWFyZykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCV9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7Ci0JCXJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLSZndDtpX2dlbmVyYXRpb24sIGFyZ3ApOwomIzQzOwlpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7CiYjNDM7CQl1cF9yZWFkKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKJiM0MzsJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKIAl9CiYjNDM7fQogCi0JLyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovCi0JaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSkKLQkJcmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpOwomIzQzOy8qCiYjNDM7ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVjawomIzQzOyAqIGFuZCB0aGUgY2FsbGVycyYjMzk7IHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQKJiM0MzsgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCwKJiM0MzsJCQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9CiYjNDM7CQlnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7CiYjNDM7CWludCBlcnJvcjsKIAotCXRhc2sgPSBnZXRfcGlkX3Rhc2socGlkZmRfcGlkKGZpbGUpLCBQSURUWVBFX1BJRCk7CiAJaWYgKCF0YXNrKQotCQlyZXR1cm4gLUVTUkNIOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsKIAogCWlmIChhcmcpCi0JCXJldHVybiAtRUlOVkFMOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQkvKgotCSAqIFdlJiMzOTtyZSB0cnlpbmcgdG8gb3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgbmFtZXNwYWNlIHNvIHBlcmZvcm0gYQotCSAqIGZpbGVzeXN0ZW0gY3JlZCBwdHJhY2UgY2hlY2suIEhvbGQgQHRhc2smIzM5O3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlCi0JICogZHVyYXRpb24gb2YgdGhlIHB0cmFjZSBjaGVjayBhbmQgdGhlIG5hbWVzcGFjZSBsb29rdXAgc28gdGhhdCB0aGUKLQkgKiBjcmVkZW50aWFscyB1c2VkIGZvciB0aGUgYWNjZXNzIGRlY2lzaW9uIG1hdGNoIHRob3NlIG9mIEB0YXNrIGF0IHRoZQotCSAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tCi0JICogc3dhcHBpbmcgdGhlIHRhc2smIzM5O3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlCi0JICogbWlycm9yIG5zZnMgYmVoYXZpb3IuCi0JICovCiAJZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCiAJaWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7Ci0JCWVycm9yID0gLUVBQ0NFUzsKLQkJZ290byBvdXRfdW5sb2NrOwomIzQzOwkJdXBfcmVhZCgmYW1wO3Rhc2stJmd0O3NpZ25hbC0mZ3Q7ZXhlY191cGRhdGVfbG9jayk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAl9CiAKJiM0MzsJcmV0dXJuX3B0cih0YXNrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7REVGSU5FX0NMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKJiM0MzsJICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLAomIzQzOwkgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksCiYjNDM7CSAgICAgc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBsb25nIGFyZykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqcGlkZmRfZ2V0X25hbWVzcGFjZShzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDsKJiM0MzsJc3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDsKJiM0MzsKJiM0MzsJQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTsKJiM0MzsJaWYgKElTX0VSUih0YXNrKSkKJiM0MzsJCXJldHVybiBFUlJfQ0FTVCh0YXNrKTsKJiM0MzsKIAlzY29wZWRfZ3VhcmQodGFza19sb2NrLCB0YXNrKSB7CiAJCW5zcCA9IHRhc2stJmd0O25zcHJveHk7CiAJCWlmIChuc3ApCiAJCQlnZXRfbnNwcm94eShuc3ApOwogCX0KLQlpZiAoIW5zcCkgewotCQllcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi8KLQkJZ290byBvdXRfdW5sb2NrOwotCX0KJiM0MzsJaWYgKCFuc3ApCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRVNSQ0gpOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbiYjMzk7dCBleGlzdCAqLwogCiAJc3dpdGNoIChjbWQpIHsKIAkvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqLwpAQCAtNjY0LDE2ICYjNDM7NjczLDcyIEBAIHN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKICNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnJvciA9IC1FTk9JT0NUTENNRDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7CiAJfQogCi0JaWYgKCFlcnJvciAmYW1wOyZhbXA7ICFuc19jb21tb24pCi0JCWVycm9yID0gLUVPUE5PVFNVUFA7CiYjNDM7CWlmICghbnNfY29tbW9uKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCi1vdXRfdW5sb2NrOgotCXVwX3JlYWQoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwomIzQzOwlyZXR1cm4gbnNfY29tbW9uOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpCiYjNDM7ewomIzQzOwlDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpOwomIzQzOwomIzQzOwlpZiAoSVNfRVJSKHRhc2spKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIodGFzayk7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJCXJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTsKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwkJcmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTsKJiM0MzsJY2FzZSBQSURGRF9HRVRfUk9PVDoKJiM0MzsJCXJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtRUlOVkFMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fTsKJiM0MzsJaW50IGVycm9yOwomIzQzOwomIzQzOwlpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpCiYjNDM7CQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwomIzQzOwomIzQzOwlpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7CiYjNDM7CQlpZiAoIWFyZykKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJCV9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7CiYjNDM7CiYjNDM7CQlyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9nZW5lcmF0aW9uLCBhcmdwKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi8KJiM0MzsJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSkKJiM0MzsJCXJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTsKJiM0MzsKJiM0MzsJc3dpdGNoIChjbWQpIHsKJiM0MzsJY2FzZSBQSURGRF9HRVRfRVhFOgomIzQzOwljYXNlIFBJREZEX0dFVF9DV0Q6CiYjNDM7CWNhc2UgUElERkRfR0VUX1JPT1Q6CiYjNDM7CQllcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgJmFtcDtwYXRoKTsKJiM0MzsJCWlmIChlcnJvcikKJiM0MzsJCQlyZXR1cm4gZXJyb3I7CiYjNDM7CiYjNDM7CQlyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQywKJiM0MzsJCQkgICAgICBkZW50cnlfb3BlbigmYW1wO3BhdGgsIE9fUEFUSCwgY3VycmVudF9jcmVkKCkpKTsKJiM0MzsJfQomIzQzOwomIzQzOwluc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpOwomIzQzOwlpZiAoSVNfRVJSKG5zX2NvbW1vbikpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUihuc19jb21tb24pOwogCiAJLyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqLwogCXJldHVybiBvcGVuX25hbWVzcGFjZShuc19jb21tb24pOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA2YTM5ZGU0MjRmNjJhLi43ZTJjMDUzODMyM2NjIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtMjA2LDMxICYjNDM7MjA2LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHBpZF9lbnRyeV9ubGluayhjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRyaWVzLAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpCi17Ci0JaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0KLQl0YXNrX2xvY2sodGFzayk7Ci0JaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKLQkJZ2V0X2ZzX3Jvb3QodGFzay0mZ3Q7cmVhbF9mcywgcm9vdCk7Ci0JCXJlc3VsdCA9IDA7Ci0JfQotCXRhc2tfdW5sb2NrKHRhc2spOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKLQotCXRhc2tfbG9jayh0YXNrKTsKLQlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewotCQlnZXRfZnNfcHdkKHRhc2stJmd0O3JlYWxfZnMsIHBhdGgpOwotCQlyZXN1bHQgPSAwOwotCX0KLQl0YXNrX3VubG9jayh0YXNrKTsKLQlyZXR1cm4gcmVzdWx0OwomIzQzOwlyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpOwogfQogCiBzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsCkBAIC0xNzYxLDE2ICYjNDM7MTc0MCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGlkX3NldF9jb21tX29wZXJhdGlvbnMgPSB7CiBzdGF0aWMgaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgsCiAJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBmaWxlICpleGVfZmlsZTsKLQotCWV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7Ci0JaWYgKGV4ZV9maWxlKSB7Ci0JCSpleGVfcGF0aCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7Ci0JCXBhdGhfZ2V0KCZhbXA7ZXhlX2ZpbGUtJmd0O2ZfcGF0aCk7Ci0JCWZwdXQoZXhlX2ZpbGUpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CXJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBleGVfcGF0aCk7CiB9CiAKIHN0YXRpYyBpbnQgY2FsbF9wcm9jX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGhfb3V0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmgKaW5kZXggOTdlZWY4ZDM4NjNkZC4uZmI3MjU3MDc3NTRkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oCkBAIC00Miw2ICYjNDM7NDIsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2ZzX3B3ZChzdHJ1Y3QgZnNfc3RydWN0ICpmcywgc3RydWN0IHBhdGggKnB3ZCkKIAlyZWFkX3NlcXVubG9ja19leGNsKCZhbXA7ZnMtJmd0O3NlcSk7CiB9CiAKJiM0MztpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTsKJiM0MztpbnQgZ2V0X3Rhc2tfcHdkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnB3ZCk7CiYjNDM7CiBzdHJ1Y3QgZnNfc3RydWN0ICpzd2l0Y2hfZnNfc3RydWN0KHN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcyk7CiAKIGV4dGVybiBib29sIGN1cnJlbnRfY2hyb290ZWQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtNDIzOSw2ICYjNDM7NDIzOSw3IEBAIGV4dGVybiBpbnQgc2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTsKIGV4dGVybiBpbnQgcmVwbGFjZV9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKTsKIAogZXh0ZXJuIHZvaWQgdm1fc3RhdF9hY2NvdW50KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgbG9uZyBucGFnZXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCmluZGV4IDA5MTkyNDZhMTYxMWMuLjk1Y2UxODE5ZjQyM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCkBAIC0xMjEsNCAmIzQzOzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7CiAjZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMCkKICNkZWZpbmUgUElERkRfR0VUX0lORk8gICAgICAgICAgICAgICAgICAgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKQogCiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyBleGVjdXRhYmxlLiAqLwomIzQzOyNkZWZpbmUgUElERkRfR0VUX0VYRSAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEyKQomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkuICovCiYjNDM7I2RlZmluZSBQSURGRF9HRVRfQ1dEICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTMpCiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyByb290IGRpcmVjdG9yeS4gKi8KJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNCkKJiM0MzsKICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA0MTY3NThjOGEzZDQzLi5hNDkzZGUzYWU1YzIwIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9mb3JrLmMKQEAgLTEzNzEsNiAmIzQzOzEzNzEsMjcgQEAgc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIAlyZXR1cm4gZXhlX2ZpbGU7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19leGVfcGF0aCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgZXhlY3V0YWJsZSBwYXRoCiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEBleGVfcGF0aDogVGhlIHRhc2smIzM5O3MgZXhlY3V0YWJsZSBwYXRoLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGUgKmV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7CiYjNDM7CiYjNDM7CWlmICghZXhlX2ZpbGUpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsKJiM0MzsJKmV4ZV9wYXRoID0gZXhlX2ZpbGUtJmd0O2ZfcGF0aDsKJiM0MzsJcGF0aF9nZXQoZXhlX3BhdGgpOwomIzQzOwlmcHV0KGV4ZV9maWxlKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgbW0KICAqIEB0YXNrOiBUaGUgdGFzay4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYwppbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMKJiM0MzsmIzQzOyYjNDM7IGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wdHJhY2UuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKIApAQCAtMzMwLDIyICYjNDM7MzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsCiAKIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfY3VycmVudF9leGVfcGF0aChjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKIHsKLQlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7Ci0Jc3RydWN0IHBhdGggcDsKJiM0MzsJc3RydWN0IHBhdGggcCBfX2ZyZWUocGF0aF9wdXQpID0ge307CiAJY29uc3QgY2hhciAqcGF0aF9zdHI7CiAKLQlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKGN1cnJlbnQpOwotCWlmICghZXhlX2ZpbGUpCiYjNDM7CWlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCAmYW1wO3ApKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQlwID0gZXhlX2ZpbGUtJmd0O2ZfcGF0aDsKLQlwYXRoX2dldCgmYW1wO3ApOwogCiAJaWYgKGFhX3BhdGhfbmFtZSgmYW1wO3AsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCAmYW1wO3BhdGhfc3RyLCBOVUxMLCBOVUxMKSkKIAkJcGF0aF9zdHIgPSBFUlJfUFRSKC1FTk9NRU0pOwogCi0JZnB1dChleGVfZmlsZSk7Ci0JcGF0aF9wdXQoJmFtcDtwKTsKLQogCXJldHVybiBwYXRoX3N0cjsKIH0KIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODA0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogNTU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkluaXRpYWwgQXNzZXNzbWVudDogUGF0Y2ggRGVlcCBEaXZlICZhbXA7IEZ1enppbmcgU3VpdGFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFuYWx5emUgdGhlIGNvZGUgY2hhbmdlcyBhbmQgdGhlbiBkZXRlcm1pbmUgaXRzIGZ1enppbmcgcG90ZW50aWFsLgoKVGhlIHBhdGNoIGl0c2VsZiBpcyBpbnRyb2R1Y2luZyBzZXZlcmFsIG5ldyBoZWxwZXIgZnVuY3Rpb25zLiBJIHNlZSBgZ2V0X3Rhc2tfcm9vdGAsIGBnZXRfdGFza19wd2RgLCBhbmQgYGdldF90YXNrX2V4ZV9wYXRoYCBhZGRlZCB0byB0aGUga2VybmVsLiBUaGVzZSBsb29rIGxpa2Ugc3RyYWlnaHRmb3J3YXJkIHBhdGggcmV0cmlldmFsIGZ1bmN0aW9ucywgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUgbW9kaWZpY2F0aW9ucyB0byBgZnMvcHJvYy9iYXNlLmNgIGFuZCBgc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jYCBjb25maXJtIHRoZXNlIGhlbHBlcnMgYXJlIGJlaW5nIHVzZWQgYnkgY29yZSBrZXJuZWwgY29tcG9uZW50cyBsaWtlIHByb2NmcyBhbmQgQXBwQXJtb3IsIHdoaWNoIGlzIGludGVyZXN0aW5nLgoKVGhlIHJlYWwgbWVhdCBvZiB0aGlzIHBhdGNoIHNlZW1zIHRvIGJlIHRoZSBjaGFuZ2VzIHdpdGhpbiBgZnMvcGlkZnMuY2AuIEl0JiMzOTtzIGltcGxlbWVudGluZyBuZXcgaW9jdGxzIG9uIHBpZGZkczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGlzIHN1Z2dlc3RzIGEgbWVjaGFuaXNtIHRvIHJldHJpZXZlIGV4ZWN1dGFibGUgcGF0aCwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIHBpZGZkIGludGVyZmFjZS4gVGhlIHJlZmFjdG9yaW5nIG9mIGBwaWRmZF9pb2N0bGAgaW5kaWNhdGVzIHNvbWUgbG9ja2luZyBjaGFuZ2VzLCB3aGljaCBpcyBhbHdheXMgZ29vZCB0byByZXZpZXcuIEl0IGFsc28gaW5jbHVkZXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBwaWRmZF9nZXRfdGFza19wYXRoYCwgd2hpY2ggbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgpOb3cgZm9yIHRoZSBmdXp6aW5nIGFuYWx5c2lzLiBUaGlzIGlzIGNlcnRhaW5seSB3b3J0aCBhIGNsb3NlciBsb29rLCBnaXZlbiB0aGF0IHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggY29yZSBrZXJuZWwgbG9naWMgaW4gdGhlIGZpbGVzeXN0ZW0gYW5kIHBpZGZkL2lvY3RsIHNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGZhY3QgdGhhdCB0aGVzZSBuZXcgaW9jdGxzIGFyZSBlYXNpbHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgYHBpZGZkX29wZW5gIG9yIGBjbG9uZShDTE9ORV9QSURGRClgIG9yIGp1c3QgdXNpbmcgYW4gZXhpc3RpbmcgcGlkZmQsIG1lYW5zIGl0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGNvZGUgcGF0aHMgaW4gUUVNVSBvciBldmVuIHdpdGggYSBzdGFuZGFyZCB1c2Vyc3BhY2Ugc2V0dXAuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCBpbmNsdWRlcyByZWFsIGZ1bmN0aW9uYWwgY2hhbmdlcywgbG9ja2luZyByZWZhY3RvcmluZywgYW5kIG5ldyBpb2N0bHMgbWFrZXMgaXQgZXZlbiBtb3JlIGNvbXBlbGxpbmcgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgV29ydGhGdXp6aW5nPXRydWUuCgpOb3csIGxldCYjMzk7cyBzZWUgd2hpY2ggY29uZmlndXJhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgTWFrZWZpbGVzIGZvciB0aGUgcmVsZXZhbnQgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMvcGlkZnMuY2AsIGBmcy9mc19zdHJ1Y3QuY2AsIGFuZCBga2VybmVsL2ZvcmsuY2AuIEkgd2lsbCB1c2UgYSB0b29sIGxpa2UgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBNYWtlZmlsZXMgbWFudWFsbHkuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBuZWVkIHRvIGVuYWJsZSB0byBhY2Nlc3MgYW5kIGZ1enogdGhlc2UgcGF0aHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cGlkZnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7XG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDUxNSBsaW5lcy5cblVzZSBtb3JlIHByZWNpc2UgZXhwcmVzc2lvbiBpZiBwb3NzaWJsZS5cblxuZnMvTWFrZWZpbGU9MTA9b2JqLXkgOj1cdG9wZW4ubyByZWFkX3dyaXRlLm8gZmlsZV90YWJsZS5vIHN1cGVyLm8gXFxcbi0tXG5mcy9NYWtlZmlsZS0xNy1cdFx0ZnNfZGlyZW50Lm8gZnNfY29udGV4dC5vIGZzX3BhcnNlci5vIGZzb3Blbi5vIGluaXQubyBcXFxuZnMvTWFrZWZpbGU6MTg6XHRcdGtlcm5lbF9yZWFkX2ZpbGUubyBtbnRfaWRtYXBwaW5nLm8gcmVtYXBfcmFuZ2UubyBwaWRmcy5vIFxcXG5mcy9NYWtlZmlsZS0xOS1cdFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXG4tLVxuZnMvY29yZWR1bXAuYy00NS0jaW5jbHVkZSBcdTAwM2NsaW51eC9lbGYuaFx1MDAzZVxuZnMvY29yZWR1bXAuYzo0NjojaW5jbHVkZSBcdTAwM2NsaW51eC9waWRmcy5oXHUwMDNlXG5mcy9jb3JlZHVtcC5jLTQ3LSNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldC5oXHUwMDNlXG4tLVxuZnMvY29yZWR1bXAuYz02MjM9c3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcbi0tXG5mcy9jb3JlZHVtcC5jLTYyOS1cdGlmIChjcC1cdTAwM2VwaWQpIHtcbmZzL2NvcmVkdW1wLmM6NjMwOlx0XHRzdHJ1Y3QgZmlsZSAqcGlkZnNfZmlsZSBfX2ZyZWUoZnB1dCkgPSBOVUxMO1xuZnMvY29yZWR1bXAuYy02MzEtXG5mcy9jb3JlZHVtcC5jOjYzMjpcdFx0cGlkZnNfZmlsZSA9IHBpZGZzX2FsbG9jX2ZpbGUoY3AtXHUwMDNlcGlkLCAwKTtcbmZzL2NvcmVkdW1wLmM6NjMzOlx0XHRpZiAoSVNfRVJSKHBpZGZzX2ZpbGUpKVxuZnMvY29yZWR1bXAuYzo2MzQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIocGlkZnNfZmlsZSk7XG5mcy9jb3JlZHVtcC5jLTYzNS1cbmZzL2NvcmVkdW1wLmM6NjM2Olx0XHRwaWRmc19jb3JlZHVtcChjcCk7XG5mcy9jb3JlZHVtcC5jLTYzNy1cbi0tXG5mcy9jb3JlZHVtcC5jLTY0NC1cdFx0ICovXG5mcy9jb3JlZHVtcC5jOjY0NTpcdFx0ZXJyID0gcmVwbGFjZV9mZChDT1JFRFVNUF9QSURGRF9OVU1CRVIsIHBpZGZzX2ZpbGUsIDApO1xuZnMvY29yZWR1bXAuYy02NDYtXHRcdGlmIChlcnIgXHUwMDNjIDApXG4tLVxuZnMvY29yZWR1bXAuYz02Njg9c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuLS1cbmZzL2NvcmVkdW1wLmMtNjk5LVx0ICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlclxuZnMvY29yZWR1bXAuYzo3MDA6XHQgKiBpdCBpbiBwaWRmcy4uLlxuZnMvY29yZWR1bXAuYy03MDEtXHQgKi9cbmZzL2NvcmVkdW1wLmMtNzAyLVx0Y3BybS1cdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG5mcy9jb3JlZHVtcC5jOjcwMzpcdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChjcHJtLVx1MDAzZXBpZCk7XG5mcy9jb3JlZHVtcC5jLTcwNC1cdGlmIChyZXR2YWwpXG4tLVxuZnMvY29yZWR1bXAuYy03MTAtXHQgKi9cbmZzL2NvcmVkdW1wLmM6NzExOlx0cGlkZnNfY29yZWR1bXAoY3BybSk7XG5mcy9jb3JlZHVtcC5jLTcxMi1cbi0tXG5mcy9maGFuZGxlLmM9MTcwPXN0YXRpYyBpbnQgZ2V0X3BhdGhfYW5jaG9yKGludCBmZCwgc3RydWN0IHBhdGggKnJvb3QpXG4tLVxuZnMvZmhhbmRsZS5jLTE4Ni1cdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XG5mcy9maGFuZGxlLmM6MTg3Olx0XHRwaWRmc19nZXRfcm9vdChyb290KTtcbmZzL2ZoYW5kbGUuYy0xODgtXHRcdHJldHVybiAwO1xuLS1cbmZzL2ludGVybmFsLmg9MzYyPWludCBhbm9uX2lub2RlX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcbmZzL2ludGVybmFsLmgtMzYzLVx0XHQgICAgICAgc3RydWN0IGlhdHRyICphdHRyKTtcbmZzL2ludGVybmFsLmg6MzY0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpO1xuZnMvaW50ZXJuYWwuaC0zNjUtdm9pZCBuc2ZzX2dldF9yb290KHN0cnVjdCBwYXRoICpwYXRoKTtcbi0tXG5mcy9saWJmcy5jLTI1LSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzY3J5cHQuaFx1MDAzZVxuZnMvbGliZnMuYzoyNjojaW5jbHVkZSBcdTAwM2NsaW51eC9waWRmcy5oXHUwMDNlXG5mcy9saWJmcy5jLTI3LVxuLS1cbmZzL2xpYmZzLmM9MjE5Mj1zdHJ1Y3QgZGVudHJ5ICpzdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcbi0tXG5mcy9saWJmcy5jLTIyMjUtICpcbmZzL2xpYmZzLmM6MjIyNjogKiBTcGVjaWFsLXB1cnBvc2UgaGVscGVyIGZvciBuc2ZzIGFuZCBwaWRmcy5cbmZzL2xpYmZzLmMtMjIyNy0gKlxuLS1cbmZzL25hbWVzcGFjZS5jLTM0LSNpbmNsdWRlIFx1MDAzY2xpbnV4L21udF9pZG1hcHBpbmcuaFx1MDAzZVxuZnMvbmFtZXNwYWNlLmM6MzU6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvbmFtZXNwYWNlLmMtMzYtI2luY2x1ZGUgXHUwMDNjbGludXgvbnN0cmVlLmhcdTAwM2Vcbi0tXG5mcy9uYW1lc3BhY2UuYz0yODgxPXN0YXRpYyBpbnQgZG9fY2hhbmdlX3R5cGUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGludCBtc19mbGFncylcbi0tXG5mcy9uYW1lc3BhY2UuYy0yOTI5LSAqICAgICBlbnRyeSBmcm9tIG5zZnMuXG5mcy9uYW1lc3BhY2UuYzoyOTMwOiAqICgzKSBUaGUgY2FsbGVyIHRyaWVzIHRvIGNvcHkgYSBwaWRmcyBtb3VudCByZWZlcnJpbmcgdG8gYSBwaWRmZC5cbmZzL25hbWVzcGFjZS5jLTI5MzEtICogKDQpIFRoZSBjYWxsZXIgaXMgdHJ5aW5nIHRvIGNvcHkgYSBtb3VudCB0cmVlIHRoYXQgYmVsb25ncyB0byBhblxuLS1cbmZzL25hbWVzcGFjZS5jPTI5NjA9c3RhdGljIGlubGluZSBib29sIG1heV9jb3B5X3RyZWUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpXG4tLVxuZnMvbmFtZXNwYWNlLmMtMjk3MS1cbmZzL25hbWVzcGFjZS5jOjI5NzI6XHRpZiAoZF9vcCA9PSBcdTAwMjZwaWRmc19kZW50cnlfb3BlcmF0aW9ucylcbmZzL25hbWVzcGFjZS5jLTI5NzMtXHRcdHJldHVybiB0cnVlO1xuLS1cbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTE2LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ2hhc2guaFx1MDAzZVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM6MTc6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMtMTgtXG4tLVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM9NzQ0PXN0YXRpYyBzdHJ1Y3QgZmFub3RpZnlfZXZlbnQgKmZhbm90aWZ5X2FsbG9jX2V2ZW50KFxuLS1cbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTg0OC1cdGlmIChGQU5fR1JPVVBfRkxBRyhncm91cCwgRkFOX1JFUE9SVF9QSURGRCkgXHUwMDI2XHUwMDI2XG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYzo4NDk6XHQgICAgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChwaWQsIGdmcCkpXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYy04NTAtXHRcdGdvdG8gb3V0O1xuLS1cbmZzL3BpZGZzLmMtMTEtI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkLmhcdTAwM2VcbmZzL3BpZGZzLmM6MTI6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvcGlkZnMuYy0xMy0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuLS1cbmZzL3BpZGZzLmMtMzctXG5mcy9waWRmcy5jOjM4OnN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcGlkZnNfYXR0cl9jYWNoZXAgX19yb19hZnRlcl9pbml0O1xuZnMvcGlkZnMuYy0zOS1cbmZzL3BpZGZzLmM6NDA6c3RhdGljIHN0cnVjdCBwYXRoIHBpZGZzX3Jvb3RfcGF0aCA9IHt9O1xuZnMvcGlkZnMuYy00MS1cbmZzL3BpZGZzLmM6NDI6c3RhdGljIHN0cnVjdCBzaW1wbGVfeGF0dHJfY2FjaGUgcGlkZnNfeGFfY2FjaGU7XG5mcy9waWRmcy5jLTQzLVxuZnMvcGlkZnMuYzo0NDp2b2lkIHBpZGZzX2dldF9yb290KHN0cnVjdCBwYXRoICpwYXRoKVxuZnMvcGlkZnMuYy00NS17XG5mcy9waWRmcy5jOjQ2Olx0KnBhdGggPSBwaWRmc19yb290X3BhdGg7XG5mcy9waWRmcy5jLTQ3LVx0cGF0aF9nZXQocGF0aCk7XG4tLVxuZnMvcGlkZnMuYy00OS1cbmZzL3BpZGZzLmM6NTA6ZW51bSBwaWRmc19hdHRyX21hc2tfYml0cyB7XG5mcy9waWRmcy5jLTUxLVx0UElERlNfQVRUUl9CSVRfRVhJVFx0PSAwLFxuLS1cbmZzL3BpZGZzLmMtNTQtXG5mcy9waWRmcy5jOjU1OnN0cnVjdCBwaWRmc19hbm9uX2F0dHIge1xuZnMvcGlkZnMuYy01Ni1cdHVuc2lnbmVkIGxvbmcgYXR0cl9tYXNrO1xuLS1cbmZzL3BpZGZzLmMtNjUtXG5mcy9waWRmcy5jOjY2OnN0YXRpYyBzdHJ1Y3Qgcmhhc2h0YWJsZSBwaWRmc19pbm9faHQ7XG5mcy9waWRmcy5jLTY3LVxuZnMvcGlkZnMuYzo2ODpzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBpZGZzX2lub19odF9wYXJhbXMgPSB7XG5mcy9waWRmcy5jLTY5LVx0LmtleV9vZmZzZXRcdFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBpbm8pLFxuZnMvcGlkZnMuYy03MC1cdC5rZXlfbGVuXHRcdD0gc2l6ZW9mKHU2NCksXG5mcy9waWRmcy5jOjcxOlx0LmhlYWRfb2Zmc2V0XHRcdD0gb2Zmc2V0b2Yoc3RydWN0IHBpZCwgcGlkZnNfaGFzaCksXG5mcy9waWRmcy5jLTcyLVx0LmF1dG9tYXRpY19zaHJpbmtpbmdcdD0gdHJ1ZSxcbi0tXG5mcy9waWRmcy5jLTg1LSAqXG5mcy9waWRmcy5jOjg2OiAqIE9uIDMyIGJpdCBwaWRmc19pbm8oKSB3aWxsIHJldHVybiB0aGUgbG93ZXIgMzIgYml0LiBXaGVuXG5mcy9waWRmcy5jOjg3OiAqIHBpZGZzX2lubygpIHJldHVybnMgemVybyBhIHdyYXAgYXJvdW5kIGhhcHBlbmVkLiBXaGVuIGFcbmZzL3BpZGZzLmMtODgtICogd3JhcGFyb3VuZCBoYXBwZW5zIHRoZSA2NCBiaXQgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkgMVxuLS1cbmZzL3BpZGZzLmMtOTUtICogc2FtZSBpbm9kZSBudW1iZXIgYXJlIGxpa2VseSB0byBleGlzdCAoVGhpcyBpc24mIzM5O3QgYSBwcm9ibGVtXG5mcy9waWRmcy5jOjk2OiAqIHNpbmNlIGJlZm9yZSBwaWRmcyBwaWRmZHMgdXNlZCB0aGUgYW5vbnltb3VzIGlub2RlIG1lYW5pbmdcbmZzL3BpZGZzLmMtOTctICogYWxsIHBpZGZkcyBoYWQgdGhlIHNhbWUgaW5vZGUgbnVtYmVyLikuIFVzZXJzcGFjZSBjYW5cbi0tXG5mcy9waWRmcy5jLTEwMS0gKi9cbmZzL3BpZGZzLmM6MTAyOnN0cnVjdCBwaWRmc19hdHRyIHtcbmZzL3BpZGZzLmMtMTAzLVx0c3RydWN0IGxpc3RfaGVhZCB4YXR0cnM7XG5mcy9waWRmcy5jLTEwNC1cdHVuaW9uIHtcbmZzL3BpZGZzLmM6MTA1Olx0XHRzdHJ1Y3QgcGlkZnNfYW5vbl9hdHRyO1xuZnMvcGlkZnMuYzoxMDY6XHRcdHN0cnVjdCBsbGlzdF9ub2RlIHBpZGZzX2xsaXN0O1xuZnMvcGlkZnMuYy0xMDctXHR9O1xuLS1cbmZzL3BpZGZzLmMtMTExLVxuZnMvcGlkZnMuYzoxMTI6c3RhdGljIERFRklORV9TUElOTE9DSyhwaWRmc19pbm9fbG9jayk7XG5mcy9waWRmcy5jOjExMzpzdGF0aWMgdTY0IHBpZGZzX2lub19uciA9IDE7XG5mcy9waWRmcy5jLTExNC1cbmZzL3BpZGZzLmM6MTE1OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwaWRmc19pbm8odTY0IGlubylcbmZzL3BpZGZzLmMtMTE2LXtcbi0tXG5mcy9waWRmcy5jLTEyMC0vKiBPbiAzMiBiaXQgdGhlIGdlbmVyYXRpb24gbnVtYmVyIGFyZSB0aGUgdXBwZXIgMzIgYml0cy4gKi9cbmZzL3BpZGZzLmM6MTIxOnN0YXRpYyBpbmxpbmUgdTMyIHBpZGZzX2dlbih1NjQgaW5vKVxuZnMvcGlkZnMuYy0xMjIte1xuLS1cbmZzL3BpZGZzLmMtMTI1LVxuZnMvcGlkZnMuYzoxMjY6c3RhdGljIGlubGluZSB1NjQgcGlkZnNfYWxsb2NfaW5vKHZvaWQpXG5mcy9waWRmcy5jLTEyNy17XG4tLVxuZnMvcGlkZnMuYy0xMjktXG5mcy9waWRmcy5jOjEzMDpcdHNwaW5fbG9jayhcdTAwMjZwaWRmc19pbm9fbG9jayk7XG5mcy9waWRmcy5jOjEzMTpcdGlmIChwaWRmc19pbm8ocGlkZnNfaW5vX25yKSA9PSAwKVxuZnMvcGlkZnMuYzoxMzI6XHRcdHBpZGZzX2lub19uciYjNDM7JiM0Mzs7XG5mcy9waWRmcy5jOjEzMzpcdGlubyA9IHBpZGZzX2lub19uciYjNDM7JiM0Mzs7XG5mcy9waWRmcy5jOjEzNDpcdHNwaW5fdW5sb2NrKFx1MDAyNnBpZGZzX2lub19sb2NrKTtcbmZzL3BpZGZzLmMtMTM1LVx0cmV0dXJuIGlubztcbi0tXG5mcy9waWRmcy5jLTE0MC0vKiBPbiA2NCBiaXQgc2ltcGx5IHJldHVybiBpbm8uICovXG5mcy9waWRmcy5jOjE0MTpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGlkZnNfaW5vKHU2NCBpbm8pXG5mcy9waWRmcy5jLTE0Mi17XG4tLVxuZnMvcGlkZnMuYy0xNDYtLyogT24gNjQgYml0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBpcyAwLiAqL1xuZnMvcGlkZnMuYzoxNDc6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXG5mcy9waWRmcy5jLTE0OC17XG4tLVxuZnMvcGlkZnMuYy0xNTEtXG5mcy9waWRmcy5jOjE1MjpERUZJTkVfQ09PS0lFKHBpZGZzX2lub19jb29raWUpO1xuZnMvcGlkZnMuYy0xNTMtXG5mcy9waWRmcy5jOjE1NDpzdGF0aWMgdTY0IHBpZGZzX2FsbG9jX2lubyh2b2lkKVxuZnMvcGlkZnMuYy0xNTUte1xuLS1cbmZzL3BpZGZzLmMtMTU4LVx0cHJlZW1wdF9kaXNhYmxlKCk7XG5mcy9waWRmcy5jOjE1OTpcdGlubyA9IGdlbl9jb29raWVfbmV4dChcdTAwMjZwaWRmc19pbm9fY29va2llKTtcbmZzL3BpZGZzLmMtMTYwLVx0cHJlZW1wdF9lbmFibGUoKTtcbi0tXG5mcy9waWRmcy5jLTE2Ny1cbmZzL3BpZGZzLmM6MTY4OnZvaWQgcGlkZnNfcHJlcGFyZV9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xNjkte1xuLS1cbmZzL3BpZGZzLmMtMTc0LVxuZnMvcGlkZnMuYzoxNzU6aW50IHBpZGZzX2FkZF9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xNzYte1xuLS1cbmZzL3BpZGZzLmMtMTc4LVxuZnMvcGlkZnMuYzoxNzk6XHRwaWQtXHUwMDNlaW5vID0gcGlkZnNfYWxsb2NfaW5vKCk7XG5mcy9waWRmcy5jOjE4MDpcdHJldCA9IHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoXHUwMDI2cGlkZnNfaW5vX2h0LCBcdTAwMjZwaWQtXHUwMDNlcGlkZnNfaGFzaCxcbmZzL3BpZGZzLmM6MTgxOlx0XHRcdFx0ICAgICBwaWRmc19pbm9faHRfcGFyYW1zKTtcbmZzL3BpZGZzLmMtMTgyLVx0aWYgKHVubGlrZWx5KHJldCkpXG4tLVxuZnMvcGlkZnMuYy0xODYtXG5mcy9waWRmcy5jOjE4Nzp2b2lkIHBpZGZzX3JlbW92ZV9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xODgte1xuZnMvcGlkZnMuYy0xODktXHRpZiAobGlrZWx5KHBpZC1cdTAwM2Vpbm8pKVxuZnMvcGlkZnMuYzoxOTA6XHRcdHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoXHUwMDI2cGlkZnNfaW5vX2h0LCBcdTAwMjZwaWQtXHUwMDNlcGlkZnNfaGFzaCxcbmZzL3BpZGZzLmM6MTkxOlx0XHRcdFx0ICAgICAgIHBpZGZzX2lub19odF9wYXJhbXMpO1xuZnMvcGlkZnMuYy0xOTItfVxuZnMvcGlkZnMuYy0xOTMtXG5mcy9waWRmcy5jOjE5NDpzdGF0aWMgTExJU1RfSEVBRChwaWRmc19mcmVlX2xpc3QpO1xuZnMvcGlkZnMuYy0xOTUtXG5mcy9waWRmcy5jOjE5NjpzdGF0aWMgdm9pZCBwaWRmc19mcmVlX2F0dHJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5mcy9waWRmcy5jLTE5Ny17XG5mcy9waWRmcy5jOjE5ODpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyLCAqbmV4dDtcbmZzL3BpZGZzLmMtMTk5LVx0c3RydWN0IGxsaXN0X25vZGUgKmhlYWQ7XG5mcy9waWRmcy5jLTIwMC1cbmZzL3BpZGZzLmM6MjAxOlx0aGVhZCA9IGxsaXN0X2RlbF9hbGwoXHUwMDI2cGlkZnNfZnJlZV9saXN0KTtcbmZzL3BpZGZzLmM6MjAyOlx0bGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdHRyLCBuZXh0LCBoZWFkLCBwaWRmc19sbGlzdCkge1xuZnMvcGlkZnMuYzoyMDM6XHRcdHNpbXBsZV94YXR0cnNfZnJlZShcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2YXR0ci1cdTAwM2V4YXR0cnMsIE5VTEwpO1xuZnMvcGlkZnMuYy0yMDQtXHRcdGtmcmVlKGF0dHIpO1xuLS1cbmZzL3BpZGZzLmMtMjA3LVxuZnMvcGlkZnMuYzoyMDg6c3RhdGljIERFQ0xBUkVfV09SSyhwaWRmc19mcmVlX3dvcmssIHBpZGZzX2ZyZWVfYXR0cl93b3JrKTtcbmZzL3BpZGZzLmMtMjA5LVxuZnMvcGlkZnMuYzoyMTA6dm9pZCBwaWRmc19mcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpXG5mcy9waWRmcy5jLTIxMS17XG5mcy9waWRmcy5jOjIxMjpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyID0gcGlkLVx1MDAzZWF0dHI7XG5mcy9waWRmcy5jLTIxMy1cbi0tXG5mcy9waWRmcy5jLTIzMi1cdFx0a2ZyZWUoYXR0cik7XG5mcy9waWRmcy5jOjIzMzpcdGVsc2UgaWYgKGxsaXN0X2FkZChcdTAwMjZhdHRyLVx1MDAzZXBpZGZzX2xsaXN0LCBcdTAwMjZwaWRmc19mcmVlX2xpc3QpKVxuZnMvcGlkZnMuYzoyMzQ6XHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2cGlkZnNfZnJlZV93b3JrKTtcbmZzL3BpZGZzLmMtMjM1LX1cbi0tXG5mcy9waWRmcy5jPTMzMD1zdGF0aWMgaW5saW5lIGJvb2wgcGlkX2luX2N1cnJlbnRfcGlkbnMoY29uc3Qgc3RydWN0IHBpZCAqcGlkKVxuLS1cbmZzL3BpZGZzLmMtMzM5LVxuZnMvcGlkZnMuYzozNDA6c3RhdGljIF9fdTMyIHBpZGZzX2NvcmVkdW1wX21hc2soZW51bSB0YXNrX2R1bXBhYmxlIGR1bXBhYmxlKVxuZnMvcGlkZnMuYy0zNDEte1xuLS1cbmZzL3BpZGZzLmM9MzY2PXN0YXRpYyBsb25nIHBpZGZkX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL3BpZGZzLmMtMzczLVx0c3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuZnMvcGlkZnMuYzozNzQ6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtMzc1LVx0Y29uc3Qgc3RydWN0IGNyZWQgKmM7XG4tLVxuZnMvcGlkZnMuYy00MzQtXHRpZiAoKG1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIFx1MDAyNlx1MDAyNiAha2luZm8uY29yZWR1bXBfbWFzaykge1xuZnMvcGlkZnMuYzo0MzU6XHRcdGtpbmZvLmNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKHRhc2tfZXhlY19zdGF0ZV9nZXRfZHVtcGFibGUodGFzaykpO1xuZnMvcGlkZnMuYy00MzYtXHRcdGtpbmZvLm1hc2sgfD0gUElERkRfSU5GT19DT1JFRFVNUDtcbi0tXG5mcy9waWRmcy5jLTQ5OS1cbmZzL3BpZGZzLmM6NTAwOnN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpXG5mcy9waWRmcy5jLTUwMS17XG4tLVxuZnMvcGlkZnMuYz03MDU9c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL3BpZGZzLmMtNzEwLVxuZnMvcGlkZnMuYzo3MTE6XHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG5mcy9waWRmcy5jLTcxMi1cdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbi0tXG5mcy9waWRmcy5jPTc0OD1zdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxuZnMvcGlkZnMuYy03NTctXG5mcy9waWRmcy5jOjc1ODpzdGF0aWMgaW50IHBpZGZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbmZzL3BpZGZzLmMtNzU5LXtcbi0tXG5mcy9waWRmcy5jLTc3Ny1cbmZzL3BpZGZzLmM6Nzc4OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBpZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHtcbmZzL3BpZGZzLmM6Nzc5Olx0LnJlbGVhc2VcdD0gcGlkZnNfZmlsZV9yZWxlYXNlLFxuZnMvcGlkZnMuYy03ODAtXHQucG9sbFx0XHQ9IHBpZGZkX3BvbGwsXG4tLVxuZnMvcGlkZnMuYz03OTA9c3RydWN0IHBpZCAqcGlkZmRfcGlkKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvcGlkZnMuYy03OTEte1xuZnMvcGlkZnMuYzo3OTI6XHRpZiAoZmlsZS1cdTAwM2VmX29wICE9IFx1MDAyNnBpZGZzX2ZpbGVfb3BlcmF0aW9ucylcbmZzL3BpZGZzLmMtNzkzLVx0XHRyZXR1cm4gRVJSX1BUUigtRUJBREYpO1xuLS1cbmZzL3BpZGZzLmMtODA0LSAqIHBpZC1cdTAwM2VhdHRyIHdpbGwgYmUgYWxsb2NhdGVkLiBJZiBub3Qgd2UgbWFyayB0aGUgc3RydWN0IHBpZCBhcyBkZWFkIHNvXG5mcy9waWRmcy5jOjgwNTogKiBhbnlvbmUgd2hvIGlzIHRyeWluZyB0byByZWdpc3RlciBpdCB3aXRoIHBpZGZzIHdpbGwgZmFpbCB0byBkbyBzby5cbmZzL3BpZGZzLmM6ODA2OiAqIE90aGVyd2lzZSB3ZSB3b3VsZCBoYW5kIG91dCBwaWRmcyBmb3IgcmVhcGVkIHRhc2tzIHdpdGhvdXQgaGF2aW5nXG5mcy9waWRmcy5jLTgwNy0gKiBleGl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS5cbi0tXG5mcy9waWRmcy5jLTgxMC0gKiByaWdodCBhd2F5IGluIGZyZWVfcGlkKCkgd2hlbiBubyBvbmUgaG9sZHMgYSBwaWRmZCBhbnltb3JlLiBTaW5jZVxuZnMvcGlkZnMuYzo4MTE6ICogcGlkZnNfZXhpdCgpIGN1cnJlbnRseSBpcyBwbGFjZWQgYWZ0ZXIgZXhpdF90YXNrX3dvcmsoKSB3ZSBrbm93IHRoYXRcbmZzL3BpZGZzLmMtODEyLSAqIGl0IGNhbm5vdCBiZSB1cyBha2EgdGhlIGV4aXRpbmcgdGFzayBob2xkaW5nIGEgcGlkZmQgdG8gaXRzZWxmLlxuZnMvcGlkZnMuYy04MTMtICovXG5mcy9waWRmcy5jOjgxNDp2b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5mcy9waWRmcy5jLTgxNS17XG5mcy9waWRmcy5jLTgxNi1cdHN0cnVjdCBwaWQgKnBpZCA9IHRhc2tfcGlkKHRzayk7XG5mcy9waWRmcy5jOjgxNzpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xuZnMvcGlkZnMuYy04MTgtI2lmZGVmIENPTkZJR19DR1JPVVBTXG4tLVxuZnMvcGlkZnMuYy04MjMtXG5mcy9waWRmcy5jOjgyNDpcdC8qIFN5bmNocm9uaXplIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkuICovXG5mcy9waWRmcy5jLTgyNS1cdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnEsIFx1MDAyNnBpZC1cdTAwM2V3YWl0X3BpZGZkLmxvY2spIHtcbi0tXG5mcy9waWRmcy5jLTgyOS1cdFx0XHQgKiBObyBvbmUgZXZlciBoZWxkIGEgcGlkZmQgZm9yIHRoaXMgc3RydWN0IHBpZC5cbmZzL3BpZGZzLmM6ODMwOlx0XHRcdCAqIE1hcmsgaXQgYXMgZGVhZCBzbyBubyBvbmUgY2FuIGFkZCBhIHBpZGZzXG5mcy9waWRmcy5jLTgzMS1cdFx0XHQgKiBlbnRyeSBhbnltb3JlLiBXZSYjMzk7cmUgYWJvdXQgdG8gYmUgcmVhcGVkIGFuZFxuLS1cbmZzL3BpZGZzLmMtODYwLSNpZmRlZiBDT05GSUdfQ09SRURVTVBcbmZzL3BpZGZzLmM6ODYxOnZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL3BpZGZzLmMtODYyLXtcbmZzL3BpZGZzLmMtODYzLVx0c3RydWN0IHBpZCAqcGlkID0gY3BybS1cdTAwM2VwaWQ7XG5mcy9waWRmcy5jOjg2NDpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xuZnMvcGlkZnMuYy04NjUtXG4tLVxuZnMvcGlkZnMuYy04NzEtXHQvKiBOb3RlIGhvdyB3ZSB3ZXJlIGNvcmVkdW1wZWQgYW5kIHRoYXQgd2UgY29yZWR1bXBlZC4gKi9cbmZzL3BpZGZzLmM6ODcyOlx0YXR0ci1cdTAwM2Vjb3JlZHVtcF9tYXNrID0gcGlkZnNfY29yZWR1bXBfbWFzayhjcHJtLVx1MDAzZWR1bXBhYmxlKSB8XG5mcy9waWRmcy5jLTg3My1cdFx0XHQgICAgICBQSURGRF9DT1JFRFVNUEVEO1xuLS1cbmZzL3BpZGZzLmMtODgzLVxuZnMvcGlkZnMuYzo4ODQ6c3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqcGlkZnNfbW50IF9fcm9fYWZ0ZXJfaW5pdDtcbmZzL3BpZGZzLmMtODg1LVxuLS1cbmZzL3BpZGZzLmMtODkwLSAqL1xuZnMvcGlkZnMuYzo4OTE6c3RhdGljIGludCBwaWRmc19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9waWRmcy5jLTg5Mi1cdFx0XHQgc3RydWN0IGlhdHRyICphdHRyKVxuLS1cbmZzL3BpZGZzLmMtODk2LVxuZnMvcGlkZnMuYzo4OTc6c3RhdGljIGludCBwaWRmc19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcbmZzL3BpZGZzLmMtODk4LVx0XHRcdCBzdHJ1Y3Qga3N0YXQgKnN0YXQsIHUzMiByZXF1ZXN0X21hc2ssXG4tLVxuZnMvcGlkZnMuYy05MDMtXG5mcy9waWRmcy5jOjkwNDpzdGF0aWMgc3NpemVfdCBwaWRmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWYsIHNpemVfdCBzaXplKVxuZnMvcGlkZnMuYy05MDUte1xuLS1cbmZzL3BpZGZzLmMtOTExLVxuZnMvcGlkZnMuYzo5MTI6c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHBpZGZzX2lub2RlX29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjkxMzpcdC5nZXRhdHRyXHQ9IHBpZGZzX2dldGF0dHIsXG5mcy9waWRmcy5jOjkxNDpcdC5zZXRhdHRyXHQ9IHBpZGZzX3NldGF0dHIsXG5mcy9waWRmcy5jOjkxNTpcdC5saXN0eGF0dHJcdD0gcGlkZnNfbGlzdHhhdHRyLFxuZnMvcGlkZnMuYy05MTYtfTtcbmZzL3BpZGZzLmMtOTE3LVxuZnMvcGlkZnMuYzo5MTg6c3RhdGljIHZvaWQgcGlkZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL3BpZGZzLmMtOTE5LXtcbi0tXG5mcy9waWRmcy5jLTkyNS1cbmZzL3BpZGZzLmM6OTI2OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaWRmc19zb3BzID0ge1xuZnMvcGlkZnMuYy05MjctXHQuZHJvcF9pbm9kZVx0PSBpbm9kZV9qdXN0X2Ryb3AsXG5mcy9waWRmcy5jOjkyODpcdC5ldmljdF9pbm9kZVx0PSBwaWRmc19ldmljdF9pbm9kZSxcbmZzL3BpZGZzLmMtOTI5LVx0LnN0YXRmc1x0XHQ9IHNpbXBsZV9zdGF0ZnMsXG4tLVxuZnMvcGlkZnMuYy05MzMtICogJiMzOTtsc29mJiMzOTsgaGFzIGtub3dsZWRnZSBvZiBvdXQgaGlzdG9yaWNhbCBhbm9uX2lub2RlIHVzZSwgYW5kIGV4cGVjdHNcbmZzL3BpZGZzLmM6OTM0OiAqIHRoZSBwaWRmcyBkZW50cnkgbmFtZSB0byBzdGFydCB3aXRoICYjMzk7YW5vbl9pbm9kZSYjMzk7LlxuZnMvcGlkZnMuYy05MzUtICovXG5mcy9waWRmcy5jOjkzNjpzdGF0aWMgY2hhciAqcGlkZnNfZG5hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pXG5mcy9waWRmcy5jLTkzNy17XG4tLVxuZnMvcGlkZnMuYy05NDAtXG5mcy9waWRmcy5jOjk0MTpjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjk0MjpcdC5kX2RuYW1lXHQ9IHBpZGZzX2RuYW1lLFxuZnMvcGlkZnMuYy05NDMtXHQuZF9wcnVuZVx0PSBzdGFzaGVkX2RlbnRyeV9wcnVuZSxcbi0tXG5mcy9waWRmcy5jLTk0NS1cbmZzL3BpZGZzLmM6OTQ2OnN0YXRpYyBpbnQgcGlkZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcbmZzL3BpZGZzLmMtOTQ3LVx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqcGFyZW50KVxuLS1cbmZzL3BpZGZzLmMtOTYxLS8qIEZpbmQgYSBzdHJ1Y3QgcGlkIGJhc2VkIG9uIHRoZSBpbm9kZSBudW1iZXIuICovXG5mcy9waWRmcy5jOjk2MjpzdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcbmZzL3BpZGZzLmMtOTYzLXtcbmZzL3BpZGZzLmMtOTY0LVx0c3RydWN0IHBpZCAqcGlkO1xuZnMvcGlkZnMuYzo5NjU6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtOTY2LVxuZnMvcGlkZnMuYy05NjctXHRndWFyZChyY3UpKCk7XG5mcy9waWRmcy5jOjk2ODpcdHBpZCA9IHJoYXNodGFibGVfbG9va3VwKFx1MDAyNnBpZGZzX2lub19odCwgXHUwMDI2aW5vLCBwaWRmc19pbm9faHRfcGFyYW1zKTtcbmZzL3BpZGZzLmMtOTY5LVx0aWYgKCFwaWQpXG4tLVxuZnMvcGlkZnMuYy05ODEtXG5mcy9waWRmcy5jOjk4MjpzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG5mcy9waWRmcy5jLTk4My1cdFx0XHRcdFx0IHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbixcbi0tXG5mcy9waWRmcy5jLTEwMDEtXG5mcy9waWRmcy5jOjEwMDI6XHRwaWQgPSBwaWRmc19pbm9fZ2V0X3BpZChwaWRfaW5vKTtcbmZzL3BpZGZzLmMtMTAwMy1cdGlmICghcGlkKVxuLS1cbmZzL3BpZGZzLmMtMTAwNS1cbmZzL3BpZGZzLmM6MTAwNjpcdHJldCA9IHBhdGhfZnJvbV9zdGFzaGVkKFx1MDAyNnBpZC1cdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIHBpZCwgXHUwMDI2cGF0aCk7XG5mcy9waWRmcy5jLTEwMDctXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmZzL3BpZGZzLmMtMTAxNS1cbmZzL3BpZGZzLmM6MTAxNjpzdGF0aWMgc3RydWN0IGZpbGUgKnBpZGZzX2RlbnRyeV9vcGVuKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLFxuZnMvcGlkZnMuYy0xMDE3LVx0XHRcdFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLS1cbmZzL3BpZGZzLmMtMTAzNy1cbmZzL3BpZGZzLmM6MTAzODpzdGF0aWMgaW50IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uKHN0cnVjdCBoYW5kbGVfdG9fcGF0aF9jdHggKmN0eCxcbmZzL3BpZGZzLmMtMTAzOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBvZmxhZ3MpXG4tLVxuZnMvcGlkZnMuYy0xMDUxLVxuZnMvcGlkZnMuYzoxMDUyOnN0YXRpYyBzdHJ1Y3QgZmlsZSAqcGlkZnNfZXhwb3J0X29wZW4oY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGludCBvZmxhZ3MpXG5mcy9waWRmcy5jLTEwNTMte1xuLS1cbmZzL3BpZGZzLmMtMTA2MC1cdC8qIENsZWFyIE9fTEFSR0VGSUxFIGFzIG9wZW5fYnlfaGFuZGxlX2F0KCkgZm9yY2VzIGl0LiAqL1xuZnMvcGlkZnMuYzoxMDYxOlx0cmV0dXJuIHBpZGZzX2RlbnRyeV9vcGVuKHBhdGgsIG9mbGFncyBcdTAwMjYgfk9fTEFSR0VGSUxFLCBjdXJyZW50X2NyZWQoKSk7XG5mcy9waWRmcy5jLTEwNjItfVxuZnMvcGlkZnMuYy0xMDYzLVxuZnMvcGlkZnMuYzoxMDY0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcGlkZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjEwNjU6XHQuZW5jb2RlX2ZoXHQ9IHBpZGZzX2VuY29kZV9maCxcbmZzL3BpZGZzLmM6MTA2NjpcdC5maF90b19kZW50cnlcdD0gcGlkZnNfZmhfdG9fZGVudHJ5LFxuZnMvcGlkZnMuYzoxMDY3Olx0Lm9wZW5cdFx0PSBwaWRmc19leHBvcnRfb3BlbixcbmZzL3BpZGZzLmM6MTA2ODpcdC5wZXJtaXNzaW9uXHQ9IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uLFxuZnMvcGlkZnMuYy0xMDY5LX07XG5mcy9waWRmcy5jLTEwNzAtXG5mcy9waWRmcy5jOjEwNzE6c3RhdGljIGludCBwaWRmc19pbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG5mcy9waWRmcy5jLTEwNzIte1xuLS1cbmZzL3BpZGZzLmMtMTA3OS1cdGlub2RlLVx1MDAzZWlfbW9kZSB8PSBTX0lSV1hVO1xuZnMvcGlkZnMuYzoxMDgwOlx0aW5vZGUtXHUwMDNlaV9vcCA9IFx1MDAyNnBpZGZzX2lub2RlX29wZXJhdGlvbnM7XG5mcy9waWRmcy5jOjEwODE6XHRpbm9kZS1cdTAwM2VpX2ZvcCA9IFx1MDAyNnBpZGZzX2ZpbGVfb3BlcmF0aW9ucztcbmZzL3BpZGZzLmM6MTA4MjpcdGlub2RlLVx1MDAzZWlfaW5vID0gcGlkZnNfaW5vKHBpZC1cdTAwM2Vpbm8pO1xuZnMvcGlkZnMuYzoxMDgzOlx0aW5vZGUtXHUwMDNlaV9nZW5lcmF0aW9uID0gcGlkZnNfZ2VuKHBpZC1cdTAwM2Vpbm8pO1xuZnMvcGlkZnMuYy0xMDg0LVx0cmV0dXJuIDA7XG4tLVxuZnMvcGlkZnMuYy0xMDg2LVxuZnMvcGlkZnMuYzoxMDg3OnN0YXRpYyB2b2lkIHBpZGZzX3B1dF9kYXRhKHZvaWQgKmRhdGEpXG5mcy9waWRmcy5jLTEwODgte1xuLS1cbmZzL3BpZGZzLmMtMTA5My0vKipcbmZzL3BpZGZzLmM6MTA5NDogKiBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwIC0gcmVnaXN0ZXIgYSBzdHJ1Y3QgcGlkIGluIHBpZGZzIHdpdGggY3VzdG9tIEdGUFxuZnMvcGlkZnMuYy0xMDk1LSAqIGZsYWdzXG4tLVxuZnMvcGlkZnMuYy0xMDk4LSAqXG5mcy9waWRmcy5jOjEwOTk6ICogUmVnaXN0ZXIgYSBzdHJ1Y3QgcGlkIGluIHBpZGZzIHdpdGggY3VzdG9tIEdGUCBmbGFncy5cbmZzL3BpZGZzLmMtMTEwMC0gKlxuLS1cbmZzL3BpZGZzLmMtMTEwMi0gKi9cbmZzL3BpZGZzLmM6MTEwMzppbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcbmZzL3BpZGZzLmMtMTEwNC17XG5mcy9waWRmcy5jOjExMDU6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqbmV3X2F0dHIgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG5mcy9waWRmcy5jOjExMDY6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtMTEwNy1cbi0tXG5mcy9waWRmcy5jLTExMTgtXG5mcy9waWRmcy5jOjExMTk6XHRuZXdfYXR0ciA9IGttZW1fY2FjaGVfemFsbG9jKHBpZGZzX2F0dHJfY2FjaGVwLCBnZnApO1xuZnMvcGlkZnMuYy0xMTIwLVx0aWYgKCFuZXdfYXR0cilcbi0tXG5mcy9waWRmcy5jLTExMjQtXG5mcy9waWRmcy5jOjExMjU6XHQvKiBTeW5jaHJvbml6ZSB3aXRoIHBpZGZzX2V4aXQoKS4gKi9cbmZzL3BpZGZzLmMtMTEyNi1cdGd1YXJkKHNwaW5sb2NrX2lycSkoXHUwMDI2cGlkLVx1MDAzZXdhaXRfcGlkZmQubG9jayk7XG4tLVxuZnMvcGlkZnMuYy0xMTM3LVxuZnMvcGlkZnMuYzoxMTM4OnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwaWRmc19zdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsXG5mcy9waWRmcy5jLTExMzktXHRcdFx0XHRcdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4tLVxuZnMvcGlkZnMuYy0xMTQ1LVxuZnMvcGlkZnMuYzoxMTQ2Olx0cmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XG5mcy9waWRmcy5jLTExNDctXHRpZiAocmV0KVxuLS1cbmZzL3BpZGZzLmMtMTE1Mi1cbmZzL3BpZGZzLmM6MTE1MzpzdGF0aWMgY29uc3Qgc3RydWN0IHN0YXNoZWRfb3BlcmF0aW9ucyBwaWRmc19zdGFzaGVkX29wcyA9IHtcbmZzL3BpZGZzLmM6MTE1NDpcdC5zdGFzaF9kZW50cnlcdD0gcGlkZnNfc3Rhc2hfZGVudHJ5LFxuZnMvcGlkZnMuYzoxMTU1Olx0LmluaXRfaW5vZGVcdD0gcGlkZnNfaW5pdF9pbm9kZSxcbmZzL3BpZGZzLmM6MTE1NjpcdC5wdXRfZGF0YVx0PSBwaWRmc19wdXRfZGF0YSxcbmZzL3BpZGZzLmMtMTE1Ny19O1xuZnMvcGlkZnMuYy0xMTU4LVxuZnMvcGlkZnMuYzoxMTU5OnN0YXRpYyBpbnQgcGlkZnNfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLFxuZnMvcGlkZnMuYy0xMTYwLVx0XHRcdCAgIHN0cnVjdCBkZW50cnkgKnVudXNlZCwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9waWRmcy5jLTExNjUtXG5mcy9waWRmcy5jOjExNjY6XHRyZXR1cm4gc2ltcGxlX3hhdHRyX2dldChcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2cGlkLVx1MDAzZWF0dHItXHUwMDNleGF0dHJzLCBuYW1lLCB2YWx1ZSwgc2l6ZSk7XG5mcy9waWRmcy5jLTExNjctfVxuZnMvcGlkZnMuYy0xMTY4LVxuZnMvcGlkZnMuYzoxMTY5OnN0YXRpYyBpbnQgcGlkZnNfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLFxuZnMvcGlkZnMuYy0xMTcwLVx0XHRcdCAgIHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsXG4tLVxuZnMvcGlkZnMuYy0xMTgwLVxuZnMvcGlkZnMuYzoxMTgxOlx0b2xkX3hhdHRyID0gc2ltcGxlX3hhdHRyX3NldChcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2cGlkLVx1MDAzZWF0dHItXHUwMDNleGF0dHJzLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpO1xuZnMvcGlkZnMuYy0xMTgyLVx0aWYgKElTX0VSUihvbGRfeGF0dHIpKVxuLS1cbmZzL3BpZGZzLmMtMTE4OC1cbmZzL3BpZGZzLmM6MTE4OTpzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgcGlkZnNfdHJ1c3RlZF94YXR0cl9oYW5kbGVyID0ge1xuZnMvcGlkZnMuYy0xMTkwLVx0LnByZWZpeCA9IFhBVFRSX1RSVVNURURfUFJFRklYLFxuZnMvcGlkZnMuYzoxMTkxOlx0LmdldFx0PSBwaWRmc194YXR0cl9nZXQsXG5mcy9waWRmcy5jOjExOTI6XHQuc2V0XHQ9IHBpZGZzX3hhdHRyX3NldCxcbmZzL3BpZGZzLmMtMTE5My19O1xuZnMvcGlkZnMuYy0xMTk0LVxuZnMvcGlkZnMuYzoxMTk1OnN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqY29uc3QgcGlkZnNfeGF0dHJfaGFuZGxlcnNbXSA9IHtcbmZzL3BpZGZzLmM6MTE5NjpcdFx1MDAyNnBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlcixcbmZzL3BpZGZzLmMtMTE5Ny1cdE5VTExcbi0tXG5mcy9waWRmcy5jLTExOTktXG5mcy9waWRmcy5jOjEyMDA6c3RhdGljIGludCBwaWRmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZnMvcGlkZnMuYy0xMjAxLXtcbi0tXG5mcy9waWRmcy5jLTEyMDgtXHRjdHgtXHUwMDNlc19kX2ZsYWdzIHw9IERDQUNIRV9ET05UQ0FDSEU7XG5mcy9waWRmcy5jOjEyMDk6XHRjdHgtXHUwMDNlb3BzID0gXHUwMDI2cGlkZnNfc29wcztcbmZzL3BpZGZzLmM6MTIxMDpcdGN0eC1cdTAwM2Vlb3BzID0gXHUwMDI2cGlkZnNfZXhwb3J0X29wZXJhdGlvbnM7XG5mcy9waWRmcy5jOjEyMTE6XHRjdHgtXHUwMDNlZG9wcyA9IFx1MDAyNnBpZGZzX2RlbnRyeV9vcGVyYXRpb25zO1xuZnMvcGlkZnMuYzoxMjEyOlx0Y3R4LVx1MDAzZXhhdHRyID0gcGlkZnNfeGF0dHJfaGFuZGxlcnM7XG5mcy9waWRmcy5jOjEyMTM6XHRmYy1cdTAwM2VzX2ZzX2luZm8gPSAodm9pZCAqKVx1MDAyNnBpZGZzX3N0YXNoZWRfb3BzO1xuZnMvcGlkZnMuYy0xMjE0LVx0cmV0dXJuIDA7XG4tLVxuZnMvcGlkZnMuYy0xMjE2LVxuZnMvcGlkZnMuYzoxMjE3OnN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBwaWRmc190eXBlID0ge1xuZnMvcGlkZnMuYzoxMjE4Olx0Lm5hbWVcdFx0XHQ9IFwmIzM0O3BpZGZzXCYjMzQ7LFxuZnMvcGlkZnMuYzoxMjE5Olx0LmluaXRfZnNfY29udGV4dFx0PSBwaWRmc19pbml0X2ZzX2NvbnRleHQsXG5mcy9waWRmcy5jLTEyMjAtXHQua2lsbF9zYlx0XHQ9IGtpbGxfYW5vbl9zdXBlcixcbi0tXG5mcy9waWRmcy5jLTEyMjItXG5mcy9waWRmcy5jOjEyMjM6c3RydWN0IGZpbGUgKnBpZGZzX2FsbG9jX2ZpbGUoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG5mcy9waWRmcy5jLTEyMjQte1xuLS1cbmZzL3BpZGZzLmMtMTIzNC1cbmZzL3BpZGZzLmM6MTIzNTpcdHJldCA9IHBhdGhfZnJvbV9zdGFzaGVkKFx1MDAyNnBpZC1cdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIGdldF9waWQocGlkKSwgXHUwMDI2cGF0aCk7XG5mcy9waWRmcy5jLTEyMzYtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmZzL3BpZGZzLmMtMTI0MS1cdGZsYWdzIFx1MDAyNj0gflBJREZEX1NUQUxFO1xuZnMvcGlkZnMuYzoxMjQyOlx0cmV0dXJuIHBpZGZzX2RlbnRyeV9vcGVuKFx1MDAyNnBhdGgsIGZsYWdzLCBjdXJyZW50X2NyZWQoKSk7XG5mcy9waWRmcy5jLTEyNDMtfVxuZnMvcGlkZnMuYy0xMjQ0LVxuZnMvcGlkZnMuYzoxMjQ1OnZvaWQgX19pbml0IHBpZGZzX2luaXQodm9pZClcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2OTY1CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTA0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIEZpbGVzeXN0ZW0gTW9kdWxlIEJ1aWxkIFByb2Nlc3MqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBwaWRmcy5vYCBpcyBiZWluZyBpbmNsdWRlZCBpbiB0aGUga2VybmVsIGJ1aWxkLiBUaGUgZmlyc3QgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmcy9NYWtlZmlsZWAuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB6ZXJvaW5nIGluIG9uIGxpbmUgMTguIEFoLCB0aGVyZSBpdCBpczogYG9iai15IDo9IG9wZW4ubyByZWFkX3dyaXRlLm8gLi4uIHBpZGZzLm8gLi4uYC4gIFNvIGBwaWRmcy5vYCBpcyBidWlsdCB1bmNvbmRpdGlvbmFsbHkgYXMgcGFydCBvZiB0aGUgY29yZSBgZnMvYCBkaXJlY3RvcnksIGluZGljYXRlZCBieSBgb2JqLXlgLiBUaGF0IGNvbmZpcm1zIGl0JiMzOTtzIGEgY3JpdGljYWwgY29tcG9uZW50LgoKTm93LCBJJiMzOTttIHRoaW5raW5nLCBJIHdhbnQgdG8gdHJhY2UgdGhlIGRlcGVuZGVuY2llcyBmdXJ0aGVyLCBhbmQgSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGF0IGBmc19zdHJ1Y3QuY2AgaXMgYmVpbmcgaW5jbHVkZWQgcHJvcGVybHkuIEkgc2hvdWxkIGNoZWNrIHRoZSBgZnMvTWFrZWZpbGVgIGFnYWluLCB0aGlzIHRpbWUgbG9va2luZyBmb3IgYGZzX3N0cnVjdC5vYCBvciBhIHNpbWlsYXIgb2JqZWN0IGZpbGUuICBMZXQmIzM5O3Mgc2NhbiB0aHJvdWdoIGxpbmVzIDEwIHRocm91Z2ggMjUgdG8gc2VlIGhvdyBpdCYjMzk7cyBiZWluZyBoYW5kbGVkLiBUaGlzIHNob3VsZCBoZWxwIG1lIGNvbmZpcm0gaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNcbiAgIDM6XHQjIE1ha2VmaWxlIGZvciB0aGUgTGludXggZmlsZXN5c3RlbXMuXG4gICA0Olx0I1xuICAgNTpcdCMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIFx1MDAzY2hjaEBpbmZyYWRlYWQub3JnXHUwMDNlXG4gICA2Olx0IyBSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYtc3RhdGVtZW50cy5cbiAgIDc6XHQjIFxuICAgODpcdFxuICAgOTpcdFxuICAxMDpcdG9iai15IDo9XHRvcGVuLm8gcmVhZF93cml0ZS5vIGZpbGVfdGFibGUubyBzdXBlci5vIFxcXG4gIDExOlx0XHRcdGNoYXJfZGV2Lm8gc3RhdC5vIGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFxcXG4gIDEyOlx0XHRcdGlvY3RsLm8gcmVhZGRpci5vIHNlbGVjdC5vIGRjYWNoZS5vIGlub2RlLm8gXFxcbiAgMTM6XHRcdFx0YXR0ci5vIGJhZF9pbm9kZS5vIGZpbGUubyBmaWxlc3lzdGVtcy5vIG5hbWVzcGFjZS5vIFxcXG4gIDE0Olx0XHRcdHNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIFxcXG4gIDE1Olx0XHRcdHBub2RlLm8gc3BsaWNlLm8gc3luYy5vIHV0aW1lcy5vIGRfcGF0aC5vIFxcXG4gIDE2Olx0XHRcdHN0YWNrLm8gZnNfc3RydWN0Lm8gc3RhdGZzLm8gZnNfcGluLm8gbnNmcy5vIFxcXG4gIDE3Olx0XHRcdGZzX2RpcmVudC5vIGZzX2NvbnRleHQubyBmc19wYXJzZXIubyBmc29wZW4ubyBpbml0Lm8gXFxcbiAgMTg6XHRcdFx0a2VybmVsX3JlYWRfZmlsZS5vIG1udF9pZG1hcHBpbmcubyByZW1hcF9yYW5nZS5vIHBpZGZzLm8gXFxcbiAgMTk6XHRcdFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXG4gIDIwOlx0XG4gIDIxOlx0b2JqLSQoQ09ORklHX0JVRkZFUl9IRUFEKVx0JiM0Mzs9IGJ1ZmZlci5vIG1wYWdlLm9cbiAgMjI6XHRvYmotJChDT05GSUdfUFJPQ19GUylcdFx0JiM0Mzs9IHByb2NfbmFtZXNwYWNlLm9cbiAgMjM6XHRvYmotJChDT05GSUdfTEVHQUNZX0RJUkVDVF9JTylcdCYjNDM7PSBkaXJlY3QtaW8ub1xuICAyNDpcdG9iai15XHRcdFx0XHQmIzQzOz0gbm90aWZ5L1xuICAyNTpcdG9iai0kKENPTkZJR19FUE9MTClcdFx0JiM0Mzs9IGV2ZW50cG9sbC5vXG4gIDI2Olx0b2JqLXlcdFx0XHRcdCYjNDM7PSBhbm9uX2lub2Rlcy5vXG4gIDI3Olx0b2JqLSQoQ09ORklHX1NJR05BTEZEKVx0XHQmIzQzOz0gc2lnbmFsZmQub1xuICAyODpcdG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQmIzQzOz0gdGltZXJmZC5vXG4gIDI5Olx0b2JqLSQoQ09ORklHX0VWRU5URkQpXHRcdCYjNDM7PSBldmVudGZkLm9cbiAgMzA6XHRvYmotJChDT05GSUdfQUlPKSAgICAgICAgICAgICAgICYjNDM7PSBhaW8ub1xuICAzMTpcdG9iai0kKENPTkZJR19GU19EQVgpXHRcdCYjNDM7PSBkYXgub1xuICAzMjpcdG9iai0kKENPTkZJR19GU19FTkNSWVBUSU9OKVx0JiM0Mzs9IGNyeXB0by9cbiAgMzM6XHRvYmotJChDT05GSUdfRlNfVkVSSVRZKVx0XHQmIzQzOz0gdmVyaXR5L1xuICAzNDpcdG9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgJiM0Mzs9IGxvY2tzLm9cbiAgMzU6XHRvYmotJChDT05GSUdfQklORk1UX01JU0MpXHQmIzQzOz0gYmluZm10X21pc2Mub1xuICAzNjpcdG9iai0kKENPTkZJR19CSU5GTVRfTUlTQ19CUEYpXHQmIzQzOz0gYmluZm10X21pc2NfYnBmLm9cbiAgMzc6XHRvYmotJChDT05GSUdfQklORk1UX1NDUklQVClcdCYjNDM7PSBiaW5mbXRfc2NyaXB0Lm9cbiAgMzg6XHRvYmotJChDT05GSUdfQklORk1UX0VMRilcdCYjNDM7PSBiaW5mbXRfZWxmLm9cbiAgMzk6XHRvYmotJChDT05GSUdfQ09NUEFUX0JJTkZNVF9FTEYpXHQmIzQzOz0gY29tcGF0X2JpbmZtdF9lbGYub1xuICA0MDpcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKVx0JiM0Mzs9IGJpbmZtdF9lbGZfZmRwaWMub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTc4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgQ29yZSBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgdHdvIG9iamVjdCBmaWxlcywgYGZzX3N0cnVjdC5vYCBhbmQgYHBpZGZzLm9gLCBhbmQgdGhleSYjMzk7cmUgYm90aCBkZWNsYXJlZCBpbiBgb2JqLXlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhleSByZWxhdGUgdG8gdGhlIGJyb2FkZXIgYnVpbGQgcHJvY2VzcywgcGFydGljdWxhcmx5IGlmIHRoZXJlIGFyZSBhbnkgQ09ORklHIG9wdGlvbnMgYXQgcGxheS4gUmlnaHQsIGFuZCBJIGtub3cgYGtlcm5lbC9mb3JrLmNgIGlzIGFsc28gYSBjcml0aWNhbCBvYmplY3QuIFNvLCBJIHNlZSB0aGF0IGBrZXJuZWwvZm9yay5jYCBpcyBhIGNvcmUga2VybmVsIG9iamVjdCBpbiB0aGUga2VybmVsIE1ha2VmaWxlLCBqdXN0IGFzIGFyZSB0aGUgb3RoZXIgdHdvLgoKVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoZXNlIGFyZSBidWlsdCB1bmNvbmRpdGlvbmFsbHkgaW50byBgdm1saW51eGAgb3IgaWYgdGhlcmUgYXJlIHNwZWNpZmljIENPTkZJRyBvcHRpb25zIHRoYXQgbWlnaHQgY29udHJvbCB0aGVpciBpbmNsdXNpb24uIExldCYjMzk7cyBzZWUuLi4gQWgsIGdvb2QsIGl0IGxvb2tzIGxpa2UgYHBpZGZzLm9gLCBgZnNfc3RydWN0Lm9gIGFuZCBgZm9yay5vYCAqYXJlKiB1bmNvbmRpdGlvbmFsbHkgYnVpbHQgaW50byB0aGUgZmluYWwgYHZtbGludXhgIGltYWdlLiBUaGF0IHNpbXBsaWZpZXMgdGhpbmdzIGEgYml0LgoKQnV0IHdhaXQsIGhvbGQgb24uIEV2ZW4gdGhvdWdoIHRoZXkmIzM5O3JlIGFsd2F5cyBidWlsdCwgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBzb3VyY2UgY29kZSBvZiBlYWNoIGZpbGUsIHNwZWNpZmljYWxseSBpbnNpZGUgYGZzL3BpZGZzLmNgIGFuZCBgZnMvZnNfc3RydWN0LmNgIGFuZCBga2VybmVsL2ZvcmsuY2AgdGhlbXNlbHZlcywgdG8gc2VlIGlmIHRoZXJlIGFyZSAqd2l0aGluKiB0aG9zZSBmaWxlcywgc3BlY2lmaWMgQ09ORklHIG9wdGlvbnMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byB0aGUgY2hhbmdlcyBJJiMzOTttIGludGVyZXN0ZWQgaW4uIEkgc2hvdWxkIHplcm8gaW4gb24gdGhlIGFyZWFzIGFyb3VuZCByZWxhdGVkIGZ1bmN0aW9ucy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYGZzL3BpZGZzLmNgIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9ucyBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYHBpZGZkX2lvY3RsYCwgYHBpZGZkX2dldF90YXNrX3BhdGhgLCBgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkYC4uLiBhbmQgc2VlIGlmIHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgYW55IENPTkZJRyBvcHRpb25zLiBUaGF0JiMzOTtzIHRoZSBwcnVkZW50IGFwcHJvYWNoIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9waWRmcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjA6XHRcdC8qIEV4dGVuc2libGUgaW9jdGxzIHJlcXVpcmUgc29tZSBtb3JlIGNhcmVmdWwgY2hlY2tzLiAqL1xuIDUyMTpcdFx0c3dpdGNoIChfSU9DX05SKGNtZCkpIHtcbiA1MjI6XHRcdGNhc2UgX0lPQ19OUihQSURGRF9HRVRfSU5GTyk6XG4gNTIzOlx0XHRcdC8qXG4gNTI0Olx0XHRcdCAqIFRyeSB0byBwcmV2ZW50IHBlcmZvcm1pbmcgYSBwaWRmZCBpb2N0bCB3aGVuIHNvbWVvbmVcbiA1MjU6XHRcdFx0ICogZXJyb25vdXNseSBtaXN0b29rIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlkZmQuXG4gNTI2Olx0XHRcdCAqIFRoaXMgaXMgbm90IHBlcmZlY3QgYnV0IHdpbGwgY2F0Y2ggbW9zdCBjYXNlcy5cbiA1Mjc6XHRcdFx0ICovXG4gNTI4Olx0XHRcdHJldHVybiBleHRlbnNpYmxlX2lvY3RsX3ZhbGlkKGNtZCwgUElERkRfR0VUX0lORk8sIFBJREZEX0lORk9fU0laRV9WRVIwKTtcbiA1Mjk6XHRcdH1cbiA1MzA6XHRcbiA1MzE6XHRcdHJldHVybiBmYWxzZTtcbiA1MzI6XHR9XG4gNTMzOlx0XG4gNTM0Olx0c3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gNTM1Olx0e1xuIDUzNjpcdFx0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xuIDUzNzpcdFx0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIDUzODpcdFx0XHRwdXRfdGFza19zdHJ1Y3QodGFzayk7XG4gNTM5Olx0XHR9XG4gNTQwOlx0fVxuIDU0MTpcdFxuIDU0MjpcdC8qXG4gNTQzOlx0ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuIDU0NDpcdCAqIGFuZCB0aGUgY2FsbGVycyYjMzk7IHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcbiA1NDU6XHQgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuXG4gNTQ2Olx0ICovXG4gNTQ3Olx0c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcbiA1NDg6XHRcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBhcmcpXG4gNTQ5Olx0e1xuIDU1MDpcdFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPVxuIDU1MTpcdFx0XHRnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7XG4gNTUyOlx0XHRpbnQgZXJyb3I7XG4gNTUzOlx0XG4gNTU0Olx0XHRpZiAoIXRhc2spXG4gNTU1Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XG4gNTU2Olx0XG4gNTU3Olx0XHRpZiAoYXJnKVxuIDU1ODpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiA1NTk6XHRcbiA1NjA6XHRcdGVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIDU2MTpcdFx0aWYgKGVycm9yKVxuIDU2MjpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XG4gNTYzOlx0XG4gNTY0Olx0XHRpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQURfRlNDUkVEUykpIHtcbiA1NjU6XHRcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbiA1NjY6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XG4gNTY3Olx0XHR9XG4gNTY4Olx0XG4gNTY5Olx0XHRyZXR1cm5fcHRyKHRhc2spO1xuIDU3MDpcdH1cbiA1NzE6XHRcbiA1NzI6XHRERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuIDU3MzpcdFx0ICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLFxuIDU3NDpcdFx0ICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLFxuIDU3NTpcdFx0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDU3NjpcdFxuIDU3NzpcdHN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcbiA1Nzg6XHRcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuIDU3OTpcdFx0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDU4MDpcdHtcbiA1ODE6XHRcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4gNTgyOlx0XHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuIDU4MzpcdFxuIDU4NDpcdFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiA1ODU6XHRcdGlmIChJU19FUlIodGFzaykpXG4gNTg2Olx0XHRcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcbiA1ODc6XHRcbiA1ODg6XHRcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiA1ODk6XHRcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIDU5MDpcdFx0XHRpZiAobnNwKVxuIDU5MTpcdFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gNTkyOlx0XHR9XG4gNTkzOlx0XHRpZiAoIW5zcClcbiA1OTQ6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbiA1OTU6XHRcbiA1OTY6XHRcdHN3aXRjaCAoY21kKSB7XG4gNTk3Olx0XHQvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqL1xuIDU5ODpcdFx0Y2FzZSBQSURGRF9HRVRfQ0dST1VQX05BTUVTUEFDRTpcbiA1OTk6XHQjaWZkZWYgQ09ORklHX0NHUk9VUFNcbiA2MDA6XHRcdFx0aWYgKCFuc19yZWZfZ2V0KG5zcC1cdTAwM2VjZ3JvdXBfbnMpKVxuIDYwMTpcdFx0XHRcdGJyZWFrO1xuIDYwMjpcdFx0XHRuc19jb21tb24gPSB0b19uc19jb21tb24obnNwLVx1MDAzZWNncm91cF9ucyk7XG4gNjAzOlx0I2VuZGlmXG4gNjA0Olx0XHRcdGJyZWFrO1xuIDYwNTpcdFx0Y2FzZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRTpcbiA2MDY6XHQjaWZkZWYgQ09ORklHX0lQQ19OU1xuIDYwNzpcdFx0XHRpZiAoIW5zX3JlZl9nZXQobnNwLVx1MDAzZWlwY19ucykpXG4gNjA4Olx0XHRcdFx0YnJlYWs7XG4gNjA5Olx0XHRcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihuc3AtXHUwMDNlaXBjX25zKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDEwNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBgZnMvcGlkZnMuY2AgLSBMaW5lcyA2NjAtNzQ1KioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBUaGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBzdWdnZXN0cyB0aGVyZSYjMzk7cyBzb21ldGhpbmcgc3BlY2lmaWMgZ29pbmcgb24gaW4gdGhlIFBJRCBuYW1lc3BhY2UgZmlsZXN5c3RlbSwgYW5kIG15IGd1dCBmZWVsaW5nIHRlbGxzIG1lIHRoZSBjb3JlIGlzc3VlIGxpZXMgd2l0aGluIHRoaXMgcmFuZ2U6IGxpbmVzIDY2MCB0byA3NDUgb2YgYGZzL3BpZGZzLmNgLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGluIGFuZCBtZXRpY3Vsb3VzbHkgcGFyc2UgdGhpcyBzZWN0aW9uLiBJIGtub3cgdGhpcyBhcmVhIGRlYWxzIHdpdGggUElEIGhhbmRsaW5nLCBwcm9iYWJseSB3aXRoIGRpcmVjdG9yeSBhbmQgZmlsZSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgcG9zc2libHkgYXR0cmlidXRlIG9wZXJhdGlvbnMgYW5kIEkgbmVlZCB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBvciBhY2Nlc3MgY29udHJvbCB2dWxuZXJhYmlsaXRpZXMsIGlmIGFueS4gSSYjMzk7bGwgbmVlZCB0byBwYXJzZSB0aGUgaW50ZXJhY3Rpb25zIHdpdGggUElEIG51bWJlcnMsIGFuZCBmaWd1cmUgb3V0IGhvdyBwcm9jZXNzIElEcyBhcmUgbWFwcGVkLCB0cmFja2VkLCBhbmQgZXhwb3NlZCBpbiB0aGlzIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0uIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIGFueSBzcG90cyB3aGVyZSB0aGUgUElEIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyBub3QgYmVpbmcgY29ycmVjdGx5IHZhbGlkYXRlZCBvciBzeW5jaHJvbml6ZWQuIEFueSB1bmNoZWNrZWQgcGF0aHMgb3IgaW5jb3JyZWN0IGxvZ2ljIGNvdWxkIGxlYWQgdG8gdGhlIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiB0aGUgaXNzdWUsIGV2ZW4gaWYgaXQgc2VlbXMgdW5saWtlbHkgYXQgZmlyc3QgZ2xhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL3BpZGZzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2MDpcdFx0XHRcdFx0bnNfY29tbW9uID0gdG9fbnNfY29tbW9uKHVzZXJfbnMpO1xuIDY2MTpcdFx0XHR9XG4gNjYyOlx0I2VuZGlmXG4gNjYzOlx0XHRcdGJyZWFrO1xuIDY2NDpcdFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcbiA2NjU6XHQjaWZkZWYgQ09ORklHX1BJRF9OU1xuIDY2NjpcdFx0XHRzY29wZWRfZ3VhcmQocmN1KSB7XG4gNjY3Olx0XHRcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucztcbiA2Njg6XHRcbiA2Njk6XHRcdFx0XHRwaWRfbnMgPSB0YXNrX2FjdGl2ZV9waWRfbnModGFzayk7XG4gNjcwOlx0XHRcdFx0aWYgKG5zX3JlZl9nZXQocGlkX25zKSlcbiA2NzE6XHRcdFx0XHRcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihwaWRfbnMpO1xuIDY3MjpcdFx0XHR9XG4gNjczOlx0I2VuZGlmXG4gNjc0Olx0XHRcdGJyZWFrO1xuIDY3NTpcdFx0ZGVmYXVsdDpcbiA2NzY6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0lPQ1RMQ01EKTtcbiA2Nzc6XHRcdH1cbiA2Nzg6XHRcbiA2Nzk6XHRcdGlmICghbnNfY29tbW9uKVxuIDY4MDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4gNjgxOlx0XG4gNjgyOlx0XHRyZXR1cm4gbnNfY29tbW9uO1xuIDY4MzpcdH1cbiA2ODQ6XHRcbiA2ODU6XHRzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLFxuIDY4NjpcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXG4gNjg3Olx0e1xuIDY4ODpcdFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiA2ODk6XHRcbiA2OTA6XHRcdGlmIChJU19FUlIodGFzaykpXG4gNjkxOlx0XHRcdHJldHVybiBQVFJfRVJSKHRhc2spO1xuIDY5MjpcdFxuIDY5MzpcdFx0c3dpdGNoIChjbWQpIHtcbiA2OTQ6XHRcdGNhc2UgUElERkRfR0VUX0VYRTpcbiA2OTU6XHRcdFx0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIHBhdGgpO1xuIDY5NjpcdFx0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuIDY5NzpcdFx0XHRyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpO1xuIDY5ODpcdFx0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiA2OTk6XHRcdFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XG4gNzAwOlx0XHR9XG4gNzAxOlx0XG4gNzAyOlx0XHRyZXR1cm4gLUVJTlZBTDtcbiA3MDM6XHR9XG4gNzA0Olx0XG4gNzA1Olx0c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDcwNjpcdHtcbiA3MDc6XHRcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4gNzA4Olx0XHRzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fTtcbiA3MDk6XHRcdGludCBlcnJvcjtcbiA3MTA6XHRcbiA3MTE6XHRcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcbiA3MTI6XHRcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiA3MTM6XHRcbiA3MTQ6XHRcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcbiA3MTU6XHRcdFx0aWYgKCFhcmcpXG4gNzE2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNzE3Olx0XG4gNzE4Olx0XHRcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XG4gNzE5Olx0XG4gNzIwOlx0XHRcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfZ2VuZXJhdGlvbiwgYXJncCk7XG4gNzIxOlx0XHR9XG4gNzIyOlx0XG4gNzIzOlx0XHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cbiA3MjQ6XHRcdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXG4gNzI1Olx0XHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiA3MjY6XHRcbiA3Mjc6XHRcdHN3aXRjaCAoY21kKSB7XG4gNzI4Olx0XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4gNzI5Olx0XHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4gNzMwOlx0XHRjYXNlIFBJREZEX0dFVF9ST09UOlxuIDczMTpcdFx0XHRlcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgXHUwMDI2cGF0aCk7XG4gNzMyOlx0XHRcdGlmIChlcnJvcilcbiA3MzM6XHRcdFx0XHRyZXR1cm4gZXJyb3I7XG4gNzM0Olx0XG4gNzM1Olx0XHRcdHJldHVybiBGRF9BREQoT19DTE9FWEVDLFxuIDczNjpcdFx0XHRcdCAgICAgIGRlbnRyeV9vcGVuKFx1MDAyNnBhdGgsIE9fUEFUSCwgY3VycmVudF9jcmVkKCkpKTtcbiA3Mzc6XHRcdH1cbiA3Mzg6XHRcbiA3Mzk6XHRcdG5zX2NvbW1vbiA9IHBpZGZkX2dldF9uYW1lc3BhY2UocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZyk7XG4gNzQwOlx0XHRpZiAoSVNfRVJSKG5zX2NvbW1vbikpXG4gNzQxOlx0XHRcdHJldHVybiBQVFJfRVJSKG5zX2NvbW1vbik7XG4gNzQyOlx0XG4gNzQzOlx0XHQvKiBvcGVuX25hbWVzcGFjZSgpIHVuY29uZGl0aW9uYWxseSBjb25zdW1lcyB0aGUgcmVmZXJlbmNlICovXG4gNzQ0Olx0XHRyZXR1cm4gb3Blbl9uYW1lc3BhY2UobnNfY29tbW9uKTtcbiA3NDU6XHR9XG4gNzQ2Olx0XG4gNzQ3Olx0I2lmZGVmIENPTkZJR19DT01QQVRcbiA3NDg6XHRzdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4gNzQ5Olx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTY2NAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDQzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIFN5bWJvbCBFeHBvc3VyZSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdmVyaWZ5IHdoaWNoIHN5bWJvbHMgYXJlICpub3QqIHN0YXRpYywgYXMgdGhvc2UgYXJlIHRoZSBvbmVzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwb3NlZC4gSSYjMzk7bGwgc3RhcnQgYnkgY2hlY2tpbmcgdGhlIGluaXRpYWwgbGlzdDogYGdldF90YXNrX3Jvb3RgIGluIGBmcy9mc19zdHJ1Y3QuY2AsIGBnZXRfdGFza19wd2RgIGluIGBmcy9mc19zdHJ1Y3QuY2AsIGBnZXRfdGFza19leGVfcGF0aGAgaW4gYGtlcm5lbC9mb3JrLmNgLCBhbmQgdGhlbiB0aGVyZSYjMzk7cyBgcGlkZmRfaW9jdGxgIGluIGBmcy9waWRmcy5jYCB3aGljaCwgZXZlbiB0aG91Z2ggaXQmIzM5O3MgdGVjaG5pY2FsbHkgc3RhdGljLCBpcyBwYXJ0IG9mIGBmaWxlX29wZXJhdGlvbnMudW5sb2NrZWRfaW9jdGxgIC0gYSBwb3RlbnRpYWwgbG9vcGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55IG90aGVyIG5vbi1zdGF0aWMgc3ltYm9scy4KCkkmIzM5O2xsIGNvbmZpcm0gdGhlIGxpc3QgYnkgZG91YmxlLWNoZWNraW5nIHRoZSBkZWZpbml0aW9uIG9mIGFsbCB0aGUgc3ltYm9scy4gSXQgbG9va3MgbGlrZSBpdCBjb25maXJtcyB0aGF0IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYy4gR29vZC4gQXJlIHRoZXJlIGFueSBvdGhlciByZWxldmFudCBzeW1ib2xzIGx1cmtpbmcgaW4gdGhlIHNoYWRvd3M/CgpOb3csIGxldCYjMzk7cyB0YWtlIGEgbW9yZSBjb21wcmVoZW5zaXZlIGxvb2sgYXQgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBjaGFuZ2VkIGluIHRoZSBkaWZmLiBUaGlzIGlzIHdoZXJlIHRoZSBkZXRhaWxzIGFyZS4gSSYjMzk7bGwgbWFrZSBhIGxpc3QgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UgcG9wcyBvdXQ6CgoxLiAgYGdldF90YXNrX3Jvb3RgIChmcy9mc19zdHJ1Y3QuYykKMi4gIGBnZXRfdGFza19wd2RgIChmcy9mc19zdHJ1Y3QuYykKMy4gIGBnZXRfdGFza19leGVfcGF0aGAgKGtlcm5lbC9mb3JrLmMpCjQuICBgcGlkZnMuY2A6IEFsbCB0aGUgc3RhdGljIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbGlzdGVkLgo1LiAgYGZzL3Byb2MvYmFzZS5jYDogYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AuCjYuICBgc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jYDogYGdldF9jdXJyZW50X2V4ZV9wYXRoYC4KCkkgc2VlIHRoYXQgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AsIGFuZCBgZ2V0X2N1cnJlbnRfZXhlX3BhdGhgIG1pZ2h0IHdhcnJhbnQgYSBzZWNvbmQgbG9vay4KCkZpbmFsbHksIGEgcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkga2VybmVsIGNvbmZpZyBkZXBlbmRlbmNpZXMgdGhhdCByZWxhdGUgdG8gYFBJREZEYCwgYFBJREZTYCwgb3IgYEFQUEFSTU9SYC4gSSYjMzk7bGwgc2VhcmNoIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgY29udGV4dCBhbmQgcG90ZW50aWFsIGV4cG9zdXJlIHBvaW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UElERlMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmhhbmRsZS5jPTE3MD1zdGF0aWMgaW50IGdldF9wYXRoX2FuY2hvcihpbnQgZmQsIHN0cnVjdCBwYXRoICpyb290KVxuLS1cbmZzL2ZoYW5kbGUuYy0xODUtXG5mcy9maGFuZGxlLmM6MTg2Olx0aWYgKGZkID09IEZEX1BJREZTX1JPT1QpIHtcbmZzL2ZoYW5kbGUuYy0xODctXHRcdHBpZGZzX2dldF9yb290KHJvb3QpO1xuLS1cbmZzL3BpZGZzLmMtMzUtXG5mcy9waWRmcy5jOjM2OiNkZWZpbmUgUElERlNfUElEX0RFQUQgRVJSX1BUUigtRVNSQ0gpXG5mcy9waWRmcy5jLTM3LVxuLS1cbmZzL3BpZGZzLmM9NTA9ZW51bSBwaWRmc19hdHRyX21hc2tfYml0cyB7XG5mcy9waWRmcy5jOjUxOlx0UElERlNfQVRUUl9CSVRfRVhJVFx0PSAwLFxuZnMvcGlkZnMuYzo1MjpcdFBJREZTX0FUVFJfQklUX0NPUkVEVU1QXHQ9IDEsXG5mcy9waWRmcy5jLTUzLX07XG4tLVxuZnMvcGlkZnMuYz0zNjY9c3RhdGljIGxvbmcgcGlkZmRfaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZnMvcGlkZnMuYy0zOTYtXHRpZiAobWFzayBcdTAwMjYgUElERkRfSU5GT19FWElUKSB7XG5mcy9waWRmcy5jOjM5NzpcdFx0aWYgKHRlc3RfYml0KFBJREZTX0FUVFJfQklUX0VYSVQsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKSkge1xuZnMvcGlkZnMuYy0zOTgtXHRcdFx0c21wX3JtYigpO1xuLS1cbmZzL3BpZGZzLmMtNDA4LVx0aWYgKG1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIHtcbmZzL3BpZGZzLmM6NDA5Olx0XHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKSkge1xuZnMvcGlkZnMuYy00MTAtXHRcdFx0c21wX3JtYigpO1xuLS1cbmZzL3BpZGZzLmM9ODE0PXZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5mcy9waWRmcy5jLTgzMy1cdFx0XHQgKi9cbmZzL3BpZGZzLmM6ODM0Olx0XHRcdHBpZC1cdTAwM2VhdHRyID0gUElERlNfUElEX0RFQUQ7XG5mcy9waWRmcy5jLTgzNS1cdFx0XHRyZXR1cm47XG4tLVxuZnMvcGlkZnMuYy04NTYtXHRzbXBfd21iKCk7XG5mcy9waWRmcy5jOjg1NzpcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXHUwMDI2YXR0ci1cdTAwM2VhdHRyX21hc2spO1xuZnMvcGlkZnMuYy04NTgtfVxuLS1cbmZzL3BpZGZzLmM9ODYxPXZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9waWRmcy5jLTg2OC1cdFZGU19XQVJOX09OX09OQ0UoIWF0dHIpO1xuZnMvcGlkZnMuYzo4Njk6XHRWRlNfV0FSTl9PTl9PTkNFKGF0dHIgPT0gUElERlNfUElEX0RFQUQpO1xuZnMvcGlkZnMuYy04NzAtXG4tLVxuZnMvcGlkZnMuYy04NzktXHRzbXBfd21iKCk7XG5mcy9waWRmcy5jOjg4MDpcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKTtcbmZzL3BpZGZzLmMtODgxLX1cbi0tXG5mcy9waWRmcy5jPTk2Mj1zdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcbi0tXG5mcy9waWRmcy5jLTk3My1cdFx0cmV0dXJuIE5VTEw7XG5mcy9waWRmcy5jOjk3NDpcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcdTAwMjZhdHRyLVx1MDAzZWF0dHJfbWFzaykpXG5mcy9waWRmcy5jLTk3NS1cdFx0cmV0dXJuIE5VTEw7XG4tLVxuZnMvcGlkZnMuYz0xMTAzPWludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxuLS1cbmZzL3BpZGZzLmMtMTExMy1cdGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO1xuZnMvcGlkZnMuYzoxMTE0Olx0aWYgKHVubGlrZWx5KGF0dHIgPT0gUElERlNfUElEX0RFQUQpKVxuZnMvcGlkZnMuYzoxMTE1Olx0XHRyZXR1cm4gUFRSX0VSUihQSURGU19QSURfREVBRCk7XG5mcy9waWRmcy5jLTExMTYtXHRpZiAoYXR0cilcbi0tXG5mcy9waWRmcy5jLTExMjgtXHRhdHRyID0gcGlkLVx1MDAzZWF0dHI7XG5mcy9waWRmcy5jOjExMjk6XHRpZiAodW5saWtlbHkoYXR0ciA9PSBQSURGU19QSURfREVBRCkpXG5mcy9waWRmcy5jOjExMzA6XHRcdHJldHVybiBQVFJfRVJSKFBJREZTX1BJRF9ERUFEKTtcbmZzL3BpZGZzLmMtMTEzMS1cdGlmICh1bmxpa2VseShhdHRyKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM3MTUKCQkJCQkJCW91dHB1dDogMTY4CgkJCQkJCQl0aG91Z2h0czogNDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBpZGZkIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIGBwaWRmc2AgaXMgYnVpbHQtaW4sIG5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkLCB3aGljaCBpcyBnb29kLiBUaGUgYWJzZW5jZSBvZiBjb25maWcgb3B0aW9ucywgc3BlY2lmaWNhbGx5IHdoZW4gYEVuYWJsZUNvbmZpZ3NgIGlzIGFuIGVtcHR5IGxpc3Qgb3IgbnVsbCwgc2ltcGxpZmllcyB0aGluZ3MuIExldCYjMzk7cyBtb3ZlIG9udG8gdGhlIHNwZWNpZmljcy4gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhlIHBhdGNoIGltcGFjdHMgdGhlc2UgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogYGdldF90YXNrX3Jvb3RgLCBgZ2V0X3Rhc2tfcHdkYCwgYW5kIGBnZXRfdGFza19leGVfcGF0aGAuCgpJJiMzOTt2ZSBjYXJlZnVsbHkgZG91YmxlLWNoZWNrZWQgdGhlIHBhdGNoIGZvciBhbnkgb3RoZXIgZXhwb3J0ZWQgb3IgY2hhbmdlZCBub24tc3RhdGljIGZ1bmN0aW9ucy4gU3BlY2lmaWNhbGx5LCBpbiBgZnMvZnNfc3RydWN0LmNgLCBJIHNlZSBgZ2V0X3Rhc2tfcm9vdGAgYW5kIGBnZXRfdGFza19wd2RgLiBJbiBga2VybmVsL2ZvcmsuY2AsIHRoZXJlJiMzOTtzIGBnZXRfdGFza19leGVfcGF0aGAuIEluc2lkZSBgZnMvcGlkZnMuY2AsIGFsbCB0aGUgbmV3IGFkZGl0aW9ucyBhcmUgc3RhdGljIOKAkyBubyBpc3N1ZXMgdGhlcmUuIEFsc28gaW4gYGZzL3Byb2MvYmFzZS5jYCwgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AgYXJlIHN0YXRpYyBhbmQgdGhlIHNhbWUgZ29lcyBmb3IgYHNlY3VyaXR5L2FwcGFybW9yL3Rhc2suY2Agd2l0aCB0aGUgYGdldF9jdXJyZW50X2V4ZV9wYXRoYCBmdW5jdGlvbi4KClRoZXJlZm9yZSwgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSBwcmVjaXNlbHk6Ci0gYGdldF90YXNrX3Jvb3RgCi0gYGdldF90YXNrX3B3ZGAKLSBgZ2V0X3Rhc2tfZXhlX3BhdGhgCgpUbyBjbGFyaWZ5LCB0aGlzIHBhdGNoIGludHJvZHVjZXMgdGhlIG5ldyBgcGlkZmRgIGlvY3RsczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGVzZSBhbGxvdyB1c2Vyc3BhY2UgdG8gZ2V0IGBPX1BBVEhgIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgdGFyZ2V0IHRhc2smIzM5O3MgZXhlY3V0YWJsZSwgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIEkgbGlzdGVkLiBUaGVyZSBpcyBhbHNvIGEgcmVmYWN0b3Jpbmcgb2YgbG9ja2VkIHBpZGZkIG9wZXJhdGlvbnMgd2l0aCBgZXhlY191cGRhdGVfbG9ja2AuIFRoaXMgKmRvZXMqIGltcGFjdCBjb3JlIFZGUy9waWRmZCBmdW5jdGlvbmFsaXR5LCBwYXJ0aWN1bGFybHkgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgc2V0dXBzIOKAkyB0aGF0IGlzIGFsc28gd2hhdCBJIGV4cGVjdGVkLgoKTXkgcmVhc29uaW5nIGhvbGRzLiBFdmVyeXRoaW5nIHNlZW1zIGNsZWFuLCB0aG9yb3VnaGx5IGNoZWNrZWQuIEkmIzM5O20gc2F0aXNmaWVkIGFuZCByZWFkeSB0byBwcm9jZWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgcGlkZmQgaW9jdGxzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBhbmQgUElERkRfR0VUX1JPT1QpIGFsbG93aW5nIHVzZXJzcGFjZSB0byByZXRyaWV2ZSBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSBwcm9jZXNzJiMzOTtzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdGFza19yb290JiMzNDssCiAgICAmIzM0O2dldF90YXNrX3B3ZCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19leGVfcGF0aCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MmIzM5O3MgZXhlY3V0YWJsZSwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5LiBJdCBhbHNvIHJlZmFjdG9ycyBwaWRmZCB0YXNrIGxvY2tpbmcgYW5kIGFkZHMgaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUga2VybmVsIGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBpbiBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50cyB3aXRob3V0IHJlcXVpcmluZyBzcGVjaWFsaXplZCBoYXJkd2FyZSBjb25maWdzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cblxuMS4gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBpbmZvLWxlYWsgYW5hbHlzaXM6XG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxuICAgLSBBbGwgc3RhY2sgdmFyaWFibGVzIChlLmcuLCBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge31gKSBhcmUgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkLlxuICAgLSBSZXR1cm4gcGF0aHMgYW5kIGVycm9yIGNvZGVzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3NpbmcgcmV0cmlldmVkIHBhdGhzLlxuXG4yLiBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5OlxuICAgLSBQb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHJlbGF0ZSB0byByZWZlcmVuY2UgY291bnRpbmcgKGZwdXQsIHBhdGhfcHV0LCBnZXRfdGFza19zdHJ1Y3QpLCBsb2NraW5nL3N5bmNocm9uaXphdGlvbiAoZXhlY191cGRhdGVfbG9jaywgdGFza19sb2NrKSwgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcy5cbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjOGUyNTJhOTcyZmMwMDM4ZTc4MDU2MTRhN2YxYjQ3MmIzMTU4YzY3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMzEgMDM6MjY6NTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9mc19zdHJ1Y3QuYyBiL2ZzL2ZzX3N0cnVjdC5jCmluZGV4IDM0Njk5ZjNiNmY4ODEuLjVjNzcyODk2MjYwYTQgMTAwNjQ0Ci0tLSBhL2ZzL2ZzX3N0cnVjdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZzX3N0cnVjdC5jCkBAIC0xMCw2ICYjNDM7MTAsNTAgQEAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O21vdW50LmgmIzM0OwogCiYjNDM7LyoqCiYjNDM7ICogZ2V0X3Rhc2tfcm9vdCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgcm9vdCBwYXRoCiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEByb290OiBUaGUgdGFzayYjMzk7cyByb290IHBhdGguCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGUKJiM0MzsgKiBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLUVOT0VOVDsKJiM0MzsKJiM0MzsJdGFza19sb2NrKHRhc2spOwomIzQzOwlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewomIzQzOwkJZ2V0X2ZzX3Jvb3QodGFzay0mZ3Q7cmVhbF9mcywgcm9vdCk7CiYjNDM7CQlyZXQgPSAwOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRhc2spOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19wd2QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5CiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEBwd2Q6IFRoZSB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXRhc2tfbG9jayh0YXNrKTsKJiM0MzsJaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKJiM0MzsJCWdldF9mc19wd2QodGFzay0mZ3Q7cmVhbF9mcywgcHdkKTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CX0KJiM0MzsJdGFza191bmxvY2sodGFzayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwogLyoKICAqIFJlcGxhY2UgdGhlIGZzLSZndDt7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLgogICogSXQgY2FuIGJsb2NrLgpkaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmMKaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDQKLS0tIGEvZnMvcGlkZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jCkBAIC00LDYgJiM0Mzs0LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9leHBvcnRmcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mc19zdHJ1Y3QuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jZ3JvdXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21vdW50LmgmZ3Q7CkBAIC01MTAsNiAmIzQzOzUxMSw5IEBAIHN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpCiAJY2FzZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRToKIAljYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRToKIAljYXNlIFBJREZEX0dFVF9QSURfTkFNRVNQQUNFOgomIzQzOwljYXNlIFBJREZEX0dFVF9FWEU6CiYjNDM7CWNhc2UgUElERkRfR0VUX0NXRDoKJiM0MzsJY2FzZSBQSURGRF9HRVRfUk9PVDoKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01MjcsNjIgJiM0Mzs1MzEsNjcgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZCkKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9IE5VTEw7Ci0Jc3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDsKLQlzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMOwotCWludCBlcnJvcjsKLQotCWlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSkKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQotCWlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHsKLQkJaWYgKCFhcmcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnOwotCQlyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9nZW5lcmF0aW9uLCBhcmdwKTsKJiM0MzsJaWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkgewomIzQzOwkJdXBfcmVhZCgmYW1wO3Rhc2stJmd0O3NpZ25hbC0mZ3Q7ZXhlY191cGRhdGVfbG9jayk7CiYjNDM7CQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiAJfQomIzQzO30KIAotCS8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqLwotCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpCi0JCXJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTsKJiM0MzsvKgomIzQzOyAqIFJldHVybiBAcGlkJiMzOTtzIHRhc2sgd2l0aCBAdGFzayYjMzk7cyBleGVjX3VwZGF0ZV9sb2NrIGhlbGQuIFRoZSBwdHJhY2UgY2hlY2sKJiM0MzsgKiBhbmQgdGhlIGNhbGxlcnMmIzM5OyB0YXNrIHN0YXRlIGxvb2t1cCBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSB0aGUgbG9jayBpcyBoZWxkCiYjNDM7ICogc28gdGhhdCB0aGV5IGNhbm5vdCByYWNlIHdpdGggYSBjb25jdXJyZW50IGV4ZWN2ZSgpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZGZkX2dldF90YXNrX2xvY2tlZChzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPQomIzQzOwkJZ2V0X3BpZF90YXNrKHBpZCwgUElEVFlQRV9QSUQpOwomIzQzOwlpbnQgZXJyb3I7CiAKLQl0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpOwogCWlmICghdGFzaykKLQkJcmV0dXJuIC1FU1JDSDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FU1JDSCk7CiAKIAlpZiAoYXJnKQotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JLyoKLQkgKiBXZSYjMzk7cmUgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIG5hbWVzcGFjZSBzbyBwZXJmb3JtIGEKLQkgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgZm9yIHRoZQotCSAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlCi0JICogY3JlZGVudGlhbHMgdXNlZCBmb3IgdGhlIGFjY2VzcyBkZWNpc2lvbiBtYXRjaCB0aG9zZSBvZiBAdGFzayBhdCB0aGUKLQkgKiB0aW1lIGl0cyBuYW1lc3BhY2UgaXMgcmVhZCwgcHJldmVudGluZyBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkgZnJvbQotCSAqIHN3YXBwaW5nIHRoZSB0YXNrJiMzOTtzIGNyZWRlbnRpYWxzIGluIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgdXNlLiBXZQotCSAqIG1pcnJvciBuc2ZzIGJlaGF2aW9yLgotCSAqLwogCWVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKIAlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKJiM0MzsJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAogCWlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkgewotCQllcnJvciA9IC1FQUNDRVM7Ci0JCWdvdG8gb3V0X3VubG9jazsKJiM0MzsJCXVwX3JlYWQoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAJfQogCiYjNDM7CXJldHVybl9wdHIodGFzayk7CiYjNDM7fQomIzQzOwomIzQzO0RFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosCiYjNDM7CSAgICAgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKF9UKSwKJiM0MzsJICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLAomIzQzOwkgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7CiYjNDM7CiYjNDM7CUNMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7CiYjNDM7CWlmIChJU19FUlIodGFzaykpCiYjNDM7CQlyZXR1cm4gRVJSX0NBU1QodGFzayk7CiYjNDM7CiAJc2NvcGVkX2d1YXJkKHRhc2tfbG9jaywgdGFzaykgewogCQluc3AgPSB0YXNrLSZndDtuc3Byb3h5OwogCQlpZiAobnNwKQogCQkJZ2V0X25zcHJveHkobnNwKTsKIAl9Ci0JaWYgKCFuc3ApIHsKLQkJZXJyb3IgPSAtRVNSQ0g7IC8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJiMzOTt0IGV4aXN0ICovCi0JCWdvdG8gb3V0X3VubG9jazsKLQl9CiYjNDM7CWlmICghbnNwKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi8KIAogCXN3aXRjaCAoY21kKSB7CiAJLyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi8KQEAgLTY2NCwxNiAmIzQzOzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAjZW5kaWYKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyb3IgPSAtRU5PSU9DVExDTUQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpOwogCX0KIAotCWlmICghZXJyb3IgJmFtcDsmYW1wOyAhbnNfY29tbW9uKQotCQllcnJvciA9IC1FT1BOT1RTVVBQOwomIzQzOwlpZiAoIW5zX2NvbW1vbikKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIAotb3V0X3VubG9jazoKLQl1cF9yZWFkKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKJiM0MzsJcmV0dXJuIG5zX2NvbW1vbjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwaWRmZF9nZXRfdGFza19wYXRoKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGNtZCwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBwYXRoICpwYXRoKQomIzQzO3sKJiM0MzsJQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTsKJiM0MzsKJiM0MzsJaWYgKElTX0VSUih0YXNrKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKHRhc2spOwomIzQzOwomIzQzOwlzd2l0Y2ggKGNtZCkgewomIzQzOwljYXNlIFBJREZEX0dFVF9FWEU6CiYjNDM7CQlyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7CiYjNDM7CWNhc2UgUElERkRfR0VUX0NXRDoKJiM0MzsJCXJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7CiYjNDM7CWNhc2UgUElERkRfR0VUX1JPT1Q6CiYjNDM7CQlyZXR1cm4gZ2V0X3Rhc2tfcm9vdCh0YXNrLCBwYXRoKTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDsKJiM0MzsJc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307CiYjNDM7CWludCBlcnJvcjsKJiM0MzsKJiM0MzsJaWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKQomIzQzOwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKJiM0MzsKJiM0MzsJaWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikgewomIzQzOwkJaWYgKCFhcmcpCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CQlfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnOwomIzQzOwomIzQzOwkJcmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfZ2VuZXJhdGlvbiwgYXJncCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovCiYjNDM7CWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpCiYjNDM7CQlyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwljYXNlIFBJREZEX0dFVF9ST09UOgomIzQzOwkJZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsICZhbXA7cGF0aCk7CiYjNDM7CQlpZiAoZXJyb3IpCiYjNDM7CQkJcmV0dXJuIGVycm9yOwomIzQzOwomIzQzOwkJcmV0dXJuIEZEX0FERChPX0NMT0VYRUMsCiYjNDM7CQkJICAgICAgZGVudHJ5X29wZW4oJmFtcDtwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTsKJiM0MzsJaWYgKElTX0VSUihuc19jb21tb24pKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTsKIAogCS8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi8KIAlyZXR1cm4gb3Blbl9uYW1lc3BhY2UobnNfY29tbW9uKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvcHJvYy9iYXNlLmMKQEAgLTIwNiwzMSAmIzQzOzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcywKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KQotewotCWludCByZXN1bHQgPSAtRU5PRU5UOwotCi0JdGFza19sb2NrKHRhc2spOwotCWlmICh0YXNrLSZndDtyZWFsX2ZzKSB7Ci0JCWdldF9mc19yb290KHRhc2stJmd0O3JlYWxfZnMsIHJvb3QpOwotCQlyZXN1bHQgPSAwOwotCX0KLQl0YXNrX3VubG9jayh0YXNrKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCwKIAkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0KLQl0YXNrX2xvY2sodGFzayk7Ci0JaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKLQkJZ2V0X2ZzX3B3ZCh0YXNrLSZndDtyZWFsX2ZzLCBwYXRoKTsKLQkJcmVzdWx0ID0gMDsKLQl9Ci0JdGFza191bmxvY2sodGFzayk7Ci0JcmV0dXJuIHJlc3VsdDsKJiM0MzsJcmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTsKIH0KIAogc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLApAQCAtMTc2MSwxNiAmIzQzOzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0gewogc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoLAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7Ci0KLQlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwotCWlmIChleGVfZmlsZSkgewotCQkqZXhlX3BhdGggPSBleGVfZmlsZS0mZ3Q7Zl9wYXRoOwotCQlwYXRoX2dldCgmYW1wO2V4ZV9maWxlLSZndDtmX3BhdGgpOwotCQlmcHV0KGV4ZV9maWxlKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpOwogfQogCiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmggYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oCmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaApAQCAtNDIsNiAmIzQzOzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpCiAJcmVhZF9zZXF1bmxvY2tfZXhjbCgmYW1wO2ZzLSZndDtzZXEpOwogfQogCiYjNDM7aW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCk7CiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpOwomIzQzOwogc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpOwogCiBleHRlcm4gYm9vbCBjdXJyZW50X2Nocm9vdGVkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGRkMDljNDM4ZmEyM2UuLmE2NWYyNGIyZTY1YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTQyMzksNiAmIzQzOzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7CiBleHRlcm4gaW50IHJlcGxhY2VfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwomIzQzO2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCk7CiAKIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaAppbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaApAQCAtMTIxLDQgJiM0MzsxMjEsMTEgQEAgc3RydWN0IHBpZGZkX2luZm8gewogI2RlZmluZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTApCiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbykKIAomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3MgZXhlY3V0YWJsZS4gKi8KJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMikKJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LiAqLwomIzQzOyNkZWZpbmUgUElERkRfR0VUX0NXRCAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEzKQomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3Mgcm9vdCBkaXJlY3RvcnkuICovCiYjNDM7I2RlZmluZSBQSURGRF9HRVRfUk9PVCAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTQpCiYjNDM7CiAjZW5kaWYgLyogX1VBUElfTElOVVhfUElERkRfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDE2NzU4YzhhM2Q0My4uYTQ5M2RlM2FlNWMyMCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jCkBAIC0xMzcxLDYgJiM0MzsxMzcxLDI3IEBAIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiAJcmV0dXJuIGV4ZV9maWxlOwogfQogCiYjNDM7LyoqCiYjNDM7ICogZ2V0X3Rhc2tfZXhlX3BhdGggLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aAomIzQzOyAqIEB0YXNrOiBUaGUgdGFzay4KJiM0MzsgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYW4gZXhlY3V0YWJsZSBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwomIzQzOwomIzQzOwlpZiAoIWV4ZV9maWxlKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CSpleGVfcGF0aCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7CiYjNDM7CXBhdGhfZ2V0KGV4ZV9wYXRoKTsKJiM0MzsJZnB1dChleGVfZmlsZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2V0X3Rhc2tfbW0gLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIG1tCiAgKiBAdGFzazogVGhlIHRhc2suCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMKaW5kZXggZTE2ZmY0MTMwYmMyZi4uMDVjYmEyNjFkZDM0OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYwpAQCAtMTMsNiAmIzQzOzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHRyYWNlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdGFza193b3JrLmgmZ3Q7CiAKQEAgLTMzMCwyMiAmIzQzOzMzMSwxNSBAQCBpbnQgYWFfbWF5X3B0cmFjZShjb25zdCBzdHJ1Y3QgY3JlZCAqdHJhY2VyX2NyZWQsIHN0cnVjdCBhYV9sYWJlbCAqdHJhY2VyLAogCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N1cnJlbnRfZXhlX3BhdGgoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7Ci0Jc3RydWN0IGZpbGUgKmV4ZV9maWxlOwotCXN0cnVjdCBwYXRoIHA7CiYjNDM7CXN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9OwogCWNvbnN0IGNoYXIgKnBhdGhfc3RyOwogCi0JZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZShjdXJyZW50KTsKLQlpZiAoIWV4ZV9maWxlKQomIzQzOwlpZiAoZ2V0X3Rhc2tfZXhlX3BhdGgoY3VycmVudCwgJmFtcDtwKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci0JcCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7Ci0JcGF0aF9nZXQoJmFtcDtwKTsKIAogCWlmIChhYV9wYXRoX25hbWUoJmFtcDtwLCBGTEFHX1ZJRVdfU1VCTlMsIGJ1ZmZlciwgJmFtcDtwYXRoX3N0ciwgTlVMTCwgTlVMTCkpCiAJCXBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTsKIAotCWZwdXQoZXhlX2ZpbGUpOwotCXBhdGhfcHV0KCZhbXA7cCk7Ci0KIAlyZXR1cm4gcGF0aF9zdHI7CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4MDEKCQkJCQkJCW91dHB1dDogMjcwCgkJCQkJCQl0aG91Z2h0czogMTg5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBFdmFsdWF0aW9uOiBQYXRjaCBTZXJpZXMgQW5hbHlzaXMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHF1ZXN0aW9uIGF0IGhhbmQgaXMgd2hldGhlciB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGV4cGVydCBhc3Nlc3NtZW50IGlzLCBhbmQgdGhlIHJlYXNvbmluZyBpcywgKm5vKi4gTGV0JiMzOTtzIGdldCBpbnRvIHdoeS4KCkZpcnN0bHksIHRoZSBwYXRjaCYjMzk7cyBjb3JlIGZ1bmN0aW9uIGlzIHRvIGFkZCBhIHNldCBvZiBoZWxwZXJzIGFuZCBwaWRmZCBpb2N0bHM6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGBnZXRfdGFza19leGVfcGF0aGAgYW5kIGBQSURGRF9HRVRfRVhFYCwgYFBJREZEX0dFVF9DV0RgLCBgUElERkRfR0VUX1JPT1RgLiBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGEgd2F5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGxpa2UgYSB0YXNrJiMzOTtzIHJvb3QsIGN3ZCwgYW5kIGV4ZWN1dGFibGUgcGF0aCB2aWEgZmlsZSBkZXNjcmlwdG9ycy4gQ3J1Y2lhbGx5LCB0aGVzZSBuZXcgaW9jdGxzIGFyZSByZXR1cm5pbmcgZmlsZSBkZXNjcmlwdG9ycyAoYE9fUEFUSGApLCAqbm90KiBkaXJlY3RseSBjb3B5aW5nIGRhdGEgdG8gdXNlcnNwYWNlLCB3aGljaCBpcyBhIGtleSBwb2ludC4KCkFmdGVyIGNhcmVmdWxseSByZXZpZXdpbmcgdGhlIGNvZGUsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0aGF0IGNvdWxkIGFsbG93IGZvciBpbmZvcm1hdGlvbiBsZWFrYWdlIHRvIHVzZXIgc3BhY2UuIEZ1cnRoZXIsIGFsbCBzdGFjayB2YXJpYWJsZXMgdXNlZCwgbGlrZSBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307YCwgYXJlIHByb3Blcmx5IHplcm8taW5pdGlhbGl6ZWQsIGFuZCBjbGVhbnVwIGlzIGhhbmRsZWQgYnkgUkFJSS4gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZW4mIzM5O3QgYW55IG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgaGFwcGVuaW5nIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb2RlIG9yIHRoZSBjaGFuZ2VzIG1hZGUuCgpNZW1vcnkgc2FmZXR5IGlzIHBhcmFtb3VudCwgYW5kIG15IGNoZWNrcyBmb2N1cyBvbiB0aGF0LiBUaGUgcHJpbWFyeSByaXNrcyB3aXRoaW4gdGhlc2UgY2hhbmdlcyBib2lsIGRvd24gdG8gY2xhc3NpYyBrZXJuZWwgYnVnczogbG9ja2luZyBpc3N1ZXMgKHN5bmNocm9uaXphdGlvbiksIHJlZmVyZW5jZSBjb3VudGluZyBwcm9ibGVtcyAocG90ZW50aWFsIHVzZS1hZnRlci1mcmVlIGNvbmRpdGlvbnMpLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiBJJiMzOTttIHNhdGlzZmllZCB0aGF0IHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYW5kIGhhcmRlbmluZyB0b29scyBhcmUgcGVyZmVjdGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZXNlIGJ1Z3MuIEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIGV4aXN0aW5nIGtlcm5lbCBidWcgZGV0ZWN0b3JzIGFyZSwgaW4gbXkgZXhwZXJ0IG9waW5pb24sIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHNlcmllcy4KClRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIFRoZSBjaGFuZ2VzIGFyZSBsYXJnZWx5IGZvY3VzZWQgb24gcGF0aCByZXRyaWV2YWwgdmlhIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHVzZSBzdGFuZGFyZCBrZXJuZWwgcHJhY3RpY2VzLgoKTXkgZmluYWwgYW5hbHlzaXMgaXMgdGhhdCwgd2l0aCByZXNwZWN0IHRvIHRoZSBwYXRjaCBhbmQgaXRzIHBvdGVudGlhbCByaXNrcywgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYC4gSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBldmFsdWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjI0MTkyMzUwM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM0NDQ2MTk5OTY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF90YXNrX3Jvb3RcIixcbiAgICBcImdldF90YXNrX3B3ZFwiLFxuICAgIFwiZ2V0X3Rhc2tfZXhlX3BhdGhcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0YXNrIHBhdGggZXh0cmFjdGlvbiBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKSBhbmQgYWRkcyBuZXcgaW9jdGwgY29tbWFuZHMgdG8gcGlkZnMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIFBJREZEX0dFVF9ST09UKSByZXR1cm5pbmcgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMuXFxuXFxuMS4gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBpbmZvLWxlYWsgYW5hbHlzaXM6XFxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgbmV3IGlvY3RscyByZXR1cm4gYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IgdmlhIEZEX0FERC5cXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXFxuICAgLSBSZXR1cm4gcGF0aHMgYW5kIGVycm9yIGNvZGVzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3NpbmcgcmV0cmlldmVkIHBhdGhzLlxcblxcbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuICAgLSBQb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHJlbGF0ZSB0byByZWZlcmVuY2UgY291bnRpbmcgKGZwdXQsIHBhdGhfcHV0LCBnZXRfdGFza19zdHJ1Y3QpLCBsb2NraW5nL3N5bmNocm9uaXphdGlvbiAoZXhlY191cGRhdGVfbG9jaywgdGFza19sb2NrKSwgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcy5cXG4gICAtIFRoZXNlIGlzc3VlcyBhcmUgcHJvcGVybHkgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIGdlbmVyYWwga2VybmVsIGFzc2VydGlvbnMuIEtNU0FOIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MncyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjI0MTkzMDkwM1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0ODg5MTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYzhlMjUyYTk3MmZjMDAzOGU3ODA1NjE0YTdmMWI0NzJiMzE1OGM2N1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9mc19zdHJ1Y3QuYyBiL2ZzL2ZzX3N0cnVjdC5jXFxuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcXG4tLS0gYS9mcy9mc19zdHJ1Y3QuY1xcbisrKyBiL2ZzL2ZzX3N0cnVjdC5jXFxuQEAgLTEwLDYgKzEwLDUwIEBAXFxuICNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwibW91bnQuaFxcXCJcXG4gXFxuKy8qKlxcbisgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHJvb3QgcGF0aFxcbisgKiBAdGFzazogVGhlIHRhc2suXFxuKyAqIEByb290OiBUaGUgdGFzaydzIHJvb3QgcGF0aC5cXG4rICpcXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHJvb3QgcGF0aCwgb3IgLUVOT0VOVCBpZiBpdCBkb2VzIG5vdC4gVGhlXFxuKyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXFxuKyAqL1xcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KVxcbit7XFxuK1xcdGludCByZXQgPSAtRU5PRU5UO1xcbitcXG4rXFx0dGFza19sb2NrKHRhc2spO1xcbitcXHRpZiAodGFzay1cXHUwMDNlcmVhbF9mcykge1xcbitcXHRcXHRnZXRfZnNfcm9vdCh0YXNrLVxcdTAwM2VyZWFsX2ZzLCByb290KTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0YXNrKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBnZXRfdGFza19wd2QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnlcXG4rICogQHRhc2s6IFRoZSB0YXNrLlxcbisgKiBAcHdkOiBUaGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LlxcbisgKlxcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXFxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxcbisgKi9cXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpXFxuK3tcXG4rXFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuK1xcbitcXHR0YXNrX2xvY2sodGFzayk7XFxuK1xcdGlmICh0YXNrLVxcdTAwM2VyZWFsX2ZzKSB7XFxuK1xcdFxcdGdldF9mc19wd2QodGFzay1cXHUwMDNlcmVhbF9mcywgcHdkKTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0YXNrKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuIC8qXFxuICAqIFJlcGxhY2UgdGhlIGZzLVxcdTAwM2V7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLlxcbiAgKiBJdCBjYW4gYmxvY2suXFxuZGlmZiAtLWdpdCBhL2ZzL3BpZGZzLmMgYi9mcy9waWRmcy5jXFxuaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDRcXG4tLS0gYS9mcy9waWRmcy5jXFxuKysrIGIvZnMvcGlkZnMuY1xcbkBAIC00LDYgKzQsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZXhwb3J0ZnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19zdHJ1Y3QuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Nncm91cC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vdW50LmhcXHUwMDNlXFxuQEAgLTUxMCw2ICs1MTEsOSBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxcbiBcXHRjYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOlxcbiBcXHRjYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRTpcXG4gXFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuK1xcdGNhc2UgUElERkRfR0VUX1JPT1Q6XFxuIFxcdFxcdHJldHVybiB0cnVlO1xcbiBcXHR9XFxuIFxcbkBAIC01MjcsNjIgKzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxcbiBcXHRyZXR1cm4gZmFsc2U7XFxuIH1cXG4gXFxuLXN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4rc3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXFxuIHtcXG4tXFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xcbi1cXHRpbnQgZXJyb3I7XFxuLVxcbi1cXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXFxuLVxcdFxcdHJldHVybiAtRU5PSU9DVExDTUQ7XFxuLVxcbi1cXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XFxuLVxcdFxcdGlmICghYXJnKVxcbi1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tXFxuLVxcdFxcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XFxuLVxcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbitcXHRpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7XFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuK1xcdFxcdHB1dF90YXNrX3N0cnVjdCh0YXNrKTtcXG4gXFx0fVxcbit9XFxuIFxcbi1cXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4tXFx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcXG4tXFx0XFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xcbisvKlxcbisgKiBSZXR1cm4gQHBpZCdzIHRhc2sgd2l0aCBAdGFzaydzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xcbisgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcXG4rICogc28gdGhhdCB0aGV5IGNhbm5vdCByYWNlIHdpdGggYSBjb25jdXJyZW50IGV4ZWN2ZSgpLlxcbisgKi9cXG4rc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgYXJnKVxcbit7XFxuK1xcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cXG4rXFx0XFx0Z2V0X3BpZF90YXNrKHBpZCwgUElEVFlQRV9QSUQpO1xcbitcXHRpbnQgZXJyb3I7XFxuIFxcbi1cXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xcbiBcXHRpZiAoIXRhc2spXFxuLVxcdFxcdHJldHVybiAtRVNSQ0g7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XFxuIFxcbiBcXHRpZiAoYXJnKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbi1cXHQvKlxcbi1cXHQgKiBXZSdyZSB0cnlpbmcgdG8gb3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgbmFtZXNwYWNlIHNvIHBlcmZvcm0gYVxcbi1cXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlXFxuLVxcdCAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlXFxuLVxcdCAqIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHRoZSBhY2Nlc3MgZGVjaXNpb24gbWF0Y2ggdGhvc2Ugb2YgQHRhc2sgYXQgdGhlXFxuLVxcdCAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tXFxuLVxcdCAqIHN3YXBwaW5nIHRoZSB0YXNrJ3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXFxuLVxcdCAqIG1pcnJvciBuc2ZzIGJlaGF2aW9yLlxcbi1cXHQgKi9cXG4gXFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuIFxcdGlmIChlcnJvcilcXG4tXFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XFxuIFxcbiBcXHRpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQURfRlNDUkVEUykpIHtcXG4tXFx0XFx0ZXJyb3IgPSAtRUFDQ0VTO1xcbi1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FQUNDRVMpO1xcbiBcXHR9XFxuIFxcbitcXHRyZXR1cm5fcHRyKHRhc2spO1xcbit9XFxuK1xcbitERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxcbitcXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXFxuK1xcdCAgICAgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHBpZCwgYXJnKSxcXG4rXFx0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbitcXG4rc3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuK3tcXG4rXFx0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcXG4rXFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4rXFxuK1xcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XFxuK1xcdGlmIChJU19FUlIodGFzaykpXFxuK1xcdFxcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcXG4rXFxuIFxcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcXG4gXFx0XFx0bnNwID0gdGFzay1cXHUwMDNlbnNwcm94eTtcXG4gXFx0XFx0aWYgKG5zcClcXG4gXFx0XFx0XFx0Z2V0X25zcHJveHkobnNwKTtcXG4gXFx0fVxcbi1cXHRpZiAoIW5zcCkge1xcbi1cXHRcXHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xcbi1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuLVxcdH1cXG4rXFx0aWYgKCFuc3ApXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7IC8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJ3QgZXhpc3QgKi9cXG4gXFxuIFxcdHN3aXRjaCAoY21kKSB7XFxuIFxcdC8qIE5hbWVzcGFjZXMgdGhhdCBoYW5nIG9mIG5zcHJveHkuICovXFxuQEAgLTY2NCwxNiArNjczLDcyIEBAIHN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4gI2VuZGlmXFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0Olxcbi1cXHRcXHRlcnJvciA9IC1FTk9JT0NUTENNRDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT0lPQ1RMQ01EKTtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKCFlcnJvciBcXHUwMDI2XFx1MDAyNiAhbnNfY29tbW9uKVxcbi1cXHRcXHRlcnJvciA9IC1FT1BOT1RTVVBQO1xcbitcXHRpZiAoIW5zX2NvbW1vbilcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApO1xcbiBcXG4tb3V0X3VubG9jazpcXG4tXFx0dXBfcmVhZChcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRyZXR1cm4gZXJyb3I7XFxuK1xcdHJldHVybiBuc19jb21tb247XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXFxuK3tcXG4rXFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcXG4rXFxuK1xcdGlmIChJU19FUlIodGFzaykpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKHRhc2spO1xcbitcXG4rXFx0c3dpdGNoIChjbWQpIHtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRcXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7XFxuK1xcdGNhc2UgUElERkRfR0VUX0NXRDpcXG4rXFx0XFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfUk9PVDpcXG4rXFx0XFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAtRUlOVkFMO1xcbit9XFxuK1xcbitzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuK3tcXG4rXFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4rXFx0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XFxuK1xcdGludCBlcnJvcjtcXG4rXFxuK1xcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcXG4rXFxuK1xcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcXG4rXFx0XFx0aWYgKCFhcmcpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcXG4rXFxuK1xcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbitcXHR9XFxuK1xcbitcXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4rXFx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcXG4rXFx0XFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xcbitcXG4rXFx0c3dpdGNoIChjbWQpIHtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuK1xcdGNhc2UgUElERkRfR0VUX1JPT1Q6XFxuK1xcdFxcdGVycm9yID0gcGlkZmRfZ2V0X3Rhc2tfcGF0aChwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnLCBcXHUwMDI2cGF0aCk7XFxuK1xcdFxcdGlmIChlcnJvcilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXG4rXFx0XFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXFxuK1xcdFxcdFxcdCAgICAgIGRlbnRyeV9vcGVuKFxcdTAwMjZwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7XFxuK1xcdH1cXG4rXFxuK1xcdG5zX2NvbW1vbiA9IHBpZGZkX2dldF9uYW1lc3BhY2UocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZyk7XFxuK1xcdGlmIChJU19FUlIobnNfY29tbW9uKSlcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcXG4gXFxuIFxcdC8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi9cXG4gXFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XFxuZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmNcXG5pbmRleCA2YTM5ZGU0MjRmNjJhLi43ZTJjMDUzODMyM2NjIDEwMDY0NFxcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXFxuKysrIGIvZnMvcHJvYy9iYXNlLmNcXG5AQCAtMjA2LDMxICsyMDYsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgcGlkX2VudHJ5X25saW5rKGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgKmVudHJpZXMsXFxuIFxcdHJldHVybiBjb3VudDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXFxuLXtcXG4tXFx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XFxuLVxcbi1cXHR0YXNrX2xvY2sodGFzayk7XFxuLVxcdGlmICh0YXNrLVxcdTAwM2VyZWFsX2ZzKSB7XFxuLVxcdFxcdGdldF9mc19yb290KHRhc2stXFx1MDAzZXJlYWxfZnMsIHJvb3QpO1xcbi1cXHRcXHRyZXN1bHQgPSAwO1xcbi1cXHR9XFxuLVxcdHRhc2tfdW5sb2NrKHRhc2spO1xcbi1cXHRyZXR1cm4gcmVzdWx0O1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG4gXFx0XFx0XFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4ge1xcbi1cXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcXG4tXFxuLVxcdHRhc2tfbG9jayh0YXNrKTtcXG4tXFx0aWYgKHRhc2stXFx1MDAzZXJlYWxfZnMpIHtcXG4tXFx0XFx0Z2V0X2ZzX3B3ZCh0YXNrLVxcdTAwM2VyZWFsX2ZzLCBwYXRoKTtcXG4tXFx0XFx0cmVzdWx0ID0gMDtcXG4tXFx0fVxcbi1cXHR0YXNrX3VubG9jayh0YXNrKTtcXG4tXFx0cmV0dXJuIHJlc3VsdDtcXG4rXFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxcbkBAIC0xNzYxLDE2ICsxNzQwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfc2V0X2NvbW1fb3BlcmF0aW9ucyA9IHtcXG4gc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoLFxcbiBcXHRcXHRcXHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiB7XFxuLVxcdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcXG4tXFxuLVxcdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XFxuLVxcdGlmIChleGVfZmlsZSkge1xcbi1cXHRcXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cXHUwMDNlZl9wYXRoO1xcbi1cXHRcXHRwYXRoX2dldChcXHUwMDI2ZXhlX2ZpbGUtXFx1MDAzZWZfcGF0aCk7XFxuLVxcdFxcdGZwdXQoZXhlX2ZpbGUpO1xcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFx0fSBlbHNlXFxuLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dClcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcXG5pbmRleCA5N2VlZjhkMzg2M2RkLi5mYjcyNTcwNzc1NGQyIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXFxuQEAgLTQyLDYgKzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpXFxuIFxcdHJlYWRfc2VxdW5sb2NrX2V4Y2woXFx1MDAyNmZzLVxcdTAwM2VzZXEpO1xcbiB9XFxuIFxcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xcbitcXG4gc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpO1xcbiBcXG4gZXh0ZXJuIGJvb2wgY3VycmVudF9jaHJvb3RlZCh2b2lkKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oXFxuaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tLmhcXG5AQCAtNDIzOSw2ICs0MjM5LDcgQEAgZXh0ZXJuIGludCBzZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xcbiBleHRlcm4gaW50IHJlcGxhY2VfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XFxuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTtcXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKTtcXG4gXFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcXG5AQCAtMTIxLDQgKzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7XFxuICNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxcbiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcXG4gXFxuKy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2sncyBleGVjdXRhYmxlLiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMilcXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9DV0QgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMylcXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHJvb3QgZGlyZWN0b3J5LiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNClcXG4rXFxuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXFxuaW5kZXggNDE2NzU4YzhhM2Q0My4uYTQ5M2RlM2FlNWMyMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvZm9yay5jXFxuKysrIGIva2VybmVsL2ZvcmsuY1xcbkBAIC0xMzcxLDYgKzEzNzEsMjcgQEAgc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4gXFx0cmV0dXJuIGV4ZV9maWxlO1xcbiB9XFxuIFxcbisvKipcXG4rICogZ2V0X3Rhc2tfZXhlX3BhdGggLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3MgZXhlY3V0YWJsZSBwYXRoXFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cXG4rICogQGV4ZV9wYXRoOiBUaGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aC5cXG4rICpcXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXFxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxcbisgKi9cXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxcbit7XFxuK1xcdHN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xcbitcXG4rXFx0aWYgKCFleGVfZmlsZSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cXHUwMDNlZl9wYXRoO1xcbitcXHRwYXRoX2dldChleGVfcGF0aCk7XFxuK1xcdGZwdXQoZXhlX2ZpbGUpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGdldF90YXNrX21tIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIG1tXFxuICAqIEB0YXNrOiBUaGUgdGFzay5cXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXFxuaW5kZXggZTE2ZmY0MTMwYmMyZi4uMDVjYmEyNjFkZDM0OSAxMDA2NDRcXG4tLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcXG4rKysgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcXG5AQCAtMTMsNiArMTMsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wdHJhY2UuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXFx1MDAzZVxcbiBcXG5AQCAtMzMwLDIyICszMzEsMTUgQEAgaW50IGFhX21heV9wdHJhY2UoY29uc3Qgc3RydWN0IGNyZWQgKnRyYWNlcl9jcmVkLCBzdHJ1Y3QgYWFfbGFiZWwgKnRyYWNlcixcXG4gXFxuIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfY3VycmVudF9leGVfcGF0aChjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSlcXG4ge1xcbi1cXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7XFxuLVxcdHN0cnVjdCBwYXRoIHA7XFxuK1xcdHN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xcbiBcXHRjb25zdCBjaGFyICpwYXRoX3N0cjtcXG4gXFxuLVxcdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUoY3VycmVudCk7XFxuLVxcdGlmICghZXhlX2ZpbGUpXFxuK1xcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcXHUwMDI2cCkpXFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbi1cXHRwID0gZXhlX2ZpbGUtXFx1MDAzZWZfcGF0aDtcXG4tXFx0cGF0aF9nZXQoXFx1MDAyNnApO1xcbiBcXG4gXFx0aWYgKGFhX3BhdGhfbmFtZShcXHUwMDI2cCwgRkxBR19WSUVXX1NVQk5TLCBidWZmZXIsIFxcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXFxuIFxcdFxcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcXG4gXFxuLVxcdGZwdXQoZXhlX2ZpbGUpO1xcbi1cXHRwYXRoX3B1dChcXHUwMDI2cCk7XFxuLVxcbiBcXHRyZXR1cm4gcGF0aF9zdHI7XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjcyNzU2OTQ1M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MjU0Mjg3NTE2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3Rhc2tfcm9vdFwiLFxuICAgIFwiZ2V0X3Rhc2tfcHdkXCIsXG4gICAgXCJnZXRfdGFza19leGVfcGF0aFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcydzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYzhlMjUyYTk3MmZjMDAzOGU3ODA1NjE0YTdmMWI0NzJiMzE1OGM2N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMxIDAzOjI2OjUyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZnNfc3RydWN0LmMgYi9mcy9mc19zdHJ1Y3QuY1xuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcbi0tLSBhL2ZzL2ZzX3N0cnVjdC5jXG4rKysgYi9mcy9mc19zdHJ1Y3QuY1xuQEAgLTEwLDYgKzEwLDUwIEBAXG4gI2luY2x1ZGUgXCJpbnRlcm5hbC5oXCJcbiAjaW5jbHVkZSBcIm1vdW50LmhcIlxuIFxuKy8qKlxuKyAqIGdldF90YXNrX3Jvb3QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3Mgcm9vdCBwYXRoXG4rICogQHRhc2s6IFRoZSB0YXNrLlxuKyAqIEByb290OiBUaGUgdGFzaydzIHJvb3QgcGF0aC5cbisgKlxuKyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYSByb290IHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuIFRoZVxuKyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdClcbit7XG4rXHRpbnQgcmV0ID0gLUVOT0VOVDtcbitcbitcdHRhc2tfbG9jayh0YXNrKTtcbitcdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbitcdFx0Z2V0X2ZzX3Jvb3QodGFzay1cdTAwM2VyZWFsX2ZzLCByb290KTtcbitcdFx0cmV0ID0gMDtcbitcdH1cbitcdHRhc2tfdW5sb2NrKHRhc2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogZ2V0X3Rhc2tfcHdkIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5XG4rICogQHRhc2s6IFRoZSB0YXNrLlxuKyAqIEBwd2Q6IFRoZSB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnkuXG4rICpcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4rICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpXG4re1xuK1x0aW50IHJldCA9IC1FTk9FTlQ7XG4rXG4rXHR0YXNrX2xvY2sodGFzayk7XG4rXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4rXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwd2QpO1xuK1x0XHRyZXQgPSAwO1xuK1x0fVxuK1x0dGFza191bmxvY2sodGFzayk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbiAvKlxuICAqIFJlcGxhY2UgdGhlIGZzLVx1MDAzZXtyb290bW50LHJvb3R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuXG4gICogSXQgY2FuIGJsb2NrLlxuZGlmZiAtLWdpdCBhL2ZzL3BpZGZzLmMgYi9mcy9waWRmcy5jXG5pbmRleCBhNmE2NDNmMTVkMDhhLi5iMjEzNzRmMDAwMDJlIDEwMDY0NFxuLS0tIGEvZnMvcGlkZnMuY1xuKysrIGIvZnMvcGlkZnMuY1xuQEAgLTQsNiArNCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0ZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9mc19zdHJ1Y3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2VcbkBAIC01MTAsNiArNTExLDkgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcbiBcdGNhc2UgUElERkRfR0VUX1VUU19OQU1FU1BBQ0U6XG4gXHRjYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRTpcbiBcdGNhc2UgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0U6XG4rXHRjYXNlIFBJREZEX0dFVF9FWEU6XG4rXHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4rXHRjYXNlIFBJREZEX0dFVF9ST09UOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbkBAIC01MjcsNjIgKzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4rc3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPSBOVUxMO1xuLVx0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4tXHRcdHJldHVybiAtRU5PSU9DVExDTUQ7XG4tXG4tXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4tXHRcdGlmICghYXJnKVxuLVx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVxuLVx0XHRfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnO1xuLVx0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuK1x0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xuK1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuK1x0XHRwdXRfdGFza19zdHJ1Y3QodGFzayk7XG4gXHR9XG4rfVxuIFxuLVx0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4tXHRpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoUElERkRfR0VUX0lORk8pKVxuLVx0XHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XG4rLypcbisgKiBSZXR1cm4gQHBpZCdzIHRhc2sgd2l0aCBAdGFzaydzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuKyAqIGFuZCB0aGUgY2FsbGVycycgdGFzayBzdGF0ZSBsb29rdXAgbXVzdCBiZSBwZXJmb3JtZWQgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZFxuKyAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cbisgKi9cbitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWRmZF9nZXRfdGFza19sb2NrZWQoc3RydWN0IHBpZCAqcGlkLFxuK1x0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGFyZylcbit7XG4rXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9XG4rXHRcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcbitcdGludCBlcnJvcjtcbiBcbi1cdHRhc2sgPSBnZXRfcGlkX3Rhc2socGlkZmRfcGlkKGZpbGUpLCBQSURUWVBFX1BJRCk7XG4gXHRpZiAoIXRhc2spXG4tXHRcdHJldHVybiAtRVNSQ0g7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XG4gXG4gXHRpZiAoYXJnKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tXHQvKlxuLVx0ICogV2UncmUgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIG5hbWVzcGFjZSBzbyBwZXJmb3JtIGFcbi1cdCAqIGZpbGVzeXN0ZW0gY3JlZCBwdHJhY2UgY2hlY2suIEhvbGQgQHRhc2sncyBleGVjX3VwZGF0ZV9sb2NrIGZvciB0aGVcbi1cdCAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlXG4tXHQgKiBjcmVkZW50aWFscyB1c2VkIGZvciB0aGUgYWNjZXNzIGRlY2lzaW9uIG1hdGNoIHRob3NlIG9mIEB0YXNrIGF0IHRoZVxuLVx0ICogdGltZSBpdHMgbmFtZXNwYWNlIGlzIHJlYWQsIHByZXZlbnRpbmcgYSBjb25jdXJyZW50IGV4ZWN2ZSgpIGZyb21cbi1cdCAqIHN3YXBwaW5nIHRoZSB0YXNrJ3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXG4tXHQgKiBtaXJyb3IgbnNmcyBiZWhhdmlvci5cbi1cdCAqL1xuIFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4gXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbitcdFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xuIFxuIFx0aWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7XG4tXHRcdGVycm9yID0gLUVBQ0NFUztcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuK1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcbiBcdH1cbiBcbitcdHJldHVybl9wdHIodGFzayk7XG4rfVxuK1xuK0RFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosXG4rXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXG4rXHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXG4rXHQgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4rXG4rc3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxuK1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcbitcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4rXG4rXHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuK1x0aWYgKElTX0VSUih0YXNrKSlcbitcdFx0cmV0dXJuIEVSUl9DQVNUKHRhc2spO1xuK1xuIFx0c2NvcGVkX2d1YXJkKHRhc2tfbG9jaywgdGFzaykge1xuIFx0XHRuc3AgPSB0YXNrLVx1MDAzZW5zcHJveHk7XG4gXHRcdGlmIChuc3ApXG4gXHRcdFx0Z2V0X25zcHJveHkobnNwKTtcbiBcdH1cbi1cdGlmICghbnNwKSB7XG4tXHRcdGVycm9yID0gLUVTUkNIOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbid0IGV4aXN0ICovXG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbi1cdH1cbitcdGlmICghbnNwKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRVNSQ0gpOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbid0IGV4aXN0ICovXG4gXG4gXHRzd2l0Y2ggKGNtZCkge1xuIFx0LyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi9cbkBAIC02NjQsMTYgKzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gI2VuZGlmXG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0ZXJyb3IgPSAtRU5PSU9DVExDTUQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7XG4gXHR9XG4gXG4tXHRpZiAoIWVycm9yIFx1MDAyNlx1MDAyNiAhbnNfY29tbW9uKVxuLVx0XHRlcnJvciA9IC1FT1BOT1RTVVBQO1xuK1x0aWYgKCFuc19jb21tb24pXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTtcbiBcbi1vdXRfdW5sb2NrOlxuLVx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0cmV0dXJuIGVycm9yO1xuK1x0cmV0dXJuIG5zX2NvbW1vbjtcbit9XG4rXG4rc3RhdGljIGludCBwaWRmZF9nZXRfdGFza19wYXRoKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGNtZCxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBwYXRoICpwYXRoKVxuK3tcbitcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XG4rXG4rXHRpZiAoSVNfRVJSKHRhc2spKVxuK1x0XHRyZXR1cm4gUFRSX0VSUih0YXNrKTtcbitcbitcdHN3aXRjaCAoY21kKSB7XG4rXHRjYXNlIFBJREZEX0dFVF9FWEU6XG4rXHRcdHJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTtcbitcdGNhc2UgUElERkRfR0VUX0NXRDpcbitcdFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcbitcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4rXHRcdHJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIC1FSU5WQUw7XG4rfVxuK1xuK3N0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbit7XG4rXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuK1x0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4rXHRpbnQgZXJyb3I7XG4rXG4rXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4rXHRcdHJldHVybiAtRU5PSU9DVExDTUQ7XG4rXG4rXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4rXHRcdGlmICghYXJnKVxuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0XHRfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnO1xuK1xuK1x0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuK1x0fVxuK1xuK1x0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4rXHRpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoUElERkRfR0VUX0lORk8pKVxuK1x0XHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XG4rXG4rXHRzd2l0Y2ggKGNtZCkge1xuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuK1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbitcdFx0ZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsIFx1MDAyNnBhdGgpO1xuK1x0XHRpZiAoZXJyb3IpXG4rXHRcdFx0cmV0dXJuIGVycm9yO1xuK1xuK1x0XHRyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQyxcbitcdFx0XHQgICAgICBkZW50cnlfb3BlbihcdTAwMjZwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7XG4rXHR9XG4rXG4rXHRuc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpO1xuK1x0aWYgKElTX0VSUihuc19jb21tb24pKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihuc19jb21tb24pO1xuIFxuIFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xuIFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuY1xuaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDRcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXG4rKysgYi9mcy9wcm9jL2Jhc2UuY1xuQEAgLTIwNiwzMSArMjA2LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHBpZF9lbnRyeV9ubGluayhjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRyaWVzLFxuIFx0cmV0dXJuIGNvdW50O1xuIH1cbiBcbi1zdGF0aWMgaW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdClcbi17XG4tXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcbi1cbi1cdHRhc2tfbG9jayh0YXNrKTtcbi1cdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbi1cdFx0Z2V0X2ZzX3Jvb3QodGFzay1cdTAwM2VyZWFsX2ZzLCByb290KTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbi19XG4tXG4gc3RhdGljIGludCBwcm9jX2N3ZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsXG4gXHRcdFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4tXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcbi1cbi1cdHRhc2tfbG9jayh0YXNrKTtcbi1cdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbi1cdFx0Z2V0X2ZzX3B3ZCh0YXNrLVx1MDAzZXJlYWxfZnMsIHBhdGgpO1xuLVx0XHRyZXN1bHQgPSAwO1xuLVx0fVxuLVx0dGFza191bmxvY2sodGFzayk7XG4tXHRyZXR1cm4gcmVzdWx0O1xuK1x0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuQEAgLTE3NjEsMTYgKzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0ge1xuIHN0YXRpYyBpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpleGVfcGF0aCxcbiBcdFx0XHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4tXHRpZiAoZXhlX2ZpbGUpIHtcbi1cdFx0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0XHRwYXRoX2dldChcdTAwMjZleGVfZmlsZS1cdTAwM2VmX3BhdGgpO1xuLVx0XHRmcHV0KGV4ZV9maWxlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9IGVsc2Vcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dClcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oIGIvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaFxuaW5kZXggOTdlZWY4ZDM4NjNkZC4uZmI3MjU3MDc3NTRkMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbisrKyBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbkBAIC00Miw2ICs0Miw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfZnNfcHdkKHN0cnVjdCBmc19zdHJ1Y3QgKmZzLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuIFx0cmVhZF9zZXF1bmxvY2tfZXhjbChcdTAwMjZmcy1cdTAwM2VzZXEpO1xuIH1cbiBcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcbitpbnQgZ2V0X3Rhc2tfcHdkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnB3ZCk7XG4rXG4gc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpO1xuIFxuIGV4dGVybiBib29sIGN1cnJlbnRfY2hyb290ZWQodm9pZCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oXG5pbmRleCBkZDA5YzQzOGZhMjNlLi5hNjVmMjRiMmU2NWJmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tLmhcbkBAIC00MjM5LDYgKzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIGludCByZXBsYWNlX21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuK2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCk7XG4gXG4gZXh0ZXJuIHZvaWQgdm1fc3RhdF9hY2NvdW50KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgbG9uZyBucGFnZXMpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbmluZGV4IDA5MTkyNDZhMTYxMWMuLjk1Y2UxODE5ZjQyM2YgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbkBAIC0xMjEsNCArMTIxLDExIEBAIHN0cnVjdCBwaWRmZF9pbmZvIHtcbiAjZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMClcbiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcbiBcbisvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJ3MgZXhlY3V0YWJsZS4gKi9cbisjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMilcbisvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnkuICovXG4rI2RlZmluZSBQSURGRF9HRVRfQ1dEICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTMpXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHJvb3QgZGlyZWN0b3J5LiAqL1xuKyNkZWZpbmUgUElERkRfR0VUX1JPT1QgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDE0KVxuK1xuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDQxNjc1OGM4YTNkNDMuLmE0OTNkZTNhZTVjMjAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4rKysgYi9rZXJuZWwvZm9yay5jXG5AQCAtMTM3MSw2ICsxMzcxLDI3IEBAIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gXHRyZXR1cm4gZXhlX2ZpbGU7XG4gfVxuIFxuKy8qKlxuKyAqIGdldF90YXNrX2V4ZV9wYXRoIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJ3MgZXhlY3V0YWJsZSBwYXRoLlxuKyAqXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4rICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxuK3tcbitcdHN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xuK1xuK1x0aWYgKCFleGVfZmlsZSlcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cdTAwM2VmX3BhdGg7XG4rXHRwYXRoX2dldChleGVfcGF0aCk7XG4rXHRmcHV0KGV4ZV9maWxlKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBtbVxuICAqIEB0YXNrOiBUaGUgdGFzay5cbmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbmluZGV4IGUxNmZmNDEzMGJjMmYuLjA1Y2JhMjYxZGQzNDkgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suY1xuQEAgLTEzLDYgKzEzLDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wdHJhY2UuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gXG5AQCAtMzMwLDIyICszMzEsMTUgQEAgaW50IGFhX21heV9wdHJhY2UoY29uc3Qgc3RydWN0IGNyZWQgKnRyYWNlcl9jcmVkLCBzdHJ1Y3QgYWFfbGFiZWwgKnRyYWNlcixcbiBcbiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N1cnJlbnRfZXhlX3BhdGgoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpXG4ge1xuLVx0c3RydWN0IGZpbGUgKmV4ZV9maWxlO1xuLVx0c3RydWN0IHBhdGggcDtcbitcdHN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xuIFx0Y29uc3QgY2hhciAqcGF0aF9zdHI7XG4gXG4tXHRleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKGN1cnJlbnQpO1xuLVx0aWYgKCFleGVfZmlsZSlcbitcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcdTAwMjZwKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tXHRwID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0cGF0aF9nZXQoXHUwMDI2cCk7XG4gXG4gXHRpZiAoYWFfcGF0aF9uYW1lKFx1MDAyNnAsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCBcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXG4gXHRcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdGZwdXQoZXhlX2ZpbGUpO1xuLVx0cGF0aF9wdXQoXHUwMDI2cCk7XG4tXG4gXHRyZXR1cm4gcGF0aF9zdHI7XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6MjY6NTMuNzI3NTcxMDUzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTQzODYwNjYwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbml0aWFsIEFzc2Vzc21lbnQ6IFBhdGNoIERlZXAgRGl2ZSBcdTAwMjYgRnV6emluZyBTdWl0YWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFuYWx5emUgdGhlIGNvZGUgY2hhbmdlcyBhbmQgdGhlbiBkZXRlcm1pbmUgaXRzIGZ1enppbmcgcG90ZW50aWFsLlxuXG5UaGUgcGF0Y2ggaXRzZWxmIGlzIGludHJvZHVjaW5nIHNldmVyYWwgbmV3IGhlbHBlciBmdW5jdGlvbnMuIEkgc2VlIGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFkZGVkIHRvIHRoZSBrZXJuZWwuIFRoZXNlIGxvb2sgbGlrZSBzdHJhaWdodGZvcndhcmQgcGF0aCByZXRyaWV2YWwgZnVuY3Rpb25zLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBtb2RpZmljYXRpb25zIHRvIGBmcy9wcm9jL2Jhc2UuY2AgYW5kIGBzZWN1cml0eS9hcHBhcm1vci90YXNrLmNgIGNvbmZpcm0gdGhlc2UgaGVscGVycyBhcmUgYmVpbmcgdXNlZCBieSBjb3JlIGtlcm5lbCBjb21wb25lbnRzIGxpa2UgcHJvY2ZzIGFuZCBBcHBBcm1vciwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuXG5cblRoZSByZWFsIG1lYXQgb2YgdGhpcyBwYXRjaCBzZWVtcyB0byBiZSB0aGUgY2hhbmdlcyB3aXRoaW4gYGZzL3BpZGZzLmNgLiBJdCdzIGltcGxlbWVudGluZyBuZXcgaW9jdGxzIG9uIHBpZGZkczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGlzIHN1Z2dlc3RzIGEgbWVjaGFuaXNtIHRvIHJldHJpZXZlIGV4ZWN1dGFibGUgcGF0aCwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIHBpZGZkIGludGVyZmFjZS4gVGhlIHJlZmFjdG9yaW5nIG9mIGBwaWRmZF9pb2N0bGAgaW5kaWNhdGVzIHNvbWUgbG9ja2luZyBjaGFuZ2VzLCB3aGljaCBpcyBhbHdheXMgZ29vZCB0byByZXZpZXcuIEl0IGFsc28gaW5jbHVkZXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBwaWRmZF9nZXRfdGFza19wYXRoYCwgd2hpY2ggbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgaW1wbGVtZW50YXRpb24uXG5cbk5vdyBmb3IgdGhlIGZ1enppbmcgYW5hbHlzaXMuIFRoaXMgaXMgY2VydGFpbmx5IHdvcnRoIGEgY2xvc2VyIGxvb2ssIGdpdmVuIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGNvcmUga2VybmVsIGxvZ2ljIGluIHRoZSBmaWxlc3lzdGVtIGFuZCBwaWRmZC9pb2N0bCBzcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBmYWN0IHRoYXQgdGhlc2UgbmV3IGlvY3RscyBhcmUgZWFzaWx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGBwaWRmZF9vcGVuYCBvciBgY2xvbmUoQ0xPTkVfUElERkQpYCBvciBqdXN0IHVzaW5nIGFuIGV4aXN0aW5nIHBpZGZkLCBtZWFucyBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGNvZGUgcGF0aHMgaW4gUUVNVSBvciBldmVuIHdpdGggYSBzdGFuZGFyZCB1c2Vyc3BhY2Ugc2V0dXAuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCBpbmNsdWRlcyByZWFsIGZ1bmN0aW9uYWwgY2hhbmdlcywgbG9ja2luZyByZWZhY3RvcmluZywgYW5kIG5ldyBpb2N0bHMgbWFrZXMgaXQgZXZlbiBtb3JlIGNvbXBlbGxpbmcgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgV29ydGhGdXp6aW5nPXRydWUuXG5cbk5vdywgbGV0J3Mgc2VlIHdoaWNoIGNvbmZpZ3VyYXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgTWFrZWZpbGVzIGZvciB0aGUgcmVsZXZhbnQgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMvcGlkZnMuY2AsIGBmcy9mc19zdHJ1Y3QuY2AsIGFuZCBga2VybmVsL2ZvcmsuY2AuIEkgd2lsbCB1c2UgYSB0b29sIGxpa2UgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBNYWtlZmlsZXMgbWFudWFsbHkuIExldCdzIHNlZSB3aGF0IHdlIG5lZWQgdG8gZW5hYmxlIHRvIGFjY2VzcyBhbmQgZnV6eiB0aGVzZSBwYXRocy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwNCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjU5LjE2NjE4MDMwM1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY4NTk5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwaWRmc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiA1MTUgbGluZXMuXFxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxcblxcbmZzL01ha2VmaWxlPTEwPW9iai15IDo9XFx0b3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcXFxcXFxuLS1cXG5mcy9NYWtlZmlsZS0xNy1cXHRcXHRmc19kaXJlbnQubyBmc19jb250ZXh0Lm8gZnNfcGFyc2VyLm8gZnNvcGVuLm8gaW5pdC5vIFxcXFxcXG5mcy9NYWtlZmlsZToxODpcXHRcXHRrZXJuZWxfcmVhZF9maWxlLm8gbW50X2lkbWFwcGluZy5vIHJlbWFwX3JhbmdlLm8gcGlkZnMubyBcXFxcXFxuZnMvTWFrZWZpbGUtMTktXFx0XFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTQ1LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lbGYuaFxcdTAwM2VcXG5mcy9jb3JlZHVtcC5jOjQ2OiNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWRmcy5oXFx1MDAzZVxcbmZzL2NvcmVkdW1wLmMtNDctI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldC5oXFx1MDAzZVxcbi0tXFxuZnMvY29yZWR1bXAuYz02MjM9c3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjI5LVxcdGlmIChjcC1cXHUwMDNlcGlkKSB7XFxuZnMvY29yZWR1bXAuYzo2MzA6XFx0XFx0c3RydWN0IGZpbGUgKnBpZGZzX2ZpbGUgX19mcmVlKGZwdXQpID0gTlVMTDtcXG5mcy9jb3JlZHVtcC5jLTYzMS1cXG5mcy9jb3JlZHVtcC5jOjYzMjpcXHRcXHRwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC1cXHUwMDNlcGlkLCAwKTtcXG5mcy9jb3JlZHVtcC5jOjYzMzpcXHRcXHRpZiAoSVNfRVJSKHBpZGZzX2ZpbGUpKVxcbmZzL2NvcmVkdW1wLmM6NjM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBpZGZzX2ZpbGUpO1xcbmZzL2NvcmVkdW1wLmMtNjM1LVxcbmZzL2NvcmVkdW1wLmM6NjM2OlxcdFxcdHBpZGZzX2NvcmVkdW1wKGNwKTtcXG5mcy9jb3JlZHVtcC5jLTYzNy1cXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjQ0LVxcdFxcdCAqL1xcbmZzL2NvcmVkdW1wLmM6NjQ1OlxcdFxcdGVyciA9IHJlcGxhY2VfZmQoQ09SRURVTVBfUElERkRfTlVNQkVSLCBwaWRmc19maWxlLCAwKTtcXG5mcy9jb3JlZHVtcC5jLTY0Ni1cXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4tLVxcbmZzL2NvcmVkdW1wLmM9NjY4PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjk5LVxcdCAqIGNyZWRlbnRpYWxzIGR1cmluZyBjb25uZWN0KCkgYmVsb3cuIFRoZW4gaW1tZWRpYXRlbHkgcmVnaXN0ZXJcXG5mcy9jb3JlZHVtcC5jOjcwMDpcXHQgKiBpdCBpbiBwaWRmcy4uLlxcbmZzL2NvcmVkdW1wLmMtNzAxLVxcdCAqL1xcbmZzL2NvcmVkdW1wLmMtNzAyLVxcdGNwcm0tXFx1MDAzZXBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcXG5mcy9jb3JlZHVtcC5jOjcwMzpcXHRyZXR2YWwgPSBwaWRmc19yZWdpc3Rlcl9waWQoY3BybS1cXHUwMDNlcGlkKTtcXG5mcy9jb3JlZHVtcC5jLTcwNC1cXHRpZiAocmV0dmFsKVxcbi0tXFxuZnMvY29yZWR1bXAuYy03MTAtXFx0ICovXFxuZnMvY29yZWR1bXAuYzo3MTE6XFx0cGlkZnNfY29yZWR1bXAoY3BybSk7XFxuZnMvY29yZWR1bXAuYy03MTItXFxuLS1cXG5mcy9maGFuZGxlLmM9MTcwPXN0YXRpYyBpbnQgZ2V0X3BhdGhfYW5jaG9yKGludCBmZCwgc3RydWN0IHBhdGggKnJvb3QpXFxuLS1cXG5mcy9maGFuZGxlLmMtMTg2LVxcdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XFxuZnMvZmhhbmRsZS5jOjE4NzpcXHRcXHRwaWRmc19nZXRfcm9vdChyb290KTtcXG5mcy9maGFuZGxlLmMtMTg4LVxcdFxcdHJldHVybiAwO1xcbi0tXFxuZnMvaW50ZXJuYWwuaD0zNjI9aW50IGFub25faW5vZGVfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbmZzL2ludGVybmFsLmgtMzYzLVxcdFxcdCAgICAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIpO1xcbmZzL2ludGVybmFsLmg6MzY0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpO1xcbmZzL2ludGVybmFsLmgtMzY1LXZvaWQgbnNmc19nZXRfcm9vdChzdHJ1Y3QgcGF0aCAqcGF0aCk7XFxuLS1cXG5mcy9saWJmcy5jLTI1LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc2NyeXB0LmhcXHUwMDNlXFxuZnMvbGliZnMuYzoyNjojaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkZnMuaFxcdTAwM2VcXG5mcy9saWJmcy5jLTI3LVxcbi0tXFxuZnMvbGliZnMuYz0yMTkyPXN0cnVjdCBkZW50cnkgKnN0YXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICoqc3Rhc2hlZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KVxcbi0tXFxuZnMvbGliZnMuYy0yMjI1LSAqXFxuZnMvbGliZnMuYzoyMjI2OiAqIFNwZWNpYWwtcHVycG9zZSBoZWxwZXIgZm9yIG5zZnMgYW5kIHBpZGZzLlxcbmZzL2xpYmZzLmMtMjIyNy0gKlxcbi0tXFxuZnMvbmFtZXNwYWNlLmMtMzQtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21udF9pZG1hcHBpbmcuaFxcdTAwM2VcXG5mcy9uYW1lc3BhY2UuYzozNTojaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkZnMuaFxcdTAwM2VcXG5mcy9uYW1lc3BhY2UuYy0zNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbnN0cmVlLmhcXHUwMDNlXFxuLS1cXG5mcy9uYW1lc3BhY2UuYz0yODgxPXN0YXRpYyBpbnQgZG9fY2hhbmdlX3R5cGUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGludCBtc19mbGFncylcXG4tLVxcbmZzL25hbWVzcGFjZS5jLTI5MjktICogICAgIGVudHJ5IGZyb20gbnNmcy5cXG5mcy9uYW1lc3BhY2UuYzoyOTMwOiAqICgzKSBUaGUgY2FsbGVyIHRyaWVzIHRvIGNvcHkgYSBwaWRmcyBtb3VudCByZWZlcnJpbmcgdG8gYSBwaWRmZC5cXG5mcy9uYW1lc3BhY2UuYy0yOTMxLSAqICg0KSBUaGUgY2FsbGVyIGlzIHRyeWluZyB0byBjb3B5IGEgbW91bnQgdHJlZSB0aGF0IGJlbG9uZ3MgdG8gYW5cXG4tLVxcbmZzL25hbWVzcGFjZS5jPTI5NjA9c3RhdGljIGlubGluZSBib29sIG1heV9jb3B5X3RyZWUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpXFxuLS1cXG5mcy9uYW1lc3BhY2UuYy0yOTcxLVxcbmZzL25hbWVzcGFjZS5jOjI5NzI6XFx0aWYgKGRfb3AgPT0gXFx1MDAyNnBpZGZzX2RlbnRyeV9vcGVyYXRpb25zKVxcbmZzL25hbWVzcGFjZS5jLTI5NzMtXFx0XFx0cmV0dXJuIHRydWU7XFxuLS1cXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYy0xNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5naGFzaC5oXFx1MDAzZVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jOjE3OiNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWRmcy5oXFx1MDAzZVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTE4LVxcbi0tXFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM9NzQ0PXN0YXRpYyBzdHJ1Y3QgZmFub3RpZnlfZXZlbnQgKmZhbm90aWZ5X2FsbG9jX2V2ZW50KFxcbi0tXFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMtODQ4LVxcdGlmIChGQU5fR1JPVVBfRkxBRyhncm91cCwgRkFOX1JFUE9SVF9QSURGRCkgXFx1MDAyNlxcdTAwMjZcXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYzo4NDk6XFx0ICAgIHBpZGZzX3JlZ2lzdGVyX3BpZF9nZnAocGlkLCBnZnApKVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTg1MC1cXHRcXHRnb3RvIG91dDtcXG4tLVxcbmZzL3BpZGZzLmMtMTEtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BpZC5oXFx1MDAzZVxcbmZzL3BpZGZzLmM6MTI6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BpZGZzLmhcXHUwMDNlXFxuZnMvcGlkZnMuYy0xMy0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcXHUwMDNlXFxuLS1cXG5mcy9waWRmcy5jLTM3LVxcbmZzL3BpZGZzLmM6Mzg6c3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwaWRmc19hdHRyX2NhY2hlcCBfX3JvX2FmdGVyX2luaXQ7XFxuZnMvcGlkZnMuYy0zOS1cXG5mcy9waWRmcy5jOjQwOnN0YXRpYyBzdHJ1Y3QgcGF0aCBwaWRmc19yb290X3BhdGggPSB7fTtcXG5mcy9waWRmcy5jLTQxLVxcbmZzL3BpZGZzLmM6NDI6c3RhdGljIHN0cnVjdCBzaW1wbGVfeGF0dHJfY2FjaGUgcGlkZnNfeGFfY2FjaGU7XFxuZnMvcGlkZnMuYy00My1cXG5mcy9waWRmcy5jOjQ0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpXFxuZnMvcGlkZnMuYy00NS17XFxuZnMvcGlkZnMuYzo0NjpcXHQqcGF0aCA9IHBpZGZzX3Jvb3RfcGF0aDtcXG5mcy9waWRmcy5jLTQ3LVxcdHBhdGhfZ2V0KHBhdGgpO1xcbi0tXFxuZnMvcGlkZnMuYy00OS1cXG5mcy9waWRmcy5jOjUwOmVudW0gcGlkZnNfYXR0cl9tYXNrX2JpdHMge1xcbmZzL3BpZGZzLmMtNTEtXFx0UElERlNfQVRUUl9CSVRfRVhJVFxcdD0gMCxcXG4tLVxcbmZzL3BpZGZzLmMtNTQtXFxuZnMvcGlkZnMuYzo1NTpzdHJ1Y3QgcGlkZnNfYW5vbl9hdHRyIHtcXG5mcy9waWRmcy5jLTU2LVxcdHVuc2lnbmVkIGxvbmcgYXR0cl9tYXNrO1xcbi0tXFxuZnMvcGlkZnMuYy02NS1cXG5mcy9waWRmcy5jOjY2OnN0YXRpYyBzdHJ1Y3Qgcmhhc2h0YWJsZSBwaWRmc19pbm9faHQ7XFxuZnMvcGlkZnMuYy02Ny1cXG5mcy9waWRmcy5jOjY4OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGlkZnNfaW5vX2h0X3BhcmFtcyA9IHtcXG5mcy9waWRmcy5jLTY5LVxcdC5rZXlfb2Zmc2V0XFx0XFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBpbm8pLFxcbmZzL3BpZGZzLmMtNzAtXFx0LmtleV9sZW5cXHRcXHQ9IHNpemVvZih1NjQpLFxcbmZzL3BpZGZzLmM6NzE6XFx0LmhlYWRfb2Zmc2V0XFx0XFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBwaWRmc19oYXNoKSxcXG5mcy9waWRmcy5jLTcyLVxcdC5hdXRvbWF0aWNfc2hyaW5raW5nXFx0PSB0cnVlLFxcbi0tXFxuZnMvcGlkZnMuYy04NS0gKlxcbmZzL3BpZGZzLmM6ODY6ICogT24gMzIgYml0IHBpZGZzX2lubygpIHdpbGwgcmV0dXJuIHRoZSBsb3dlciAzMiBiaXQuIFdoZW5cXG5mcy9waWRmcy5jOjg3OiAqIHBpZGZzX2lubygpIHJldHVybnMgemVybyBhIHdyYXAgYXJvdW5kIGhhcHBlbmVkLiBXaGVuIGFcXG5mcy9waWRmcy5jLTg4LSAqIHdyYXBhcm91bmQgaGFwcGVucyB0aGUgNjQgYml0IG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIGJ5IDFcXG4tLVxcbmZzL3BpZGZzLmMtOTUtICogc2FtZSBpbm9kZSBudW1iZXIgYXJlIGxpa2VseSB0byBleGlzdCAoVGhpcyBpc24ndCBhIHByb2JsZW1cXG5mcy9waWRmcy5jOjk2OiAqIHNpbmNlIGJlZm9yZSBwaWRmcyBwaWRmZHMgdXNlZCB0aGUgYW5vbnltb3VzIGlub2RlIG1lYW5pbmdcXG5mcy9waWRmcy5jLTk3LSAqIGFsbCBwaWRmZHMgaGFkIHRoZSBzYW1lIGlub2RlIG51bWJlci4pLiBVc2Vyc3BhY2UgY2FuXFxuLS1cXG5mcy9waWRmcy5jLTEwMS0gKi9cXG5mcy9waWRmcy5jOjEwMjpzdHJ1Y3QgcGlkZnNfYXR0ciB7XFxuZnMvcGlkZnMuYy0xMDMtXFx0c3RydWN0IGxpc3RfaGVhZCB4YXR0cnM7XFxuZnMvcGlkZnMuYy0xMDQtXFx0dW5pb24ge1xcbmZzL3BpZGZzLmM6MTA1OlxcdFxcdHN0cnVjdCBwaWRmc19hbm9uX2F0dHI7XFxuZnMvcGlkZnMuYzoxMDY6XFx0XFx0c3RydWN0IGxsaXN0X25vZGUgcGlkZnNfbGxpc3Q7XFxuZnMvcGlkZnMuYy0xMDctXFx0fTtcXG4tLVxcbmZzL3BpZGZzLmMtMTExLVxcbmZzL3BpZGZzLmM6MTEyOnN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlkZnNfaW5vX2xvY2spO1xcbmZzL3BpZGZzLmM6MTEzOnN0YXRpYyB1NjQgcGlkZnNfaW5vX25yID0gMTtcXG5mcy9waWRmcy5jLTExNC1cXG5mcy9waWRmcy5jOjExNTpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGlkZnNfaW5vKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xMTYte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjAtLyogT24gMzIgYml0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBhcmUgdGhlIHVwcGVyIDMyIGJpdHMuICovXFxuZnMvcGlkZnMuYzoxMjE6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xMjIte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjUtXFxuZnMvcGlkZnMuYzoxMjY6c3RhdGljIGlubGluZSB1NjQgcGlkZnNfYWxsb2NfaW5vKHZvaWQpXFxuZnMvcGlkZnMuYy0xMjcte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjktXFxuZnMvcGlkZnMuYzoxMzA6XFx0c3Bpbl9sb2NrKFxcdTAwMjZwaWRmc19pbm9fbG9jayk7XFxuZnMvcGlkZnMuYzoxMzE6XFx0aWYgKHBpZGZzX2lubyhwaWRmc19pbm9fbnIpID09IDApXFxuZnMvcGlkZnMuYzoxMzI6XFx0XFx0cGlkZnNfaW5vX25yKys7XFxuZnMvcGlkZnMuYzoxMzM6XFx0aW5vID0gcGlkZnNfaW5vX25yKys7XFxuZnMvcGlkZnMuYzoxMzQ6XFx0c3Bpbl91bmxvY2soXFx1MDAyNnBpZGZzX2lub19sb2NrKTtcXG5mcy9waWRmcy5jLTEzNS1cXHRyZXR1cm4gaW5vO1xcbi0tXFxuZnMvcGlkZnMuYy0xNDAtLyogT24gNjQgYml0IHNpbXBseSByZXR1cm4gaW5vLiAqL1xcbmZzL3BpZGZzLmM6MTQxOnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwaWRmc19pbm8odTY0IGlubylcXG5mcy9waWRmcy5jLTE0Mi17XFxuLS1cXG5mcy9waWRmcy5jLTE0Ni0vKiBPbiA2NCBiaXQgdGhlIGdlbmVyYXRpb24gbnVtYmVyIGlzIDAuICovXFxuZnMvcGlkZnMuYzoxNDc6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xNDgte1xcbi0tXFxuZnMvcGlkZnMuYy0xNTEtXFxuZnMvcGlkZnMuYzoxNTI6REVGSU5FX0NPT0tJRShwaWRmc19pbm9fY29va2llKTtcXG5mcy9waWRmcy5jLTE1My1cXG5mcy9waWRmcy5jOjE1NDpzdGF0aWMgdTY0IHBpZGZzX2FsbG9jX2lubyh2b2lkKVxcbmZzL3BpZGZzLmMtMTU1LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTU4LVxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbmZzL3BpZGZzLmM6MTU5OlxcdGlubyA9IGdlbl9jb29raWVfbmV4dChcXHUwMDI2cGlkZnNfaW5vX2Nvb2tpZSk7XFxuZnMvcGlkZnMuYy0xNjAtXFx0cHJlZW1wdF9lbmFibGUoKTtcXG4tLVxcbmZzL3BpZGZzLmMtMTY3LVxcbmZzL3BpZGZzLmM6MTY4OnZvaWQgcGlkZnNfcHJlcGFyZV9waWQoc3RydWN0IHBpZCAqcGlkKVxcbmZzL3BpZGZzLmMtMTY5LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTc0LVxcbmZzL3BpZGZzLmM6MTc1OmludCBwaWRmc19hZGRfcGlkKHN0cnVjdCBwaWQgKnBpZClcXG5mcy9waWRmcy5jLTE3Ni17XFxuLS1cXG5mcy9waWRmcy5jLTE3OC1cXG5mcy9waWRmcy5jOjE3OTpcXHRwaWQtXFx1MDAzZWlubyA9IHBpZGZzX2FsbG9jX2lubygpO1xcbmZzL3BpZGZzLmM6MTgwOlxcdHJldCA9IHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoXFx1MDAyNnBpZGZzX2lub19odCwgXFx1MDAyNnBpZC1cXHUwMDNlcGlkZnNfaGFzaCxcXG5mcy9waWRmcy5jOjE4MTpcXHRcXHRcXHRcXHQgICAgIHBpZGZzX2lub19odF9wYXJhbXMpO1xcbmZzL3BpZGZzLmMtMTgyLVxcdGlmICh1bmxpa2VseShyZXQpKVxcbi0tXFxuZnMvcGlkZnMuYy0xODYtXFxuZnMvcGlkZnMuYzoxODc6dm9pZCBwaWRmc19yZW1vdmVfcGlkKHN0cnVjdCBwaWQgKnBpZClcXG5mcy9waWRmcy5jLTE4OC17XFxuZnMvcGlkZnMuYy0xODktXFx0aWYgKGxpa2VseShwaWQtXFx1MDAzZWlubykpXFxuZnMvcGlkZnMuYzoxOTA6XFx0XFx0cmhhc2h0YWJsZV9yZW1vdmVfZmFzdChcXHUwMDI2cGlkZnNfaW5vX2h0LCBcXHUwMDI2cGlkLVxcdTAwM2VwaWRmc19oYXNoLFxcbmZzL3BpZGZzLmM6MTkxOlxcdFxcdFxcdFxcdCAgICAgICBwaWRmc19pbm9faHRfcGFyYW1zKTtcXG5mcy9waWRmcy5jLTE5Mi19XFxuZnMvcGlkZnMuYy0xOTMtXFxuZnMvcGlkZnMuYzoxOTQ6c3RhdGljIExMSVNUX0hFQUQocGlkZnNfZnJlZV9saXN0KTtcXG5mcy9waWRmcy5jLTE5NS1cXG5mcy9waWRmcy5jOjE5NjpzdGF0aWMgdm9pZCBwaWRmc19mcmVlX2F0dHJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuZnMvcGlkZnMuYy0xOTcte1xcbmZzL3BpZGZzLmM6MTk4OlxcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyLCAqbmV4dDtcXG5mcy9waWRmcy5jLTE5OS1cXHRzdHJ1Y3QgbGxpc3Rfbm9kZSAqaGVhZDtcXG5mcy9waWRmcy5jLTIwMC1cXG5mcy9waWRmcy5jOjIwMTpcXHRoZWFkID0gbGxpc3RfZGVsX2FsbChcXHUwMDI2cGlkZnNfZnJlZV9saXN0KTtcXG5mcy9waWRmcy5jOjIwMjpcXHRsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGF0dHIsIG5leHQsIGhlYWQsIHBpZGZzX2xsaXN0KSB7XFxuZnMvcGlkZnMuYzoyMDM6XFx0XFx0c2ltcGxlX3hhdHRyc19mcmVlKFxcdTAwMjZwaWRmc194YV9jYWNoZSwgXFx1MDAyNmF0dHItXFx1MDAzZXhhdHRycywgTlVMTCk7XFxuZnMvcGlkZnMuYy0yMDQtXFx0XFx0a2ZyZWUoYXR0cik7XFxuLS1cXG5mcy9waWRmcy5jLTIwNy1cXG5mcy9waWRmcy5jOjIwODpzdGF0aWMgREVDTEFSRV9XT1JLKHBpZGZzX2ZyZWVfd29yaywgcGlkZnNfZnJlZV9hdHRyX3dvcmspO1xcbmZzL3BpZGZzLmMtMjA5LVxcbmZzL3BpZGZzLmM6MjEwOnZvaWQgcGlkZnNfZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKVxcbmZzL3BpZGZzLmMtMjExLXtcXG5mcy9waWRmcy5jOjIxMjpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0ciA9IHBpZC1cXHUwMDNlYXR0cjtcXG5mcy9waWRmcy5jLTIxMy1cXG4tLVxcbmZzL3BpZGZzLmMtMjMyLVxcdFxcdGtmcmVlKGF0dHIpO1xcbmZzL3BpZGZzLmM6MjMzOlxcdGVsc2UgaWYgKGxsaXN0X2FkZChcXHUwMDI2YXR0ci1cXHUwMDNlcGlkZnNfbGxpc3QsIFxcdTAwMjZwaWRmc19mcmVlX2xpc3QpKVxcbmZzL3BpZGZzLmM6MjM0OlxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnBpZGZzX2ZyZWVfd29yayk7XFxuZnMvcGlkZnMuYy0yMzUtfVxcbi0tXFxuZnMvcGlkZnMuYz0zMzA9c3RhdGljIGlubGluZSBib29sIHBpZF9pbl9jdXJyZW50X3BpZG5zKGNvbnN0IHN0cnVjdCBwaWQgKnBpZClcXG4tLVxcbmZzL3BpZGZzLmMtMzM5LVxcbmZzL3BpZGZzLmM6MzQwOnN0YXRpYyBfX3UzMiBwaWRmc19jb3JlZHVtcF9tYXNrKGVudW0gdGFza19kdW1wYWJsZSBkdW1wYWJsZSlcXG5mcy9waWRmcy5jLTM0MS17XFxuLS1cXG5mcy9waWRmcy5jPTM2Nj1zdGF0aWMgbG9uZyBwaWRmZF9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmZzL3BpZGZzLmMtMzczLVxcdHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucztcXG5mcy9waWRmcy5jOjM3NDpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTM3NS1cXHRjb25zdCBzdHJ1Y3QgY3JlZCAqYztcXG4tLVxcbmZzL3BpZGZzLmMtNDM0LVxcdGlmICgobWFzayBcXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIFxcdTAwMjZcXHUwMDI2ICFraW5mby5jb3JlZHVtcF9tYXNrKSB7XFxuZnMvcGlkZnMuYzo0MzU6XFx0XFx0a2luZm8uY29yZWR1bXBfbWFzayA9IHBpZGZzX2NvcmVkdW1wX21hc2sodGFza19leGVjX3N0YXRlX2dldF9kdW1wYWJsZSh0YXNrKSk7XFxuZnMvcGlkZnMuYy00MzYtXFx0XFx0a2luZm8ubWFzayB8PSBQSURGRF9JTkZPX0NPUkVEVU1QO1xcbi0tXFxuZnMvcGlkZnMuYy00OTktXFxuZnMvcGlkZnMuYzo1MDA6c3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcXG5mcy9waWRmcy5jLTUwMS17XFxuLS1cXG5mcy9waWRmcy5jPTcwNT1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5mcy9waWRmcy5jLTcxMC1cXG5mcy9waWRmcy5jOjcxMTpcXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXFxuZnMvcGlkZnMuYy03MTItXFx0XFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcXG4tLVxcbmZzL3BpZGZzLmM9NzQ4PXN0YXRpYyBsb25nIHBpZGZkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbmZzL3BpZGZzLmMtNzU3LVxcbmZzL3BpZGZzLmM6NzU4OnN0YXRpYyBpbnQgcGlkZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL3BpZGZzLmMtNzU5LXtcXG4tLVxcbmZzL3BpZGZzLmMtNzc3LVxcbmZzL3BpZGZzLmM6Nzc4OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBpZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHtcXG5mcy9waWRmcy5jOjc3OTpcXHQucmVsZWFzZVxcdD0gcGlkZnNfZmlsZV9yZWxlYXNlLFxcbmZzL3BpZGZzLmMtNzgwLVxcdC5wb2xsXFx0XFx0PSBwaWRmZF9wb2xsLFxcbi0tXFxuZnMvcGlkZnMuYz03OTA9c3RydWN0IHBpZCAqcGlkZmRfcGlkKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL3BpZGZzLmMtNzkxLXtcXG5mcy9waWRmcy5jOjc5MjpcXHRpZiAoZmlsZS1cXHUwMDNlZl9vcCAhPSBcXHUwMDI2cGlkZnNfZmlsZV9vcGVyYXRpb25zKVxcbmZzL3BpZGZzLmMtNzkzLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FQkFERik7XFxuLS1cXG5mcy9waWRmcy5jLTgwNC0gKiBwaWQtXFx1MDAzZWF0dHIgd2lsbCBiZSBhbGxvY2F0ZWQuIElmIG5vdCB3ZSBtYXJrIHRoZSBzdHJ1Y3QgcGlkIGFzIGRlYWQgc29cXG5mcy9waWRmcy5jOjgwNTogKiBhbnlvbmUgd2hvIGlzIHRyeWluZyB0byByZWdpc3RlciBpdCB3aXRoIHBpZGZzIHdpbGwgZmFpbCB0byBkbyBzby5cXG5mcy9waWRmcy5jOjgwNjogKiBPdGhlcndpc2Ugd2Ugd291bGQgaGFuZCBvdXQgcGlkZnMgZm9yIHJlYXBlZCB0YXNrcyB3aXRob3V0IGhhdmluZ1xcbmZzL3BpZGZzLmMtODA3LSAqIGV4aXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLlxcbi0tXFxuZnMvcGlkZnMuYy04MTAtICogcmlnaHQgYXdheSBpbiBmcmVlX3BpZCgpIHdoZW4gbm8gb25lIGhvbGRzIGEgcGlkZmQgYW55bW9yZS4gU2luY2VcXG5mcy9waWRmcy5jOjgxMTogKiBwaWRmc19leGl0KCkgY3VycmVudGx5IGlzIHBsYWNlZCBhZnRlciBleGl0X3Rhc2tfd29yaygpIHdlIGtub3cgdGhhdFxcbmZzL3BpZGZzLmMtODEyLSAqIGl0IGNhbm5vdCBiZSB1cyBha2EgdGhlIGV4aXRpbmcgdGFzayBob2xkaW5nIGEgcGlkZmQgdG8gaXRzZWxmLlxcbmZzL3BpZGZzLmMtODEzLSAqL1xcbmZzL3BpZGZzLmM6ODE0OnZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG5mcy9waWRmcy5jLTgxNS17XFxuZnMvcGlkZnMuYy04MTYtXFx0c3RydWN0IHBpZCAqcGlkID0gdGFza19waWQodHNrKTtcXG5mcy9waWRmcy5jOjgxNzpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTgxOC0jaWZkZWYgQ09ORklHX0NHUk9VUFNcXG4tLVxcbmZzL3BpZGZzLmMtODIzLVxcbmZzL3BpZGZzLmM6ODI0OlxcdC8qIFN5bmNocm9uaXplIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkuICovXFxuZnMvcGlkZnMuYy04MjUtXFx0c2NvcGVkX2d1YXJkKHNwaW5sb2NrX2lycSwgXFx1MDAyNnBpZC1cXHUwMDNld2FpdF9waWRmZC5sb2NrKSB7XFxuLS1cXG5mcy9waWRmcy5jLTgyOS1cXHRcXHRcXHQgKiBObyBvbmUgZXZlciBoZWxkIGEgcGlkZmQgZm9yIHRoaXMgc3RydWN0IHBpZC5cXG5mcy9waWRmcy5jOjgzMDpcXHRcXHRcXHQgKiBNYXJrIGl0IGFzIGRlYWQgc28gbm8gb25lIGNhbiBhZGQgYSBwaWRmc1xcbmZzL3BpZGZzLmMtODMxLVxcdFxcdFxcdCAqIGVudHJ5IGFueW1vcmUuIFdlJ3JlIGFib3V0IHRvIGJlIHJlYXBlZCBhbmRcXG4tLVxcbmZzL3BpZGZzLmMtODYwLSNpZmRlZiBDT05GSUdfQ09SRURVTVBcXG5mcy9waWRmcy5jOjg2MTp2b2lkIHBpZGZzX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXFxuZnMvcGlkZnMuYy04NjIte1xcbmZzL3BpZGZzLmMtODYzLVxcdHN0cnVjdCBwaWQgKnBpZCA9IGNwcm0tXFx1MDAzZXBpZDtcXG5mcy9waWRmcy5jOjg2NDpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTg2NS1cXG4tLVxcbmZzL3BpZGZzLmMtODcxLVxcdC8qIE5vdGUgaG93IHdlIHdlcmUgY29yZWR1bXBlZCBhbmQgdGhhdCB3ZSBjb3JlZHVtcGVkLiAqL1xcbmZzL3BpZGZzLmM6ODcyOlxcdGF0dHItXFx1MDAzZWNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKGNwcm0tXFx1MDAzZWR1bXBhYmxlKSB8XFxuZnMvcGlkZnMuYy04NzMtXFx0XFx0XFx0ICAgICAgUElERkRfQ09SRURVTVBFRDtcXG4tLVxcbmZzL3BpZGZzLmMtODgzLVxcbmZzL3BpZGZzLmM6ODg0OnN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpZGZzX21udCBfX3JvX2FmdGVyX2luaXQ7XFxuZnMvcGlkZnMuYy04ODUtXFxuLS1cXG5mcy9waWRmcy5jLTg5MC0gKi9cXG5mcy9waWRmcy5jOjg5MTpzdGF0aWMgaW50IHBpZGZzX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9waWRmcy5jLTg5Mi1cXHRcXHRcXHQgc3RydWN0IGlhdHRyICphdHRyKVxcbi0tXFxuZnMvcGlkZnMuYy04OTYtXFxuZnMvcGlkZnMuYzo4OTc6c3RhdGljIGludCBwaWRmc19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG5mcy9waWRmcy5jLTg5OC1cXHRcXHRcXHQgc3RydWN0IGtzdGF0ICpzdGF0LCB1MzIgcmVxdWVzdF9tYXNrLFxcbi0tXFxuZnMvcGlkZnMuYy05MDMtXFxuZnMvcGlkZnMuYzo5MDQ6c3RhdGljIHNzaXplX3QgcGlkZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcXG5mcy9waWRmcy5jLTkwNS17XFxuLS1cXG5mcy9waWRmcy5jLTkxMS1cXG5mcy9waWRmcy5jOjkxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcGlkZnNfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG5mcy9waWRmcy5jOjkxMzpcXHQuZ2V0YXR0clxcdD0gcGlkZnNfZ2V0YXR0cixcXG5mcy9waWRmcy5jOjkxNDpcXHQuc2V0YXR0clxcdD0gcGlkZnNfc2V0YXR0cixcXG5mcy9waWRmcy5jOjkxNTpcXHQubGlzdHhhdHRyXFx0PSBwaWRmc19saXN0eGF0dHIsXFxuZnMvcGlkZnMuYy05MTYtfTtcXG5mcy9waWRmcy5jLTkxNy1cXG5mcy9waWRmcy5jOjkxODpzdGF0aWMgdm9pZCBwaWRmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL3BpZGZzLmMtOTE5LXtcXG4tLVxcbmZzL3BpZGZzLmMtOTI1LVxcbmZzL3BpZGZzLmM6OTI2OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaWRmc19zb3BzID0ge1xcbmZzL3BpZGZzLmMtOTI3LVxcdC5kcm9wX2lub2RlXFx0PSBpbm9kZV9qdXN0X2Ryb3AsXFxuZnMvcGlkZnMuYzo5Mjg6XFx0LmV2aWN0X2lub2RlXFx0PSBwaWRmc19ldmljdF9pbm9kZSxcXG5mcy9waWRmcy5jLTkyOS1cXHQuc3RhdGZzXFx0XFx0PSBzaW1wbGVfc3RhdGZzLFxcbi0tXFxuZnMvcGlkZnMuYy05MzMtICogJ2xzb2YnIGhhcyBrbm93bGVkZ2Ugb2Ygb3V0IGhpc3RvcmljYWwgYW5vbl9pbm9kZSB1c2UsIGFuZCBleHBlY3RzXFxuZnMvcGlkZnMuYzo5MzQ6ICogdGhlIHBpZGZzIGRlbnRyeSBuYW1lIHRvIHN0YXJ0IHdpdGggJ2Fub25faW5vZGUnLlxcbmZzL3BpZGZzLmMtOTM1LSAqL1xcbmZzL3BpZGZzLmM6OTM2OnN0YXRpYyBjaGFyICpwaWRmc19kbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbilcXG5mcy9waWRmcy5jLTkzNy17XFxuLS1cXG5mcy9waWRmcy5jLTk0MC1cXG5mcy9waWRmcy5jOjk0MTpjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7XFxuZnMvcGlkZnMuYzo5NDI6XFx0LmRfZG5hbWVcXHQ9IHBpZGZzX2RuYW1lLFxcbmZzL3BpZGZzLmMtOTQzLVxcdC5kX3BydW5lXFx0PSBzdGFzaGVkX2RlbnRyeV9wcnVuZSxcXG4tLVxcbmZzL3BpZGZzLmMtOTQ1LVxcbmZzL3BpZGZzLmM6OTQ2OnN0YXRpYyBpbnQgcGlkZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcXG5mcy9waWRmcy5jLTk0Ny1cXHRcXHRcXHQgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudClcXG4tLVxcbmZzL3BpZGZzLmMtOTYxLS8qIEZpbmQgYSBzdHJ1Y3QgcGlkIGJhc2VkIG9uIHRoZSBpbm9kZSBudW1iZXIuICovXFxuZnMvcGlkZnMuYzo5NjI6c3RhdGljIHN0cnVjdCBwaWQgKnBpZGZzX2lub19nZXRfcGlkKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy05NjMte1xcbmZzL3BpZGZzLmMtOTY0LVxcdHN0cnVjdCBwaWQgKnBpZDtcXG5mcy9waWRmcy5jOjk2NTpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTk2Ni1cXG5mcy9waWRmcy5jLTk2Ny1cXHRndWFyZChyY3UpKCk7XFxuZnMvcGlkZnMuYzo5Njg6XFx0cGlkID0gcmhhc2h0YWJsZV9sb29rdXAoXFx1MDAyNnBpZGZzX2lub19odCwgXFx1MDAyNmlubywgcGlkZnNfaW5vX2h0X3BhcmFtcyk7XFxuZnMvcGlkZnMuYy05NjktXFx0aWYgKCFwaWQpXFxuLS1cXG5mcy9waWRmcy5jLTk4MS1cXG5mcy9waWRmcy5jOjk4MjpzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuZnMvcGlkZnMuYy05ODMtXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbixcXG4tLVxcbmZzL3BpZGZzLmMtMTAwMS1cXG5mcy9waWRmcy5jOjEwMDI6XFx0cGlkID0gcGlkZnNfaW5vX2dldF9waWQocGlkX2lubyk7XFxuZnMvcGlkZnMuYy0xMDAzLVxcdGlmICghcGlkKVxcbi0tXFxuZnMvcGlkZnMuYy0xMDA1LVxcbmZzL3BpZGZzLmM6MTAwNjpcXHRyZXQgPSBwYXRoX2Zyb21fc3Rhc2hlZChcXHUwMDI2cGlkLVxcdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIHBpZCwgXFx1MDAyNnBhdGgpO1xcbmZzL3BpZGZzLmMtMTAwNy1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG4tLVxcbmZzL3BpZGZzLmMtMTAxNS1cXG5mcy9waWRmcy5jOjEwMTY6c3RhdGljIHN0cnVjdCBmaWxlICpwaWRmc19kZW50cnlfb3Blbihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG5mcy9waWRmcy5jLTEwMTctXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi0tXFxuZnMvcGlkZnMuYy0xMDM3LVxcbmZzL3BpZGZzLmM6MTAzODpzdGF0aWMgaW50IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uKHN0cnVjdCBoYW5kbGVfdG9fcGF0aF9jdHggKmN0eCxcXG5mcy9waWRmcy5jLTEwMzktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IG9mbGFncylcXG4tLVxcbmZzL3BpZGZzLmMtMTA1MS1cXG5mcy9waWRmcy5jOjEwNTI6c3RhdGljIHN0cnVjdCBmaWxlICpwaWRmc19leHBvcnRfb3Blbihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgdW5zaWduZWQgaW50IG9mbGFncylcXG5mcy9waWRmcy5jLTEwNTMte1xcbi0tXFxuZnMvcGlkZnMuYy0xMDYwLVxcdC8qIENsZWFyIE9fTEFSR0VGSUxFIGFzIG9wZW5fYnlfaGFuZGxlX2F0KCkgZm9yY2VzIGl0LiAqL1xcbmZzL3BpZGZzLmM6MTA2MTpcXHRyZXR1cm4gcGlkZnNfZGVudHJ5X29wZW4ocGF0aCwgb2ZsYWdzIFxcdTAwMjYgfk9fTEFSR0VGSUxFLCBjdXJyZW50X2NyZWQoKSk7XFxuZnMvcGlkZnMuYy0xMDYyLX1cXG5mcy9waWRmcy5jLTEwNjMtXFxuZnMvcGlkZnMuYzoxMDY0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcGlkZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7XFxuZnMvcGlkZnMuYzoxMDY1OlxcdC5lbmNvZGVfZmhcXHQ9IHBpZGZzX2VuY29kZV9maCxcXG5mcy9waWRmcy5jOjEwNjY6XFx0LmZoX3RvX2RlbnRyeVxcdD0gcGlkZnNfZmhfdG9fZGVudHJ5LFxcbmZzL3BpZGZzLmM6MTA2NzpcXHQub3BlblxcdFxcdD0gcGlkZnNfZXhwb3J0X29wZW4sXFxuZnMvcGlkZnMuYzoxMDY4OlxcdC5wZXJtaXNzaW9uXFx0PSBwaWRmc19leHBvcnRfcGVybWlzc2lvbixcXG5mcy9waWRmcy5jLTEwNjktfTtcXG5mcy9waWRmcy5jLTEwNzAtXFxuZnMvcGlkZnMuYzoxMDcxOnN0YXRpYyBpbnQgcGlkZnNfaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbmZzL3BpZGZzLmMtMTA3Mi17XFxuLS1cXG5mcy9waWRmcy5jLTEwNzktXFx0aW5vZGUtXFx1MDAzZWlfbW9kZSB8PSBTX0lSV1hVO1xcbmZzL3BpZGZzLmM6MTA4MDpcXHRpbm9kZS1cXHUwMDNlaV9vcCA9IFxcdTAwMjZwaWRmc19pbm9kZV9vcGVyYXRpb25zO1xcbmZzL3BpZGZzLmM6MTA4MTpcXHRpbm9kZS1cXHUwMDNlaV9mb3AgPSBcXHUwMDI2cGlkZnNfZmlsZV9vcGVyYXRpb25zO1xcbmZzL3BpZGZzLmM6MTA4MjpcXHRpbm9kZS1cXHUwMDNlaV9pbm8gPSBwaWRmc19pbm8ocGlkLVxcdTAwM2Vpbm8pO1xcbmZzL3BpZGZzLmM6MTA4MzpcXHRpbm9kZS1cXHUwMDNlaV9nZW5lcmF0aW9uID0gcGlkZnNfZ2VuKHBpZC1cXHUwMDNlaW5vKTtcXG5mcy9waWRmcy5jLTEwODQtXFx0cmV0dXJuIDA7XFxuLS1cXG5mcy9waWRmcy5jLTEwODYtXFxuZnMvcGlkZnMuYzoxMDg3OnN0YXRpYyB2b2lkIHBpZGZzX3B1dF9kYXRhKHZvaWQgKmRhdGEpXFxuZnMvcGlkZnMuYy0xMDg4LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTA5My0vKipcXG5mcy9waWRmcy5jOjEwOTQ6ICogcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcCAtIHJlZ2lzdGVyIGEgc3RydWN0IHBpZCBpbiBwaWRmcyB3aXRoIGN1c3RvbSBHRlBcXG5mcy9waWRmcy5jLTEwOTUtICogZmxhZ3NcXG4tLVxcbmZzL3BpZGZzLmMtMTA5OC0gKlxcbmZzL3BpZGZzLmM6MTA5OTogKiBSZWdpc3RlciBhIHN0cnVjdCBwaWQgaW4gcGlkZnMgd2l0aCBjdXN0b20gR0ZQIGZsYWdzLlxcbmZzL3BpZGZzLmMtMTEwMC0gKlxcbi0tXFxuZnMvcGlkZnMuYy0xMTAyLSAqL1xcbmZzL3BpZGZzLmM6MTEwMzppbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcXG5mcy9waWRmcy5jLTExMDQte1xcbmZzL3BpZGZzLmM6MTEwNTpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqbmV3X2F0dHIgX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuZnMvcGlkZnMuYzoxMTA2OlxcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xcbmZzL3BpZGZzLmMtMTEwNy1cXG4tLVxcbmZzL3BpZGZzLmMtMTExOC1cXG5mcy9waWRmcy5jOjExMTk6XFx0bmV3X2F0dHIgPSBrbWVtX2NhY2hlX3phbGxvYyhwaWRmc19hdHRyX2NhY2hlcCwgZ2ZwKTtcXG5mcy9waWRmcy5jLTExMjAtXFx0aWYgKCFuZXdfYXR0cilcXG4tLVxcbmZzL3BpZGZzLmMtMTEyNC1cXG5mcy9waWRmcy5jOjExMjU6XFx0LyogU3luY2hyb25pemUgd2l0aCBwaWRmc19leGl0KCkuICovXFxuZnMvcGlkZnMuYy0xMTI2LVxcdGd1YXJkKHNwaW5sb2NrX2lycSkoXFx1MDAyNnBpZC1cXHUwMDNld2FpdF9waWRmZC5sb2NrKTtcXG4tLVxcbmZzL3BpZGZzLmMtMTEzNy1cXG5mcy9waWRmcy5jOjExMzg6c3RhdGljIHN0cnVjdCBkZW50cnkgKnBpZGZzX3N0YXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICoqc3Rhc2hlZCxcXG5mcy9waWRmcy5jLTExMzktXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcXG4tLVxcbmZzL3BpZGZzLmMtMTE0NS1cXG5mcy9waWRmcy5jOjExNDY6XFx0cmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XFxuZnMvcGlkZnMuYy0xMTQ3LVxcdGlmIChyZXQpXFxuLS1cXG5mcy9waWRmcy5jLTExNTItXFxuZnMvcGlkZnMuYzoxMTUzOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3Rhc2hlZF9vcGVyYXRpb25zIHBpZGZzX3N0YXNoZWRfb3BzID0ge1xcbmZzL3BpZGZzLmM6MTE1NDpcXHQuc3Rhc2hfZGVudHJ5XFx0PSBwaWRmc19zdGFzaF9kZW50cnksXFxuZnMvcGlkZnMuYzoxMTU1OlxcdC5pbml0X2lub2RlXFx0PSBwaWRmc19pbml0X2lub2RlLFxcbmZzL3BpZGZzLmM6MTE1NjpcXHQucHV0X2RhdGFcXHQ9IHBpZGZzX3B1dF9kYXRhLFxcbmZzL3BpZGZzLmMtMTE1Ny19O1xcbmZzL3BpZGZzLmMtMTE1OC1cXG5mcy9waWRmcy5jOjExNTk6c3RhdGljIGludCBwaWRmc194YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvcGlkZnMuYy0xMTYwLVxcdFxcdFxcdCAgIHN0cnVjdCBkZW50cnkgKnVudXNlZCwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL3BpZGZzLmMtMTE2NS1cXG5mcy9waWRmcy5jOjExNjY6XFx0cmV0dXJuIHNpbXBsZV94YXR0cl9nZXQoXFx1MDAyNnBpZGZzX3hhX2NhY2hlLCBcXHUwMDI2cGlkLVxcdTAwM2VhdHRyLVxcdTAwM2V4YXR0cnMsIG5hbWUsIHZhbHVlLCBzaXplKTtcXG5mcy9waWRmcy5jLTExNjctfVxcbmZzL3BpZGZzLmMtMTE2OC1cXG5mcy9waWRmcy5jOjExNjk6c3RhdGljIGludCBwaWRmc194YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvcGlkZnMuYy0xMTcwLVxcdFxcdFxcdCAgIHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsXFxuLS1cXG5mcy9waWRmcy5jLTExODAtXFxuZnMvcGlkZnMuYzoxMTgxOlxcdG9sZF94YXR0ciA9IHNpbXBsZV94YXR0cl9zZXQoXFx1MDAyNnBpZGZzX3hhX2NhY2hlLCBcXHUwMDI2cGlkLVxcdTAwM2VhdHRyLVxcdTAwM2V4YXR0cnMsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7XFxuZnMvcGlkZnMuYy0xMTgyLVxcdGlmIChJU19FUlIob2xkX3hhdHRyKSlcXG4tLVxcbmZzL3BpZGZzLmMtMTE4OC1cXG5mcy9waWRmcy5jOjExODk6c3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIHBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlciA9IHtcXG5mcy9waWRmcy5jLTExOTAtXFx0LnByZWZpeCA9IFhBVFRSX1RSVVNURURfUFJFRklYLFxcbmZzL3BpZGZzLmM6MTE5MTpcXHQuZ2V0XFx0PSBwaWRmc194YXR0cl9nZXQsXFxuZnMvcGlkZnMuYzoxMTkyOlxcdC5zZXRcXHQ9IHBpZGZzX3hhdHRyX3NldCxcXG5mcy9waWRmcy5jLTExOTMtfTtcXG5mcy9waWRmcy5jLTExOTQtXFxuZnMvcGlkZnMuYzoxMTk1OnN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqY29uc3QgcGlkZnNfeGF0dHJfaGFuZGxlcnNbXSA9IHtcXG5mcy9waWRmcy5jOjExOTY6XFx0XFx1MDAyNnBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlcixcXG5mcy9waWRmcy5jLTExOTctXFx0TlVMTFxcbi0tXFxuZnMvcGlkZnMuYy0xMTk5LVxcbmZzL3BpZGZzLmM6MTIwMDpzdGF0aWMgaW50IHBpZGZzX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuZnMvcGlkZnMuYy0xMjAxLXtcXG4tLVxcbmZzL3BpZGZzLmMtMTIwOC1cXHRjdHgtXFx1MDAzZXNfZF9mbGFncyB8PSBEQ0FDSEVfRE9OVENBQ0hFO1xcbmZzL3BpZGZzLmM6MTIwOTpcXHRjdHgtXFx1MDAzZW9wcyA9IFxcdTAwMjZwaWRmc19zb3BzO1xcbmZzL3BpZGZzLmM6MTIxMDpcXHRjdHgtXFx1MDAzZWVvcHMgPSBcXHUwMDI2cGlkZnNfZXhwb3J0X29wZXJhdGlvbnM7XFxuZnMvcGlkZnMuYzoxMjExOlxcdGN0eC1cXHUwMDNlZG9wcyA9IFxcdTAwMjZwaWRmc19kZW50cnlfb3BlcmF0aW9ucztcXG5mcy9waWRmcy5jOjEyMTI6XFx0Y3R4LVxcdTAwM2V4YXR0ciA9IHBpZGZzX3hhdHRyX2hhbmRsZXJzO1xcbmZzL3BpZGZzLmM6MTIxMzpcXHRmYy1cXHUwMDNlc19mc19pbmZvID0gKHZvaWQgKilcXHUwMDI2cGlkZnNfc3Rhc2hlZF9vcHM7XFxuZnMvcGlkZnMuYy0xMjE0LVxcdHJldHVybiAwO1xcbi0tXFxuZnMvcGlkZnMuYy0xMjE2LVxcbmZzL3BpZGZzLmM6MTIxNzpzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcGlkZnNfdHlwZSA9IHtcXG5mcy9waWRmcy5jOjEyMTg6XFx0Lm5hbWVcXHRcXHRcXHQ9IFxcXCJwaWRmc1xcXCIsXFxuZnMvcGlkZnMuYzoxMjE5OlxcdC5pbml0X2ZzX2NvbnRleHRcXHQ9IHBpZGZzX2luaXRfZnNfY29udGV4dCxcXG5mcy9waWRmcy5jLTEyMjAtXFx0LmtpbGxfc2JcXHRcXHQ9IGtpbGxfYW5vbl9zdXBlcixcXG4tLVxcbmZzL3BpZGZzLmMtMTIyMi1cXG5mcy9waWRmcy5jOjEyMjM6c3RydWN0IGZpbGUgKnBpZGZzX2FsbG9jX2ZpbGUoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuZnMvcGlkZnMuYy0xMjI0LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTIzNC1cXG5mcy9waWRmcy5jOjEyMzU6XFx0cmV0ID0gcGF0aF9mcm9tX3N0YXNoZWQoXFx1MDAyNnBpZC1cXHUwMDNlc3Rhc2hlZCwgcGlkZnNfbW50LCBnZXRfcGlkKHBpZCksIFxcdTAwMjZwYXRoKTtcXG5mcy9waWRmcy5jLTEyMzYtXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLS1cXG5mcy9waWRmcy5jLTEyNDEtXFx0ZmxhZ3MgXFx1MDAyNj0gflBJREZEX1NUQUxFO1xcbmZzL3BpZGZzLmM6MTI0MjpcXHRyZXR1cm4gcGlkZnNfZGVudHJ5X29wZW4oXFx1MDAyNnBhdGgsIGZsYWdzLCBjdXJyZW50X2NyZWQoKSk7XFxuZnMvcGlkZnMuYy0xMjQzLX1cXG5mcy9waWRmcy5jLTEyNDQtXFxuZnMvcGlkZnMuYzoxMjQ1OnZvaWQgX19pbml0IHBpZGZzX2luaXQodm9pZClcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6MjY6NTkuMjQwODc4NjNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjIwOTYxMDQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIEZpbGVzeXN0ZW0gTW9kdWxlIEJ1aWxkIFByb2Nlc3MqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYHBpZGZzLm9gIGlzIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBrZXJuZWwgYnVpbGQuIFRoZSBmaXJzdCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgYGZzL01ha2VmaWxlYC4gU3BlY2lmaWNhbGx5LCBJJ20gemVyb2luZyBpbiBvbiBsaW5lIDE4LiBBaCwgdGhlcmUgaXQgaXM6IGBvYmoteSA6PSBvcGVuLm8gcmVhZF93cml0ZS5vIC4uLiBwaWRmcy5vIC4uLmAuICBTbyBgcGlkZnMub2AgaXMgYnVpbHQgdW5jb25kaXRpb25hbGx5IGFzIHBhcnQgb2YgdGhlIGNvcmUgYGZzL2AgZGlyZWN0b3J5LCBpbmRpY2F0ZWQgYnkgYG9iai15YC4gVGhhdCBjb25maXJtcyBpdCdzIGEgY3JpdGljYWwgY29tcG9uZW50LlxuXG5Ob3csIEknbSB0aGlua2luZywgSSB3YW50IHRvIHRyYWNlIHRoZSBkZXBlbmRlbmNpZXMgZnVydGhlciwgYW5kIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhhdCBgZnNfc3RydWN0LmNgIGlzIGJlaW5nIGluY2x1ZGVkIHByb3Blcmx5LiBJIHNob3VsZCBjaGVjayB0aGUgYGZzL01ha2VmaWxlYCBhZ2FpbiwgdGhpcyB0aW1lIGxvb2tpbmcgZm9yIGBmc19zdHJ1Y3Qub2Agb3IgYSBzaW1pbGFyIG9iamVjdCBmaWxlLiAgTGV0J3Mgc2NhbiB0aHJvdWdoIGxpbmVzIDEwIHRocm91Z2ggMjUgdG8gc2VlIGhvdyBpdCdzIGJlaW5nIGhhbmRsZWQuIFRoaXMgc2hvdWxkIGhlbHAgbWUgY29uZmlybSBpdHMgcmVsYXRpb25zaGlwIHRvIHRoZSBidWlsZCBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjk2NSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowMS44NjE4NDIyMjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NDQzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9NYWtlZmlsZVwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBmaWxlc3lzdGVtcy5cXG4gICA0OlxcdCNcXG4gICA1OlxcdCMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIFxcdTAwM2NoY2hAaW5mcmFkZWFkLm9yZ1xcdTAwM2VcXG4gICA2OlxcdCMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuXFxuICAgNzpcXHQjIFxcbiAgIDg6XFx0XFxuICAgOTpcXHRcXG4gIDEwOlxcdG9iai15IDo9XFx0b3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcXFxcXFxuICAxMTpcXHRcXHRcXHRjaGFyX2Rldi5vIHN0YXQubyBleGVjLm8gcGlwZS5vIG5hbWVpLm8gZmNudGwubyBcXFxcXFxuICAxMjpcXHRcXHRcXHRpb2N0bC5vIHJlYWRkaXIubyBzZWxlY3QubyBkY2FjaGUubyBpbm9kZS5vIFxcXFxcXG4gIDEzOlxcdFxcdFxcdGF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBcXFxcXFxuICAxNDpcXHRcXHRcXHRzZXFfZmlsZS5vIHhhdHRyLm8gbGliZnMubyBmcy13cml0ZWJhY2subyBcXFxcXFxuICAxNTpcXHRcXHRcXHRwbm9kZS5vIHNwbGljZS5vIHN5bmMubyB1dGltZXMubyBkX3BhdGgubyBcXFxcXFxuICAxNjpcXHRcXHRcXHRzdGFjay5vIGZzX3N0cnVjdC5vIHN0YXRmcy5vIGZzX3Bpbi5vIG5zZnMubyBcXFxcXFxuICAxNzpcXHRcXHRcXHRmc19kaXJlbnQubyBmc19jb250ZXh0Lm8gZnNfcGFyc2VyLm8gZnNvcGVuLm8gaW5pdC5vIFxcXFxcXG4gIDE4OlxcdFxcdFxcdGtlcm5lbF9yZWFkX2ZpbGUubyBtbnRfaWRtYXBwaW5nLm8gcmVtYXBfcmFuZ2UubyBwaWRmcy5vIFxcXFxcXG4gIDE5OlxcdFxcdFxcdGZpbGVfYXR0ci5vIGZzZXJyb3IubyBudWxsZnMubyBmYWlsZnMub1xcbiAgMjA6XFx0XFxuICAyMTpcXHRvYmotJChDT05GSUdfQlVGRkVSX0hFQUQpXFx0Kz0gYnVmZmVyLm8gbXBhZ2Uub1xcbiAgMjI6XFx0b2JqLSQoQ09ORklHX1BST0NfRlMpXFx0XFx0Kz0gcHJvY19uYW1lc3BhY2Uub1xcbiAgMjM6XFx0b2JqLSQoQ09ORklHX0xFR0FDWV9ESVJFQ1RfSU8pXFx0Kz0gZGlyZWN0LWlvLm9cXG4gIDI0OlxcdG9iai15XFx0XFx0XFx0XFx0Kz0gbm90aWZ5L1xcbiAgMjU6XFx0b2JqLSQoQ09ORklHX0VQT0xMKVxcdFxcdCs9IGV2ZW50cG9sbC5vXFxuICAyNjpcXHRvYmoteVxcdFxcdFxcdFxcdCs9IGFub25faW5vZGVzLm9cXG4gIDI3OlxcdG9iai0kKENPTkZJR19TSUdOQUxGRClcXHRcXHQrPSBzaWduYWxmZC5vXFxuICAyODpcXHRvYmotJChDT05GSUdfVElNRVJGRClcXHRcXHQrPSB0aW1lcmZkLm9cXG4gIDI5OlxcdG9iai0kKENPTkZJR19FVkVOVEZEKVxcdFxcdCs9IGV2ZW50ZmQub1xcbiAgMzA6XFx0b2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICArPSBhaW8ub1xcbiAgMzE6XFx0b2JqLSQoQ09ORklHX0ZTX0RBWClcXHRcXHQrPSBkYXgub1xcbiAgMzI6XFx0b2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFx0Kz0gY3J5cHRvL1xcbiAgMzM6XFx0b2JqLSQoQ09ORklHX0ZTX1ZFUklUWSlcXHRcXHQrPSB2ZXJpdHkvXFxuICAzNDpcXHRvYmotJChDT05GSUdfRklMRV9MT0NLSU5HKSAgICAgICs9IGxvY2tzLm9cXG4gIDM1OlxcdG9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcXHQrPSBiaW5mbXRfbWlzYy5vXFxuICAzNjpcXHRvYmotJChDT05GSUdfQklORk1UX01JU0NfQlBGKVxcdCs9IGJpbmZtdF9taXNjX2JwZi5vXFxuICAzNzpcXHRvYmotJChDT05GSUdfQklORk1UX1NDUklQVClcXHQrPSBiaW5mbXRfc2NyaXB0Lm9cXG4gIDM4OlxcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGKVxcdCs9IGJpbmZtdF9lbGYub1xcbiAgMzk6XFx0b2JqLSQoQ09ORklHX0NPTVBBVF9CSU5GTVRfRUxGKVxcdCs9IGNvbXBhdF9iaW5mbXRfZWxmLm9cXG4gIDQwOlxcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKVxcdCs9IGJpbmZtdF9lbGZfZmRwaWMub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowMS44NjE5MDg3NDlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTAxMTI2MTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgQ29yZSBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIHR3byBvYmplY3QgZmlsZXMsIGBmc19zdHJ1Y3Qub2AgYW5kIGBwaWRmcy5vYCwgYW5kIHRoZXkncmUgYm90aCBkZWNsYXJlZCBpbiBgb2JqLXlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhleSByZWxhdGUgdG8gdGhlIGJyb2FkZXIgYnVpbGQgcHJvY2VzcywgcGFydGljdWxhcmx5IGlmIHRoZXJlIGFyZSBhbnkgQ09ORklHIG9wdGlvbnMgYXQgcGxheS4gUmlnaHQsIGFuZCBJIGtub3cgYGtlcm5lbC9mb3JrLmNgIGlzIGFsc28gYSBjcml0aWNhbCBvYmplY3QuIFNvLCBJIHNlZSB0aGF0IGBrZXJuZWwvZm9yay5jYCBpcyBhIGNvcmUga2VybmVsIG9iamVjdCBpbiB0aGUga2VybmVsIE1ha2VmaWxlLCBqdXN0IGFzIGFyZSB0aGUgb3RoZXIgdHdvLlxuXG5UaGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgdGhlc2UgYXJlIGJ1aWx0IHVuY29uZGl0aW9uYWxseSBpbnRvIGB2bWxpbnV4YCBvciBpZiB0aGVyZSBhcmUgc3BlY2lmaWMgQ09ORklHIG9wdGlvbnMgdGhhdCBtaWdodCBjb250cm9sIHRoZWlyIGluY2x1c2lvbi4gTGV0J3Mgc2VlLi4uIEFoLCBnb29kLCBpdCBsb29rcyBsaWtlIGBwaWRmcy5vYCwgYGZzX3N0cnVjdC5vYCBhbmQgYGZvcmsub2AgKmFyZSogdW5jb25kaXRpb25hbGx5IGJ1aWx0IGludG8gdGhlIGZpbmFsIGB2bWxpbnV4YCBpbWFnZS4gVGhhdCBzaW1wbGlmaWVzIHRoaW5ncyBhIGJpdC5cblxuQnV0IHdhaXQsIGhvbGQgb24uIEV2ZW4gdGhvdWdoIHRoZXkncmUgYWx3YXlzIGJ1aWx0LCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIHNvdXJjZSBjb2RlIG9mIGVhY2ggZmlsZSwgc3BlY2lmaWNhbGx5IGluc2lkZSBgZnMvcGlkZnMuY2AgYW5kIGBmcy9mc19zdHJ1Y3QuY2AgYW5kIGBrZXJuZWwvZm9yay5jYCB0aGVtc2VsdmVzLCB0byBzZWUgaWYgdGhlcmUgYXJlICp3aXRoaW4qIHRob3NlIGZpbGVzLCBzcGVjaWZpYyBDT05GSUcgb3B0aW9ucyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIEknbSBpbnRlcmVzdGVkIGluLiBJIHNob3VsZCB6ZXJvIGluIG9uIHRoZSBhcmVhcyBhcm91bmQgcmVsYXRlZCBmdW5jdGlvbnMuIExldCdzIHN0YXJ0IHdpdGggYGZzL3BpZGZzLmNgIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9ucyBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYHBpZGZkX2lvY3RsYCwgYHBpZGZkX2dldF90YXNrX3BhdGhgLCBgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkYC4uLiBhbmQgc2VlIGlmIHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgYW55IENPTkZJRyBvcHRpb25zLiBUaGF0J3MgdGhlIHBydWRlbnQgYXBwcm9hY2ggaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgxNzgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowNS4zNjMwMzgwNDFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDA3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvcGlkZnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MjAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MjA6XFx0XFx0LyogRXh0ZW5zaWJsZSBpb2N0bHMgcmVxdWlyZSBzb21lIG1vcmUgY2FyZWZ1bCBjaGVja3MuICovXFxuIDUyMTpcXHRcXHRzd2l0Y2ggKF9JT0NfTlIoY21kKSkge1xcbiA1MjI6XFx0XFx0Y2FzZSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKTpcXG4gNTIzOlxcdFxcdFxcdC8qXFxuIDUyNDpcXHRcXHRcXHQgKiBUcnkgdG8gcHJldmVudCBwZXJmb3JtaW5nIGEgcGlkZmQgaW9jdGwgd2hlbiBzb21lb25lXFxuIDUyNTpcXHRcXHRcXHQgKiBlcnJvbm91c2x5IG1pc3Rvb2sgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaWRmZC5cXG4gNTI2OlxcdFxcdFxcdCAqIFRoaXMgaXMgbm90IHBlcmZlY3QgYnV0IHdpbGwgY2F0Y2ggbW9zdCBjYXNlcy5cXG4gNTI3OlxcdFxcdFxcdCAqL1xcbiA1Mjg6XFx0XFx0XFx0cmV0dXJuIGV4dGVuc2libGVfaW9jdGxfdmFsaWQoY21kLCBQSURGRF9HRVRfSU5GTywgUElERkRfSU5GT19TSVpFX1ZFUjApO1xcbiA1Mjk6XFx0XFx0fVxcbiA1MzA6XFx0XFxuIDUzMTpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDUzMjpcXHR9XFxuIDUzMzpcXHRcXG4gNTM0OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xcbiA1Mzc6XFx0XFx0XFx0dXBfcmVhZChcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4gNTM4OlxcdFxcdFxcdHB1dF90YXNrX3N0cnVjdCh0YXNrKTtcXG4gNTM5OlxcdFxcdH1cXG4gNTQwOlxcdH1cXG4gNTQxOlxcdFxcbiA1NDI6XFx0LypcXG4gNTQzOlxcdCAqIFJldHVybiBAcGlkJ3MgdGFzayB3aXRoIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBoZWxkLiBUaGUgcHRyYWNlIGNoZWNrXFxuIDU0NDpcXHQgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcXG4gNTQ1OlxcdCAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cXG4gNTQ2OlxcdCAqL1xcbiA1NDc6XFx0c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcXG4gNTQ4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGFyZylcXG4gNTQ5OlxcdHtcXG4gNTUwOlxcdFxcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cXG4gNTUxOlxcdFxcdFxcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcXG4gNTUyOlxcdFxcdGludCBlcnJvcjtcXG4gNTUzOlxcdFxcbiA1NTQ6XFx0XFx0aWYgKCF0YXNrKVxcbiA1NTU6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTtcXG4gNTU2OlxcdFxcbiA1NTc6XFx0XFx0aWYgKGFyZylcXG4gNTU4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiA1NTk6XFx0XFxuIDU2MDpcXHRcXHRlcnJvciA9IGRvd25fcmVhZF9raWxsYWJsZShcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4gNTYxOlxcdFxcdGlmIChlcnJvcilcXG4gNTYyOlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcXG4gNTYzOlxcdFxcbiA1NjQ6XFx0XFx0aWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7XFxuIDU2NTpcXHRcXHRcXHR1cF9yZWFkKFxcdTAwMjZ0YXNrLVxcdTAwM2VzaWduYWwtXFx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xcbiA1NjY6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XFxuIDU2NzpcXHRcXHR9XFxuIDU2ODpcXHRcXG4gNTY5OlxcdFxcdHJldHVybl9wdHIodGFzayk7XFxuIDU3MDpcXHR9XFxuIDU3MTpcXHRcXG4gNTcyOlxcdERFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosXFxuIDU3MzpcXHRcXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXFxuIDU3NDpcXHRcXHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXFxuIDU3NTpcXHRcXHQgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDU3NjpcXHRcXG4gNTc3OlxcdHN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcXG4gNTc4OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IGNtZCxcXG4gNTc5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDU4MDpcXHR7XFxuIDU4MTpcXHRcXHRzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMO1xcbiA1ODI6XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4gNTgzOlxcdFxcbiA1ODQ6XFx0XFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcXG4gNTg1OlxcdFxcdGlmIChJU19FUlIodGFzaykpXFxuIDU4NjpcXHRcXHRcXHRyZXR1cm4gRVJSX0NBU1QodGFzayk7XFxuIDU4NzpcXHRcXG4gNTg4OlxcdFxcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcXG4gNTg5OlxcdFxcdFxcdG5zcCA9IHRhc2stXFx1MDAzZW5zcHJveHk7XFxuIDU5MDpcXHRcXHRcXHRpZiAobnNwKVxcbiA1OTE6XFx0XFx0XFx0XFx0Z2V0X25zcHJveHkobnNwKTtcXG4gNTkyOlxcdFxcdH1cXG4gNTkzOlxcdFxcdGlmICghbnNwKVxcbiA1OTQ6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xcbiA1OTU6XFx0XFxuIDU5NjpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiA1OTc6XFx0XFx0LyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi9cXG4gNTk4OlxcdFxcdGNhc2UgUElERkRfR0VUX0NHUk9VUF9OQU1FU1BBQ0U6XFxuIDU5OTpcXHQjaWZkZWYgQ09ORklHX0NHUk9VUFNcXG4gNjAwOlxcdFxcdFxcdGlmICghbnNfcmVmX2dldChuc3AtXFx1MDAzZWNncm91cF9ucykpXFxuIDYwMTpcXHRcXHRcXHRcXHRicmVhaztcXG4gNjAyOlxcdFxcdFxcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihuc3AtXFx1MDAzZWNncm91cF9ucyk7XFxuIDYwMzpcXHQjZW5kaWZcXG4gNjA0OlxcdFxcdFxcdGJyZWFrO1xcbiA2MDU6XFx0XFx0Y2FzZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRTpcXG4gNjA2OlxcdCNpZmRlZiBDT05GSUdfSVBDX05TXFxuIDYwNzpcXHRcXHRcXHRpZiAoIW5zX3JlZl9nZXQobnNwLVxcdTAwM2VpcGNfbnMpKVxcbiA2MDg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDYwOTpcXHRcXHRcXHRuc19jb21tb24gPSB0b19uc19jb21tb24obnNwLVxcdTAwM2VpcGNfbnMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowNS4zNjMxNDE2ODFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzgxMjgxNjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gYGZzL3BpZGZzLmNgIC0gTGluZXMgNjYwLTc0NSoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBUaGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBzdWdnZXN0cyB0aGVyZSdzIHNvbWV0aGluZyBzcGVjaWZpYyBnb2luZyBvbiBpbiB0aGUgUElEIG5hbWVzcGFjZSBmaWxlc3lzdGVtLCBhbmQgbXkgZ3V0IGZlZWxpbmcgdGVsbHMgbWUgdGhlIGNvcmUgaXNzdWUgbGllcyB3aXRoaW4gdGhpcyByYW5nZTogbGluZXMgNjYwIHRvIDc0NSBvZiBgZnMvcGlkZnMuY2AuIEknbSBnb2luZyB0byBmb2N1cyBpbiBhbmQgbWV0aWN1bG91c2x5IHBhcnNlIHRoaXMgc2VjdGlvbi4gSSBrbm93IHRoaXMgYXJlYSBkZWFscyB3aXRoIFBJRCBoYW5kbGluZywgcHJvYmFibHkgd2l0aCBkaXJlY3RvcnkgYW5kIGZpbGUgY3JlYXRpb24sIGRlbGV0aW9uIG9yIHBvc3NpYmx5IGF0dHJpYnV0ZSBvcGVyYXRpb25zIGFuZCBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc3RydWN0dXJlcyBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgb3IgYWNjZXNzIGNvbnRyb2wgdnVsbmVyYWJpbGl0aWVzLCBpZiBhbnkuIEknbGwgbmVlZCB0byBwYXJzZSB0aGUgaW50ZXJhY3Rpb25zIHdpdGggUElEIG51bWJlcnMsIGFuZCBmaWd1cmUgb3V0IGhvdyBwcm9jZXNzIElEcyBhcmUgbWFwcGVkLCB0cmFja2VkLCBhbmQgZXhwb3NlZCBpbiB0aGlzIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0uIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIGFueSBzcG90cyB3aGVyZSB0aGUgUElEIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyBub3QgYmVpbmcgY29ycmVjdGx5IHZhbGlkYXRlZCBvciBzeW5jaHJvbml6ZWQuIEFueSB1bmNoZWNrZWQgcGF0aHMgb3IgaW5jb3JyZWN0IGxvZ2ljIGNvdWxkIGxlYWQgdG8gdGhlIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiB0aGUgaXNzdWUsIGV2ZW4gaWYgaXQgc2VlbXMgdW5saWtlbHkgYXQgZmlyc3QgZ2xhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDEwNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MDcuNzQ0NDI1MjExWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNTcxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9waWRmcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDY2MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDY2MDpcXHRcXHRcXHRcXHRcXHRuc19jb21tb24gPSB0b19uc19jb21tb24odXNlcl9ucyk7XFxuIDY2MTpcXHRcXHRcXHR9XFxuIDY2MjpcXHQjZW5kaWZcXG4gNjYzOlxcdFxcdFxcdGJyZWFrO1xcbiA2NjQ6XFx0XFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcXG4gNjY1OlxcdCNpZmRlZiBDT05GSUdfUElEX05TXFxuIDY2NjpcXHRcXHRcXHRzY29wZWRfZ3VhcmQocmN1KSB7XFxuIDY2NzpcXHRcXHRcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zO1xcbiA2Njg6XFx0XFxuIDY2OTpcXHRcXHRcXHRcXHRwaWRfbnMgPSB0YXNrX2FjdGl2ZV9waWRfbnModGFzayk7XFxuIDY3MDpcXHRcXHRcXHRcXHRpZiAobnNfcmVmX2dldChwaWRfbnMpKVxcbiA2NzE6XFx0XFx0XFx0XFx0XFx0bnNfY29tbW9uID0gdG9fbnNfY29tbW9uKHBpZF9ucyk7XFxuIDY3MjpcXHRcXHRcXHR9XFxuIDY3MzpcXHQjZW5kaWZcXG4gNjc0OlxcdFxcdFxcdGJyZWFrO1xcbiA2NzU6XFx0XFx0ZGVmYXVsdDpcXG4gNjc2OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7XFxuIDY3NzpcXHRcXHR9XFxuIDY3ODpcXHRcXG4gNjc5OlxcdFxcdGlmICghbnNfY29tbW9uKVxcbiA2ODA6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApO1xcbiA2ODE6XFx0XFxuIDY4MjpcXHRcXHRyZXR1cm4gbnNfY29tbW9uO1xcbiA2ODM6XFx0fVxcbiA2ODQ6XFx0XFxuIDY4NTpcXHRzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLFxcbiA2ODY6XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgcGF0aCAqcGF0aClcXG4gNjg3OlxcdHtcXG4gNjg4OlxcdFxcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XFxuIDY4OTpcXHRcXG4gNjkwOlxcdFxcdGlmIChJU19FUlIodGFzaykpXFxuIDY5MTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih0YXNrKTtcXG4gNjkyOlxcdFxcbiA2OTM6XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gNjk0OlxcdFxcdGNhc2UgUElERkRfR0VUX0VYRTpcXG4gNjk1OlxcdFxcdFxcdHJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTtcXG4gNjk2OlxcdFxcdGNhc2UgUElERkRfR0VUX0NXRDpcXG4gNjk3OlxcdFxcdFxcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XFxuIDY5ODpcXHRcXHRjYXNlIFBJREZEX0dFVF9ST09UOlxcbiA2OTk6XFx0XFx0XFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XFxuIDcwMDpcXHRcXHR9XFxuIDcwMTpcXHRcXG4gNzAyOlxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA3MDM6XFx0fVxcbiA3MDQ6XFx0XFxuIDcwNTpcXHRzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDcwNjpcXHR7XFxuIDcwNzpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xcbiA3MDg6XFx0XFx0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XFxuIDcwOTpcXHRcXHRpbnQgZXJyb3I7XFxuIDcxMDpcXHRcXG4gNzExOlxcdFxcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcXG4gNzEyOlxcdFxcdFxcdHJldHVybiAtRU5PSU9DVExDTUQ7XFxuIDcxMzpcXHRcXG4gNzE0OlxcdFxcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcXG4gNzE1OlxcdFxcdFxcdGlmICghYXJnKVxcbiA3MTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDcxNzpcXHRcXG4gNzE4OlxcdFxcdFxcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XFxuIDcxOTpcXHRcXG4gNzIwOlxcdFxcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbiA3MjE6XFx0XFx0fVxcbiA3MjI6XFx0XFxuIDcyMzpcXHRcXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4gNzI0OlxcdFxcdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXFxuIDcyNTpcXHRcXHRcXHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XFxuIDcyNjpcXHRcXG4gNzI3OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDcyODpcXHRcXHRjYXNlIFBJREZEX0dFVF9FWEU6XFxuIDcyOTpcXHRcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuIDczMDpcXHRcXHRjYXNlIFBJREZEX0dFVF9ST09UOlxcbiA3MzE6XFx0XFx0XFx0ZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsIFxcdTAwMjZwYXRoKTtcXG4gNzMyOlxcdFxcdFxcdGlmIChlcnJvcilcXG4gNzMzOlxcdFxcdFxcdFxcdHJldHVybiBlcnJvcjtcXG4gNzM0OlxcdFxcbiA3MzU6XFx0XFx0XFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXFxuIDczNjpcXHRcXHRcXHRcXHQgICAgICBkZW50cnlfb3BlbihcXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xcbiA3Mzc6XFx0XFx0fVxcbiA3Mzg6XFx0XFxuIDczOTpcXHRcXHRuc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpO1xcbiA3NDA6XFx0XFx0aWYgKElTX0VSUihuc19jb21tb24pKVxcbiA3NDE6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcXG4gNzQyOlxcdFxcbiA3NDM6XFx0XFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xcbiA3NDQ6XFx0XFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XFxuIDc0NTpcXHR9XFxuIDc0NjpcXHRcXG4gNzQ3OlxcdCNpZmRlZiBDT05GSUdfQ09NUEFUXFxuIDc0ODpcXHRzdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXFxuIDc0OTpcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI3OjA3Ljc0NDYzNDE0MVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDE0MDY0NDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgU3ltYm9sIEV4cG9zdXJlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdmVyaWZ5IHdoaWNoIHN5bWJvbHMgYXJlICpub3QqIHN0YXRpYywgYXMgdGhvc2UgYXJlIHRoZSBvbmVzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwb3NlZC4gSSdsbCBzdGFydCBieSBjaGVja2luZyB0aGUgaW5pdGlhbCBsaXN0OiBgZ2V0X3Rhc2tfcm9vdGAgaW4gYGZzL2ZzX3N0cnVjdC5jYCwgYGdldF90YXNrX3B3ZGAgaW4gYGZzL2ZzX3N0cnVjdC5jYCwgYGdldF90YXNrX2V4ZV9wYXRoYCBpbiBga2VybmVsL2ZvcmsuY2AsIGFuZCB0aGVuIHRoZXJlJ3MgYHBpZGZkX2lvY3RsYCBpbiBgZnMvcGlkZnMuY2Agd2hpY2gsIGV2ZW4gdGhvdWdoIGl0J3MgdGVjaG5pY2FsbHkgc3RhdGljLCBpcyBwYXJ0IG9mIGBmaWxlX29wZXJhdGlvbnMudW5sb2NrZWRfaW9jdGxgIC0gYSBwb3RlbnRpYWwgbG9vcGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgb3RoZXIgbm9uLXN0YXRpYyBzeW1ib2xzLlxuXG5JJ2xsIGNvbmZpcm0gdGhlIGxpc3QgYnkgZG91YmxlLWNoZWNraW5nIHRoZSBkZWZpbml0aW9uIG9mIGFsbCB0aGUgc3ltYm9scy4gSXQgbG9va3MgbGlrZSBpdCBjb25maXJtcyB0aGF0IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYy4gR29vZC4gQXJlIHRoZXJlIGFueSBvdGhlciByZWxldmFudCBzeW1ib2xzIGx1cmtpbmcgaW4gdGhlIHNoYWRvd3M/XG5cbk5vdywgbGV0J3MgdGFrZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSBsb29rIGF0IGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgY2hhbmdlZCBpbiB0aGUgZGlmZi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV0YWlscyBhcmUuIEknbGwgbWFrZSBhIGxpc3QgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UgcG9wcyBvdXQ6XG5cbjEuICBgZ2V0X3Rhc2tfcm9vdGAgKGZzL2ZzX3N0cnVjdC5jKVxuMi4gIGBnZXRfdGFza19wd2RgIChmcy9mc19zdHJ1Y3QuYylcbjMuICBgZ2V0X3Rhc2tfZXhlX3BhdGhgIChrZXJuZWwvZm9yay5jKVxuNC4gIGBwaWRmcy5jYDogQWxsIHRoZSBzdGF0aWMgZnVuY3Rpb25zIHRoYXQgd2VyZSBsaXN0ZWQuXG41LiAgYGZzL3Byb2MvYmFzZS5jYDogYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AuXG42LiAgYHNlY3VyaXR5L2FwcGFybW9yL3Rhc2suY2A6IGBnZXRfY3VycmVudF9leGVfcGF0aGAuXG5cbkkgc2VlIHRoYXQgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AsIGFuZCBgZ2V0X2N1cnJlbnRfZXhlX3BhdGhgIG1pZ2h0IHdhcnJhbnQgYSBzZWNvbmQgbG9vay5cblxuRmluYWxseSwgYSBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBrZXJuZWwgY29uZmlnIGRlcGVuZGVuY2llcyB0aGF0IHJlbGF0ZSB0byBgUElERkRgLCBgUElERlNgLCBvciBgQVBQQVJNT1JgLiBJJ2xsIHNlYXJjaCB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGNvbnRleHQgYW5kIHBvdGVudGlhbCBleHBvc3VyZSBwb2ludHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjY0LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDM3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTEuNzU4NzAyNTExWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MzI3NzUxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJQSURGU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmhhbmRsZS5jPTE3MD1zdGF0aWMgaW50IGdldF9wYXRoX2FuY2hvcihpbnQgZmQsIHN0cnVjdCBwYXRoICpyb290KVxcbi0tXFxuZnMvZmhhbmRsZS5jLTE4NS1cXG5mcy9maGFuZGxlLmM6MTg2OlxcdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XFxuZnMvZmhhbmRsZS5jLTE4Ny1cXHRcXHRwaWRmc19nZXRfcm9vdChyb290KTtcXG4tLVxcbmZzL3BpZGZzLmMtMzUtXFxuZnMvcGlkZnMuYzozNjojZGVmaW5lIFBJREZTX1BJRF9ERUFEIEVSUl9QVFIoLUVTUkNIKVxcbmZzL3BpZGZzLmMtMzctXFxuLS1cXG5mcy9waWRmcy5jPTUwPWVudW0gcGlkZnNfYXR0cl9tYXNrX2JpdHMge1xcbmZzL3BpZGZzLmM6NTE6XFx0UElERlNfQVRUUl9CSVRfRVhJVFxcdD0gMCxcXG5mcy9waWRmcy5jOjUyOlxcdFBJREZTX0FUVFJfQklUX0NPUkVEVU1QXFx0PSAxLFxcbmZzL3BpZGZzLmMtNTMtfTtcXG4tLVxcbmZzL3BpZGZzLmM9MzY2PXN0YXRpYyBsb25nIHBpZGZkX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZnMvcGlkZnMuYy0zOTYtXFx0aWYgKG1hc2sgXFx1MDAyNiBQSURGRF9JTkZPX0VYSVQpIHtcXG5mcy9waWRmcy5jOjM5NzpcXHRcXHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXFx1MDAyNmF0dHItXFx1MDAzZWF0dHJfbWFzaykpIHtcXG5mcy9waWRmcy5jLTM5OC1cXHRcXHRcXHRzbXBfcm1iKCk7XFxuLS1cXG5mcy9waWRmcy5jLTQwOC1cXHRpZiAobWFzayBcXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIHtcXG5mcy9waWRmcy5jOjQwOTpcXHRcXHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spKSB7XFxuZnMvcGlkZnMuYy00MTAtXFx0XFx0XFx0c21wX3JtYigpO1xcbi0tXFxuZnMvcGlkZnMuYz04MTQ9dm9pZCBwaWRmc19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxuZnMvcGlkZnMuYy04MzMtXFx0XFx0XFx0ICovXFxuZnMvcGlkZnMuYzo4MzQ6XFx0XFx0XFx0cGlkLVxcdTAwM2VhdHRyID0gUElERlNfUElEX0RFQUQ7XFxuZnMvcGlkZnMuYy04MzUtXFx0XFx0XFx0cmV0dXJuO1xcbi0tXFxuZnMvcGlkZnMuYy04NTYtXFx0c21wX3dtYigpO1xcbmZzL3BpZGZzLmM6ODU3OlxcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXFx1MDAyNmF0dHItXFx1MDAzZWF0dHJfbWFzayk7XFxuZnMvcGlkZnMuYy04NTgtfVxcbi0tXFxuZnMvcGlkZnMuYz04NjE9dm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbi0tXFxuZnMvcGlkZnMuYy04NjgtXFx0VkZTX1dBUk5fT05fT05DRSghYXR0cik7XFxuZnMvcGlkZnMuYzo4Njk6XFx0VkZTX1dBUk5fT05fT05DRShhdHRyID09IFBJREZTX1BJRF9ERUFEKTtcXG5mcy9waWRmcy5jLTg3MC1cXG4tLVxcbmZzL3BpZGZzLmMtODc5LVxcdHNtcF93bWIoKTtcXG5mcy9waWRmcy5jOjg4MDpcXHRzZXRfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKTtcXG5mcy9waWRmcy5jLTg4MS19XFxuLS1cXG5mcy9waWRmcy5jPTk2Mj1zdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcXG4tLVxcbmZzL3BpZGZzLmMtOTczLVxcdFxcdHJldHVybiBOVUxMO1xcbmZzL3BpZGZzLmM6OTc0OlxcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKSlcXG5mcy9waWRmcy5jLTk3NS1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tLVxcbmZzL3BpZGZzLmM9MTEwMz1pbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcXG4tLVxcbmZzL3BpZGZzLmMtMTExMy1cXHRhdHRyID0gUkVBRF9PTkNFKHBpZC1cXHUwMDNlYXR0cik7XFxuZnMvcGlkZnMuYzoxMTE0OlxcdGlmICh1bmxpa2VseShhdHRyID09IFBJREZTX1BJRF9ERUFEKSlcXG5mcy9waWRmcy5jOjExMTU6XFx0XFx0cmV0dXJuIFBUUl9FUlIoUElERlNfUElEX0RFQUQpO1xcbmZzL3BpZGZzLmMtMTExNi1cXHRpZiAoYXR0cilcXG4tLVxcbmZzL3BpZGZzLmMtMTEyOC1cXHRhdHRyID0gcGlkLVxcdTAwM2VhdHRyO1xcbmZzL3BpZGZzLmM6MTEyOTpcXHRpZiAodW5saWtlbHkoYXR0ciA9PSBQSURGU19QSURfREVBRCkpXFxuZnMvcGlkZnMuYzoxMTMwOlxcdFxcdHJldHVybiBQVFJfRVJSKFBJREZTX1BJRF9ERUFEKTtcXG5mcy9waWRmcy5jLTExMzEtXFx0aWYgKHVubGlrZWx5KGF0dHIpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzoxMS44MzE5ODU2MThaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzMyNDMwNTM3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQaWRmZCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIGBwaWRmc2AgaXMgYnVpbHQtaW4sIG5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkLCB3aGljaCBpcyBnb29kLiBUaGUgYWJzZW5jZSBvZiBjb25maWcgb3B0aW9ucywgc3BlY2lmaWNhbGx5IHdoZW4gYEVuYWJsZUNvbmZpZ3NgIGlzIGFuIGVtcHR5IGxpc3Qgb3IgbnVsbCwgc2ltcGxpZmllcyB0aGluZ3MuIExldCdzIG1vdmUgb250byB0aGUgc3BlY2lmaWNzLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IHRoZSBwYXRjaCBpbXBhY3RzIHRoZXNlIFwiRm9jdXNTeW1ib2xzXCI6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgLlxuXG5JJ3ZlIGNhcmVmdWxseSBkb3VibGUtY2hlY2tlZCB0aGUgcGF0Y2ggZm9yIGFueSBvdGhlciBleHBvcnRlZCBvciBjaGFuZ2VkIG5vbi1zdGF0aWMgZnVuY3Rpb25zLiBTcGVjaWZpY2FsbHksIGluIGBmcy9mc19zdHJ1Y3QuY2AsIEkgc2VlIGBnZXRfdGFza19yb290YCBhbmQgYGdldF90YXNrX3B3ZGAuIEluIGBrZXJuZWwvZm9yay5jYCwgdGhlcmUncyBgZ2V0X3Rhc2tfZXhlX3BhdGhgLiBJbnNpZGUgYGZzL3BpZGZzLmNgLCBhbGwgdGhlIG5ldyBhZGRpdGlvbnMgYXJlIHN0YXRpYyDigJMgbm8gaXNzdWVzIHRoZXJlLiBBbHNvIGluIGBmcy9wcm9jL2Jhc2UuY2AsIGBwcm9jX2N3ZF9saW5rYCwgYHByb2NfZXhlX2xpbmtgIGFyZSBzdGF0aWMgYW5kIHRoZSBzYW1lIGdvZXMgZm9yIGBzZWN1cml0eS9hcHBhcm1vci90YXNrLmNgIHdpdGggdGhlIGBnZXRfY3VycmVudF9leGVfcGF0aGAgZnVuY3Rpb24uXG5cblRoZXJlZm9yZSwgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSBwcmVjaXNlbHk6XG4tIGBnZXRfdGFza19yb290YFxuLSBgZ2V0X3Rhc2tfcHdkYFxuLSBgZ2V0X3Rhc2tfZXhlX3BhdGhgXG5cblRvIGNsYXJpZnksIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0aGUgbmV3IGBwaWRmZGAgaW9jdGxzOiBgUElERkRfR0VUX0VYRWAsIGBQSURGRF9HRVRfQ1dEYCwgYW5kIGBQSURGRF9HRVRfUk9PVGAuIFRoZXNlIGFsbG93IHVzZXJzcGFjZSB0byBnZXQgYE9fUEFUSGAgZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSB0YXJnZXQgdGFzaydzIGV4ZWN1dGFibGUsIHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnksIGFsb25nIHdpdGggdGhvc2UgaGVscGVyIGZ1bmN0aW9ucyBJIGxpc3RlZC4gVGhlcmUgaXMgYWxzbyBhIHJlZmFjdG9yaW5nIG9mIGxvY2tlZCBwaWRmZCBvcGVyYXRpb25zIHdpdGggYGV4ZWNfdXBkYXRlX2xvY2tgLiBUaGlzICpkb2VzKiBpbXBhY3QgY29yZSBWRlMvcGlkZmQgZnVuY3Rpb25hbGl0eSwgcGFydGljdWxhcmx5IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIHNldHVwcyDigJMgdGhhdCBpcyBhbHNvIHdoYXQgSSBleHBlY3RlZC5cblxuTXkgcmVhc29uaW5nIGhvbGRzLiBFdmVyeXRoaW5nIHNlZW1zIGNsZWFuLCB0aG9yb3VnaGx5IGNoZWNrZWQuIEknbSBzYXRpc2ZpZWQgYW5kIHJlYWR5IHRvIHByb2NlZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNzE1LCJPdXRwdXRUb2tlbnMiOjE2OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzoxOS4xNTYyOTM2NTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjA1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF90YXNrX3Jvb3RcIixcbiAgICBcImdldF90YXNrX3B3ZFwiLFxuICAgIFwiZ2V0X3Rhc2tfZXhlX3BhdGhcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MncyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3Rhc2tfcm9vdFwiLFxuICAgIFwiZ2V0X3Rhc2tfcHdkXCIsXG4gICAgXCJnZXRfdGFza19leGVfcGF0aFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcydzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTkuMTU2MzIyODM5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTMxNzkwNzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTkuMTU2Nzg5Njc5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6ODUzMTMxOTg2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cXG5cXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcXG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxcbiAgIC0gQWxsIHN0YWNrIHZhcmlhYmxlcyAoZS5nLiwgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9YCkgYXJlIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZC5cXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXFxuXFxuMi4gS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eTpcXG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxcbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGM4ZTI1MmE5NzJmYzAwMzhlNzgwNTYxNGE3ZjFiNDcyYjMxNThjNjdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2ZzX3N0cnVjdC5jIGIvZnMvZnNfc3RydWN0LmNcbmluZGV4IDM0Njk5ZjNiNmY4ODEuLjVjNzcyODk2MjYwYTQgMTAwNjQ0XG4tLS0gYS9mcy9mc19zdHJ1Y3QuY1xuKysrIGIvZnMvZnNfc3RydWN0LmNcbkBAIC0xMCw2ICsxMCw1MCBAQFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJtb3VudC5oXCJcbiBcbisvKipcbisgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHJvb3QgcGF0aFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAcm9vdDogVGhlIHRhc2sncyByb290IHBhdGguXG4rICpcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGVcbisgKiBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4re1xuK1x0aW50IHJldCA9IC1FTk9FTlQ7XG4rXG4rXHR0YXNrX2xvY2sodGFzayk7XG4rXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4rXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4rXHRcdHJldCA9IDA7XG4rXHR9XG4rXHR0YXNrX3VubG9jayh0YXNrKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyB3b3JraW5nIGRpcmVjdG9yeVxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAcHdkOiBUaGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LlxuKyAqXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuK3tcbitcdGludCByZXQgPSAtRU5PRU5UO1xuK1xuK1x0dGFza19sb2NrKHRhc2spO1xuK1x0aWYgKHRhc2stXHUwMDNlcmVhbF9mcykge1xuK1x0XHRnZXRfZnNfcHdkKHRhc2stXHUwMDNlcmVhbF9mcywgcHdkKTtcbitcdFx0cmV0ID0gMDtcbitcdH1cbitcdHRhc2tfdW5sb2NrKHRhc2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4gLypcbiAgKiBSZXBsYWNlIHRoZSBmcy1cdTAwM2V7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLlxuICAqIEl0IGNhbiBibG9jay5cbmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuY1xuaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDRcbi0tLSBhL2ZzL3BpZGZzLmNcbisrKyBiL2ZzL3BpZGZzLmNcbkBAIC00LDYgKzQsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2V4cG9ydGZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZnNfc3RydWN0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb3VudC5oXHUwMDNlXG5AQCAtNTEwLDYgKzUxMSw5IEBAIHN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpXG4gXHRjYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOlxuIFx0Y2FzZSBQSURGRF9HRVRfVVNFUl9OQU1FU1BBQ0U6XG4gXHRjYXNlIFBJREZEX0dFVF9QSURfTkFNRVNQQUNFOlxuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuK1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiBcdFx0cmV0dXJuIHRydWU7XG4gXHR9XG4gXG5AQCAtNTI3LDYyICs1MzEsNjcgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcbiBcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4tc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDtcbi1cdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuLVx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuLVxuLVx0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuLVx0XHRpZiAoIWFyZylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbi1cdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbitcdGlmICghSVNfRVJSX09SX05VTEwodGFzaykpIHtcbitcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbitcdFx0cHV0X3Rhc2tfc3RydWN0KHRhc2spO1xuIFx0fVxuK31cbiBcbi1cdC8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqL1xuLVx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbi1cdFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xuKy8qXG4rICogUmV0dXJuIEBwaWQncyB0YXNrIHdpdGggQHRhc2sncyBleGVjX3VwZGF0ZV9sb2NrIGhlbGQuIFRoZSBwdHJhY2UgY2hlY2tcbisgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcbisgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuXG4rICovXG4rc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcbitcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPVxuK1x0XHRnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7XG4rXHRpbnQgZXJyb3I7XG4gXG4tXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xuIFx0aWYgKCF0YXNrKVxuLVx0XHRyZXR1cm4gLUVTUkNIO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRVNSQ0gpO1xuIFxuIFx0aWYgKGFyZylcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0Lypcbi1cdCAqIFdlJ3JlIHRyeWluZyB0byBvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBuYW1lc3BhY2Ugc28gcGVyZm9ybSBhXG4tXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlXG4tXHQgKiBkdXJhdGlvbiBvZiB0aGUgcHRyYWNlIGNoZWNrIGFuZCB0aGUgbmFtZXNwYWNlIGxvb2t1cCBzbyB0aGF0IHRoZVxuLVx0ICogY3JlZGVudGlhbHMgdXNlZCBmb3IgdGhlIGFjY2VzcyBkZWNpc2lvbiBtYXRjaCB0aG9zZSBvZiBAdGFzayBhdCB0aGVcbi1cdCAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tXG4tXHQgKiBzd2FwcGluZyB0aGUgdGFzaydzIGNyZWRlbnRpYWxzIGluIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgdXNlLiBXZVxuLVx0ICogbWlycm9yIG5zZnMgYmVoYXZpb3IuXG4tXHQgKi9cbiBcdGVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIFx0aWYgKGVycm9yKVxuLVx0XHRyZXR1cm4gZXJyb3I7XG4rXHRcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcbiBcbiBcdGlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkge1xuLVx0XHRlcnJvciA9IC1FQUNDRVM7XG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XG4gXHR9XG4gXG4rXHRyZXR1cm5fcHRyKHRhc2spO1xuK31cbitcbitERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuK1x0ICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLFxuK1x0ICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLFxuK1x0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcbitcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuK1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3tcbitcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4rXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuK1xuK1x0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbitcdGlmIChJU19FUlIodGFzaykpXG4rXHRcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcbitcbiBcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiBcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIFx0XHRpZiAobnNwKVxuIFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gXHR9XG4tXHRpZiAoIW5zcCkge1xuLVx0XHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4rXHRpZiAoIW5zcClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xuIFxuIFx0c3dpdGNoIChjbWQpIHtcbiBcdC8qIE5hbWVzcGFjZXMgdGhhdCBoYW5nIG9mIG5zcHJveHkuICovXG5AQCAtNjY0LDE2ICs2NzMsNzIgQEAgc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuICNlbmRpZlxuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4tXHRcdGVycm9yID0gLUVOT0lPQ1RMQ01EO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpO1xuIFx0fVxuIFxuLVx0aWYgKCFlcnJvciBcdTAwMjZcdTAwMjYgIW5zX2NvbW1vbilcbi1cdFx0ZXJyb3IgPSAtRU9QTk9UU1VQUDtcbitcdGlmICghbnNfY29tbW9uKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4gXG4tb3V0X3VubG9jazpcbi1cdHVwX3JlYWQoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbitcdHJldHVybiBuc19jb21tb247XG4rfVxuK1xuK3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgcGF0aCAqcGF0aClcbit7XG4rXHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuK1xuK1x0aWYgKElTX0VSUih0YXNrKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIodGFzayk7XG4rXG4rXHRzd2l0Y2ggKGNtZCkge1xuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0XHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7XG4rXHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4rXHRcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4rXHRjYXNlIFBJREZEX0dFVF9ST09UOlxuK1x0XHRyZXR1cm4gZ2V0X3Rhc2tfcm9vdCh0YXNrLCBwYXRoKTtcbitcdH1cbitcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbitcbitzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcbitcdHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xuK1x0aW50IGVycm9yO1xuK1xuK1x0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuK1x0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuK1xuK1x0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuK1x0XHRpZiAoIWFyZylcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbitcbitcdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbitcdH1cbitcbitcdC8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqL1xuK1x0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbitcdFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xuK1xuK1x0c3dpdGNoIChjbWQpIHtcbitcdGNhc2UgUElERkRfR0VUX0VYRTpcbitcdGNhc2UgUElERkRfR0VUX0NXRDpcbitcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4rXHRcdGVycm9yID0gcGlkZmRfZ2V0X3Rhc2tfcGF0aChwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnLCBcdTAwMjZwYXRoKTtcbitcdFx0aWYgKGVycm9yKVxuK1x0XHRcdHJldHVybiBlcnJvcjtcbitcbitcdFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXG4rXHRcdFx0ICAgICAgZGVudHJ5X29wZW4oXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xuK1x0fVxuK1xuK1x0bnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTtcbitcdGlmIChJU19FUlIobnNfY29tbW9uKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcbiBcbiBcdC8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi9cbiBcdHJldHVybiBvcGVuX25hbWVzcGFjZShuc19jb21tb24pO1xuZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmNcbmluZGV4IDZhMzlkZTQyNGY2MmEuLjdlMmMwNTM4MzIzY2MgMTAwNjQ0XG4tLS0gYS9mcy9wcm9jL2Jhc2UuY1xuKysrIGIvZnMvcHJvYy9iYXNlLmNcbkBAIC0yMDYsMzEgKzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcyxcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4te1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4tXHRcdHJlc3VsdCA9IDA7XG4tXHR9XG4tXHR0YXNrX3VubG9jayh0YXNrKTtcbi1cdHJldHVybiByZXN1bHQ7XG4tfVxuLVxuIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuIFx0XHRcdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwYXRoKTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbitcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgcHJvY19yb290X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCxcbkBAIC0xNzYxLDE2ICsxNzQwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfc2V0X2NvbW1fb3BlcmF0aW9ucyA9IHtcbiBzdGF0aWMgaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgsXG4gXHRcdFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4tXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7XG4tXG4tXHRleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xuLVx0aWYgKGV4ZV9maWxlKSB7XG4tXHRcdCpleGVfcGF0aCA9IGV4ZV9maWxlLVx1MDAzZWZfcGF0aDtcbi1cdFx0cGF0aF9nZXQoXHUwMDI2ZXhlX2ZpbGUtXHUwMDNlZl9wYXRoKTtcbi1cdFx0ZnB1dChleGVfZmlsZSk7XG4tXHRcdHJldHVybiAwO1xuLVx0fSBlbHNlXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIGV4ZV9wYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBjYWxsX3Byb2NfZ2V0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aF9vdXQpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG5AQCAtNDIsNiArNDIsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2ZzX3B3ZChzdHJ1Y3QgZnNfc3RydWN0ICpmcywgc3RydWN0IHBhdGggKnB3ZClcbiBcdHJlYWRfc2VxdW5sb2NrX2V4Y2woXHUwMDI2ZnMtXHUwMDNlc2VxKTtcbiB9XG4gXG4raW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCk7XG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xuK1xuIHN0cnVjdCBmc19zdHJ1Y3QgKnN3aXRjaF9mc19zdHJ1Y3Qoc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKTtcbiBcbiBleHRlcm4gYm9vbCBjdXJyZW50X2Nocm9vdGVkKHZvaWQpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaFxuaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbW0uaFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXG5AQCAtNDIzOSw2ICs0MjM5LDcgQEAgZXh0ZXJuIGludCBzZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xuIGV4dGVybiBpbnQgcmVwbGFjZV9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTtcbitpbnQgZ2V0X3Rhc2tfZXhlX3BhdGgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgpO1xuIFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5AQCAtMTIxLDQgKzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7XG4gI2RlZmluZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTApXG4gI2RlZmluZSBQSURGRF9HRVRfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgIF9JT1dSKFBJREZTX0lPQ1RMX01BR0lDLCAxMSwgc3RydWN0IHBpZGZkX2luZm8pXG4gXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIGV4ZWN1dGFibGUuICovXG4rI2RlZmluZSBQSURGRF9HRVRfRVhFICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTIpXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xuKyNkZWZpbmUgUElERkRfR0VUX0NXRCAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEzKVxuKy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2sncyByb290IGRpcmVjdG9yeS4gKi9cbisjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNClcbitcbiAjZW5kaWYgLyogX1VBUElfTElOVVhfUElERkRfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXG5pbmRleCA0MTY3NThjOGEzZDQzLi5hNDkzZGUzYWU1YzIwIDEwMDY0NFxuLS0tIGEva2VybmVsL2ZvcmsuY1xuKysrIGIva2VybmVsL2ZvcmsuY1xuQEAgLTEzNzEsNiArMTM3MSwyNyBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIFx0cmV0dXJuIGV4ZV9maWxlO1xuIH1cbiBcbisvKipcbisgKiBnZXRfdGFza19leGVfcGF0aCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBleGVjdXRhYmxlIHBhdGhcbisgKiBAdGFzazogVGhlIHRhc2suXG4rICogQGV4ZV9wYXRoOiBUaGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aC5cbisgKlxuKyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYW4gZXhlY3V0YWJsZSBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aClcbit7XG4rXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZSh0YXNrKTtcbitcbitcdGlmICghZXhlX2ZpbGUpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuK1x0cGF0aF9nZXQoZXhlX3BhdGgpO1xuK1x0ZnB1dChleGVfZmlsZSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gLyoqXG4gICogZ2V0X3Rhc2tfbW0gLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3MgbW1cbiAgKiBAdGFzazogVGhlIHRhc2suXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG5pbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NFxuLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG4rKysgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbkBAIC0xMyw2ICsxMyw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZ2ZwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHRyYWNlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90YXNrX3dvcmsuaFx1MDAzZVxuIFxuQEAgLTMzMCwyMiArMzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsXG4gXG4gc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jdXJyZW50X2V4ZV9wYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cdHN0cnVjdCBwYXRoIHA7XG4rXHRzdHJ1Y3QgcGF0aCBwIF9fZnJlZShwYXRoX3B1dCkgPSB7fTtcbiBcdGNvbnN0IGNoYXIgKnBhdGhfc3RyO1xuIFxuLVx0ZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZShjdXJyZW50KTtcbi1cdGlmICghZXhlX2ZpbGUpXG4rXHRpZiAoZ2V0X3Rhc2tfZXhlX3BhdGgoY3VycmVudCwgXHUwMDI2cCkpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuLVx0cCA9IGV4ZV9maWxlLVx1MDAzZWZfcGF0aDtcbi1cdHBhdGhfZ2V0KFx1MDAyNnApO1xuIFxuIFx0aWYgKGFhX3BhdGhfbmFtZShcdTAwMjZwLCBGTEFHX1ZJRVdfU1VCTlMsIGJ1ZmZlciwgXHUwMDI2cGF0aF9zdHIsIE5VTEwsIE5VTEwpKVxuIFx0XHRwYXRoX3N0ciA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRmcHV0KGV4ZV9maWxlKTtcbi1cdHBhdGhfcHV0KFx1MDAyNnApO1xuLVxuIFx0cmV0dXJuIHBhdGhfc3RyO1xuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI3OjE5LjE1Njc5MTIyOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4NTMxMjk1ODQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEV2YWx1YXRpb246IFBhdGNoIFNlcmllcyBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHF1ZXN0aW9uIGF0IGhhbmQgaXMgd2hldGhlciB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGV4cGVydCBhc3Nlc3NtZW50IGlzLCBhbmQgdGhlIHJlYXNvbmluZyBpcywgKm5vKi4gTGV0J3MgZ2V0IGludG8gd2h5LlxuXG5GaXJzdGx5LCB0aGUgcGF0Y2gncyBjb3JlIGZ1bmN0aW9uIGlzIHRvIGFkZCBhIHNldCBvZiBoZWxwZXJzIGFuZCBwaWRmZCBpb2N0bHM6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGBnZXRfdGFza19leGVfcGF0aGAgYW5kIGBQSURGRF9HRVRfRVhFYCwgYFBJREZEX0dFVF9DV0RgLCBgUElERkRfR0VUX1JPT1RgLiBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGEgd2F5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGxpa2UgYSB0YXNrJ3Mgcm9vdCwgY3dkLCBhbmQgZXhlY3V0YWJsZSBwYXRoIHZpYSBmaWxlIGRlc2NyaXB0b3JzLiBDcnVjaWFsbHksIHRoZXNlIG5ldyBpb2N0bHMgYXJlIHJldHVybmluZyBmaWxlIGRlc2NyaXB0b3JzIChgT19QQVRIYCksICpub3QqIGRpcmVjdGx5IGNvcHlpbmcgZGF0YSB0byB1c2Vyc3BhY2UsIHdoaWNoIGlzIGEga2V5IHBvaW50LlxuXG5BZnRlciBjYXJlZnVsbHkgcmV2aWV3aW5nIHRoZSBjb2RlLCB0aGVyZSBhcmUgbm8gY2hhbmdlcyBvciBhZGRpdGlvbnMgdGhhdCBjb3VsZCBhbGxvdyBmb3IgaW5mb3JtYXRpb24gbGVha2FnZSB0byB1c2VyIHNwYWNlLiBGdXJ0aGVyLCBhbGwgc3RhY2sgdmFyaWFibGVzIHVzZWQsIGxpa2UgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9O2AsIGFyZSBwcm9wZXJseSB6ZXJvLWluaXRpYWxpemVkLCBhbmQgY2xlYW51cCBpcyBoYW5kbGVkIGJ5IFJBSUkuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgaGFwcGVuaW5nIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb2RlIG9yIHRoZSBjaGFuZ2VzIG1hZGUuXG5cbk1lbW9yeSBzYWZldHkgaXMgcGFyYW1vdW50LCBhbmQgbXkgY2hlY2tzIGZvY3VzIG9uIHRoYXQuIFRoZSBwcmltYXJ5IHJpc2tzIHdpdGhpbiB0aGVzZSBjaGFuZ2VzIGJvaWwgZG93biB0byBjbGFzc2ljIGtlcm5lbCBidWdzOiBsb2NraW5nIGlzc3VlcyAoc3luY2hyb25pemF0aW9uKSwgcmVmZXJlbmNlIGNvdW50aW5nIHByb2JsZW1zIChwb3RlbnRpYWwgdXNlLWFmdGVyLWZyZWUgY29uZGl0aW9ucyksIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMuIEknbSBzYXRpc2ZpZWQgdGhhdCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFuZCBoYXJkZW5pbmcgdG9vbHMgYXJlIHBlcmZlY3RseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGVzZSBidWdzLiBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBleGlzdGluZyBrZXJuZWwgYnVnIGRldGVjdG9ycyBhcmUsIGluIG15IGV4cGVydCBvcGluaW9uLCBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCBzZXJpZXMuXG5cblRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIFRoZSBjaGFuZ2VzIGFyZSBsYXJnZWx5IGZvY3VzZWQgb24gcGF0aCByZXRyaWV2YWwgdmlhIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHVzZSBzdGFuZGFyZCBrZXJuZWwgcHJhY3RpY2VzLlxuXG5NeSBmaW5hbCBhbmFseXNpcyBpcyB0aGF0LCB3aXRoIHJlc3BlY3QgdG8gdGhlIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIHJpc2tzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLiBJJ20gY29uZmlkZW50IGluIHRoaXMgZXZhbHVhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMSwiT3V0cHV0VG9rZW5zIjoyNzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODk1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MjcuNjg4MDkxMTY4WiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxcblxcbjEuIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gaW5mby1sZWFrIGFuYWx5c2lzOlxcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXFxuICAgLSBBbGwgc3RhY2sgdmFyaWFibGVzIChlLmcuLCBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge31gKSBhcmUgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkLlxcbiAgIC0gUmV0dXJuIHBhdGhzIGFuZCBlcnJvciBjb2RlcyBhcmUgY2hlY2tlZCBiZWZvcmUgYWNjZXNzaW5nIHJldHJpZXZlZCBwYXRocy5cXG5cXG4yLiBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5OlxcbiAgIC0gUG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyByZWxhdGUgdG8gcmVmZXJlbmNlIGNvdW50aW5nIChmcHV0LCBwYXRoX3B1dCwgZ2V0X3Rhc2tfc3RydWN0KSwgbG9ja2luZy9zeW5jaHJvbml6YXRpb24gKGV4ZWNfdXBkYXRlX2xvY2ssIHRhc2tfbG9jayksIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMuXFxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cXG5cXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcXG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxcbiAgIC0gQWxsIHN0YWNrIHZhcmlhYmxlcyAoZS5nLiwgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9YCkgYXJlIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZC5cXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXFxuXFxuMi4gS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eTpcXG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxcbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-31 03:09:07 +0000 UTC FinishedAt: 2026-08-31 03:27:28 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "c2127e0eaf7eaa86e54c43b2794df55317d3f74f", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "c2127e0eaf7eaa86e54c43b2794df55317d3f74f", "config_name": "upstream-apparmor-kasan.config", "series_id": "97674aba-5691-41af-91c1-3b34a67c9ac1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "get_task_root", "get_task_pwd", "get_task_exe_path" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcyYjMzk7cyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6MjY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjOGUyNTJhOTcyZmMwMDM4ZTc4MDU2MTRhN2YxYjQ3MmIzMTU4YzY3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMzEgMDM6MjY6NTIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZnNfc3RydWN0LmMgYi9mcy9mc19zdHJ1Y3QuY1xuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcbi0tLSBhL2ZzL2ZzX3N0cnVjdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9mc19zdHJ1Y3QuY1xuQEAgLTEwLDYgJiM0MzsxMCw1MCBAQFxuICNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDttb3VudC5oXCYjMzQ7XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyByb290IHBhdGhcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAcm9vdDogVGhlIHRhc2smIzM5O3Mgcm9vdCBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGVcbiYjNDM7ICogY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcGF0aCB0aHJvdWdoIHBhdGhfcHV0KCkgb24gc3VjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0dGFza19sb2NrKHRhc2spO1xuJiM0MztcdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbiYjNDM7XHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4mIzQzO1x0XHRyZXQgPSAwO1xuJiM0MztcdH1cbiYjNDM7XHR0YXNrX3VubG9jayh0YXNrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnlcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAcHdkOiBUaGUgdGFzayYjMzk7cyB3b3JraW5nIGRpcmVjdG9yeS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcGF0aCB0aHJvdWdoIHBhdGhfcHV0KCkgb24gc3VjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHRhc2tfbG9jayh0YXNrKTtcbiYjNDM7XHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4mIzQzO1x0XHRnZXRfZnNfcHdkKHRhc2stXHUwMDNlcmVhbF9mcywgcHdkKTtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0fVxuJiM0MztcdHRhc2tfdW5sb2NrKHRhc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogUmVwbGFjZSB0aGUgZnMtXHUwMDNle3Jvb3RtbnQscm9vdH0gd2l0aCB7bW50LGRlbnRyeX0uIFB1dCB0aGUgb2xkIHZhbHVlcy5cbiAgKiBJdCBjYW4gYmxvY2suXG5kaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmNcbmluZGV4IGE2YTY0M2YxNWQwOGEuLmIyMTM3NGYwMDAwMmUgMTAwNjQ0XG4tLS0gYS9mcy9waWRmcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jXG5AQCAtNCw2ICYjNDM7NCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0ZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvZnNfc3RydWN0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb3VudC5oXHUwMDNlXG5AQCAtNTEwLDYgJiM0Mzs1MTEsOSBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0Y2FzZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRTpcbiBcdGNhc2UgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFOlxuIFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcbiYjNDM7XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuJiM0MztcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0fVxuIFxuQEAgLTUyNyw2MiAmIzQzOzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDtcbi1cdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuLVx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuLVxuLVx0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuLVx0XHRpZiAoIWFyZylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbi1cdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbiYjNDM7XHRpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7XG4mIzQzO1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuJiM0MztcdFx0cHV0X3Rhc2tfc3RydWN0KHRhc2spO1xuIFx0fVxuJiM0Mzt9XG4gXG4tXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cbi1cdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXG4tXHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiYjNDM7LypcbiYjNDM7ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuJiM0MzsgKiBhbmQgdGhlIGNhbGxlcnMmIzM5OyB0YXNrIHN0YXRlIGxvb2t1cCBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSB0aGUgbG9jayBpcyBoZWxkXG4mIzQzOyAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZGZkX2dldF90YXNrX2xvY2tlZChzdHJ1Y3QgcGlkICpwaWQsXG4mIzQzO1x0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cbiYjNDM7XHRcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcbiYjNDM7XHRpbnQgZXJyb3I7XG4gXG4tXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xuIFx0aWYgKCF0YXNrKVxuLVx0XHRyZXR1cm4gLUVTUkNIO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTtcbiBcbiBcdGlmIChhcmcpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tXHQvKlxuLVx0ICogV2UmIzM5O3JlIHRyeWluZyB0byBvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBuYW1lc3BhY2Ugc28gcGVyZm9ybSBhXG4tXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgZm9yIHRoZVxuLVx0ICogZHVyYXRpb24gb2YgdGhlIHB0cmFjZSBjaGVjayBhbmQgdGhlIG5hbWVzcGFjZSBsb29rdXAgc28gdGhhdCB0aGVcbi1cdCAqIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHRoZSBhY2Nlc3MgZGVjaXNpb24gbWF0Y2ggdGhvc2Ugb2YgQHRhc2sgYXQgdGhlXG4tXHQgKiB0aW1lIGl0cyBuYW1lc3BhY2UgaXMgcmVhZCwgcHJldmVudGluZyBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkgZnJvbVxuLVx0ICogc3dhcHBpbmcgdGhlIHRhc2smIzM5O3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXG4tXHQgKiBtaXJyb3IgbnNmcyBiZWhhdmlvci5cbi1cdCAqL1xuIFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4gXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcbiBcbiBcdGlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkge1xuLVx0XHRlcnJvciA9IC1FQUNDRVM7XG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHRcdHVwX3JlYWQoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcbiBcdH1cbiBcbiYjNDM7XHRyZXR1cm5fcHRyKHRhc2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuJiM0MztcdCAgICAgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKF9UKSxcbiYjNDM7XHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXG4mIzQzO1x0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxuJiM0MztcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuJiM0MztcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiYjNDM7XHRpZiAoSVNfRVJSKHRhc2spKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9DQVNUKHRhc2spO1xuJiM0MztcbiBcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiBcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIFx0XHRpZiAobnNwKVxuIFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gXHR9XG4tXHRpZiAoIW5zcCkge1xuLVx0XHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuJiM0MztcdGlmICghbnNwKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHQvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqL1xuQEAgLTY2NCwxNiAmIzQzOzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gI2VuZGlmXG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0ZXJyb3IgPSAtRU5PSU9DVExDTUQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpO1xuIFx0fVxuIFxuLVx0aWYgKCFlcnJvciBcdTAwMjZcdTAwMjYgIW5zX2NvbW1vbilcbi1cdFx0ZXJyb3IgPSAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAoIW5zX2NvbW1vbilcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTtcbiBcbi1vdXRfdW5sb2NrOlxuLVx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0cmV0dXJuIGVycm9yO1xuJiM0MztcdHJldHVybiBuc19jb21tb247XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXG4mIzQzO3tcbiYjNDM7XHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuJiM0MztcbiYjNDM7XHRpZiAoSVNfRVJSKHRhc2spKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIodGFzayk7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoY21kKSB7XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuJiM0MztcdFx0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIHBhdGgpO1xuJiM0MztcdGNhc2UgUElERkRfR0VUX0NXRDpcbiYjNDM7XHRcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiYjNDM7XHRcdHJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4mIzQzO1x0aW50IGVycm9yO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuJiM0MztcbiYjNDM7XHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4mIzQzO1x0XHRpZiAoIWFyZylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbiYjNDM7XG4mIzQzO1x0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4mIzQzO1x0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbiYjNDM7XHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChjbWQpIHtcbiYjNDM7XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4mIzQzO1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuJiM0MztcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4mIzQzO1x0XHRlcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgXHUwMDI2cGF0aCk7XG4mIzQzO1x0XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XG4mIzQzO1x0XHRyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQyxcbiYjNDM7XHRcdFx0ICAgICAgZGVudHJ5X29wZW4oXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTtcbiYjNDM7XHRpZiAoSVNfRVJSKG5zX2NvbW1vbikpXG4mIzQzO1x0XHRyZXR1cm4gUFRSX0VSUihuc19jb21tb24pO1xuIFxuIFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xuIFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuY1xuaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDRcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9wcm9jL2Jhc2UuY1xuQEAgLTIwNiwzMSAmIzQzOzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcyxcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4te1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4tXHRcdHJlc3VsdCA9IDA7XG4tXHR9XG4tXHR0YXNrX3VubG9jayh0YXNrKTtcbi1cdHJldHVybiByZXN1bHQ7XG4tfVxuLVxuIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuIFx0XHRcdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwYXRoKTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbiYjNDM7XHRyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpO1xuIH1cbiBcbiBzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsXG5AQCAtMTc2MSwxNiAmIzQzOzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0ge1xuIHN0YXRpYyBpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpleGVfcGF0aCxcbiBcdFx0XHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4tXHRpZiAoZXhlX2ZpbGUpIHtcbi1cdFx0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0XHRwYXRoX2dldChcdTAwMjZleGVfZmlsZS1cdTAwM2VmX3BhdGgpO1xuLVx0XHRmcHV0KGV4ZV9maWxlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9IGVsc2Vcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIGV4ZV9wYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBjYWxsX3Byb2NfZ2V0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aF9vdXQpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG5AQCAtNDIsNiAmIzQzOzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpXG4gXHRyZWFkX3NlcXVubG9ja19leGNsKFx1MDAyNmZzLVx1MDAzZXNlcSk7XG4gfVxuIFxuJiM0MztpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcbiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xuJiM0MztcbiBzdHJ1Y3QgZnNfc3RydWN0ICpzd2l0Y2hfZnNfc3RydWN0KHN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcyk7XG4gXG4gZXh0ZXJuIGJvb2wgY3VycmVudF9jaHJvb3RlZCh2b2lkKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmhcbmluZGV4IGRkMDljNDM4ZmEyM2UuLmE2NWYyNGIyZTY1YmYgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbW0uaFxuQEAgLTQyMzksNiAmIzQzOzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIGludCByZXBsYWNlX21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuJiM0MztpbnQgZ2V0X3Rhc2tfZXhlX3BhdGgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgpO1xuIFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5AQCAtMTIxLDQgJiM0MzsxMjEsMTEgQEAgc3RydWN0IHBpZGZkX2luZm8ge1xuICNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxuICNkZWZpbmUgUElERkRfR0VUX0lORk8gICAgICAgICAgICAgICAgICAgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKVxuIFxuJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIGV4ZWN1dGFibGUuICovXG4mIzQzOyNkZWZpbmUgUElERkRfR0VUX0VYRSAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEyKVxuJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xuJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9DV0QgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMylcbiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyByb290IGRpcmVjdG9yeS4gKi9cbiYjNDM7I2RlZmluZSBQSURGRF9HRVRfUk9PVCAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTQpXG4mIzQzO1xuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDQxNjc1OGM4YTNkNDMuLmE0OTNkZTNhZTVjMjAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jXG5AQCAtMTM3MSw2ICYjNDM7MTM3MSwyNyBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIFx0cmV0dXJuIGV4ZV9maWxlO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIGdldF90YXNrX2V4ZV9wYXRoIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyBleGVjdXRhYmxlIHBhdGhcbiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLlxuJiM0MzsgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4mIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuJiM0MzsgKi9cbiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGUgKmV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4mIzQzO1xuJiM0MztcdGlmICghZXhlX2ZpbGUpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuJiM0MztcdHBhdGhfZ2V0KGV4ZV9wYXRoKTtcbiYjNDM7XHRmcHV0KGV4ZV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgbW1cbiAgKiBAdGFzazogVGhlIHRhc2suXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG5pbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NFxuLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbkBAIC0xMyw2ICYjNDM7MTMsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wdHJhY2UuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gXG5AQCAtMzMwLDIyICYjNDM7MzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsXG4gXG4gc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jdXJyZW50X2V4ZV9wYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cdHN0cnVjdCBwYXRoIHA7XG4mIzQzO1x0c3RydWN0IHBhdGggcCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4gXHRjb25zdCBjaGFyICpwYXRoX3N0cjtcbiBcbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUoY3VycmVudCk7XG4tXHRpZiAoIWV4ZV9maWxlKVxuJiM0MztcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcdTAwMjZwKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tXHRwID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0cGF0aF9nZXQoXHUwMDI2cCk7XG4gXG4gXHRpZiAoYWFfcGF0aF9uYW1lKFx1MDAyNnAsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCBcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXG4gXHRcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdGZwdXQoZXhlX2ZpbGUpO1xuLVx0cGF0aF9wdXQoXHUwMDI2cCk7XG4tXG4gXHRyZXR1cm4gcGF0aF9zdHI7XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgcGlkZmQgaW9jdGxzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBhbmQgUElERkRfR0VUX1JPT1QpIGFsbG93aW5nIHVzZXJzcGFjZSB0byByZXRyaWV2ZSBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSBwcm9jZXNzJiMzOTtzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGM4ZTI1MmE5NzJmYzAwMzhlNzgwNTYxNGE3ZjFiNDcyYjMxNThjNjcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2ZzX3N0cnVjdC5jIGIvZnMvZnNfc3RydWN0LmMKaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDQKLS0tIGEvZnMvZnNfc3RydWN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnNfc3RydWN0LmMKQEAgLTEwLDYgJiM0MzsxMCw1MCBAQAogI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bW91bnQuaCYjMzQ7CiAKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayYjMzk7cyByb290IHBhdGgKJiM0MzsgKiBAdGFzazogVGhlIHRhc2suCiYjNDM7ICogQHJvb3Q6IFRoZSB0YXNrJiMzOTtzIHJvb3QgcGF0aC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYSByb290IHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuIFRoZQomIzQzOyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtRU5PRU5UOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodGFzayk7CiYjNDM7CWlmICh0YXNrLSZndDtyZWFsX2ZzKSB7CiYjNDM7CQlnZXRfZnNfcm9vdCh0YXNrLSZndDtyZWFsX2ZzLCByb290KTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CX0KJiM0MzsJdGFza191bmxvY2sodGFzayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkKJiM0MzsgKiBAdGFzazogVGhlIHRhc2suCiYjNDM7ICogQHB3ZDogVGhlIHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLUVOT0VOVDsKJiM0MzsKJiM0MzsJdGFza19sb2NrKHRhc2spOwomIzQzOwlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewomIzQzOwkJZ2V0X2ZzX3B3ZCh0YXNrLSZndDtyZWFsX2ZzLCBwd2QpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJfQomIzQzOwl0YXNrX3VubG9jayh0YXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiAvKgogICogUmVwbGFjZSB0aGUgZnMtJmd0O3tyb290bW50LHJvb3R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuCiAgKiBJdCBjYW4gYmxvY2suCmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuYwppbmRleCBhNmE2NDNmMTVkMDhhLi5iMjEzNzRmMDAwMDJlIDEwMDY0NAotLS0gYS9mcy9waWRmcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3BpZGZzLmMKQEAgLTQsNiAmIzQzOzQsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L2V4cG9ydGZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZzX3N0cnVjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Nncm91cC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW91bnQuaCZndDsKQEAgLTUxMCw2ICYjNDM7NTExLDkgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZCkKIAljYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOgogCWNhc2UgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFOgogCWNhc2UgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0U6CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwljYXNlIFBJREZEX0dFVF9ST09UOgogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTUyNyw2MiAmIzQzOzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKQogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDsKLQlzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMOwotCXN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7Ci0JaW50IGVycm9yOwotCi0JaWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKQotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCi0JaWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikgewotCQlpZiAoIWFyZykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCV9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7Ci0JCXJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLSZndDtpX2dlbmVyYXRpb24sIGFyZ3ApOwomIzQzOwlpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7CiYjNDM7CQl1cF9yZWFkKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKJiM0MzsJCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKIAl9CiYjNDM7fQogCi0JLyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovCi0JaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSkKLQkJcmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpOwomIzQzOy8qCiYjNDM7ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVjawomIzQzOyAqIGFuZCB0aGUgY2FsbGVycyYjMzk7IHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQKJiM0MzsgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCwKJiM0MzsJCQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9CiYjNDM7CQlnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7CiYjNDM7CWludCBlcnJvcjsKIAotCXRhc2sgPSBnZXRfcGlkX3Rhc2socGlkZmRfcGlkKGZpbGUpLCBQSURUWVBFX1BJRCk7CiAJaWYgKCF0YXNrKQotCQlyZXR1cm4gLUVTUkNIOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsKIAogCWlmIChhcmcpCi0JCXJldHVybiAtRUlOVkFMOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQkvKgotCSAqIFdlJiMzOTtyZSB0cnlpbmcgdG8gb3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgbmFtZXNwYWNlIHNvIHBlcmZvcm0gYQotCSAqIGZpbGVzeXN0ZW0gY3JlZCBwdHJhY2UgY2hlY2suIEhvbGQgQHRhc2smIzM5O3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlCi0JICogZHVyYXRpb24gb2YgdGhlIHB0cmFjZSBjaGVjayBhbmQgdGhlIG5hbWVzcGFjZSBsb29rdXAgc28gdGhhdCB0aGUKLQkgKiBjcmVkZW50aWFscyB1c2VkIGZvciB0aGUgYWNjZXNzIGRlY2lzaW9uIG1hdGNoIHRob3NlIG9mIEB0YXNrIGF0IHRoZQotCSAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tCi0JICogc3dhcHBpbmcgdGhlIHRhc2smIzM5O3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlCi0JICogbWlycm9yIG5zZnMgYmVoYXZpb3IuCi0JICovCiAJZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCiAJaWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7Ci0JCWVycm9yID0gLUVBQ0NFUzsKLQkJZ290byBvdXRfdW5sb2NrOwomIzQzOwkJdXBfcmVhZCgmYW1wO3Rhc2stJmd0O3NpZ25hbC0mZ3Q7ZXhlY191cGRhdGVfbG9jayk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAl9CiAKJiM0MzsJcmV0dXJuX3B0cih0YXNrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7REVGSU5FX0NMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKJiM0MzsJICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLAomIzQzOwkgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksCiYjNDM7CSAgICAgc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBsb25nIGFyZykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqcGlkZmRfZ2V0X25hbWVzcGFjZShzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDsKJiM0MzsJc3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDsKJiM0MzsKJiM0MzsJQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTsKJiM0MzsJaWYgKElTX0VSUih0YXNrKSkKJiM0MzsJCXJldHVybiBFUlJfQ0FTVCh0YXNrKTsKJiM0MzsKIAlzY29wZWRfZ3VhcmQodGFza19sb2NrLCB0YXNrKSB7CiAJCW5zcCA9IHRhc2stJmd0O25zcHJveHk7CiAJCWlmIChuc3ApCiAJCQlnZXRfbnNwcm94eShuc3ApOwogCX0KLQlpZiAoIW5zcCkgewotCQllcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi8KLQkJZ290byBvdXRfdW5sb2NrOwotCX0KJiM0MzsJaWYgKCFuc3ApCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRVNSQ0gpOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbiYjMzk7dCBleGlzdCAqLwogCiAJc3dpdGNoIChjbWQpIHsKIAkvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqLwpAQCAtNjY0LDE2ICYjNDM7NjczLDcyIEBAIHN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKICNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnJvciA9IC1FTk9JT0NUTENNRDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7CiAJfQogCi0JaWYgKCFlcnJvciAmYW1wOyZhbXA7ICFuc19jb21tb24pCi0JCWVycm9yID0gLUVPUE5PVFNVUFA7CiYjNDM7CWlmICghbnNfY29tbW9uKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCi1vdXRfdW5sb2NrOgotCXVwX3JlYWQoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwomIzQzOwlyZXR1cm4gbnNfY29tbW9uOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpCiYjNDM7ewomIzQzOwlDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpOwomIzQzOwomIzQzOwlpZiAoSVNfRVJSKHRhc2spKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIodGFzayk7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJCXJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTsKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwkJcmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTsKJiM0MzsJY2FzZSBQSURGRF9HRVRfUk9PVDoKJiM0MzsJCXJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtRUlOVkFMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fTsKJiM0MzsJaW50IGVycm9yOwomIzQzOwomIzQzOwlpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpCiYjNDM7CQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwomIzQzOwomIzQzOwlpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7CiYjNDM7CQlpZiAoIWFyZykKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJCV9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7CiYjNDM7CiYjNDM7CQlyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9nZW5lcmF0aW9uLCBhcmdwKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi8KJiM0MzsJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSkKJiM0MzsJCXJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTsKJiM0MzsKJiM0MzsJc3dpdGNoIChjbWQpIHsKJiM0MzsJY2FzZSBQSURGRF9HRVRfRVhFOgomIzQzOwljYXNlIFBJREZEX0dFVF9DV0Q6CiYjNDM7CWNhc2UgUElERkRfR0VUX1JPT1Q6CiYjNDM7CQllcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgJmFtcDtwYXRoKTsKJiM0MzsJCWlmIChlcnJvcikKJiM0MzsJCQlyZXR1cm4gZXJyb3I7CiYjNDM7CiYjNDM7CQlyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQywKJiM0MzsJCQkgICAgICBkZW50cnlfb3BlbigmYW1wO3BhdGgsIE9fUEFUSCwgY3VycmVudF9jcmVkKCkpKTsKJiM0MzsJfQomIzQzOwomIzQzOwluc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpOwomIzQzOwlpZiAoSVNfRVJSKG5zX2NvbW1vbikpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUihuc19jb21tb24pOwogCiAJLyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqLwogCXJldHVybiBvcGVuX25hbWVzcGFjZShuc19jb21tb24pOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA2YTM5ZGU0MjRmNjJhLi43ZTJjMDUzODMyM2NjIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtMjA2LDMxICYjNDM7MjA2LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHBpZF9lbnRyeV9ubGluayhjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRyaWVzLAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpCi17Ci0JaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0KLQl0YXNrX2xvY2sodGFzayk7Ci0JaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKLQkJZ2V0X2ZzX3Jvb3QodGFzay0mZ3Q7cmVhbF9mcywgcm9vdCk7Ci0JCXJlc3VsdCA9IDA7Ci0JfQotCXRhc2tfdW5sb2NrKHRhc2spOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKLQotCXRhc2tfbG9jayh0YXNrKTsKLQlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewotCQlnZXRfZnNfcHdkKHRhc2stJmd0O3JlYWxfZnMsIHBhdGgpOwotCQlyZXN1bHQgPSAwOwotCX0KLQl0YXNrX3VubG9jayh0YXNrKTsKLQlyZXR1cm4gcmVzdWx0OwomIzQzOwlyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpOwogfQogCiBzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsCkBAIC0xNzYxLDE2ICYjNDM7MTc0MCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGlkX3NldF9jb21tX29wZXJhdGlvbnMgPSB7CiBzdGF0aWMgaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgsCiAJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBmaWxlICpleGVfZmlsZTsKLQotCWV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7Ci0JaWYgKGV4ZV9maWxlKSB7Ci0JCSpleGVfcGF0aCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7Ci0JCXBhdGhfZ2V0KCZhbXA7ZXhlX2ZpbGUtJmd0O2ZfcGF0aCk7Ci0JCWZwdXQoZXhlX2ZpbGUpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CXJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBleGVfcGF0aCk7CiB9CiAKIHN0YXRpYyBpbnQgY2FsbF9wcm9jX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGhfb3V0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmgKaW5kZXggOTdlZWY4ZDM4NjNkZC4uZmI3MjU3MDc3NTRkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oCkBAIC00Miw2ICYjNDM7NDIsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2ZzX3B3ZChzdHJ1Y3QgZnNfc3RydWN0ICpmcywgc3RydWN0IHBhdGggKnB3ZCkKIAlyZWFkX3NlcXVubG9ja19leGNsKCZhbXA7ZnMtJmd0O3NlcSk7CiB9CiAKJiM0MztpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTsKJiM0MztpbnQgZ2V0X3Rhc2tfcHdkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnB3ZCk7CiYjNDM7CiBzdHJ1Y3QgZnNfc3RydWN0ICpzd2l0Y2hfZnNfc3RydWN0KHN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcyk7CiAKIGV4dGVybiBib29sIGN1cnJlbnRfY2hyb290ZWQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtNDIzOSw2ICYjNDM7NDIzOSw3IEBAIGV4dGVybiBpbnQgc2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTsKIGV4dGVybiBpbnQgcmVwbGFjZV9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKTsKIAogZXh0ZXJuIHZvaWQgdm1fc3RhdF9hY2NvdW50KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgbG9uZyBucGFnZXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCmluZGV4IDA5MTkyNDZhMTYxMWMuLjk1Y2UxODE5ZjQyM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oCkBAIC0xMjEsNCAmIzQzOzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7CiAjZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMCkKICNkZWZpbmUgUElERkRfR0VUX0lORk8gICAgICAgICAgICAgICAgICAgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKQogCiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyBleGVjdXRhYmxlLiAqLwomIzQzOyNkZWZpbmUgUElERkRfR0VUX0VYRSAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEyKQomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3Mgd29ya2luZyBkaXJlY3RvcnkuICovCiYjNDM7I2RlZmluZSBQSURGRF9HRVRfQ1dEICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTMpCiYjNDM7LyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzayYjMzk7cyByb290IGRpcmVjdG9yeS4gKi8KJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNCkKJiM0MzsKICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA0MTY3NThjOGEzZDQzLi5hNDkzZGUzYWU1YzIwIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9mb3JrLmMKQEAgLTEzNzEsNiAmIzQzOzEzNzEsMjcgQEAgc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIAlyZXR1cm4gZXhlX2ZpbGU7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19leGVfcGF0aCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgZXhlY3V0YWJsZSBwYXRoCiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEBleGVfcGF0aDogVGhlIHRhc2smIzM5O3MgZXhlY3V0YWJsZSBwYXRoLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuCiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuCiYjNDM7ICovCiYjNDM7aW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGUgKmV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7CiYjNDM7CiYjNDM7CWlmICghZXhlX2ZpbGUpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsKJiM0MzsJKmV4ZV9wYXRoID0gZXhlX2ZpbGUtJmd0O2ZfcGF0aDsKJiM0MzsJcGF0aF9nZXQoZXhlX3BhdGgpOwomIzQzOwlmcHV0KGV4ZV9maWxlKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3MgbW0KICAqIEB0YXNrOiBUaGUgdGFzay4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYwppbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMKJiM0MzsmIzQzOyYjNDM7IGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wdHJhY2UuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKIApAQCAtMzMwLDIyICYjNDM7MzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsCiAKIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfY3VycmVudF9leGVfcGF0aChjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKIHsKLQlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7Ci0Jc3RydWN0IHBhdGggcDsKJiM0MzsJc3RydWN0IHBhdGggcCBfX2ZyZWUocGF0aF9wdXQpID0ge307CiAJY29uc3QgY2hhciAqcGF0aF9zdHI7CiAKLQlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKGN1cnJlbnQpOwotCWlmICghZXhlX2ZpbGUpCiYjNDM7CWlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCAmYW1wO3ApKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQlwID0gZXhlX2ZpbGUtJmd0O2ZfcGF0aDsKLQlwYXRoX2dldCgmYW1wO3ApOwogCiAJaWYgKGFhX3BhdGhfbmFtZSgmYW1wO3AsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCAmYW1wO3BhdGhfc3RyLCBOVUxMLCBOVUxMKSkKIAkJcGF0aF9zdHIgPSBFUlJfUFRSKC1FTk9NRU0pOwogCi0JZnB1dChleGVfZmlsZSk7Ci0JcGF0aF9wdXQoJmFtcDtwKTsKLQogCXJldHVybiBwYXRoX3N0cjsKIH0KIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODA0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogNTU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkluaXRpYWwgQXNzZXNzbWVudDogUGF0Y2ggRGVlcCBEaXZlICZhbXA7IEZ1enppbmcgU3VpdGFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFuYWx5emUgdGhlIGNvZGUgY2hhbmdlcyBhbmQgdGhlbiBkZXRlcm1pbmUgaXRzIGZ1enppbmcgcG90ZW50aWFsLgoKVGhlIHBhdGNoIGl0c2VsZiBpcyBpbnRyb2R1Y2luZyBzZXZlcmFsIG5ldyBoZWxwZXIgZnVuY3Rpb25zLiBJIHNlZSBgZ2V0X3Rhc2tfcm9vdGAsIGBnZXRfdGFza19wd2RgLCBhbmQgYGdldF90YXNrX2V4ZV9wYXRoYCBhZGRlZCB0byB0aGUga2VybmVsLiBUaGVzZSBsb29rIGxpa2Ugc3RyYWlnaHRmb3J3YXJkIHBhdGggcmV0cmlldmFsIGZ1bmN0aW9ucywgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUgbW9kaWZpY2F0aW9ucyB0byBgZnMvcHJvYy9iYXNlLmNgIGFuZCBgc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jYCBjb25maXJtIHRoZXNlIGhlbHBlcnMgYXJlIGJlaW5nIHVzZWQgYnkgY29yZSBrZXJuZWwgY29tcG9uZW50cyBsaWtlIHByb2NmcyBhbmQgQXBwQXJtb3IsIHdoaWNoIGlzIGludGVyZXN0aW5nLgoKVGhlIHJlYWwgbWVhdCBvZiB0aGlzIHBhdGNoIHNlZW1zIHRvIGJlIHRoZSBjaGFuZ2VzIHdpdGhpbiBgZnMvcGlkZnMuY2AuIEl0JiMzOTtzIGltcGxlbWVudGluZyBuZXcgaW9jdGxzIG9uIHBpZGZkczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGlzIHN1Z2dlc3RzIGEgbWVjaGFuaXNtIHRvIHJldHJpZXZlIGV4ZWN1dGFibGUgcGF0aCwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIHBpZGZkIGludGVyZmFjZS4gVGhlIHJlZmFjdG9yaW5nIG9mIGBwaWRmZF9pb2N0bGAgaW5kaWNhdGVzIHNvbWUgbG9ja2luZyBjaGFuZ2VzLCB3aGljaCBpcyBhbHdheXMgZ29vZCB0byByZXZpZXcuIEl0IGFsc28gaW5jbHVkZXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBwaWRmZF9nZXRfdGFza19wYXRoYCwgd2hpY2ggbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgpOb3cgZm9yIHRoZSBmdXp6aW5nIGFuYWx5c2lzLiBUaGlzIGlzIGNlcnRhaW5seSB3b3J0aCBhIGNsb3NlciBsb29rLCBnaXZlbiB0aGF0IHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggY29yZSBrZXJuZWwgbG9naWMgaW4gdGhlIGZpbGVzeXN0ZW0gYW5kIHBpZGZkL2lvY3RsIHNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGZhY3QgdGhhdCB0aGVzZSBuZXcgaW9jdGxzIGFyZSBlYXNpbHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgYHBpZGZkX29wZW5gIG9yIGBjbG9uZShDTE9ORV9QSURGRClgIG9yIGp1c3QgdXNpbmcgYW4gZXhpc3RpbmcgcGlkZmQsIG1lYW5zIGl0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGNvZGUgcGF0aHMgaW4gUUVNVSBvciBldmVuIHdpdGggYSBzdGFuZGFyZCB1c2Vyc3BhY2Ugc2V0dXAuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCBpbmNsdWRlcyByZWFsIGZ1bmN0aW9uYWwgY2hhbmdlcywgbG9ja2luZyByZWZhY3RvcmluZywgYW5kIG5ldyBpb2N0bHMgbWFrZXMgaXQgZXZlbiBtb3JlIGNvbXBlbGxpbmcgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgV29ydGhGdXp6aW5nPXRydWUuCgpOb3csIGxldCYjMzk7cyBzZWUgd2hpY2ggY29uZmlndXJhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgTWFrZWZpbGVzIGZvciB0aGUgcmVsZXZhbnQgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMvcGlkZnMuY2AsIGBmcy9mc19zdHJ1Y3QuY2AsIGFuZCBga2VybmVsL2ZvcmsuY2AuIEkgd2lsbCB1c2UgYSB0b29sIGxpa2UgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBNYWtlZmlsZXMgbWFudWFsbHkuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBuZWVkIHRvIGVuYWJsZSB0byBhY2Nlc3MgYW5kIGZ1enogdGhlc2UgcGF0aHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cGlkZnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7XG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDUxNSBsaW5lcy5cblVzZSBtb3JlIHByZWNpc2UgZXhwcmVzc2lvbiBpZiBwb3NzaWJsZS5cblxuZnMvTWFrZWZpbGU9MTA9b2JqLXkgOj1cdG9wZW4ubyByZWFkX3dyaXRlLm8gZmlsZV90YWJsZS5vIHN1cGVyLm8gXFxcbi0tXG5mcy9NYWtlZmlsZS0xNy1cdFx0ZnNfZGlyZW50Lm8gZnNfY29udGV4dC5vIGZzX3BhcnNlci5vIGZzb3Blbi5vIGluaXQubyBcXFxuZnMvTWFrZWZpbGU6MTg6XHRcdGtlcm5lbF9yZWFkX2ZpbGUubyBtbnRfaWRtYXBwaW5nLm8gcmVtYXBfcmFuZ2UubyBwaWRmcy5vIFxcXG5mcy9NYWtlZmlsZS0xOS1cdFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXG4tLVxuZnMvY29yZWR1bXAuYy00NS0jaW5jbHVkZSBcdTAwM2NsaW51eC9lbGYuaFx1MDAzZVxuZnMvY29yZWR1bXAuYzo0NjojaW5jbHVkZSBcdTAwM2NsaW51eC9waWRmcy5oXHUwMDNlXG5mcy9jb3JlZHVtcC5jLTQ3LSNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldC5oXHUwMDNlXG4tLVxuZnMvY29yZWR1bXAuYz02MjM9c3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcbi0tXG5mcy9jb3JlZHVtcC5jLTYyOS1cdGlmIChjcC1cdTAwM2VwaWQpIHtcbmZzL2NvcmVkdW1wLmM6NjMwOlx0XHRzdHJ1Y3QgZmlsZSAqcGlkZnNfZmlsZSBfX2ZyZWUoZnB1dCkgPSBOVUxMO1xuZnMvY29yZWR1bXAuYy02MzEtXG5mcy9jb3JlZHVtcC5jOjYzMjpcdFx0cGlkZnNfZmlsZSA9IHBpZGZzX2FsbG9jX2ZpbGUoY3AtXHUwMDNlcGlkLCAwKTtcbmZzL2NvcmVkdW1wLmM6NjMzOlx0XHRpZiAoSVNfRVJSKHBpZGZzX2ZpbGUpKVxuZnMvY29yZWR1bXAuYzo2MzQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIocGlkZnNfZmlsZSk7XG5mcy9jb3JlZHVtcC5jLTYzNS1cbmZzL2NvcmVkdW1wLmM6NjM2Olx0XHRwaWRmc19jb3JlZHVtcChjcCk7XG5mcy9jb3JlZHVtcC5jLTYzNy1cbi0tXG5mcy9jb3JlZHVtcC5jLTY0NC1cdFx0ICovXG5mcy9jb3JlZHVtcC5jOjY0NTpcdFx0ZXJyID0gcmVwbGFjZV9mZChDT1JFRFVNUF9QSURGRF9OVU1CRVIsIHBpZGZzX2ZpbGUsIDApO1xuZnMvY29yZWR1bXAuYy02NDYtXHRcdGlmIChlcnIgXHUwMDNjIDApXG4tLVxuZnMvY29yZWR1bXAuYz02Njg9c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuLS1cbmZzL2NvcmVkdW1wLmMtNjk5LVx0ICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlclxuZnMvY29yZWR1bXAuYzo3MDA6XHQgKiBpdCBpbiBwaWRmcy4uLlxuZnMvY29yZWR1bXAuYy03MDEtXHQgKi9cbmZzL2NvcmVkdW1wLmMtNzAyLVx0Y3BybS1cdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG5mcy9jb3JlZHVtcC5jOjcwMzpcdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChjcHJtLVx1MDAzZXBpZCk7XG5mcy9jb3JlZHVtcC5jLTcwNC1cdGlmIChyZXR2YWwpXG4tLVxuZnMvY29yZWR1bXAuYy03MTAtXHQgKi9cbmZzL2NvcmVkdW1wLmM6NzExOlx0cGlkZnNfY29yZWR1bXAoY3BybSk7XG5mcy9jb3JlZHVtcC5jLTcxMi1cbi0tXG5mcy9maGFuZGxlLmM9MTcwPXN0YXRpYyBpbnQgZ2V0X3BhdGhfYW5jaG9yKGludCBmZCwgc3RydWN0IHBhdGggKnJvb3QpXG4tLVxuZnMvZmhhbmRsZS5jLTE4Ni1cdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XG5mcy9maGFuZGxlLmM6MTg3Olx0XHRwaWRmc19nZXRfcm9vdChyb290KTtcbmZzL2ZoYW5kbGUuYy0xODgtXHRcdHJldHVybiAwO1xuLS1cbmZzL2ludGVybmFsLmg9MzYyPWludCBhbm9uX2lub2RlX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcbmZzL2ludGVybmFsLmgtMzYzLVx0XHQgICAgICAgc3RydWN0IGlhdHRyICphdHRyKTtcbmZzL2ludGVybmFsLmg6MzY0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpO1xuZnMvaW50ZXJuYWwuaC0zNjUtdm9pZCBuc2ZzX2dldF9yb290KHN0cnVjdCBwYXRoICpwYXRoKTtcbi0tXG5mcy9saWJmcy5jLTI1LSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzY3J5cHQuaFx1MDAzZVxuZnMvbGliZnMuYzoyNjojaW5jbHVkZSBcdTAwM2NsaW51eC9waWRmcy5oXHUwMDNlXG5mcy9saWJmcy5jLTI3LVxuLS1cbmZzL2xpYmZzLmM9MjE5Mj1zdHJ1Y3QgZGVudHJ5ICpzdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcbi0tXG5mcy9saWJmcy5jLTIyMjUtICpcbmZzL2xpYmZzLmM6MjIyNjogKiBTcGVjaWFsLXB1cnBvc2UgaGVscGVyIGZvciBuc2ZzIGFuZCBwaWRmcy5cbmZzL2xpYmZzLmMtMjIyNy0gKlxuLS1cbmZzL25hbWVzcGFjZS5jLTM0LSNpbmNsdWRlIFx1MDAzY2xpbnV4L21udF9pZG1hcHBpbmcuaFx1MDAzZVxuZnMvbmFtZXNwYWNlLmM6MzU6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvbmFtZXNwYWNlLmMtMzYtI2luY2x1ZGUgXHUwMDNjbGludXgvbnN0cmVlLmhcdTAwM2Vcbi0tXG5mcy9uYW1lc3BhY2UuYz0yODgxPXN0YXRpYyBpbnQgZG9fY2hhbmdlX3R5cGUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGludCBtc19mbGFncylcbi0tXG5mcy9uYW1lc3BhY2UuYy0yOTI5LSAqICAgICBlbnRyeSBmcm9tIG5zZnMuXG5mcy9uYW1lc3BhY2UuYzoyOTMwOiAqICgzKSBUaGUgY2FsbGVyIHRyaWVzIHRvIGNvcHkgYSBwaWRmcyBtb3VudCByZWZlcnJpbmcgdG8gYSBwaWRmZC5cbmZzL25hbWVzcGFjZS5jLTI5MzEtICogKDQpIFRoZSBjYWxsZXIgaXMgdHJ5aW5nIHRvIGNvcHkgYSBtb3VudCB0cmVlIHRoYXQgYmVsb25ncyB0byBhblxuLS1cbmZzL25hbWVzcGFjZS5jPTI5NjA9c3RhdGljIGlubGluZSBib29sIG1heV9jb3B5X3RyZWUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpXG4tLVxuZnMvbmFtZXNwYWNlLmMtMjk3MS1cbmZzL25hbWVzcGFjZS5jOjI5NzI6XHRpZiAoZF9vcCA9PSBcdTAwMjZwaWRmc19kZW50cnlfb3BlcmF0aW9ucylcbmZzL25hbWVzcGFjZS5jLTI5NzMtXHRcdHJldHVybiB0cnVlO1xuLS1cbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTE2LSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ2hhc2guaFx1MDAzZVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM6MTc6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMtMTgtXG4tLVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM9NzQ0PXN0YXRpYyBzdHJ1Y3QgZmFub3RpZnlfZXZlbnQgKmZhbm90aWZ5X2FsbG9jX2V2ZW50KFxuLS1cbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTg0OC1cdGlmIChGQU5fR1JPVVBfRkxBRyhncm91cCwgRkFOX1JFUE9SVF9QSURGRCkgXHUwMDI2XHUwMDI2XG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYzo4NDk6XHQgICAgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChwaWQsIGdmcCkpXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYy04NTAtXHRcdGdvdG8gb3V0O1xuLS1cbmZzL3BpZGZzLmMtMTEtI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkLmhcdTAwM2VcbmZzL3BpZGZzLmM6MTI6I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkZnMuaFx1MDAzZVxuZnMvcGlkZnMuYy0xMy0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuLS1cbmZzL3BpZGZzLmMtMzctXG5mcy9waWRmcy5jOjM4OnN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcGlkZnNfYXR0cl9jYWNoZXAgX19yb19hZnRlcl9pbml0O1xuZnMvcGlkZnMuYy0zOS1cbmZzL3BpZGZzLmM6NDA6c3RhdGljIHN0cnVjdCBwYXRoIHBpZGZzX3Jvb3RfcGF0aCA9IHt9O1xuZnMvcGlkZnMuYy00MS1cbmZzL3BpZGZzLmM6NDI6c3RhdGljIHN0cnVjdCBzaW1wbGVfeGF0dHJfY2FjaGUgcGlkZnNfeGFfY2FjaGU7XG5mcy9waWRmcy5jLTQzLVxuZnMvcGlkZnMuYzo0NDp2b2lkIHBpZGZzX2dldF9yb290KHN0cnVjdCBwYXRoICpwYXRoKVxuZnMvcGlkZnMuYy00NS17XG5mcy9waWRmcy5jOjQ2Olx0KnBhdGggPSBwaWRmc19yb290X3BhdGg7XG5mcy9waWRmcy5jLTQ3LVx0cGF0aF9nZXQocGF0aCk7XG4tLVxuZnMvcGlkZnMuYy00OS1cbmZzL3BpZGZzLmM6NTA6ZW51bSBwaWRmc19hdHRyX21hc2tfYml0cyB7XG5mcy9waWRmcy5jLTUxLVx0UElERlNfQVRUUl9CSVRfRVhJVFx0PSAwLFxuLS1cbmZzL3BpZGZzLmMtNTQtXG5mcy9waWRmcy5jOjU1OnN0cnVjdCBwaWRmc19hbm9uX2F0dHIge1xuZnMvcGlkZnMuYy01Ni1cdHVuc2lnbmVkIGxvbmcgYXR0cl9tYXNrO1xuLS1cbmZzL3BpZGZzLmMtNjUtXG5mcy9waWRmcy5jOjY2OnN0YXRpYyBzdHJ1Y3Qgcmhhc2h0YWJsZSBwaWRmc19pbm9faHQ7XG5mcy9waWRmcy5jLTY3LVxuZnMvcGlkZnMuYzo2ODpzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBpZGZzX2lub19odF9wYXJhbXMgPSB7XG5mcy9waWRmcy5jLTY5LVx0LmtleV9vZmZzZXRcdFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBpbm8pLFxuZnMvcGlkZnMuYy03MC1cdC5rZXlfbGVuXHRcdD0gc2l6ZW9mKHU2NCksXG5mcy9waWRmcy5jOjcxOlx0LmhlYWRfb2Zmc2V0XHRcdD0gb2Zmc2V0b2Yoc3RydWN0IHBpZCwgcGlkZnNfaGFzaCksXG5mcy9waWRmcy5jLTcyLVx0LmF1dG9tYXRpY19zaHJpbmtpbmdcdD0gdHJ1ZSxcbi0tXG5mcy9waWRmcy5jLTg1LSAqXG5mcy9waWRmcy5jOjg2OiAqIE9uIDMyIGJpdCBwaWRmc19pbm8oKSB3aWxsIHJldHVybiB0aGUgbG93ZXIgMzIgYml0LiBXaGVuXG5mcy9waWRmcy5jOjg3OiAqIHBpZGZzX2lubygpIHJldHVybnMgemVybyBhIHdyYXAgYXJvdW5kIGhhcHBlbmVkLiBXaGVuIGFcbmZzL3BpZGZzLmMtODgtICogd3JhcGFyb3VuZCBoYXBwZW5zIHRoZSA2NCBiaXQgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkgMVxuLS1cbmZzL3BpZGZzLmMtOTUtICogc2FtZSBpbm9kZSBudW1iZXIgYXJlIGxpa2VseSB0byBleGlzdCAoVGhpcyBpc24mIzM5O3QgYSBwcm9ibGVtXG5mcy9waWRmcy5jOjk2OiAqIHNpbmNlIGJlZm9yZSBwaWRmcyBwaWRmZHMgdXNlZCB0aGUgYW5vbnltb3VzIGlub2RlIG1lYW5pbmdcbmZzL3BpZGZzLmMtOTctICogYWxsIHBpZGZkcyBoYWQgdGhlIHNhbWUgaW5vZGUgbnVtYmVyLikuIFVzZXJzcGFjZSBjYW5cbi0tXG5mcy9waWRmcy5jLTEwMS0gKi9cbmZzL3BpZGZzLmM6MTAyOnN0cnVjdCBwaWRmc19hdHRyIHtcbmZzL3BpZGZzLmMtMTAzLVx0c3RydWN0IGxpc3RfaGVhZCB4YXR0cnM7XG5mcy9waWRmcy5jLTEwNC1cdHVuaW9uIHtcbmZzL3BpZGZzLmM6MTA1Olx0XHRzdHJ1Y3QgcGlkZnNfYW5vbl9hdHRyO1xuZnMvcGlkZnMuYzoxMDY6XHRcdHN0cnVjdCBsbGlzdF9ub2RlIHBpZGZzX2xsaXN0O1xuZnMvcGlkZnMuYy0xMDctXHR9O1xuLS1cbmZzL3BpZGZzLmMtMTExLVxuZnMvcGlkZnMuYzoxMTI6c3RhdGljIERFRklORV9TUElOTE9DSyhwaWRmc19pbm9fbG9jayk7XG5mcy9waWRmcy5jOjExMzpzdGF0aWMgdTY0IHBpZGZzX2lub19uciA9IDE7XG5mcy9waWRmcy5jLTExNC1cbmZzL3BpZGZzLmM6MTE1OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwaWRmc19pbm8odTY0IGlubylcbmZzL3BpZGZzLmMtMTE2LXtcbi0tXG5mcy9waWRmcy5jLTEyMC0vKiBPbiAzMiBiaXQgdGhlIGdlbmVyYXRpb24gbnVtYmVyIGFyZSB0aGUgdXBwZXIgMzIgYml0cy4gKi9cbmZzL3BpZGZzLmM6MTIxOnN0YXRpYyBpbmxpbmUgdTMyIHBpZGZzX2dlbih1NjQgaW5vKVxuZnMvcGlkZnMuYy0xMjIte1xuLS1cbmZzL3BpZGZzLmMtMTI1LVxuZnMvcGlkZnMuYzoxMjY6c3RhdGljIGlubGluZSB1NjQgcGlkZnNfYWxsb2NfaW5vKHZvaWQpXG5mcy9waWRmcy5jLTEyNy17XG4tLVxuZnMvcGlkZnMuYy0xMjktXG5mcy9waWRmcy5jOjEzMDpcdHNwaW5fbG9jayhcdTAwMjZwaWRmc19pbm9fbG9jayk7XG5mcy9waWRmcy5jOjEzMTpcdGlmIChwaWRmc19pbm8ocGlkZnNfaW5vX25yKSA9PSAwKVxuZnMvcGlkZnMuYzoxMzI6XHRcdHBpZGZzX2lub19uciYjNDM7JiM0Mzs7XG5mcy9waWRmcy5jOjEzMzpcdGlubyA9IHBpZGZzX2lub19uciYjNDM7JiM0Mzs7XG5mcy9waWRmcy5jOjEzNDpcdHNwaW5fdW5sb2NrKFx1MDAyNnBpZGZzX2lub19sb2NrKTtcbmZzL3BpZGZzLmMtMTM1LVx0cmV0dXJuIGlubztcbi0tXG5mcy9waWRmcy5jLTE0MC0vKiBPbiA2NCBiaXQgc2ltcGx5IHJldHVybiBpbm8uICovXG5mcy9waWRmcy5jOjE0MTpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGlkZnNfaW5vKHU2NCBpbm8pXG5mcy9waWRmcy5jLTE0Mi17XG4tLVxuZnMvcGlkZnMuYy0xNDYtLyogT24gNjQgYml0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBpcyAwLiAqL1xuZnMvcGlkZnMuYzoxNDc6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXG5mcy9waWRmcy5jLTE0OC17XG4tLVxuZnMvcGlkZnMuYy0xNTEtXG5mcy9waWRmcy5jOjE1MjpERUZJTkVfQ09PS0lFKHBpZGZzX2lub19jb29raWUpO1xuZnMvcGlkZnMuYy0xNTMtXG5mcy9waWRmcy5jOjE1NDpzdGF0aWMgdTY0IHBpZGZzX2FsbG9jX2lubyh2b2lkKVxuZnMvcGlkZnMuYy0xNTUte1xuLS1cbmZzL3BpZGZzLmMtMTU4LVx0cHJlZW1wdF9kaXNhYmxlKCk7XG5mcy9waWRmcy5jOjE1OTpcdGlubyA9IGdlbl9jb29raWVfbmV4dChcdTAwMjZwaWRmc19pbm9fY29va2llKTtcbmZzL3BpZGZzLmMtMTYwLVx0cHJlZW1wdF9lbmFibGUoKTtcbi0tXG5mcy9waWRmcy5jLTE2Ny1cbmZzL3BpZGZzLmM6MTY4OnZvaWQgcGlkZnNfcHJlcGFyZV9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xNjkte1xuLS1cbmZzL3BpZGZzLmMtMTc0LVxuZnMvcGlkZnMuYzoxNzU6aW50IHBpZGZzX2FkZF9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xNzYte1xuLS1cbmZzL3BpZGZzLmMtMTc4LVxuZnMvcGlkZnMuYzoxNzk6XHRwaWQtXHUwMDNlaW5vID0gcGlkZnNfYWxsb2NfaW5vKCk7XG5mcy9waWRmcy5jOjE4MDpcdHJldCA9IHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoXHUwMDI2cGlkZnNfaW5vX2h0LCBcdTAwMjZwaWQtXHUwMDNlcGlkZnNfaGFzaCxcbmZzL3BpZGZzLmM6MTgxOlx0XHRcdFx0ICAgICBwaWRmc19pbm9faHRfcGFyYW1zKTtcbmZzL3BpZGZzLmMtMTgyLVx0aWYgKHVubGlrZWx5KHJldCkpXG4tLVxuZnMvcGlkZnMuYy0xODYtXG5mcy9waWRmcy5jOjE4Nzp2b2lkIHBpZGZzX3JlbW92ZV9waWQoc3RydWN0IHBpZCAqcGlkKVxuZnMvcGlkZnMuYy0xODgte1xuZnMvcGlkZnMuYy0xODktXHRpZiAobGlrZWx5KHBpZC1cdTAwM2Vpbm8pKVxuZnMvcGlkZnMuYzoxOTA6XHRcdHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoXHUwMDI2cGlkZnNfaW5vX2h0LCBcdTAwMjZwaWQtXHUwMDNlcGlkZnNfaGFzaCxcbmZzL3BpZGZzLmM6MTkxOlx0XHRcdFx0ICAgICAgIHBpZGZzX2lub19odF9wYXJhbXMpO1xuZnMvcGlkZnMuYy0xOTItfVxuZnMvcGlkZnMuYy0xOTMtXG5mcy9waWRmcy5jOjE5NDpzdGF0aWMgTExJU1RfSEVBRChwaWRmc19mcmVlX2xpc3QpO1xuZnMvcGlkZnMuYy0xOTUtXG5mcy9waWRmcy5jOjE5NjpzdGF0aWMgdm9pZCBwaWRmc19mcmVlX2F0dHJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5mcy9waWRmcy5jLTE5Ny17XG5mcy9waWRmcy5jOjE5ODpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyLCAqbmV4dDtcbmZzL3BpZGZzLmMtMTk5LVx0c3RydWN0IGxsaXN0X25vZGUgKmhlYWQ7XG5mcy9waWRmcy5jLTIwMC1cbmZzL3BpZGZzLmM6MjAxOlx0aGVhZCA9IGxsaXN0X2RlbF9hbGwoXHUwMDI2cGlkZnNfZnJlZV9saXN0KTtcbmZzL3BpZGZzLmM6MjAyOlx0bGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdHRyLCBuZXh0LCBoZWFkLCBwaWRmc19sbGlzdCkge1xuZnMvcGlkZnMuYzoyMDM6XHRcdHNpbXBsZV94YXR0cnNfZnJlZShcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2YXR0ci1cdTAwM2V4YXR0cnMsIE5VTEwpO1xuZnMvcGlkZnMuYy0yMDQtXHRcdGtmcmVlKGF0dHIpO1xuLS1cbmZzL3BpZGZzLmMtMjA3LVxuZnMvcGlkZnMuYzoyMDg6c3RhdGljIERFQ0xBUkVfV09SSyhwaWRmc19mcmVlX3dvcmssIHBpZGZzX2ZyZWVfYXR0cl93b3JrKTtcbmZzL3BpZGZzLmMtMjA5LVxuZnMvcGlkZnMuYzoyMTA6dm9pZCBwaWRmc19mcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpXG5mcy9waWRmcy5jLTIxMS17XG5mcy9waWRmcy5jOjIxMjpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyID0gcGlkLVx1MDAzZWF0dHI7XG5mcy9waWRmcy5jLTIxMy1cbi0tXG5mcy9waWRmcy5jLTIzMi1cdFx0a2ZyZWUoYXR0cik7XG5mcy9waWRmcy5jOjIzMzpcdGVsc2UgaWYgKGxsaXN0X2FkZChcdTAwMjZhdHRyLVx1MDAzZXBpZGZzX2xsaXN0LCBcdTAwMjZwaWRmc19mcmVlX2xpc3QpKVxuZnMvcGlkZnMuYzoyMzQ6XHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2cGlkZnNfZnJlZV93b3JrKTtcbmZzL3BpZGZzLmMtMjM1LX1cbi0tXG5mcy9waWRmcy5jPTMzMD1zdGF0aWMgaW5saW5lIGJvb2wgcGlkX2luX2N1cnJlbnRfcGlkbnMoY29uc3Qgc3RydWN0IHBpZCAqcGlkKVxuLS1cbmZzL3BpZGZzLmMtMzM5LVxuZnMvcGlkZnMuYzozNDA6c3RhdGljIF9fdTMyIHBpZGZzX2NvcmVkdW1wX21hc2soZW51bSB0YXNrX2R1bXBhYmxlIGR1bXBhYmxlKVxuZnMvcGlkZnMuYy0zNDEte1xuLS1cbmZzL3BpZGZzLmM9MzY2PXN0YXRpYyBsb25nIHBpZGZkX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL3BpZGZzLmMtMzczLVx0c3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuZnMvcGlkZnMuYzozNzQ6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtMzc1LVx0Y29uc3Qgc3RydWN0IGNyZWQgKmM7XG4tLVxuZnMvcGlkZnMuYy00MzQtXHRpZiAoKG1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIFx1MDAyNlx1MDAyNiAha2luZm8uY29yZWR1bXBfbWFzaykge1xuZnMvcGlkZnMuYzo0MzU6XHRcdGtpbmZvLmNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKHRhc2tfZXhlY19zdGF0ZV9nZXRfZHVtcGFibGUodGFzaykpO1xuZnMvcGlkZnMuYy00MzYtXHRcdGtpbmZvLm1hc2sgfD0gUElERkRfSU5GT19DT1JFRFVNUDtcbi0tXG5mcy9waWRmcy5jLTQ5OS1cbmZzL3BpZGZzLmM6NTAwOnN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpXG5mcy9waWRmcy5jLTUwMS17XG4tLVxuZnMvcGlkZnMuYz03MDU9c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL3BpZGZzLmMtNzEwLVxuZnMvcGlkZnMuYzo3MTE6XHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG5mcy9waWRmcy5jLTcxMi1cdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbi0tXG5mcy9waWRmcy5jPTc0OD1zdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxuZnMvcGlkZnMuYy03NTctXG5mcy9waWRmcy5jOjc1ODpzdGF0aWMgaW50IHBpZGZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbmZzL3BpZGZzLmMtNzU5LXtcbi0tXG5mcy9waWRmcy5jLTc3Ny1cbmZzL3BpZGZzLmM6Nzc4OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBpZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHtcbmZzL3BpZGZzLmM6Nzc5Olx0LnJlbGVhc2VcdD0gcGlkZnNfZmlsZV9yZWxlYXNlLFxuZnMvcGlkZnMuYy03ODAtXHQucG9sbFx0XHQ9IHBpZGZkX3BvbGwsXG4tLVxuZnMvcGlkZnMuYz03OTA9c3RydWN0IHBpZCAqcGlkZmRfcGlkKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvcGlkZnMuYy03OTEte1xuZnMvcGlkZnMuYzo3OTI6XHRpZiAoZmlsZS1cdTAwM2VmX29wICE9IFx1MDAyNnBpZGZzX2ZpbGVfb3BlcmF0aW9ucylcbmZzL3BpZGZzLmMtNzkzLVx0XHRyZXR1cm4gRVJSX1BUUigtRUJBREYpO1xuLS1cbmZzL3BpZGZzLmMtODA0LSAqIHBpZC1cdTAwM2VhdHRyIHdpbGwgYmUgYWxsb2NhdGVkLiBJZiBub3Qgd2UgbWFyayB0aGUgc3RydWN0IHBpZCBhcyBkZWFkIHNvXG5mcy9waWRmcy5jOjgwNTogKiBhbnlvbmUgd2hvIGlzIHRyeWluZyB0byByZWdpc3RlciBpdCB3aXRoIHBpZGZzIHdpbGwgZmFpbCB0byBkbyBzby5cbmZzL3BpZGZzLmM6ODA2OiAqIE90aGVyd2lzZSB3ZSB3b3VsZCBoYW5kIG91dCBwaWRmcyBmb3IgcmVhcGVkIHRhc2tzIHdpdGhvdXQgaGF2aW5nXG5mcy9waWRmcy5jLTgwNy0gKiBleGl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS5cbi0tXG5mcy9waWRmcy5jLTgxMC0gKiByaWdodCBhd2F5IGluIGZyZWVfcGlkKCkgd2hlbiBubyBvbmUgaG9sZHMgYSBwaWRmZCBhbnltb3JlLiBTaW5jZVxuZnMvcGlkZnMuYzo4MTE6ICogcGlkZnNfZXhpdCgpIGN1cnJlbnRseSBpcyBwbGFjZWQgYWZ0ZXIgZXhpdF90YXNrX3dvcmsoKSB3ZSBrbm93IHRoYXRcbmZzL3BpZGZzLmMtODEyLSAqIGl0IGNhbm5vdCBiZSB1cyBha2EgdGhlIGV4aXRpbmcgdGFzayBob2xkaW5nIGEgcGlkZmQgdG8gaXRzZWxmLlxuZnMvcGlkZnMuYy04MTMtICovXG5mcy9waWRmcy5jOjgxNDp2b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5mcy9waWRmcy5jLTgxNS17XG5mcy9waWRmcy5jLTgxNi1cdHN0cnVjdCBwaWQgKnBpZCA9IHRhc2tfcGlkKHRzayk7XG5mcy9waWRmcy5jOjgxNzpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xuZnMvcGlkZnMuYy04MTgtI2lmZGVmIENPTkZJR19DR1JPVVBTXG4tLVxuZnMvcGlkZnMuYy04MjMtXG5mcy9waWRmcy5jOjgyNDpcdC8qIFN5bmNocm9uaXplIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkuICovXG5mcy9waWRmcy5jLTgyNS1cdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnEsIFx1MDAyNnBpZC1cdTAwM2V3YWl0X3BpZGZkLmxvY2spIHtcbi0tXG5mcy9waWRmcy5jLTgyOS1cdFx0XHQgKiBObyBvbmUgZXZlciBoZWxkIGEgcGlkZmQgZm9yIHRoaXMgc3RydWN0IHBpZC5cbmZzL3BpZGZzLmM6ODMwOlx0XHRcdCAqIE1hcmsgaXQgYXMgZGVhZCBzbyBubyBvbmUgY2FuIGFkZCBhIHBpZGZzXG5mcy9waWRmcy5jLTgzMS1cdFx0XHQgKiBlbnRyeSBhbnltb3JlLiBXZSYjMzk7cmUgYWJvdXQgdG8gYmUgcmVhcGVkIGFuZFxuLS1cbmZzL3BpZGZzLmMtODYwLSNpZmRlZiBDT05GSUdfQ09SRURVTVBcbmZzL3BpZGZzLmM6ODYxOnZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL3BpZGZzLmMtODYyLXtcbmZzL3BpZGZzLmMtODYzLVx0c3RydWN0IHBpZCAqcGlkID0gY3BybS1cdTAwM2VwaWQ7XG5mcy9waWRmcy5jOjg2NDpcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xuZnMvcGlkZnMuYy04NjUtXG4tLVxuZnMvcGlkZnMuYy04NzEtXHQvKiBOb3RlIGhvdyB3ZSB3ZXJlIGNvcmVkdW1wZWQgYW5kIHRoYXQgd2UgY29yZWR1bXBlZC4gKi9cbmZzL3BpZGZzLmM6ODcyOlx0YXR0ci1cdTAwM2Vjb3JlZHVtcF9tYXNrID0gcGlkZnNfY29yZWR1bXBfbWFzayhjcHJtLVx1MDAzZWR1bXBhYmxlKSB8XG5mcy9waWRmcy5jLTg3My1cdFx0XHQgICAgICBQSURGRF9DT1JFRFVNUEVEO1xuLS1cbmZzL3BpZGZzLmMtODgzLVxuZnMvcGlkZnMuYzo4ODQ6c3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqcGlkZnNfbW50IF9fcm9fYWZ0ZXJfaW5pdDtcbmZzL3BpZGZzLmMtODg1LVxuLS1cbmZzL3BpZGZzLmMtODkwLSAqL1xuZnMvcGlkZnMuYzo4OTE6c3RhdGljIGludCBwaWRmc19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9waWRmcy5jLTg5Mi1cdFx0XHQgc3RydWN0IGlhdHRyICphdHRyKVxuLS1cbmZzL3BpZGZzLmMtODk2LVxuZnMvcGlkZnMuYzo4OTc6c3RhdGljIGludCBwaWRmc19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcbmZzL3BpZGZzLmMtODk4LVx0XHRcdCBzdHJ1Y3Qga3N0YXQgKnN0YXQsIHUzMiByZXF1ZXN0X21hc2ssXG4tLVxuZnMvcGlkZnMuYy05MDMtXG5mcy9waWRmcy5jOjkwNDpzdGF0aWMgc3NpemVfdCBwaWRmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWYsIHNpemVfdCBzaXplKVxuZnMvcGlkZnMuYy05MDUte1xuLS1cbmZzL3BpZGZzLmMtOTExLVxuZnMvcGlkZnMuYzo5MTI6c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHBpZGZzX2lub2RlX29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjkxMzpcdC5nZXRhdHRyXHQ9IHBpZGZzX2dldGF0dHIsXG5mcy9waWRmcy5jOjkxNDpcdC5zZXRhdHRyXHQ9IHBpZGZzX3NldGF0dHIsXG5mcy9waWRmcy5jOjkxNTpcdC5saXN0eGF0dHJcdD0gcGlkZnNfbGlzdHhhdHRyLFxuZnMvcGlkZnMuYy05MTYtfTtcbmZzL3BpZGZzLmMtOTE3LVxuZnMvcGlkZnMuYzo5MTg6c3RhdGljIHZvaWQgcGlkZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL3BpZGZzLmMtOTE5LXtcbi0tXG5mcy9waWRmcy5jLTkyNS1cbmZzL3BpZGZzLmM6OTI2OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaWRmc19zb3BzID0ge1xuZnMvcGlkZnMuYy05MjctXHQuZHJvcF9pbm9kZVx0PSBpbm9kZV9qdXN0X2Ryb3AsXG5mcy9waWRmcy5jOjkyODpcdC5ldmljdF9pbm9kZVx0PSBwaWRmc19ldmljdF9pbm9kZSxcbmZzL3BpZGZzLmMtOTI5LVx0LnN0YXRmc1x0XHQ9IHNpbXBsZV9zdGF0ZnMsXG4tLVxuZnMvcGlkZnMuYy05MzMtICogJiMzOTtsc29mJiMzOTsgaGFzIGtub3dsZWRnZSBvZiBvdXQgaGlzdG9yaWNhbCBhbm9uX2lub2RlIHVzZSwgYW5kIGV4cGVjdHNcbmZzL3BpZGZzLmM6OTM0OiAqIHRoZSBwaWRmcyBkZW50cnkgbmFtZSB0byBzdGFydCB3aXRoICYjMzk7YW5vbl9pbm9kZSYjMzk7LlxuZnMvcGlkZnMuYy05MzUtICovXG5mcy9waWRmcy5jOjkzNjpzdGF0aWMgY2hhciAqcGlkZnNfZG5hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pXG5mcy9waWRmcy5jLTkzNy17XG4tLVxuZnMvcGlkZnMuYy05NDAtXG5mcy9waWRmcy5jOjk0MTpjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjk0MjpcdC5kX2RuYW1lXHQ9IHBpZGZzX2RuYW1lLFxuZnMvcGlkZnMuYy05NDMtXHQuZF9wcnVuZVx0PSBzdGFzaGVkX2RlbnRyeV9wcnVuZSxcbi0tXG5mcy9waWRmcy5jLTk0NS1cbmZzL3BpZGZzLmM6OTQ2OnN0YXRpYyBpbnQgcGlkZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcbmZzL3BpZGZzLmMtOTQ3LVx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqcGFyZW50KVxuLS1cbmZzL3BpZGZzLmMtOTYxLS8qIEZpbmQgYSBzdHJ1Y3QgcGlkIGJhc2VkIG9uIHRoZSBpbm9kZSBudW1iZXIuICovXG5mcy9waWRmcy5jOjk2MjpzdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcbmZzL3BpZGZzLmMtOTYzLXtcbmZzL3BpZGZzLmMtOTY0LVx0c3RydWN0IHBpZCAqcGlkO1xuZnMvcGlkZnMuYzo5NjU6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtOTY2LVxuZnMvcGlkZnMuYy05NjctXHRndWFyZChyY3UpKCk7XG5mcy9waWRmcy5jOjk2ODpcdHBpZCA9IHJoYXNodGFibGVfbG9va3VwKFx1MDAyNnBpZGZzX2lub19odCwgXHUwMDI2aW5vLCBwaWRmc19pbm9faHRfcGFyYW1zKTtcbmZzL3BpZGZzLmMtOTY5LVx0aWYgKCFwaWQpXG4tLVxuZnMvcGlkZnMuYy05ODEtXG5mcy9waWRmcy5jOjk4MjpzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG5mcy9waWRmcy5jLTk4My1cdFx0XHRcdFx0IHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbixcbi0tXG5mcy9waWRmcy5jLTEwMDEtXG5mcy9waWRmcy5jOjEwMDI6XHRwaWQgPSBwaWRmc19pbm9fZ2V0X3BpZChwaWRfaW5vKTtcbmZzL3BpZGZzLmMtMTAwMy1cdGlmICghcGlkKVxuLS1cbmZzL3BpZGZzLmMtMTAwNS1cbmZzL3BpZGZzLmM6MTAwNjpcdHJldCA9IHBhdGhfZnJvbV9zdGFzaGVkKFx1MDAyNnBpZC1cdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIHBpZCwgXHUwMDI2cGF0aCk7XG5mcy9waWRmcy5jLTEwMDctXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmZzL3BpZGZzLmMtMTAxNS1cbmZzL3BpZGZzLmM6MTAxNjpzdGF0aWMgc3RydWN0IGZpbGUgKnBpZGZzX2RlbnRyeV9vcGVuKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLFxuZnMvcGlkZnMuYy0xMDE3LVx0XHRcdFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuLS1cbmZzL3BpZGZzLmMtMTAzNy1cbmZzL3BpZGZzLmM6MTAzODpzdGF0aWMgaW50IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uKHN0cnVjdCBoYW5kbGVfdG9fcGF0aF9jdHggKmN0eCxcbmZzL3BpZGZzLmMtMTAzOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBvZmxhZ3MpXG4tLVxuZnMvcGlkZnMuYy0xMDUxLVxuZnMvcGlkZnMuYzoxMDUyOnN0YXRpYyBzdHJ1Y3QgZmlsZSAqcGlkZnNfZXhwb3J0X29wZW4oY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGludCBvZmxhZ3MpXG5mcy9waWRmcy5jLTEwNTMte1xuLS1cbmZzL3BpZGZzLmMtMTA2MC1cdC8qIENsZWFyIE9fTEFSR0VGSUxFIGFzIG9wZW5fYnlfaGFuZGxlX2F0KCkgZm9yY2VzIGl0LiAqL1xuZnMvcGlkZnMuYzoxMDYxOlx0cmV0dXJuIHBpZGZzX2RlbnRyeV9vcGVuKHBhdGgsIG9mbGFncyBcdTAwMjYgfk9fTEFSR0VGSUxFLCBjdXJyZW50X2NyZWQoKSk7XG5mcy9waWRmcy5jLTEwNjItfVxuZnMvcGlkZnMuYy0xMDYzLVxuZnMvcGlkZnMuYzoxMDY0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcGlkZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7XG5mcy9waWRmcy5jOjEwNjU6XHQuZW5jb2RlX2ZoXHQ9IHBpZGZzX2VuY29kZV9maCxcbmZzL3BpZGZzLmM6MTA2NjpcdC5maF90b19kZW50cnlcdD0gcGlkZnNfZmhfdG9fZGVudHJ5LFxuZnMvcGlkZnMuYzoxMDY3Olx0Lm9wZW5cdFx0PSBwaWRmc19leHBvcnRfb3BlbixcbmZzL3BpZGZzLmM6MTA2ODpcdC5wZXJtaXNzaW9uXHQ9IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uLFxuZnMvcGlkZnMuYy0xMDY5LX07XG5mcy9waWRmcy5jLTEwNzAtXG5mcy9waWRmcy5jOjEwNzE6c3RhdGljIGludCBwaWRmc19pbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG5mcy9waWRmcy5jLTEwNzIte1xuLS1cbmZzL3BpZGZzLmMtMTA3OS1cdGlub2RlLVx1MDAzZWlfbW9kZSB8PSBTX0lSV1hVO1xuZnMvcGlkZnMuYzoxMDgwOlx0aW5vZGUtXHUwMDNlaV9vcCA9IFx1MDAyNnBpZGZzX2lub2RlX29wZXJhdGlvbnM7XG5mcy9waWRmcy5jOjEwODE6XHRpbm9kZS1cdTAwM2VpX2ZvcCA9IFx1MDAyNnBpZGZzX2ZpbGVfb3BlcmF0aW9ucztcbmZzL3BpZGZzLmM6MTA4MjpcdGlub2RlLVx1MDAzZWlfaW5vID0gcGlkZnNfaW5vKHBpZC1cdTAwM2Vpbm8pO1xuZnMvcGlkZnMuYzoxMDgzOlx0aW5vZGUtXHUwMDNlaV9nZW5lcmF0aW9uID0gcGlkZnNfZ2VuKHBpZC1cdTAwM2Vpbm8pO1xuZnMvcGlkZnMuYy0xMDg0LVx0cmV0dXJuIDA7XG4tLVxuZnMvcGlkZnMuYy0xMDg2LVxuZnMvcGlkZnMuYzoxMDg3OnN0YXRpYyB2b2lkIHBpZGZzX3B1dF9kYXRhKHZvaWQgKmRhdGEpXG5mcy9waWRmcy5jLTEwODgte1xuLS1cbmZzL3BpZGZzLmMtMTA5My0vKipcbmZzL3BpZGZzLmM6MTA5NDogKiBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwIC0gcmVnaXN0ZXIgYSBzdHJ1Y3QgcGlkIGluIHBpZGZzIHdpdGggY3VzdG9tIEdGUFxuZnMvcGlkZnMuYy0xMDk1LSAqIGZsYWdzXG4tLVxuZnMvcGlkZnMuYy0xMDk4LSAqXG5mcy9waWRmcy5jOjEwOTk6ICogUmVnaXN0ZXIgYSBzdHJ1Y3QgcGlkIGluIHBpZGZzIHdpdGggY3VzdG9tIEdGUCBmbGFncy5cbmZzL3BpZGZzLmMtMTEwMC0gKlxuLS1cbmZzL3BpZGZzLmMtMTEwMi0gKi9cbmZzL3BpZGZzLmM6MTEwMzppbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcbmZzL3BpZGZzLmMtMTEwNC17XG5mcy9waWRmcy5jOjExMDU6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqbmV3X2F0dHIgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG5mcy9waWRmcy5jOjExMDY6XHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbmZzL3BpZGZzLmMtMTEwNy1cbi0tXG5mcy9waWRmcy5jLTExMTgtXG5mcy9waWRmcy5jOjExMTk6XHRuZXdfYXR0ciA9IGttZW1fY2FjaGVfemFsbG9jKHBpZGZzX2F0dHJfY2FjaGVwLCBnZnApO1xuZnMvcGlkZnMuYy0xMTIwLVx0aWYgKCFuZXdfYXR0cilcbi0tXG5mcy9waWRmcy5jLTExMjQtXG5mcy9waWRmcy5jOjExMjU6XHQvKiBTeW5jaHJvbml6ZSB3aXRoIHBpZGZzX2V4aXQoKS4gKi9cbmZzL3BpZGZzLmMtMTEyNi1cdGd1YXJkKHNwaW5sb2NrX2lycSkoXHUwMDI2cGlkLVx1MDAzZXdhaXRfcGlkZmQubG9jayk7XG4tLVxuZnMvcGlkZnMuYy0xMTM3LVxuZnMvcGlkZnMuYzoxMTM4OnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwaWRmc19zdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsXG5mcy9waWRmcy5jLTExMzktXHRcdFx0XHRcdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4tLVxuZnMvcGlkZnMuYy0xMTQ1LVxuZnMvcGlkZnMuYzoxMTQ2Olx0cmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XG5mcy9waWRmcy5jLTExNDctXHRpZiAocmV0KVxuLS1cbmZzL3BpZGZzLmMtMTE1Mi1cbmZzL3BpZGZzLmM6MTE1MzpzdGF0aWMgY29uc3Qgc3RydWN0IHN0YXNoZWRfb3BlcmF0aW9ucyBwaWRmc19zdGFzaGVkX29wcyA9IHtcbmZzL3BpZGZzLmM6MTE1NDpcdC5zdGFzaF9kZW50cnlcdD0gcGlkZnNfc3Rhc2hfZGVudHJ5LFxuZnMvcGlkZnMuYzoxMTU1Olx0LmluaXRfaW5vZGVcdD0gcGlkZnNfaW5pdF9pbm9kZSxcbmZzL3BpZGZzLmM6MTE1NjpcdC5wdXRfZGF0YVx0PSBwaWRmc19wdXRfZGF0YSxcbmZzL3BpZGZzLmMtMTE1Ny19O1xuZnMvcGlkZnMuYy0xMTU4LVxuZnMvcGlkZnMuYzoxMTU5OnN0YXRpYyBpbnQgcGlkZnNfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLFxuZnMvcGlkZnMuYy0xMTYwLVx0XHRcdCAgIHN0cnVjdCBkZW50cnkgKnVudXNlZCwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9waWRmcy5jLTExNjUtXG5mcy9waWRmcy5jOjExNjY6XHRyZXR1cm4gc2ltcGxlX3hhdHRyX2dldChcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2cGlkLVx1MDAzZWF0dHItXHUwMDNleGF0dHJzLCBuYW1lLCB2YWx1ZSwgc2l6ZSk7XG5mcy9waWRmcy5jLTExNjctfVxuZnMvcGlkZnMuYy0xMTY4LVxuZnMvcGlkZnMuYzoxMTY5OnN0YXRpYyBpbnQgcGlkZnNfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLFxuZnMvcGlkZnMuYy0xMTcwLVx0XHRcdCAgIHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsXG4tLVxuZnMvcGlkZnMuYy0xMTgwLVxuZnMvcGlkZnMuYzoxMTgxOlx0b2xkX3hhdHRyID0gc2ltcGxlX3hhdHRyX3NldChcdTAwMjZwaWRmc194YV9jYWNoZSwgXHUwMDI2cGlkLVx1MDAzZWF0dHItXHUwMDNleGF0dHJzLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpO1xuZnMvcGlkZnMuYy0xMTgyLVx0aWYgKElTX0VSUihvbGRfeGF0dHIpKVxuLS1cbmZzL3BpZGZzLmMtMTE4OC1cbmZzL3BpZGZzLmM6MTE4OTpzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgcGlkZnNfdHJ1c3RlZF94YXR0cl9oYW5kbGVyID0ge1xuZnMvcGlkZnMuYy0xMTkwLVx0LnByZWZpeCA9IFhBVFRSX1RSVVNURURfUFJFRklYLFxuZnMvcGlkZnMuYzoxMTkxOlx0LmdldFx0PSBwaWRmc194YXR0cl9nZXQsXG5mcy9waWRmcy5jOjExOTI6XHQuc2V0XHQ9IHBpZGZzX3hhdHRyX3NldCxcbmZzL3BpZGZzLmMtMTE5My19O1xuZnMvcGlkZnMuYy0xMTk0LVxuZnMvcGlkZnMuYzoxMTk1OnN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqY29uc3QgcGlkZnNfeGF0dHJfaGFuZGxlcnNbXSA9IHtcbmZzL3BpZGZzLmM6MTE5NjpcdFx1MDAyNnBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlcixcbmZzL3BpZGZzLmMtMTE5Ny1cdE5VTExcbi0tXG5mcy9waWRmcy5jLTExOTktXG5mcy9waWRmcy5jOjEyMDA6c3RhdGljIGludCBwaWRmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZnMvcGlkZnMuYy0xMjAxLXtcbi0tXG5mcy9waWRmcy5jLTEyMDgtXHRjdHgtXHUwMDNlc19kX2ZsYWdzIHw9IERDQUNIRV9ET05UQ0FDSEU7XG5mcy9waWRmcy5jOjEyMDk6XHRjdHgtXHUwMDNlb3BzID0gXHUwMDI2cGlkZnNfc29wcztcbmZzL3BpZGZzLmM6MTIxMDpcdGN0eC1cdTAwM2Vlb3BzID0gXHUwMDI2cGlkZnNfZXhwb3J0X29wZXJhdGlvbnM7XG5mcy9waWRmcy5jOjEyMTE6XHRjdHgtXHUwMDNlZG9wcyA9IFx1MDAyNnBpZGZzX2RlbnRyeV9vcGVyYXRpb25zO1xuZnMvcGlkZnMuYzoxMjEyOlx0Y3R4LVx1MDAzZXhhdHRyID0gcGlkZnNfeGF0dHJfaGFuZGxlcnM7XG5mcy9waWRmcy5jOjEyMTM6XHRmYy1cdTAwM2VzX2ZzX2luZm8gPSAodm9pZCAqKVx1MDAyNnBpZGZzX3N0YXNoZWRfb3BzO1xuZnMvcGlkZnMuYy0xMjE0LVx0cmV0dXJuIDA7XG4tLVxuZnMvcGlkZnMuYy0xMjE2LVxuZnMvcGlkZnMuYzoxMjE3OnN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBwaWRmc190eXBlID0ge1xuZnMvcGlkZnMuYzoxMjE4Olx0Lm5hbWVcdFx0XHQ9IFwmIzM0O3BpZGZzXCYjMzQ7LFxuZnMvcGlkZnMuYzoxMjE5Olx0LmluaXRfZnNfY29udGV4dFx0PSBwaWRmc19pbml0X2ZzX2NvbnRleHQsXG5mcy9waWRmcy5jLTEyMjAtXHQua2lsbF9zYlx0XHQ9IGtpbGxfYW5vbl9zdXBlcixcbi0tXG5mcy9waWRmcy5jLTEyMjItXG5mcy9waWRmcy5jOjEyMjM6c3RydWN0IGZpbGUgKnBpZGZzX2FsbG9jX2ZpbGUoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG5mcy9waWRmcy5jLTEyMjQte1xuLS1cbmZzL3BpZGZzLmMtMTIzNC1cbmZzL3BpZGZzLmM6MTIzNTpcdHJldCA9IHBhdGhfZnJvbV9zdGFzaGVkKFx1MDAyNnBpZC1cdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIGdldF9waWQocGlkKSwgXHUwMDI2cGF0aCk7XG5mcy9waWRmcy5jLTEyMzYtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmZzL3BpZGZzLmMtMTI0MS1cdGZsYWdzIFx1MDAyNj0gflBJREZEX1NUQUxFO1xuZnMvcGlkZnMuYzoxMjQyOlx0cmV0dXJuIHBpZGZzX2RlbnRyeV9vcGVuKFx1MDAyNnBhdGgsIGZsYWdzLCBjdXJyZW50X2NyZWQoKSk7XG5mcy9waWRmcy5jLTEyNDMtfVxuZnMvcGlkZnMuYy0xMjQ0LVxuZnMvcGlkZnMuYzoxMjQ1OnZvaWQgX19pbml0IHBpZGZzX2luaXQodm9pZClcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2OTY1CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTA0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIEZpbGVzeXN0ZW0gTW9kdWxlIEJ1aWxkIFByb2Nlc3MqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBwaWRmcy5vYCBpcyBiZWluZyBpbmNsdWRlZCBpbiB0aGUga2VybmVsIGJ1aWxkLiBUaGUgZmlyc3QgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmcy9NYWtlZmlsZWAuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB6ZXJvaW5nIGluIG9uIGxpbmUgMTguIEFoLCB0aGVyZSBpdCBpczogYG9iai15IDo9IG9wZW4ubyByZWFkX3dyaXRlLm8gLi4uIHBpZGZzLm8gLi4uYC4gIFNvIGBwaWRmcy5vYCBpcyBidWlsdCB1bmNvbmRpdGlvbmFsbHkgYXMgcGFydCBvZiB0aGUgY29yZSBgZnMvYCBkaXJlY3RvcnksIGluZGljYXRlZCBieSBgb2JqLXlgLiBUaGF0IGNvbmZpcm1zIGl0JiMzOTtzIGEgY3JpdGljYWwgY29tcG9uZW50LgoKTm93LCBJJiMzOTttIHRoaW5raW5nLCBJIHdhbnQgdG8gdHJhY2UgdGhlIGRlcGVuZGVuY2llcyBmdXJ0aGVyLCBhbmQgSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGF0IGBmc19zdHJ1Y3QuY2AgaXMgYmVpbmcgaW5jbHVkZWQgcHJvcGVybHkuIEkgc2hvdWxkIGNoZWNrIHRoZSBgZnMvTWFrZWZpbGVgIGFnYWluLCB0aGlzIHRpbWUgbG9va2luZyBmb3IgYGZzX3N0cnVjdC5vYCBvciBhIHNpbWlsYXIgb2JqZWN0IGZpbGUuICBMZXQmIzM5O3Mgc2NhbiB0aHJvdWdoIGxpbmVzIDEwIHRocm91Z2ggMjUgdG8gc2VlIGhvdyBpdCYjMzk7cyBiZWluZyBoYW5kbGVkLiBUaGlzIHNob3VsZCBoZWxwIG1lIGNvbmZpcm0gaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNcbiAgIDM6XHQjIE1ha2VmaWxlIGZvciB0aGUgTGludXggZmlsZXN5c3RlbXMuXG4gICA0Olx0I1xuICAgNTpcdCMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIFx1MDAzY2hjaEBpbmZyYWRlYWQub3JnXHUwMDNlXG4gICA2Olx0IyBSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYtc3RhdGVtZW50cy5cbiAgIDc6XHQjIFxuICAgODpcdFxuICAgOTpcdFxuICAxMDpcdG9iai15IDo9XHRvcGVuLm8gcmVhZF93cml0ZS5vIGZpbGVfdGFibGUubyBzdXBlci5vIFxcXG4gIDExOlx0XHRcdGNoYXJfZGV2Lm8gc3RhdC5vIGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFxcXG4gIDEyOlx0XHRcdGlvY3RsLm8gcmVhZGRpci5vIHNlbGVjdC5vIGRjYWNoZS5vIGlub2RlLm8gXFxcbiAgMTM6XHRcdFx0YXR0ci5vIGJhZF9pbm9kZS5vIGZpbGUubyBmaWxlc3lzdGVtcy5vIG5hbWVzcGFjZS5vIFxcXG4gIDE0Olx0XHRcdHNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIFxcXG4gIDE1Olx0XHRcdHBub2RlLm8gc3BsaWNlLm8gc3luYy5vIHV0aW1lcy5vIGRfcGF0aC5vIFxcXG4gIDE2Olx0XHRcdHN0YWNrLm8gZnNfc3RydWN0Lm8gc3RhdGZzLm8gZnNfcGluLm8gbnNmcy5vIFxcXG4gIDE3Olx0XHRcdGZzX2RpcmVudC5vIGZzX2NvbnRleHQubyBmc19wYXJzZXIubyBmc29wZW4ubyBpbml0Lm8gXFxcbiAgMTg6XHRcdFx0a2VybmVsX3JlYWRfZmlsZS5vIG1udF9pZG1hcHBpbmcubyByZW1hcF9yYW5nZS5vIHBpZGZzLm8gXFxcbiAgMTk6XHRcdFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXG4gIDIwOlx0XG4gIDIxOlx0b2JqLSQoQ09ORklHX0JVRkZFUl9IRUFEKVx0JiM0Mzs9IGJ1ZmZlci5vIG1wYWdlLm9cbiAgMjI6XHRvYmotJChDT05GSUdfUFJPQ19GUylcdFx0JiM0Mzs9IHByb2NfbmFtZXNwYWNlLm9cbiAgMjM6XHRvYmotJChDT05GSUdfTEVHQUNZX0RJUkVDVF9JTylcdCYjNDM7PSBkaXJlY3QtaW8ub1xuICAyNDpcdG9iai15XHRcdFx0XHQmIzQzOz0gbm90aWZ5L1xuICAyNTpcdG9iai0kKENPTkZJR19FUE9MTClcdFx0JiM0Mzs9IGV2ZW50cG9sbC5vXG4gIDI2Olx0b2JqLXlcdFx0XHRcdCYjNDM7PSBhbm9uX2lub2Rlcy5vXG4gIDI3Olx0b2JqLSQoQ09ORklHX1NJR05BTEZEKVx0XHQmIzQzOz0gc2lnbmFsZmQub1xuICAyODpcdG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQmIzQzOz0gdGltZXJmZC5vXG4gIDI5Olx0b2JqLSQoQ09ORklHX0VWRU5URkQpXHRcdCYjNDM7PSBldmVudGZkLm9cbiAgMzA6XHRvYmotJChDT05GSUdfQUlPKSAgICAgICAgICAgICAgICYjNDM7PSBhaW8ub1xuICAzMTpcdG9iai0kKENPTkZJR19GU19EQVgpXHRcdCYjNDM7PSBkYXgub1xuICAzMjpcdG9iai0kKENPTkZJR19GU19FTkNSWVBUSU9OKVx0JiM0Mzs9IGNyeXB0by9cbiAgMzM6XHRvYmotJChDT05GSUdfRlNfVkVSSVRZKVx0XHQmIzQzOz0gdmVyaXR5L1xuICAzNDpcdG9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgJiM0Mzs9IGxvY2tzLm9cbiAgMzU6XHRvYmotJChDT05GSUdfQklORk1UX01JU0MpXHQmIzQzOz0gYmluZm10X21pc2Mub1xuICAzNjpcdG9iai0kKENPTkZJR19CSU5GTVRfTUlTQ19CUEYpXHQmIzQzOz0gYmluZm10X21pc2NfYnBmLm9cbiAgMzc6XHRvYmotJChDT05GSUdfQklORk1UX1NDUklQVClcdCYjNDM7PSBiaW5mbXRfc2NyaXB0Lm9cbiAgMzg6XHRvYmotJChDT05GSUdfQklORk1UX0VMRilcdCYjNDM7PSBiaW5mbXRfZWxmLm9cbiAgMzk6XHRvYmotJChDT05GSUdfQ09NUEFUX0JJTkZNVF9FTEYpXHQmIzQzOz0gY29tcGF0X2JpbmZtdF9lbGYub1xuICA0MDpcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKVx0JiM0Mzs9IGJpbmZtdF9lbGZfZmRwaWMub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTc4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgQ29yZSBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgdHdvIG9iamVjdCBmaWxlcywgYGZzX3N0cnVjdC5vYCBhbmQgYHBpZGZzLm9gLCBhbmQgdGhleSYjMzk7cmUgYm90aCBkZWNsYXJlZCBpbiBgb2JqLXlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhleSByZWxhdGUgdG8gdGhlIGJyb2FkZXIgYnVpbGQgcHJvY2VzcywgcGFydGljdWxhcmx5IGlmIHRoZXJlIGFyZSBhbnkgQ09ORklHIG9wdGlvbnMgYXQgcGxheS4gUmlnaHQsIGFuZCBJIGtub3cgYGtlcm5lbC9mb3JrLmNgIGlzIGFsc28gYSBjcml0aWNhbCBvYmplY3QuIFNvLCBJIHNlZSB0aGF0IGBrZXJuZWwvZm9yay5jYCBpcyBhIGNvcmUga2VybmVsIG9iamVjdCBpbiB0aGUga2VybmVsIE1ha2VmaWxlLCBqdXN0IGFzIGFyZSB0aGUgb3RoZXIgdHdvLgoKVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoZXNlIGFyZSBidWlsdCB1bmNvbmRpdGlvbmFsbHkgaW50byBgdm1saW51eGAgb3IgaWYgdGhlcmUgYXJlIHNwZWNpZmljIENPTkZJRyBvcHRpb25zIHRoYXQgbWlnaHQgY29udHJvbCB0aGVpciBpbmNsdXNpb24uIExldCYjMzk7cyBzZWUuLi4gQWgsIGdvb2QsIGl0IGxvb2tzIGxpa2UgYHBpZGZzLm9gLCBgZnNfc3RydWN0Lm9gIGFuZCBgZm9yay5vYCAqYXJlKiB1bmNvbmRpdGlvbmFsbHkgYnVpbHQgaW50byB0aGUgZmluYWwgYHZtbGludXhgIGltYWdlLiBUaGF0IHNpbXBsaWZpZXMgdGhpbmdzIGEgYml0LgoKQnV0IHdhaXQsIGhvbGQgb24uIEV2ZW4gdGhvdWdoIHRoZXkmIzM5O3JlIGFsd2F5cyBidWlsdCwgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBzb3VyY2UgY29kZSBvZiBlYWNoIGZpbGUsIHNwZWNpZmljYWxseSBpbnNpZGUgYGZzL3BpZGZzLmNgIGFuZCBgZnMvZnNfc3RydWN0LmNgIGFuZCBga2VybmVsL2ZvcmsuY2AgdGhlbXNlbHZlcywgdG8gc2VlIGlmIHRoZXJlIGFyZSAqd2l0aGluKiB0aG9zZSBmaWxlcywgc3BlY2lmaWMgQ09ORklHIG9wdGlvbnMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byB0aGUgY2hhbmdlcyBJJiMzOTttIGludGVyZXN0ZWQgaW4uIEkgc2hvdWxkIHplcm8gaW4gb24gdGhlIGFyZWFzIGFyb3VuZCByZWxhdGVkIGZ1bmN0aW9ucy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYGZzL3BpZGZzLmNgIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9ucyBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYHBpZGZkX2lvY3RsYCwgYHBpZGZkX2dldF90YXNrX3BhdGhgLCBgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkYC4uLiBhbmQgc2VlIGlmIHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgYW55IENPTkZJRyBvcHRpb25zLiBUaGF0JiMzOTtzIHRoZSBwcnVkZW50IGFwcHJvYWNoIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9waWRmcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjA6XHRcdC8qIEV4dGVuc2libGUgaW9jdGxzIHJlcXVpcmUgc29tZSBtb3JlIGNhcmVmdWwgY2hlY2tzLiAqL1xuIDUyMTpcdFx0c3dpdGNoIChfSU9DX05SKGNtZCkpIHtcbiA1MjI6XHRcdGNhc2UgX0lPQ19OUihQSURGRF9HRVRfSU5GTyk6XG4gNTIzOlx0XHRcdC8qXG4gNTI0Olx0XHRcdCAqIFRyeSB0byBwcmV2ZW50IHBlcmZvcm1pbmcgYSBwaWRmZCBpb2N0bCB3aGVuIHNvbWVvbmVcbiA1MjU6XHRcdFx0ICogZXJyb25vdXNseSBtaXN0b29rIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlkZmQuXG4gNTI2Olx0XHRcdCAqIFRoaXMgaXMgbm90IHBlcmZlY3QgYnV0IHdpbGwgY2F0Y2ggbW9zdCBjYXNlcy5cbiA1Mjc6XHRcdFx0ICovXG4gNTI4Olx0XHRcdHJldHVybiBleHRlbnNpYmxlX2lvY3RsX3ZhbGlkKGNtZCwgUElERkRfR0VUX0lORk8sIFBJREZEX0lORk9fU0laRV9WRVIwKTtcbiA1Mjk6XHRcdH1cbiA1MzA6XHRcbiA1MzE6XHRcdHJldHVybiBmYWxzZTtcbiA1MzI6XHR9XG4gNTMzOlx0XG4gNTM0Olx0c3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gNTM1Olx0e1xuIDUzNjpcdFx0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xuIDUzNzpcdFx0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIDUzODpcdFx0XHRwdXRfdGFza19zdHJ1Y3QodGFzayk7XG4gNTM5Olx0XHR9XG4gNTQwOlx0fVxuIDU0MTpcdFxuIDU0MjpcdC8qXG4gNTQzOlx0ICogUmV0dXJuIEBwaWQmIzM5O3MgdGFzayB3aXRoIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuIDU0NDpcdCAqIGFuZCB0aGUgY2FsbGVycyYjMzk7IHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcbiA1NDU6XHQgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuXG4gNTQ2Olx0ICovXG4gNTQ3Olx0c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcbiA1NDg6XHRcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBhcmcpXG4gNTQ5Olx0e1xuIDU1MDpcdFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPVxuIDU1MTpcdFx0XHRnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7XG4gNTUyOlx0XHRpbnQgZXJyb3I7XG4gNTUzOlx0XG4gNTU0Olx0XHRpZiAoIXRhc2spXG4gNTU1Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XG4gNTU2Olx0XG4gNTU3Olx0XHRpZiAoYXJnKVxuIDU1ODpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiA1NTk6XHRcbiA1NjA6XHRcdGVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIDU2MTpcdFx0aWYgKGVycm9yKVxuIDU2MjpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XG4gNTYzOlx0XG4gNTY0Olx0XHRpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQURfRlNDUkVEUykpIHtcbiA1NjU6XHRcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbiA1NjY6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XG4gNTY3Olx0XHR9XG4gNTY4Olx0XG4gNTY5Olx0XHRyZXR1cm5fcHRyKHRhc2spO1xuIDU3MDpcdH1cbiA1NzE6XHRcbiA1NzI6XHRERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuIDU3MzpcdFx0ICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLFxuIDU3NDpcdFx0ICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLFxuIDU3NTpcdFx0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDU3NjpcdFxuIDU3NzpcdHN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcbiA1Nzg6XHRcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuIDU3OTpcdFx0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDU4MDpcdHtcbiA1ODE6XHRcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4gNTgyOlx0XHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuIDU4MzpcdFxuIDU4NDpcdFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiA1ODU6XHRcdGlmIChJU19FUlIodGFzaykpXG4gNTg2Olx0XHRcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcbiA1ODc6XHRcbiA1ODg6XHRcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiA1ODk6XHRcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIDU5MDpcdFx0XHRpZiAobnNwKVxuIDU5MTpcdFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gNTkyOlx0XHR9XG4gNTkzOlx0XHRpZiAoIW5zcClcbiA1OTQ6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi9cbiA1OTU6XHRcbiA1OTY6XHRcdHN3aXRjaCAoY21kKSB7XG4gNTk3Olx0XHQvKiBOYW1lc3BhY2VzIHRoYXQgaGFuZyBvZiBuc3Byb3h5LiAqL1xuIDU5ODpcdFx0Y2FzZSBQSURGRF9HRVRfQ0dST1VQX05BTUVTUEFDRTpcbiA1OTk6XHQjaWZkZWYgQ09ORklHX0NHUk9VUFNcbiA2MDA6XHRcdFx0aWYgKCFuc19yZWZfZ2V0KG5zcC1cdTAwM2VjZ3JvdXBfbnMpKVxuIDYwMTpcdFx0XHRcdGJyZWFrO1xuIDYwMjpcdFx0XHRuc19jb21tb24gPSB0b19uc19jb21tb24obnNwLVx1MDAzZWNncm91cF9ucyk7XG4gNjAzOlx0I2VuZGlmXG4gNjA0Olx0XHRcdGJyZWFrO1xuIDYwNTpcdFx0Y2FzZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRTpcbiA2MDY6XHQjaWZkZWYgQ09ORklHX0lQQ19OU1xuIDYwNzpcdFx0XHRpZiAoIW5zX3JlZl9nZXQobnNwLVx1MDAzZWlwY19ucykpXG4gNjA4Olx0XHRcdFx0YnJlYWs7XG4gNjA5Olx0XHRcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihuc3AtXHUwMDNlaXBjX25zKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDEwNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBgZnMvcGlkZnMuY2AgLSBMaW5lcyA2NjAtNzQ1KioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBUaGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBzdWdnZXN0cyB0aGVyZSYjMzk7cyBzb21ldGhpbmcgc3BlY2lmaWMgZ29pbmcgb24gaW4gdGhlIFBJRCBuYW1lc3BhY2UgZmlsZXN5c3RlbSwgYW5kIG15IGd1dCBmZWVsaW5nIHRlbGxzIG1lIHRoZSBjb3JlIGlzc3VlIGxpZXMgd2l0aGluIHRoaXMgcmFuZ2U6IGxpbmVzIDY2MCB0byA3NDUgb2YgYGZzL3BpZGZzLmNgLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGluIGFuZCBtZXRpY3Vsb3VzbHkgcGFyc2UgdGhpcyBzZWN0aW9uLiBJIGtub3cgdGhpcyBhcmVhIGRlYWxzIHdpdGggUElEIGhhbmRsaW5nLCBwcm9iYWJseSB3aXRoIGRpcmVjdG9yeSBhbmQgZmlsZSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgcG9zc2libHkgYXR0cmlidXRlIG9wZXJhdGlvbnMgYW5kIEkgbmVlZCB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBvciBhY2Nlc3MgY29udHJvbCB2dWxuZXJhYmlsaXRpZXMsIGlmIGFueS4gSSYjMzk7bGwgbmVlZCB0byBwYXJzZSB0aGUgaW50ZXJhY3Rpb25zIHdpdGggUElEIG51bWJlcnMsIGFuZCBmaWd1cmUgb3V0IGhvdyBwcm9jZXNzIElEcyBhcmUgbWFwcGVkLCB0cmFja2VkLCBhbmQgZXhwb3NlZCBpbiB0aGlzIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0uIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIGFueSBzcG90cyB3aGVyZSB0aGUgUElEIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyBub3QgYmVpbmcgY29ycmVjdGx5IHZhbGlkYXRlZCBvciBzeW5jaHJvbml6ZWQuIEFueSB1bmNoZWNrZWQgcGF0aHMgb3IgaW5jb3JyZWN0IGxvZ2ljIGNvdWxkIGxlYWQgdG8gdGhlIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiB0aGUgaXNzdWUsIGV2ZW4gaWYgaXQgc2VlbXMgdW5saWtlbHkgYXQgZmlyc3QgZ2xhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL3BpZGZzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2MDpcdFx0XHRcdFx0bnNfY29tbW9uID0gdG9fbnNfY29tbW9uKHVzZXJfbnMpO1xuIDY2MTpcdFx0XHR9XG4gNjYyOlx0I2VuZGlmXG4gNjYzOlx0XHRcdGJyZWFrO1xuIDY2NDpcdFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcbiA2NjU6XHQjaWZkZWYgQ09ORklHX1BJRF9OU1xuIDY2NjpcdFx0XHRzY29wZWRfZ3VhcmQocmN1KSB7XG4gNjY3Olx0XHRcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucztcbiA2Njg6XHRcbiA2Njk6XHRcdFx0XHRwaWRfbnMgPSB0YXNrX2FjdGl2ZV9waWRfbnModGFzayk7XG4gNjcwOlx0XHRcdFx0aWYgKG5zX3JlZl9nZXQocGlkX25zKSlcbiA2NzE6XHRcdFx0XHRcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihwaWRfbnMpO1xuIDY3MjpcdFx0XHR9XG4gNjczOlx0I2VuZGlmXG4gNjc0Olx0XHRcdGJyZWFrO1xuIDY3NTpcdFx0ZGVmYXVsdDpcbiA2NzY6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0lPQ1RMQ01EKTtcbiA2Nzc6XHRcdH1cbiA2Nzg6XHRcbiA2Nzk6XHRcdGlmICghbnNfY29tbW9uKVxuIDY4MDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4gNjgxOlx0XG4gNjgyOlx0XHRyZXR1cm4gbnNfY29tbW9uO1xuIDY4MzpcdH1cbiA2ODQ6XHRcbiA2ODU6XHRzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLFxuIDY4NjpcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXG4gNjg3Olx0e1xuIDY4ODpcdFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbiA2ODk6XHRcbiA2OTA6XHRcdGlmIChJU19FUlIodGFzaykpXG4gNjkxOlx0XHRcdHJldHVybiBQVFJfRVJSKHRhc2spO1xuIDY5MjpcdFxuIDY5MzpcdFx0c3dpdGNoIChjbWQpIHtcbiA2OTQ6XHRcdGNhc2UgUElERkRfR0VUX0VYRTpcbiA2OTU6XHRcdFx0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIHBhdGgpO1xuIDY5NjpcdFx0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuIDY5NzpcdFx0XHRyZXR1cm4gZ2V0X3Rhc2tfcHdkKHRhc2ssIHBhdGgpO1xuIDY5ODpcdFx0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiA2OTk6XHRcdFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XG4gNzAwOlx0XHR9XG4gNzAxOlx0XG4gNzAyOlx0XHRyZXR1cm4gLUVJTlZBTDtcbiA3MDM6XHR9XG4gNzA0Olx0XG4gNzA1Olx0c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDcwNjpcdHtcbiA3MDc6XHRcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4gNzA4Olx0XHRzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fTtcbiA3MDk6XHRcdGludCBlcnJvcjtcbiA3MTA6XHRcbiA3MTE6XHRcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcbiA3MTI6XHRcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiA3MTM6XHRcbiA3MTQ6XHRcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcbiA3MTU6XHRcdFx0aWYgKCFhcmcpXG4gNzE2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNzE3Olx0XG4gNzE4Olx0XHRcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XG4gNzE5Olx0XG4gNzIwOlx0XHRcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfZ2VuZXJhdGlvbiwgYXJncCk7XG4gNzIxOlx0XHR9XG4gNzIyOlx0XG4gNzIzOlx0XHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cbiA3MjQ6XHRcdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXG4gNzI1Olx0XHRcdHJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTtcbiA3MjY6XHRcbiA3Mjc6XHRcdHN3aXRjaCAoY21kKSB7XG4gNzI4Olx0XHRjYXNlIFBJREZEX0dFVF9FWEU6XG4gNzI5Olx0XHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4gNzMwOlx0XHRjYXNlIFBJREZEX0dFVF9ST09UOlxuIDczMTpcdFx0XHRlcnJvciA9IHBpZGZkX2dldF90YXNrX3BhdGgocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZywgXHUwMDI2cGF0aCk7XG4gNzMyOlx0XHRcdGlmIChlcnJvcilcbiA3MzM6XHRcdFx0XHRyZXR1cm4gZXJyb3I7XG4gNzM0Olx0XG4gNzM1Olx0XHRcdHJldHVybiBGRF9BREQoT19DTE9FWEVDLFxuIDczNjpcdFx0XHRcdCAgICAgIGRlbnRyeV9vcGVuKFx1MDAyNnBhdGgsIE9fUEFUSCwgY3VycmVudF9jcmVkKCkpKTtcbiA3Mzc6XHRcdH1cbiA3Mzg6XHRcbiA3Mzk6XHRcdG5zX2NvbW1vbiA9IHBpZGZkX2dldF9uYW1lc3BhY2UocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZyk7XG4gNzQwOlx0XHRpZiAoSVNfRVJSKG5zX2NvbW1vbikpXG4gNzQxOlx0XHRcdHJldHVybiBQVFJfRVJSKG5zX2NvbW1vbik7XG4gNzQyOlx0XG4gNzQzOlx0XHQvKiBvcGVuX25hbWVzcGFjZSgpIHVuY29uZGl0aW9uYWxseSBjb25zdW1lcyB0aGUgcmVmZXJlbmNlICovXG4gNzQ0Olx0XHRyZXR1cm4gb3Blbl9uYW1lc3BhY2UobnNfY29tbW9uKTtcbiA3NDU6XHR9XG4gNzQ2Olx0XG4gNzQ3Olx0I2lmZGVmIENPTkZJR19DT01QQVRcbiA3NDg6XHRzdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4gNzQ5Olx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTY2NAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDQzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIFN5bWJvbCBFeHBvc3VyZSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdmVyaWZ5IHdoaWNoIHN5bWJvbHMgYXJlICpub3QqIHN0YXRpYywgYXMgdGhvc2UgYXJlIHRoZSBvbmVzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwb3NlZC4gSSYjMzk7bGwgc3RhcnQgYnkgY2hlY2tpbmcgdGhlIGluaXRpYWwgbGlzdDogYGdldF90YXNrX3Jvb3RgIGluIGBmcy9mc19zdHJ1Y3QuY2AsIGBnZXRfdGFza19wd2RgIGluIGBmcy9mc19zdHJ1Y3QuY2AsIGBnZXRfdGFza19leGVfcGF0aGAgaW4gYGtlcm5lbC9mb3JrLmNgLCBhbmQgdGhlbiB0aGVyZSYjMzk7cyBgcGlkZmRfaW9jdGxgIGluIGBmcy9waWRmcy5jYCB3aGljaCwgZXZlbiB0aG91Z2ggaXQmIzM5O3MgdGVjaG5pY2FsbHkgc3RhdGljLCBpcyBwYXJ0IG9mIGBmaWxlX29wZXJhdGlvbnMudW5sb2NrZWRfaW9jdGxgIC0gYSBwb3RlbnRpYWwgbG9vcGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55IG90aGVyIG5vbi1zdGF0aWMgc3ltYm9scy4KCkkmIzM5O2xsIGNvbmZpcm0gdGhlIGxpc3QgYnkgZG91YmxlLWNoZWNraW5nIHRoZSBkZWZpbml0aW9uIG9mIGFsbCB0aGUgc3ltYm9scy4gSXQgbG9va3MgbGlrZSBpdCBjb25maXJtcyB0aGF0IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYy4gR29vZC4gQXJlIHRoZXJlIGFueSBvdGhlciByZWxldmFudCBzeW1ib2xzIGx1cmtpbmcgaW4gdGhlIHNoYWRvd3M/CgpOb3csIGxldCYjMzk7cyB0YWtlIGEgbW9yZSBjb21wcmVoZW5zaXZlIGxvb2sgYXQgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBjaGFuZ2VkIGluIHRoZSBkaWZmLiBUaGlzIGlzIHdoZXJlIHRoZSBkZXRhaWxzIGFyZS4gSSYjMzk7bGwgbWFrZSBhIGxpc3QgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UgcG9wcyBvdXQ6CgoxLiAgYGdldF90YXNrX3Jvb3RgIChmcy9mc19zdHJ1Y3QuYykKMi4gIGBnZXRfdGFza19wd2RgIChmcy9mc19zdHJ1Y3QuYykKMy4gIGBnZXRfdGFza19leGVfcGF0aGAgKGtlcm5lbC9mb3JrLmMpCjQuICBgcGlkZnMuY2A6IEFsbCB0aGUgc3RhdGljIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbGlzdGVkLgo1LiAgYGZzL3Byb2MvYmFzZS5jYDogYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AuCjYuICBgc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jYDogYGdldF9jdXJyZW50X2V4ZV9wYXRoYC4KCkkgc2VlIHRoYXQgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AsIGFuZCBgZ2V0X2N1cnJlbnRfZXhlX3BhdGhgIG1pZ2h0IHdhcnJhbnQgYSBzZWNvbmQgbG9vay4KCkZpbmFsbHksIGEgcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkga2VybmVsIGNvbmZpZyBkZXBlbmRlbmNpZXMgdGhhdCByZWxhdGUgdG8gYFBJREZEYCwgYFBJREZTYCwgb3IgYEFQUEFSTU9SYC4gSSYjMzk7bGwgc2VhcmNoIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgY29udGV4dCBhbmQgcG90ZW50aWFsIGV4cG9zdXJlIHBvaW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UElERlMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmhhbmRsZS5jPTE3MD1zdGF0aWMgaW50IGdldF9wYXRoX2FuY2hvcihpbnQgZmQsIHN0cnVjdCBwYXRoICpyb290KVxuLS1cbmZzL2ZoYW5kbGUuYy0xODUtXG5mcy9maGFuZGxlLmM6MTg2Olx0aWYgKGZkID09IEZEX1BJREZTX1JPT1QpIHtcbmZzL2ZoYW5kbGUuYy0xODctXHRcdHBpZGZzX2dldF9yb290KHJvb3QpO1xuLS1cbmZzL3BpZGZzLmMtMzUtXG5mcy9waWRmcy5jOjM2OiNkZWZpbmUgUElERlNfUElEX0RFQUQgRVJSX1BUUigtRVNSQ0gpXG5mcy9waWRmcy5jLTM3LVxuLS1cbmZzL3BpZGZzLmM9NTA9ZW51bSBwaWRmc19hdHRyX21hc2tfYml0cyB7XG5mcy9waWRmcy5jOjUxOlx0UElERlNfQVRUUl9CSVRfRVhJVFx0PSAwLFxuZnMvcGlkZnMuYzo1MjpcdFBJREZTX0FUVFJfQklUX0NPUkVEVU1QXHQ9IDEsXG5mcy9waWRmcy5jLTUzLX07XG4tLVxuZnMvcGlkZnMuYz0zNjY9c3RhdGljIGxvbmcgcGlkZmRfaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZnMvcGlkZnMuYy0zOTYtXHRpZiAobWFzayBcdTAwMjYgUElERkRfSU5GT19FWElUKSB7XG5mcy9waWRmcy5jOjM5NzpcdFx0aWYgKHRlc3RfYml0KFBJREZTX0FUVFJfQklUX0VYSVQsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKSkge1xuZnMvcGlkZnMuYy0zOTgtXHRcdFx0c21wX3JtYigpO1xuLS1cbmZzL3BpZGZzLmMtNDA4LVx0aWYgKG1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIHtcbmZzL3BpZGZzLmM6NDA5Olx0XHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKSkge1xuZnMvcGlkZnMuYy00MTAtXHRcdFx0c21wX3JtYigpO1xuLS1cbmZzL3BpZGZzLmM9ODE0PXZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5mcy9waWRmcy5jLTgzMy1cdFx0XHQgKi9cbmZzL3BpZGZzLmM6ODM0Olx0XHRcdHBpZC1cdTAwM2VhdHRyID0gUElERlNfUElEX0RFQUQ7XG5mcy9waWRmcy5jLTgzNS1cdFx0XHRyZXR1cm47XG4tLVxuZnMvcGlkZnMuYy04NTYtXHRzbXBfd21iKCk7XG5mcy9waWRmcy5jOjg1NzpcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXHUwMDI2YXR0ci1cdTAwM2VhdHRyX21hc2spO1xuZnMvcGlkZnMuYy04NTgtfVxuLS1cbmZzL3BpZGZzLmM9ODYxPXZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9waWRmcy5jLTg2OC1cdFZGU19XQVJOX09OX09OQ0UoIWF0dHIpO1xuZnMvcGlkZnMuYzo4Njk6XHRWRlNfV0FSTl9PTl9PTkNFKGF0dHIgPT0gUElERlNfUElEX0RFQUQpO1xuZnMvcGlkZnMuYy04NzAtXG4tLVxuZnMvcGlkZnMuYy04NzktXHRzbXBfd21iKCk7XG5mcy9waWRmcy5jOjg4MDpcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKTtcbmZzL3BpZGZzLmMtODgxLX1cbi0tXG5mcy9waWRmcy5jPTk2Mj1zdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcbi0tXG5mcy9waWRmcy5jLTk3My1cdFx0cmV0dXJuIE5VTEw7XG5mcy9waWRmcy5jOjk3NDpcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcdTAwMjZhdHRyLVx1MDAzZWF0dHJfbWFzaykpXG5mcy9waWRmcy5jLTk3NS1cdFx0cmV0dXJuIE5VTEw7XG4tLVxuZnMvcGlkZnMuYz0xMTAzPWludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxuLS1cbmZzL3BpZGZzLmMtMTExMy1cdGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO1xuZnMvcGlkZnMuYzoxMTE0Olx0aWYgKHVubGlrZWx5KGF0dHIgPT0gUElERlNfUElEX0RFQUQpKVxuZnMvcGlkZnMuYzoxMTE1Olx0XHRyZXR1cm4gUFRSX0VSUihQSURGU19QSURfREVBRCk7XG5mcy9waWRmcy5jLTExMTYtXHRpZiAoYXR0cilcbi0tXG5mcy9waWRmcy5jLTExMjgtXHRhdHRyID0gcGlkLVx1MDAzZWF0dHI7XG5mcy9waWRmcy5jOjExMjk6XHRpZiAodW5saWtlbHkoYXR0ciA9PSBQSURGU19QSURfREVBRCkpXG5mcy9waWRmcy5jOjExMzA6XHRcdHJldHVybiBQVFJfRVJSKFBJREZTX1BJRF9ERUFEKTtcbmZzL3BpZGZzLmMtMTEzMS1cdGlmICh1bmxpa2VseShhdHRyKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMDM6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM3MTUKCQkJCQkJCW91dHB1dDogMTY4CgkJCQkJCQl0aG91Z2h0czogNDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBpZGZkIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIGBwaWRmc2AgaXMgYnVpbHQtaW4sIG5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkLCB3aGljaCBpcyBnb29kLiBUaGUgYWJzZW5jZSBvZiBjb25maWcgb3B0aW9ucywgc3BlY2lmaWNhbGx5IHdoZW4gYEVuYWJsZUNvbmZpZ3NgIGlzIGFuIGVtcHR5IGxpc3Qgb3IgbnVsbCwgc2ltcGxpZmllcyB0aGluZ3MuIExldCYjMzk7cyBtb3ZlIG9udG8gdGhlIHNwZWNpZmljcy4gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhlIHBhdGNoIGltcGFjdHMgdGhlc2UgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogYGdldF90YXNrX3Jvb3RgLCBgZ2V0X3Rhc2tfcHdkYCwgYW5kIGBnZXRfdGFza19leGVfcGF0aGAuCgpJJiMzOTt2ZSBjYXJlZnVsbHkgZG91YmxlLWNoZWNrZWQgdGhlIHBhdGNoIGZvciBhbnkgb3RoZXIgZXhwb3J0ZWQgb3IgY2hhbmdlZCBub24tc3RhdGljIGZ1bmN0aW9ucy4gU3BlY2lmaWNhbGx5LCBpbiBgZnMvZnNfc3RydWN0LmNgLCBJIHNlZSBgZ2V0X3Rhc2tfcm9vdGAgYW5kIGBnZXRfdGFza19wd2RgLiBJbiBga2VybmVsL2ZvcmsuY2AsIHRoZXJlJiMzOTtzIGBnZXRfdGFza19leGVfcGF0aGAuIEluc2lkZSBgZnMvcGlkZnMuY2AsIGFsbCB0aGUgbmV3IGFkZGl0aW9ucyBhcmUgc3RhdGljIOKAkyBubyBpc3N1ZXMgdGhlcmUuIEFsc28gaW4gYGZzL3Byb2MvYmFzZS5jYCwgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AgYXJlIHN0YXRpYyBhbmQgdGhlIHNhbWUgZ29lcyBmb3IgYHNlY3VyaXR5L2FwcGFybW9yL3Rhc2suY2Agd2l0aCB0aGUgYGdldF9jdXJyZW50X2V4ZV9wYXRoYCBmdW5jdGlvbi4KClRoZXJlZm9yZSwgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSBwcmVjaXNlbHk6Ci0gYGdldF90YXNrX3Jvb3RgCi0gYGdldF90YXNrX3B3ZGAKLSBgZ2V0X3Rhc2tfZXhlX3BhdGhgCgpUbyBjbGFyaWZ5LCB0aGlzIHBhdGNoIGludHJvZHVjZXMgdGhlIG5ldyBgcGlkZmRgIGlvY3RsczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGVzZSBhbGxvdyB1c2Vyc3BhY2UgdG8gZ2V0IGBPX1BBVEhgIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgdGFyZ2V0IHRhc2smIzM5O3MgZXhlY3V0YWJsZSwgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIEkgbGlzdGVkLiBUaGVyZSBpcyBhbHNvIGEgcmVmYWN0b3Jpbmcgb2YgbG9ja2VkIHBpZGZkIG9wZXJhdGlvbnMgd2l0aCBgZXhlY191cGRhdGVfbG9ja2AuIFRoaXMgKmRvZXMqIGltcGFjdCBjb3JlIFZGUy9waWRmZCBmdW5jdGlvbmFsaXR5LCBwYXJ0aWN1bGFybHkgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgc2V0dXBzIOKAkyB0aGF0IGlzIGFsc28gd2hhdCBJIGV4cGVjdGVkLgoKTXkgcmVhc29uaW5nIGhvbGRzLiBFdmVyeXRoaW5nIHNlZW1zIGNsZWFuLCB0aG9yb3VnaGx5IGNoZWNrZWQuIEkmIzM5O20gc2F0aXNmaWVkIGFuZCByZWFkeSB0byBwcm9jZWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z2V0X3Rhc2tfcm9vdCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19wd2QmIzM0OywKICAgICYjMzQ7Z2V0X3Rhc2tfZXhlX3BhdGgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgcGlkZmQgaW9jdGxzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBhbmQgUElERkRfR0VUX1JPT1QpIGFsbG93aW5nIHVzZXJzcGFjZSB0byByZXRyaWV2ZSBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSBwcm9jZXNzJiMzOTtzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtnZXRfdGFza19yb290JiMzNDssCiAgICAmIzM0O2dldF90YXNrX3B3ZCYjMzQ7LAogICAgJiMzNDtnZXRfdGFza19leGVfcGF0aCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MmIzM5O3MgZXhlY3V0YWJsZSwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5LiBJdCBhbHNvIHJlZmFjdG9ycyBwaWRmZCB0YXNrIGxvY2tpbmcgYW5kIGFkZHMgaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUga2VybmVsIGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBpbiBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50cyB3aXRob3V0IHJlcXVpcmluZyBzcGVjaWFsaXplZCBoYXJkd2FyZSBjb25maWdzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cblxuMS4gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBpbmZvLWxlYWsgYW5hbHlzaXM6XG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxuICAgLSBBbGwgc3RhY2sgdmFyaWFibGVzIChlLmcuLCBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge31gKSBhcmUgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkLlxuICAgLSBSZXR1cm4gcGF0aHMgYW5kIGVycm9yIGNvZGVzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3NpbmcgcmV0cmlldmVkIHBhdGhzLlxuXG4yLiBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5OlxuICAgLSBQb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHJlbGF0ZSB0byByZWZlcmVuY2UgY291bnRpbmcgKGZwdXQsIHBhdGhfcHV0LCBnZXRfdGFza19zdHJ1Y3QpLCBsb2NraW5nL3N5bmNocm9uaXphdGlvbiAoZXhlY191cGRhdGVfbG9jaywgdGFza19sb2NrKSwgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcy5cbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjOGUyNTJhOTcyZmMwMDM4ZTc4MDU2MTRhN2YxYjQ3MmIzMTU4YzY3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMzEgMDM6MjY6NTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9mc19zdHJ1Y3QuYyBiL2ZzL2ZzX3N0cnVjdC5jCmluZGV4IDM0Njk5ZjNiNmY4ODEuLjVjNzcyODk2MjYwYTQgMTAwNjQ0Ci0tLSBhL2ZzL2ZzX3N0cnVjdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZzX3N0cnVjdC5jCkBAIC0xMCw2ICYjNDM7MTAsNTAgQEAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O21vdW50LmgmIzM0OwogCiYjNDM7LyoqCiYjNDM7ICogZ2V0X3Rhc2tfcm9vdCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2smIzM5O3Mgcm9vdCBwYXRoCiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEByb290OiBUaGUgdGFzayYjMzk7cyByb290IHBhdGguCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGUKJiM0MzsgKiBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLUVOT0VOVDsKJiM0MzsKJiM0MzsJdGFza19sb2NrKHRhc2spOwomIzQzOwlpZiAodGFzay0mZ3Q7cmVhbF9mcykgewomIzQzOwkJZ2V0X2ZzX3Jvb3QodGFzay0mZ3Q7cmVhbF9mcywgcm9vdCk7CiYjNDM7CQlyZXQgPSAwOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRhc2spOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBnZXRfdGFza19wd2QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5CiYjNDM7ICogQHRhc2s6IFRoZSB0YXNrLgomIzQzOyAqIEBwd2Q6IFRoZSB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXRhc2tfbG9jayh0YXNrKTsKJiM0MzsJaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKJiM0MzsJCWdldF9mc19wd2QodGFzay0mZ3Q7cmVhbF9mcywgcHdkKTsKJiM0MzsJCXJldCA9IDA7CiYjNDM7CX0KJiM0MzsJdGFza191bmxvY2sodGFzayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwogLyoKICAqIFJlcGxhY2UgdGhlIGZzLSZndDt7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLgogICogSXQgY2FuIGJsb2NrLgpkaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmMKaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDQKLS0tIGEvZnMvcGlkZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jCkBAIC00LDYgJiM0Mzs0LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9leHBvcnRmcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mc19zdHJ1Y3QuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jZ3JvdXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21vdW50LmgmZ3Q7CkBAIC01MTAsNiAmIzQzOzUxMSw5IEBAIHN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpCiAJY2FzZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRToKIAljYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRToKIAljYXNlIFBJREZEX0dFVF9QSURfTkFNRVNQQUNFOgomIzQzOwljYXNlIFBJREZEX0dFVF9FWEU6CiYjNDM7CWNhc2UgUElERkRfR0VUX0NXRDoKJiM0MzsJY2FzZSBQSURGRF9HRVRfUk9PVDoKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01MjcsNjIgJiM0Mzs1MzEsNjcgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZCkKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9IE5VTEw7Ci0Jc3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDsKLQlzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMOwotCWludCBlcnJvcjsKLQotCWlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSkKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQotCWlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHsKLQkJaWYgKCFhcmcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnOwotCQlyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9nZW5lcmF0aW9uLCBhcmdwKTsKJiM0MzsJaWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkgewomIzQzOwkJdXBfcmVhZCgmYW1wO3Rhc2stJmd0O3NpZ25hbC0mZ3Q7ZXhlY191cGRhdGVfbG9jayk7CiYjNDM7CQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiAJfQomIzQzO30KIAotCS8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqLwotCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpCi0JCXJldHVybiBwaWRmZF9pbmZvKGZpbGUsIGNtZCwgYXJnKTsKJiM0MzsvKgomIzQzOyAqIFJldHVybiBAcGlkJiMzOTtzIHRhc2sgd2l0aCBAdGFzayYjMzk7cyBleGVjX3VwZGF0ZV9sb2NrIGhlbGQuIFRoZSBwdHJhY2UgY2hlY2sKJiM0MzsgKiBhbmQgdGhlIGNhbGxlcnMmIzM5OyB0YXNrIHN0YXRlIGxvb2t1cCBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSB0aGUgbG9jayBpcyBoZWxkCiYjNDM7ICogc28gdGhhdCB0aGV5IGNhbm5vdCByYWNlIHdpdGggYSBjb25jdXJyZW50IGV4ZWN2ZSgpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZGZkX2dldF90YXNrX2xvY2tlZChzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPQomIzQzOwkJZ2V0X3BpZF90YXNrKHBpZCwgUElEVFlQRV9QSUQpOwomIzQzOwlpbnQgZXJyb3I7CiAKLQl0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpOwogCWlmICghdGFzaykKLQkJcmV0dXJuIC1FU1JDSDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FU1JDSCk7CiAKIAlpZiAoYXJnKQotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JLyoKLQkgKiBXZSYjMzk7cmUgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIG5hbWVzcGFjZSBzbyBwZXJmb3JtIGEKLQkgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJiMzOTtzIGV4ZWNfdXBkYXRlX2xvY2sgZm9yIHRoZQotCSAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlCi0JICogY3JlZGVudGlhbHMgdXNlZCBmb3IgdGhlIGFjY2VzcyBkZWNpc2lvbiBtYXRjaCB0aG9zZSBvZiBAdGFzayBhdCB0aGUKLQkgKiB0aW1lIGl0cyBuYW1lc3BhY2UgaXMgcmVhZCwgcHJldmVudGluZyBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkgZnJvbQotCSAqIHN3YXBwaW5nIHRoZSB0YXNrJiMzOTtzIGNyZWRlbnRpYWxzIGluIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgdXNlLiBXZQotCSAqIG1pcnJvciBuc2ZzIGJlaGF2aW9yLgotCSAqLwogCWVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKIAlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKJiM0MzsJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAogCWlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkgewotCQllcnJvciA9IC1FQUNDRVM7Ci0JCWdvdG8gb3V0X3VubG9jazsKJiM0MzsJCXVwX3JlYWQoJmFtcDt0YXNrLSZndDtzaWduYWwtJmd0O2V4ZWNfdXBkYXRlX2xvY2spOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAJfQogCiYjNDM7CXJldHVybl9wdHIodGFzayk7CiYjNDM7fQomIzQzOwomIzQzO0RFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosCiYjNDM7CSAgICAgcGlkZmRfcHV0X3Rhc2tfbG9ja2VkKF9UKSwKJiM0MzsJICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLAomIzQzOwkgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7CiYjNDM7CiYjNDM7CUNMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7CiYjNDM7CWlmIChJU19FUlIodGFzaykpCiYjNDM7CQlyZXR1cm4gRVJSX0NBU1QodGFzayk7CiYjNDM7CiAJc2NvcGVkX2d1YXJkKHRhc2tfbG9jaywgdGFzaykgewogCQluc3AgPSB0YXNrLSZndDtuc3Byb3h5OwogCQlpZiAobnNwKQogCQkJZ2V0X25zcHJveHkobnNwKTsKIAl9Ci0JaWYgKCFuc3ApIHsKLQkJZXJyb3IgPSAtRVNSQ0g7IC8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJiMzOTt0IGV4aXN0ICovCi0JCWdvdG8gb3V0X3VubG9jazsKLQl9CiYjNDM7CWlmICghbnNwKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4mIzM5O3QgZXhpc3QgKi8KIAogCXN3aXRjaCAoY21kKSB7CiAJLyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi8KQEAgLTY2NCwxNiAmIzQzOzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAjZW5kaWYKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyb3IgPSAtRU5PSU9DVExDTUQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpOwogCX0KIAotCWlmICghZXJyb3IgJmFtcDsmYW1wOyAhbnNfY29tbW9uKQotCQllcnJvciA9IC1FT1BOT1RTVVBQOwomIzQzOwlpZiAoIW5zX2NvbW1vbikKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIAotb3V0X3VubG9jazoKLQl1cF9yZWFkKCZhbXA7dGFzay0mZ3Q7c2lnbmFsLSZndDtleGVjX3VwZGF0ZV9sb2NrKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKJiM0MzsJcmV0dXJuIG5zX2NvbW1vbjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwaWRmZF9nZXRfdGFza19wYXRoKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGNtZCwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBwYXRoICpwYXRoKQomIzQzO3sKJiM0MzsJQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTsKJiM0MzsKJiM0MzsJaWYgKElTX0VSUih0YXNrKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKHRhc2spOwomIzQzOwomIzQzOwlzd2l0Y2ggKGNtZCkgewomIzQzOwljYXNlIFBJREZEX0dFVF9FWEU6CiYjNDM7CQlyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7CiYjNDM7CWNhc2UgUElERkRfR0VUX0NXRDoKJiM0MzsJCXJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7CiYjNDM7CWNhc2UgUElERkRfR0VUX1JPT1Q6CiYjNDM7CQlyZXR1cm4gZ2V0X3Rhc2tfcm9vdCh0YXNrLCBwYXRoKTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDsKJiM0MzsJc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307CiYjNDM7CWludCBlcnJvcjsKJiM0MzsKJiM0MzsJaWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKQomIzQzOwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKJiM0MzsKJiM0MzsJaWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikgewomIzQzOwkJaWYgKCFhcmcpCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CQlfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnOwomIzQzOwomIzQzOwkJcmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfZ2VuZXJhdGlvbiwgYXJncCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovCiYjNDM7CWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpCiYjNDM7CQlyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgUElERkRfR0VUX0VYRToKJiM0MzsJY2FzZSBQSURGRF9HRVRfQ1dEOgomIzQzOwljYXNlIFBJREZEX0dFVF9ST09UOgomIzQzOwkJZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsICZhbXA7cGF0aCk7CiYjNDM7CQlpZiAoZXJyb3IpCiYjNDM7CQkJcmV0dXJuIGVycm9yOwomIzQzOwomIzQzOwkJcmV0dXJuIEZEX0FERChPX0NMT0VYRUMsCiYjNDM7CQkJICAgICAgZGVudHJ5X29wZW4oJmFtcDtwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTsKJiM0MzsJaWYgKElTX0VSUihuc19jb21tb24pKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTsKIAogCS8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi8KIAlyZXR1cm4gb3Blbl9uYW1lc3BhY2UobnNfY29tbW9uKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvcHJvYy9iYXNlLmMKQEAgLTIwNiwzMSAmIzQzOzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcywKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KQotewotCWludCByZXN1bHQgPSAtRU5PRU5UOwotCi0JdGFza19sb2NrKHRhc2spOwotCWlmICh0YXNrLSZndDtyZWFsX2ZzKSB7Ci0JCWdldF9mc19yb290KHRhc2stJmd0O3JlYWxfZnMsIHJvb3QpOwotCQlyZXN1bHQgPSAwOwotCX0KLQl0YXNrX3VubG9jayh0YXNrKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCwKIAkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0KLQl0YXNrX2xvY2sodGFzayk7Ci0JaWYgKHRhc2stJmd0O3JlYWxfZnMpIHsKLQkJZ2V0X2ZzX3B3ZCh0YXNrLSZndDtyZWFsX2ZzLCBwYXRoKTsKLQkJcmVzdWx0ID0gMDsKLQl9Ci0JdGFza191bmxvY2sodGFzayk7Ci0JcmV0dXJuIHJlc3VsdDsKJiM0MzsJcmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTsKIH0KIAogc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLApAQCAtMTc2MSwxNiAmIzQzOzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0gewogc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoLAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7Ci0KLQlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwotCWlmIChleGVfZmlsZSkgewotCQkqZXhlX3BhdGggPSBleGVfZmlsZS0mZ3Q7Zl9wYXRoOwotCQlwYXRoX2dldCgmYW1wO2V4ZV9maWxlLSZndDtmX3BhdGgpOwotCQlmcHV0KGV4ZV9maWxlKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpOwogfQogCiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmggYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oCmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaApAQCAtNDIsNiAmIzQzOzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpCiAJcmVhZF9zZXF1bmxvY2tfZXhjbCgmYW1wO2ZzLSZndDtzZXEpOwogfQogCiYjNDM7aW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCk7CiYjNDM7aW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpOwomIzQzOwogc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpOwogCiBleHRlcm4gYm9vbCBjdXJyZW50X2Nocm9vdGVkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGRkMDljNDM4ZmEyM2UuLmE2NWYyNGIyZTY1YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTQyMzksNiAmIzQzOzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7CiBleHRlcm4gaW50IHJlcGxhY2VfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwomIzQzO2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCk7CiAKIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaAppbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaApAQCAtMTIxLDQgJiM0MzsxMjEsMTEgQEAgc3RydWN0IHBpZGZkX2luZm8gewogI2RlZmluZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTApCiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbykKIAomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3MgZXhlY3V0YWJsZS4gKi8KJiM0MzsjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMikKJiM0MzsvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJiMzOTtzIHdvcmtpbmcgZGlyZWN0b3J5LiAqLwomIzQzOyNkZWZpbmUgUElERkRfR0VUX0NXRCAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEzKQomIzQzOy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2smIzM5O3Mgcm9vdCBkaXJlY3RvcnkuICovCiYjNDM7I2RlZmluZSBQSURGRF9HRVRfUk9PVCAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTQpCiYjNDM7CiAjZW5kaWYgLyogX1VBUElfTElOVVhfUElERkRfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDE2NzU4YzhhM2Q0My4uYTQ5M2RlM2FlNWMyMCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jCkBAIC0xMzcxLDYgJiM0MzsxMzcxLDI3IEBAIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiAJcmV0dXJuIGV4ZV9maWxlOwogfQogCiYjNDM7LyoqCiYjNDM7ICogZ2V0X3Rhc2tfZXhlX3BhdGggLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aAomIzQzOyAqIEB0YXNrOiBUaGUgdGFzay4KJiM0MzsgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJiMzOTtzIGV4ZWN1dGFibGUgcGF0aC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYW4gZXhlY3V0YWJsZSBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLgomIzQzOyAqLwomIzQzO2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwomIzQzOwomIzQzOwlpZiAoIWV4ZV9maWxlKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CSpleGVfcGF0aCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7CiYjNDM7CXBhdGhfZ2V0KGV4ZV9wYXRoKTsKJiM0MzsJZnB1dChleGVfZmlsZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2V0X3Rhc2tfbW0gLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJiMzOTtzIG1tCiAgKiBAdGFzazogVGhlIHRhc2suCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMKaW5kZXggZTE2ZmY0MTMwYmMyZi4uMDVjYmEyNjFkZDM0OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suYwpAQCAtMTMsNiAmIzQzOzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHRyYWNlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdGFza193b3JrLmgmZ3Q7CiAKQEAgLTMzMCwyMiAmIzQzOzMzMSwxNSBAQCBpbnQgYWFfbWF5X3B0cmFjZShjb25zdCBzdHJ1Y3QgY3JlZCAqdHJhY2VyX2NyZWQsIHN0cnVjdCBhYV9sYWJlbCAqdHJhY2VyLAogCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N1cnJlbnRfZXhlX3BhdGgoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7Ci0Jc3RydWN0IGZpbGUgKmV4ZV9maWxlOwotCXN0cnVjdCBwYXRoIHA7CiYjNDM7CXN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9OwogCWNvbnN0IGNoYXIgKnBhdGhfc3RyOwogCi0JZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZShjdXJyZW50KTsKLQlpZiAoIWV4ZV9maWxlKQomIzQzOwlpZiAoZ2V0X3Rhc2tfZXhlX3BhdGgoY3VycmVudCwgJmFtcDtwKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci0JcCA9IGV4ZV9maWxlLSZndDtmX3BhdGg7Ci0JcGF0aF9nZXQoJmFtcDtwKTsKIAogCWlmIChhYV9wYXRoX25hbWUoJmFtcDtwLCBGTEFHX1ZJRVdfU1VCTlMsIGJ1ZmZlciwgJmFtcDtwYXRoX3N0ciwgTlVMTCwgTlVMTCkpCiAJCXBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTsKIAotCWZwdXQoZXhlX2ZpbGUpOwotCXBhdGhfcHV0KCZhbXA7cCk7Ci0KIAlyZXR1cm4gcGF0aF9zdHI7CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDAzOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4MDEKCQkJCQkJCW91dHB1dDogMjcwCgkJCQkJCQl0aG91Z2h0czogMTg5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBFdmFsdWF0aW9uOiBQYXRjaCBTZXJpZXMgQW5hbHlzaXMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHF1ZXN0aW9uIGF0IGhhbmQgaXMgd2hldGhlciB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGV4cGVydCBhc3Nlc3NtZW50IGlzLCBhbmQgdGhlIHJlYXNvbmluZyBpcywgKm5vKi4gTGV0JiMzOTtzIGdldCBpbnRvIHdoeS4KCkZpcnN0bHksIHRoZSBwYXRjaCYjMzk7cyBjb3JlIGZ1bmN0aW9uIGlzIHRvIGFkZCBhIHNldCBvZiBoZWxwZXJzIGFuZCBwaWRmZCBpb2N0bHM6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGBnZXRfdGFza19leGVfcGF0aGAgYW5kIGBQSURGRF9HRVRfRVhFYCwgYFBJREZEX0dFVF9DV0RgLCBgUElERkRfR0VUX1JPT1RgLiBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGEgd2F5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGxpa2UgYSB0YXNrJiMzOTtzIHJvb3QsIGN3ZCwgYW5kIGV4ZWN1dGFibGUgcGF0aCB2aWEgZmlsZSBkZXNjcmlwdG9ycy4gQ3J1Y2lhbGx5LCB0aGVzZSBuZXcgaW9jdGxzIGFyZSByZXR1cm5pbmcgZmlsZSBkZXNjcmlwdG9ycyAoYE9fUEFUSGApLCAqbm90KiBkaXJlY3RseSBjb3B5aW5nIGRhdGEgdG8gdXNlcnNwYWNlLCB3aGljaCBpcyBhIGtleSBwb2ludC4KCkFmdGVyIGNhcmVmdWxseSByZXZpZXdpbmcgdGhlIGNvZGUsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0aGF0IGNvdWxkIGFsbG93IGZvciBpbmZvcm1hdGlvbiBsZWFrYWdlIHRvIHVzZXIgc3BhY2UuIEZ1cnRoZXIsIGFsbCBzdGFjayB2YXJpYWJsZXMgdXNlZCwgbGlrZSBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307YCwgYXJlIHByb3Blcmx5IHplcm8taW5pdGlhbGl6ZWQsIGFuZCBjbGVhbnVwIGlzIGhhbmRsZWQgYnkgUkFJSS4gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZW4mIzM5O3QgYW55IG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgaGFwcGVuaW5nIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb2RlIG9yIHRoZSBjaGFuZ2VzIG1hZGUuCgpNZW1vcnkgc2FmZXR5IGlzIHBhcmFtb3VudCwgYW5kIG15IGNoZWNrcyBmb2N1cyBvbiB0aGF0LiBUaGUgcHJpbWFyeSByaXNrcyB3aXRoaW4gdGhlc2UgY2hhbmdlcyBib2lsIGRvd24gdG8gY2xhc3NpYyBrZXJuZWwgYnVnczogbG9ja2luZyBpc3N1ZXMgKHN5bmNocm9uaXphdGlvbiksIHJlZmVyZW5jZSBjb3VudGluZyBwcm9ibGVtcyAocG90ZW50aWFsIHVzZS1hZnRlci1mcmVlIGNvbmRpdGlvbnMpLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiBJJiMzOTttIHNhdGlzZmllZCB0aGF0IHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYW5kIGhhcmRlbmluZyB0b29scyBhcmUgcGVyZmVjdGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZXNlIGJ1Z3MuIEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIGV4aXN0aW5nIGtlcm5lbCBidWcgZGV0ZWN0b3JzIGFyZSwgaW4gbXkgZXhwZXJ0IG9waW5pb24sIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHNlcmllcy4KClRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIFRoZSBjaGFuZ2VzIGFyZSBsYXJnZWx5IGZvY3VzZWQgb24gcGF0aCByZXRyaWV2YWwgdmlhIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHVzZSBzdGFuZGFyZCBrZXJuZWwgcHJhY3RpY2VzLgoKTXkgZmluYWwgYW5hbHlzaXMgaXMgdGhhdCwgd2l0aCByZXNwZWN0IHRvIHRoZSBwYXRjaCBhbmQgaXRzIHBvdGVudGlhbCByaXNrcywgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYC4gSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBldmFsdWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAwMzoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxuXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXG5cbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjI0MTkyMzUwM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM0NDQ2MTk5OTY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF90YXNrX3Jvb3RcIixcbiAgICBcImdldF90YXNrX3B3ZFwiLFxuICAgIFwiZ2V0X3Rhc2tfZXhlX3BhdGhcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0YXNrIHBhdGggZXh0cmFjdGlvbiBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKSBhbmQgYWRkcyBuZXcgaW9jdGwgY29tbWFuZHMgdG8gcGlkZnMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIFBJREZEX0dFVF9ST09UKSByZXR1cm5pbmcgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMuXFxuXFxuMS4gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBpbmZvLWxlYWsgYW5hbHlzaXM6XFxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgbmV3IGlvY3RscyByZXR1cm4gYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IgdmlhIEZEX0FERC5cXG4gICAtIEFsbCBzdGFjayB2YXJpYWJsZXMgKGUuZy4sIGBzdHJ1Y3QgcGF0aCBwYXRoIF9fZnJlZShwYXRoX3B1dCkgPSB7fWApIGFyZSBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQuXFxuICAgLSBSZXR1cm4gcGF0aHMgYW5kIGVycm9yIGNvZGVzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3NpbmcgcmV0cmlldmVkIHBhdGhzLlxcblxcbjIuIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuICAgLSBQb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHJlbGF0ZSB0byByZWZlcmVuY2UgY291bnRpbmcgKGZwdXQsIHBhdGhfcHV0LCBnZXRfdGFza19zdHJ1Y3QpLCBsb2NraW5nL3N5bmNocm9uaXphdGlvbiAoZXhlY191cGRhdGVfbG9jaywgdGFza19sb2NrKSwgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcy5cXG4gICAtIFRoZXNlIGlzc3VlcyBhcmUgcHJvcGVybHkgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIGdlbmVyYWwga2VybmVsIGFzc2VydGlvbnMuIEtNU0FOIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MncyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjI0MTkzMDkwM1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0ODg5MTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYzhlMjUyYTk3MmZjMDAzOGU3ODA1NjE0YTdmMWI0NzJiMzE1OGM2N1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9mc19zdHJ1Y3QuYyBiL2ZzL2ZzX3N0cnVjdC5jXFxuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcXG4tLS0gYS9mcy9mc19zdHJ1Y3QuY1xcbisrKyBiL2ZzL2ZzX3N0cnVjdC5jXFxuQEAgLTEwLDYgKzEwLDUwIEBAXFxuICNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwibW91bnQuaFxcXCJcXG4gXFxuKy8qKlxcbisgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHJvb3QgcGF0aFxcbisgKiBAdGFzazogVGhlIHRhc2suXFxuKyAqIEByb290OiBUaGUgdGFzaydzIHJvb3QgcGF0aC5cXG4rICpcXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHJvb3QgcGF0aCwgb3IgLUVOT0VOVCBpZiBpdCBkb2VzIG5vdC4gVGhlXFxuKyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXFxuKyAqL1xcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KVxcbit7XFxuK1xcdGludCByZXQgPSAtRU5PRU5UO1xcbitcXG4rXFx0dGFza19sb2NrKHRhc2spO1xcbitcXHRpZiAodGFzay1cXHUwMDNlcmVhbF9mcykge1xcbitcXHRcXHRnZXRfZnNfcm9vdCh0YXNrLVxcdTAwM2VyZWFsX2ZzLCByb290KTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0YXNrKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBnZXRfdGFza19wd2QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnlcXG4rICogQHRhc2s6IFRoZSB0YXNrLlxcbisgKiBAcHdkOiBUaGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LlxcbisgKlxcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXFxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxcbisgKi9cXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpXFxuK3tcXG4rXFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuK1xcbitcXHR0YXNrX2xvY2sodGFzayk7XFxuK1xcdGlmICh0YXNrLVxcdTAwM2VyZWFsX2ZzKSB7XFxuK1xcdFxcdGdldF9mc19wd2QodGFzay1cXHUwMDNlcmVhbF9mcywgcHdkKTtcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0YXNrKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuIC8qXFxuICAqIFJlcGxhY2UgdGhlIGZzLVxcdTAwM2V7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLlxcbiAgKiBJdCBjYW4gYmxvY2suXFxuZGlmZiAtLWdpdCBhL2ZzL3BpZGZzLmMgYi9mcy9waWRmcy5jXFxuaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDRcXG4tLS0gYS9mcy9waWRmcy5jXFxuKysrIGIvZnMvcGlkZnMuY1xcbkBAIC00LDYgKzQsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZXhwb3J0ZnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19zdHJ1Y3QuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Nncm91cC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vdW50LmhcXHUwMDNlXFxuQEAgLTUxMCw2ICs1MTEsOSBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxcbiBcXHRjYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOlxcbiBcXHRjYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRTpcXG4gXFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuK1xcdGNhc2UgUElERkRfR0VUX1JPT1Q6XFxuIFxcdFxcdHJldHVybiB0cnVlO1xcbiBcXHR9XFxuIFxcbkBAIC01MjcsNjIgKzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxcbiBcXHRyZXR1cm4gZmFsc2U7XFxuIH1cXG4gXFxuLXN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4rc3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXFxuIHtcXG4tXFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xcbi1cXHRpbnQgZXJyb3I7XFxuLVxcbi1cXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXFxuLVxcdFxcdHJldHVybiAtRU5PSU9DVExDTUQ7XFxuLVxcbi1cXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XFxuLVxcdFxcdGlmICghYXJnKVxcbi1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tXFxuLVxcdFxcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XFxuLVxcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbitcXHRpZiAoIUlTX0VSUl9PUl9OVUxMKHRhc2spKSB7XFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuK1xcdFxcdHB1dF90YXNrX3N0cnVjdCh0YXNrKTtcXG4gXFx0fVxcbit9XFxuIFxcbi1cXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4tXFx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcXG4tXFx0XFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xcbisvKlxcbisgKiBSZXR1cm4gQHBpZCdzIHRhc2sgd2l0aCBAdGFzaydzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xcbisgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcXG4rICogc28gdGhhdCB0aGV5IGNhbm5vdCByYWNlIHdpdGggYSBjb25jdXJyZW50IGV4ZWN2ZSgpLlxcbisgKi9cXG4rc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgYXJnKVxcbit7XFxuK1xcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cXG4rXFx0XFx0Z2V0X3BpZF90YXNrKHBpZCwgUElEVFlQRV9QSUQpO1xcbitcXHRpbnQgZXJyb3I7XFxuIFxcbi1cXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xcbiBcXHRpZiAoIXRhc2spXFxuLVxcdFxcdHJldHVybiAtRVNSQ0g7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XFxuIFxcbiBcXHRpZiAoYXJnKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbi1cXHQvKlxcbi1cXHQgKiBXZSdyZSB0cnlpbmcgdG8gb3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgbmFtZXNwYWNlIHNvIHBlcmZvcm0gYVxcbi1cXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlXFxuLVxcdCAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlXFxuLVxcdCAqIGNyZWRlbnRpYWxzIHVzZWQgZm9yIHRoZSBhY2Nlc3MgZGVjaXNpb24gbWF0Y2ggdGhvc2Ugb2YgQHRhc2sgYXQgdGhlXFxuLVxcdCAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tXFxuLVxcdCAqIHN3YXBwaW5nIHRoZSB0YXNrJ3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXFxuLVxcdCAqIG1pcnJvciBuc2ZzIGJlaGF2aW9yLlxcbi1cXHQgKi9cXG4gXFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuIFxcdGlmIChlcnJvcilcXG4tXFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XFxuIFxcbiBcXHRpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQURfRlNDUkVEUykpIHtcXG4tXFx0XFx0ZXJyb3IgPSAtRUFDQ0VTO1xcbi1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnRhc2stXFx1MDAzZXNpZ25hbC1cXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FQUNDRVMpO1xcbiBcXHR9XFxuIFxcbitcXHRyZXR1cm5fcHRyKHRhc2spO1xcbit9XFxuK1xcbitERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxcbitcXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXFxuK1xcdCAgICAgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHBpZCwgYXJnKSxcXG4rXFx0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbitcXG4rc3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuK3tcXG4rXFx0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcXG4rXFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4rXFxuK1xcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XFxuK1xcdGlmIChJU19FUlIodGFzaykpXFxuK1xcdFxcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcXG4rXFxuIFxcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcXG4gXFx0XFx0bnNwID0gdGFzay1cXHUwMDNlbnNwcm94eTtcXG4gXFx0XFx0aWYgKG5zcClcXG4gXFx0XFx0XFx0Z2V0X25zcHJveHkobnNwKTtcXG4gXFx0fVxcbi1cXHRpZiAoIW5zcCkge1xcbi1cXHRcXHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xcbi1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuLVxcdH1cXG4rXFx0aWYgKCFuc3ApXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7IC8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJ3QgZXhpc3QgKi9cXG4gXFxuIFxcdHN3aXRjaCAoY21kKSB7XFxuIFxcdC8qIE5hbWVzcGFjZXMgdGhhdCBoYW5nIG9mIG5zcHJveHkuICovXFxuQEAgLTY2NCwxNiArNjczLDcyIEBAIHN0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4gI2VuZGlmXFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0Olxcbi1cXHRcXHRlcnJvciA9IC1FTk9JT0NUTENNRDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT0lPQ1RMQ01EKTtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKCFlcnJvciBcXHUwMDI2XFx1MDAyNiAhbnNfY29tbW9uKVxcbi1cXHRcXHRlcnJvciA9IC1FT1BOT1RTVVBQO1xcbitcXHRpZiAoIW5zX2NvbW1vbilcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApO1xcbiBcXG4tb3V0X3VubG9jazpcXG4tXFx0dXBfcmVhZChcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRyZXR1cm4gZXJyb3I7XFxuK1xcdHJldHVybiBuc19jb21tb247XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHBhdGggKnBhdGgpXFxuK3tcXG4rXFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcXG4rXFxuK1xcdGlmIChJU19FUlIodGFzaykpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKHRhc2spO1xcbitcXG4rXFx0c3dpdGNoIChjbWQpIHtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRcXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7XFxuK1xcdGNhc2UgUElERkRfR0VUX0NXRDpcXG4rXFx0XFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfUk9PVDpcXG4rXFx0XFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAtRUlOVkFMO1xcbit9XFxuK1xcbitzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuK3tcXG4rXFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4rXFx0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XFxuK1xcdGludCBlcnJvcjtcXG4rXFxuK1xcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcXG4rXFxuK1xcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcXG4rXFx0XFx0aWYgKCFhcmcpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcXG4rXFxuK1xcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbitcXHR9XFxuK1xcbitcXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4rXFx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcXG4rXFx0XFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xcbitcXG4rXFx0c3dpdGNoIChjbWQpIHtcXG4rXFx0Y2FzZSBQSURGRF9HRVRfRVhFOlxcbitcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuK1xcdGNhc2UgUElERkRfR0VUX1JPT1Q6XFxuK1xcdFxcdGVycm9yID0gcGlkZmRfZ2V0X3Rhc2tfcGF0aChwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnLCBcXHUwMDI2cGF0aCk7XFxuK1xcdFxcdGlmIChlcnJvcilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXG4rXFx0XFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXFxuK1xcdFxcdFxcdCAgICAgIGRlbnRyeV9vcGVuKFxcdTAwMjZwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7XFxuK1xcdH1cXG4rXFxuK1xcdG5zX2NvbW1vbiA9IHBpZGZkX2dldF9uYW1lc3BhY2UocGlkZmRfcGlkKGZpbGUpLCBjbWQsIGFyZyk7XFxuK1xcdGlmIChJU19FUlIobnNfY29tbW9uKSlcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcXG4gXFxuIFxcdC8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi9cXG4gXFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XFxuZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmNcXG5pbmRleCA2YTM5ZGU0MjRmNjJhLi43ZTJjMDUzODMyM2NjIDEwMDY0NFxcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXFxuKysrIGIvZnMvcHJvYy9iYXNlLmNcXG5AQCAtMjA2LDMxICsyMDYsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgcGlkX2VudHJ5X25saW5rKGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgKmVudHJpZXMsXFxuIFxcdHJldHVybiBjb3VudDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXFxuLXtcXG4tXFx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XFxuLVxcbi1cXHR0YXNrX2xvY2sodGFzayk7XFxuLVxcdGlmICh0YXNrLVxcdTAwM2VyZWFsX2ZzKSB7XFxuLVxcdFxcdGdldF9mc19yb290KHRhc2stXFx1MDAzZXJlYWxfZnMsIHJvb3QpO1xcbi1cXHRcXHRyZXN1bHQgPSAwO1xcbi1cXHR9XFxuLVxcdHRhc2tfdW5sb2NrKHRhc2spO1xcbi1cXHRyZXR1cm4gcmVzdWx0O1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG4gXFx0XFx0XFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4ge1xcbi1cXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcXG4tXFxuLVxcdHRhc2tfbG9jayh0YXNrKTtcXG4tXFx0aWYgKHRhc2stXFx1MDAzZXJlYWxfZnMpIHtcXG4tXFx0XFx0Z2V0X2ZzX3B3ZCh0YXNrLVxcdTAwM2VyZWFsX2ZzLCBwYXRoKTtcXG4tXFx0XFx0cmVzdWx0ID0gMDtcXG4tXFx0fVxcbi1cXHR0YXNrX3VubG9jayh0YXNrKTtcXG4tXFx0cmV0dXJuIHJlc3VsdDtcXG4rXFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxcbkBAIC0xNzYxLDE2ICsxNzQwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfc2V0X2NvbW1fb3BlcmF0aW9ucyA9IHtcXG4gc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoLFxcbiBcXHRcXHRcXHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiB7XFxuLVxcdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcXG4tXFxuLVxcdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XFxuLVxcdGlmIChleGVfZmlsZSkge1xcbi1cXHRcXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cXHUwMDNlZl9wYXRoO1xcbi1cXHRcXHRwYXRoX2dldChcXHUwMDI2ZXhlX2ZpbGUtXFx1MDAzZWZfcGF0aCk7XFxuLVxcdFxcdGZwdXQoZXhlX2ZpbGUpO1xcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFx0fSBlbHNlXFxuLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dClcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcXG5pbmRleCA5N2VlZjhkMzg2M2RkLi5mYjcyNTcwNzc1NGQyIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXFxuQEAgLTQyLDYgKzQyLDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCBwYXRoICpwd2QpXFxuIFxcdHJlYWRfc2VxdW5sb2NrX2V4Y2woXFx1MDAyNmZzLVxcdTAwM2VzZXEpO1xcbiB9XFxuIFxcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xcbitcXG4gc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpO1xcbiBcXG4gZXh0ZXJuIGJvb2wgY3VycmVudF9jaHJvb3RlZCh2b2lkKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oXFxuaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tLmhcXG5AQCAtNDIzOSw2ICs0MjM5LDcgQEAgZXh0ZXJuIGludCBzZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xcbiBleHRlcm4gaW50IHJlcGxhY2VfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XFxuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTtcXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKTtcXG4gXFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcXG5AQCAtMTIxLDQgKzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7XFxuICNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxcbiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcXG4gXFxuKy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2sncyBleGVjdXRhYmxlLiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMilcXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9DV0QgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMylcXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHJvb3QgZGlyZWN0b3J5LiAqL1xcbisjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNClcXG4rXFxuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXFxuaW5kZXggNDE2NzU4YzhhM2Q0My4uYTQ5M2RlM2FlNWMyMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvZm9yay5jXFxuKysrIGIva2VybmVsL2ZvcmsuY1xcbkBAIC0xMzcxLDYgKzEzNzEsMjcgQEAgc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4gXFx0cmV0dXJuIGV4ZV9maWxlO1xcbiB9XFxuIFxcbisvKipcXG4rICogZ2V0X3Rhc2tfZXhlX3BhdGggLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3MgZXhlY3V0YWJsZSBwYXRoXFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cXG4rICogQGV4ZV9wYXRoOiBUaGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aC5cXG4rICpcXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXFxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxcbisgKi9cXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxcbit7XFxuK1xcdHN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xcbitcXG4rXFx0aWYgKCFleGVfZmlsZSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cXHUwMDNlZl9wYXRoO1xcbitcXHRwYXRoX2dldChleGVfcGF0aCk7XFxuK1xcdGZwdXQoZXhlX2ZpbGUpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGdldF90YXNrX21tIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIG1tXFxuICAqIEB0YXNrOiBUaGUgdGFzay5cXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXFxuaW5kZXggZTE2ZmY0MTMwYmMyZi4uMDVjYmEyNjFkZDM0OSAxMDA2NDRcXG4tLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcXG4rKysgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcXG5AQCAtMTMsNiArMTMsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wdHJhY2UuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXFx1MDAzZVxcbiBcXG5AQCAtMzMwLDIyICszMzEsMTUgQEAgaW50IGFhX21heV9wdHJhY2UoY29uc3Qgc3RydWN0IGNyZWQgKnRyYWNlcl9jcmVkLCBzdHJ1Y3QgYWFfbGFiZWwgKnRyYWNlcixcXG4gXFxuIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfY3VycmVudF9leGVfcGF0aChjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSlcXG4ge1xcbi1cXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7XFxuLVxcdHN0cnVjdCBwYXRoIHA7XFxuK1xcdHN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xcbiBcXHRjb25zdCBjaGFyICpwYXRoX3N0cjtcXG4gXFxuLVxcdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUoY3VycmVudCk7XFxuLVxcdGlmICghZXhlX2ZpbGUpXFxuK1xcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcXHUwMDI2cCkpXFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbi1cXHRwID0gZXhlX2ZpbGUtXFx1MDAzZWZfcGF0aDtcXG4tXFx0cGF0aF9nZXQoXFx1MDAyNnApO1xcbiBcXG4gXFx0aWYgKGFhX3BhdGhfbmFtZShcXHUwMDI2cCwgRkxBR19WSUVXX1NVQk5TLCBidWZmZXIsIFxcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXFxuIFxcdFxcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcXG4gXFxuLVxcdGZwdXQoZXhlX2ZpbGUpO1xcbi1cXHRwYXRoX3B1dChcXHUwMDI2cCk7XFxuLVxcbiBcXHRyZXR1cm4gcGF0aF9zdHI7XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjUzLjcyNzU2OTQ1M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MjU0Mjg3NTE2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3Rhc2tfcm9vdFwiLFxuICAgIFwiZ2V0X3Rhc2tfcHdkXCIsXG4gICAgXCJnZXRfdGFza19leGVfcGF0aFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcydzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYzhlMjUyYTk3MmZjMDAzOGU3ODA1NjE0YTdmMWI0NzJiMzE1OGM2N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMxIDAzOjI2OjUyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZnNfc3RydWN0LmMgYi9mcy9mc19zdHJ1Y3QuY1xuaW5kZXggMzQ2OTlmM2I2Zjg4MS4uNWM3NzI4OTYyNjBhNCAxMDA2NDRcbi0tLSBhL2ZzL2ZzX3N0cnVjdC5jXG4rKysgYi9mcy9mc19zdHJ1Y3QuY1xuQEAgLTEwLDYgKzEwLDUwIEBAXG4gI2luY2x1ZGUgXCJpbnRlcm5hbC5oXCJcbiAjaW5jbHVkZSBcIm1vdW50LmhcIlxuIFxuKy8qKlxuKyAqIGdldF90YXNrX3Jvb3QgLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3Mgcm9vdCBwYXRoXG4rICogQHRhc2s6IFRoZSB0YXNrLlxuKyAqIEByb290OiBUaGUgdGFzaydzIHJvb3QgcGF0aC5cbisgKlxuKyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYSByb290IHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuIFRoZVxuKyAqIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdClcbit7XG4rXHRpbnQgcmV0ID0gLUVOT0VOVDtcbitcbitcdHRhc2tfbG9jayh0YXNrKTtcbitcdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbitcdFx0Z2V0X2ZzX3Jvb3QodGFzay1cdTAwM2VyZWFsX2ZzLCByb290KTtcbitcdFx0cmV0ID0gMDtcbitcdH1cbitcdHRhc2tfdW5sb2NrKHRhc2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogZ2V0X3Rhc2tfcHdkIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5XG4rICogQHRhc2s6IFRoZSB0YXNrLlxuKyAqIEBwd2Q6IFRoZSB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnkuXG4rICpcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgd29ya2luZyBkaXJlY3RvcnksIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4rICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpXG4re1xuK1x0aW50IHJldCA9IC1FTk9FTlQ7XG4rXG4rXHR0YXNrX2xvY2sodGFzayk7XG4rXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4rXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwd2QpO1xuK1x0XHRyZXQgPSAwO1xuK1x0fVxuK1x0dGFza191bmxvY2sodGFzayk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbiAvKlxuICAqIFJlcGxhY2UgdGhlIGZzLVx1MDAzZXtyb290bW50LHJvb3R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuXG4gICogSXQgY2FuIGJsb2NrLlxuZGlmZiAtLWdpdCBhL2ZzL3BpZGZzLmMgYi9mcy9waWRmcy5jXG5pbmRleCBhNmE2NDNmMTVkMDhhLi5iMjEzNzRmMDAwMDJlIDEwMDY0NFxuLS0tIGEvZnMvcGlkZnMuY1xuKysrIGIvZnMvcGlkZnMuY1xuQEAgLTQsNiArNCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0ZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9mc19zdHJ1Y3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2VcbkBAIC01MTAsNiArNTExLDkgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcbiBcdGNhc2UgUElERkRfR0VUX1VUU19OQU1FU1BBQ0U6XG4gXHRjYXNlIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRTpcbiBcdGNhc2UgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0U6XG4rXHRjYXNlIFBJREZEX0dFVF9FWEU6XG4rXHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4rXHRjYXNlIFBJREZEX0dFVF9ST09UOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbkBAIC01MjcsNjIgKzUzMSw2NyBAQCBzdGF0aWMgYm9vbCBwaWRmc19pb2N0bF92YWxpZCh1bnNpZ25lZCBpbnQgY21kKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4rc3RhdGljIGlubGluZSB2b2lkIHBpZGZkX3B1dF90YXNrX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPSBOVUxMO1xuLVx0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4tXHRcdHJldHVybiAtRU5PSU9DVExDTUQ7XG4tXG4tXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4tXHRcdGlmICghYXJnKVxuLVx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVxuLVx0XHRfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnO1xuLVx0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuK1x0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xuK1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuK1x0XHRwdXRfdGFza19zdHJ1Y3QodGFzayk7XG4gXHR9XG4rfVxuIFxuLVx0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4tXHRpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoUElERkRfR0VUX0lORk8pKVxuLVx0XHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XG4rLypcbisgKiBSZXR1cm4gQHBpZCdzIHRhc2sgd2l0aCBAdGFzaydzIGV4ZWNfdXBkYXRlX2xvY2sgaGVsZC4gVGhlIHB0cmFjZSBjaGVja1xuKyAqIGFuZCB0aGUgY2FsbGVycycgdGFzayBzdGF0ZSBsb29rdXAgbXVzdCBiZSBwZXJmb3JtZWQgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZFxuKyAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cbisgKi9cbitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWRmZF9nZXRfdGFza19sb2NrZWQoc3RydWN0IHBpZCAqcGlkLFxuK1x0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGFyZylcbit7XG4rXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgX19mcmVlKHB1dF90YXNrKSA9XG4rXHRcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcbitcdGludCBlcnJvcjtcbiBcbi1cdHRhc2sgPSBnZXRfcGlkX3Rhc2socGlkZmRfcGlkKGZpbGUpLCBQSURUWVBFX1BJRCk7XG4gXHRpZiAoIXRhc2spXG4tXHRcdHJldHVybiAtRVNSQ0g7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FU1JDSCk7XG4gXG4gXHRpZiAoYXJnKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tXHQvKlxuLVx0ICogV2UncmUgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIG5hbWVzcGFjZSBzbyBwZXJmb3JtIGFcbi1cdCAqIGZpbGVzeXN0ZW0gY3JlZCBwdHJhY2UgY2hlY2suIEhvbGQgQHRhc2sncyBleGVjX3VwZGF0ZV9sb2NrIGZvciB0aGVcbi1cdCAqIGR1cmF0aW9uIG9mIHRoZSBwdHJhY2UgY2hlY2sgYW5kIHRoZSBuYW1lc3BhY2UgbG9va3VwIHNvIHRoYXQgdGhlXG4tXHQgKiBjcmVkZW50aWFscyB1c2VkIGZvciB0aGUgYWNjZXNzIGRlY2lzaW9uIG1hdGNoIHRob3NlIG9mIEB0YXNrIGF0IHRoZVxuLVx0ICogdGltZSBpdHMgbmFtZXNwYWNlIGlzIHJlYWQsIHByZXZlbnRpbmcgYSBjb25jdXJyZW50IGV4ZWN2ZSgpIGZyb21cbi1cdCAqIHN3YXBwaW5nIHRoZSB0YXNrJ3MgY3JlZGVudGlhbHMgaW4gYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSB1c2UuIFdlXG4tXHQgKiBtaXJyb3IgbnNmcyBiZWhhdmlvci5cbi1cdCAqL1xuIFx0ZXJyb3IgPSBkb3duX3JlYWRfa2lsbGFibGUoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4gXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbitcdFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xuIFxuIFx0aWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7XG4tXHRcdGVycm9yID0gLUVBQ0NFUztcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuK1x0XHR1cF9yZWFkKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcbiBcdH1cbiBcbitcdHJldHVybl9wdHIodGFzayk7XG4rfVxuK1xuK0RFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosXG4rXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXG4rXHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXG4rXHQgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4rXG4rc3RhdGljIHN0cnVjdCBuc19jb21tb24gKnBpZGZkX2dldF9uYW1lc3BhY2Uoc3RydWN0IHBpZCAqcGlkLFxuK1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IG5zcHJveHkgKm5zcCBfX2ZyZWUocHV0X25zcHJveHkpID0gTlVMTDtcbitcdHN0cnVjdCBuc19jb21tb24gKm5zX2NvbW1vbiA9IE5VTEw7XG4rXG4rXHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuK1x0aWYgKElTX0VSUih0YXNrKSlcbitcdFx0cmV0dXJuIEVSUl9DQVNUKHRhc2spO1xuK1xuIFx0c2NvcGVkX2d1YXJkKHRhc2tfbG9jaywgdGFzaykge1xuIFx0XHRuc3AgPSB0YXNrLVx1MDAzZW5zcHJveHk7XG4gXHRcdGlmIChuc3ApXG4gXHRcdFx0Z2V0X25zcHJveHkobnNwKTtcbiBcdH1cbi1cdGlmICghbnNwKSB7XG4tXHRcdGVycm9yID0gLUVTUkNIOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbid0IGV4aXN0ICovXG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbi1cdH1cbitcdGlmICghbnNwKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRVNSQ0gpOyAvKiBqdXN0IHByZXRlbmQgaXQgZGlkbid0IGV4aXN0ICovXG4gXG4gXHRzd2l0Y2ggKGNtZCkge1xuIFx0LyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi9cbkBAIC02NjQsMTYgKzY3Myw3MiBAQCBzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gI2VuZGlmXG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0ZXJyb3IgPSAtRU5PSU9DVExDTUQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7XG4gXHR9XG4gXG4tXHRpZiAoIWVycm9yIFx1MDAyNlx1MDAyNiAhbnNfY29tbW9uKVxuLVx0XHRlcnJvciA9IC1FT1BOT1RTVVBQO1xuK1x0aWYgKCFuc19jb21tb24pXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTtcbiBcbi1vdXRfdW5sb2NrOlxuLVx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0cmV0dXJuIGVycm9yO1xuK1x0cmV0dXJuIG5zX2NvbW1vbjtcbit9XG4rXG4rc3RhdGljIGludCBwaWRmZF9nZXRfdGFza19wYXRoKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGNtZCxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBwYXRoICpwYXRoKVxuK3tcbitcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XG4rXG4rXHRpZiAoSVNfRVJSKHRhc2spKVxuK1x0XHRyZXR1cm4gUFRSX0VSUih0YXNrKTtcbitcbitcdHN3aXRjaCAoY21kKSB7XG4rXHRjYXNlIFBJREZEX0dFVF9FWEU6XG4rXHRcdHJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTtcbitcdGNhc2UgUElERkRfR0VUX0NXRDpcbitcdFx0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcbitcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4rXHRcdHJldHVybiBnZXRfdGFza19yb290KHRhc2ssIHBhdGgpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIC1FSU5WQUw7XG4rfVxuK1xuK3N0YXRpYyBsb25nIHBpZGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbit7XG4rXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuK1x0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XG4rXHRpbnQgZXJyb3I7XG4rXG4rXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXG4rXHRcdHJldHVybiAtRU5PSU9DVExDTUQ7XG4rXG4rXHRpZiAoY21kID09IEZTX0lPQ19HRVRWRVJTSU9OKSB7XG4rXHRcdGlmICghYXJnKVxuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0XHRfX3UzMiBfX3VzZXIgKmFyZ3AgPSAoX191MzIgX191c2VyICopYXJnO1xuK1xuK1x0XHRyZXR1cm4gcHV0X3VzZXIoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xuK1x0fVxuK1xuK1x0LyogRXh0ZW5zaWJsZSBJT0NUTCB0aGF0IGRvZXMgbm90IG9wZW4gbmFtZXNwYWNlIEZEcywgdGFrZSBhIHNob3J0Y3V0ICovXG4rXHRpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoUElERkRfR0VUX0lORk8pKVxuK1x0XHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XG4rXG4rXHRzd2l0Y2ggKGNtZCkge1xuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuK1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbitcdFx0ZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsIFx1MDAyNnBhdGgpO1xuK1x0XHRpZiAoZXJyb3IpXG4rXHRcdFx0cmV0dXJuIGVycm9yO1xuK1xuK1x0XHRyZXR1cm4gRkRfQUREKE9fQ0xPRVhFQyxcbitcdFx0XHQgICAgICBkZW50cnlfb3BlbihcdTAwMjZwYXRoLCBPX1BBVEgsIGN1cnJlbnRfY3JlZCgpKSk7XG4rXHR9XG4rXG4rXHRuc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpO1xuK1x0aWYgKElTX0VSUihuc19jb21tb24pKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihuc19jb21tb24pO1xuIFxuIFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xuIFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuY1xuaW5kZXggNmEzOWRlNDI0ZjYyYS4uN2UyYzA1MzgzMjNjYyAxMDA2NDRcbi0tLSBhL2ZzL3Byb2MvYmFzZS5jXG4rKysgYi9mcy9wcm9jL2Jhc2UuY1xuQEAgLTIwNiwzMSArMjA2LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHBpZF9lbnRyeV9ubGluayhjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRyaWVzLFxuIFx0cmV0dXJuIGNvdW50O1xuIH1cbiBcbi1zdGF0aWMgaW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdClcbi17XG4tXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcbi1cbi1cdHRhc2tfbG9jayh0YXNrKTtcbi1cdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbi1cdFx0Z2V0X2ZzX3Jvb3QodGFzay1cdTAwM2VyZWFsX2ZzLCByb290KTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbi19XG4tXG4gc3RhdGljIGludCBwcm9jX2N3ZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKnBhdGgsXG4gXHRcdFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4tXHRpbnQgcmVzdWx0ID0gLUVOT0VOVDtcbi1cbi1cdHRhc2tfbG9jayh0YXNrKTtcbi1cdGlmICh0YXNrLVx1MDAzZXJlYWxfZnMpIHtcbi1cdFx0Z2V0X2ZzX3B3ZCh0YXNrLVx1MDAzZXJlYWxfZnMsIHBhdGgpO1xuLVx0XHRyZXN1bHQgPSAwO1xuLVx0fVxuLVx0dGFza191bmxvY2sodGFzayk7XG4tXHRyZXR1cm4gcmVzdWx0O1xuK1x0cmV0dXJuIGdldF90YXNrX3B3ZCh0YXNrLCBwYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuQEAgLTE3NjEsMTYgKzE3NDAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9zZXRfY29tbV9vcGVyYXRpb25zID0ge1xuIHN0YXRpYyBpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpleGVfcGF0aCxcbiBcdFx0XHQgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cbi1cdGV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7XG4tXHRpZiAoZXhlX2ZpbGUpIHtcbi1cdFx0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0XHRwYXRoX2dldChcdTAwMjZleGVfZmlsZS1cdTAwM2VmX3BhdGgpO1xuLVx0XHRmcHV0KGV4ZV9maWxlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9IGVsc2Vcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgZXhlX3BhdGgpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGNhbGxfcHJvY19nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoX291dClcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oIGIvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaFxuaW5kZXggOTdlZWY4ZDM4NjNkZC4uZmI3MjU3MDc3NTRkMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbisrKyBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbkBAIC00Miw2ICs0Miw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfZnNfcHdkKHN0cnVjdCBmc19zdHJ1Y3QgKmZzLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuIFx0cmVhZF9zZXF1bmxvY2tfZXhjbChcdTAwMjZmcy1cdTAwM2VzZXEpO1xuIH1cbiBcbitpbnQgZ2V0X3Rhc2tfcm9vdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpyb290KTtcbitpbnQgZ2V0X3Rhc2tfcHdkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnB3ZCk7XG4rXG4gc3RydWN0IGZzX3N0cnVjdCAqc3dpdGNoX2ZzX3N0cnVjdChzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpO1xuIFxuIGV4dGVybiBib29sIGN1cnJlbnRfY2hyb290ZWQodm9pZCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oXG5pbmRleCBkZDA5YzQzOGZhMjNlLi5hNjVmMjRiMmU2NWJmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tLmhcbkBAIC00MjM5LDYgKzQyMzksNyBAQCBleHRlcm4gaW50IHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIGludCByZXBsYWNlX21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuK2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aCk7XG4gXG4gZXh0ZXJuIHZvaWQgdm1fc3RhdF9hY2NvdW50KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgbG9uZyBucGFnZXMpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbmluZGV4IDA5MTkyNDZhMTYxMWMuLjk1Y2UxODE5ZjQyM2YgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbkBAIC0xMjEsNCArMTIxLDExIEBAIHN0cnVjdCBwaWRmZF9pbmZvIHtcbiAjZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMClcbiAjZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcbiBcbisvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJ3MgZXhlY3V0YWJsZS4gKi9cbisjZGVmaW5lIFBJREZEX0dFVF9FWEUgICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMilcbisvKiBSZXR1cm4gYW4gT19QQVRIIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCB0YXNrJ3Mgd29ya2luZyBkaXJlY3RvcnkuICovXG4rI2RlZmluZSBQSURGRF9HRVRfQ1dEICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTMpXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHJvb3QgZGlyZWN0b3J5LiAqL1xuKyNkZWZpbmUgUElERkRfR0VUX1JPT1QgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDE0KVxuK1xuICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9QSURGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDQxNjc1OGM4YTNkNDMuLmE0OTNkZTNhZTVjMjAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4rKysgYi9rZXJuZWwvZm9yay5jXG5AQCAtMTM3MSw2ICsxMzcxLDI3IEBAIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4gXHRyZXR1cm4gZXhlX2ZpbGU7XG4gfVxuIFxuKy8qKlxuKyAqIGdldF90YXNrX2V4ZV9wYXRoIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAZXhlX3BhdGg6IFRoZSB0YXNrJ3MgZXhlY3V0YWJsZSBwYXRoLlxuKyAqXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhbiBleGVjdXRhYmxlIHBhdGgsIG9yIC1FTk9FTlQgaWYgaXQgZG9lcyBub3QuXG4rICogVGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHBhdGggdGhyb3VnaCBwYXRoX3B1dCgpIG9uIHN1Y2Nlc3MuXG4rICovXG4raW50IGdldF90YXNrX2V4ZV9wYXRoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKmV4ZV9wYXRoKVxuK3tcbitcdHN0cnVjdCBmaWxlICpleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xuK1xuK1x0aWYgKCFleGVfZmlsZSlcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHQqZXhlX3BhdGggPSBleGVfZmlsZS1cdTAwM2VmX3BhdGg7XG4rXHRwYXRoX2dldChleGVfcGF0aCk7XG4rXHRmcHV0KGV4ZV9maWxlKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBtbVxuICAqIEB0YXNrOiBUaGUgdGFzay5cbmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmMgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbmluZGV4IGUxNmZmNDEzMGJjMmYuLjA1Y2JhMjYxZGQzNDkgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL3Rhc2suY1xuQEAgLTEzLDYgKzEzLDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wdHJhY2UuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gXG5AQCAtMzMwLDIyICszMzEsMTUgQEAgaW50IGFhX21heV9wdHJhY2UoY29uc3Qgc3RydWN0IGNyZWQgKnRyYWNlcl9jcmVkLCBzdHJ1Y3QgYWFfbGFiZWwgKnRyYWNlcixcbiBcbiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N1cnJlbnRfZXhlX3BhdGgoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpXG4ge1xuLVx0c3RydWN0IGZpbGUgKmV4ZV9maWxlO1xuLVx0c3RydWN0IHBhdGggcDtcbitcdHN0cnVjdCBwYXRoIHAgX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xuIFx0Y29uc3QgY2hhciAqcGF0aF9zdHI7XG4gXG4tXHRleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKGN1cnJlbnQpO1xuLVx0aWYgKCFleGVfZmlsZSlcbitcdGlmIChnZXRfdGFza19leGVfcGF0aChjdXJyZW50LCBcdTAwMjZwKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tXHRwID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuLVx0cGF0aF9nZXQoXHUwMDI2cCk7XG4gXG4gXHRpZiAoYWFfcGF0aF9uYW1lKFx1MDAyNnAsIEZMQUdfVklFV19TVUJOUywgYnVmZmVyLCBcdTAwMjZwYXRoX3N0ciwgTlVMTCwgTlVMTCkpXG4gXHRcdHBhdGhfc3RyID0gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdGZwdXQoZXhlX2ZpbGUpO1xuLVx0cGF0aF9wdXQoXHUwMDI2cCk7XG4tXG4gXHRyZXR1cm4gcGF0aF9zdHI7XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6MjY6NTMuNzI3NTcxMDUzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTQzODYwNjYwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbml0aWFsIEFzc2Vzc21lbnQ6IFBhdGNoIERlZXAgRGl2ZSBcdTAwMjYgRnV6emluZyBTdWl0YWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFuYWx5emUgdGhlIGNvZGUgY2hhbmdlcyBhbmQgdGhlbiBkZXRlcm1pbmUgaXRzIGZ1enppbmcgcG90ZW50aWFsLlxuXG5UaGUgcGF0Y2ggaXRzZWxmIGlzIGludHJvZHVjaW5nIHNldmVyYWwgbmV3IGhlbHBlciBmdW5jdGlvbnMuIEkgc2VlIGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFkZGVkIHRvIHRoZSBrZXJuZWwuIFRoZXNlIGxvb2sgbGlrZSBzdHJhaWdodGZvcndhcmQgcGF0aCByZXRyaWV2YWwgZnVuY3Rpb25zLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBtb2RpZmljYXRpb25zIHRvIGBmcy9wcm9jL2Jhc2UuY2AgYW5kIGBzZWN1cml0eS9hcHBhcm1vci90YXNrLmNgIGNvbmZpcm0gdGhlc2UgaGVscGVycyBhcmUgYmVpbmcgdXNlZCBieSBjb3JlIGtlcm5lbCBjb21wb25lbnRzIGxpa2UgcHJvY2ZzIGFuZCBBcHBBcm1vciwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuXG5cblRoZSByZWFsIG1lYXQgb2YgdGhpcyBwYXRjaCBzZWVtcyB0byBiZSB0aGUgY2hhbmdlcyB3aXRoaW4gYGZzL3BpZGZzLmNgLiBJdCdzIGltcGxlbWVudGluZyBuZXcgaW9jdGxzIG9uIHBpZGZkczogYFBJREZEX0dFVF9FWEVgLCBgUElERkRfR0VUX0NXRGAsIGFuZCBgUElERkRfR0VUX1JPT1RgLiBUaGlzIHN1Z2dlc3RzIGEgbWVjaGFuaXNtIHRvIHJldHJpZXZlIGV4ZWN1dGFibGUgcGF0aCwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJvb3QgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIHBpZGZkIGludGVyZmFjZS4gVGhlIHJlZmFjdG9yaW5nIG9mIGBwaWRmZF9pb2N0bGAgaW5kaWNhdGVzIHNvbWUgbG9ja2luZyBjaGFuZ2VzLCB3aGljaCBpcyBhbHdheXMgZ29vZCB0byByZXZpZXcuIEl0IGFsc28gaW5jbHVkZXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBwaWRmZF9nZXRfdGFza19wYXRoYCwgd2hpY2ggbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgaW1wbGVtZW50YXRpb24uXG5cbk5vdyBmb3IgdGhlIGZ1enppbmcgYW5hbHlzaXMuIFRoaXMgaXMgY2VydGFpbmx5IHdvcnRoIGEgY2xvc2VyIGxvb2ssIGdpdmVuIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGNvcmUga2VybmVsIGxvZ2ljIGluIHRoZSBmaWxlc3lzdGVtIGFuZCBwaWRmZC9pb2N0bCBzcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBmYWN0IHRoYXQgdGhlc2UgbmV3IGlvY3RscyBhcmUgZWFzaWx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGBwaWRmZF9vcGVuYCBvciBgY2xvbmUoQ0xPTkVfUElERkQpYCBvciBqdXN0IHVzaW5nIGFuIGV4aXN0aW5nIHBpZGZkLCBtZWFucyBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGNvZGUgcGF0aHMgaW4gUUVNVSBvciBldmVuIHdpdGggYSBzdGFuZGFyZCB1c2Vyc3BhY2Ugc2V0dXAuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCBpbmNsdWRlcyByZWFsIGZ1bmN0aW9uYWwgY2hhbmdlcywgbG9ja2luZyByZWZhY3RvcmluZywgYW5kIG5ldyBpb2N0bHMgbWFrZXMgaXQgZXZlbiBtb3JlIGNvbXBlbGxpbmcgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgV29ydGhGdXp6aW5nPXRydWUuXG5cbk5vdywgbGV0J3Mgc2VlIHdoaWNoIGNvbmZpZ3VyYXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgTWFrZWZpbGVzIGZvciB0aGUgcmVsZXZhbnQgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMvcGlkZnMuY2AsIGBmcy9mc19zdHJ1Y3QuY2AsIGFuZCBga2VybmVsL2ZvcmsuY2AuIEkgd2lsbCB1c2UgYSB0b29sIGxpa2UgYGdyZXBwZXJgIG9yIGNoZWNrIHRoZSBNYWtlZmlsZXMgbWFudWFsbHkuIExldCdzIHNlZSB3aGF0IHdlIG5lZWQgdG8gZW5hYmxlIHRvIGFjY2VzcyBhbmQgZnV6eiB0aGVzZSBwYXRocy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwNCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI2OjU5LjE2NjE4MDMwM1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY4NTk5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwaWRmc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiA1MTUgbGluZXMuXFxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxcblxcbmZzL01ha2VmaWxlPTEwPW9iai15IDo9XFx0b3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcXFxcXFxuLS1cXG5mcy9NYWtlZmlsZS0xNy1cXHRcXHRmc19kaXJlbnQubyBmc19jb250ZXh0Lm8gZnNfcGFyc2VyLm8gZnNvcGVuLm8gaW5pdC5vIFxcXFxcXG5mcy9NYWtlZmlsZToxODpcXHRcXHRrZXJuZWxfcmVhZF9maWxlLm8gbW50X2lkbWFwcGluZy5vIHJlbWFwX3JhbmdlLm8gcGlkZnMubyBcXFxcXFxuZnMvTWFrZWZpbGUtMTktXFx0XFx0ZmlsZV9hdHRyLm8gZnNlcnJvci5vIG51bGxmcy5vIGZhaWxmcy5vXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTQ1LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lbGYuaFxcdTAwM2VcXG5mcy9jb3JlZHVtcC5jOjQ2OiNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWRmcy5oXFx1MDAzZVxcbmZzL2NvcmVkdW1wLmMtNDctI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldC5oXFx1MDAzZVxcbi0tXFxuZnMvY29yZWR1bXAuYz02MjM9c3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjI5LVxcdGlmIChjcC1cXHUwMDNlcGlkKSB7XFxuZnMvY29yZWR1bXAuYzo2MzA6XFx0XFx0c3RydWN0IGZpbGUgKnBpZGZzX2ZpbGUgX19mcmVlKGZwdXQpID0gTlVMTDtcXG5mcy9jb3JlZHVtcC5jLTYzMS1cXG5mcy9jb3JlZHVtcC5jOjYzMjpcXHRcXHRwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC1cXHUwMDNlcGlkLCAwKTtcXG5mcy9jb3JlZHVtcC5jOjYzMzpcXHRcXHRpZiAoSVNfRVJSKHBpZGZzX2ZpbGUpKVxcbmZzL2NvcmVkdW1wLmM6NjM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBpZGZzX2ZpbGUpO1xcbmZzL2NvcmVkdW1wLmMtNjM1LVxcbmZzL2NvcmVkdW1wLmM6NjM2OlxcdFxcdHBpZGZzX2NvcmVkdW1wKGNwKTtcXG5mcy9jb3JlZHVtcC5jLTYzNy1cXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjQ0LVxcdFxcdCAqL1xcbmZzL2NvcmVkdW1wLmM6NjQ1OlxcdFxcdGVyciA9IHJlcGxhY2VfZmQoQ09SRURVTVBfUElERkRfTlVNQkVSLCBwaWRmc19maWxlLCAwKTtcXG5mcy9jb3JlZHVtcC5jLTY0Ni1cXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4tLVxcbmZzL2NvcmVkdW1wLmM9NjY4PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjk5LVxcdCAqIGNyZWRlbnRpYWxzIGR1cmluZyBjb25uZWN0KCkgYmVsb3cuIFRoZW4gaW1tZWRpYXRlbHkgcmVnaXN0ZXJcXG5mcy9jb3JlZHVtcC5jOjcwMDpcXHQgKiBpdCBpbiBwaWRmcy4uLlxcbmZzL2NvcmVkdW1wLmMtNzAxLVxcdCAqL1xcbmZzL2NvcmVkdW1wLmMtNzAyLVxcdGNwcm0tXFx1MDAzZXBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcXG5mcy9jb3JlZHVtcC5jOjcwMzpcXHRyZXR2YWwgPSBwaWRmc19yZWdpc3Rlcl9waWQoY3BybS1cXHUwMDNlcGlkKTtcXG5mcy9jb3JlZHVtcC5jLTcwNC1cXHRpZiAocmV0dmFsKVxcbi0tXFxuZnMvY29yZWR1bXAuYy03MTAtXFx0ICovXFxuZnMvY29yZWR1bXAuYzo3MTE6XFx0cGlkZnNfY29yZWR1bXAoY3BybSk7XFxuZnMvY29yZWR1bXAuYy03MTItXFxuLS1cXG5mcy9maGFuZGxlLmM9MTcwPXN0YXRpYyBpbnQgZ2V0X3BhdGhfYW5jaG9yKGludCBmZCwgc3RydWN0IHBhdGggKnJvb3QpXFxuLS1cXG5mcy9maGFuZGxlLmMtMTg2LVxcdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XFxuZnMvZmhhbmRsZS5jOjE4NzpcXHRcXHRwaWRmc19nZXRfcm9vdChyb290KTtcXG5mcy9maGFuZGxlLmMtMTg4LVxcdFxcdHJldHVybiAwO1xcbi0tXFxuZnMvaW50ZXJuYWwuaD0zNjI9aW50IGFub25faW5vZGVfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbmZzL2ludGVybmFsLmgtMzYzLVxcdFxcdCAgICAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIpO1xcbmZzL2ludGVybmFsLmg6MzY0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpO1xcbmZzL2ludGVybmFsLmgtMzY1LXZvaWQgbnNmc19nZXRfcm9vdChzdHJ1Y3QgcGF0aCAqcGF0aCk7XFxuLS1cXG5mcy9saWJmcy5jLTI1LSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc2NyeXB0LmhcXHUwMDNlXFxuZnMvbGliZnMuYzoyNjojaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkZnMuaFxcdTAwM2VcXG5mcy9saWJmcy5jLTI3LVxcbi0tXFxuZnMvbGliZnMuYz0yMTkyPXN0cnVjdCBkZW50cnkgKnN0YXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICoqc3Rhc2hlZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KVxcbi0tXFxuZnMvbGliZnMuYy0yMjI1LSAqXFxuZnMvbGliZnMuYzoyMjI2OiAqIFNwZWNpYWwtcHVycG9zZSBoZWxwZXIgZm9yIG5zZnMgYW5kIHBpZGZzLlxcbmZzL2xpYmZzLmMtMjIyNy0gKlxcbi0tXFxuZnMvbmFtZXNwYWNlLmMtMzQtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21udF9pZG1hcHBpbmcuaFxcdTAwM2VcXG5mcy9uYW1lc3BhY2UuYzozNTojaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkZnMuaFxcdTAwM2VcXG5mcy9uYW1lc3BhY2UuYy0zNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbnN0cmVlLmhcXHUwMDNlXFxuLS1cXG5mcy9uYW1lc3BhY2UuYz0yODgxPXN0YXRpYyBpbnQgZG9fY2hhbmdlX3R5cGUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGludCBtc19mbGFncylcXG4tLVxcbmZzL25hbWVzcGFjZS5jLTI5MjktICogICAgIGVudHJ5IGZyb20gbnNmcy5cXG5mcy9uYW1lc3BhY2UuYzoyOTMwOiAqICgzKSBUaGUgY2FsbGVyIHRyaWVzIHRvIGNvcHkgYSBwaWRmcyBtb3VudCByZWZlcnJpbmcgdG8gYSBwaWRmZC5cXG5mcy9uYW1lc3BhY2UuYy0yOTMxLSAqICg0KSBUaGUgY2FsbGVyIGlzIHRyeWluZyB0byBjb3B5IGEgbW91bnQgdHJlZSB0aGF0IGJlbG9uZ3MgdG8gYW5cXG4tLVxcbmZzL25hbWVzcGFjZS5jPTI5NjA9c3RhdGljIGlubGluZSBib29sIG1heV9jb3B5X3RyZWUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpXFxuLS1cXG5mcy9uYW1lc3BhY2UuYy0yOTcxLVxcbmZzL25hbWVzcGFjZS5jOjI5NzI6XFx0aWYgKGRfb3AgPT0gXFx1MDAyNnBpZGZzX2RlbnRyeV9vcGVyYXRpb25zKVxcbmZzL25hbWVzcGFjZS5jLTI5NzMtXFx0XFx0cmV0dXJuIHRydWU7XFxuLS1cXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYy0xNi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5naGFzaC5oXFx1MDAzZVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jOjE3OiNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWRmcy5oXFx1MDAzZVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTE4LVxcbi0tXFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmM9NzQ0PXN0YXRpYyBzdHJ1Y3QgZmFub3RpZnlfZXZlbnQgKmZhbm90aWZ5X2FsbG9jX2V2ZW50KFxcbi0tXFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMtODQ4LVxcdGlmIChGQU5fR1JPVVBfRkxBRyhncm91cCwgRkFOX1JFUE9SVF9QSURGRCkgXFx1MDAyNlxcdTAwMjZcXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYzo4NDk6XFx0ICAgIHBpZGZzX3JlZ2lzdGVyX3BpZF9nZnAocGlkLCBnZnApKVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jLTg1MC1cXHRcXHRnb3RvIG91dDtcXG4tLVxcbmZzL3BpZGZzLmMtMTEtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BpZC5oXFx1MDAzZVxcbmZzL3BpZGZzLmM6MTI6I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BpZGZzLmhcXHUwMDNlXFxuZnMvcGlkZnMuYy0xMy0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcXHUwMDNlXFxuLS1cXG5mcy9waWRmcy5jLTM3LVxcbmZzL3BpZGZzLmM6Mzg6c3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwaWRmc19hdHRyX2NhY2hlcCBfX3JvX2FmdGVyX2luaXQ7XFxuZnMvcGlkZnMuYy0zOS1cXG5mcy9waWRmcy5jOjQwOnN0YXRpYyBzdHJ1Y3QgcGF0aCBwaWRmc19yb290X3BhdGggPSB7fTtcXG5mcy9waWRmcy5jLTQxLVxcbmZzL3BpZGZzLmM6NDI6c3RhdGljIHN0cnVjdCBzaW1wbGVfeGF0dHJfY2FjaGUgcGlkZnNfeGFfY2FjaGU7XFxuZnMvcGlkZnMuYy00My1cXG5mcy9waWRmcy5jOjQ0OnZvaWQgcGlkZnNfZ2V0X3Jvb3Qoc3RydWN0IHBhdGggKnBhdGgpXFxuZnMvcGlkZnMuYy00NS17XFxuZnMvcGlkZnMuYzo0NjpcXHQqcGF0aCA9IHBpZGZzX3Jvb3RfcGF0aDtcXG5mcy9waWRmcy5jLTQ3LVxcdHBhdGhfZ2V0KHBhdGgpO1xcbi0tXFxuZnMvcGlkZnMuYy00OS1cXG5mcy9waWRmcy5jOjUwOmVudW0gcGlkZnNfYXR0cl9tYXNrX2JpdHMge1xcbmZzL3BpZGZzLmMtNTEtXFx0UElERlNfQVRUUl9CSVRfRVhJVFxcdD0gMCxcXG4tLVxcbmZzL3BpZGZzLmMtNTQtXFxuZnMvcGlkZnMuYzo1NTpzdHJ1Y3QgcGlkZnNfYW5vbl9hdHRyIHtcXG5mcy9waWRmcy5jLTU2LVxcdHVuc2lnbmVkIGxvbmcgYXR0cl9tYXNrO1xcbi0tXFxuZnMvcGlkZnMuYy02NS1cXG5mcy9waWRmcy5jOjY2OnN0YXRpYyBzdHJ1Y3Qgcmhhc2h0YWJsZSBwaWRmc19pbm9faHQ7XFxuZnMvcGlkZnMuYy02Ny1cXG5mcy9waWRmcy5jOjY4OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGlkZnNfaW5vX2h0X3BhcmFtcyA9IHtcXG5mcy9waWRmcy5jLTY5LVxcdC5rZXlfb2Zmc2V0XFx0XFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBpbm8pLFxcbmZzL3BpZGZzLmMtNzAtXFx0LmtleV9sZW5cXHRcXHQ9IHNpemVvZih1NjQpLFxcbmZzL3BpZGZzLmM6NzE6XFx0LmhlYWRfb2Zmc2V0XFx0XFx0PSBvZmZzZXRvZihzdHJ1Y3QgcGlkLCBwaWRmc19oYXNoKSxcXG5mcy9waWRmcy5jLTcyLVxcdC5hdXRvbWF0aWNfc2hyaW5raW5nXFx0PSB0cnVlLFxcbi0tXFxuZnMvcGlkZnMuYy04NS0gKlxcbmZzL3BpZGZzLmM6ODY6ICogT24gMzIgYml0IHBpZGZzX2lubygpIHdpbGwgcmV0dXJuIHRoZSBsb3dlciAzMiBiaXQuIFdoZW5cXG5mcy9waWRmcy5jOjg3OiAqIHBpZGZzX2lubygpIHJldHVybnMgemVybyBhIHdyYXAgYXJvdW5kIGhhcHBlbmVkLiBXaGVuIGFcXG5mcy9waWRmcy5jLTg4LSAqIHdyYXBhcm91bmQgaGFwcGVucyB0aGUgNjQgYml0IG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIGJ5IDFcXG4tLVxcbmZzL3BpZGZzLmMtOTUtICogc2FtZSBpbm9kZSBudW1iZXIgYXJlIGxpa2VseSB0byBleGlzdCAoVGhpcyBpc24ndCBhIHByb2JsZW1cXG5mcy9waWRmcy5jOjk2OiAqIHNpbmNlIGJlZm9yZSBwaWRmcyBwaWRmZHMgdXNlZCB0aGUgYW5vbnltb3VzIGlub2RlIG1lYW5pbmdcXG5mcy9waWRmcy5jLTk3LSAqIGFsbCBwaWRmZHMgaGFkIHRoZSBzYW1lIGlub2RlIG51bWJlci4pLiBVc2Vyc3BhY2UgY2FuXFxuLS1cXG5mcy9waWRmcy5jLTEwMS0gKi9cXG5mcy9waWRmcy5jOjEwMjpzdHJ1Y3QgcGlkZnNfYXR0ciB7XFxuZnMvcGlkZnMuYy0xMDMtXFx0c3RydWN0IGxpc3RfaGVhZCB4YXR0cnM7XFxuZnMvcGlkZnMuYy0xMDQtXFx0dW5pb24ge1xcbmZzL3BpZGZzLmM6MTA1OlxcdFxcdHN0cnVjdCBwaWRmc19hbm9uX2F0dHI7XFxuZnMvcGlkZnMuYzoxMDY6XFx0XFx0c3RydWN0IGxsaXN0X25vZGUgcGlkZnNfbGxpc3Q7XFxuZnMvcGlkZnMuYy0xMDctXFx0fTtcXG4tLVxcbmZzL3BpZGZzLmMtMTExLVxcbmZzL3BpZGZzLmM6MTEyOnN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlkZnNfaW5vX2xvY2spO1xcbmZzL3BpZGZzLmM6MTEzOnN0YXRpYyB1NjQgcGlkZnNfaW5vX25yID0gMTtcXG5mcy9waWRmcy5jLTExNC1cXG5mcy9waWRmcy5jOjExNTpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGlkZnNfaW5vKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xMTYte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjAtLyogT24gMzIgYml0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBhcmUgdGhlIHVwcGVyIDMyIGJpdHMuICovXFxuZnMvcGlkZnMuYzoxMjE6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xMjIte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjUtXFxuZnMvcGlkZnMuYzoxMjY6c3RhdGljIGlubGluZSB1NjQgcGlkZnNfYWxsb2NfaW5vKHZvaWQpXFxuZnMvcGlkZnMuYy0xMjcte1xcbi0tXFxuZnMvcGlkZnMuYy0xMjktXFxuZnMvcGlkZnMuYzoxMzA6XFx0c3Bpbl9sb2NrKFxcdTAwMjZwaWRmc19pbm9fbG9jayk7XFxuZnMvcGlkZnMuYzoxMzE6XFx0aWYgKHBpZGZzX2lubyhwaWRmc19pbm9fbnIpID09IDApXFxuZnMvcGlkZnMuYzoxMzI6XFx0XFx0cGlkZnNfaW5vX25yKys7XFxuZnMvcGlkZnMuYzoxMzM6XFx0aW5vID0gcGlkZnNfaW5vX25yKys7XFxuZnMvcGlkZnMuYzoxMzQ6XFx0c3Bpbl91bmxvY2soXFx1MDAyNnBpZGZzX2lub19sb2NrKTtcXG5mcy9waWRmcy5jLTEzNS1cXHRyZXR1cm4gaW5vO1xcbi0tXFxuZnMvcGlkZnMuYy0xNDAtLyogT24gNjQgYml0IHNpbXBseSByZXR1cm4gaW5vLiAqL1xcbmZzL3BpZGZzLmM6MTQxOnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwaWRmc19pbm8odTY0IGlubylcXG5mcy9waWRmcy5jLTE0Mi17XFxuLS1cXG5mcy9waWRmcy5jLTE0Ni0vKiBPbiA2NCBiaXQgdGhlIGdlbmVyYXRpb24gbnVtYmVyIGlzIDAuICovXFxuZnMvcGlkZnMuYzoxNDc6c3RhdGljIGlubGluZSB1MzIgcGlkZnNfZ2VuKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy0xNDgte1xcbi0tXFxuZnMvcGlkZnMuYy0xNTEtXFxuZnMvcGlkZnMuYzoxNTI6REVGSU5FX0NPT0tJRShwaWRmc19pbm9fY29va2llKTtcXG5mcy9waWRmcy5jLTE1My1cXG5mcy9waWRmcy5jOjE1NDpzdGF0aWMgdTY0IHBpZGZzX2FsbG9jX2lubyh2b2lkKVxcbmZzL3BpZGZzLmMtMTU1LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTU4LVxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbmZzL3BpZGZzLmM6MTU5OlxcdGlubyA9IGdlbl9jb29raWVfbmV4dChcXHUwMDI2cGlkZnNfaW5vX2Nvb2tpZSk7XFxuZnMvcGlkZnMuYy0xNjAtXFx0cHJlZW1wdF9lbmFibGUoKTtcXG4tLVxcbmZzL3BpZGZzLmMtMTY3LVxcbmZzL3BpZGZzLmM6MTY4OnZvaWQgcGlkZnNfcHJlcGFyZV9waWQoc3RydWN0IHBpZCAqcGlkKVxcbmZzL3BpZGZzLmMtMTY5LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTc0LVxcbmZzL3BpZGZzLmM6MTc1OmludCBwaWRmc19hZGRfcGlkKHN0cnVjdCBwaWQgKnBpZClcXG5mcy9waWRmcy5jLTE3Ni17XFxuLS1cXG5mcy9waWRmcy5jLTE3OC1cXG5mcy9waWRmcy5jOjE3OTpcXHRwaWQtXFx1MDAzZWlubyA9IHBpZGZzX2FsbG9jX2lubygpO1xcbmZzL3BpZGZzLmM6MTgwOlxcdHJldCA9IHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoXFx1MDAyNnBpZGZzX2lub19odCwgXFx1MDAyNnBpZC1cXHUwMDNlcGlkZnNfaGFzaCxcXG5mcy9waWRmcy5jOjE4MTpcXHRcXHRcXHRcXHQgICAgIHBpZGZzX2lub19odF9wYXJhbXMpO1xcbmZzL3BpZGZzLmMtMTgyLVxcdGlmICh1bmxpa2VseShyZXQpKVxcbi0tXFxuZnMvcGlkZnMuYy0xODYtXFxuZnMvcGlkZnMuYzoxODc6dm9pZCBwaWRmc19yZW1vdmVfcGlkKHN0cnVjdCBwaWQgKnBpZClcXG5mcy9waWRmcy5jLTE4OC17XFxuZnMvcGlkZnMuYy0xODktXFx0aWYgKGxpa2VseShwaWQtXFx1MDAzZWlubykpXFxuZnMvcGlkZnMuYzoxOTA6XFx0XFx0cmhhc2h0YWJsZV9yZW1vdmVfZmFzdChcXHUwMDI2cGlkZnNfaW5vX2h0LCBcXHUwMDI2cGlkLVxcdTAwM2VwaWRmc19oYXNoLFxcbmZzL3BpZGZzLmM6MTkxOlxcdFxcdFxcdFxcdCAgICAgICBwaWRmc19pbm9faHRfcGFyYW1zKTtcXG5mcy9waWRmcy5jLTE5Mi19XFxuZnMvcGlkZnMuYy0xOTMtXFxuZnMvcGlkZnMuYzoxOTQ6c3RhdGljIExMSVNUX0hFQUQocGlkZnNfZnJlZV9saXN0KTtcXG5mcy9waWRmcy5jLTE5NS1cXG5mcy9waWRmcy5jOjE5NjpzdGF0aWMgdm9pZCBwaWRmc19mcmVlX2F0dHJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuZnMvcGlkZnMuYy0xOTcte1xcbmZzL3BpZGZzLmM6MTk4OlxcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyLCAqbmV4dDtcXG5mcy9waWRmcy5jLTE5OS1cXHRzdHJ1Y3QgbGxpc3Rfbm9kZSAqaGVhZDtcXG5mcy9waWRmcy5jLTIwMC1cXG5mcy9waWRmcy5jOjIwMTpcXHRoZWFkID0gbGxpc3RfZGVsX2FsbChcXHUwMDI2cGlkZnNfZnJlZV9saXN0KTtcXG5mcy9waWRmcy5jOjIwMjpcXHRsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGF0dHIsIG5leHQsIGhlYWQsIHBpZGZzX2xsaXN0KSB7XFxuZnMvcGlkZnMuYzoyMDM6XFx0XFx0c2ltcGxlX3hhdHRyc19mcmVlKFxcdTAwMjZwaWRmc194YV9jYWNoZSwgXFx1MDAyNmF0dHItXFx1MDAzZXhhdHRycywgTlVMTCk7XFxuZnMvcGlkZnMuYy0yMDQtXFx0XFx0a2ZyZWUoYXR0cik7XFxuLS1cXG5mcy9waWRmcy5jLTIwNy1cXG5mcy9waWRmcy5jOjIwODpzdGF0aWMgREVDTEFSRV9XT1JLKHBpZGZzX2ZyZWVfd29yaywgcGlkZnNfZnJlZV9hdHRyX3dvcmspO1xcbmZzL3BpZGZzLmMtMjA5LVxcbmZzL3BpZGZzLmM6MjEwOnZvaWQgcGlkZnNfZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKVxcbmZzL3BpZGZzLmMtMjExLXtcXG5mcy9waWRmcy5jOjIxMjpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0ciA9IHBpZC1cXHUwMDNlYXR0cjtcXG5mcy9waWRmcy5jLTIxMy1cXG4tLVxcbmZzL3BpZGZzLmMtMjMyLVxcdFxcdGtmcmVlKGF0dHIpO1xcbmZzL3BpZGZzLmM6MjMzOlxcdGVsc2UgaWYgKGxsaXN0X2FkZChcXHUwMDI2YXR0ci1cXHUwMDNlcGlkZnNfbGxpc3QsIFxcdTAwMjZwaWRmc19mcmVlX2xpc3QpKVxcbmZzL3BpZGZzLmM6MjM0OlxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnBpZGZzX2ZyZWVfd29yayk7XFxuZnMvcGlkZnMuYy0yMzUtfVxcbi0tXFxuZnMvcGlkZnMuYz0zMzA9c3RhdGljIGlubGluZSBib29sIHBpZF9pbl9jdXJyZW50X3BpZG5zKGNvbnN0IHN0cnVjdCBwaWQgKnBpZClcXG4tLVxcbmZzL3BpZGZzLmMtMzM5LVxcbmZzL3BpZGZzLmM6MzQwOnN0YXRpYyBfX3UzMiBwaWRmc19jb3JlZHVtcF9tYXNrKGVudW0gdGFza19kdW1wYWJsZSBkdW1wYWJsZSlcXG5mcy9waWRmcy5jLTM0MS17XFxuLS1cXG5mcy9waWRmcy5jPTM2Nj1zdGF0aWMgbG9uZyBwaWRmZF9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmZzL3BpZGZzLmMtMzczLVxcdHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucztcXG5mcy9waWRmcy5jOjM3NDpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTM3NS1cXHRjb25zdCBzdHJ1Y3QgY3JlZCAqYztcXG4tLVxcbmZzL3BpZGZzLmMtNDM0LVxcdGlmICgobWFzayBcXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIFxcdTAwMjZcXHUwMDI2ICFraW5mby5jb3JlZHVtcF9tYXNrKSB7XFxuZnMvcGlkZnMuYzo0MzU6XFx0XFx0a2luZm8uY29yZWR1bXBfbWFzayA9IHBpZGZzX2NvcmVkdW1wX21hc2sodGFza19leGVjX3N0YXRlX2dldF9kdW1wYWJsZSh0YXNrKSk7XFxuZnMvcGlkZnMuYy00MzYtXFx0XFx0a2luZm8ubWFzayB8PSBQSURGRF9JTkZPX0NPUkVEVU1QO1xcbi0tXFxuZnMvcGlkZnMuYy00OTktXFxuZnMvcGlkZnMuYzo1MDA6c3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcXG5mcy9waWRmcy5jLTUwMS17XFxuLS1cXG5mcy9waWRmcy5jPTcwNT1zdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5mcy9waWRmcy5jLTcxMC1cXG5mcy9waWRmcy5jOjcxMTpcXHRpZiAoIXBpZGZzX2lvY3RsX3ZhbGlkKGNtZCkpXFxuZnMvcGlkZnMuYy03MTItXFx0XFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcXG4tLVxcbmZzL3BpZGZzLmM9NzQ4PXN0YXRpYyBsb25nIHBpZGZkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbmZzL3BpZGZzLmMtNzU3LVxcbmZzL3BpZGZzLmM6NzU4OnN0YXRpYyBpbnQgcGlkZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL3BpZGZzLmMtNzU5LXtcXG4tLVxcbmZzL3BpZGZzLmMtNzc3LVxcbmZzL3BpZGZzLmM6Nzc4OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBpZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHtcXG5mcy9waWRmcy5jOjc3OTpcXHQucmVsZWFzZVxcdD0gcGlkZnNfZmlsZV9yZWxlYXNlLFxcbmZzL3BpZGZzLmMtNzgwLVxcdC5wb2xsXFx0XFx0PSBwaWRmZF9wb2xsLFxcbi0tXFxuZnMvcGlkZnMuYz03OTA9c3RydWN0IHBpZCAqcGlkZmRfcGlkKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL3BpZGZzLmMtNzkxLXtcXG5mcy9waWRmcy5jOjc5MjpcXHRpZiAoZmlsZS1cXHUwMDNlZl9vcCAhPSBcXHUwMDI2cGlkZnNfZmlsZV9vcGVyYXRpb25zKVxcbmZzL3BpZGZzLmMtNzkzLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FQkFERik7XFxuLS1cXG5mcy9waWRmcy5jLTgwNC0gKiBwaWQtXFx1MDAzZWF0dHIgd2lsbCBiZSBhbGxvY2F0ZWQuIElmIG5vdCB3ZSBtYXJrIHRoZSBzdHJ1Y3QgcGlkIGFzIGRlYWQgc29cXG5mcy9waWRmcy5jOjgwNTogKiBhbnlvbmUgd2hvIGlzIHRyeWluZyB0byByZWdpc3RlciBpdCB3aXRoIHBpZGZzIHdpbGwgZmFpbCB0byBkbyBzby5cXG5mcy9waWRmcy5jOjgwNjogKiBPdGhlcndpc2Ugd2Ugd291bGQgaGFuZCBvdXQgcGlkZnMgZm9yIHJlYXBlZCB0YXNrcyB3aXRob3V0IGhhdmluZ1xcbmZzL3BpZGZzLmMtODA3LSAqIGV4aXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLlxcbi0tXFxuZnMvcGlkZnMuYy04MTAtICogcmlnaHQgYXdheSBpbiBmcmVlX3BpZCgpIHdoZW4gbm8gb25lIGhvbGRzIGEgcGlkZmQgYW55bW9yZS4gU2luY2VcXG5mcy9waWRmcy5jOjgxMTogKiBwaWRmc19leGl0KCkgY3VycmVudGx5IGlzIHBsYWNlZCBhZnRlciBleGl0X3Rhc2tfd29yaygpIHdlIGtub3cgdGhhdFxcbmZzL3BpZGZzLmMtODEyLSAqIGl0IGNhbm5vdCBiZSB1cyBha2EgdGhlIGV4aXRpbmcgdGFzayBob2xkaW5nIGEgcGlkZmQgdG8gaXRzZWxmLlxcbmZzL3BpZGZzLmMtODEzLSAqL1xcbmZzL3BpZGZzLmM6ODE0OnZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG5mcy9waWRmcy5jLTgxNS17XFxuZnMvcGlkZnMuYy04MTYtXFx0c3RydWN0IHBpZCAqcGlkID0gdGFza19waWQodHNrKTtcXG5mcy9waWRmcy5jOjgxNzpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTgxOC0jaWZkZWYgQ09ORklHX0NHUk9VUFNcXG4tLVxcbmZzL3BpZGZzLmMtODIzLVxcbmZzL3BpZGZzLmM6ODI0OlxcdC8qIFN5bmNocm9uaXplIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkuICovXFxuZnMvcGlkZnMuYy04MjUtXFx0c2NvcGVkX2d1YXJkKHNwaW5sb2NrX2lycSwgXFx1MDAyNnBpZC1cXHUwMDNld2FpdF9waWRmZC5sb2NrKSB7XFxuLS1cXG5mcy9waWRmcy5jLTgyOS1cXHRcXHRcXHQgKiBObyBvbmUgZXZlciBoZWxkIGEgcGlkZmQgZm9yIHRoaXMgc3RydWN0IHBpZC5cXG5mcy9waWRmcy5jOjgzMDpcXHRcXHRcXHQgKiBNYXJrIGl0IGFzIGRlYWQgc28gbm8gb25lIGNhbiBhZGQgYSBwaWRmc1xcbmZzL3BpZGZzLmMtODMxLVxcdFxcdFxcdCAqIGVudHJ5IGFueW1vcmUuIFdlJ3JlIGFib3V0IHRvIGJlIHJlYXBlZCBhbmRcXG4tLVxcbmZzL3BpZGZzLmMtODYwLSNpZmRlZiBDT05GSUdfQ09SRURVTVBcXG5mcy9waWRmcy5jOjg2MTp2b2lkIHBpZGZzX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXFxuZnMvcGlkZnMuYy04NjIte1xcbmZzL3BpZGZzLmMtODYzLVxcdHN0cnVjdCBwaWQgKnBpZCA9IGNwcm0tXFx1MDAzZXBpZDtcXG5mcy9waWRmcy5jOjg2NDpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTg2NS1cXG4tLVxcbmZzL3BpZGZzLmMtODcxLVxcdC8qIE5vdGUgaG93IHdlIHdlcmUgY29yZWR1bXBlZCBhbmQgdGhhdCB3ZSBjb3JlZHVtcGVkLiAqL1xcbmZzL3BpZGZzLmM6ODcyOlxcdGF0dHItXFx1MDAzZWNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKGNwcm0tXFx1MDAzZWR1bXBhYmxlKSB8XFxuZnMvcGlkZnMuYy04NzMtXFx0XFx0XFx0ICAgICAgUElERkRfQ09SRURVTVBFRDtcXG4tLVxcbmZzL3BpZGZzLmMtODgzLVxcbmZzL3BpZGZzLmM6ODg0OnN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpZGZzX21udCBfX3JvX2FmdGVyX2luaXQ7XFxuZnMvcGlkZnMuYy04ODUtXFxuLS1cXG5mcy9waWRmcy5jLTg5MC0gKi9cXG5mcy9waWRmcy5jOjg5MTpzdGF0aWMgaW50IHBpZGZzX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9waWRmcy5jLTg5Mi1cXHRcXHRcXHQgc3RydWN0IGlhdHRyICphdHRyKVxcbi0tXFxuZnMvcGlkZnMuYy04OTYtXFxuZnMvcGlkZnMuYzo4OTc6c3RhdGljIGludCBwaWRmc19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG5mcy9waWRmcy5jLTg5OC1cXHRcXHRcXHQgc3RydWN0IGtzdGF0ICpzdGF0LCB1MzIgcmVxdWVzdF9tYXNrLFxcbi0tXFxuZnMvcGlkZnMuYy05MDMtXFxuZnMvcGlkZnMuYzo5MDQ6c3RhdGljIHNzaXplX3QgcGlkZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcXG5mcy9waWRmcy5jLTkwNS17XFxuLS1cXG5mcy9waWRmcy5jLTkxMS1cXG5mcy9waWRmcy5jOjkxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcGlkZnNfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG5mcy9waWRmcy5jOjkxMzpcXHQuZ2V0YXR0clxcdD0gcGlkZnNfZ2V0YXR0cixcXG5mcy9waWRmcy5jOjkxNDpcXHQuc2V0YXR0clxcdD0gcGlkZnNfc2V0YXR0cixcXG5mcy9waWRmcy5jOjkxNTpcXHQubGlzdHhhdHRyXFx0PSBwaWRmc19saXN0eGF0dHIsXFxuZnMvcGlkZnMuYy05MTYtfTtcXG5mcy9waWRmcy5jLTkxNy1cXG5mcy9waWRmcy5jOjkxODpzdGF0aWMgdm9pZCBwaWRmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL3BpZGZzLmMtOTE5LXtcXG4tLVxcbmZzL3BpZGZzLmMtOTI1LVxcbmZzL3BpZGZzLmM6OTI2OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaWRmc19zb3BzID0ge1xcbmZzL3BpZGZzLmMtOTI3LVxcdC5kcm9wX2lub2RlXFx0PSBpbm9kZV9qdXN0X2Ryb3AsXFxuZnMvcGlkZnMuYzo5Mjg6XFx0LmV2aWN0X2lub2RlXFx0PSBwaWRmc19ldmljdF9pbm9kZSxcXG5mcy9waWRmcy5jLTkyOS1cXHQuc3RhdGZzXFx0XFx0PSBzaW1wbGVfc3RhdGZzLFxcbi0tXFxuZnMvcGlkZnMuYy05MzMtICogJ2xzb2YnIGhhcyBrbm93bGVkZ2Ugb2Ygb3V0IGhpc3RvcmljYWwgYW5vbl9pbm9kZSB1c2UsIGFuZCBleHBlY3RzXFxuZnMvcGlkZnMuYzo5MzQ6ICogdGhlIHBpZGZzIGRlbnRyeSBuYW1lIHRvIHN0YXJ0IHdpdGggJ2Fub25faW5vZGUnLlxcbmZzL3BpZGZzLmMtOTM1LSAqL1xcbmZzL3BpZGZzLmM6OTM2OnN0YXRpYyBjaGFyICpwaWRmc19kbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbilcXG5mcy9waWRmcy5jLTkzNy17XFxuLS1cXG5mcy9waWRmcy5jLTk0MC1cXG5mcy9waWRmcy5jOjk0MTpjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7XFxuZnMvcGlkZnMuYzo5NDI6XFx0LmRfZG5hbWVcXHQ9IHBpZGZzX2RuYW1lLFxcbmZzL3BpZGZzLmMtOTQzLVxcdC5kX3BydW5lXFx0PSBzdGFzaGVkX2RlbnRyeV9wcnVuZSxcXG4tLVxcbmZzL3BpZGZzLmMtOTQ1LVxcbmZzL3BpZGZzLmM6OTQ2OnN0YXRpYyBpbnQgcGlkZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcXG5mcy9waWRmcy5jLTk0Ny1cXHRcXHRcXHQgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudClcXG4tLVxcbmZzL3BpZGZzLmMtOTYxLS8qIEZpbmQgYSBzdHJ1Y3QgcGlkIGJhc2VkIG9uIHRoZSBpbm9kZSBudW1iZXIuICovXFxuZnMvcGlkZnMuYzo5NjI6c3RhdGljIHN0cnVjdCBwaWQgKnBpZGZzX2lub19nZXRfcGlkKHU2NCBpbm8pXFxuZnMvcGlkZnMuYy05NjMte1xcbmZzL3BpZGZzLmMtOTY0LVxcdHN0cnVjdCBwaWQgKnBpZDtcXG5mcy9waWRmcy5jOjk2NTpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcXG5mcy9waWRmcy5jLTk2Ni1cXG5mcy9waWRmcy5jLTk2Ny1cXHRndWFyZChyY3UpKCk7XFxuZnMvcGlkZnMuYzo5Njg6XFx0cGlkID0gcmhhc2h0YWJsZV9sb29rdXAoXFx1MDAyNnBpZGZzX2lub19odCwgXFx1MDAyNmlubywgcGlkZnNfaW5vX2h0X3BhcmFtcyk7XFxuZnMvcGlkZnMuYy05NjktXFx0aWYgKCFwaWQpXFxuLS1cXG5mcy9waWRmcy5jLTk4MS1cXG5mcy9waWRmcy5jOjk4MjpzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuZnMvcGlkZnMuYy05ODMtXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbixcXG4tLVxcbmZzL3BpZGZzLmMtMTAwMS1cXG5mcy9waWRmcy5jOjEwMDI6XFx0cGlkID0gcGlkZnNfaW5vX2dldF9waWQocGlkX2lubyk7XFxuZnMvcGlkZnMuYy0xMDAzLVxcdGlmICghcGlkKVxcbi0tXFxuZnMvcGlkZnMuYy0xMDA1LVxcbmZzL3BpZGZzLmM6MTAwNjpcXHRyZXQgPSBwYXRoX2Zyb21fc3Rhc2hlZChcXHUwMDI2cGlkLVxcdTAwM2VzdGFzaGVkLCBwaWRmc19tbnQsIHBpZCwgXFx1MDAyNnBhdGgpO1xcbmZzL3BpZGZzLmMtMTAwNy1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG4tLVxcbmZzL3BpZGZzLmMtMTAxNS1cXG5mcy9waWRmcy5jOjEwMTY6c3RhdGljIHN0cnVjdCBmaWxlICpwaWRmc19kZW50cnlfb3Blbihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCxcXG5mcy9waWRmcy5jLTEwMTctXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxcbi0tXFxuZnMvcGlkZnMuYy0xMDM3LVxcbmZzL3BpZGZzLmM6MTAzODpzdGF0aWMgaW50IHBpZGZzX2V4cG9ydF9wZXJtaXNzaW9uKHN0cnVjdCBoYW5kbGVfdG9fcGF0aF9jdHggKmN0eCxcXG5mcy9waWRmcy5jLTEwMzktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IG9mbGFncylcXG4tLVxcbmZzL3BpZGZzLmMtMTA1MS1cXG5mcy9waWRmcy5jOjEwNTI6c3RhdGljIHN0cnVjdCBmaWxlICpwaWRmc19leHBvcnRfb3Blbihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgdW5zaWduZWQgaW50IG9mbGFncylcXG5mcy9waWRmcy5jLTEwNTMte1xcbi0tXFxuZnMvcGlkZnMuYy0xMDYwLVxcdC8qIENsZWFyIE9fTEFSR0VGSUxFIGFzIG9wZW5fYnlfaGFuZGxlX2F0KCkgZm9yY2VzIGl0LiAqL1xcbmZzL3BpZGZzLmM6MTA2MTpcXHRyZXR1cm4gcGlkZnNfZGVudHJ5X29wZW4ocGF0aCwgb2ZsYWdzIFxcdTAwMjYgfk9fTEFSR0VGSUxFLCBjdXJyZW50X2NyZWQoKSk7XFxuZnMvcGlkZnMuYy0xMDYyLX1cXG5mcy9waWRmcy5jLTEwNjMtXFxuZnMvcGlkZnMuYzoxMDY0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcGlkZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7XFxuZnMvcGlkZnMuYzoxMDY1OlxcdC5lbmNvZGVfZmhcXHQ9IHBpZGZzX2VuY29kZV9maCxcXG5mcy9waWRmcy5jOjEwNjY6XFx0LmZoX3RvX2RlbnRyeVxcdD0gcGlkZnNfZmhfdG9fZGVudHJ5LFxcbmZzL3BpZGZzLmM6MTA2NzpcXHQub3BlblxcdFxcdD0gcGlkZnNfZXhwb3J0X29wZW4sXFxuZnMvcGlkZnMuYzoxMDY4OlxcdC5wZXJtaXNzaW9uXFx0PSBwaWRmc19leHBvcnRfcGVybWlzc2lvbixcXG5mcy9waWRmcy5jLTEwNjktfTtcXG5mcy9waWRmcy5jLTEwNzAtXFxuZnMvcGlkZnMuYzoxMDcxOnN0YXRpYyBpbnQgcGlkZnNfaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbmZzL3BpZGZzLmMtMTA3Mi17XFxuLS1cXG5mcy9waWRmcy5jLTEwNzktXFx0aW5vZGUtXFx1MDAzZWlfbW9kZSB8PSBTX0lSV1hVO1xcbmZzL3BpZGZzLmM6MTA4MDpcXHRpbm9kZS1cXHUwMDNlaV9vcCA9IFxcdTAwMjZwaWRmc19pbm9kZV9vcGVyYXRpb25zO1xcbmZzL3BpZGZzLmM6MTA4MTpcXHRpbm9kZS1cXHUwMDNlaV9mb3AgPSBcXHUwMDI2cGlkZnNfZmlsZV9vcGVyYXRpb25zO1xcbmZzL3BpZGZzLmM6MTA4MjpcXHRpbm9kZS1cXHUwMDNlaV9pbm8gPSBwaWRmc19pbm8ocGlkLVxcdTAwM2Vpbm8pO1xcbmZzL3BpZGZzLmM6MTA4MzpcXHRpbm9kZS1cXHUwMDNlaV9nZW5lcmF0aW9uID0gcGlkZnNfZ2VuKHBpZC1cXHUwMDNlaW5vKTtcXG5mcy9waWRmcy5jLTEwODQtXFx0cmV0dXJuIDA7XFxuLS1cXG5mcy9waWRmcy5jLTEwODYtXFxuZnMvcGlkZnMuYzoxMDg3OnN0YXRpYyB2b2lkIHBpZGZzX3B1dF9kYXRhKHZvaWQgKmRhdGEpXFxuZnMvcGlkZnMuYy0xMDg4LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTA5My0vKipcXG5mcy9waWRmcy5jOjEwOTQ6ICogcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcCAtIHJlZ2lzdGVyIGEgc3RydWN0IHBpZCBpbiBwaWRmcyB3aXRoIGN1c3RvbSBHRlBcXG5mcy9waWRmcy5jLTEwOTUtICogZmxhZ3NcXG4tLVxcbmZzL3BpZGZzLmMtMTA5OC0gKlxcbmZzL3BpZGZzLmM6MTA5OTogKiBSZWdpc3RlciBhIHN0cnVjdCBwaWQgaW4gcGlkZnMgd2l0aCBjdXN0b20gR0ZQIGZsYWdzLlxcbmZzL3BpZGZzLmMtMTEwMC0gKlxcbi0tXFxuZnMvcGlkZnMuYy0xMTAyLSAqL1xcbmZzL3BpZGZzLmM6MTEwMzppbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcXG5mcy9waWRmcy5jLTExMDQte1xcbmZzL3BpZGZzLmM6MTEwNTpcXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqbmV3X2F0dHIgX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuZnMvcGlkZnMuYzoxMTA2OlxcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xcbmZzL3BpZGZzLmMtMTEwNy1cXG4tLVxcbmZzL3BpZGZzLmMtMTExOC1cXG5mcy9waWRmcy5jOjExMTk6XFx0bmV3X2F0dHIgPSBrbWVtX2NhY2hlX3phbGxvYyhwaWRmc19hdHRyX2NhY2hlcCwgZ2ZwKTtcXG5mcy9waWRmcy5jLTExMjAtXFx0aWYgKCFuZXdfYXR0cilcXG4tLVxcbmZzL3BpZGZzLmMtMTEyNC1cXG5mcy9waWRmcy5jOjExMjU6XFx0LyogU3luY2hyb25pemUgd2l0aCBwaWRmc19leGl0KCkuICovXFxuZnMvcGlkZnMuYy0xMTI2LVxcdGd1YXJkKHNwaW5sb2NrX2lycSkoXFx1MDAyNnBpZC1cXHUwMDNld2FpdF9waWRmZC5sb2NrKTtcXG4tLVxcbmZzL3BpZGZzLmMtMTEzNy1cXG5mcy9waWRmcy5jOjExMzg6c3RhdGljIHN0cnVjdCBkZW50cnkgKnBpZGZzX3N0YXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICoqc3Rhc2hlZCxcXG5mcy9waWRmcy5jLTExMzktXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcXG4tLVxcbmZzL3BpZGZzLmMtMTE0NS1cXG5mcy9waWRmcy5jOjExNDY6XFx0cmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XFxuZnMvcGlkZnMuYy0xMTQ3LVxcdGlmIChyZXQpXFxuLS1cXG5mcy9waWRmcy5jLTExNTItXFxuZnMvcGlkZnMuYzoxMTUzOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3Rhc2hlZF9vcGVyYXRpb25zIHBpZGZzX3N0YXNoZWRfb3BzID0ge1xcbmZzL3BpZGZzLmM6MTE1NDpcXHQuc3Rhc2hfZGVudHJ5XFx0PSBwaWRmc19zdGFzaF9kZW50cnksXFxuZnMvcGlkZnMuYzoxMTU1OlxcdC5pbml0X2lub2RlXFx0PSBwaWRmc19pbml0X2lub2RlLFxcbmZzL3BpZGZzLmM6MTE1NjpcXHQucHV0X2RhdGFcXHQ9IHBpZGZzX3B1dF9kYXRhLFxcbmZzL3BpZGZzLmMtMTE1Ny19O1xcbmZzL3BpZGZzLmMtMTE1OC1cXG5mcy9waWRmcy5jOjExNTk6c3RhdGljIGludCBwaWRmc194YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvcGlkZnMuYy0xMTYwLVxcdFxcdFxcdCAgIHN0cnVjdCBkZW50cnkgKnVudXNlZCwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL3BpZGZzLmMtMTE2NS1cXG5mcy9waWRmcy5jOjExNjY6XFx0cmV0dXJuIHNpbXBsZV94YXR0cl9nZXQoXFx1MDAyNnBpZGZzX3hhX2NhY2hlLCBcXHUwMDI2cGlkLVxcdTAwM2VhdHRyLVxcdTAwM2V4YXR0cnMsIG5hbWUsIHZhbHVlLCBzaXplKTtcXG5mcy9waWRmcy5jLTExNjctfVxcbmZzL3BpZGZzLmMtMTE2OC1cXG5mcy9waWRmcy5jOjExNjk6c3RhdGljIGludCBwaWRmc194YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvcGlkZnMuYy0xMTcwLVxcdFxcdFxcdCAgIHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsXFxuLS1cXG5mcy9waWRmcy5jLTExODAtXFxuZnMvcGlkZnMuYzoxMTgxOlxcdG9sZF94YXR0ciA9IHNpbXBsZV94YXR0cl9zZXQoXFx1MDAyNnBpZGZzX3hhX2NhY2hlLCBcXHUwMDI2cGlkLVxcdTAwM2VhdHRyLVxcdTAwM2V4YXR0cnMsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7XFxuZnMvcGlkZnMuYy0xMTgyLVxcdGlmIChJU19FUlIob2xkX3hhdHRyKSlcXG4tLVxcbmZzL3BpZGZzLmMtMTE4OC1cXG5mcy9waWRmcy5jOjExODk6c3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIHBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlciA9IHtcXG5mcy9waWRmcy5jLTExOTAtXFx0LnByZWZpeCA9IFhBVFRSX1RSVVNURURfUFJFRklYLFxcbmZzL3BpZGZzLmM6MTE5MTpcXHQuZ2V0XFx0PSBwaWRmc194YXR0cl9nZXQsXFxuZnMvcGlkZnMuYzoxMTkyOlxcdC5zZXRcXHQ9IHBpZGZzX3hhdHRyX3NldCxcXG5mcy9waWRmcy5jLTExOTMtfTtcXG5mcy9waWRmcy5jLTExOTQtXFxuZnMvcGlkZnMuYzoxMTk1OnN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqY29uc3QgcGlkZnNfeGF0dHJfaGFuZGxlcnNbXSA9IHtcXG5mcy9waWRmcy5jOjExOTY6XFx0XFx1MDAyNnBpZGZzX3RydXN0ZWRfeGF0dHJfaGFuZGxlcixcXG5mcy9waWRmcy5jLTExOTctXFx0TlVMTFxcbi0tXFxuZnMvcGlkZnMuYy0xMTk5LVxcbmZzL3BpZGZzLmM6MTIwMDpzdGF0aWMgaW50IHBpZGZzX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuZnMvcGlkZnMuYy0xMjAxLXtcXG4tLVxcbmZzL3BpZGZzLmMtMTIwOC1cXHRjdHgtXFx1MDAzZXNfZF9mbGFncyB8PSBEQ0FDSEVfRE9OVENBQ0hFO1xcbmZzL3BpZGZzLmM6MTIwOTpcXHRjdHgtXFx1MDAzZW9wcyA9IFxcdTAwMjZwaWRmc19zb3BzO1xcbmZzL3BpZGZzLmM6MTIxMDpcXHRjdHgtXFx1MDAzZWVvcHMgPSBcXHUwMDI2cGlkZnNfZXhwb3J0X29wZXJhdGlvbnM7XFxuZnMvcGlkZnMuYzoxMjExOlxcdGN0eC1cXHUwMDNlZG9wcyA9IFxcdTAwMjZwaWRmc19kZW50cnlfb3BlcmF0aW9ucztcXG5mcy9waWRmcy5jOjEyMTI6XFx0Y3R4LVxcdTAwM2V4YXR0ciA9IHBpZGZzX3hhdHRyX2hhbmRsZXJzO1xcbmZzL3BpZGZzLmM6MTIxMzpcXHRmYy1cXHUwMDNlc19mc19pbmZvID0gKHZvaWQgKilcXHUwMDI2cGlkZnNfc3Rhc2hlZF9vcHM7XFxuZnMvcGlkZnMuYy0xMjE0LVxcdHJldHVybiAwO1xcbi0tXFxuZnMvcGlkZnMuYy0xMjE2LVxcbmZzL3BpZGZzLmM6MTIxNzpzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcGlkZnNfdHlwZSA9IHtcXG5mcy9waWRmcy5jOjEyMTg6XFx0Lm5hbWVcXHRcXHRcXHQ9IFxcXCJwaWRmc1xcXCIsXFxuZnMvcGlkZnMuYzoxMjE5OlxcdC5pbml0X2ZzX2NvbnRleHRcXHQ9IHBpZGZzX2luaXRfZnNfY29udGV4dCxcXG5mcy9waWRmcy5jLTEyMjAtXFx0LmtpbGxfc2JcXHRcXHQ9IGtpbGxfYW5vbl9zdXBlcixcXG4tLVxcbmZzL3BpZGZzLmMtMTIyMi1cXG5mcy9waWRmcy5jOjEyMjM6c3RydWN0IGZpbGUgKnBpZGZzX2FsbG9jX2ZpbGUoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuZnMvcGlkZnMuYy0xMjI0LXtcXG4tLVxcbmZzL3BpZGZzLmMtMTIzNC1cXG5mcy9waWRmcy5jOjEyMzU6XFx0cmV0ID0gcGF0aF9mcm9tX3N0YXNoZWQoXFx1MDAyNnBpZC1cXHUwMDNlc3Rhc2hlZCwgcGlkZnNfbW50LCBnZXRfcGlkKHBpZCksIFxcdTAwMjZwYXRoKTtcXG5mcy9waWRmcy5jLTEyMzYtXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLS1cXG5mcy9waWRmcy5jLTEyNDEtXFx0ZmxhZ3MgXFx1MDAyNj0gflBJREZEX1NUQUxFO1xcbmZzL3BpZGZzLmM6MTI0MjpcXHRyZXR1cm4gcGlkZnNfZGVudHJ5X29wZW4oXFx1MDAyNnBhdGgsIGZsYWdzLCBjdXJyZW50X2NyZWQoKSk7XFxuZnMvcGlkZnMuYy0xMjQzLX1cXG5mcy9waWRmcy5jLTEyNDQtXFxuZnMvcGlkZnMuYzoxMjQ1OnZvaWQgX19pbml0IHBpZGZzX2luaXQodm9pZClcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6MjY6NTkuMjQwODc4NjNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjIwOTYxMDQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIEZpbGVzeXN0ZW0gTW9kdWxlIEJ1aWxkIFByb2Nlc3MqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYHBpZGZzLm9gIGlzIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBrZXJuZWwgYnVpbGQuIFRoZSBmaXJzdCBsb2dpY2FsIHN0ZXAgaXMgdG8gY2hlY2sgYGZzL01ha2VmaWxlYC4gU3BlY2lmaWNhbGx5LCBJJ20gemVyb2luZyBpbiBvbiBsaW5lIDE4LiBBaCwgdGhlcmUgaXQgaXM6IGBvYmoteSA6PSBvcGVuLm8gcmVhZF93cml0ZS5vIC4uLiBwaWRmcy5vIC4uLmAuICBTbyBgcGlkZnMub2AgaXMgYnVpbHQgdW5jb25kaXRpb25hbGx5IGFzIHBhcnQgb2YgdGhlIGNvcmUgYGZzL2AgZGlyZWN0b3J5LCBpbmRpY2F0ZWQgYnkgYG9iai15YC4gVGhhdCBjb25maXJtcyBpdCdzIGEgY3JpdGljYWwgY29tcG9uZW50LlxuXG5Ob3csIEknbSB0aGlua2luZywgSSB3YW50IHRvIHRyYWNlIHRoZSBkZXBlbmRlbmNpZXMgZnVydGhlciwgYW5kIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhhdCBgZnNfc3RydWN0LmNgIGlzIGJlaW5nIGluY2x1ZGVkIHByb3Blcmx5LiBJIHNob3VsZCBjaGVjayB0aGUgYGZzL01ha2VmaWxlYCBhZ2FpbiwgdGhpcyB0aW1lIGxvb2tpbmcgZm9yIGBmc19zdHJ1Y3Qub2Agb3IgYSBzaW1pbGFyIG9iamVjdCBmaWxlLiAgTGV0J3Mgc2NhbiB0aHJvdWdoIGxpbmVzIDEwIHRocm91Z2ggMjUgdG8gc2VlIGhvdyBpdCdzIGJlaW5nIGhhbmRsZWQuIFRoaXMgc2hvdWxkIGhlbHAgbWUgY29uZmlybSBpdHMgcmVsYXRpb25zaGlwIHRvIHRoZSBidWlsZCBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjk2NSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowMS44NjE4NDIyMjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NDQzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9NYWtlZmlsZVwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBmaWxlc3lzdGVtcy5cXG4gICA0OlxcdCNcXG4gICA1OlxcdCMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIFxcdTAwM2NoY2hAaW5mcmFkZWFkLm9yZ1xcdTAwM2VcXG4gICA2OlxcdCMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuXFxuICAgNzpcXHQjIFxcbiAgIDg6XFx0XFxuICAgOTpcXHRcXG4gIDEwOlxcdG9iai15IDo9XFx0b3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcXFxcXFxuICAxMTpcXHRcXHRcXHRjaGFyX2Rldi5vIHN0YXQubyBleGVjLm8gcGlwZS5vIG5hbWVpLm8gZmNudGwubyBcXFxcXFxuICAxMjpcXHRcXHRcXHRpb2N0bC5vIHJlYWRkaXIubyBzZWxlY3QubyBkY2FjaGUubyBpbm9kZS5vIFxcXFxcXG4gIDEzOlxcdFxcdFxcdGF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBcXFxcXFxuICAxNDpcXHRcXHRcXHRzZXFfZmlsZS5vIHhhdHRyLm8gbGliZnMubyBmcy13cml0ZWJhY2subyBcXFxcXFxuICAxNTpcXHRcXHRcXHRwbm9kZS5vIHNwbGljZS5vIHN5bmMubyB1dGltZXMubyBkX3BhdGgubyBcXFxcXFxuICAxNjpcXHRcXHRcXHRzdGFjay5vIGZzX3N0cnVjdC5vIHN0YXRmcy5vIGZzX3Bpbi5vIG5zZnMubyBcXFxcXFxuICAxNzpcXHRcXHRcXHRmc19kaXJlbnQubyBmc19jb250ZXh0Lm8gZnNfcGFyc2VyLm8gZnNvcGVuLm8gaW5pdC5vIFxcXFxcXG4gIDE4OlxcdFxcdFxcdGtlcm5lbF9yZWFkX2ZpbGUubyBtbnRfaWRtYXBwaW5nLm8gcmVtYXBfcmFuZ2UubyBwaWRmcy5vIFxcXFxcXG4gIDE5OlxcdFxcdFxcdGZpbGVfYXR0ci5vIGZzZXJyb3IubyBudWxsZnMubyBmYWlsZnMub1xcbiAgMjA6XFx0XFxuICAyMTpcXHRvYmotJChDT05GSUdfQlVGRkVSX0hFQUQpXFx0Kz0gYnVmZmVyLm8gbXBhZ2Uub1xcbiAgMjI6XFx0b2JqLSQoQ09ORklHX1BST0NfRlMpXFx0XFx0Kz0gcHJvY19uYW1lc3BhY2Uub1xcbiAgMjM6XFx0b2JqLSQoQ09ORklHX0xFR0FDWV9ESVJFQ1RfSU8pXFx0Kz0gZGlyZWN0LWlvLm9cXG4gIDI0OlxcdG9iai15XFx0XFx0XFx0XFx0Kz0gbm90aWZ5L1xcbiAgMjU6XFx0b2JqLSQoQ09ORklHX0VQT0xMKVxcdFxcdCs9IGV2ZW50cG9sbC5vXFxuICAyNjpcXHRvYmoteVxcdFxcdFxcdFxcdCs9IGFub25faW5vZGVzLm9cXG4gIDI3OlxcdG9iai0kKENPTkZJR19TSUdOQUxGRClcXHRcXHQrPSBzaWduYWxmZC5vXFxuICAyODpcXHRvYmotJChDT05GSUdfVElNRVJGRClcXHRcXHQrPSB0aW1lcmZkLm9cXG4gIDI5OlxcdG9iai0kKENPTkZJR19FVkVOVEZEKVxcdFxcdCs9IGV2ZW50ZmQub1xcbiAgMzA6XFx0b2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICArPSBhaW8ub1xcbiAgMzE6XFx0b2JqLSQoQ09ORklHX0ZTX0RBWClcXHRcXHQrPSBkYXgub1xcbiAgMzI6XFx0b2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFx0Kz0gY3J5cHRvL1xcbiAgMzM6XFx0b2JqLSQoQ09ORklHX0ZTX1ZFUklUWSlcXHRcXHQrPSB2ZXJpdHkvXFxuICAzNDpcXHRvYmotJChDT05GSUdfRklMRV9MT0NLSU5HKSAgICAgICs9IGxvY2tzLm9cXG4gIDM1OlxcdG9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcXHQrPSBiaW5mbXRfbWlzYy5vXFxuICAzNjpcXHRvYmotJChDT05GSUdfQklORk1UX01JU0NfQlBGKVxcdCs9IGJpbmZtdF9taXNjX2JwZi5vXFxuICAzNzpcXHRvYmotJChDT05GSUdfQklORk1UX1NDUklQVClcXHQrPSBiaW5mbXRfc2NyaXB0Lm9cXG4gIDM4OlxcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGKVxcdCs9IGJpbmZtdF9lbGYub1xcbiAgMzk6XFx0b2JqLSQoQ09ORklHX0NPTVBBVF9CSU5GTVRfRUxGKVxcdCs9IGNvbXBhdF9iaW5mbXRfZWxmLm9cXG4gIDQwOlxcdG9iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKVxcdCs9IGJpbmZtdF9lbGZfZmRwaWMub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowMS44NjE5MDg3NDlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTAxMTI2MTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgQ29yZSBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIHR3byBvYmplY3QgZmlsZXMsIGBmc19zdHJ1Y3Qub2AgYW5kIGBwaWRmcy5vYCwgYW5kIHRoZXkncmUgYm90aCBkZWNsYXJlZCBpbiBgb2JqLXlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhleSByZWxhdGUgdG8gdGhlIGJyb2FkZXIgYnVpbGQgcHJvY2VzcywgcGFydGljdWxhcmx5IGlmIHRoZXJlIGFyZSBhbnkgQ09ORklHIG9wdGlvbnMgYXQgcGxheS4gUmlnaHQsIGFuZCBJIGtub3cgYGtlcm5lbC9mb3JrLmNgIGlzIGFsc28gYSBjcml0aWNhbCBvYmplY3QuIFNvLCBJIHNlZSB0aGF0IGBrZXJuZWwvZm9yay5jYCBpcyBhIGNvcmUga2VybmVsIG9iamVjdCBpbiB0aGUga2VybmVsIE1ha2VmaWxlLCBqdXN0IGFzIGFyZSB0aGUgb3RoZXIgdHdvLlxuXG5UaGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgdGhlc2UgYXJlIGJ1aWx0IHVuY29uZGl0aW9uYWxseSBpbnRvIGB2bWxpbnV4YCBvciBpZiB0aGVyZSBhcmUgc3BlY2lmaWMgQ09ORklHIG9wdGlvbnMgdGhhdCBtaWdodCBjb250cm9sIHRoZWlyIGluY2x1c2lvbi4gTGV0J3Mgc2VlLi4uIEFoLCBnb29kLCBpdCBsb29rcyBsaWtlIGBwaWRmcy5vYCwgYGZzX3N0cnVjdC5vYCBhbmQgYGZvcmsub2AgKmFyZSogdW5jb25kaXRpb25hbGx5IGJ1aWx0IGludG8gdGhlIGZpbmFsIGB2bWxpbnV4YCBpbWFnZS4gVGhhdCBzaW1wbGlmaWVzIHRoaW5ncyBhIGJpdC5cblxuQnV0IHdhaXQsIGhvbGQgb24uIEV2ZW4gdGhvdWdoIHRoZXkncmUgYWx3YXlzIGJ1aWx0LCBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIHNvdXJjZSBjb2RlIG9mIGVhY2ggZmlsZSwgc3BlY2lmaWNhbGx5IGluc2lkZSBgZnMvcGlkZnMuY2AgYW5kIGBmcy9mc19zdHJ1Y3QuY2AgYW5kIGBrZXJuZWwvZm9yay5jYCB0aGVtc2VsdmVzLCB0byBzZWUgaWYgdGhlcmUgYXJlICp3aXRoaW4qIHRob3NlIGZpbGVzLCBzcGVjaWZpYyBDT05GSUcgb3B0aW9ucyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIEknbSBpbnRlcmVzdGVkIGluLiBJIHNob3VsZCB6ZXJvIGluIG9uIHRoZSBhcmVhcyBhcm91bmQgcmVsYXRlZCBmdW5jdGlvbnMuIExldCdzIHN0YXJ0IHdpdGggYGZzL3BpZGZzLmNgIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9ucyBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYHBpZGZkX2lvY3RsYCwgYHBpZGZkX2dldF90YXNrX3BhdGhgLCBgcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkYC4uLiBhbmQgc2VlIGlmIHRob3NlIGFyZSBwcm90ZWN0ZWQgYnkgYW55IENPTkZJRyBvcHRpb25zLiBUaGF0J3MgdGhlIHBydWRlbnQgYXBwcm9hY2ggaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgxNzgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowNS4zNjMwMzgwNDFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDA3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvcGlkZnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MjAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MjA6XFx0XFx0LyogRXh0ZW5zaWJsZSBpb2N0bHMgcmVxdWlyZSBzb21lIG1vcmUgY2FyZWZ1bCBjaGVja3MuICovXFxuIDUyMTpcXHRcXHRzd2l0Y2ggKF9JT0NfTlIoY21kKSkge1xcbiA1MjI6XFx0XFx0Y2FzZSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKTpcXG4gNTIzOlxcdFxcdFxcdC8qXFxuIDUyNDpcXHRcXHRcXHQgKiBUcnkgdG8gcHJldmVudCBwZXJmb3JtaW5nIGEgcGlkZmQgaW9jdGwgd2hlbiBzb21lb25lXFxuIDUyNTpcXHRcXHRcXHQgKiBlcnJvbm91c2x5IG1pc3Rvb2sgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaWRmZC5cXG4gNTI2OlxcdFxcdFxcdCAqIFRoaXMgaXMgbm90IHBlcmZlY3QgYnV0IHdpbGwgY2F0Y2ggbW9zdCBjYXNlcy5cXG4gNTI3OlxcdFxcdFxcdCAqL1xcbiA1Mjg6XFx0XFx0XFx0cmV0dXJuIGV4dGVuc2libGVfaW9jdGxfdmFsaWQoY21kLCBQSURGRF9HRVRfSU5GTywgUElERkRfSU5GT19TSVpFX1ZFUjApO1xcbiA1Mjk6XFx0XFx0fVxcbiA1MzA6XFx0XFxuIDUzMTpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDUzMjpcXHR9XFxuIDUzMzpcXHRcXG4gNTM0OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFJU19FUlJfT1JfTlVMTCh0YXNrKSkge1xcbiA1Mzc6XFx0XFx0XFx0dXBfcmVhZChcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4gNTM4OlxcdFxcdFxcdHB1dF90YXNrX3N0cnVjdCh0YXNrKTtcXG4gNTM5OlxcdFxcdH1cXG4gNTQwOlxcdH1cXG4gNTQxOlxcdFxcbiA1NDI6XFx0LypcXG4gNTQzOlxcdCAqIFJldHVybiBAcGlkJ3MgdGFzayB3aXRoIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBoZWxkLiBUaGUgcHRyYWNlIGNoZWNrXFxuIDU0NDpcXHQgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcXG4gNTQ1OlxcdCAqIHNvIHRoYXQgdGhleSBjYW5ub3QgcmFjZSB3aXRoIGEgY29uY3VycmVudCBleGVjdmUoKS5cXG4gNTQ2OlxcdCAqL1xcbiA1NDc6XFx0c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcXG4gNTQ4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGFyZylcXG4gNTQ5OlxcdHtcXG4gNTUwOlxcdFxcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID1cXG4gNTUxOlxcdFxcdFxcdGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTtcXG4gNTUyOlxcdFxcdGludCBlcnJvcjtcXG4gNTUzOlxcdFxcbiA1NTQ6XFx0XFx0aWYgKCF0YXNrKVxcbiA1NTU6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTtcXG4gNTU2OlxcdFxcbiA1NTc6XFx0XFx0aWYgKGFyZylcXG4gNTU4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiA1NTk6XFx0XFxuIDU2MDpcXHRcXHRlcnJvciA9IGRvd25fcmVhZF9raWxsYWJsZShcXHUwMDI2dGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcXG4gNTYxOlxcdFxcdGlmIChlcnJvcilcXG4gNTYyOlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcXG4gNTYzOlxcdFxcbiA1NjQ6XFx0XFx0aWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEX0ZTQ1JFRFMpKSB7XFxuIDU2NTpcXHRcXHRcXHR1cF9yZWFkKFxcdTAwMjZ0YXNrLVxcdTAwM2VzaWduYWwtXFx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xcbiA1NjY6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XFxuIDU2NzpcXHRcXHR9XFxuIDU2ODpcXHRcXG4gNTY5OlxcdFxcdHJldHVybl9wdHIodGFzayk7XFxuIDU3MDpcXHR9XFxuIDU3MTpcXHRcXG4gNTcyOlxcdERFRklORV9DTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgc3RydWN0IHRhc2tfc3RydWN0ICosXFxuIDU3MzpcXHRcXHQgICAgIHBpZGZkX3B1dF90YXNrX2xvY2tlZChfVCksXFxuIDU3NDpcXHRcXHQgICAgIHBpZGZkX2dldF90YXNrX2xvY2tlZChwaWQsIGFyZyksXFxuIDU3NTpcXHRcXHQgICAgIHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDU3NjpcXHRcXG4gNTc3OlxcdHN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcXG4gNTc4OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IGNtZCxcXG4gNTc5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDU4MDpcXHR7XFxuIDU4MTpcXHRcXHRzdHJ1Y3QgbnNwcm94eSAqbnNwIF9fZnJlZShwdXRfbnNwcm94eSkgPSBOVUxMO1xcbiA1ODI6XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcXG4gNTgzOlxcdFxcbiA1ODQ6XFx0XFx0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcXG4gNTg1OlxcdFxcdGlmIChJU19FUlIodGFzaykpXFxuIDU4NjpcXHRcXHRcXHRyZXR1cm4gRVJSX0NBU1QodGFzayk7XFxuIDU4NzpcXHRcXG4gNTg4OlxcdFxcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcXG4gNTg5OlxcdFxcdFxcdG5zcCA9IHRhc2stXFx1MDAzZW5zcHJveHk7XFxuIDU5MDpcXHRcXHRcXHRpZiAobnNwKVxcbiA1OTE6XFx0XFx0XFx0XFx0Z2V0X25zcHJveHkobnNwKTtcXG4gNTkyOlxcdFxcdH1cXG4gNTkzOlxcdFxcdGlmICghbnNwKVxcbiA1OTQ6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xcbiA1OTU6XFx0XFxuIDU5NjpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiA1OTc6XFx0XFx0LyogTmFtZXNwYWNlcyB0aGF0IGhhbmcgb2YgbnNwcm94eS4gKi9cXG4gNTk4OlxcdFxcdGNhc2UgUElERkRfR0VUX0NHUk9VUF9OQU1FU1BBQ0U6XFxuIDU5OTpcXHQjaWZkZWYgQ09ORklHX0NHUk9VUFNcXG4gNjAwOlxcdFxcdFxcdGlmICghbnNfcmVmX2dldChuc3AtXFx1MDAzZWNncm91cF9ucykpXFxuIDYwMTpcXHRcXHRcXHRcXHRicmVhaztcXG4gNjAyOlxcdFxcdFxcdG5zX2NvbW1vbiA9IHRvX25zX2NvbW1vbihuc3AtXFx1MDAzZWNncm91cF9ucyk7XFxuIDYwMzpcXHQjZW5kaWZcXG4gNjA0OlxcdFxcdFxcdGJyZWFrO1xcbiA2MDU6XFx0XFx0Y2FzZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRTpcXG4gNjA2OlxcdCNpZmRlZiBDT05GSUdfSVBDX05TXFxuIDYwNzpcXHRcXHRcXHRpZiAoIW5zX3JlZl9nZXQobnNwLVxcdTAwM2VpcGNfbnMpKVxcbiA2MDg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDYwOTpcXHRcXHRcXHRuc19jb21tb24gPSB0b19uc19jb21tb24obnNwLVxcdTAwM2VpcGNfbnMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzowNS4zNjMxNDE2ODFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzgxMjgxNjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gYGZzL3BpZGZzLmNgIC0gTGluZXMgNjYwLTc0NSoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBUaGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBzdWdnZXN0cyB0aGVyZSdzIHNvbWV0aGluZyBzcGVjaWZpYyBnb2luZyBvbiBpbiB0aGUgUElEIG5hbWVzcGFjZSBmaWxlc3lzdGVtLCBhbmQgbXkgZ3V0IGZlZWxpbmcgdGVsbHMgbWUgdGhlIGNvcmUgaXNzdWUgbGllcyB3aXRoaW4gdGhpcyByYW5nZTogbGluZXMgNjYwIHRvIDc0NSBvZiBgZnMvcGlkZnMuY2AuIEknbSBnb2luZyB0byBmb2N1cyBpbiBhbmQgbWV0aWN1bG91c2x5IHBhcnNlIHRoaXMgc2VjdGlvbi4gSSBrbm93IHRoaXMgYXJlYSBkZWFscyB3aXRoIFBJRCBoYW5kbGluZywgcHJvYmFibHkgd2l0aCBkaXJlY3RvcnkgYW5kIGZpbGUgY3JlYXRpb24sIGRlbGV0aW9uIG9yIHBvc3NpYmx5IGF0dHJpYnV0ZSBvcGVyYXRpb25zIGFuZCBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc3RydWN0dXJlcyBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgb3IgYWNjZXNzIGNvbnRyb2wgdnVsbmVyYWJpbGl0aWVzLCBpZiBhbnkuIEknbGwgbmVlZCB0byBwYXJzZSB0aGUgaW50ZXJhY3Rpb25zIHdpdGggUElEIG51bWJlcnMsIGFuZCBmaWd1cmUgb3V0IGhvdyBwcm9jZXNzIElEcyBhcmUgbWFwcGVkLCB0cmFja2VkLCBhbmQgZXhwb3NlZCBpbiB0aGlzIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0uIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIGFueSBzcG90cyB3aGVyZSB0aGUgUElEIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyBub3QgYmVpbmcgY29ycmVjdGx5IHZhbGlkYXRlZCBvciBzeW5jaHJvbml6ZWQuIEFueSB1bmNoZWNrZWQgcGF0aHMgb3IgaW5jb3JyZWN0IGxvZ2ljIGNvdWxkIGxlYWQgdG8gdGhlIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiB0aGUgaXNzdWUsIGV2ZW4gaWYgaXQgc2VlbXMgdW5saWtlbHkgYXQgZmlyc3QgZ2xhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDEwNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MDcuNzQ0NDI1MjExWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNTcxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9waWRmcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDY2MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDY2MDpcXHRcXHRcXHRcXHRcXHRuc19jb21tb24gPSB0b19uc19jb21tb24odXNlcl9ucyk7XFxuIDY2MTpcXHRcXHRcXHR9XFxuIDY2MjpcXHQjZW5kaWZcXG4gNjYzOlxcdFxcdFxcdGJyZWFrO1xcbiA2NjQ6XFx0XFx0Y2FzZSBQSURGRF9HRVRfUElEX05BTUVTUEFDRTpcXG4gNjY1OlxcdCNpZmRlZiBDT05GSUdfUElEX05TXFxuIDY2NjpcXHRcXHRcXHRzY29wZWRfZ3VhcmQocmN1KSB7XFxuIDY2NzpcXHRcXHRcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zO1xcbiA2Njg6XFx0XFxuIDY2OTpcXHRcXHRcXHRcXHRwaWRfbnMgPSB0YXNrX2FjdGl2ZV9waWRfbnModGFzayk7XFxuIDY3MDpcXHRcXHRcXHRcXHRpZiAobnNfcmVmX2dldChwaWRfbnMpKVxcbiA2NzE6XFx0XFx0XFx0XFx0XFx0bnNfY29tbW9uID0gdG9fbnNfY29tbW9uKHBpZF9ucyk7XFxuIDY3MjpcXHRcXHRcXHR9XFxuIDY3MzpcXHQjZW5kaWZcXG4gNjc0OlxcdFxcdFxcdGJyZWFrO1xcbiA2NzU6XFx0XFx0ZGVmYXVsdDpcXG4gNjc2OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9JT0NUTENNRCk7XFxuIDY3NzpcXHRcXHR9XFxuIDY3ODpcXHRcXG4gNjc5OlxcdFxcdGlmICghbnNfY29tbW9uKVxcbiA2ODA6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApO1xcbiA2ODE6XFx0XFxuIDY4MjpcXHRcXHRyZXR1cm4gbnNfY29tbW9uO1xcbiA2ODM6XFx0fVxcbiA2ODQ6XFx0XFxuIDY4NTpcXHRzdGF0aWMgaW50IHBpZGZkX2dldF90YXNrX3BhdGgoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgY21kLFxcbiA2ODY6XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgcGF0aCAqcGF0aClcXG4gNjg3OlxcdHtcXG4gNjg4OlxcdFxcdENMQVNTKHBpZGZkX3Rhc2tfbG9ja2VkLCB0YXNrKShwaWQsIGFyZyk7XFxuIDY4OTpcXHRcXG4gNjkwOlxcdFxcdGlmIChJU19FUlIodGFzaykpXFxuIDY5MTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih0YXNrKTtcXG4gNjkyOlxcdFxcbiA2OTM6XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gNjk0OlxcdFxcdGNhc2UgUElERkRfR0VUX0VYRTpcXG4gNjk1OlxcdFxcdFxcdHJldHVybiBnZXRfdGFza19leGVfcGF0aCh0YXNrLCBwYXRoKTtcXG4gNjk2OlxcdFxcdGNhc2UgUElERkRfR0VUX0NXRDpcXG4gNjk3OlxcdFxcdFxcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XFxuIDY5ODpcXHRcXHRjYXNlIFBJREZEX0dFVF9ST09UOlxcbiA2OTk6XFx0XFx0XFx0cmV0dXJuIGdldF90YXNrX3Jvb3QodGFzaywgcGF0aCk7XFxuIDcwMDpcXHRcXHR9XFxuIDcwMTpcXHRcXG4gNzAyOlxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA3MDM6XFx0fVxcbiA3MDQ6XFx0XFxuIDcwNTpcXHRzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDcwNjpcXHR7XFxuIDcwNzpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xcbiA3MDg6XFx0XFx0c3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge307XFxuIDcwOTpcXHRcXHRpbnQgZXJyb3I7XFxuIDcxMDpcXHRcXG4gNzExOlxcdFxcdGlmICghcGlkZnNfaW9jdGxfdmFsaWQoY21kKSlcXG4gNzEyOlxcdFxcdFxcdHJldHVybiAtRU5PSU9DVExDTUQ7XFxuIDcxMzpcXHRcXG4gNzE0OlxcdFxcdGlmIChjbWQgPT0gRlNfSU9DX0dFVFZFUlNJT04pIHtcXG4gNzE1OlxcdFxcdFxcdGlmICghYXJnKVxcbiA3MTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDcxNzpcXHRcXG4gNzE4OlxcdFxcdFxcdF9fdTMyIF9fdXNlciAqYXJncCA9IChfX3UzMiBfX3VzZXIgKilhcmc7XFxuIDcxOTpcXHRcXG4gNzIwOlxcdFxcdFxcdHJldHVybiBwdXRfdXNlcihmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX2dlbmVyYXRpb24sIGFyZ3ApO1xcbiA3MjE6XFx0XFx0fVxcbiA3MjI6XFx0XFxuIDcyMzpcXHRcXHQvKiBFeHRlbnNpYmxlIElPQ1RMIHRoYXQgZG9lcyBub3Qgb3BlbiBuYW1lc3BhY2UgRkRzLCB0YWtlIGEgc2hvcnRjdXQgKi9cXG4gNzI0OlxcdFxcdGlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihQSURGRF9HRVRfSU5GTykpXFxuIDcyNTpcXHRcXHRcXHRyZXR1cm4gcGlkZmRfaW5mbyhmaWxlLCBjbWQsIGFyZyk7XFxuIDcyNjpcXHRcXG4gNzI3OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDcyODpcXHRcXHRjYXNlIFBJREZEX0dFVF9FWEU6XFxuIDcyOTpcXHRcXHRjYXNlIFBJREZEX0dFVF9DV0Q6XFxuIDczMDpcXHRcXHRjYXNlIFBJREZEX0dFVF9ST09UOlxcbiA3MzE6XFx0XFx0XFx0ZXJyb3IgPSBwaWRmZF9nZXRfdGFza19wYXRoKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcsIFxcdTAwMjZwYXRoKTtcXG4gNzMyOlxcdFxcdFxcdGlmIChlcnJvcilcXG4gNzMzOlxcdFxcdFxcdFxcdHJldHVybiBlcnJvcjtcXG4gNzM0OlxcdFxcbiA3MzU6XFx0XFx0XFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXFxuIDczNjpcXHRcXHRcXHRcXHQgICAgICBkZW50cnlfb3BlbihcXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xcbiA3Mzc6XFx0XFx0fVxcbiA3Mzg6XFx0XFxuIDczOTpcXHRcXHRuc19jb21tb24gPSBwaWRmZF9nZXRfbmFtZXNwYWNlKHBpZGZkX3BpZChmaWxlKSwgY21kLCBhcmcpO1xcbiA3NDA6XFx0XFx0aWYgKElTX0VSUihuc19jb21tb24pKVxcbiA3NDE6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcXG4gNzQyOlxcdFxcbiA3NDM6XFx0XFx0Lyogb3Blbl9uYW1lc3BhY2UoKSB1bmNvbmRpdGlvbmFsbHkgY29uc3VtZXMgdGhlIHJlZmVyZW5jZSAqL1xcbiA3NDQ6XFx0XFx0cmV0dXJuIG9wZW5fbmFtZXNwYWNlKG5zX2NvbW1vbik7XFxuIDc0NTpcXHR9XFxuIDc0NjpcXHRcXG4gNzQ3OlxcdCNpZmRlZiBDT05GSUdfQ09NUEFUXFxuIDc0ODpcXHRzdGF0aWMgbG9uZyBwaWRmZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXFxuIDc0OTpcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI3OjA3Ljc0NDYzNDE0MVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDE0MDY0NDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgU3ltYm9sIEV4cG9zdXJlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdmVyaWZ5IHdoaWNoIHN5bWJvbHMgYXJlICpub3QqIHN0YXRpYywgYXMgdGhvc2UgYXJlIHRoZSBvbmVzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwb3NlZC4gSSdsbCBzdGFydCBieSBjaGVja2luZyB0aGUgaW5pdGlhbCBsaXN0OiBgZ2V0X3Rhc2tfcm9vdGAgaW4gYGZzL2ZzX3N0cnVjdC5jYCwgYGdldF90YXNrX3B3ZGAgaW4gYGZzL2ZzX3N0cnVjdC5jYCwgYGdldF90YXNrX2V4ZV9wYXRoYCBpbiBga2VybmVsL2ZvcmsuY2AsIGFuZCB0aGVuIHRoZXJlJ3MgYHBpZGZkX2lvY3RsYCBpbiBgZnMvcGlkZnMuY2Agd2hpY2gsIGV2ZW4gdGhvdWdoIGl0J3MgdGVjaG5pY2FsbHkgc3RhdGljLCBpcyBwYXJ0IG9mIGBmaWxlX29wZXJhdGlvbnMudW5sb2NrZWRfaW9jdGxgIC0gYSBwb3RlbnRpYWwgbG9vcGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgb3RoZXIgbm9uLXN0YXRpYyBzeW1ib2xzLlxuXG5JJ2xsIGNvbmZpcm0gdGhlIGxpc3QgYnkgZG91YmxlLWNoZWNraW5nIHRoZSBkZWZpbml0aW9uIG9mIGFsbCB0aGUgc3ltYm9scy4gSXQgbG9va3MgbGlrZSBpdCBjb25maXJtcyB0aGF0IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgIGFyZSBpbmRlZWQgbm9uLXN0YXRpYy4gR29vZC4gQXJlIHRoZXJlIGFueSBvdGhlciByZWxldmFudCBzeW1ib2xzIGx1cmtpbmcgaW4gdGhlIHNoYWRvd3M/XG5cbk5vdywgbGV0J3MgdGFrZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSBsb29rIGF0IGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgY2hhbmdlZCBpbiB0aGUgZGlmZi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV0YWlscyBhcmUuIEknbGwgbWFrZSBhIGxpc3QgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UgcG9wcyBvdXQ6XG5cbjEuICBgZ2V0X3Rhc2tfcm9vdGAgKGZzL2ZzX3N0cnVjdC5jKVxuMi4gIGBnZXRfdGFza19wd2RgIChmcy9mc19zdHJ1Y3QuYylcbjMuICBgZ2V0X3Rhc2tfZXhlX3BhdGhgIChrZXJuZWwvZm9yay5jKVxuNC4gIGBwaWRmcy5jYDogQWxsIHRoZSBzdGF0aWMgZnVuY3Rpb25zIHRoYXQgd2VyZSBsaXN0ZWQuXG41LiAgYGZzL3Byb2MvYmFzZS5jYDogYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AuXG42LiAgYHNlY3VyaXR5L2FwcGFybW9yL3Rhc2suY2A6IGBnZXRfY3VycmVudF9leGVfcGF0aGAuXG5cbkkgc2VlIHRoYXQgYHByb2NfY3dkX2xpbmtgLCBgcHJvY19leGVfbGlua2AsIGFuZCBgZ2V0X2N1cnJlbnRfZXhlX3BhdGhgIG1pZ2h0IHdhcnJhbnQgYSBzZWNvbmQgbG9vay5cblxuRmluYWxseSwgYSBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBrZXJuZWwgY29uZmlnIGRlcGVuZGVuY2llcyB0aGF0IHJlbGF0ZSB0byBgUElERkRgLCBgUElERlNgLCBvciBgQVBQQVJNT1JgLiBJJ2xsIHNlYXJjaCB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGNvbnRleHQgYW5kIHBvdGVudGlhbCBleHBvc3VyZSBwb2ludHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjY0LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDM3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTEuNzU4NzAyNTExWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MzI3NzUxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJQSURGU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmhhbmRsZS5jPTE3MD1zdGF0aWMgaW50IGdldF9wYXRoX2FuY2hvcihpbnQgZmQsIHN0cnVjdCBwYXRoICpyb290KVxcbi0tXFxuZnMvZmhhbmRsZS5jLTE4NS1cXG5mcy9maGFuZGxlLmM6MTg2OlxcdGlmIChmZCA9PSBGRF9QSURGU19ST09UKSB7XFxuZnMvZmhhbmRsZS5jLTE4Ny1cXHRcXHRwaWRmc19nZXRfcm9vdChyb290KTtcXG4tLVxcbmZzL3BpZGZzLmMtMzUtXFxuZnMvcGlkZnMuYzozNjojZGVmaW5lIFBJREZTX1BJRF9ERUFEIEVSUl9QVFIoLUVTUkNIKVxcbmZzL3BpZGZzLmMtMzctXFxuLS1cXG5mcy9waWRmcy5jPTUwPWVudW0gcGlkZnNfYXR0cl9tYXNrX2JpdHMge1xcbmZzL3BpZGZzLmM6NTE6XFx0UElERlNfQVRUUl9CSVRfRVhJVFxcdD0gMCxcXG5mcy9waWRmcy5jOjUyOlxcdFBJREZTX0FUVFJfQklUX0NPUkVEVU1QXFx0PSAxLFxcbmZzL3BpZGZzLmMtNTMtfTtcXG4tLVxcbmZzL3BpZGZzLmM9MzY2PXN0YXRpYyBsb25nIHBpZGZkX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZnMvcGlkZnMuYy0zOTYtXFx0aWYgKG1hc2sgXFx1MDAyNiBQSURGRF9JTkZPX0VYSVQpIHtcXG5mcy9waWRmcy5jOjM5NzpcXHRcXHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXFx1MDAyNmF0dHItXFx1MDAzZWF0dHJfbWFzaykpIHtcXG5mcy9waWRmcy5jLTM5OC1cXHRcXHRcXHRzbXBfcm1iKCk7XFxuLS1cXG5mcy9waWRmcy5jLTQwOC1cXHRpZiAobWFzayBcXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIHtcXG5mcy9waWRmcy5jOjQwOTpcXHRcXHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spKSB7XFxuZnMvcGlkZnMuYy00MTAtXFx0XFx0XFx0c21wX3JtYigpO1xcbi0tXFxuZnMvcGlkZnMuYz04MTQ9dm9pZCBwaWRmc19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxuZnMvcGlkZnMuYy04MzMtXFx0XFx0XFx0ICovXFxuZnMvcGlkZnMuYzo4MzQ6XFx0XFx0XFx0cGlkLVxcdTAwM2VhdHRyID0gUElERlNfUElEX0RFQUQ7XFxuZnMvcGlkZnMuYy04MzUtXFx0XFx0XFx0cmV0dXJuO1xcbi0tXFxuZnMvcGlkZnMuYy04NTYtXFx0c21wX3dtYigpO1xcbmZzL3BpZGZzLmM6ODU3OlxcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXFx1MDAyNmF0dHItXFx1MDAzZWF0dHJfbWFzayk7XFxuZnMvcGlkZnMuYy04NTgtfVxcbi0tXFxuZnMvcGlkZnMuYz04NjE9dm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbi0tXFxuZnMvcGlkZnMuYy04NjgtXFx0VkZTX1dBUk5fT05fT05DRSghYXR0cik7XFxuZnMvcGlkZnMuYzo4Njk6XFx0VkZTX1dBUk5fT05fT05DRShhdHRyID09IFBJREZTX1BJRF9ERUFEKTtcXG5mcy9waWRmcy5jLTg3MC1cXG4tLVxcbmZzL3BpZGZzLmMtODc5LVxcdHNtcF93bWIoKTtcXG5mcy9waWRmcy5jOjg4MDpcXHRzZXRfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKTtcXG5mcy9waWRmcy5jLTg4MS19XFxuLS1cXG5mcy9waWRmcy5jPTk2Mj1zdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcXG4tLVxcbmZzL3BpZGZzLmMtOTczLVxcdFxcdHJldHVybiBOVUxMO1xcbmZzL3BpZGZzLmM6OTc0OlxcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKSlcXG5mcy9waWRmcy5jLTk3NS1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tLVxcbmZzL3BpZGZzLmM9MTEwMz1pbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcXG4tLVxcbmZzL3BpZGZzLmMtMTExMy1cXHRhdHRyID0gUkVBRF9PTkNFKHBpZC1cXHUwMDNlYXR0cik7XFxuZnMvcGlkZnMuYzoxMTE0OlxcdGlmICh1bmxpa2VseShhdHRyID09IFBJREZTX1BJRF9ERUFEKSlcXG5mcy9waWRmcy5jOjExMTU6XFx0XFx0cmV0dXJuIFBUUl9FUlIoUElERlNfUElEX0RFQUQpO1xcbmZzL3BpZGZzLmMtMTExNi1cXHRpZiAoYXR0cilcXG4tLVxcbmZzL3BpZGZzLmMtMTEyOC1cXHRhdHRyID0gcGlkLVxcdTAwM2VhdHRyO1xcbmZzL3BpZGZzLmM6MTEyOTpcXHRpZiAodW5saWtlbHkoYXR0ciA9PSBQSURGU19QSURfREVBRCkpXFxuZnMvcGlkZnMuYzoxMTMwOlxcdFxcdHJldHVybiBQVFJfRVJSKFBJREZTX1BJRF9ERUFEKTtcXG5mcy9waWRmcy5jLTExMzEtXFx0aWYgKHVubGlrZWx5KGF0dHIpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzoxMS44MzE5ODU2MThaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzMyNDMwNTM3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQaWRmZCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIGBwaWRmc2AgaXMgYnVpbHQtaW4sIG5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkLCB3aGljaCBpcyBnb29kLiBUaGUgYWJzZW5jZSBvZiBjb25maWcgb3B0aW9ucywgc3BlY2lmaWNhbGx5IHdoZW4gYEVuYWJsZUNvbmZpZ3NgIGlzIGFuIGVtcHR5IGxpc3Qgb3IgbnVsbCwgc2ltcGxpZmllcyB0aGluZ3MuIExldCdzIG1vdmUgb250byB0aGUgc3BlY2lmaWNzLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IHRoZSBwYXRjaCBpbXBhY3RzIHRoZXNlIFwiRm9jdXNTeW1ib2xzXCI6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGFuZCBgZ2V0X3Rhc2tfZXhlX3BhdGhgLlxuXG5JJ3ZlIGNhcmVmdWxseSBkb3VibGUtY2hlY2tlZCB0aGUgcGF0Y2ggZm9yIGFueSBvdGhlciBleHBvcnRlZCBvciBjaGFuZ2VkIG5vbi1zdGF0aWMgZnVuY3Rpb25zLiBTcGVjaWZpY2FsbHksIGluIGBmcy9mc19zdHJ1Y3QuY2AsIEkgc2VlIGBnZXRfdGFza19yb290YCBhbmQgYGdldF90YXNrX3B3ZGAuIEluIGBrZXJuZWwvZm9yay5jYCwgdGhlcmUncyBgZ2V0X3Rhc2tfZXhlX3BhdGhgLiBJbnNpZGUgYGZzL3BpZGZzLmNgLCBhbGwgdGhlIG5ldyBhZGRpdGlvbnMgYXJlIHN0YXRpYyDigJMgbm8gaXNzdWVzIHRoZXJlLiBBbHNvIGluIGBmcy9wcm9jL2Jhc2UuY2AsIGBwcm9jX2N3ZF9saW5rYCwgYHByb2NfZXhlX2xpbmtgIGFyZSBzdGF0aWMgYW5kIHRoZSBzYW1lIGdvZXMgZm9yIGBzZWN1cml0eS9hcHBhcm1vci90YXNrLmNgIHdpdGggdGhlIGBnZXRfY3VycmVudF9leGVfcGF0aGAgZnVuY3Rpb24uXG5cblRoZXJlZm9yZSwgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSBwcmVjaXNlbHk6XG4tIGBnZXRfdGFza19yb290YFxuLSBgZ2V0X3Rhc2tfcHdkYFxuLSBgZ2V0X3Rhc2tfZXhlX3BhdGhgXG5cblRvIGNsYXJpZnksIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0aGUgbmV3IGBwaWRmZGAgaW9jdGxzOiBgUElERkRfR0VUX0VYRWAsIGBQSURGRF9HRVRfQ1dEYCwgYW5kIGBQSURGRF9HRVRfUk9PVGAuIFRoZXNlIGFsbG93IHVzZXJzcGFjZSB0byBnZXQgYE9fUEFUSGAgZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSB0YXJnZXQgdGFzaydzIGV4ZWN1dGFibGUsIHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnksIGFsb25nIHdpdGggdGhvc2UgaGVscGVyIGZ1bmN0aW9ucyBJIGxpc3RlZC4gVGhlcmUgaXMgYWxzbyBhIHJlZmFjdG9yaW5nIG9mIGxvY2tlZCBwaWRmZCBvcGVyYXRpb25zIHdpdGggYGV4ZWNfdXBkYXRlX2xvY2tgLiBUaGlzICpkb2VzKiBpbXBhY3QgY29yZSBWRlMvcGlkZmQgZnVuY3Rpb25hbGl0eSwgcGFydGljdWxhcmx5IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIHNldHVwcyDigJMgdGhhdCBpcyBhbHNvIHdoYXQgSSBleHBlY3RlZC5cblxuTXkgcmVhc29uaW5nIGhvbGRzLiBFdmVyeXRoaW5nIHNlZW1zIGNsZWFuLCB0aG9yb3VnaGx5IGNoZWNrZWQuIEknbSBzYXRpc2ZpZWQgYW5kIHJlYWR5IHRvIHByb2NlZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNzE1LCJPdXRwdXRUb2tlbnMiOjE2OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQwMzoyNzoxOS4xNTYyOTM2NTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjA1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImdldF90YXNrX3Jvb3RcIixcbiAgICBcImdldF90YXNrX3B3ZFwiLFxuICAgIFwiZ2V0X3Rhc2tfZXhlX3BhdGhcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBwaWRmZCBpb2N0bHMgKFBJREZEX0dFVF9FWEUsIFBJREZEX0dFVF9DV0QsIGFuZCBQSURGRF9HRVRfUk9PVCkgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIHJldHJpZXZlIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzIGZvciBhIHByb2Nlc3MncyBleGVjdXRhYmxlLCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcm9vdCBkaXJlY3RvcnkuIEl0IGFsc28gcmVmYWN0b3JzIHBpZGZkIHRhc2sgbG9ja2luZyBhbmQgYWRkcyBoZWxwZXJzIChnZXRfdGFza19yb290LCBnZXRfdGFza19wd2QsIGdldF90YXNrX2V4ZV9wYXRoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBrZXJuZWwgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWxpemVkIGhhcmR3YXJlIGNvbmZpZ3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZ2V0X3Rhc2tfcm9vdFwiLFxuICAgIFwiZ2V0X3Rhc2tfcHdkXCIsXG4gICAgXCJnZXRfdGFza19leGVfcGF0aFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IHBpZGZkIGlvY3RscyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgYW5kIFBJREZEX0dFVF9ST09UKSBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gcmV0cmlldmUgT19QQVRIIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGEgcHJvY2VzcydzIGV4ZWN1dGFibGUsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByb290IGRpcmVjdG9yeS4gSXQgYWxzbyByZWZhY3RvcnMgcGlkZmQgdGFzayBsb2NraW5nIGFuZCBhZGRzIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIGtlcm5lbCBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFyZHdhcmUgY29uZmlncy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTkuMTU2MzIyODM5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTMxNzkwNzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MTkuMTU2Nzg5Njc5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6ODUzMTMxOTg2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cXG5cXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcXG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxcbiAgIC0gQWxsIHN0YWNrIHZhcmlhYmxlcyAoZS5nLiwgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9YCkgYXJlIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZC5cXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXFxuXFxuMi4gS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eTpcXG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxcbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGM4ZTI1MmE5NzJmYzAwMzhlNzgwNTYxNGE3ZjFiNDcyYjMxNThjNjdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAzMSAwMzoyNjo1MiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2ZzX3N0cnVjdC5jIGIvZnMvZnNfc3RydWN0LmNcbmluZGV4IDM0Njk5ZjNiNmY4ODEuLjVjNzcyODk2MjYwYTQgMTAwNjQ0XG4tLS0gYS9mcy9mc19zdHJ1Y3QuY1xuKysrIGIvZnMvZnNfc3RydWN0LmNcbkBAIC0xMCw2ICsxMCw1MCBAQFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJtb3VudC5oXCJcbiBcbisvKipcbisgKiBnZXRfdGFza19yb290IC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIHJvb3QgcGF0aFxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAcm9vdDogVGhlIHRhc2sncyByb290IHBhdGguXG4rICpcbisgKiBSZXR1cm5zIDAgaWYgdGhlIHRhc2sgaGFzIGEgcm9vdCBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LiBUaGVcbisgKiBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4re1xuK1x0aW50IHJldCA9IC1FTk9FTlQ7XG4rXG4rXHR0YXNrX2xvY2sodGFzayk7XG4rXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4rXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4rXHRcdHJldCA9IDA7XG4rXHR9XG4rXHR0YXNrX3VubG9jayh0YXNrKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIGdldF90YXNrX3B3ZCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyB3b3JraW5nIGRpcmVjdG9yeVxuKyAqIEB0YXNrOiBUaGUgdGFzay5cbisgKiBAcHdkOiBUaGUgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LlxuKyAqXG4rICogUmV0dXJucyAwIGlmIHRoZSB0YXNrIGhhcyBhIHdvcmtpbmcgZGlyZWN0b3J5LCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19wd2Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcHdkKVxuK3tcbitcdGludCByZXQgPSAtRU5PRU5UO1xuK1xuK1x0dGFza19sb2NrKHRhc2spO1xuK1x0aWYgKHRhc2stXHUwMDNlcmVhbF9mcykge1xuK1x0XHRnZXRfZnNfcHdkKHRhc2stXHUwMDNlcmVhbF9mcywgcHdkKTtcbitcdFx0cmV0ID0gMDtcbitcdH1cbitcdHRhc2tfdW5sb2NrKHRhc2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4gLypcbiAgKiBSZXBsYWNlIHRoZSBmcy1cdTAwM2V7cm9vdG1udCxyb290fSB3aXRoIHttbnQsZGVudHJ5fS4gUHV0IHRoZSBvbGQgdmFsdWVzLlxuICAqIEl0IGNhbiBibG9jay5cbmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuY1xuaW5kZXggYTZhNjQzZjE1ZDA4YS4uYjIxMzc0ZjAwMDAyZSAxMDA2NDRcbi0tLSBhL2ZzL3BpZGZzLmNcbisrKyBiL2ZzL3BpZGZzLmNcbkBAIC00LDYgKzQsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2V4cG9ydGZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZnNfc3RydWN0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb3VudC5oXHUwMDNlXG5AQCAtNTEwLDYgKzUxMSw5IEBAIHN0YXRpYyBib29sIHBpZGZzX2lvY3RsX3ZhbGlkKHVuc2lnbmVkIGludCBjbWQpXG4gXHRjYXNlIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFOlxuIFx0Y2FzZSBQSURGRF9HRVRfVVNFUl9OQU1FU1BBQ0U6XG4gXHRjYXNlIFBJREZEX0dFVF9QSURfTkFNRVNQQUNFOlxuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0Y2FzZSBQSURGRF9HRVRfQ1dEOlxuK1x0Y2FzZSBQSURGRF9HRVRfUk9PVDpcbiBcdFx0cmV0dXJuIHRydWU7XG4gXHR9XG4gXG5AQCAtNTI3LDYyICs1MzEsNjcgQEAgc3RhdGljIGJvb2wgcGlkZnNfaW9jdGxfdmFsaWQodW5zaWduZWQgaW50IGNtZClcbiBcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4tc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBwaWRmZF9wdXRfdGFza19sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbi1cdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayBfX2ZyZWUocHV0X3Rhc2spID0gTlVMTDtcbi1cdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuLVx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuLVxuLVx0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuLVx0XHRpZiAoIWFyZylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbi1cdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbitcdGlmICghSVNfRVJSX09SX05VTEwodGFzaykpIHtcbitcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbitcdFx0cHV0X3Rhc2tfc3RydWN0KHRhc2spO1xuIFx0fVxuK31cbiBcbi1cdC8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqL1xuLVx0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbi1cdFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xuKy8qXG4rICogUmV0dXJuIEBwaWQncyB0YXNrIHdpdGggQHRhc2sncyBleGVjX3VwZGF0ZV9sb2NrIGhlbGQuIFRoZSBwdHJhY2UgY2hlY2tcbisgKiBhbmQgdGhlIGNhbGxlcnMnIHRhc2sgc3RhdGUgbG9va3VwIG11c3QgYmUgcGVyZm9ybWVkIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGRcbisgKiBzbyB0aGF0IHRoZXkgY2Fubm90IHJhY2Ugd2l0aCBhIGNvbmN1cnJlbnQgZXhlY3ZlKCkuXG4rICovXG4rc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2tfbG9ja2VkKHN0cnVjdCBwaWQgKnBpZCxcbitcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrIF9fZnJlZShwdXRfdGFzaykgPVxuK1x0XHRnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7XG4rXHRpbnQgZXJyb3I7XG4gXG4tXHR0YXNrID0gZ2V0X3BpZF90YXNrKHBpZGZkX3BpZChmaWxlKSwgUElEVFlQRV9QSUQpO1xuIFx0aWYgKCF0YXNrKVxuLVx0XHRyZXR1cm4gLUVTUkNIO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRVNSQ0gpO1xuIFxuIFx0aWYgKGFyZylcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0Lypcbi1cdCAqIFdlJ3JlIHRyeWluZyB0byBvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBuYW1lc3BhY2Ugc28gcGVyZm9ybSBhXG4tXHQgKiBmaWxlc3lzdGVtIGNyZWQgcHRyYWNlIGNoZWNrLiBIb2xkIEB0YXNrJ3MgZXhlY191cGRhdGVfbG9jayBmb3IgdGhlXG4tXHQgKiBkdXJhdGlvbiBvZiB0aGUgcHRyYWNlIGNoZWNrIGFuZCB0aGUgbmFtZXNwYWNlIGxvb2t1cCBzbyB0aGF0IHRoZVxuLVx0ICogY3JlZGVudGlhbHMgdXNlZCBmb3IgdGhlIGFjY2VzcyBkZWNpc2lvbiBtYXRjaCB0aG9zZSBvZiBAdGFzayBhdCB0aGVcbi1cdCAqIHRpbWUgaXRzIG5hbWVzcGFjZSBpcyByZWFkLCBwcmV2ZW50aW5nIGEgY29uY3VycmVudCBleGVjdmUoKSBmcm9tXG4tXHQgKiBzd2FwcGluZyB0aGUgdGFzaydzIGNyZWRlbnRpYWxzIGluIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgdXNlLiBXZVxuLVx0ICogbWlycm9yIG5zZnMgYmVoYXZpb3IuXG4tXHQgKi9cbiBcdGVycm9yID0gZG93bl9yZWFkX2tpbGxhYmxlKFx1MDAyNnRhc2stXHUwMDNlc2lnbmFsLVx1MDAzZWV4ZWNfdXBkYXRlX2xvY2spO1xuIFx0aWYgKGVycm9yKVxuLVx0XHRyZXR1cm4gZXJyb3I7XG4rXHRcdHJldHVybiBFUlJfUFRSKGVycm9yKTtcbiBcbiBcdGlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRF9GU0NSRURTKSkge1xuLVx0XHRlcnJvciA9IC1FQUNDRVM7XG4tXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdFx0dXBfcmVhZChcdTAwMjZ0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VleGVjX3VwZGF0ZV9sb2NrKTtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XG4gXHR9XG4gXG4rXHRyZXR1cm5fcHRyKHRhc2spO1xuK31cbitcbitERUZJTkVfQ0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLFxuK1x0ICAgICBwaWRmZF9wdXRfdGFza19sb2NrZWQoX1QpLFxuK1x0ICAgICBwaWRmZF9nZXRfdGFza19sb2NrZWQocGlkLCBhcmcpLFxuK1x0ICAgICBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRmZF9nZXRfbmFtZXNwYWNlKHN0cnVjdCBwaWQgKnBpZCxcbitcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgY21kLFxuK1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3tcbitcdHN0cnVjdCBuc3Byb3h5ICpuc3AgX19mcmVlKHB1dF9uc3Byb3h5KSA9IE5VTEw7XG4rXHRzdHJ1Y3QgbnNfY29tbW9uICpuc19jb21tb24gPSBOVUxMO1xuK1xuK1x0Q0xBU1MocGlkZmRfdGFza19sb2NrZWQsIHRhc2spKHBpZCwgYXJnKTtcbitcdGlmIChJU19FUlIodGFzaykpXG4rXHRcdHJldHVybiBFUlJfQ0FTVCh0YXNrKTtcbitcbiBcdHNjb3BlZF9ndWFyZCh0YXNrX2xvY2ssIHRhc2spIHtcbiBcdFx0bnNwID0gdGFzay1cdTAwM2Vuc3Byb3h5O1xuIFx0XHRpZiAobnNwKVxuIFx0XHRcdGdldF9uc3Byb3h5KG5zcCk7XG4gXHR9XG4tXHRpZiAoIW5zcCkge1xuLVx0XHRlcnJvciA9IC1FU1JDSDsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4rXHRpZiAoIW5zcClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsgLyoganVzdCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdCAqL1xuIFxuIFx0c3dpdGNoIChjbWQpIHtcbiBcdC8qIE5hbWVzcGFjZXMgdGhhdCBoYW5nIG9mIG5zcHJveHkuICovXG5AQCAtNjY0LDE2ICs2NzMsNzIgQEAgc3RhdGljIGxvbmcgcGlkZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuICNlbmRpZlxuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4tXHRcdGVycm9yID0gLUVOT0lPQ1RMQ01EO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PSU9DVExDTUQpO1xuIFx0fVxuIFxuLVx0aWYgKCFlcnJvciBcdTAwMjZcdTAwMjYgIW5zX2NvbW1vbilcbi1cdFx0ZXJyb3IgPSAtRU9QTk9UU1VQUDtcbitcdGlmICghbnNfY29tbW9uKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4gXG4tb3V0X3VubG9jazpcbi1cdHVwX3JlYWQoXHUwMDI2dGFzay1cdTAwM2VzaWduYWwtXHUwMDNlZXhlY191cGRhdGVfbG9jayk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdHJldHVybiBlcnJvcjtcbitcdHJldHVybiBuc19jb21tb247XG4rfVxuK1xuK3N0YXRpYyBpbnQgcGlkZmRfZ2V0X3Rhc2tfcGF0aChzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgcGF0aCAqcGF0aClcbit7XG4rXHRDTEFTUyhwaWRmZF90YXNrX2xvY2tlZCwgdGFzaykocGlkLCBhcmcpO1xuK1xuK1x0aWYgKElTX0VSUih0YXNrKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIodGFzayk7XG4rXG4rXHRzd2l0Y2ggKGNtZCkge1xuK1x0Y2FzZSBQSURGRF9HRVRfRVhFOlxuK1x0XHRyZXR1cm4gZ2V0X3Rhc2tfZXhlX3BhdGgodGFzaywgcGF0aCk7XG4rXHRjYXNlIFBJREZEX0dFVF9DV0Q6XG4rXHRcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4rXHRjYXNlIFBJREZEX0dFVF9ST09UOlxuK1x0XHRyZXR1cm4gZ2V0X3Rhc2tfcm9vdCh0YXNrLCBwYXRoKTtcbitcdH1cbitcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbitcbitzdGF0aWMgbG9uZyBwaWRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4re1xuK1x0c3RydWN0IG5zX2NvbW1vbiAqbnNfY29tbW9uID0gTlVMTDtcbitcdHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9O1xuK1x0aW50IGVycm9yO1xuK1xuK1x0aWYgKCFwaWRmc19pb2N0bF92YWxpZChjbWQpKVxuK1x0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuK1xuK1x0aWYgKGNtZCA9PSBGU19JT0NfR0VUVkVSU0lPTikge1xuK1x0XHRpZiAoIWFyZylcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdFx0X191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZztcbitcbitcdFx0cmV0dXJuIHB1dF91c2VyKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9nZW5lcmF0aW9uLCBhcmdwKTtcbitcdH1cbitcbitcdC8qIEV4dGVuc2libGUgSU9DVEwgdGhhdCBkb2VzIG5vdCBvcGVuIG5hbWVzcGFjZSBGRHMsIHRha2UgYSBzaG9ydGN1dCAqL1xuK1x0aWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKFBJREZEX0dFVF9JTkZPKSlcbitcdFx0cmV0dXJuIHBpZGZkX2luZm8oZmlsZSwgY21kLCBhcmcpO1xuK1xuK1x0c3dpdGNoIChjbWQpIHtcbitcdGNhc2UgUElERkRfR0VUX0VYRTpcbitcdGNhc2UgUElERkRfR0VUX0NXRDpcbitcdGNhc2UgUElERkRfR0VUX1JPT1Q6XG4rXHRcdGVycm9yID0gcGlkZmRfZ2V0X3Rhc2tfcGF0aChwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnLCBcdTAwMjZwYXRoKTtcbitcdFx0aWYgKGVycm9yKVxuK1x0XHRcdHJldHVybiBlcnJvcjtcbitcbitcdFx0cmV0dXJuIEZEX0FERChPX0NMT0VYRUMsXG4rXHRcdFx0ICAgICAgZGVudHJ5X29wZW4oXHUwMDI2cGF0aCwgT19QQVRILCBjdXJyZW50X2NyZWQoKSkpO1xuK1x0fVxuK1xuK1x0bnNfY29tbW9uID0gcGlkZmRfZ2V0X25hbWVzcGFjZShwaWRmZF9waWQoZmlsZSksIGNtZCwgYXJnKTtcbitcdGlmIChJU19FUlIobnNfY29tbW9uKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIobnNfY29tbW9uKTtcbiBcbiBcdC8qIG9wZW5fbmFtZXNwYWNlKCkgdW5jb25kaXRpb25hbGx5IGNvbnN1bWVzIHRoZSByZWZlcmVuY2UgKi9cbiBcdHJldHVybiBvcGVuX25hbWVzcGFjZShuc19jb21tb24pO1xuZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmNcbmluZGV4IDZhMzlkZTQyNGY2MmEuLjdlMmMwNTM4MzIzY2MgMTAwNjQ0XG4tLS0gYS9mcy9wcm9jL2Jhc2UuY1xuKysrIGIvZnMvcHJvYy9iYXNlLmNcbkBAIC0yMDYsMzEgKzIwNiwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwaWRfZW50cnlfbmxpbmsoY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqZW50cmllcyxcbiBcdHJldHVybiBjb3VudDtcbiB9XG4gXG4tc3RhdGljIGludCBnZXRfdGFza19yb290KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHBhdGggKnJvb3QpXG4te1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19yb290KHRhc2stXHUwMDNlcmVhbF9mcywgcm9vdCk7XG4tXHRcdHJlc3VsdCA9IDA7XG4tXHR9XG4tXHR0YXNrX3VubG9jayh0YXNrKTtcbi1cdHJldHVybiByZXN1bHQ7XG4tfVxuLVxuIHN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYXRoICpwYXRoLFxuIFx0XHRcdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4ge1xuLVx0aW50IHJlc3VsdCA9IC1FTk9FTlQ7XG4tXG4tXHR0YXNrX2xvY2sodGFzayk7XG4tXHRpZiAodGFzay1cdTAwM2VyZWFsX2ZzKSB7XG4tXHRcdGdldF9mc19wd2QodGFzay1cdTAwM2VyZWFsX2ZzLCBwYXRoKTtcbi1cdFx0cmVzdWx0ID0gMDtcbi1cdH1cbi1cdHRhc2tfdW5sb2NrKHRhc2spO1xuLVx0cmV0dXJuIHJlc3VsdDtcbitcdHJldHVybiBnZXRfdGFza19wd2QodGFzaywgcGF0aCk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgcHJvY19yb290X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqcGF0aCxcbkBAIC0xNzYxLDE2ICsxNzQwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfc2V0X2NvbW1fb3BlcmF0aW9ucyA9IHtcbiBzdGF0aWMgaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgsXG4gXHRcdFx0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4tXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7XG4tXG4tXHRleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spO1xuLVx0aWYgKGV4ZV9maWxlKSB7XG4tXHRcdCpleGVfcGF0aCA9IGV4ZV9maWxlLVx1MDAzZWZfcGF0aDtcbi1cdFx0cGF0aF9nZXQoXHUwMDI2ZXhlX2ZpbGUtXHUwMDNlZl9wYXRoKTtcbi1cdFx0ZnB1dChleGVfZmlsZSk7XG4tXHRcdHJldHVybiAwO1xuLVx0fSBlbHNlXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0cmV0dXJuIGdldF90YXNrX2V4ZV9wYXRoKHRhc2ssIGV4ZV9wYXRoKTtcbiB9XG4gXG4gc3RhdGljIGludCBjYWxsX3Byb2NfZ2V0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aF9vdXQpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmhcbmluZGV4IDk3ZWVmOGQzODYzZGQuLmZiNzI1NzA3NzU0ZDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oXG5AQCAtNDIsNiArNDIsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2ZzX3B3ZChzdHJ1Y3QgZnNfc3RydWN0ICpmcywgc3RydWN0IHBhdGggKnB3ZClcbiBcdHJlYWRfc2VxdW5sb2NrX2V4Y2woXHUwMDI2ZnMtXHUwMDNlc2VxKTtcbiB9XG4gXG4raW50IGdldF90YXNrX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqcm9vdCk7XG4raW50IGdldF90YXNrX3B3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpwd2QpO1xuK1xuIHN0cnVjdCBmc19zdHJ1Y3QgKnN3aXRjaF9mc19zdHJ1Y3Qoc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKTtcbiBcbiBleHRlcm4gYm9vbCBjdXJyZW50X2Nocm9vdGVkKHZvaWQpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaFxuaW5kZXggZGQwOWM0MzhmYTIzZS4uYTY1ZjI0YjJlNjViZiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbW0uaFxuKysrIGIvaW5jbHVkZS9saW51eC9tbS5oXG5AQCAtNDIzOSw2ICs0MjM5LDcgQEAgZXh0ZXJuIGludCBzZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpO1xuIGV4dGVybiBpbnQgcmVwbGFjZV9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTtcbitpbnQgZ2V0X3Rhc2tfZXhlX3BhdGgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgpO1xuIFxuIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5pbmRleCAwOTE5MjQ2YTE2MTFjLi45NWNlMTgxOWY0MjNmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oXG5AQCAtMTIxLDQgKzEyMSwxMSBAQCBzdHJ1Y3QgcGlkZmRfaW5mbyB7XG4gI2RlZmluZSBQSURGRF9HRVRfVVRTX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTApXG4gI2RlZmluZSBQSURGRF9HRVRfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgIF9JT1dSKFBJREZTX0lPQ1RMX01BR0lDLCAxMSwgc3RydWN0IHBpZGZkX2luZm8pXG4gXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIGV4ZWN1dGFibGUuICovXG4rI2RlZmluZSBQSURGRF9HRVRfRVhFICAgICAgICAgICAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMTIpXG4rLyogUmV0dXJuIGFuIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgdGFzaydzIHdvcmtpbmcgZGlyZWN0b3J5LiAqL1xuKyNkZWZpbmUgUElERkRfR0VUX0NXRCAgICAgICAgICAgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEzKVxuKy8qIFJldHVybiBhbiBPX1BBVEggZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IHRhc2sncyByb290IGRpcmVjdG9yeS4gKi9cbisjZGVmaW5lIFBJREZEX0dFVF9ST09UICAgICAgICAgICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxNClcbitcbiAjZW5kaWYgLyogX1VBUElfTElOVVhfUElERkRfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXG5pbmRleCA0MTY3NThjOGEzZDQzLi5hNDkzZGUzYWU1YzIwIDEwMDY0NFxuLS0tIGEva2VybmVsL2ZvcmsuY1xuKysrIGIva2VybmVsL2ZvcmsuY1xuQEAgLTEzNzEsNiArMTM3MSwyNyBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIFx0cmV0dXJuIGV4ZV9maWxlO1xuIH1cbiBcbisvKipcbisgKiBnZXRfdGFza19leGVfcGF0aCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBleGVjdXRhYmxlIHBhdGhcbisgKiBAdGFzazogVGhlIHRhc2suXG4rICogQGV4ZV9wYXRoOiBUaGUgdGFzaydzIGV4ZWN1dGFibGUgcGF0aC5cbisgKlxuKyAqIFJldHVybnMgMCBpZiB0aGUgdGFzayBoYXMgYW4gZXhlY3V0YWJsZSBwYXRoLCBvciAtRU5PRU5UIGlmIGl0IGRvZXMgbm90LlxuKyAqIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSBwYXRoIHRocm91Z2ggcGF0aF9wdXQoKSBvbiBzdWNjZXNzLlxuKyAqL1xuK2ludCBnZXRfdGFza19leGVfcGF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwYXRoICpleGVfcGF0aClcbit7XG4rXHRzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZSh0YXNrKTtcbitcbitcdGlmICghZXhlX2ZpbGUpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0KmV4ZV9wYXRoID0gZXhlX2ZpbGUtXHUwMDNlZl9wYXRoO1xuK1x0cGF0aF9nZXQoZXhlX3BhdGgpO1xuK1x0ZnB1dChleGVfZmlsZSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gLyoqXG4gICogZ2V0X3Rhc2tfbW0gLSBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrJ3MgbW1cbiAgKiBAdGFzazogVGhlIHRhc2suXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG5pbmRleCBlMTZmZjQxMzBiYzJmLi4wNWNiYTI2MWRkMzQ5IDEwMDY0NFxuLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvdGFzay5jXG4rKysgYi9zZWN1cml0eS9hcHBhcm1vci90YXNrLmNcbkBAIC0xMyw2ICsxMyw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZ2ZwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHRyYWNlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90YXNrX3dvcmsuaFx1MDAzZVxuIFxuQEAgLTMzMCwyMiArMzMxLDE1IEBAIGludCBhYV9tYXlfcHRyYWNlKGNvbnN0IHN0cnVjdCBjcmVkICp0cmFjZXJfY3JlZCwgc3RydWN0IGFhX2xhYmVsICp0cmFjZXIsXG4gXG4gc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jdXJyZW50X2V4ZV9wYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKVxuIHtcbi1cdHN0cnVjdCBmaWxlICpleGVfZmlsZTtcbi1cdHN0cnVjdCBwYXRoIHA7XG4rXHRzdHJ1Y3QgcGF0aCBwIF9fZnJlZShwYXRoX3B1dCkgPSB7fTtcbiBcdGNvbnN0IGNoYXIgKnBhdGhfc3RyO1xuIFxuLVx0ZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZShjdXJyZW50KTtcbi1cdGlmICghZXhlX2ZpbGUpXG4rXHRpZiAoZ2V0X3Rhc2tfZXhlX3BhdGgoY3VycmVudCwgXHUwMDI2cCkpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuLVx0cCA9IGV4ZV9maWxlLVx1MDAzZWZfcGF0aDtcbi1cdHBhdGhfZ2V0KFx1MDAyNnApO1xuIFxuIFx0aWYgKGFhX3BhdGhfbmFtZShcdTAwMjZwLCBGTEFHX1ZJRVdfU1VCTlMsIGJ1ZmZlciwgXHUwMDI2cGF0aF9zdHIsIE5VTEwsIE5VTEwpKVxuIFx0XHRwYXRoX3N0ciA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRmcHV0KGV4ZV9maWxlKTtcbi1cdHBhdGhfcHV0KFx1MDAyNnApO1xuLVxuIFx0cmV0dXJuIHBhdGhfc3RyO1xuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDAzOjI3OjE5LjE1Njc5MTIyOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4NTMxMjk1ODQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEV2YWx1YXRpb246IFBhdGNoIFNlcmllcyBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHF1ZXN0aW9uIGF0IGhhbmQgaXMgd2hldGhlciB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGV4cGVydCBhc3Nlc3NtZW50IGlzLCBhbmQgdGhlIHJlYXNvbmluZyBpcywgKm5vKi4gTGV0J3MgZ2V0IGludG8gd2h5LlxuXG5GaXJzdGx5LCB0aGUgcGF0Y2gncyBjb3JlIGZ1bmN0aW9uIGlzIHRvIGFkZCBhIHNldCBvZiBoZWxwZXJzIGFuZCBwaWRmZCBpb2N0bHM6IGBnZXRfdGFza19yb290YCwgYGdldF90YXNrX3B3ZGAsIGBnZXRfdGFza19leGVfcGF0aGAgYW5kIGBQSURGRF9HRVRfRVhFYCwgYFBJREZEX0dFVF9DV0RgLCBgUElERkRfR0VUX1JPT1RgLiBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGEgd2F5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGxpa2UgYSB0YXNrJ3Mgcm9vdCwgY3dkLCBhbmQgZXhlY3V0YWJsZSBwYXRoIHZpYSBmaWxlIGRlc2NyaXB0b3JzLiBDcnVjaWFsbHksIHRoZXNlIG5ldyBpb2N0bHMgYXJlIHJldHVybmluZyBmaWxlIGRlc2NyaXB0b3JzIChgT19QQVRIYCksICpub3QqIGRpcmVjdGx5IGNvcHlpbmcgZGF0YSB0byB1c2Vyc3BhY2UsIHdoaWNoIGlzIGEga2V5IHBvaW50LlxuXG5BZnRlciBjYXJlZnVsbHkgcmV2aWV3aW5nIHRoZSBjb2RlLCB0aGVyZSBhcmUgbm8gY2hhbmdlcyBvciBhZGRpdGlvbnMgdGhhdCBjb3VsZCBhbGxvdyBmb3IgaW5mb3JtYXRpb24gbGVha2FnZSB0byB1c2VyIHNwYWNlLiBGdXJ0aGVyLCBhbGwgc3RhY2sgdmFyaWFibGVzIHVzZWQsIGxpa2UgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9O2AsIGFyZSBwcm9wZXJseSB6ZXJvLWluaXRpYWxpemVkLCBhbmQgY2xlYW51cCBpcyBoYW5kbGVkIGJ5IFJBSUkuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgaGFwcGVuaW5nIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb2RlIG9yIHRoZSBjaGFuZ2VzIG1hZGUuXG5cbk1lbW9yeSBzYWZldHkgaXMgcGFyYW1vdW50LCBhbmQgbXkgY2hlY2tzIGZvY3VzIG9uIHRoYXQuIFRoZSBwcmltYXJ5IHJpc2tzIHdpdGhpbiB0aGVzZSBjaGFuZ2VzIGJvaWwgZG93biB0byBjbGFzc2ljIGtlcm5lbCBidWdzOiBsb2NraW5nIGlzc3VlcyAoc3luY2hyb25pemF0aW9uKSwgcmVmZXJlbmNlIGNvdW50aW5nIHByb2JsZW1zIChwb3RlbnRpYWwgdXNlLWFmdGVyLWZyZWUgY29uZGl0aW9ucyksIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMuIEknbSBzYXRpc2ZpZWQgdGhhdCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFuZCBoYXJkZW5pbmcgdG9vbHMgYXJlIHBlcmZlY3RseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGVzZSBidWdzLiBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBleGlzdGluZyBrZXJuZWwgYnVnIGRldGVjdG9ycyBhcmUsIGluIG15IGV4cGVydCBvcGluaW9uLCBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCBzZXJpZXMuXG5cblRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIFRoZSBjaGFuZ2VzIGFyZSBsYXJnZWx5IGZvY3VzZWQgb24gcGF0aCByZXRyaWV2YWwgdmlhIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHVzZSBzdGFuZGFyZCBrZXJuZWwgcHJhY3RpY2VzLlxuXG5NeSBmaW5hbCBhbmFseXNpcyBpcyB0aGF0LCB3aXRoIHJlc3BlY3QgdG8gdGhlIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIHJpc2tzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLiBJJ20gY29uZmlkZW50IGluIHRoaXMgZXZhbHVhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgwMSwiT3V0cHV0VG9rZW5zIjoyNzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODk1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMDM6Mjc6MjcuNjg4MDkxMTY4WiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGFzayBwYXRoIGV4dHJhY3Rpb24gaGVscGVycyAoZ2V0X3Rhc2tfcm9vdCwgZ2V0X3Rhc2tfcHdkLCBnZXRfdGFza19leGVfcGF0aCkgYW5kIGFkZHMgbmV3IGlvY3RsIGNvbW1hbmRzIHRvIHBpZGZzIChQSURGRF9HRVRfRVhFLCBQSURGRF9HRVRfQ1dELCBQSURGRF9HRVRfUk9PVCkgcmV0dXJuaW5nIE9fUEFUSCBmaWxlIGRlc2NyaXB0b3JzLlxcblxcbjEuIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gaW5mby1sZWFrIGFuYWx5c2lzOlxcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIG5ldyBpb2N0bHMgcmV0dXJuIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIHZpYSBGRF9BREQuXFxuICAgLSBBbGwgc3RhY2sgdmFyaWFibGVzIChlLmcuLCBgc3RydWN0IHBhdGggcGF0aCBfX2ZyZWUocGF0aF9wdXQpID0ge31gKSBhcmUgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkLlxcbiAgIC0gUmV0dXJuIHBhdGhzIGFuZCBlcnJvciBjb2RlcyBhcmUgY2hlY2tlZCBiZWZvcmUgYWNjZXNzaW5nIHJldHJpZXZlZCBwYXRocy5cXG5cXG4yLiBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5OlxcbiAgIC0gUG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyByZWxhdGUgdG8gcmVmZXJlbmNlIGNvdW50aW5nIChmcHV0LCBwYXRoX3B1dCwgZ2V0X3Rhc2tfc3RydWN0KSwgbG9ja2luZy9zeW5jaHJvbml6YXRpb24gKGV4ZWNfdXBkYXRlX2xvY2ssIHRhc2tfbG9jayksIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMuXFxuICAgLSBUaGVzZSBpc3N1ZXMgYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBnZW5lcmFsIGtlcm5lbCBhc3NlcnRpb25zLiBLTVNBTiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRhc2sgcGF0aCBleHRyYWN0aW9uIGhlbHBlcnMgKGdldF90YXNrX3Jvb3QsIGdldF90YXNrX3B3ZCwgZ2V0X3Rhc2tfZXhlX3BhdGgpIGFuZCBhZGRzIG5ldyBpb2N0bCBjb21tYW5kcyB0byBwaWRmcyAoUElERkRfR0VUX0VYRSwgUElERkRfR0VUX0NXRCwgUElERkRfR0VUX1JPT1QpIHJldHVybmluZyBPX1BBVEggZmlsZSBkZXNjcmlwdG9ycy5cXG5cXG4xLiBVbmluaXRpYWxpemVkIG1lbW9yeSAvIGluZm8tbGVhayBhbmFseXNpczpcXG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBuZXcgaW9jdGxzIHJldHVybiBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciB2aWEgRkRfQURELlxcbiAgIC0gQWxsIHN0YWNrIHZhcmlhYmxlcyAoZS5nLiwgYHN0cnVjdCBwYXRoIHBhdGggX19mcmVlKHBhdGhfcHV0KSA9IHt9YCkgYXJlIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZC5cXG4gICAtIFJldHVybiBwYXRocyBhbmQgZXJyb3IgY29kZXMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyByZXRyaWV2ZWQgcGF0aHMuXFxuXFxuMi4gS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eTpcXG4gICAtIFBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIHJlZmVyZW5jZSBjb3VudGluZyAoZnB1dCwgcGF0aF9wdXQsIGdldF90YXNrX3N0cnVjdCksIGxvY2tpbmcvc3luY2hyb25pemF0aW9uIChleGVjX3VwZGF0ZV9sb2NrLCB0YXNrX2xvY2spLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLlxcbiAgIC0gVGhlc2UgaXNzdWVzIGFyZSBwcm9wZXJseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgZ2VuZXJhbCBrZXJuZWwgYXNzZXJ0aW9ucy4gS01TQU4gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[1] Phase: Succeeded StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 03:27:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 03:27:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2] Phase: Succeeded StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 03:27:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-31 03:27:38 +0000 UTC FinishedAt: 2026-08-31 03:27:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-904457152/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-31 03:27:48 +0000 UTC FinishedAt: 2026-08-31 03:44:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-31 03:27:48 +0000 UTC FinishedAt: 2026-08-31 03:44:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*768b085f-a652-4033-bd1a-042cacb2917c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-904457152/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "dabdcd2d-6181-44f8-95b0-5f0c0bcbfe12", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-3663451014/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-31 03:27:48 +0000 UTC FinishedAt: 2026-08-31 03:44:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*768b085f-a652-4033-bd1a-042cacb2917c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-904457152/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "dabdcd2d-6181-44f8-95b0-5f0c0bcbfe12", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-3663451014/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-31 03:44:38 +0000 UTC FinishedAt: 2026-08-31 03:44:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-31 03:44:38 +0000 UTC FinishedAt: 2026-08-31 03:44:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-31 03:44:38 +0000 UTC FinishedAt: 2026-08-31 03:44:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-31 03:44:38 +0000 UTC FinishedAt: 2026-08-31 03:44:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-630568551/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-31 03:44:48 +0000 UTC FinishedAt: 2026-08-31 03:46:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-31 03:44:48 +0000 UTC FinishedAt: 2026-08-31 03:46:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*dabdcd2d-6181-44f8-95b0-5f0c0bcbfe12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-3663451014/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-31 03:46:41 +0000 UTC FinishedAt: 2026-08-31 03:46:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-31 03:46:41 +0000 UTC FinishedAt: 2026-08-31 03:46:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-31 03:46:41 +0000 UTC FinishedAt: 2026-08-31 04:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-31 03:46:41 +0000 UTC FinishedAt: 2026-08-31 04:09:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*768b085f-a652-4033-bd1a-042cacb2917c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-630568551/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "a8265952-e5ec-4967-b30a-1db078037925", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-207777259/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-31 03:46:41 +0000 UTC FinishedAt: 2026-08-31 04:08:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*768b085f-a652-4033-bd1a-042cacb2917c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-630568551/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "a8265952-e5ec-4967-b30a-1db078037925", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-207777259/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-31 04:09:02 +0000 UTC FinishedAt: 2026-08-31 04:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-31 04:09:02 +0000 UTC FinishedAt: 2026-08-31 04:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-31 04:09:02 +0000 UTC FinishedAt: 2026-08-31 04:10:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-31 04:09:02 +0000 UTC FinishedAt: 2026-08-31 04:10:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a8265952-e5ec-4967-b30a-1db078037925,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-207777259/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*dabdcd2d-6181-44f8-95b0-5f0c0bcbfe12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a8265952-e5ec-4967-b30a-1db078037925,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-3663451014/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-207777259/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 04:11:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 04:11:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-1537931456/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 04:10:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 04:10:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-31 04:10:59 +0000 UTC FinishedAt: 2026-08-31 04:10:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-31 04:11:09 +0000 UTC FinishedAt: 2026-08-31 07:17:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwvsfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["get_task_root","get_task_pwd","get_task_exe_path"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"c2127e0eaf7eaa86e54c43b2794df55317d3f74f","config_name":"upstream-apparmor-kasan.config","series_id":"97674aba-5691-41af-91c1-3b34a67c9ac1","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-31 04:11:09 +0000 UTC FinishedAt: 2026-08-31 07:17:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*dabdcd2d-6181-44f8-95b0-5f0c0bcbfe12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a8265952-e5ec-4967-b30a-1db078037925,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-3663451014/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-build-action-207777259/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowwvsfz/series-workflowwvsfz-convert-artifact-1537931456/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}