Name: series-workflow56s2m Phase: Running StartedAt: 2026-06-30 22:53:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow56s2m[0] Phase: Running StartedAt: 2026-06-30 22:53:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow56s2m[0].run-triage Phase: Running StartedAt: 2026-06-30 22:53:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow56s2m[0].run-triage(0) Phase: Running StartedAt: 2026-06-30 22:53:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "f456c1922c49e6be5ce407ddb74a6e61af5b65cf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IBMVETH" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "f456c1922c49e6be5ce407ddb74a6e61af5b65cf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IBMVETH" ], "series_id": "d8044b2a-cb00-4402-af3b-d11fd69eb388" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "ibmveth_set_channels", "ibmveth_resize_rx_queues_incremental", "ibmveth_register_logical_lan_queue", "ibmveth_register_single_rx_queue", "ibmveth_deregister_single_rx_queue", "ibmveth_alloc_single_rx_queue", "ibmveth_free_single_rx_queue", "ibmveth_drain_rx_queue", "ibmveth_add_logical_lan_buffers", "ibmveth_toggle_irq", "ibmveth_register_rx_queues", "ibmveth_open", "ibmveth_close" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzMwIDIzOjA1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lCTVZFVEgmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpYm12ZXRoX3NldF9jaGFubmVscyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzJiMzNDssCiAgICAmIzM0O2libXZldGhfdG9nZ2xlX2lycSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX29wZW4mIzM0OywKICAgICYjMzQ7aWJtdmV0aF9jbG9zZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIG11bHRpLXF1ZXVlIHN1cHBvcnQgdG8gdGhlIGlibXZldGggZHJpdmVyLCBpbnRyb2R1Y2luZyBuZXcgaHlwZXJjYWxscyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBxdWV1ZSBtYW5hZ2VtZW50LCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBldGh0b29sIG9wZXJhdGlvbnMuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCB2aWEgbmV0d29yayBvcGVyYXRpb25zIGFuZCBldGh0b29sIGNvbW1hbmRzLCBtYWtpbmcgdGhlbSBzdWl0YWJsZSBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNi8zMCAyMzowNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDRiNGMwY2Q0MmNjZWVkYjk4MDNiN2M2OWM0ZWZlMzMyNzZmZGQ3MjJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1biAzMCAyMzowNTo0NCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmhcbmluZGV4IGRmZjkwYTdkN2Y3MGI4Li5iZjJmMWIwMzU2YzQ3NyAxMDA2NDRcbi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oXG5AQCAtMzYyLDcgJiM0MzszNjIsMTEgQEBcbiAjZGVmaW5lIEhfR1VFU1RfREVMRVRFXHRcdDB4NDg4XG4gI2RlZmluZSBIX1BLU19XUkFQX09CSkVDVFx0MHg0OTBcbiAjZGVmaW5lIEhfUEtTX1VOV1JBUF9PQkpFQ1RcdDB4NDk0XG4tI2RlZmluZSBNQVhfSENBTExfT1BDT0RFXHRIX1BLU19VTldSQVBfT0JKRUNUXG4mIzQzOyNkZWZpbmUgSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUgMHg0OUNcbiYjNDM7I2RlZmluZSBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFIDB4NEEwXG4mIzQzOyNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX0JVRkZFUl9RVUVVRSAweDRBNFxuJiM0MzsjZGVmaW5lIEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRSAweDRBOFxuJiM0MzsjZGVmaW5lIE1BWF9IQ0FMTF9PUENPREVcdEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRVxuIFxuIC8qIFNjb3BlIGFyZ3MgZm9yIEhfU0NNX1VOQklORF9BTEwgKi9cbiAjZGVmaW5lIEhfVU5CSU5EX1NDT1BFX0FMTCAoMHgxKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG5pbmRleCA3M2UwNTFkMjZiOWQ4OC4uZDdiZjAxMjcxMTYxY2IgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG5AQCAtMjEsNiAmIzQzOzIxLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ludGVycnVwdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycWRvbWFpbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BtLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ldGh0b29sLmhcdTAwM2VcbkBAIC0yOCw2ICYjNDM7MzAsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pcHY2LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3BpbmxvY2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9odmNhbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2F0b21pYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3Zpby5oXHUwMDNlXG5AQCAtOTUsNDkgJiM0Mzs5OCw4OSBAQCBzdGF0aWMgc3RydWN0IGlibXZldGhfc3RhdCBpYm12ZXRoX3N0YXRzW10gPSB7XG4gXHR7IFwmIzM0O2Z3X2VuYWJsZWRfaXB2Nl9jc3VtXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2lwdjZfY3N1bV9zdXBwb3J0KSB9LFxuIFx0eyBcJiMzNDt0eF9sYXJnZV9wYWNrZXRzXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKHR4X2xhcmdlX3BhY2tldHMpIH0sXG4gXHR7IFwmIzM0O3J4X2xhcmdlX3BhY2tldHNcJiMzNDssIElCTVZFVEhfU1RBVF9PRkYocnhfbGFyZ2VfcGFja2V0cykgfSxcbi1cdHsgXCYjMzQ7ZndfZW5hYmxlZF9sYXJnZV9zZW5kXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkgfVxuJiM0MztcdHsgXCYjMzQ7ZndfZW5hYmxlZF9sYXJnZV9zZW5kXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkgfSxcbiYjNDM7XHR7IFwmIzM0O2hjYWxsX3JlZ19sYW5fcXVldWVcJiMzNDssIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMucmVnX2xhbl9xdWV1ZSkgfSxcbiYjNDM7XHR7IFwmIzM0O2hjYWxsX3JlZ19sYW5cJiMzNDssIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMucmVnX2xhbikgfSxcbiYjNDM7XHR7IFwmIzM0O2hjYWxsX2FkZF9idWZzX3F1ZXVlXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWZzX3F1ZXVlKSB9LFxuJiM0MztcdHsgXCYjMzQ7aGNhbGxfYWRkX2J1ZnNcJiMzNDssIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuYWRkX2J1ZnMpIH0sXG4mIzQzO1x0eyBcJiMzNDtoY2FsbF9hZGRfYnVmXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWYpIH0sXG4mIzQzO1x0eyBcJiMzNDtoY2FsbF9mcmVlX2xhbl9xdWV1ZVwmIzM0OywgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSkgfSxcbiYjNDM7XHR7IFwmIzM0O2hjYWxsX2ZyZWVfbGFuXCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmZyZWVfbGFuKSB9LFxuJiM0MztcdHsgXCYjMzQ7aGNhbGxfc2VuZF9sYW5cJiMzNDssIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuc2VuZF9sYW4pIH0sXG4gfTtcbiBcbiAvKiBzaW1wbGUgbWV0aG9kcyBvZiBnZXR0aW5nIGRhdGEgZnJvbSB0aGUgY3VycmVudCByeHEgZW50cnkgKi9cbi1zdGF0aWMgaW5saW5lIHUzMiBpYm12ZXRoX3J4cV9mbGFncyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0MztzdGF0aWMgaW5saW5lIHUzMiBpYm12ZXRoX3J4cV9mbGFncyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdCAgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0cmV0dXJuIGJlMzJfdG9fY3B1KGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4XS5mbGFnc19vZmYpO1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmUzMl90b19jcHUocnhxLVx1MDAzZXF1ZXVlX2FkZHJbcnhxLVx1MDAzZWluZGV4XS5mbGFnc19vZmYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV90b2dnbGUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHQgICAgIGludCBxdWV1ZV9pbmRleClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAoaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFx1MDAyNiBJQk1WRVRIX1JYUV9UT0dHTEUpIFx1MDAzZVx1MDAzZVxuJiM0MztcdFx0SUJNVkVUSF9SWFFfVE9HR0xFX1NISUZUO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV90b2dnbGUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgaW50IHF1ZXVlX2luZGV4KVxuIHtcbi1cdHJldHVybiAoaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgXHUwMDI2IElCTVZFVEhfUlhRX1RPR0dMRSkgXHUwMDNlXHUwMDNlXG4tXHRcdFx0SUJNVkVUSF9SWFFfVE9HR0xFX1NISUZUO1xuJiM0MztcdHJldHVybiBpYm12ZXRoX3J4cV90b2dnbGUoYWRhcHRlciwgcXVldWVfaW5kZXgpID09XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XS50b2dnbGU7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuIHtcbi1cdHJldHVybiBpYm12ZXRoX3J4cV90b2dnbGUoYWRhcHRlcikgPT0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS50b2dnbGU7XG4mIzQzO1x0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSBcdTAwMjYgSUJNVkVUSF9SWFFfVkFMSUQ7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgIGludCBxdWV1ZV9pbmRleClcbiB7XG4tXHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgXHUwMDI2IElCTVZFVEhfUlhRX1ZBTElEO1xuJiM0MztcdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXHUwMDI2IElCTVZFVEhfUlhRX09GRl9NQVNLO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4mIzQzO1x0XHRcdFx0XHQgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFx1MDAyNiBJQk1WRVRIX1JYUV9PRkZfTUFTSztcbiYjNDM7XHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFx1MDAyNiBJQk1WRVRIX1JYUV9MUkdfUEtUO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgIGludCBxdWV1ZV9pbmRleClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYmUzMl90b19jcHUocnhxLVx1MDAzZXF1ZXVlX2FkZHJbcnhxLVx1MDAzZWluZGV4XS5sZW5ndGgpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7c3RhdGljIGlubGluZSBib29sXG4mIzQzO2libXZldGhfcnhxX2NvcnJlbGF0b3JfdmFsaWQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4LFxuJiM0MztcdFx0XHQgICAgIHU2NCBjb3JyZWxhdG9yKVxuIHtcbi1cdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSBcdTAwMjYgSUJNVkVUSF9SWFFfTFJHX1BLVDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuJiM0MztcdHVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgXHUwMDI2IDB4ZmZmZmZmZmZVTDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHBvb2wgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIGluZGV4IFx1MDAzYyBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2l6ZTtcbiB9XG4gXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3J4cV9hZHZhbmNlKHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSlcbiB7XG4tXHRyZXR1cm4gYmUzMl90b19jcHUoYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItXHUwMDNlcnhfcXVldWUuaW5kZXhdLmxlbmd0aCk7XG4mIzQzO1x0aWYgKCYjNDM7JiM0MztyeHEtXHUwMDNlaW5kZXggPT0gcnhxLVx1MDAzZW51bV9zbG90cykge1xuJiM0MztcdFx0cnhxLVx1MDAzZWluZGV4ID0gMDtcbiYjNDM7XHRcdHJ4cS1cdTAwM2V0b2dnbGUgPSAhcnhxLVx1MDAzZXRvZ2dsZTtcbiYjNDM7XHR9XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2NzdW1fZ29vZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9jc3VtX2dvb2Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdGludCBxdWV1ZV9pbmRleClcbiB7XG4tXHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgXHUwMDI2IElCTVZFVEhfUlhRX0NTVU1fR09PRDtcbiYjNDM7XHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFx1MDAyNiBJQk1WRVRIX1JYUV9DU1VNX0dPT0Q7XG4gfVxuIFxuIHN0YXRpYyB1bnNpZ25lZCBpbnQgaWJtdmV0aF9yZWFsX21heF90eF9xdWV1ZXModm9pZClcbkBAIC0xNDcsNiAmIzQzOzE5MCw0NzIgQEAgc3RhdGljIHVuc2lnbmVkIGludCBpYm12ZXRoX3JlYWxfbWF4X3R4X3F1ZXVlcyh2b2lkKVxuIFx0cmV0dXJuIG1pbihuX2NwdSwgSUJNVkVUSF9NQVhfUVVFVUVTKTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FsbG9jX2ZpbHRlcl9saXN0IC0gQWxsb2NhdGUgYW5kIG1hcCBmaWx0ZXIgbGlzdFxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGlibXZldGhfYWxsb2NfZmlsdGVyX2xpc3Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4mIzQzO1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuJiM0MztcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBmaWx0ZXIgcGFnZXNcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldixcbiYjNDM7XHRcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIsXG4mIzQzO1x0XHRcdFx0XHRcdCAgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuJiM0MztcdGlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hKSkge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBtYXAgZmlsdGVyIGxpc3QgcGFnZXNcXG5cJiMzNDspO1xuJiM0MztcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSBOVUxMO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7ZmlsdGVyIGxpc3QgQCAweCVwIChETUE6IDB4JWxseClcXG5cJiMzNDssXG4mIzQzO1x0XHQgICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIsXG4mIzQzO1x0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3QgLSBGcmVlIGZpbHRlciBsaXN0IHJlc291cmNlc1xuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNlZGV2O1xuJiM0MztcbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEpIHtcbiYjNDM7XHRcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSwgNDA5NixcbiYjNDM7XHRcdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEgPSAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xuJiM0MztcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfYWxsb2NfcnhfcXN0YXRzIC0gQWxsb2NhdGUgcGVyLXF1ZXVlIFJYIHN0YXRpc3RpY3NcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gZmFpbHVyZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0Mzt7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHMgPSBrY2FsbG9jKElCTVZFVEhfTUFYX1JYX1FVRVVFUyxcbiYjNDM7XHRcdFx0XHQgICAgIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyksXG4mIzQzO1x0XHRcdFx0ICAgICBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9mcmVlX3J4X3FzdGF0cyAtIEZyZWUgcGVyLXF1ZXVlIFJYIHN0YXRpc3RpY3NcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9yeF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdGtmcmVlKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKTtcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cyA9IE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0cyAtIEFsbG9jYXRlIHBlci1xdWV1ZSBUWCBzdGF0aXN0aWNzXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY190eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzID0ga2NhbGxvYyhJQk1WRVRIX01BWF9RVUVVRVMsXG4mIzQzO1x0XHRcdFx0ICAgICBzaXplb2Yoc3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMpLFxuJiM0MztcdFx0XHRcdCAgICAgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cylcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfZnJlZV90eF9xc3RhdHMgLSBGcmVlIHBlci1xdWV1ZSBUWCBzdGF0aXN0aWNzXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfdHhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRrZnJlZShhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cyk7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHMgPSBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMgLSBBbGxvY2F0ZSBwZXItcXVldWUgUlggcmVzb3VyY2VzXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEByeHFfZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgcGVyIFJYIHF1ZXVlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7aWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHJ4cV9lbnRyaWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbiYjNDM7XHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuJiM0MztcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgbGlzdCBmb3IgcXVldWUgJWRcXG5cJiMzNDssIGkpO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbGVhbnVwO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfbGVuID1cbiYjNDM7XHRcdFx0c2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpICogcnhxX2VudHJpZXM7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIgPVxuJiM0MztcdFx0XHRkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbixcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hLFxuJiM0MztcdFx0XHRcdFx0ICAgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkcikge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7dW5hYmxlIHRvIGFsbG9jYXRlIFJYIHF1ZXVlIGZvciBxdWV1ZSAlZFxcblwmIzM0OywgaSk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2NsZWFudXA7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0gPSBkbWFfbWFwX3NpbmdsZShkZXYsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0sXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4mIzQzO1x0XHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSkpIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBtYXAgYnVmZmVyIGxpc3QgZm9yIHF1ZXVlICVkXFxuXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0gPSAwO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbGVhbnVwO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0uaW5kZXggPSAwO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5udW1fc2xvdHMgPSByeHFfZW50cmllcztcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0udG9nZ2xlID0gMTtcbiYjNDM7XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucmVwbGVuaXNoX2xvY2spO1xuJiM0MztcbiYjNDM7XHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtxdWV1ZSAlZDogYnVmZmVyX2xpc3QgQCAweCVwIChETUE6IDB4JWxseCksIHJ4X3F1ZXVlIEAgMHglcCAoRE1BOiAweCVsbHgpLCAlbGx1IGVudHJpZXNcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIGksIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSxcbiYjNDM7XHRcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSxcbiYjNDM7XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyLFxuJiM0MztcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hLFxuJiM0MztcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4cV9lbnRyaWVzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDthbGxvY2F0ZWQgJWQgUlggcXVldWUocykgd2l0aCAlZCBlbnRyaWVzIGVhY2hcXG5cJiMzNDssXG4mIzQzO1x0XHQgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMsIHJ4cV9lbnRyaWVzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJfY2xlYW51cDpcbiYjNDM7XHQvKiBDbGVhbiB1cCBwcmV2aW91c2x5IGFsbG9jYXRlZCBxdWV1ZXMgKi9cbiYjNDM7XHRmb3IgKDsgaSBcdTAwM2U9IDA7IGktLSkge1xuJiM0MztcdFx0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldKSB7XG4mIzQzO1x0XHRcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSxcbiYjNDM7XHRcdFx0XHRcdCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldID0gMDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIpIHtcbiYjNDM7XHRcdFx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbixcbiYjNDM7XHRcdFx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyLFxuJiM0MztcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2RtYSk7XG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldKSB7XG4mIzQzO1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pO1xuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0gPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC1FTk9NRU07XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzIC0gRnJlZSBhbGwgUlggcXVldWUgcmVzb3VyY2VzXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNlZGV2O1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRuZXRkZXZfZGJnKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LCBcJiMzNDtjbGVhbmluZyB1cCAlZCBSWCBxdWV1ZShzKVxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSkge1xuJiM0MztcdFx0XHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0sXG4mIzQzO1x0XHRcdFx0XHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSA9IDA7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkcikge1xuJiM0MztcdFx0XHRkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfbGVuLFxuJiM0MztcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXG4mIzQzO1x0XHRcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hKTtcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldKSB7XG4mIzQzO1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pO1xuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0gPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfdG9nZ2xlX2lycSAtIENvbW1vbiBoZWxwZXIgdG8gZW5hYmxlL2Rpc2FibGUgcXVldWUgaW50ZXJydXB0c1xuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKiBAcXVldWVfaW5kZXg6IEluZGV4IG9mIHRoZSBxdWV1ZSAoMCBmb3IgcHJpbWFyeSwgMSYjNDM7IGZvciBzdWJvcmRpbmF0ZSlcbiYjNDM7ICogQGVuYWJsZTogdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGVcbiYjNDM7ICpcbiYjNDM7ICogRm9yIHF1ZXVlIDAgKHByaW1hcnkpLCB1c2VzIGhfdmlvX3NpZ25hbCgpIGFzIGl0JiMzOTtzIHJlZ2lzdGVyZWQgdmlhXG4mIzQzOyAqIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oKS4gRm9yIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMSYjNDM7KSwgdXNlcyBIX1ZJT0NUTFxuJiM0MzsgKiB3aXRoIEhfRU5BQkxFL0RJU0FCTEVfVklPX0lOVEVSUlVQVCBmb3IgcGVyLXF1ZXVlIGludGVycnVwdCBjb250cm9sLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2VcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7aWJtdmV0aF90b2dnbGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCwgYm9vbCBlbmFibGUpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJjO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaXJxID0gYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaW5kZXhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmFjdGlvbiA9IGVuYWJsZSA/IFwmIzM0O2VuYWJsZVwmIzM0OyA6IFwmIzM0O2Rpc2FibGVcJiMzNDs7XG4mIzQzO1xuJiM0MztcdGlmIChxdWV1ZV9pbmRleCA9PSAwKSB7XG4mIzQzO1x0XHQvKiBQcmltYXJ5IHF1ZXVlOiB1c2UgaF92aW9fc2lnbmFsKCkgKi9cbiYjNDM7XHRcdHJjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0ICBlbmFibGUgPyBWSU9fSVJRX0VOQUJMRSA6IFZJT19JUlFfRElTQUJMRSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFN1Ym9yZGluYXRlIHF1ZXVlczogdXNlIEhfVklPQ1RMIHdpdGggaGFyZHdhcmUgSVJRICovXG4mIzQzO1x0XHRzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpO1xuJiM0MztcdFx0aXJxX2h3X251bWJlcl90IGh3aXJxO1xuJiM0MztcdFx0dTY0IHZpb2N0bF9jbWQgPSBlbmFibGUgPyBIX0VOQUJMRV9WSU9fSU5URVJSVVBUIDogSF9ESVNBQkxFX1ZJT19JTlRFUlJVUFQ7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFpcnFfZGF0YSkge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHRcdCAgIFwmIzM0O0ZhaWxlZCB0byBnZXQgSVJRIGRhdGEgZm9yIHF1ZXVlICVkICh2aXJxPSVsdSlcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgcXVldWVfaW5kZXgsIGlycSk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGh3aXJxID0gaXJxZF90b19od2lycShpcnFfZGF0YSk7XG4mIzQzO1x0XHRyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX1ZJT0NUTCxcbiYjNDM7XHRcdFx0XHRcdGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHR2aW9jdGxfY21kLFxuJiM0MztcdFx0XHRcdFx0aHdpcnEsIDAsIDApO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyYyA9PSBIX1BBUkFNRVRFUikge1xuJiM0MztcdFx0XHQvKiBIX1BBUkFNRVRFUiBpcyBub24tZmF0YWwgd2hlbiBJUlEgaXMgYWxyZWFkeSBpbiB0aGUgcmVxdWVzdGVkIHN0YXRlLiAqL1xuJiM0MztcdFx0XHRuZXRkZXZfd2Fybl9vbmNlKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHRcdFx0IFwmIzM0O0hfVklPQ1RMICVzIElSUSByZXR1cm5lZCBIX1BBUkFNRVRFUiBmb3IgcXVldWUgJWQgKGh3aXJxPSVsdSlcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgYWN0aW9uLCBxdWV1ZV9pbmRleCwgaHdpcnEpO1xuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4mIzQzO1x0XHRcdCAgIFwmIzM0O0ZhaWxlZCB0byAlcyBJUlEgZm9yIHF1ZXVlICVkLCByYz0lbGRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIGFjdGlvbiwgcXVldWVfaW5kZXgsIHJjKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2Rpc2FibGVfaXJxIC0gRGlzYWJsZSBpbnRlcnJ1cHQgZm9yIGEgc3BlY2lmaWMgcXVldWVcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHF1ZXVlX2luZGV4OiBJbmRleCBvZiB0aGUgcXVldWUgKDAgZm9yIHByaW1hcnksIDEmIzQzOyBmb3Igc3Vib3JkaW5hdGUpXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludFxuJiM0MztpYm12ZXRoX2Rpc2FibGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBpYm12ZXRoX3RvZ2dsZV9pcnEoYWRhcHRlciwgcXVldWVfaW5kZXgsIGZhbHNlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfZW5hYmxlX2lycSAtIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIGEgc3BlY2lmaWMgcXVldWVcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHF1ZXVlX2luZGV4OiBJbmRleCBvZiB0aGUgcXVldWUgKDAgZm9yIHByaW1hcnksIDEmIzQzOyBmb3Igc3Vib3JkaW5hdGUpXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludFxuJiM0MztpYm12ZXRoX2VuYWJsZV9pcnEoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGlibXZldGhfdG9nZ2xlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzIC0gRHJvcCB2aXJxIG1hcHBpbmdzIGZvciBxdWV1ZXMgMS4uTlxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBTdWJvcmRpbmF0ZSBxdWV1ZXMgZ2V0IG1hcHBpbmdzIGZyb20gaXJxX2NyZWF0ZV9tYXBwaW5nKCkgZHVyaW5nIFBIWVBcbiYjNDM7ICogcmVnaXN0cmF0aW9uLiAgUXVldWUgMCB1c2VzIG5ldGRldi1cdTAwM2VpcnEgZnJvbSBkZXZpY2UgdHJlZSBhbmQgaXMgbGVmdCBhbG9uZS5cbiYjNDM7ICogQ2FsbCBhZnRlciBmcmVlX2lycSgpIHdoZW4gaGFuZGxlcnMgd2VyZSBpbnN0YWxsZWQsIG9yIGFsb25lIHdoZW4gb3BlblxuJiM0MzsgKiBmYWlscyBkdXJpbmcgcmVnaXN0ZXJfcnhfcXVldWVzKCkgYmVmb3JlIHJlcXVlc3RfaXJxKCkuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZFxuJiM0MztpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMTsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKSB7XG4mIzQzO1x0XHRcdGlycV9kaXNwb3NlX21hcHBpbmcoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pO1xuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSA9IDA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9zZXR1cF9yeF9pbnRlcnJ1cHRzIC0gUmVnaXN0ZXIgSVJRIGhhbmRsZXJzIGFuZCBlbmFibGUgTkFQSVxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBhbGwgUlggcXVldWVzIGFuZCBlbmFibGVzIE5BUEkgcG9sbGluZy5cbiYjNDM7ICogRm9yIG11bHRpLXF1ZXVlIG1vZGUsIGVuYWJsZXMgaHlwZXJ2aXNvciBpbnRlcnJ1cHQgZGVsaXZlcnkgb25seSBhZnRlclxuJiM0MzsgKiBldmVyeSBxdWV1ZSBoYXMgYSBMaW51eCBoYW5kbGVyIGluc3RhbGxlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludFxuJiM0MztpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHRpbnQgaSwgcmMsIG51bSA9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcztcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSkge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7cXVldWUgJWQgaGFzIGludmFsaWQgSVJRICgwKVxcblwmIzM0OywgaSk7XG4mIzQzO1x0XHRcdHJjID0gLUVJTlZBTDtcbiYjNDM7XHRcdFx0Z290byBlcnJfZnJlZV9pcnFzO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJjID0gcmVxdWVzdF9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0sIGlibXZldGhfaW50ZXJydXB0LFxuJiM0MztcdFx0XHRcdCAwLCBuZXRkZXYtXHUwMDNlbmFtZSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbiYjNDM7XHRcdGlmIChyYykge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0XHQgICBcJiMzNDtyZXF1ZXN0X2lycSgpIGZhaWxlZCBmb3IgaXJxIDB4JXggcXVldWUgJWQ6ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldLCBpLCByYyk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2ZyZWVfaXJxcztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG51bTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRuYXBpX2VuYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuJiM0MztcbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSBcdTAwMjZcdTAwMjYgbnVtIFx1MDAzZSAxKSB7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW07IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHJjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRpZiAocmMpIHtcbiYjNDM7XHRcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0XHRcdCAgIFwmIzM0O0ZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZCwgcmM9JWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICBpLCByYyk7XG4mIzQzO1x0XHRcdFx0d2hpbGUgKC0taSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdFx0XHRpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRcdHJjID0gLUVJTztcbiYjNDM7XHRcdFx0XHRnb3RvIGVycl9kaXNhYmxlX25hcGk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2Rpc2FibGVfbmFwaTpcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW07IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0bmFwaV9kaXNhYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4mIzQzO1x0aSA9IG51bTtcbiYjNDM7ZXJyX2ZyZWVfaXJxczpcbiYjNDM7XHR3aGlsZSAoLS1pIFx1MDAzZT0gMClcbiYjNDM7XHRcdGZyZWVfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuJiM0MztcdGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMgLSBEaXNhYmxlIE5BUEkgYW5kIGZyZWUgSVJRc1xuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBEaXNhYmxlcyBOQVBJIHBvbGxpbmcgYW5kIGZyZWVzIGludGVycnVwdCBoYW5kbGVycyBmb3IgYWxsIFJYIHF1ZXVlcy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkXG4mIzQzO2libXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5hcGlfZGlzYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pXG4mIzQzO1x0XHRcdGZyZWVfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhhZGFwdGVyKTtcbiYjNDM7XG4mIzQzO1x0LyogQ2xlYXIgcXVldWUgMCBJUlEgbnVtYmVyICovXG4mIzQzO1x0YWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbMF0gPSAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9zZXR1cF9zaW5nbGVfcnhfaW50ZXJydXB0IC0gU2V0dXAgaW50ZXJydXB0IGZvciBhIHNpbmdsZSBSWCBxdWV1ZVxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBzZXR1cFxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgdGhlIElSUSBoYW5kbGVyIGZvciBvbmUgcXVldWUuIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsXG4mIzQzOyAqIHNjYWxlLXVwIHdoZW4gYWRkaW5nIG5ldyBSWCBxdWV1ZXM7IHRoZSBjYWxsZXIgZW5hYmxlcyBOQVBJIHZpYVxuJiM0MzsgKiBuYXBpX2VuYWJsZSgpIGFmdGVyIGlibXZldGhfZW5hYmxlX2lycSgpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO2libXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdCAgaW50IHF1ZXVlX2lkeClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdHJjID0gcmVxdWVzdF9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSwgaWJtdmV0aF9pbnRlcnJ1cHQsXG4mIzQzO1x0XHRcdCAwLCBuZXRkZXYtXHUwMDNlbmFtZSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW3F1ZXVlX2lkeF0pO1xuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3JlcXVlc3RfaXJxKCkgZmFpbGVkIGZvciBxdWV1ZSAlZDogJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIHF1ZXVlX2lkeCwgcmMpO1xuJiM0MztcdFx0cmV0dXJuIHJjO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O1NldHVwIElSUSAlZCBmb3IgcXVldWUgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHQgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdLCBxdWV1ZV9pZHgpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9jbGVhbnVwX3NpbmdsZV9yeF9pbnRlcnJ1cHQgLSBDbGVhbnVwIGludGVycnVwdCBmb3IgYSBzaW5nbGUgUlggcXVldWVcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gY2xlYW51cFxuJiM0MzsgKlxuJiM0MzsgKiBGcmVlcyB0aGUgSVJRIGhhbmRsZXIgZm9yIG9uZSBxdWV1ZS4gVXNlZCBkdXJpbmcgaW5jcmVtZW50YWwgc2NhbGUtZG93bi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkXG4mIzQzO2libXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4mIzQzO1x0XHRcdFx0ICAgIGludCBxdWV1ZV9pZHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSkge1xuJiM0MztcdFx0ZnJlZV9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW3F1ZXVlX2lkeF0pO1xuJiM0MztcdFx0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCYjMzQ7RnJlZWQgSVJRIGZvciBxdWV1ZSAlZFxcblwmIzM0OywgcXVldWVfaWR4KTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4gLyogc2V0dXAgdGhlIGluaXRpYWwgc2V0dGluZ3MgZm9yIGEgYnVmZmVyIHBvb2wgKi9cbiBzdGF0aWMgdm9pZCBpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sLFxuIFx0XHRcdFx0ICAgICB1MzIgcG9vbF9pbmRleCwgdTMyIHBvb2xfc2l6ZSxcbkBAIC0yMDUsMTEgJiM0Mzs3MTQsNzMgQEAgc3RhdGljIGlubGluZSB2b2lkIGlibXZldGhfZmx1c2hfYnVmZmVyKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKVxuIFx0XHRhc20oXCYjMzQ7ZGNiZiAlMCwlMSwxXCYjMzQ7IDo6IFwmIzM0O2JcJiMzNDsgKGFkZHIpLCBcJiMzNDtyXCYjMzQ7IChvZmZzZXQpKTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzIC0gQWRkIHJlY2VpdmUgYnVmZmVycyB0byBoeXBlcnZpc29yXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBkZXNjczogYXJyYXkgb2YgYnVmZmVyIGRlc2NyaXB0b3JzIHRvIGFkZFxuJiM0MzsgKiBAZmlsbGVkOiBudW1iZXIgb2YgdmFsaWQgZGVzY3JpcHRvcnMgaW4gdGhlIGFycmF5XG4mIzQzOyAqIEBidWZmX3NpemU6IHNpemUgb2YgZWFjaCBidWZmZXIgKG11bHRpLXF1ZXVlIG1vZGUgb25seSlcbiYjNDM7ICogQHF1ZXVlX2luZGV4OiBSWCBxdWV1ZSBpbmRleFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IGh5cGVydmlzb3IgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBsb25nIGlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICB1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjICpkZXNjcyxcbiYjNDM7XHRcdFx0XHRcdCAgICBpbnQgZmlsbGVkLFxuJiM0MztcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYnVmZl9zaXplLFxuJiM0MztcdFx0XHRcdFx0ICAgIGludCBxdWV1ZV9pbmRleClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gYWRhcHRlci1cdTAwM2V2ZGV2O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcmM7XG4mIzQzO1xuJiM0MztcdGlmIChhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGJ1ZmZlcnN6bnVtID0gKGJ1ZmZfc2l6ZSBcdTAwM2NcdTAwM2MgMzIpIHwgZmlsbGVkO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpb2JhW0lCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAvIDJdID0gezB9O1xuJiM0MztcdFx0aW50IGk7XG4mIzQzO1xuJiM0MztcdFx0LyogUGFjayBkZXNjcmlwdG9yIGFkZHJlc3NlcyBpbnRvIGlvYmEgcGFpcnMuXG4mIzQzO1x0XHQgKiBFYWNoIGlvYmEgaG9sZHMgdHdvIDMyLWJpdCBhZGRyZXNzZXMgcGFja2VkIGludG8gNjQgYml0czpcbiYjNDM7XHRcdCAqIC0gRXZlbiBkZXNjcmlwdG9ycyAoMCwyLDQuLi4pIGdvIGluIGhpZ2ggMzIgYml0c1xuJiM0MztcdFx0ICogLSBPZGQgZGVzY3JpcHRvcnMgKDEsMyw1Li4uKSBnbyBpbiBsb3cgMzIgYml0c1xuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBmaWxsZWQgXHUwMDI2XHUwMDI2IGkgXHUwMDNjIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aW50IHBhaXJfaWR4ID0gaSAvIDI7ICAgICAgICAgICAvKiBXaGljaCBwYWlyOiAwLTUgKi9cbiYjNDM7XHRcdFx0aW50IGlzX2hpZ2ggPSAoaSAlIDIgPT0gMCk7ICAgICAvKiBIaWdoIG9yIGxvdyAzMiBiaXRzICovXG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoaXNfaGlnaClcbiYjNDM7XHRcdFx0XHRpb2JhW3BhaXJfaWR4XSA9ICh1bnNpZ25lZCBsb25nKWRlc2NzW2ldLmZpZWxkcy5hZGRyZXNzIFx1MDAzY1x1MDAzYyAzMjtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdGlvYmFbcGFpcl9pZHhdIHw9IGRlc2NzW2ldLmZpZWxkcy5hZGRyZXNzO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSh2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgYnVmZmVyc3pudW0sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgaW9iYVswXSwgaW9iYVsxXSwgaW9iYVsyXSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBpb2JhWzNdLCBpb2JhWzRdLCBpb2JhWzVdKTtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMuYWRkX2J1ZnNfcXVldWUmIzQzOyYjNDM7O1xuJiM0MztcdH0gZWxzZSBpZiAoZmlsbGVkID09IDEpIHtcbiYjNDM7XHRcdHJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyKHZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgZGVzY3NbMF0uZGVzYyk7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLmFkZF9idWYmIzQzOyYjNDM7O1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgZGVzY3NbMF0uZGVzYywgZGVzY3NbMV0uZGVzYyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBkZXNjc1syXS5kZXNjLCBkZXNjc1szXS5kZXNjLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGRlc2NzWzRdLmRlc2MsIGRlc2NzWzVdLmRlc2MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgZGVzY3NbNl0uZGVzYywgZGVzY3NbN10uZGVzYyk7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLmFkZF9idWZzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiAvKiByZXBsZW5pc2ggdGhlIGJ1ZmZlcnMgZm9yIGEgcG9vbC4gIG5vdGUgdGhhdCB3ZSBkb24mIzM5O3QgbmVlZCB0b1xuICAqIHNrYl9yZXNlcnZlIHRoZXNlIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIGluY29taW5nLi4uXG4gICovXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbi1cdFx0XHRcdFx0ICBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wpXG4mIzQzO1x0XHRcdFx0XHQgIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCxcbiYjNDM7XHRcdFx0XHRcdCAgaW50IHF1ZXVlX2luZGV4KVxuIHtcbiBcdHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgZGVzY3NbSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMXSA9IHswfTtcbiBcdHUzMiByZW1haW5pbmcgPSBwb29sLVx1MDAzZXNpemUgLSBhdG9taWNfcmVhZChcdTAwMjZwb29sLVx1MDAzZWF2YWlsYWJsZSk7XG5AQCAtMjk1LDI0ICYjNDM7ODY2LDE1IEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4gXHRcdGlmICghZmlsbGVkKVxuIFx0XHRcdGJyZWFrO1xuIFxuLVx0XHQvKiBzaW5nbGUgYnVmZmVyIGNhc2UqL1xuLVx0XHRpZiAoZmlsbGVkID09IDEpXG4tXHRcdFx0bHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcih2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHRcdCAgIGRlc2NzWzBdLmRlc2MpO1xuLVx0XHRlbHNlXG4tXHRcdFx0LyogTXVsdGktYnVmZmVyIGhjYWxsICovXG4tXHRcdFx0bHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbMF0uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1sxXS5kZXNjLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGRlc2NzWzJdLmRlc2MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbM10uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1s0XS5kZXNjLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGRlc2NzWzVdLmRlc2MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbNl0uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1s3XS5kZXNjKTtcbiYjNDM7XHRcdGxwYXJfcmMgPSBpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKGFkYXB0ZXIsIGRlc2NzLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgZmlsbGVkLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgcG9vbC1cdTAwM2VidWZmX3NpemUsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICBxdWV1ZV9pbmRleCk7XG4mIzQzO1xuIFx0XHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcbiBcdFx0XHRkZXZfd2Fybl9yYXRlbGltaXRlZChkZXYsXG4tXHRcdFx0XHRcdCAgICAgXCYjMzQ7UlggaF9hZGRfbG9naWNhbF9sYW4gZmFpbGVkOiBmaWxsZWQ9JXUsIHJjPSVsdSwgYmF0Y2g9JXVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgIFwmIzM0O1JYIGhfYWRkX2xvZ2ljYWxfbGFuICVzIGZhaWxlZDogZmlsbGVkPSV1LCByYz0lbHUsIGJhdGNoPSV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlID8gXCYjMzQ7X3F1ZXVlXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7LFxuIFx0XHRcdFx0XHQgICAgIGZpbGxlZCwgbHBhcl9yYywgYmF0Y2gpO1xuIFx0XHRcdGdvdG8gaGNhbGxfZmFpbHVyZTtcbiBcdFx0fVxuQEAgLTM1MywyNCAmIzQzOzkxNSwxOSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuIFx0XHR9XG4gXHRcdGFkYXB0ZXItXHUwMDNlcmVwbGVuaXNoX2FkZF9idWZmX2ZhaWx1cmUgJiM0Mzs9IGZpbGxlZDtcbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgbXVsdGkgcnggYnVmZmVycyBoY2FsbCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IEZXXG4tXHRcdCAqIGUuZy4gaW4gdGhlIGNhc2Ugb2YgTGl2ZSBQYXJ0aXRpb24gTWlncmF0aW9uXG4tXHRcdCAqL1xuLVx0XHRpZiAoYmF0Y2ggXHUwMDNlIDEgXHUwMDI2XHUwMDI2IGxwYXJfcmMgPT0gSF9GVU5DVElPTikge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogSW5zdGVhZCBvZiByZXRyeSBzdWJtaXQgc2luZ2xlIGJ1ZmZlciBpbmRpdmlkdWFsbHlcbi1cdFx0XHQgKiBoZXJlIGp1c3Qgc2V0IHRoZSBtYXggcnggYnVmZmVyIHBlciBoY2FsbCB0byAxXG4tXHRcdFx0ICogYnVmZmVycyB3aWxsIGJlIHJlc3BsZXNoZWQgbmV4dCB0aW1lXG4tXHRcdFx0ICogd2hlbiBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbCgpIGlzIGNhbGxlZCBhZ2FpblxuLVx0XHRcdCAqIHdpdGggc2luZ2xlLWJ1ZmZlciBjYXNlXG4tXHRcdFx0ICovXG4tXHRcdFx0bmV0ZGV2X2luZm8oYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4tXHRcdFx0XHQgICAgXCYjMzQ7UlggTXVsdGkgYnVmZmVycyBub3Qgc3VwcG9ydGVkIGJ5IEZXLCByYz0lbHVcXG5cJiMzNDssXG4tXHRcdFx0XHQgICAgbHBhcl9yYyk7XG4tXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IDE7XG4tXHRcdFx0bmV0ZGV2X2luZm8oYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4tXHRcdFx0XHQgICAgXCYjMzQ7TmV4dCByeCByZXBsZXNoIHdpbGwgZmFsbCBiYWNrIHRvIHNpbmdsZS1idWZmZXIgaGNhbGxcXG5cJiMzNDspO1xuJiM0MztcdFx0aWYgKGxwYXJfcmMgPT0gSF9GVU5DVElPTikge1xuJiM0MztcdFx0XHRpZiAoYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSkge1xuJiM0MztcdFx0XHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4mIzQzO1x0XHRcdFx0XHQgICBcJiMzNDtVbmV4cGVjdGVkIEhfRlVOQ1RJT04gZnJvbSBtdWx0aS1xdWV1ZSBidWZmZXIgYWRkIChxdWV1ZT0lZCwgYmF0Y2g9JWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgcXVldWVfaW5kZXgsIGJhdGNoKTtcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fSBlbHNlIGlmIChiYXRjaCBcdTAwM2UgMSkge1xuJiM0MztcdFx0XHRcdG5ldGRldl93YXJuKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHRcdFx0ICAgIFwmIzM0O0hfRlVOQ1RJT04gZnJvbSBsZWdhY3kgYmF0Y2ggYnVmZmVyIGFkZCAoYmF0Y2g9JWQpLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIGJ1ZmZlciBtb2RlXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgIGJhdGNoKTtcbiYjNDM7XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsID0gMTtcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuIFx0XHR9XG4gXHRcdGJyZWFrO1xuIFx0fVxuQEAgLTM4NiwyNyAmIzQzOzk0Myw1MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuICAqL1xuIHN0YXRpYyB2b2lkIGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuIHtcbi1cdF9fYmU2NCAqcCA9IGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkciAmIzQzOyA0MDk2IC0gODtcbiYjNDM7XHRpbnQgaTtcbiBcbi1cdGFkYXB0ZXItXHUwMDNlcnhfbm9fYnVmZmVyID0gYmU2NF90b19jcHVwKHApO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdF9fYmU2NCAqcCA9IGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSAmIzQzOyA0MDk2IC0gODtcbiYjNDM7XHRcdHU2NCBkcm9wcyA9IGJlNjRfdG9fY3B1cChwKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpXG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2ldLm5vX2J1ZmZlcl9kcm9wcyA9IGRyb3BzO1xuJiM0MztcdFx0aWYgKGkgPT0gMClcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9ub19idWZmZXIgPSBkcm9wcztcbiYjNDM7XHR9XG4gfVxuIFxuIC8qIHJlcGxlbmlzaCByb3V0aW5lICovXG4tc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF90YXNrKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4mIzQzO1x0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuIHtcbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuIFx0aW50IGk7XG4gXG4gXHRhZGFwdGVyLVx1MDAzZXJlcGxlbmlzaF90YXNrX2N5Y2xlcyYjNDM7JiM0Mzs7XG4gXG4mIzQzO1x0aWYgKHF1ZXVlX2luZGV4IFx1MDAzZT0gYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKSB7XG4mIzQzO1x0XHRuZXRkZXZfZGJnKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHQgICBcJiMzNDtTa2lwcGluZyByZXBsZW5pc2ggZm9yIGZyZWVkIHF1ZXVlICVkIChudW1fcXVldWVzPSVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRzcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZyeHEtXHUwMDNlcmVwbGVuaXNoX2xvY2ssIGZsYWdzKTtcbiYjNDM7XG4gXHRmb3IgKGkgPSAoSUJNVkVUSF9OVU1fQlVGRl9QT09MUyAtIDEpOyBpIFx1MDAzZT0gMDsgaS0tKSB7XG4tXHRcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldO1xuJiM0MztcdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID1cbiYjNDM7XHRcdFx0XHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW2ldO1xuIFxuLVx0XHRpZiAocG9vbC1cdTAwM2VhY3RpdmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRpZiAocG9vbC1cdTAwM2VhY3RpdmUgXHUwMDI2XHUwMDI2IHBvb2wtXHUwMDNlZnJlZV9tYXAgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICAoYXRvbWljX3JlYWQoXHUwMDI2cG9vbC1cdTAwM2VhdmFpbGFibGUpIFx1MDAzYyBwb29sLVx1MDAzZXRocmVzaG9sZCkpXG4tXHRcdFx0aWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woYWRhcHRlciwgcG9vbCk7XG4mIzQzO1x0XHRcdGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsIHBvb2wsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHF1ZXVlX2luZGV4KTtcbiBcdH1cbiBcbiBcdGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihhZGFwdGVyKTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZyeHEtXHUwMDNlcmVwbGVuaXNoX2xvY2ssIGZsYWdzKTtcbiB9XG4gXG4gLyogZW1wdHkgYW5kIGZyZWUgYW5hIGJ1ZmZlciBwb29sIC0gYWxzbyB1c2VkIHRvIGRvIGNsZWFudXAgaW4gZXJyb3IgcGF0aHMgKi9cbkBAIC00NDQsMzYgJiM0MzsxMDI1LDI5MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiB9XG4gXG4gLyoqXG4tICogaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbCAtIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbFxuLSAqIEBhZGFwdGVyOiBhZGFwdGVyIGluc3RhbmNlXG4tICogQGNvcnJlbGF0b3I6IGlkZW50aWZpZXMgcG9vbCBhbmQgaW5kZXhcbi0gKiBAcmV1c2U6IHdoZXRoZXIgdG8gcmV1c2UgYnVmZmVyXG4mIzQzOyAqIGlibXZldGhfYWxsb2NfcXVldWVfYnVmZmVyX3Bvb2xzIC0gQWxsb2NhdGUgYnVmZmVyIHBvb2xzIGZvciBhIHNpbmdsZSBxdWV1ZVxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKiBAcXVldWU6IHF1ZXVlIGluZGV4XG4gICpcbi0gKiBSZXR1cm46XG4tICogKiAlMCAgICAgICAtIHN1Y2Nlc3Ncbi0gKiAqICUtRUlOVkFMIC0gY29ycmVsYXRvciBtYXBzIHRvIHBvb2wgb3IgaW5kZXggb3V0IG9mIHJhbmdlXG4tICogKiAlLUVGQVVMVCAtIHBvb2wgYW5kIGluZGV4IG1hcCB0byBudWxsIHNrYlxuJiM0MzsgKiBBbGxvY2F0ZXMgYWxsIGFjdGl2ZSBidWZmZXIgcG9vbHMgZm9yIHRoZSBzcGVjaWZpZWQgcXVldWUuXG4mIzQzOyAqIFBvb2wgbWV0YWRhdGEgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIGludCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4tXHRcdFx0XHRcdCAgIHU2NCBjb3JyZWxhdG9yLCBib29sIHJldXNlKVxuJiM0MztzdGF0aWMgaW50IGlibXZldGhfYWxsb2NfcXVldWVfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgaW50IHF1ZXVlKVxuIHtcbi1cdHVuc2lnbmVkIGludCBwb29sICA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuLVx0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuLVx0dW5zaWduZWQgaW50IGZyZWVfaW5kZXg7XG4tXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuLVxuLVx0aWYgKFdBUk5fT04ocG9vbCBcdTAwM2U9IElCTVZFVEhfTlVNX0JVRkZfUE9PTFMpIHx8XG4tXHQgICAgV0FSTl9PTihpbmRleCBcdTAwM2U9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpKSB7XG4tXHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2YWRhcHRlci1cdTAwM2V3b3JrKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYWN0aXZlKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0pKSB7XG4mIzQzO1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuJiM0MztcdFx0XHRcdCAgIFwmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgcG9vbCAlZCBmb3IgcXVldWUgJWQgKHNpemU9JXUsIGNvdW50PSV1KVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBpLCBxdWV1ZSxcbiYjNDM7XHRcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYnVmZl9zaXplLFxuJiM0MztcdFx0XHRcdCAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5zaXplKTtcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmFjdGl2ZSA9IDA7XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBGcmVlIHBvb2xzIGFsbG9jYXRlZCBzbyBmYXIgZm9yIHRoaXMgcXVldWUgKi9cbiYjNDM7XHRcdFx0d2hpbGUgKC0taSBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdFx0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmFjdGl2ZSlcbiYjNDM7XHRcdFx0XHRcdGlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4tXHRza2IgPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdO1xuLVx0aWYgKFdBUk5fT04oIXNrYikpIHtcbi1cdFx0c2NoZWR1bGVfd29yayhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuLVx0XHRyZXR1cm4gLUVGQVVMVDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMgLSBGcmVlIGJ1ZmZlciBwb29scyBmb3IgYSBzaW5nbGUgcXVldWVcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHF1ZXVlOiBxdWV1ZSBpbmRleFxuJiM0MzsgKlxuJiM0MzsgKiBGcmVlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICBpbnQgcXVldWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXTtcbiYjNDM7XG4mIzQzO1x0XHQvKiBGcmVlIHBvb2wgaWYgaXQgaGFzIGFsbG9jYXRlZCBtZW1vcnksIHJlZ2FyZGxlc3Mgb2YgYWN0aXZlIGZsYWcuXG4mIzQzO1x0XHQgKiBQb29scyBtYXkgaGF2ZSBtZW1vcnkgYWxsb2NhdGVkIGJ1dCBub3QgbWFya2VkIGFjdGl2ZSBkdXJpbmdcbiYjNDM7XHRcdCAqIHF1ZXVlIHNjYWxlLXVwLCBzbyB3ZSBtdXN0IGNoZWNrIGZvciBhY3R1YWwgYWxsb2NhdGlvbnMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChwb29sLVx1MDAzZWZyZWVfbWFwIHx8IHBvb2wtXHUwMDNlZG1hX2FkZHIgfHwgcG9vbC1cdTAwM2Vza2J1ZmYpXG4mIzQzO1x0XHRcdGlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29scyAtIEFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlc1xuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBJbml0aWFsaXplcyBwb29sIG1ldGFkYXRhIGZvciBxdWV1ZXMgMS1OIGZyb20gcXVldWUgMCBzZXR0aW5ncyxcbiYjNDM7ICogdGhlbiBhbGxvY2F0ZXMgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzIHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHRpbnQgaSwgcSwgcmM7XG4mIzQzO1xuJiM0MztcdC8qIEluaXRpYWxpemUgcG9vbCBtZXRhZGF0YSBmb3IgcXVldWVzIDEtMTUgZnJvbSBxdWV1ZSAwIHNldHRpbmdzICovXG4mIzQzO1x0Zm9yIChxID0gMTsgcSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBxJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpzcmMgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXTtcbiYjNDM7XHRcdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpkc3QgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXTtcbiYjNDM7XG4mIzQzO1x0XHRcdGRzdC1cdTAwM2VzaXplID0gc3JjLVx1MDAzZXNpemU7XG4mIzQzO1x0XHRcdGRzdC1cdTAwM2VpbmRleCA9IHNyYy1cdTAwM2VpbmRleDtcbiYjNDM7XHRcdFx0ZHN0LVx1MDAzZWJ1ZmZfc2l6ZSA9IHNyYy1cdTAwM2VidWZmX3NpemU7XG4mIzQzO1x0XHRcdGRzdC1cdTAwM2V0aHJlc2hvbGQgPSBzcmMtXHUwMDNldGhyZXNob2xkO1xuJiM0MztcdFx0XHRkc3QtXHUwMDNlYWN0aXZlID0gc3JjLVx1MDAzZWFjdGl2ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEFsbG9jYXRlIGFjdHVhbCBidWZmZXJzIGZvciBhbGwgcXVldWVzICovXG4mIzQzO1x0Zm9yIChxID0gMDsgcSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBxJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cmMgPSBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcbiYjNDM7XHRcdGlmIChyYykge1xuJiM0MztcdFx0XHQvKiBGcmVlIHBvb2xzIGZvciBhbGwgcHJldmlvdXMgcXVldWVzICovXG4mIzQzO1x0XHRcdHdoaWxlICgtLXEgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRcdGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMoYWRhcHRlciwgcSk7XG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDthbGxvY2F0ZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzIC0gRnJlZSBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXNcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogRnJlZXMgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzIHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcTtcbiYjNDM7XG4mIzQzO1x0LyogRnJlZSBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXMgKi9cbiYjNDM7XHRmb3IgKHEgPSAwOyBxIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IHEmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCYjMzQ7ZnJlZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZSAtIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYSBzaW5nbGUgUlggcXVldWVcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gYWxsb2NhdGVcbiYjNDM7ICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgUlggcXVldWUgZW50cmllc1xuJiM0MzsgKlxuJiM0MzsgKiBBbGxvY2F0ZXMgYnVmZmVyIGxpc3QsIFJYIHF1ZXVlLCBhbmQgcGVyLXF1ZXVlIGJ1ZmZlciBwb29scyBmb3Igb25lIHF1ZXVlLlxuJiM0MzsgKiBVc2VkIGR1cmluZyBpbmNyZW1lbnRhbCBzY2FsZS11cCB3aXRob3V0IGFmZmVjdGluZyBleGlzdGluZyBxdWV1ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7aWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2lkeCxcbiYjNDM7XHRcdFx0ICAgICAgaW50IHJ4cV9lbnRyaWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbiYjNDM7XHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4mIzQzO1x0aW50IGksIHJjID0gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdKSB7XG4mIzQzO1x0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7dW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgcXVldWVfaWR4KTtcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbiA9XG4mIzQzO1x0XHRzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllcztcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkciA9XG4mIzQzO1x0XHRkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfbGVuLFxuJiM0MztcdFx0XHRcdCAgIFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEsXG4mIzQzO1x0XHRcdFx0ICAgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkcikge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBSWCBxdWV1ZSBmb3IgcXVldWUgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIHF1ZXVlX2lkeCk7XG4mIzQzO1x0XHRnb3RvIG91dF9mcmVlX2J1Zmxpc3Q7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdID1cbiYjNDM7XHRcdGRtYV9tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0sXG4mIzQzO1x0XHRcdCAgICAgICA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4mIzQzO1x0aWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSkpIHtcbiYjNDM7XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDt1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgcXVldWVfaWR4KTtcbiYjNDM7XHRcdGdvdG8gb3V0X2ZyZWVfcnhxO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2lkeF1baV0uc2l6ZSA9XG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLnNpemU7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pZHhdW2ldLmJ1ZmZfc2l6ZSA9XG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmJ1ZmZfc2l6ZTtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2lkeF1baV0udGhyZXNob2xkID1cbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0udGhyZXNob2xkO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5hY3RpdmUgPVxuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5hY3RpdmU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyYyA9IGlibXZldGhfYWxsb2NfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHF1ZXVlX2lkeCk7XG4mIzQzO1x0aWYgKHJjKSB7XG4mIzQzO1x0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgcXVldWUgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIHF1ZXVlX2lkeCk7XG4mIzQzO1x0XHRnb3RvIG91dF91bm1hcF9idWZsaXN0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLmluZGV4ID0gMDtcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ubnVtX3Nsb3RzID0gcnhxX2VudHJpZXM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnRvZ2dsZSA9IDE7XG4mIzQzO1x0c3Bpbl9sb2NrX2luaXQoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnJlcGxlbmlzaF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhuZXRkZXYsXG4mIzQzO1x0XHQgICBcJiMzNDtBbGxvY2F0ZWQgcXVldWUgJWQ6IGJ1ZmZlcl9saXN0IEAgJXAgKERNQTogMHglbGx4KSwgcnhfcXVldWUgQCAlcCAoRE1BOiAweCVsbHgpLCAlZCBlbnRyaWVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgcXVldWVfaWR4LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSxcbiYjNDM7XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSxcbiYjNDM7XHRcdCAgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyLFxuJiM0MztcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hLFxuJiM0MztcdFx0ICAgcnhxX2VudHJpZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO291dF91bm1hcF9idWZsaXN0OlxuJiM0MztcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdLFxuJiM0MztcdFx0XHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPSAwO1xuJiM0MztvdXRfZnJlZV9yeHE6XG4mIzQzO1x0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfbGVuLFxuJiM0MztcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyLFxuJiM0MztcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEpO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID0gTlVMTDtcbiYjNDM7b3V0X2ZyZWVfYnVmbGlzdDpcbiYjNDM7XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlIC0gRnJlZSByZXNvdXJjZXMgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBxdWV1ZV9pZHg6IFF1ZXVlIGluZGV4IHRvIGZyZWVcbiYjNDM7ICpcbiYjNDM7ICogRnJlZXMgYnVmZmVyIGxpc3QsIFJYIHF1ZXVlLCBhbmQgcGVyLXF1ZXVlIGJ1ZmZlciBwb29scyBmb3Igb25lIHF1ZXVlLlxuJiM0MzsgKiBVc2VkIGR1cmluZyBpbmNyZW1lbnRhbCBzY2FsZS1kb3duIHdpdGhvdXQgYWZmZWN0aW5nIHJlbWFpbmluZyBxdWV1ZXMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZFxuJiM0MztpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pZHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNlZGV2O1xuJiM0MztcbiYjNDM7XHRpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHF1ZXVlX2lkeCk7XG4mIzQzO1xuJiM0MztcdGlmIChhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdKSB7XG4mIzQzO1x0XHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSxcbiYjNDM7XHRcdFx0XHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSA9IDA7XG4gXHR9XG4gXG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyKSB7XG4mIzQzO1x0XHRkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sXG4mIzQzO1x0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkcixcbiYjNDM7XHRcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEpO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIgPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdKSB7XG4mIzQzO1x0XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCYjMzQ7RnJlZWQgcXVldWUgJWQgcmVzb3VyY2VzXFxuXCYjMzQ7LCBxdWV1ZV9pZHgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbCAtIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbFxuJiM0MzsgKiBAYWRhcHRlcjogYWRhcHRlciBpbnN0YW5jZVxuJiM0MzsgKiBAY29ycmVsYXRvcjogaWRlbnRpZmllcyBwb29sIGFuZCBpbmRleFxuJiM0MzsgKiBAcmV1c2U6IHdoZXRoZXIgdG8gcmV1c2UgYnVmZmVyXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogKiAlMCAgICAgICAtIHN1Y2Nlc3NcbiYjNDM7ICogKiAlLUVJTlZBTCAtIGNvcnJlbGF0b3IgbWFwcyB0byBwb29sIG9yIGluZGV4IG91dCBvZiByYW5nZVxuJiM0MzsgKiAqICUtRUZBVUxUIC0gcG9vbCBhbmQgaW5kZXggbWFwIHRvIG51bGwgc2tiXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgIHU2NCBjb3JyZWxhdG9yLCBpbnQgcXVldWVfaW5kZXgsXG4mIzQzO1x0XHRcdFx0XHQgICBib29sIHJldXNlKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHBvb2wgID0gY29ycmVsYXRvciBcdTAwM2VcdTAwM2UgMzI7XG4mIzQzO1x0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuJiM0MztcdHVuc2lnbmVkIGludCBmcmVlX2luZGV4O1xuJiM0MztcdHN0cnVjdCBza19idWZmICpza2I7XG4mIzQzO1xuJiM0MztcdGlmICghaWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChhZGFwdGVyLCBxdWV1ZV9pbmRleCwgY29ycmVsYXRvcikpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0c2tiID0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF07XG4mIzQzO1x0aWYgKCFza2IpXG4mIzQzO1x0XHRyZXR1cm4gLUVGQVVMVDtcbiYjNDM7XG4gXHQvKiBpZiB3ZSBhcmUgZ29pbmcgdG8gcmV1c2UgdGhlIGJ1ZmZlciB0aGVuIGtlZXAgdGhlIHBvaW50ZXJzIGFyb3VuZFxuIFx0ICogYnV0IG1hcmsgaW5kZXggYXMgYXZhaWxhYmxlLiByZXBsZW5pc2ggd2lsbCBzZWUgdGhlIHNrYiBwb2ludGVyIGFuZFxuIFx0ICogYXNzdW1lIGl0IGlzIHRvIGJlIHJlY3ljbGVkLlxuQEAgLTQ4Miw0MiAmIzQzOzEzMTgsNDEgQEAgc3RhdGljIGludCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4gXHRcdC8qIHJlbW92ZSB0aGUgc2tiIHBvaW50ZXIgdG8gbWFyayBmcmVlLiBhY3R1YWwgZnJlZWluZyBpcyBkb25lXG4gXHRcdCAqIGJ5IHVwcGVyIGxldmVsIG5ldHdvcmtpbmcgYWZ0ZXIgZ3JvX3JlY2VpdmVcbiBcdFx0ICovXG4tXHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNrYnVmZltpbmRleF0gPSBOVUxMO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF0gPSBOVUxMO1xuIFxuIFx0XHRkbWFfdW5tYXBfc2luZ2xlKFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXYsXG4tXHRcdFx0XHQgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uZG1hX2FkZHJbaW5kZXhdLFxuLVx0XHRcdFx0IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmJ1ZmZfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmRtYV9hZGRyW2luZGV4XSxcbiYjNDM7XHRcdFx0XHQgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmJ1ZmZfc2l6ZSxcbiBcdFx0XHRcdCBETUFfRlJPTV9ERVZJQ0UpO1xuIFx0fVxuIFxuLVx0ZnJlZV9pbmRleCA9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4O1xuLVx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXgmIzQzOyYjNDM7O1xuLVx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4IFx1MDAzZT1cbi1cdCAgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5zaXplKVxuLVx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleCA9IDA7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5mcmVlX21hcFtmcmVlX2luZGV4XSA9IGluZGV4O1xuJiM0MztcdGZyZWVfaW5kZXggPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0ucHJvZHVjZXJfaW5kZXg7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4JiM0MzsmIzQzOztcbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4IFx1MDAzZT1cbiYjNDM7XHQgICAgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNpemUpXG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0ucHJvZHVjZXJfaW5kZXggPSAwO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5mcmVlX21hcFtmcmVlX2luZGV4XSA9IGluZGV4O1xuIFxuIFx0bWIoKTtcbiBcbi1cdGF0b21pY19kZWMoXHUwMDI2KGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmF2YWlsYWJsZSkpO1xuJiM0MztcdGF0b21pY19kZWMoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmF2YWlsYWJsZSk7XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gLyogZ2V0IHRoZSBjdXJyZW50IGJ1ZmZlciBvbiB0aGUgcnggcXVldWUgKi9cbi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICppYm12ZXRoX3J4cV9nZXRfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0dTY0IGNvcnJlbGF0b3IgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjtcbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcbiYjNDM7XHR1NjQgY29ycmVsYXRvciA9IHJ4cS1cdTAwM2VxdWV1ZV9hZGRyW3J4cS1cdTAwM2VpbmRleF0uY29ycmVsYXRvcjtcbiBcdHVuc2lnbmVkIGludCBwb29sID0gY29ycmVsYXRvciBcdTAwM2VcdTAwM2UgMzI7XG4gXHR1bnNpZ25lZCBpbnQgaW5kZXggPSBjb3JyZWxhdG9yIFx1MDAyNiAweGZmZmZmZmZmVUw7XG4gXG4tXHRpZiAoV0FSTl9PTihwb29sIFx1MDAzZT0gSUJNVkVUSF9OVU1fQlVGRl9QT09MUykgfHxcbi1cdCAgICBXQVJOX09OKGluZGV4IFx1MDAzZT0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZSkpIHtcbi1cdFx0c2NoZWR1bGVfd29yayhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuJiM0MztcdGlmICghaWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChhZGFwdGVyLCBxdWV1ZV9pbmRleCwgY29ycmVsYXRvcikpXG4gXHRcdHJldHVybiBOVUxMO1xuLVx0fVxuIFxuLVx0cmV0dXJuIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNrYnVmZltpbmRleF07XG4mIzQzO1x0cmV0dXJuIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5za2J1ZmZbaW5kZXhdO1xuIH1cbiBcbiAvKipcbkBAIC01MzMsMjQgJiM0MzsxMzY4LDY5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhXG4gICogKiBvdGhlciAtIG5vbi16ZXJvIHJldHVybiBmcm9tIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2xcbiAgKi9cbiBzdGF0aWMgaW50IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4tXHRcdFx0XHQgICAgICBib29sIHJldXNlKVxuJiM0MztcdFx0XHRcdCAgICAgIGludCBxdWV1ZV9pbmRleCwgYm9vbCByZXVzZSlcbiB7XG4mIzQzO1x0c3RydWN0IGlibXZldGhfcnhfcSAqcnhxID0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF07XG4gXHR1NjQgY29yO1xuIFx0aW50IHJjO1xuIFxuLVx0Y29yID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItXHUwMDNlcnhfcXVldWUuaW5kZXhdLmNvcnJlbGF0b3I7XG4tXHRyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCByZXVzZSk7XG4tXHRpZiAodW5saWtlbHkocmMpKVxuJiM0MztcdGNvciA9IHJ4cS1cdTAwM2VxdWV1ZV9hZGRyW3J4cS1cdTAwM2VpbmRleF0uY29ycmVsYXRvcjtcbiYjNDM7XHRyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCBxdWV1ZV9pbmRleCwgcmV1c2UpO1xuJiM0MztcdGlmICh1bmxpa2VseShyYykpIHtcbiYjNDM7XHRcdGlmIChyYyA9PSAtRUlOVkFMIHx8IHJjID09IC1FRkFVTFQpXG4mIzQzO1x0XHRcdGdvdG8gYWR2YW5jZTtcbiBcdFx0cmV0dXJuIHJjO1xuLVxuLVx0aWYgKCYjNDM7JiM0MzthZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4ID09IGFkYXB0ZXItXHUwMDNlcnhfcXVldWUubnVtX3Nsb3RzKSB7XG4tXHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUuaW5kZXggPSAwO1xuLVx0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnRvZ2dsZSA9ICFhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnRvZ2dsZTtcbiBcdH1cbiBcbiYjNDM7YWR2YW5jZTpcbiYjNDM7XHRpYm12ZXRoX3J4cV9hZHZhbmNlKHJ4cSk7XG4mIzQzO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZSAtIERyYWluIHBlbmRpbmcgYnVmZmVycyBmcm9tIGFuIFJYIHF1ZXVlXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBxdWV1ZV9pbmRleDogUXVldWUgaW5kZXggdG8gZHJhaW5cbiYjNDM7ICpcbiYjNDM7ICogUmVjeWNsZXMgYWxsIHBlbmRpbmcgYnVmZmVycyBiYWNrIHRvIHRoZSBwZXItcXVldWUgYnVmZmVyIHBvb2xzLlxuJiM0MzsgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIE5BUEkgZGlzYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogTnVtYmVyIG9mIGJ1ZmZlcnMgZHJhaW5lZFxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludFxuJiM0MztpYm12ZXRoX2RyYWluX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHRpbnQgZHJhaW5lZCA9IDA7XG4mIzQzO1x0aW50IGxpbWl0ID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF0ubnVtX3Nsb3RzO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O0RyYWluaW5nIFJYIHF1ZXVlICVkIChsaW1pdDogJWQgc2xvdHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgcXVldWVfaW5kZXgsIGxpbWl0KTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGRyYWluZWQgXHUwMDNjIGxpbWl0IFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICBpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCkpIHtcbiYjNDM7XHRcdHJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsIHRydWUpO1xuJiM0MztcdFx0aWYgKHJjKSB7XG4mIzQzO1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuJiM0MztcdFx0XHRcdCAgIFwmIzM0O0ZhaWxlZCB0byBoYXJ2ZXN0IGJ1ZmZlciBmcm9tIHF1ZXVlICVkIGR1cmluZyBkcmFpbjogJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgcXVldWVfaW5kZXgsIHJjKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRkcmFpbmVkJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChkcmFpbmVkIFx1MDAzZSAwKVxuJiM0MztcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O0RyYWluZWQgJWQgYnVmZmVyKHMpIGZyb20gUlggcXVldWUgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIGRyYWluZWQsIHF1ZXVlX2luZGV4KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7Tm8gYnVmZmVycyB0byBkcmFpbiBmcm9tIFJYIHF1ZXVlICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBxdWV1ZV9pbmRleCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBkcmFpbmVkO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIGlibXZldGhfZnJlZV90eF9sdGIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IGlkeClcbiB7XG4gXHRkbWFfdW5tYXBfc2luZ2xlKFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXYsIGFkYXB0ZXItXHUwMDNldHhfbHRiX2RtYVtpZHhdLFxuQEAgLTU3NCwyNDYgJiM0MzsxNDU0LDY2OCBAQCBzdGF0aWMgaW50IGlibXZldGhfYWxsb2NhdGVfdHhfbHRiKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZHgpXG4gXHRcdFx0XHRcdFx0ICBETUFfVE9fREVWSUNFKTtcbiBcdGlmIChkbWFfbWFwcGluZ19lcnJvcihcdTAwMjZhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNlZGV2LCBhZGFwdGVyLVx1MDAzZXR4X2x0Yl9kbWFbaWR4XSkpIHtcbiBcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbi1cdFx0XHQgICBcJiMzNDt1bmFibGUgdG8gRE1BIG1hcCB0eCBsb25nIHRlcm0gYnVmZmVyXFxuXCYjMzQ7KTtcbi1cdFx0a2ZyZWUoYWRhcHRlci1cdTAwM2V0eF9sdGJfcHRyW2lkeF0pO1xuLVx0XHRhZGFwdGVyLVx1MDAzZXR4X2x0Yl9wdHJbaWR4XSA9IE5VTEw7XG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0XHQgICBcJiMzNDt1bmFibGUgdG8gRE1BIG1hcCB0eCBsb25nIHRlcm0gYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdGtmcmVlKGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltpZHhdKTtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltpZHhdID0gTlVMTDtcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3R4X3Jlc291cmNlcyAtIEFsbG9jYXRlIFRYIHJlc291cmNlcyBmb3IgYWxsIHF1ZXVlc1xuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBBbGxvY2F0ZXMgVFggTG9uZyBUZXJtIEJ1ZmZlcnMgKExUQnMpIGZvciBhbGwgVFggcXVldWVzLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBmYWlsdXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO2libXZldGhfYWxsb2NfdHhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoaWJtdmV0aF9hbGxvY2F0ZV90eF9sdGIoYWRhcHRlciwgaSkpXG4mIzQzO1x0XHRcdGdvdG8gZXJyX2ZyZWVfbHRicztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2ZyZWVfbHRiczpcbiYjNDM7XHR3aGlsZSAoLS1pIFx1MDAzZT0gMClcbiYjNDM7XHRcdGlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7XG4mIzQzO1x0cmV0dXJuIC1FTk9NRU07XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzIC0gRnJlZSBUWCByZXNvdXJjZXMgZm9yIGFsbCBxdWV1ZXNcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogRnJlZXMgVFggTG9uZyBUZXJtIEJ1ZmZlcnMgKExUQnMpIGZvciBhbGwgVFggcXVldWVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWRcbiYjNDM7aWJtdmV0aF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuZXRkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdFx0dW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYyxcbiYjNDM7XHRcdFx0XHRcdHU2NCBtYWNfYWRkcmVzcylcbiYjNDM7e1xuJiM0MztcdGludCByYywgdHJ5X2FnYWluID0gMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBZnRlciBhIGtleGVjIHRoZSBhZGFwdGVyIHdpbGwgc3RpbGwgYmUgb3Blbiwgc28gb3VyIGF0dGVtcHQgdG9cbiYjNDM7XHQgKiBvcGVuIGl0IHdpbGwgZmFpbC4gU28gaWYgd2UgZ2V0IGEgZmFpbHVyZSB3ZSBmcmVlIHRoZSBhZGFwdGVyIGFuZFxuJiM0MztcdCAqIHRyeSBhZ2FpbiwgYnV0IG9ubHkgb25jZS5cbiYjNDM7XHQgKi9cbiYjNDM7cmV0cnk6XG4mIzQzO1x0LyogSW4gbXVsdGktcXVldWUgbW9kZSwgb2J0YWluIGEgcXVldWUgaGFuZGxlIGZvciBxdWV1ZSAwIHNvIGFsbCBSWFxuJiM0MztcdCAqIHF1ZXVlcyBjYW4gdXNlIHRoZSBzYW1lIHBlci1xdWV1ZSBidWZmZXIgaHlwZXJjYWxscy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSkge1xuJiM0MztcdFx0cmMgPSBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3dpdGhfaGFuZGxlKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbMF0sXG4mIzQzO1x0XHRcdFx0XHRcdFx0cnhxX2Rlc2MuZGVzYyxcbiYjNDM7XHRcdFx0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSxcbiYjNDM7XHRcdFx0XHRcdFx0XHRtYWNfYWRkcmVzcyxcbiYjNDM7XHRcdFx0XHRcdFx0XHRcdTAwMjZhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVswXSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJjID0gaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hWzBdLFxuJiM0MztcdFx0XHRcdFx0ICAgIHJ4cV9kZXNjLmRlc2MsXG4mIzQzO1x0XHRcdFx0XHQgICAgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEsXG4mIzQzO1x0XHRcdFx0XHQgICAgbWFjX2FkZHJlc3MpO1xuJiM0MztcdH1cbiYjNDM7XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLnJlZ19sYW4mIzQzOyYjNDM7O1xuJiM0MztcbiYjNDM7XHRpZiAocmMgIT0gSF9TVUNDRVNTIFx1MDAyNlx1MDAyNiB0cnlfYWdhaW4pIHtcbiYjNDM7XHRcdGRvIHtcbiYjNDM7XHRcdFx0cmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMuZnJlZV9sYW4mIzQzOyYjNDM7O1xuJiM0MztcdFx0fSB3aGlsZSAoSF9JU19MT05HX0JVU1kocmMpIHx8IChyYyA9PSBIX0JVU1kpKTtcbiYjNDM7XG4mIzQzO1x0XHR0cnlfYWdhaW4gPSAwO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWUgLSBSZWdpc3RlciBzdWJvcmRpbmF0ZSBxdWV1ZSB3aXRoIGh5cGVydmlzb3JcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbiYjNDM7ICogQHJ4cV9kZXNjOiBSZWNlaXZlIHF1ZXVlIGRlc2NyaXB0b3JcbiYjNDM7ICogQHF1ZXVlX2luZGV4OiBSWCBxdWV1ZSBpbmRleCAoMS4uTiBmb3Igc3Vib3JkaW5hdGUgcXVldWVzKVxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgYSBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlIHVzaW5nIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFLlxuJiM0MzsgKiBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHF1ZXVlIGhhbmRsZSBhbmQgdmlydHVhbCBJUlEgaW4gdGhlIGFkYXB0ZXIuXG4mIzQzOyAqIFJldHJpZXMgb25jZSBpZiByZWdpc3RyYXRpb24gZmFpbHMgKGhhbmRsZXMga2V4ZWMgY2FzZSkuICBJZiBJUlEgbWFwcGluZ1xuJiM0MzsgKiBmYWlscyBhZnRlciBhIHN1Y2Nlc3NmdWwgaHlwZXJ2aXNvciByZWdpc3RyYXRpb24sIHRoZSBxdWV1ZSBpcyBmcmVlZFxuJiM0MzsgKiBiZWZvcmUgcmV0dXJuaW5nLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IEhfU1VDQ0VTUyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBJUlEgbWFwcGluZyBmYWlsdXJlLFxuJiM0MzsgKiAgICAgICAgIGh5cGVydmlzb3IgZXJyb3IgY29kZSBvdGhlcndpc2VcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7aWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdCAgIHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2MsXG4mIzQzO1x0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBoYW5kbGUsIGh3aXJxO1xuJiM0MztcdHVuc2lnbmVkIGludCB2aXJxO1xuJiM0MztcdGxvbmcgbHBhcl9yYztcbiYjNDM7XHRpbnQgdHJ5X2FnYWluID0gMTtcbiYjNDM7XG4mIzQzO3JldHJ5OlxuJiM0MztcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4mIzQzO1x0XHQgICBcJiMzNDtBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHF1ZXVlICVkOiB1bml0X2FkZHI9MHgleCBidWZmZXJfbGlzdF9kbWE9MHglbGx4IHJ4cV9kZXNjPTB4JWxseFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pbmRleF0sXG4mIzQzO1x0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4cV9kZXNjLmRlc2MpO1xuJiM0MztcbiYjNDM7XHRscGFyX3JjID0gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbiYjNDM7XHRcdFx0XHRcdCAgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLFxuJiM0MztcdFx0XHRcdFx0ICByeHFfZGVzYy5kZXNjLCBcdTAwMjZoYW5kbGUsIFx1MDAyNmh3aXJxKTtcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLnJlZ19sYW5fcXVldWUmIzQzOyYjNDM7O1xuJiM0MztcbiYjNDM7XHRpZiAobHBhcl9yYyA9PSBIX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdHZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdpcnEpO1xuJiM0MztcdFx0aWYgKCF2aXJxKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgZnJlZV9yYztcbiYjNDM7XG4mIzQzO1x0XHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7RmFpbGVkIHRvIG1hcCBJUlEgZm9yIHF1ZXVlICVkIChod2lycT0lbHUpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIHF1ZXVlX2luZGV4LCBod2lycSk7XG4mIzQzO1x0XHRcdGRvIHtcbiYjNDM7XHRcdFx0XHRmcmVlX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHQgICBoYW5kbGUpO1xuJiM0MztcdFx0XHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShmcmVlX3JjKSB8fCAoZnJlZV9yYyA9PSBIX0JVU1kpKTtcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdGlmIChmcmVlX3JjICE9IEhfU1VDQ0VTUylcbiYjNDM7XHRcdFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHRcdFx0ICAgXCYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIGZhaWxlZCBmb3IgcXVldWUgJWQgYWZ0ZXIgSVJRIG1hcCBmYWlsdXJlOiByYz0weCVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgIHF1ZXVlX2luZGV4LCBmcmVlX3JjKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaW5kZXhdID0gaGFuZGxlO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaW5kZXhdID0gdmlycTtcbiYjNDM7XG4mIzQzO1x0XHRuZXRkZXZfZGJnKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHQgICBcJiMzNDtxdWV1ZSAlZCByZWdpc3RlcmVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItXHUwMDNlcXVldWVfaGFuZGxlW3F1ZXVlX2luZGV4XSxcbiYjNDM7XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaW5kZXhdKTtcbiYjNDM7XHRcdHJldHVybiBIX1NVQ0NFU1M7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobHBhcl9yYyA9PSBIX0ZVTkNUSU9OKSB7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSkge1xuJiM0MztcdFx0XHRuZXRkZXZfaW5mbyhhZGFwdGVyLVx1MDAzZW5ldGRldixcbiYjNDM7XHRcdFx0XHQgICAgXCYjMzQ7TXVsdGkgcXVldWUgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGZpcm13YXJlLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIHF1ZXVlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSA9IDA7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0XHRcdCAgIFwmIzM0O1VuZXhwZWN0ZWQgSF9GVU5DVElPTiBmb3IgcXVldWUgJWQgcmVnaXN0cmF0aW9uIChNUSBtb2RlIGFscmVhZHkgZGlzYWJsZWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIHF1ZXVlX2luZGV4KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHJldHVybiBscGFyX3JjO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHRyeV9hZ2Fpbikge1xuJiM0MztcdFx0dHJ5X2FnYWluID0gMDtcbiYjNDM7XHRcdGdvdG8gcmV0cnk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuJiM0MztcdFx0ICAgXCYjMzQ7aF9yZWdfbG9naWNhbF9sYW5fcXVldWUgZmFpbGVkIHdpdGggJWxkIGFmdGVyIHJldHJ5XFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgbHBhcl9yYyk7XG4mIzQzO1x0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbiYjNDM7XHRcdCAgIFwmIzM0O3F1ZXVlICVkIHBhcmFtczogdW5pdF9hZGRyPTB4JXggYnVmZmVyX2xpc3RfZG1hPTB4JWxseCByeHFfZGVzYz0weCVsbHhcXG5cJiMzNDssXG4mIzQzO1x0XHQgICBxdWV1ZV9pbmRleCwgYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbiYjNDM7XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLFxuJiM0MztcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZGVzYy5kZXNjKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGxwYXJfcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZSAtIFJlZ2lzdGVyIG9uZSBzdWJvcmRpbmF0ZSBSWCBxdWV1ZVxuJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuJiM0MzsgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byByZWdpc3RlciAoMS4uTilcbiYjNDM7ICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzcyAodW51c2VkOyByZXNlcnZlZCBmb3IgQVBJIHN5bW1ldHJ5KVxuJiM0MzsgKlxuJiM0MzsgKiBCdWlsZHMgdGhlIHF1ZXVlIGRlc2NyaXB0b3IgYW5kIHJlZ2lzdGVycyB3aXRoIHRoZSBoeXBlcnZpc29yIHZpYVxuJiM0MzsgKiBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBxdWV1ZV9pZHggaXMgaW52YWxpZCwgLUVJTyBvbiBmYWlsdXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO2libXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4mIzQzO1x0XHRcdFx0IGludCBxdWV1ZV9pZHgsIHU2NCBtYWNfYWRkcmVzcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjO1xuJiM0MztcdGxvbmcgbHBhcl9yYztcbiYjNDM7XG4mIzQzO1x0KHZvaWQpbWFjX2FkZHJlc3M7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OKHF1ZXVlX2lkeCBcdTAwM2MgMSB8fCBxdWV1ZV9pZHggXHUwMDNlPSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHJ4cV9kZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBJQk1WRVRIX0JVRl9WQUxJRCB8XG4mIzQzO1x0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW47XG4mIzQzO1x0cnhxX2Rlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hO1xuJiM0MztcbiYjNDM7XHRscGFyX3JjID0gaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLCByeHFfZGVzYyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBxdWV1ZV9pZHgpO1xuJiM0MztcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O0ZhaWxlZCB0byByZWdpc3RlciBxdWV1ZSAlZDogcmM9MHglbHhcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIHF1ZXVlX2lkeCwgbHBhcl9yYyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtSZWdpc3RlcmVkIHF1ZXVlICVkIHdpdGggaGFuZGxlIDB4JWxseFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIHF1ZXVlX2lkeCwgYWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZSAtIERlcmVnaXN0ZXIgb25lIHN1Ym9yZGluYXRlIFJYIHF1ZXVlXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBxdWV1ZV9pZHg6IFF1ZXVlIGluZGV4IHRvIGRlcmVnaXN0ZXIgKDEuLk4pXG4mIzQzOyAqXG4mIzQzOyAqIERlcmVnaXN0ZXJzIGEgc2luZ2xlIHF1ZXVlIHZpYSBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgYW5kIGRpc3Bvc2VzXG4mIzQzOyAqIHRoZSBJUlEgbWFwcGluZyBmb3Igc3Vib3JkaW5hdGUgcXVldWVzLiBRdWV1ZSAwIGlzIGZyZWVkIG9ubHkgdGhyb3VnaFxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfYWxsX3F1ZXVlcygpIChIX0ZSRUVfTE9HSUNBTF9MQU4pLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWRcbiYjNDM7aWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdCAgIGludCBxdWV1ZV9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4mIzQzO1xuJiM0MztcdGlmICghYWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0bHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdKTtcbiYjNDM7XHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSYjNDM7JiM0Mzs7XG4mIzQzO1xuJiM0MztcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIGZhaWxlZCBmb3IgcXVldWUgJWQ6IHJjPTB4JWx4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBxdWV1ZV9pZHgsIGxwYXJfcmMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSA9IDA7XG4mIzQzO1xuJiM0MztcdGlmIChxdWV1ZV9pZHggXHUwMDNlIDAgXHUwMDI2XHUwMDI2IGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0pIHtcbiYjNDM7XHRcdGlycV9kaXNwb3NlX21hcHBpbmcoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSk7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdID0gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsIFwmIzM0O0RlcmVnaXN0ZXJlZCBxdWV1ZSAlZFxcblwmIzM0OywgcXVldWVfaWR4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlibXZldGhfcmVzaXplX3J4X3F1ZXVlc19pbmNyZW1lbnRhbCAtIFJlc2l6ZSBSWCBxdWV1ZSBjb3VudCBpbmNyZW1lbnRhbGx5XG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBuZXdfY291bnQ6IFRhcmdldCBudW1iZXIgb2YgUlggcXVldWVzXG4mIzQzOyAqIEByeHFfZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgcGVyIFJYIHF1ZXVlXG4mIzQzOyAqXG4mIzQzOyAqIEFkZHMgb3IgcmVtb3ZlcyBSWCBxdWV1ZXMgd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGVudGlyZSBhZGFwdGVyLlxuJiM0MzsgKiBBY3RpdmUgcXVldWVzIGNvbnRpbnVlIHJlY2VpdmluZyBkdXJpbmcgc2NhbGUtdXA7IHNjYWxlLWRvd24gZHJhaW5zXG4mIzQzOyAqIGV4Y2VzcyBxdWV1ZXMgYmVmb3JlIGRlcmVnaXN0ZXJpbmcgdGhlbSB3aXRoIHRoZSBoeXBlcnZpc29yLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO2libXZldGhfcmVzaXplX3J4X3F1ZXVlc19pbmNyZW1lbnRhbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdCAgICAgaW50IG5ld19jb3VudCwgaW50IHJ4cV9lbnRyaWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuJiM0MztcdHU2NCBtYWNfYWRkcmVzcyA9IGV0aGVyX2FkZHJfdG9fdTY0KG5ldGRldi1cdTAwM2VkZXZfYWRkcik7XG4mIzQzO1x0aW50IG9sZF9jb3VudCA9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcztcbiYjNDM7XHRpbnQgZmFpbGVkX3F1ZXVlO1xuJiM0MztcdGludCByYywgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKG9sZF9jb3VudCA9PSBuZXdfY291bnQpIHtcbiYjNDM7XHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtSWCBxdWV1ZSBjb3VudCB1bmNoYW5nZWQgKCVkKSwgbm90aGluZyB0byBkb1xcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgb2xkX2NvdW50KTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG5ld19jb3VudCBcdTAwM2MgMSB8fCBuZXdfY291bnQgXHUwMDNlIElCTVZFVEhfTUFYX1JYX1FVRVVFUykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O0ludmFsaWQgUlggcXVldWUgY291bnQgJWQgKG11c3QgYmUgMS0lZClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIG5ld19jb3VudCwgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2luZm8obmV0ZGV2LCBcJiMzNDtJbmNyZW1lbnRhbGx5IHJlc2l6aW5nIFJYIHF1ZXVlczogJWQgdG8gJWRcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgb2xkX2NvdW50LCBuZXdfY291bnQpO1xuJiM0MztcbiYjNDM7XHRpZiAobmV3X2NvdW50IFx1MDAzZSBvbGRfY291bnQpIHtcbiYjNDM7XHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtTY2FsZS11cDogYWRkaW5nIHF1ZXVlcyAlZC0lZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgb2xkX2NvdW50LCBuZXdfY291bnQgLSAxKTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIG5ld19jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0cmMgPSBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpLCByeHFfZW50cmllcyk7XG4mIzQzO1x0XHRcdGlmIChyYykge1xuJiM0MztcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDtGYWlsZWQgdG8gYWxsb2NhdGUgcXVldWUgJWQ6ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgaSwgcmMpO1xuJiM0MztcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHRyYyA9IGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGksXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICAgbWFjX2FkZHJlc3MpO1xuJiM0MztcdFx0XHRpZiAocmMpIHtcbiYjNDM7XHRcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7RmFpbGVkIHRvIHJlZ2lzdGVyIHF1ZXVlICVkOiAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgIGksIHJjKTtcbiYjNDM7XHRcdFx0XHRpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHRyYyA9IGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0aWYgKHJjKSB7XG4mIzQzO1x0XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4mIzQzO1x0XHRcdFx0XHQgICBcJiMzNDtGYWlsZWQgdG8gc2V0dXAgSVJRIGZvciBxdWV1ZSAlZDogJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICBpLCByYyk7XG4mIzQzO1x0XHRcdFx0aWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0XHRpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHRyYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0aWYgKHJjKSB7XG4mIzQzO1x0XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4mIzQzO1x0XHRcdFx0XHQgICBcJiMzNDtGYWlsZWQgdG8gZW5hYmxlIElSUSBmb3IgcXVldWUgJWQ6ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgaSwgcmMpO1xuJiM0MztcdFx0XHRcdGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRcdGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XG4mIzQzO1x0XHRcdFx0aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0XHRnb3RvIGNsZWFudXBfbmV3X3F1ZXVlcztcbiYjNDM7XHRcdFx0fVxuJiM0MztcbiYjNDM7XHRcdFx0bmFwaV9lbmFibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSBuZXdfY291bnQ7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gb2xkX2NvdW50OyBpIFx1MDAzYyBuZXdfY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpO1xuJiM0MztcbiYjNDM7XHRcdHJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIG5ld19jb3VudCk7XG4mIzQzO1x0XHRpZiAocmMpIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O0ZhaWxlZCB0byBzZXQgcmVhbCBSWCBxdWV1ZXMgdG8gJWQ6ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIG5ld19jb3VudCwgcmMpO1xuJiM0MztcdFx0XHRnb3RvIGNsZWFudXBfbmV3X3F1ZXVlcztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O1NjYWxlLWRvd246IHJlbW92aW5nIHF1ZXVlcyAlZC0lZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgbmV3X2NvdW50LCBvbGRfY291bnQgLSAxKTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSBuZXdfY291bnQ7IGkgXHUwMDNjIG9sZF9jb3VudDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdG5hcGlfZGlzYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcdTAwM2Mgb2xkX2NvdW50OyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbiYjNDM7XG4mIzQzO1x0XHRzeW5jaHJvbml6ZV9uZXQoKTtcbiYjNDM7XG4mIzQzO1x0XHRyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBuZXdfY291bnQpO1xuJiM0MztcdFx0aWYgKHJjKSB7XG4mIzQzO1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDtGYWlsZWQgdG8gc2V0IHJlYWwgUlggcXVldWVzIHRvICVkOiAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBuZXdfY291bnQsIHJjKTtcbiYjNDM7XHRcdFx0Zm9yIChpID0gbmV3X2NvdW50OyBpIFx1MDAzYyBvbGRfY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdG5hcGlfZW5hYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBEaXNhYmxlIGh5cGVydmlzb3IgaW50ZXJydXB0cyBhbmQgd2FpdCBmb3IgaGFuZGxlcnMgdG8gY29tcGxldGVcbiYjNDM7XHRcdCAqIGJlZm9yZSB1cGRhdGluZyBudW1fcnhfcXVldWVzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRmb3IgKGkgPSBuZXdfY291bnQ7IGkgXHUwMDNjIG9sZF9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0c3luY2hyb25pemVfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSBuZXdfY291bnQ7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gbmV3X2NvdW50OyBpIFx1MDAzYyBvbGRfY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0XHRpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2luZm8obmV0ZGV2LCBcJiMzNDtTdWNjZXNzZnVsbHkgcmVzaXplZCB0byAlZCBSWCBxdWV1ZXMgKGluY3JlbWVudGFsKVxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9DTU8pKVxuJiM0MztcdFx0dmlvX2Ntb19zZXRfZGV2X2Rlc2lyZWQoYWRhcHRlci1cdTAwM2V2ZGV2LFxuJiM0MztcdFx0XHRcdFx0aWJtdmV0aF9nZXRfZGVzaXJlZF9kbWEoYWRhcHRlci1cdTAwM2V2ZGV2KSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9uZXdfcXVldWVzOlxuJiM0MztcdGZhaWxlZF9xdWV1ZSA9IGk7XG4mIzQzO1x0bmV0ZGV2X2VycihuZXRkZXYsXG4mIzQzO1x0XHQgICBcJiMzNDtTY2FsZS11cCBmYWlsZWQgYXQgcXVldWUgJWQsIGNsZWFuaW5nIHVwIHF1ZXVlcyAlZC0lZFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgIGZhaWxlZF9xdWV1ZSwgb2xkX2NvdW50LCBmYWlsZWRfcXVldWUgLSAxKTtcbiYjNDM7XHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRuYXBpX2Rpc2FibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gb2xkX2NvdW50OyBpIFx1MDAzYyBmYWlsZWRfcXVldWU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbiYjNDM7XG4mIzQzO1x0c3luY2hyb25pemVfbmV0KCk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IG9sZF9jb3VudDsgaSBcdTAwM2MgZmFpbGVkX3F1ZXVlOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdHN5bmNocm9uaXplX2lycShhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KGFkYXB0ZXIsIGkpO1xuJiM0MztcdFx0aWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XG4mIzQzO1x0fVxuJiM0MztcdGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG9sZF9jb3VudDtcbiYjNDM7XHRuZXRkZXZfd2FybihuZXRkZXYsIFwmIzM0O0tlZXBpbmcgJWQgcXVldWVzIGFmdGVyIHNjYWxlLXVwIGZhaWx1cmVcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgb2xkX2NvdW50KTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBpYm12ZXRoX2ZyZWVfYWxsX3F1ZXVlcyAtIEZyZWUgYWxsIFJYIHF1ZXVlcyBhdCBvbmNlXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqXG4mIzQzOyAqIFVzZXMgSF9GUkVFX0xPR0lDQUxfTEFOIHRvIGZyZWUgYWxsIHF1ZXVlcyBpbiBvbmUgaHlwZXJjYWxsLlxuJiM0MzsgKiBVc2VkIGR1cmluZyBpbnRlcmZhY2UgY2xvc2UgYW5kIHJlZ2lzdHJhdGlvbiBlcnJvciBjbGVhbnVwLlxuJiM0MzsgKlxuJiM0MzsgKiBDbGVhcnMgcXVldWUgaGFuZGxlcyBvbmx5OyBxdWV1ZV9pcnFbXSBpcyByZWxlYXNlZCBieVxuJiM0MzsgKiBpYm12ZXRoX2NsZWFudXBfcnhfaW50ZXJydXB0cygpIG9uIGNsb3NlLCBvciBieVxuJiM0MzsgKiBpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKCkgb24gcGFydGlhbCByZWdpc3RlciBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCYjMzQ7ZnJlZWluZyBhbGwgUlggcXVldWVzIGF0IG9uY2VcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MpO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5mcmVlX2xhbiYjNDM7JiM0Mzs7XG4mIzQzO1x0fSB3aGlsZSAoSF9JU19MT05HX0JVU1kobHBhcl9yYykgfHwgKGxwYXJfcmMgPT0gSF9CVVNZKSk7XG4mIzQzO1xuJiM0MztcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZDogJWxkXFxuXCYjMzQ7LCBscGFyX3JjKTtcbiBcdH1cbiBcbi1cdHJldHVybiAwO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtpXSA9IDA7XG4gfVxuIFxuLXN0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuLSAgICAgICAgdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYywgdTY0IG1hY19hZGRyZXNzKVxuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXMgLSBSZWdpc3RlciBSWCBxdWV1ZXMgd2l0aCBoeXBlcnZpc29yXG4mIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4mIzQzOyAqIEBtYWNfYWRkcmVzczogTUFDIGFkZHJlc3MgZm9yIGRldmljZSByZWdpc3RyYXRpb25cbiYjNDM7ICpcbiYjNDM7ICogUmVnaXN0ZXJzIHF1ZXVlIDAgdmlhIGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oKSwgdGhlbiBzdWJvcmRpbmF0ZVxuJiM0MzsgKiBxdWV1ZXMgMS4uTiB3aGVuIG11bHRpLXF1ZXVlIG1vZGUgaXMgZW5hYmxlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9ORVQgaWYgcXVldWUgMCByZWdpc3RyYXRpb24gZmFpbHMsIC1FSU8gb25cbiYjNDM7ICogICAgICAgICBzdWJvcmRpbmF0ZSBxdWV1ZSByZWdpc3RyYXRpb24gZmFpbHVyZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludFxuJiM0MztpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCB1NjQgbWFjX2FkZHJlc3MpXG4ge1xuLVx0aW50IHJjLCB0cnlfYWdhaW4gPSAxO1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcbiYjNDM7XHRpbnQgaSwgcmM7XG4gXG4tXHQvKlxuLVx0ICogQWZ0ZXIgYSBrZXhlYyB0aGUgYWRhcHRlciB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIG91ciBhdHRlbXB0IHRvXG4tXHQgKiBvcGVuIGl0IHdpbGwgZmFpbC4gU28gaWYgd2UgZ2V0IGEgZmFpbHVyZSB3ZSBmcmVlIHRoZSBhZGFwdGVyIGFuZFxuLVx0ICogdHJ5IGFnYWluLCBidXQgb25seSBvbmNlLlxuLVx0ICovXG4tcmV0cnk6XG4tXHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbi1cdFx0XHRcdCAgICBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYSwgcnhxX2Rlc2MuZGVzYyxcbi1cdFx0XHRcdCAgICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSwgbWFjX2FkZHJlc3MpO1xuJiM0MztcdHJ4cV9kZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBJQk1WRVRIX0JVRl9WQUxJRCB8XG4mIzQzO1x0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbMF0ucXVldWVfbGVuO1xuJiM0MztcdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9kbWE7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbMF0gPSBuZXRkZXYtXHUwMDNlaXJxO1xuIFxuLVx0aWYgKHJjICE9IEhfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgdHJ5X2FnYWluKSB7XG4tXHRcdGRvIHtcbi1cdFx0XHRyYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzKTtcbi1cdFx0fSB3aGlsZSAoSF9JU19MT05HX0JVU1kocmMpIHx8IChyYyA9PSBIX0JVU1kpKTtcbiYjNDM7XHRyYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgMCk7XG4mIzQzO1x0aWYgKHJjICE9IEhfU1VDQ0VTUylcbiYjNDM7XHRcdG5ldGRldl9kYmcobmV0ZGV2LFxuJiM0MztcdFx0XHQgICBcJiMzNDtGYWlsZWQgdG8gZGlzYWJsZSBJUlEgZm9yIHF1ZXVlIDAgYmVmb3JlIHJlZ2lzdHJhdGlvbiwgcmM9JWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgIHJjKTtcbiBcbi1cdFx0dHJ5X2FnYWluID0gMDtcbi1cdFx0Z290byByZXRyeTtcbiYjNDM7XHRscGFyX3JjID0gaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLCByeHFfZGVzYywgbWFjX2FkZHJlc3MpO1xuJiM0MztcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O2hfcmVnaXN0ZXJfbG9naWNhbF9sYW4gZmFpbGVkOiAlbGRcXG5cJiMzNDssIGxwYXJfcmMpO1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4mIzQzO1x0XHRcdCAgIFwmIzM0O2J1ZmZlciBUQ0U6MHglbGx4IGZpbHRlciBUQ0U6MHglbGx4IHJ4cSBkZXNjOjB4JWxseCBNQUM6MHglbGx4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVswXSxcbiYjNDM7XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEsXG4mIzQzO1x0XHRcdCAgIHJ4cV9kZXNjLmRlc2MsIG1hY19hZGRyZXNzKTtcbiYjNDM7XHRcdHJldHVybiAtRU5PTkVUO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyA9PSAxIHx8ICFhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKSB7XG4mIzQzO1x0XHRuZXRkZXZfZGJnKG5ldGRldixcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7cmVnaXN0ZXJlZCAxIFJYIHF1ZXVlIHdpdGggaHlwZXJ2aXNvciAoc2luZ2xlLXF1ZXVlIG1vZGUpXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O1JlZ2lzdGVyaW5nICVkIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMS0lZClcXG5cJiMzNDssXG4mIzQzO1x0XHQgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgLSAxLCBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMTsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cmMgPSBpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpLCBtYWNfYWRkcmVzcyk7XG4mIzQzO1x0XHRpZiAocmMpIHtcbiYjNDM7XHRcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtpXSB8fCAhYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pIHtcbiYjNDM7XHRcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0XHRcdCAgIFwmIzM0O0ludmFsaWQgaHlwZXJ2aXNvciByZXR1cm4gZm9yIHF1ZXVlICVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgIGksIGFkYXB0ZXItXHUwMDNlcXVldWVfaGFuZGxlW2ldLFxuJiM0MztcdFx0XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGdvdG8gZXJyX3VucmVnaXN0ZXI7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4mIzQzO1x0bmV0ZGV2X2RiZyhuZXRkZXYsXG4mIzQzO1x0XHQgICBcJiMzNDtyZWdpc3RlcmVkICVkIFJYIHF1ZXVlcyB3aXRoIGh5cGVydmlzb3IgKG11bHRpLXF1ZXVlIG1vZGUpXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJfdW5yZWdpc3RlcjpcbiYjNDM7XHRpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKGFkYXB0ZXIpO1xuJiM0MztcdGlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpO1xuIFx0cmV0dXJuIHJjO1xuIH1cbiBcbiBzdGF0aWMgaW50IGlibXZldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KVxuIHtcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuLVx0dTY0IG1hY19hZGRyZXNzO1xuJiM0MztcdHU2NCBtYWNfYWRkcmVzcyA9IGV0aGVyX2FkZHJfdG9fdTY0KG5ldGRldi1cdTAwM2VkZXZfYWRkcik7XG4gXHRpbnQgcnhxX2VudHJpZXMgPSAxO1xuLVx0dW5zaWduZWQgbG9uZyBscGFyX3JjO1xuIFx0aW50IHJjO1xuLVx0dW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYztcbiBcdGludCBpO1xuLVx0c3RydWN0IGRldmljZSAqZGV2O1xuIFxuIFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O29wZW4gc3RhcnRpbmdcXG5cJiMzNDspO1xuIFxuLVx0bmFwaV9lbmFibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpKTtcbi1cbi1cdGZvcihpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspXG4tXHRcdHJ4cV9lbnRyaWVzICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5zaXplO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0cnhxX2VudHJpZXMgJiM0Mzs9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLnNpemU7XG4gXG4tXHRyYyA9IC1FTk9NRU07XG4tXHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIgPSAodm9pZCopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbi1cdGlmICghYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyKSB7XG4tXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDt1bmFibGUgdG8gYWxsb2NhdGUgbGlzdCBwYWdlc1xcblwmIzM0Oyk7XG4mIzQzO1x0cmMgPSBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyhhZGFwdGVyKTtcbiYjNDM7XHRpZiAocmMpXG4gXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0YWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7dW5hYmxlIHRvIGFsbG9jYXRlIGZpbHRlciBwYWdlc1xcblwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X2ZyZWVfYnVmZmVyX2xpc3Q7XG4tXHR9XG4gXG4tXHRkZXYgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNlZGV2O1xuJiM0MztcdHJjID0gaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdChhZGFwdGVyKTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRnb3RvIG91dF9mcmVlX3J4X3FzdGF0cztcbiBcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfbGVuID0gc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpICpcbi1cdFx0XHRcdFx0XHRyeHFfZW50cmllcztcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkciA9XG4tXHRcdGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfbGVuLFxuLVx0XHRcdFx0ICAgXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9kbWEsIEdGUF9LRVJORUwpO1xuLVx0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIpXG4mIzQzO1x0cmMgPSBpYm12ZXRoX2FsbG9jX3J4X3F1ZXVlcyhhZGFwdGVyLCByeHFfZW50cmllcyk7XG4mIzQzO1x0aWYgKHJjKVxuIFx0XHRnb3RvIG91dF9mcmVlX2ZpbHRlcl9saXN0O1xuIFxuLVx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsXG4tXHRcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyLCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4tXHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYSkpIHtcbi1cdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O3VuYWJsZSB0byBtYXAgYnVmZmVyIGxpc3QgcGFnZXNcXG5cJiMzNDspO1xuJiM0MztcdHJjID0gaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbHMoYWRhcHRlcik7XG4mIzQzO1x0aWYgKHJjKVxuIFx0XHRnb3RvIG91dF9mcmVlX3F1ZXVlX21lbTtcbi1cdH1cbiBcbi1cdGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LFxuLVx0XHRcdGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkciwgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuLVx0aWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEpKSB7XG4tXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDt1bmFibGUgdG8gbWFwIGZpbHRlciBsaXN0IHBhZ2VzXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBvdXRfdW5tYXBfYnVmZmVyX2xpc3Q7XG4tXHR9XG4mIzQzO1x0cmMgPSBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyhhZGFwdGVyLCBtYWNfYWRkcmVzcyk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXRfZnJlZV9idWZmZXJfcG9vbHM7XG4gXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuZXRkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoaWJtdmV0aF9hbGxvY2F0ZV90eF9sdGIoYWRhcHRlciwgaSkpXG4tXHRcdFx0Z290byBvdXRfZnJlZV90eF9sdGI7XG4mIzQzO1x0cmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldGRldiwgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbiYjNDM7XHRpZiAocmMpIHtcbiYjNDM7XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDtmYWlsZWQgdG8gc2V0IG51bWJlciBvZiByeCBxdWV1ZXNcXG5cJiMzNDspO1xuJiM0MztcdFx0Z290byBvdXRfdW5yZWdpc3Rlcl9xdWV1ZXM7XG4gXHR9XG4gXG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4ID0gMDtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUubnVtX3Nsb3RzID0gcnhxX2VudHJpZXM7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnRvZ2dsZSA9IDE7XG4tXG4tXHRtYWNfYWRkcmVzcyA9IGV0aGVyX2FkZHJfdG9fdTY0KG5ldGRldi1cdTAwM2VkZXZfYWRkcik7XG4tXG4tXHRyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfFxuLVx0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbjtcbi1cdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9kbWE7XG4tXG4tXHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7YnVmZmVyIGxpc3QgQCAweCVwXFxuXCYjMzQ7LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIpO1xuLVx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwmIzM0O2ZpbHRlciBsaXN0IEAgMHglcFxcblwmIzM0OywgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKTtcbi1cdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtyZWNlaXZlIHEgICBAIDB4JXBcXG5cJiMzNDssIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcik7XG4tXG4tXHRoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTtcbi1cbi1cdGxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXIsIHJ4cV9kZXNjLCBtYWNfYWRkcmVzcyk7XG4tXG4tXHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcbi1cdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O2hfcmVnaXN0ZXJfbG9naWNhbF9sYW4gZmFpbGVkIHdpdGggJWxkXFxuXCYjMzQ7LFxuLVx0XHRcdCAgIGxwYXJfcmMpO1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7YnVmZmVyIFRDRToweCVsbHggZmlsdGVyIFRDRToweCVsbHggcnhxIFwmIzM0O1xuLVx0XHRcdCAgIFwmIzM0O2Rlc2M6MHglbGx4IE1BQzoweCVsbHhcXG5cJiMzNDssXG4tXHRcdFx0XHQgICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hLFxuLVx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSxcbi1cdFx0XHRcdCAgICAgcnhxX2Rlc2MuZGVzYyxcbi1cdFx0XHRcdCAgICAgbWFjX2FkZHJlc3MpO1xuLVx0XHRyYyA9IC1FTk9ORVQ7XG4tXHRcdGdvdG8gb3V0X3VubWFwX2ZpbHRlcl9saXN0O1xuLVx0fVxuJiM0MztcdHJjID0gaWJtdmV0aF9zZXR1cF9yeF9pbnRlcnJ1cHRzKGFkYXB0ZXIpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3VucmVnaXN0ZXJfcXVldWVzO1xuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldKSkge1xuLVx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcJiMzNDt1bmFibGUgdG8gYWxsb2MgcG9vbFxcblwmIzM0Oyk7XG4tXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMDtcbi1cdFx0XHRyYyA9IC1FTk9NRU07XG4tXHRcdFx0Z290byBvdXRfZnJlZV9idWZmZXJfcG9vbHM7XG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyBcdTAwM2UgMSkge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7aW5pdGlhbCByZXBsZW5pc2ggY3ljbGUgZm9yIHF1ZXVlICVkXFxuXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBpKTtcbiBcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7aW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcXG5cJiMzNDspO1xuJiM0MztcdFx0aWJtdmV0aF9pbnRlcnJ1cHQoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbMF0sIFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVswXSk7XG4gXHR9XG4gXG4tXHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7cmVnaXN0ZXJpbmcgaXJxIDB4JXhcXG5cJiMzNDssIG5ldGRldi1cdTAwM2VpcnEpO1xuLVx0cmMgPSByZXF1ZXN0X2lycShuZXRkZXYtXHUwMDNlaXJxLCBpYm12ZXRoX2ludGVycnVwdCwgMCwgbmV0ZGV2LVx1MDAzZW5hbWUsXG4tXHRcdFx0IG5ldGRldik7XG4tXHRpZiAocmMgIT0gMCkge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7dW5hYmxlIHRvIHJlcXVlc3QgaXJxIDB4JXgsIHJjICVkXFxuXCYjMzQ7LFxuLVx0XHRcdCAgIG5ldGRldi1cdTAwM2VpcnEsIHJjKTtcbi1cdFx0ZG8ge1xuLVx0XHRcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4tXHRcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpO1xuLVxuLVx0XHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcbi1cdH1cbi1cbi1cdHJjID0gLUVOT01FTTtcbiYjNDM7XHRyYyA9IGlibXZldGhfYWxsb2NfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X2NsZWFudXBfcnhfaW50ZXJydXB0cztcbiBcbi1cdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtpbml0aWFsIHJlcGxlbmlzaCBjeWNsZVxcblwmIzM0Oyk7XG4tXHRpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtXHUwMDNlaXJxLCBuZXRkZXYpO1xuJiM0MztcdHJjID0gaWJtdmV0aF9hbGxvY190eF9xc3RhdHMoYWRhcHRlcik7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXRfZnJlZV90eF9yZXNvdXJjZXM7XG4gXG4gXHRuZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKG5ldGRldik7XG4gXG4gXHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7b3BlbiBjb21wbGV0ZVxcblwmIzM0Oyk7XG4tXG4gXHRyZXR1cm4gMDtcbiBcbiYjNDM7b3V0X2NsZWFudXBfcnhfaW50ZXJydXB0czpcbiYjNDM7XHRpYm12ZXRoX2NsZWFudXBfcnhfaW50ZXJydXB0cyhhZGFwdGVyKTtcbiYjNDM7b3V0X2ZyZWVfdHhfcmVzb3VyY2VzOlxuJiM0MztcdGlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7XG4gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzOlxuLVx0d2hpbGUgKC0taSBcdTAwM2U9IDApIHtcbi1cdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcbi1cdFx0XHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlcixcbi1cdFx0XHRcdFx0XHQgXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0pO1xuLVx0fVxuLW91dF91bm1hcF9maWx0ZXJfbGlzdDpcbi1cdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSwgNDA5Nixcbi1cdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuLVxuLW91dF9mcmVlX3R4X2x0Yjpcbi1cdHdoaWxlICgtLWkgXHUwMDNlPSAwKSB7XG4tXHRcdGlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7XG4tXHR9XG4tXG4tb3V0X3VubWFwX2J1ZmZlcl9saXN0OlxuLVx0ZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCA0MDk2LFxuLVx0XHRcdCBETUFfQklESVJFQ1RJT05BTCk7XG4mIzQzO1x0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyhhZGFwdGVyKTtcbiYjNDM7b3V0X3VucmVnaXN0ZXJfcXVldWVzOlxuJiM0MztcdGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7XG4mIzQzO1x0aWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoYWRhcHRlcik7XG4gb3V0X2ZyZWVfcXVldWVfbWVtOlxuLVx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfZG1hKTtcbiYjNDM7XHRpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpO1xuIG91dF9mcmVlX2ZpbHRlcl9saXN0OlxuLVx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XG4tb3V0X2ZyZWVfYnVmZmVyX2xpc3Q6XG4tXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyKTtcbiYjNDM7XHRpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3QoYWRhcHRlcik7XG4mIzQzO291dF9mcmVlX3J4X3FzdGF0czpcbiYjNDM7XHRpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzKGFkYXB0ZXIpO1xuIG91dDpcbi1cdG5hcGlfZGlzYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGkpO1xuIFx0cmV0dXJuIHJjO1xuIH1cbiBcbiBzdGF0aWMgaW50IGlibXZldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldilcbiB7XG4gXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcbi1cdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4tXHRsb25nIGxwYXJfcmM7XG4gXHRpbnQgaTtcbiBcbiBcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtjbG9zZSBzdGFydGluZ1xcblwmIzM0Oyk7XG4gXG4tXHRuYXBpX2Rpc2FibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpKTtcbi1cbiBcdG5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpO1xuIFxuLVx0aF92aW9fc2lnbmFsKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsIFZJT19JUlFfRElTQUJMRSk7XG4tXG4tXHRkbyB7XG4tXHRcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4tXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcbi1cbi1cdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVseCwgXCYjMzQ7XG4tXHRcdFx0ICAgXCYjMzQ7Y29udGludWluZyB3aXRoIGNsb3NlXFxuXCYjMzQ7LCBscGFyX3JjKTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pIHtcbiYjNDM7XHRcdFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcbiYjNDM7XHRcdFx0c3luY2hyb25pemVfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKTtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbi1cdGZyZWVfaXJxKG5ldGRldi1cdTAwM2VpcnEsIG5ldGRldik7XG4tXG4mIzQzO1x0aWJtdmV0aF9mcmVlX3R4X3FzdGF0cyhhZGFwdGVyKTtcbiYjNDM7XHRpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpO1xuJiM0MztcdGlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKGFkYXB0ZXIpO1xuIFx0aWJtdmV0aF91cGRhdGVfcnhfbm9fYnVmZmVyKGFkYXB0ZXIpO1xuLVxuLVx0ZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCA0MDk2LFxuLVx0XHRcdCBETUFfQklESVJFQ1RJT05BTCk7XG4tXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyKTtcbi1cbi1cdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSwgNDA5Nixcbi1cdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuLVx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XG4tXG4tXHRkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfbGVuLFxuLVx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyLFxuLVx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9kbWEpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspXG4tXHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXG4tXHRcdFx0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsXG4tXHRcdFx0XHRcdFx0IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldKTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KVxuLVx0XHRpYm12ZXRoX2ZyZWVfdHhfbHRiKGFkYXB0ZXIsIGkpO1xuJiM0MztcdGlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpO1xuJiM0MztcdGlibXZldGhfZnJlZV9idWZmZXJfcG9vbHMoYWRhcHRlcik7XG4mIzQzO1x0aWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKTtcbiYjNDM7XHRpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3QoYWRhcHRlcik7XG4mIzQzO1x0aWJtdmV0aF9mcmVlX3J4X3FzdGF0cyhhZGFwdGVyKTtcbiBcbiBcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtjbG9zZSBjb21wbGV0ZVxcblwmIzM0Oyk7XG4gXG5AQCAtMTA3MywyMiAmIzQzOzIzNzUsMTA3IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBcdHJldHVybiByYzEgPyByYzEgOiByYzI7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9hZ2dyZWdhdGVfcnhfcXN0YXRzIC0gU3VtIHBlci1xdWV1ZSBSWCBzdGF0cyBpbnRvIGdsb2JhbHNcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlclxuJiM0MzsgKlxuJiM0MzsgKiBDb2xkIHBhdGggb25seSAoZXRodG9vbCkuIEtlZXBzIGxlZ2FjeSBnbG9iYWwgY291bnRlcnMgbWVhbmluZ2Z1bCBmb3JcbiYjNDM7ICogdG9vbHMgdGhhdCByZWFkIHRoZSBhZGFwdGVyLWxldmVsIGZpZWxkcyBpbiBpYm12ZXRoX3N0YXRzW10uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2FnZ3JlZ2F0ZV9yeF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHU2NCB0b3RhbF9pbnZhbGlkID0gMDtcbiYjNDM7XHR1NjQgdG90YWxfbGFyZ2UgPSAwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR0b3RhbF9pbnZhbGlkICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tpXS5pbnZhbGlkX2J1ZmZlcnM7XG4mIzQzO1x0XHR0b3RhbF9sYXJnZSAmIzQzOz0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbaV0ubGFyZ2VfcGFja2V0cztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfaW52YWxpZF9idWZmZXIgPSB0b3RhbF9pbnZhbGlkO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfbGFyZ2VfcGFja2V0cyA9IHRvdGFsX2xhcmdlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9hZ2dyZWdhdGVfdHhfcXN0YXRzIC0gU3VtIHBlci1xdWV1ZSBUWCBzdGF0cyBpbnRvIGdsb2JhbHNcbiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlclxuJiM0MzsgKlxuJiM0MzsgKiBDb2xkIHBhdGggb25seSAoZXRodG9vbCkuIEtlZXBzIGxlZ2FjeSBnbG9iYWwgY291bnRlcnMgbWVhbmluZ2Z1bCBmb3JcbiYjNDM7ICogdG9vbHMgdGhhdCByZWFkIHRoZSBhZGFwdGVyLWxldmVsIGZpZWxkcyBpbiBpYm12ZXRoX3N0YXRzW10uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHR1NjQgdG90YWxfbGFyZ2UgPSAwO1xuJiM0MztcdHU2NCB0b3RhbF9zZW5kX2ZhaWxlZCA9IDA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmICghYWRhcHRlci1cdTAwM2V0eF9xc3RhdHMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR0b3RhbF9sYXJnZSAmIzQzOz0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbaV0ubGFyZ2VfcGFja2V0cztcbiYjNDM7XHRcdHRvdGFsX3NlbmRfZmFpbGVkICYjNDM7PSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tpXS5zZW5kX2ZhaWx1cmVzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2V0eF9sYXJnZV9wYWNrZXRzID0gdG90YWxfbGFyZ2U7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2V0eF9zZW5kX2ZhaWxlZCA9IHRvdGFsX3NlbmRfZmFpbGVkO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIGlibXZldGhfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpXG4ge1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xuJiM0MztcdHU4ICpwID0gZGF0YTtcbiBcdGludCBpO1xuIFxuIFx0aWYgKHN0cmluZ3NldCAhPSBFVEhfU1NfU1RBVFMpXG4gXHRcdHJldHVybjtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7IGkmIzQzOyYjNDM7LCBkYXRhICYjNDM7PSBFVEhfR1NUUklOR19MRU4pXG4tXHRcdG1lbWNweShkYXRhLCBpYm12ZXRoX3N0YXRzW2ldLm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShpYm12ZXRoX3N0YXRzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdG1lbWNweShwLCBpYm12ZXRoX3N0YXRzW2ldLm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7XG4mIzQzO1x0XHRwICYjNDM7PSBFVEhfR1NUUklOR19MRU47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCYjMzQ7cnglZF9wYWNrZXRzXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDtyeCVkX2J5dGVzXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDtyeCVkX2ludGVycnVwdHNcJiMzNDssIGkpO1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3J4JWRfcG9sbHNcJiMzNDssIGkpO1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3J4JWRfbGFyZ2VfcGFja2V0c1wmIzM0OywgaSk7XG4mIzQzO1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCYjMzQ7cnglZF9pbnZhbGlkX2J1ZmZlcnNcJiMzNDssIGkpO1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3J4JWRfbm9fYnVmZmVyX2Ryb3BzXCYjMzQ7LCBpKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCYjMzQ7dHglZF9wYWNrZXRzXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDt0eCVkX2J5dGVzXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDt0eCVkX2xhcmdlX3BhY2tldHNcJiMzNDssIGkpO1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3R4JWRfZHJvcHBlZF9wYWNrZXRzXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDt0eCVkX3NlbmRfZmFpbHVyZXNcJiMzNDssIGkpO1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3R4JWRfY2hlY2tzdW1fb2ZmbG9hZFwmIzM0OywgaSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwmIzM0O3Bvb2wlZF9zaXplXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDtwb29sJWRfYWN0aXZlXCYjMzQ7LCBpKTtcbiYjNDM7XHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcJiMzNDtwb29sJWRfYXZhaWxhYmxlXCYjMzQ7LCBpKTtcbiYjNDM7XHR9XG4gfVxuIFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldClcbiB7XG4mIzQzO1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XG4mIzQzO1xuIFx0c3dpdGNoIChzc2V0KSB7XG4gXHRjYXNlIEVUSF9TU19TVEFUUzpcbi1cdFx0cmV0dXJuIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7XG4mIzQzO1x0XHRyZXR1cm4gQVJSQVlfU0laRShpYm12ZXRoX3N0YXRzKSAmIzQzO1xuJiM0MztcdFx0ICAgICAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyAqIElCTVZFVEhfTlVNX1JYX1FTVEFUUyAmIzQzO1xuJiM0MztcdFx0ICAgICAgIGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXMgKiBJQk1WRVRIX05VTV9UWF9RU1RBVFMgJiM0MztcbiYjNDM7XHRcdCAgICAgICBJQk1WRVRIX05VTV9CVUZGX1BPT0xTICogMztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcdH1cbkBAIC0xMDk3LDQwICYjNDM7MjQ4NCwxMzEgQEAgc3RhdGljIGludCBpYm12ZXRoX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KVxuIHN0YXRpYyB2b2lkIGlibXZldGhfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBcdFx0XHRcdCAgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKVxuIHtcbi1cdGludCBpO1xuIFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XG4mIzQzO1x0aW50IGksIGo7XG4mIzQzO1xuJiM0MztcdGlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0cyhhZGFwdGVyKTtcbiYjNDM7XHRpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoYWRhcHRlcik7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOyBpJiM0MzsmIzQzOylcbiBcdFx0ZGF0YVtpXSA9IElCTVZFVEhfR0VUX1NUQVQoYWRhcHRlciwgaWJtdmV0aF9zdGF0c1tpXS5vZmZzZXQpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpIHtcbiYjNDM7XHRcdFx0ZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tqXS5wYWNrZXRzO1xuJiM0MztcdFx0XHRkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2pdLmJ5dGVzO1xuJiM0MztcdFx0XHRkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2pdLmludGVycnVwdHM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbal0ucG9sbHM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbal0ubGFyZ2VfcGFja2V0cztcbiYjNDM7XHRcdFx0ZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tqXS5pbnZhbGlkX2J1ZmZlcnM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbal0ubm9fYnVmZmVyX2Ryb3BzO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0aSAmIzQzOz0gSUJNVkVUSF9OVU1fUlhfUVNUQVRTO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChqID0gMDsgaiBcdTAwM2MgZGV2LVx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cykge1xuJiM0MztcdFx0XHRkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2pdLnBhY2tldHM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbal0uYnl0ZXM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbal0ubGFyZ2VfcGFja2V0cztcbiYjNDM7XHRcdFx0ZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tqXS5kcm9wcGVkX3BhY2tldHM7XG4mIzQzO1x0XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbal0uc2VuZF9mYWlsdXJlcztcbiYjNDM7XHRcdFx0ZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tqXS5jaGVja3N1bV9vZmZsb2FkO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0aSAmIzQzOz0gSUJNVkVUSF9OVU1fVFhfUVNUQVRTO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChqID0gMDsgaiBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1bal0uc2l6ZTtcbiYjNDM7XHRcdGRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1bal0uYWN0aXZlO1xuJiM0MztcdFx0ZGF0YVtpJiM0MzsmIzQzO10gPSBhdG9taWNfcmVhZChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtqXS5hdmFpbGFibGUpO1xuJiM0MztcdH1cbiB9XG4gXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcbiBcdFx0XHRcdCBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hhbm5lbHMpXG4ge1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuJiM0MztcbiBcdGNoYW5uZWxzLVx1MDAzZW1heF90eCA9IGlibXZldGhfcmVhbF9tYXhfdHhfcXVldWVzKCk7XG4gXHRjaGFubmVscy1cdTAwM2V0eF9jb3VudCA9IG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7XG4gXG4tXHRjaGFubmVscy1cdTAwM2VtYXhfcnggPSBuZXRkZXYtXHUwMDNlcmVhbF9udW1fcnhfcXVldWVzO1xuLVx0Y2hhbm5lbHMtXHUwMDNlcnhfY291bnQgPSBuZXRkZXYtXHUwMDNlcmVhbF9udW1fcnhfcXVldWVzO1xuJiM0MztcdGlmIChhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKVxuJiM0MztcdFx0Y2hhbm5lbHMtXHUwMDNlbWF4X3J4ID0gSUJNVkVUSF9NQVhfUlhfUVVFVUVTO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNoYW5uZWxzLVx1MDAzZW1heF9yeCA9IDE7XG4mIzQzO1x0Y2hhbm5lbHMtXHUwMDNlcnhfY291bnQgPSBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7XG4gfVxuIFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcbiBcdFx0XHRcdHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaGFubmVscylcbiB7XG4gXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcbi1cdHVuc2lnbmVkIGludCBvbGQgPSBuZXRkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzLFxuLVx0XHQgICAgIGdvYWwgPSBjaGFubmVscy1cdTAwM2V0eF9jb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb2xkX3J4ID0gYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzO1xuJiM0MztcdHVuc2lnbmVkIGludCBnb2FsX3J4ID0gY2hhbm5lbHMtXHUwMDNlcnhfY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IG9sZCA9IG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7XG4mIzQzO1x0dW5zaWduZWQgaW50IGdvYWwgPSBjaGFubmVscy1cdTAwM2V0eF9jb3VudDtcbiYjNDM7XHRpbnQgcnhxX2VudHJpZXMgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLm51bV9zbG90cztcbiBcdGludCByYywgaTtcbiBcbiBcdC8qIElmIG5kb19vcGVuIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0IHRoZW4gZG9uJiMzOTt0IGFsbG9jYXRlLCBqdXN0IHNldFxuIFx0ICogZGVzaXJlZCBuZXRkZXZfcXVldWUmIzM5O3MgYW5kIHJldHVyblxuIFx0ICovXG4tXHRpZiAoIShuZXRkZXYtXHUwMDNlZmxhZ3MgXHUwMDI2IElGRl9VUCkpXG4mIzQzO1x0aWYgKCEobmV0ZGV2LVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVVApKSB7XG4mIzQzO1x0XHRpZiAoZ29hbF9yeCBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgIWFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7Q2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBnb2FsX3J4KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChnb2FsX3J4IFx1MDAzYyAxIHx8IGdvYWxfcnggXHUwMDNlIElCTVZFVEhfTUFYX1JYX1FVRVVFUykge1xuJiM0MztcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0XHQgICBcJiMzNDtJbnZhbGlkIFJYIHF1ZXVlIGNvdW50ICV1IChtdXN0IGJlIDEtJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGdvYWxfcngsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFN0YXNoIGRlc2lyZWQgUlggY291bnQ7IG9wZW4oKSBwdWJsaXNoZXMgaXQgdmlhXG4mIzQzO1x0XHQgKiBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKCkgYWZ0ZXIgcXVldWUgcmVnaXN0cmF0aW9uLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoZ29hbF9yeCAhPSBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpXG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IGdvYWxfcng7XG4mIzQzO1xuIFx0XHRyZXR1cm4gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXRkZXYsIGdvYWwpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGdvYWxfcnggXHUwMDNlIDEgXHUwMDI2XHUwMDI2ICFhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKSB7XG4mIzQzO1x0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7Q2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgZ29hbF9yeCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ29hbF9yeCBcdTAwM2MgMSB8fCBnb2FsX3J4IFx1MDAzZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpIHtcbiYjNDM7XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuJiM0MztcdFx0XHQgICBcJiMzNDtJbnZhbGlkIFJYIHF1ZXVlIGNvdW50ICV1IChtdXN0IGJlIDEtJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBnb2FsX3J4LCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ29hbF9yeCAhPSBvbGRfcngpIHtcbiYjNDM7XHRcdHJjID0gaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsKGFkYXB0ZXIsIGdvYWxfcngsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICByeHFfZW50cmllcyk7XG4mIzQzO1x0XHRpZiAocmMpIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O0ZhaWxlZCB0byByZXNpemUgUlggcXVldWVzOiAlZFxcblwmIzM0OywgcmMpO1xuJiM0MztcdFx0XHRyZXR1cm4gcmM7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuIFxuIFx0LyogV2UgaGF2ZSBJQk1WRVRIX01BWF9RVUVVRVMgbmV0ZGV2X3F1ZXVlJiMzOTtzIGFsbG9jYXRlZFxuIFx0ICogYnV0IHdlIG1heSBuZWVkIHRvIGFsbG9jL2ZyZWUgdGhlIGx0YiYjMzk7cy5cbiBcdCAqL1xuJiM0MztcdGlmIChnb2FsID09IG9sZClcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdG5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpO1xuIFxuIFx0LyogQWxsb2NhdGUgYW55IHF1ZXVlIHRoYXQgd2UgbmVlZCAqL1xuQEAgLTExNjQsNyAmIzQzOzI2NDIsNyBAQCBzdGF0aWMgaW50IGlibXZldGhfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXG4gXHRuZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMobmV0ZGV2KTtcbiBcbi1cdHJldHVybiByYztcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7XG5AQCAtMTIwOSwxMiAmIzQzOzI2ODcsMTUgQEAgc3RhdGljIGludCBpYm12ZXRoX3NlbmQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiBcdFx0cmV0dXJuIDE7XG4gXHR9XG4gXG4mIzQzO1x0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5zZW5kX2xhbiYjNDM7JiM0Mzs7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIGludCBpYm12ZXRoX2lzX3BhY2tldF91bnN1cHBvcnRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLVx0XHRcdFx0XHQgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldilcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuJiM0MztcdFx0XHRcdFx0IGludCBxdWV1ZV9udW0pXG4ge1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiBcdHN0cnVjdCBldGhoZHIgKmV0aGVyX2hlYWRlcjtcbiBcdGludCByZXQgPSAwO1xuIFxuQEAgLTEyMjIsNyAmIzQzOzI3MDMsOCBAQCBzdGF0aWMgaW50IGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHN0cnVjdCBza19idWZmICpza2IsXG4gXG4gXHRpZiAoZXRoZXJfYWRkcl9lcXVhbChldGhlcl9oZWFkZXItXHUwMDNlaF9kZXN0LCBuZXRkZXYtXHUwMDNlZGV2X2FkZHIpKSB7XG4gXHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDt2ZXRoIGRvZXNuJiMzOTt0IHN1cHBvcnQgbG9vcGJhY2sgcGFja2V0cywgZHJvcHBpbmcgcGFja2V0LlxcblwmIzM0Oyk7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9kcm9wcGVkJiM0MzsmIzQzOztcbiYjNDM7XHRcdGlmIChhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cylcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMmIzQzOyYjNDM7O1xuIFx0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbiBcdH1cbiBcbkBAIC0xMjM4LDcgJiM0MzsyNzIwLDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0aW50IGksIHF1ZXVlX251bSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpO1xuIFx0dW5zaWduZWQgbG9uZyBtc3MgPSAwO1xuIFxuLVx0aWYgKGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHNrYiwgbmV0ZGV2KSlcbiYjNDM7XHRpZiAoaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc2tiLCBhZGFwdGVyLCBxdWV1ZV9udW0pKVxuIFx0XHRnb3RvIG91dDtcbiBcdC8qIHZldGggY2FuJiMzOTt0IGNoZWNrc3VtIG9mZmxvYWQgVURQICovXG4gXHRpZiAoc2tiLVx1MDAzZWlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMIFx1MDAyNlx1MDAyNlxuQEAgLTEyNDksNyAmIzQzOzI3MzEsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXHQgICAgc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkge1xuIFxuIFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCYjMzQ7dHg6IGZhaWxlZCB0byBjaGVja3N1bSBwYWNrZXRcXG5cJiMzNDspO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTEyNjEsNiAmIzQzOzI3NDMsOCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXG4gXHRcdGRlc2NfZmxhZ3MgfD0gKElCTVZFVEhfQlVGX05PX0NTVU0gfCBJQk1WRVRIX0JVRl9DU1VNX0dPT0QpO1xuIFxuJiM0MztcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5jaGVja3N1bV9vZmZsb2FkJiM0MzsmIzQzOztcbiYjNDM7XG4gXHRcdC8qIE5lZWQgdG8gemVybyBvdXQgdGhlIGNoZWNrc3VtICovXG4gXHRcdGJ1ZlswXSA9IDA7XG4gXHRcdGJ1ZlsxXSA9IDA7XG5AQCAtMTI3Miw3ICYjNDM7Mjc1Niw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdGlmIChza2ItXHUwMDNlaXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgXHUwMDI2XHUwMDI2IHNrYl9pc19nc28oc2tiKSkge1xuIFx0XHRpZiAoYWRhcHRlci1cdTAwM2Vmd19sYXJnZV9zZW5kX3N1cHBvcnQpIHtcbiBcdFx0XHRtc3MgPSAodW5zaWduZWQgbG9uZylza2Jfc2hpbmZvKHNrYiktXHUwMDNlZ3NvX3NpemU7XG4tXHRcdFx0YWRhcHRlci1cdTAwM2V0eF9sYXJnZV9wYWNrZXRzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5sYXJnZV9wYWNrZXRzJiM0MzsmIzQzOztcbiBcdFx0fSBlbHNlIGlmICghc2tiX2lzX2dzb192Nihza2IpKSB7XG4gXHRcdFx0LyogUHV0IC0xIGluIHRoZSBJUCBjaGVja3N1bSB0byB0ZWxsIHBoeXAgaXRcbiBcdFx0XHQgKiBpcyBhIGxhcmdlc2VuZCBwYWNrZXQuIFB1dCB0aGUgbXNzIGluXG5AQCAtMTI4MSw3ICYjNDM7Mjc2NSw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdFx0XHRpcF9oZHIoc2tiKS1cdTAwM2VjaGVjayA9IDB4ZmZmZjtcbiBcdFx0XHR0Y3BfaGRyKHNrYiktXHUwMDNlY2hlY2sgPVxuIFx0XHRcdFx0Y3B1X3RvX2JlMTYoc2tiX3NoaW5mbyhza2IpLVx1MDAzZWdzb19zaXplKTtcbi1cdFx0XHRhZGFwdGVyLVx1MDAzZXR4X2xhcmdlX3BhY2tldHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmxhcmdlX3BhY2tldHMmIzQzOyYjNDM7O1xuIFx0XHR9XG4gXHR9XG4gXG5AQCAtMTI4OSw3ICYjNDM7Mjc3Myw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdGlmICh1bmxpa2VseShza2ItXHUwMDNlbGVuIFx1MDAzZSBhZGFwdGVyLVx1MDAzZXR4X2x0Yl9zaXplKSkge1xuIFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LCBcJiMzNDt0eDogcGFja2V0IHNpemUgKCV1KSBleGNlZWRzIGx0YiAoJXUpXFxuXCYjMzQ7LFxuIFx0XHRcdCAgIHNrYi1cdTAwM2VsZW4sIGFkYXB0ZXItXHUwMDNldHhfbHRiX3NpemUpO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0bWVtY3B5KGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltxdWV1ZV9udW1dLCBza2ItXHUwMDNlZGF0YSwgc2tiX2hlYWRsZW4oc2tiKSk7XG5AQCAtMTMwNiw3ICYjNDM7Mjc5MCw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdGlmICh1bmxpa2VseSh0b3RhbF9ieXRlcyAhPSBza2ItXHUwMDNlbGVuKSkge1xuIFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LCBcJiMzNDt0eDogaW5jb3JyZWN0IHBhY2tldCBsZW4gY29waWVkIGludG8gbHRiICgldSAhPSAldSlcXG5cJiMzNDssXG4gXHRcdFx0ICAgc2tiLVx1MDAzZWxlbiwgdG90YWxfYnl0ZXMpO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0ZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gZGVzY19mbGFncyB8IHNrYi1cdTAwM2VsZW47XG5AQCAtMTMxNSwxMSAmIzQzOzI3OTksMTEgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0ZG1hX3dtYigpO1xuIFxuIFx0aWYgKGlibXZldGhfc2VuZChhZGFwdGVyLCBkZXNjLmRlc2MsIG1zcykpIHtcbi1cdFx0YWRhcHRlci1cdTAwM2V0eF9zZW5kX2ZhaWxlZCYjNDM7JiM0Mzs7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9kcm9wcGVkJiM0MzsmIzQzOztcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uc2VuZF9mYWlsdXJlcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cyYjNDM7JiM0Mzs7XG4gXHR9IGVsc2Uge1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfcGFja2V0cyYjNDM7JiM0Mzs7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9ieXRlcyAmIzQzOz0gc2tiLVx1MDAzZWxlbjtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0ucGFja2V0cyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmJ5dGVzICYjNDM7PSBza2ItXHUwMDNlbGVuO1xuIFx0fVxuIFxuIG91dDpcbkBAIC0xNDQ3LDM2ICYjNDM7MjkzMSw2OSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3J4X2NzdW1faGVscGVyKHN0cnVjdCBza19idWZmICpza2IsXG4gXG4gc3RhdGljIGludCBpYm12ZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KVxuIHtcbi1cdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPVxuLVx0XHRcdGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyLCBuYXBpKTtcbi1cdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbiYjNDM7XHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbmFwaS1cdTAwM2VkZXY7XG4mIzQzO1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4gXHRpbnQgZnJhbWVzX3Byb2Nlc3NlZCA9IDA7XG4gXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4mIzQzO1x0aW50IHF1ZXVlX2luZGV4LCByYztcbiBcdHUxNiBtc3MgPSAwO1xuIFxuJiM0MztcdHF1ZXVlX2luZGV4ID0gbmFwaSAtIGFkYXB0ZXItXHUwMDNlbmFwaTtcbiYjNDM7XG4mIzQzO1x0aWYgKFdBUk5fT04ocXVldWVfaW5kZXggXHUwMDNjIDAgfHwgcXVldWVfaW5kZXggXHUwMDNlPSBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpIHx8IG5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpKSB7XG4mIzQzO1x0XHRuYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgMCk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5wb2xscyYjNDM7JiM0Mzs7XG4mIzQzO1xuIHJlc3RhcnRfcG9sbDpcbiBcdHdoaWxlIChmcmFtZXNfcHJvY2Vzc2VkIFx1MDAzYyBidWRnZXQpIHtcbi1cdFx0aWYgKCFpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyKSlcbiYjNDM7XHRcdGlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpIHx8IG5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIWlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSlcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0c21wX3JtYigpO1xuLVx0XHRpZiAoIWlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChhZGFwdGVyKSkge1xuJiM0MztcdFx0aWYgKCFpYm12ZXRoX3J4cV9idWZmZXJfdmFsaWQoYWRhcHRlciwgcXVldWVfaW5kZXgpKSB7XG4gXHRcdFx0d21iKCk7IC8qIHN1Z2dlc3RlZCBieSBsYXJzb24xICovXG4tXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9pbnZhbGlkX2J1ZmZlciYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbiYjNDM7XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1txdWV1ZV9pbmRleF0uaW52YWxpZF9idWZmZXJzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfaW52YWxpZF9idWZmZXImIzQzOyYjNDM7O1xuIFx0XHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtyZWN5Y2xpbmcgaW52YWxpZCBidWZmZXJcXG5cJiMzNDspO1xuLVx0XHRcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXG4mIzQzO1x0XHRcdHJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsIHRydWUpO1xuJiM0MztcdFx0XHRpZiAodW5saWtlbHkocmMpKVxuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7XG4tXHRcdFx0aW50IGxlbmd0aCA9IGlibXZldGhfcnhxX2ZyYW1lX2xlbmd0aChhZGFwdGVyKTtcbi1cdFx0XHRpbnQgb2Zmc2V0ID0gaWJtdmV0aF9yeHFfZnJhbWVfb2Zmc2V0KGFkYXB0ZXIpO1xuLVx0XHRcdGludCBjc3VtX2dvb2QgPSBpYm12ZXRoX3J4cV9jc3VtX2dvb2QoYWRhcHRlcik7XG4tXHRcdFx0aW50IGxyZ19wa3QgPSBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoYWRhcHRlcik7XG4mIzQzO1x0XHRcdGludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuJiM0MztcdFx0XHRpbnQgb2Zmc2V0ID0gaWJtdmV0aF9yeHFfZnJhbWVfb2Zmc2V0KGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbiYjNDM7XHRcdFx0aW50IGNzdW1fZ29vZCA9IGlibXZldGhfcnhxX2NzdW1fZ29vZChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XG4mIzQzO1x0XHRcdGludCBscmdfcGt0ID0gaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbiBcdFx0XHRfX3N1bTE2IGlwaF9jaGVjayA9IDA7XG4gXG4tXHRcdFx0c2tiID0gaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKTtcbi1cdFx0XHRpZiAodW5saWtlbHkoIXNrYikpXG4tXHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0c2tiID0gaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XG4mIzQzO1x0XHRcdGlmICh1bmxpa2VseSghc2tiKSkge1xuJiM0MztcdFx0XHRcdGlmIChuZXRfcmF0ZWxpbWl0KCkpXG4mIzQzO1x0XHRcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgXCYjMzQ7YmFkIGNvcnJlbGF0b3Igb24gcXVldWUgJWQsIHNraXBwaW5nIHNsb3RcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRcdCAgIHF1ZXVlX2luZGV4KTtcbiYjNDM7XHRcdFx0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpXG4mIzQzO1x0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1txdWV1ZV9pbmRleF0uaW52YWxpZF9idWZmZXJzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2ludmFsaWRfYnVmZmVyJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0XHRyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0dHJ1ZSk7XG4mIzQzO1x0XHRcdFx0aWYgKHVubGlrZWx5KHJjKSlcbiYjNDM7XHRcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4gXG4gXHRcdFx0LyogaWYgdGhlIGxhcmdlIHBhY2tldCBiaXQgaXMgc2V0IGluIHRoZSByeCBxdWV1ZVxuIFx0XHRcdCAqIGRlc2NyaXB0b3IsIHRoZSBtc3Mgd2lsbCBiZSB3cml0dGVuIGJ5IFBIWVAgZWlnaHRcbkBAIC0xNDk5LDEyICYjNDM7MzAxNiwxNCBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4gXHRcdFx0XHRcdFx0XHRsZW5ndGgpO1xuIFx0XHRcdFx0aWYgKHJ4X2ZsdXNoKVxuIFx0XHRcdFx0XHRpYm12ZXRoX2ZsdXNoX2J1ZmZlcihza2ItXHUwMDNlZGF0YSxcbi1cdFx0XHRcdFx0XHRsZW5ndGggJiM0Mzsgb2Zmc2V0KTtcbi1cdFx0XHRcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBsZW5ndGggJiM0Mzsgb2Zmc2V0KTtcbiYjNDM7XHRcdFx0XHRyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCB0cnVlKTtcbiYjNDM7XHRcdFx0XHRpZiAodW5saWtlbHkocmMpKVxuIFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdHNrYiA9IG5ld19za2I7XG4gXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBmYWxzZSkpKVxuJiM0MztcdFx0XHRcdHJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsIGZhbHNlKTtcbiYjNDM7XHRcdFx0XHRpZiAodW5saWtlbHkocmMpKVxuIFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdHNrYl9yZXNlcnZlKHNrYiwgb2Zmc2V0KTtcbiBcdFx0XHR9XG5AQCAtMTUyNCw3ICYjNDM7MzA0MywxMCBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4gXHRcdFx0aWYgKChsZW5ndGggXHUwMDNlIG5ldGRldi1cdTAwM2VtdHUgJiM0MzsgRVRIX0hMRU4pIHx8XG4gXHRcdFx0ICAgIGxyZ19wa3QgfHwgaXBoX2NoZWNrID09IDB4ZmZmZikge1xuIFx0XHRcdFx0aWJtdmV0aF9yeF9tc3NfaGVscGVyKHNrYiwgbXNzLCBscmdfcGt0KTtcbi1cdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfbGFyZ2VfcGFja2V0cyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKVxuJiM0MztcdFx0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLmxhcmdlX3BhY2tldHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfbGFyZ2VfcGFja2V0cyYjNDM7JiM0Mzs7XG4gXHRcdFx0fVxuIFxuIFx0XHRcdGlmIChjc3VtX2dvb2QpIHtcbkBAIC0xNTM0LDE2ICYjNDM7MzA1NiwyMiBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4gXG4gXHRcdFx0bmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpO1x0Lyogc2VuZCBpdCB1cCAqL1xuIFxuLVx0XHRcdG5ldGRldi1cdTAwM2VzdGF0cy5yeF9wYWNrZXRzJiM0MzsmIzQzOztcbi1cdFx0XHRuZXRkZXYtXHUwMDNlc3RhdHMucnhfYnl0ZXMgJiM0Mzs9IGxlbmd0aDtcbiYjNDM7XHRcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKSB7XG4mIzQzO1x0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLnBhY2tldHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5ieXRlcyAmIzQzOz0gbGVuZ3RoO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuIFx0XHRcdGZyYW1lc19wcm9jZXNzZWQmIzQzOyYjNDM7O1xuIFx0XHR9XG4gXHR9XG4gXG4tXHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIpO1xuJiM0MztcdGlibXZldGhfcmVwbGVuaXNoX3Rhc2soYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuIFxuLVx0aWYgKGZyYW1lc19wcm9jZXNzZWQgPT0gYnVkZ2V0KVxuJiM0MztcdGlmIChmcmFtZXNfcHJvY2Vzc2VkID09IGJ1ZGdldCkge1xuJiM0MztcdFx0aWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikgfHwgbmFwaV9kaXNhYmxlX3BlbmRpbmcobmFwaSkpXG4mIzQzO1x0XHRcdG5hcGlfY29tcGxldGVfZG9uZShuYXBpLCBmcmFtZXNfcHJvY2Vzc2VkKTtcbiBcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuIFxuIFx0aWYgKCFuYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgZnJhbWVzX3Byb2Nlc3NlZCkpXG4gXHRcdGdvdG8gb3V0O1xuQEAgLTE1NTEsMTUgJiM0MzszMDc5LDIxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcbiBcdC8qIFdlIHRoaW5rIHdlIGFyZSBkb25lIC0gcmVlbmFibGUgaW50ZXJydXB0cyxcbiBcdCAqIHRoZW4gY2hlY2sgb25jZSBtb3JlIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgZG9uZS5cbiBcdCAqL1xuLVx0bHBhcl9yYyA9IGhfdmlvX3NpZ25hbChhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLCBWSU9fSVJRX0VOQUJMRSk7XG4tXHRpZiAoV0FSTl9PTihscGFyX3JjICE9IEhfU1VDQ0VTUykpIHtcbiYjNDM7XHRscGFyX3JjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbiYjNDM7XHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuJiM0MztcdFx0XHQgICBcJiMzNDtGYWlsZWQgdG8gZW5hYmxlIElSUSBmb3IgcXVldWUgJWQgKHJjPTB4JWx4KSwgc2NoZWR1bGluZyByZXNldFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgcXVldWVfaW5kZXgsIGxwYXJfcmMpO1xuIFx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNmFkYXB0ZXItXHUwMDNld29yayk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0aWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpIFx1MDAyNlx1MDAyNiBuYXBpX3NjaGVkdWxlKG5hcGkpKSB7XG4tXHRcdGxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbi1cdFx0XHRcdCAgICAgICBWSU9fSVJRX0RJU0FCTEUpO1xuJiM0MztcdGlmIChpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIW5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBuYXBpX3NjaGVkdWxlKG5hcGkpKSB7XG4mIzQzO1x0XHRscGFyX3JjID0gaWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XG4mIzQzO1x0XHRXQVJOX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKTtcbiBcdFx0Z290byByZXN0YXJ0X3BvbGw7XG4gXHR9XG4gXG5AQCAtMTU2OSwxNSAmIzQzOzMxMDMsMjQgQEAgc3RhdGljIGludCBpYm12ZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KVxuIFxuIHN0YXRpYyBpcnFyZXR1cm5fdCBpYm12ZXRoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpXG4ge1xuLVx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9pbnN0YW5jZTtcbiYjNDM7XHRzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkgPSBkZXZfaW5zdGFuY2U7XG4mIzQzO1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktXHUwMDNlZGV2O1xuIFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4gXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4mIzQzO1x0aW50IHFpbmRleDtcbiYjNDM7XG4mIzQzO1x0cWluZGV4ID0gbmFwaSAtIGFkYXB0ZXItXHUwMDNlbmFwaTtcbiYjNDM7XG4mIzQzO1x0aWYgKFdBUk5fT04ocWluZGV4IFx1MDAzYyAwIHx8IHFpbmRleCBcdTAwM2U9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcykpXG4mIzQzO1x0XHRyZXR1cm4gSVJRX05PTkU7XG4gXG4tXHRpZiAobmFwaV9zY2hlZHVsZV9wcmVwKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaSkpIHtcbi1cdFx0bHBhcl9yYyA9IGhfdmlvX3NpZ25hbChhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuLVx0XHRcdFx0ICAgICAgIFZJT19JUlFfRElTQUJMRSk7XG4mIzQzO1x0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKVxuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcWluZGV4XS5pbnRlcnJ1cHRzJiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0aWYgKG5hcGlfc2NoZWR1bGVfcHJlcChuYXBpKSkge1xuJiM0MztcdFx0bHBhcl9yYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgcWluZGV4KTtcbiBcdFx0V0FSTl9PTihscGFyX3JjICE9IEhfU1VDQ0VTUyk7XG4tXHRcdF9fbmFwaV9zY2hlZHVsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGkpO1xuJiM0MztcdFx0X19uYXBpX3NjaGVkdWxlKG5hcGkpO1xuIFx0fVxuIFx0cmV0dXJuIElSUV9IQU5ETEVEO1xuIH1cbkBAIC0xNjQ1LDcgJiM0MzszMTg4LDcgQEAgc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpXG4gXHRpbnQgbmVlZF9yZXN0YXJ0ID0gMDtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KVxuLVx0XHRpZiAobmV3X210dV9vaCBcdTAwM2M9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLmJ1ZmZfc2l6ZSlcbiYjNDM7XHRcdGlmIChuZXdfbXR1X29oIFx1MDAzYz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0aWYgKGkgPT0gSUJNVkVUSF9OVU1fQlVGRl9QT09MUylcbkBAIC0xNjYwLDkgJiM0MzszMjAzLDkgQEAgc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpXG4gXG4gXHQvKiBMb29rIGZvciBhbiBhY3RpdmUgYnVmZmVyIHBvb2wgdGhhdCBjYW4gaG9sZCB0aGUgbmV3IE1UVSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbi1cdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMTtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmFjdGl2ZSA9IDE7XG4gXG4tXHRcdGlmIChuZXdfbXR1X29oIFx1MDAzYz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKSB7XG4mIzQzO1x0XHRpZiAobmV3X210dV9vaCBcdTAwM2M9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmJ1ZmZfc2l6ZSkge1xuIFx0XHRcdFdSSVRFX09OQ0UoZGV2LVx1MDAzZW10dSwgbmV3X210dSk7XG4gXHRcdFx0dmlvX2Ntb19zZXRfZGV2X2Rlc2lyZWQodmlvZGV2LFxuIFx0XHRcdFx0XHRcdGlibXZldGhfZ2V0X2Rlc2lyZWRfZG1hXG5AQCAtMTY4Myw4ICYjNDM7MzIyNiwxNCBAQCBzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSlcbiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVJcbiBzdGF0aWMgdm9pZCBpYm12ZXRoX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIHtcbi1cdGlibXZldGhfcmVwbGVuaXNoX3Rhc2sobmV0ZGV2X3ByaXYoZGV2KSk7XG4tXHRpYm12ZXRoX2ludGVycnVwdChkZXYtXHUwMDNlaXJxLCBkZXYpO1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBpKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlibXZldGhfaW50ZXJydXB0KGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuIH1cbiAjZW5kaWZcbiBcbkBAIC0xNzAyLDggJiM0MzszMjUxLDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJtdmV0aF9nZXRfZGVzaXJlZF9kbWEoc3RydWN0IHZpb19kZXYgKnZkZXYpXG4gXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyO1xuIFx0c3RydWN0IGlvbW11X3RhYmxlICp0Ymw7XG4gXHR1bnNpZ25lZCBsb25nIHJldDtcbi1cdGludCBpO1xuLVx0aW50IHJ4cWVudHJpZXMgPSAxO1xuJiM0MztcdGludCBpLCBxO1xuIFxuIFx0dGJsID0gZ2V0X2lvbW11X3RhYmxlX2Jhc2UoXHUwMDI2dmRldi1cdTAwM2VkZXYpO1xuIFxuQEAgLTE3MTgsMTggJiM0MzszMjY2LDIyIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlibXZldGhfZ2V0X2Rlc2lyZWRfZG1hKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KVxuIFx0LyogYWRkIHNpemUgb2YgbWFwcGVkIHR4IGJ1ZmZlcnMgKi9cbiBcdHJldCAmIzQzOz0gSU9NTVVfUEFHRV9BTElHTihJQk1WRVRIX01BWF9UWF9CVUZfU0laRSwgdGJsKTtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHJlY2VpdmUgYnVmZmVycyAqL1xuLVx0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlKVxuLVx0XHRcdHJldCAmIzQzOz1cbi1cdFx0XHQgICAgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uc2l6ZSAqXG4tXHRcdFx0ICAgIElPTU1VX1BBR0VfQUxJR04oYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uXG4tXHRcdFx0XHRcdCAgICAgYnVmZl9zaXplLCB0YmwpO1xuLVx0XHRyeHFlbnRyaWVzICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5zaXplO1xuLVx0fVxuLVx0LyogYWRkIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIHF1ZXVlIGVudHJpZXMgKi9cbi1cdHJldCAmIzQzOz0gSU9NTVVfUEFHRV9BTElHTihcbi1cdFx0cnhxZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSwgdGJsKTtcbiYjNDM7XHRmb3IgKHEgPSAwOyBxIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IHEmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgcnhxZW50cmllcyA9IDE7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0LyogYWRkIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgcmVjZWl2ZSBidWZmZXJzICovXG4mIzQzO1x0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5hY3RpdmUpXG4mIzQzO1x0XHRcdFx0cmV0ICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5zaXplICpcbiYjNDM7XHRcdFx0XHRcdElPTU1VX1BBR0VfQUxJR04oYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcV1baV0uYnVmZl9zaXplLFxuJiM0MztcdFx0XHRcdFx0XHRcdCB0YmwpO1xuJiM0MztcdFx0XHRyeHFlbnRyaWVzICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5zaXplO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBxdWV1ZSBlbnRyaWVzICovXG4mIzQzO1x0XHRyZXQgJiM0Mzs9IElPTU1VX1BBR0VfQUxJR04ocnhxZW50cmllcyAqXG4mIzQzO1x0XHRcdFx0XHRzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSksIHRibCk7XG4mIzQzO1x0fVxuIFxuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMTc3Nyw2ICYjNDM7MzMyOSwzOSBAQCBzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgaWJtdmV0aF9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHZsYW5fZmVhdHVyZXNfY2hlY2soc2tiLCBmZWF0dXJlcyk7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogaWJtdmV0aF9nZXRfc3RhdHM2NCAtIFJldHVybiBhZ2dyZWdhdGVkIHBlci1xdWV1ZSBzdGF0aXN0aWNzXG4mIzQzOyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlXG4mIzQzOyAqIEBzdGF0czogcnRubCBsaW5rIHN0YXRpc3RpY3Mgc3RvcmFnZVxuJiM0MzsgKlxuJiM0MzsgKiBTdW1zIHBlci1xdWV1ZSByeF9xc3RhdHMgYW5kIHR4X3FzdGF0cyBpbnRvIHRoZSBydG5sIGNvdW50ZXJzLlxuJiM0MzsgKiBDYWxsZXJzIHVzZSBuZG9fZ2V0X3N0YXRzNjQoKTsgYXZvaWQgdXBkYXRpbmcgbmV0ZGV2LVx1MDAzZXN0YXRzIG9uIHRoZVxuJiM0MzsgKiB4bWl0L3BvbGwgcGF0aHMgdG8ga2VlcCBwZXItcXVldWUgY291bnRlcnMgb2ZmIHRoZSBob3QgY2FjaGUgbGluZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiYjNDM7XHRcdFx0XHRzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRzdGF0cy1cdTAwM2VyeF9wYWNrZXRzICYjNDM7PSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tpXS5wYWNrZXRzO1xuJiM0MztcdFx0XHRzdGF0cy1cdTAwM2VyeF9ieXRlcyAmIzQzOz0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbaV0uYnl0ZXM7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoYWRhcHRlci1cdTAwM2V0eF9xc3RhdHMpIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0YXRzLVx1MDAzZXR4X3BhY2tldHMgJiM0Mzs9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2ldLnBhY2tldHM7XG4mIzQzO1x0XHRcdHN0YXRzLVx1MDAzZXR4X2J5dGVzICYjNDM7PSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tpXS5ieXRlcztcbiYjNDM7XHRcdFx0c3RhdHMtXHUwMDNldHhfZHJvcHBlZCAmIzQzOz0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbaV0uZHJvcHBlZF9wYWNrZXRzO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3RhdHMtXHUwMDNldHhfZXJyb3JzID0gZGV2LVx1MDAzZXN0YXRzLnR4X2Vycm9ycztcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlibXZldGhfbmV0ZGV2X29wcyA9IHtcbiBcdC5uZG9fb3Blblx0XHQ9IGlibXZldGhfb3BlbixcbiBcdC5uZG9fc3RvcFx0XHQ9IGlibXZldGhfY2xvc2UsXG5AQCAtMTc4OSwxMSAmIzQzOzMzNzQsNTggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpYm12ZXRoX25ldGRldl9vcHMgPSB7XG4gXHQubmRvX3ZhbGlkYXRlX2FkZHJcdD0gZXRoX3ZhbGlkYXRlX2FkZHIsXG4gXHQubmRvX3NldF9tYWNfYWRkcmVzcyAgICA9IGlibXZldGhfc2V0X21hY19hZGRyLFxuIFx0Lm5kb19mZWF0dXJlc19jaGVja1x0PSBpYm12ZXRoX2ZlYXR1cmVzX2NoZWNrLFxuJiM0MztcdC5uZG9fZ2V0X3N0YXRzNjRcdD0gaWJtdmV0aF9nZXRfc3RhdHM2NCxcbiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVJcbiBcdC5uZG9fcG9sbF9jb250cm9sbGVyXHQ9IGlibXZldGhfcG9sbF9jb250cm9sbGVyLFxuICNlbmRpZlxuIH07XG4gXG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlibXZldGhfYXR0cl9ncm91cDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IGJ1ZmZlcl9wb29sc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcbiYjNDM7XHRcdFx0XHQgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG4mIzQzO1x0XHRcdFx0IGNoYXIgKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcbiYjNDM7XHRpbnQgbGVuID0gMDtcbiYjNDM7XHRpbnQgaSwgajtcbiYjNDM7XG4mIzQzO1x0bGVuICYjNDM7PSBzY25wcmludGYoYnVmICYjNDM7IGxlbiwgUEFHRV9TSVpFIC0gbGVuLFxuJiM0MztcdFx0XHQgXCYjMzQ7UXVldWUgIFBvb2wgIFNpemUgIEJ1ZmZTaXplICBBY3RpdmUgIEF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1x0bGVuICYjNDM7PSBzY25wcmludGYoYnVmICYjNDM7IGxlbiwgUEFHRV9TSVpFIC0gbGVuLFxuJiM0MztcdFx0XHQgXCYjMzQ7LS0tLS0gIC0tLS0gIC0tLS0gIC0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0tLVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9XG4mIzQzO1x0XHRcdFx0XHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV1bal07XG4mIzQzO1xuJiM0MztcdFx0XHRsZW4gJiM0Mzs9IHNjbnByaW50ZihidWYgJiM0MzsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sXG4mIzQzO1x0XHRcdFx0XHQgXCYjMzQ7JTVkICAlNGQgICU0dSAgJTh1ICAlNmQgICU5ZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCBpLCBqLCBwb29sLVx1MDAzZXNpemUsIHBvb2wtXHUwMDNlYnVmZl9zaXplLFxuJiM0MztcdFx0XHRcdFx0IHBvb2wtXHUwMDNlYWN0aXZlLFxuJiM0MztcdFx0XHRcdFx0IGF0b21pY19yZWFkKFx1MDAyNnBvb2wtXHUwMDNlYXZhaWxhYmxlKSk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAobGVuIFx1MDAzZT0gUEFHRV9TSVpFIC0gMTAwKVxuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gbGVuO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidWZmZXJfcG9vbHMpO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlibXZldGhfYXR0cnNbXSA9IHtcbiYjNDM7XHRcdTAwMjZkZXZfYXR0cl9idWZmZXJfcG9vbHMuYXR0cixcbiYjNDM7XHROVUxMLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWJtdmV0aF9hdHRyX2dyb3VwID0ge1xuJiM0MztcdC5hdHRycyA9IGlibXZldGhfYXR0cnMsXG4mIzQzO307XG4mIzQzO1xuIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXG4ge1xuIFx0aW50IHJjLCBpLCBtYWNfbGVuO1xuQEAgLTE4MzEsNyAmIzQzOzM0NjMsOCBAQCBzdGF0aWMgaW50IGlibXZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdH1cbiBcbi1cdG5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2Yoc3RydWN0IGlibXZldGhfYWRhcHRlciksIElCTVZFVEhfTUFYX1FVRVVFUywgMSk7XG4mIzQzO1x0bmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSxcbiYjNDM7XHRcdFx0XHQgICAgSUJNVkVUSF9NQVhfUVVFVUVTLCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpO1xuIFx0aWYgKCFuZXRkZXYpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFxuQEAgLTE4NDQsNyAmIzQzOzM0NzcsOCBAQCBzdGF0aWMgaW50IGlibXZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKVxuIFx0YWRhcHRlci1cdTAwM2VtY2FzdEZpbHRlclNpemUgPSBiZTMyX3RvX2NwdSgqbWNhc3RGaWx0ZXJTaXplX3ApO1xuIFx0aWJtdmV0aF9pbml0X2xpbmtfc2V0dGluZ3MobmV0ZGV2KTtcbiBcbi1cdG5ldGlmX25hcGlfYWRkX3dlaWdodChuZXRkZXYsIFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaSwgaWJtdmV0aF9wb2xsLCAxNik7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9NQVhfUlhfUVVFVUVTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5ldGlmX25hcGlfYWRkX3dlaWdodChuZXRkZXYsIFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSwgaWJtdmV0aF9wb2xsLCAxNik7XG4gXG4gXHRuZXRkZXYtXHUwMDNlaXJxID0gZGV2LVx1MDAzZWlycTtcbiBcdG5ldGRldi1cdTAwM2VuZXRkZXZfb3BzID0gXHUwMDI2aWJtdmV0aF9uZXRkZXZfb3BzO1xuQEAgLTE4NzYsMTIgJiM0MzszNTEwLDI3IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXG4gXHRcdG5ldGRldi1cdTAwM2VmZWF0dXJlcyB8PSBORVRJRl9GX0ZSQUdMSVNUO1xuIFx0fVxuIFxuJiM0MztcdGlmIChyZXQgPT0gSF9TVUNDRVNTIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAocmV0X2F0dHIgXHUwMDI2IElCTVZFVEhfSUxMQU5fUlhfTVVMVElfUVVFVUVfU1VQUE9SVCkpIHtcbiYjNDM7XHRcdGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUgPSAxO1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzID0gbWluKG51bV9vbmxpbmVfY3B1cygpLCBJQk1WRVRIX0RFRkFVTFRfUVVFVUVTKTtcbiYjNDM7XHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcJiMzNDtSWCBtdWx0aSBxdWV1ZSBtb2RlIGVuYWJsZWQ6ICVkIHF1ZXVlc1xcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0YWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSA9IDA7XG4mIzQzO1x0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSAxO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAocmV0ID09IEhfU1VDQ0VTUyBcdTAwMjZcdTAwMjZcbiBcdCAgICAocmV0X2F0dHIgXHUwMDI2IElCTVZFVEhfSUxMQU5fUlhfTVVMVElfQlVGRl9TVVBQT1JUKSkge1xuLVx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsID0gSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMO1xuJiM0MztcdFx0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpXG4mIzQzO1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwgPSBJQk1WRVRIX01BWF9SWF9RVUVVRTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1JFR1VMQVI7XG4mIzQzO1xuIFx0XHRuZXRkZXZfZGJnKG5ldGRldixcbiBcdFx0XHQgICBcJiMzNDtSWCBNdWx0aS1idWZmZXIgaGNhbGwgc3VwcG9ydGVkIGJ5IEZXLCBiYXRjaCBzZXQgdG8gJXVcXG5cJiMzNDssXG4tXHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwpO1xuJiM0MztcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsKTtcbiBcdH0gZWxzZSB7XG4gXHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwgPSAxO1xuIFx0XHRuZXRkZXZfZGJnKG5ldGRldixcbkBAIC0xODk4LDEwICYjNDM7MzU0NywxMCBAQCBzdGF0aWMgaW50IGlibXZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKVxuIFx0XHRtZW1jcHkocG9vbF9jb3VudCwgcG9vbF9jb3VudF9jbW8sIHNpemVvZihwb29sX2NvdW50KSk7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykge1xuLVx0XHRzdHJ1Y3Qga29iamVjdCAqa29iaiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLmtvYmo7XG4mIzQzO1x0XHRzdHJ1Y3Qga29iamVjdCAqa29iaiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmtvYmo7XG4gXHRcdGludCBlcnJvcjtcbiBcbi1cdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLCBpLFxuJiM0MztcdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLCBpLFxuIFx0XHRcdFx0XHQgcG9vbF9jb3VudFtpXSwgcG9vbF9zaXplW2ldLFxuIFx0XHRcdFx0XHQgcG9vbF9hY3RpdmVbaV0pO1xuIFx0XHRlcnJvciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKGtvYmosIFx1MDAyNmt0eXBlX3ZldGhfcG9vbCxcbkBAIC0xOTM3LDYgJiM0MzszNTg2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXG4gXG4gXHRuZXRkZXZfZGJnKG5ldGRldiwgXCYjMzQ7cmVnaXN0ZXJlZFxcblwmIzM0Oyk7XG4gXG4mIzQzO1x0cmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoXHUwMDI2ZGV2LVx1MDAzZWRldi5rb2JqLCBcdTAwMjZpYm12ZXRoX2F0dHJfZ3JvdXApO1xuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcyByYz0lZFxcblwmIzM0OywgcmMpO1xuJiM0MztcdFx0dW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTtcbiYjNDM7XHRcdGZyZWVfbmV0ZGV2KG5ldGRldik7XG4mIzQzO1x0XHRyZXR1cm4gcmM7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHJldHVybiAwO1xuIH1cbiBcbkBAIC0xOTQ4LDggJiM0MzszNjA1LDEwIEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpXG4gXG4gXHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNmFkYXB0ZXItXHUwMDNld29yayk7XG4gXG4mIzQzO1x0c3lzZnNfcmVtb3ZlX2dyb3VwKFx1MDAyNmRldi1cdTAwM2VkZXYua29iaiwgXHUwMDI2aWJtdmV0aF9hdHRyX2dyb3VwKTtcbiYjNDM7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOylcbi1cdFx0a29iamVjdF9wdXQoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0ua29iaik7XG4mIzQzO1x0XHRrb2JqZWN0X3B1dChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5rb2JqKTtcbiBcbiBcdHVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7XG4gXG5AQCAtMjAzNSwxMSAmIzQzOzM2OTQsMTEgQEAgc3RhdGljIHNzaXplX3QgdmV0aF9wb29sX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLFxuIFx0XHRcdC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGJ1ZmZlciBwb29sIHdpdGggYnVmZmVycyB0aGF0XG4gXHRcdFx0ICAgY2FuIGhvbGQgYSBwYWNrZXQgb2YgdGhlIHNpemUgb2YgdGhlIE1UVSAqL1xuIFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdFx0XHRpZiAocG9vbCA9PSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSlcbiYjNDM7XHRcdFx0XHRpZiAocG9vbCA9PSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXSlcbiBcdFx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcbiYjNDM7XHRcdFx0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmFjdGl2ZSlcbiBcdFx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0XHRpZiAobXR1IFx1MDAzYz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKVxuJiM0MztcdFx0XHRcdGlmIChtdHUgXHUwMDNjPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5idWZmX3NpemUpXG4gXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcbkBAIC0yMDkzLDcgJiM0MzszNzUyLDcgQEAgc3RhdGljIHNzaXplX3QgdmV0aF9wb29sX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLFxuIFx0cnRubF91bmxvY2soKTtcbiBcbiBcdC8qIGtpY2sgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIGFsbG9jYXRlL2RlYWxsb2NhdGUgcG9vbHMgKi9cbi1cdGlibXZldGhfaW50ZXJydXB0KG5ldGRldi1cdTAwM2VpcnEsIG5ldGRldik7XG4mIzQzO1x0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVx1MDAzZWlycSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpWzBdKTtcbiBcdHJldHVybiBjb3VudDtcbiBcbiB1bmxvY2tfZXJyOlxuQEAgLTIxMzMsNyAmIzQzOzM3OTIsOSBAQCBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV92ZXRoX3Bvb2wgPSB7XG4gc3RhdGljIGludCBpYm12ZXRoX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4ge1xuIFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xuLVx0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVx1MDAzZWlycSwgbmV0ZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcbiYjNDM7XG4mIzQzO1x0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVx1MDAzZWlycSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpWzBdKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbkBAIC0yMjEzLDI2ICYjNDM7Mzg3NCwzMiBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sX3Rlc3Qoc3RydWN0IGt1bml0ICp0ZXN0KVxuIFxuIFx0LyogU2V0IHNhbmUgdmFsdWVzIGZvciBidWZmZXIgcG9vbHMgKi9cbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOylcbi1cdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLCBpLFxuJiM0MztcdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLCBpLFxuIFx0XHRcdFx0XHQgcG9vbF9jb3VudFtpXSwgcG9vbF9zaXplW2ldLFxuIFx0XHRcdFx0XHQgcG9vbF9hY3RpdmVbaV0pO1xuIFxuLVx0cG9vbCA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdO1xuJiM0MztcdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXTtcbiBcdHBvb2wtXHUwMDNlc2tidWZmID0ga3VuaXRfa2NhbGxvYyh0ZXN0LCBwb29sLVx1MDAzZXNpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbiBcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgcG9vbC1cdTAwM2Vza2J1ZmYpO1xuIFxuIFx0Y29ycmVsYXRvciA9ICgodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDNjXHUwMDNjIDMyKSB8IDA7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xuLVx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xuJiM0MztcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxuJiM0MztcdFx0XHRpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7XG4mIzQzO1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsXG4mIzQzO1x0XHRcdGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpO1xuIFxuLVx0Y29ycmVsYXRvciA9ICgodTY0KTAgXHUwMDNjXHUwMDNjIDMyKSB8IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdLnNpemU7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xuLVx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xuJiM0MztcdGNvcnJlbGF0b3IgPSAoKHU2NCkwIFx1MDAzY1x1MDAzYyAzMikgfCBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXS5zaXplO1xuJiM0MztcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxuJiM0MztcdFx0XHRpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7XG4mIzQzO1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsXG4mIzQzO1x0XHRcdGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpO1xuIFxuIFx0Y29ycmVsYXRvciA9ICh1NjQpMCB8IDA7XG4gXHRwb29sLVx1MDAzZXNrYnVmZlswXSA9IE5VTEw7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xuLVx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xuJiM0MztcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUZBVUxULFxuJiM0MztcdFx0XHRpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7XG4mIzQzO1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsXG4mIzQzO1x0XHRcdGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpO1xuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuIH1cbkBAIC0yMjU4LDMxICYjNDM7MzkyNSwzMyBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyX3Rlc3Qoc3RydWN0IGt1bml0ICp0ZXN0KVxuIFxuIFx0SU5JVF9XT1JLKFx1MDAyNmFkYXB0ZXItXHUwMDNld29yaywgaWJtdmV0aF9yZXNldF9rdW5pdCk7XG4gXG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbiA9IDE7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4ID0gMDtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkciA9IGt1bml0X2t6YWxsb2ModGVzdCwgc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpLFxuLVx0XHRcdFx0XHRcdCAgICAgR0ZQX0tFUk5FTCk7XG4tXHRLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcik7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9sZW4gPSAxO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbMF0uaW5kZXggPSAwO1xuJiM0MztcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbMF0ucXVldWVfYWRkciA9XG4mIzQzO1x0XHRrdW5pdF9remFsbG9jKHRlc3QsIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSxcbiYjNDM7XHRcdFx0ICAgICAgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0S1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHIpO1xuIFxuIFx0LyogU2V0IHNhbmUgdmFsdWVzIGZvciBidWZmZXIgcG9vbHMgKi9cbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOylcbi1cdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLCBpLFxuJiM0MztcdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLCBpLFxuIFx0XHRcdFx0XHQgcG9vbF9jb3VudFtpXSwgcG9vbF9zaXplW2ldLFxuIFx0XHRcdFx0XHQgcG9vbF9hY3RpdmVbaV0pO1xuIFxuLVx0cG9vbCA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdO1xuJiM0MztcdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXTtcbiBcdHBvb2wtXHUwMDNlc2tidWZmID0ga3VuaXRfa2NhbGxvYyh0ZXN0LCBwb29sLVx1MDAzZXNpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbiBcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgcG9vbC1cdTAwM2Vza2J1ZmYpO1xuIFxuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDNjXHUwMDNjIDMyIHwgMDtcbi1cdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDNjXHUwMDNjIDMyIHwgMDtcbiYjNDM7XHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgMCkpO1xuIFxuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KTAgXHUwMDNjXHUwMDNjIDMyIHwgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF0uc2l6ZTtcbi1cdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XG4mIzQzO1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPVxuJiM0MztcdFx0KHU2NCkwIFx1MDAzY1x1MDAzYyAzMiB8IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdWzBdLnNpemU7XG4mIzQzO1x0S1VOSVRfRVhQRUNUX1BUUl9FUSh0ZXN0LCBOVUxMLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIDApKTtcbiBcbiBcdHBvb2wtXHUwMDNlc2tidWZmWzBdID0gc2tiO1xuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KTAgXHUwMDNjXHUwMDNjIDMyIHwgMDtcbi1cdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgc2tiLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIpKTtcbiYjNDM7XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpMCBcdTAwM2NcdTAwM2MgMzIgfCAwO1xuJiM0MztcdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgc2tiLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIDApKTtcbiBcbiBcdGZsdXNoX3dvcmsoXHUwMDI2YWRhcHRlci1cdTAwM2V3b3JrKTtcbiB9XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmhcbmluZGV4IGQ4NzcxMzY2OGVkMzAwLi4zOTBjNjYwYWY5NzllNyAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmhcbkBAIC0xNCw2ICYjNDM7MTQsOCBAQFxuICNpZm5kZWYgX0lCTVZFVEhfSFxuICNkZWZpbmUgX0lCTVZFVEhfSFxuIFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9ja190eXBlcy5oXHUwMDNlXG4mIzQzO1xuIC8qIGNvbnN0YW50cyBmb3IgSF9NVUxUSUNBU1RfQ1RSTCAqL1xuICNkZWZpbmUgSWJtVmV0aE1jYXN0UmVjZXB0aW9uTW9kaWZ5Qml0ICAgICAweDgwMDAwVUxcbiAjZGVmaW5lIElibVZldGhNY2FzdFJlY2VwdGlvbkVuYWJsZUJpdCAgICAgMHgyMDAwMFVMXG5AQCAtMjgsNiAmIzQzOzMwLDcgQEBcbiAjZGVmaW5lIElibVZldGhNY2FzdFJlbW92ZUZpbHRlciAgICAgMHgyVUxcbiAjZGVmaW5lIElibVZldGhNY2FzdENsZWFyRmlsdGVyVGFibGUgMHgzVUxcbiBcbiYjNDM7I2RlZmluZSBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX1FVRVVFX1NVUFBPUlRcdDB4MDAwMDAwMDAwMDA4MDAwMFVMXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX0JVRkZfU1VQUE9SVFx0MHgwMDAwMDAwMDAwMDQwMDAwVUxcbiAjZGVmaW5lIElCTVZFVEhfSUxMQU5fTFJHX1NSX0VOQUJMRURcdDB4MDAwMDAwMDAwMDAxMDAwMFVMXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX0xSR19TTkRfU1VQUE9SVFx0MHgwMDAwMDAwMDAwMDA4MDAwVUxcbkBAIC02Niw2ICYjNDM7NjksMTY0IEBAIHN0YXRpYyBpbmxpbmUgbG9uZyBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuIFx0XHRcdCAgICBkZXNjNSwgZGVzYzYsIGRlc2M3LCBkZXNjOCk7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogaF9yZWdfbG9naWNhbF9sYW5fcXVldWUgLSBSZWdpc3RlciBhIHN1Ym9yZGluYXRlIHJlY2VpdmUgcXVldWVcbiYjNDM7ICogQHVuaXRfYWRkcmVzczogRGV2aWNlIHVuaXQgYWRkcmVzc1xuJiM0MzsgKiBAYnVmZmVyX2xpc3Q6IERNQSBhZGRyZXNzIG9mIDRLQiBwYWdlIGZvciB0cmFja2luZyByZWdpc3RlcmVkIGJ1ZmZlcnNcbiYjNDM7ICogQHJlY19xdWV1ZTogQnVmZmVyIGRlc2NyaXB0b3Igb2YgcmVjZWl2ZSBxdWV1ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgYSBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlIHdpdGggdGhlIGh5cGVydmlzb3IuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogICBIX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3NcbiYjNDM7ICogICBIX1BBUkFNRVRFUiBpZiBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkXG4mIzQzOyAqXG4mIzQzOyAqIE9uIHN1Y2Nlc3MsIGh5cGVydmlzb3IgcmV0dXJuczpcbiYjNDM7ICogICBSMzogSF9TVUNDRVNTXG4mIzQzOyAqICAgUjQ6IFF1ZXVlIGhhbmRsZVxuJiM0MzsgKiAgIFI1OiBJUlEgbnVtYmVyIGZvciB0aGlzIHF1ZXVlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgaF9yZWdfbG9naWNhbF9sYW5fcXVldWUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9saXN0LFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyByZWNfcXVldWUsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpxdWV1ZV9oYW5kbGUsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICppcnEpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTDlfQlVGU0laRV07XG4mIzQzO1x0bG9uZyByYztcbiYjNDM7XG4mIzQzO1x0cmMgPSBwbHBhcl9oY2FsbDkoSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUsXG4mIzQzO1x0XHRcdCAgcmV0YnVmLCB1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdCAgYnVmZmVyX2xpc3QsIHJlY19xdWV1ZSk7XG4mIzQzO1xuJiM0MztcdGlmIChyYyA9PSBIX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChxdWV1ZV9oYW5kbGUpXG4mIzQzO1x0XHRcdCpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07XG4mIzQzO1x0XHRpZiAoaXJxKVxuJiM0MztcdFx0XHQqaXJxID0gcmV0YnVmWzFdO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSAtIEFkZCBidWZmZXJzIHRvIHN1Ym9yZGluYXRlIHF1ZXVlXG4mIzQzOyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcbiYjNDM7ICogQHF1ZXVlX2hhbmRsZTogUXVldWUgaGFuZGxlIGZyb20gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoKVxuJiM0MzsgKiBAYnVmZmVyc3pudW06IEJ1ZmZlciBzaXplICh1cHBlciAzMiBiaXRzKSB8IGNvdW50IChsb3dlciAzMiBiaXRzKVxuJiM0MzsgKiBAaW9iYTEyOiBCdWZmZXIgYWRkcmVzc2VzIDEgYW5kIDIgcGFja2VkIChhZGRyMSB8IGFkZHIyIFx1MDAzY1x1MDAzYyAzMilcbiYjNDM7ICogQGlvYmEzNDogQnVmZmVyIGFkZHJlc3NlcyAzIGFuZCA0IHBhY2tlZFxuJiM0MzsgKiBAaW9iYTU2OiBCdWZmZXIgYWRkcmVzc2VzIDUgYW5kIDYgcGFja2VkXG4mIzQzOyAqIEBpb2JhNzg6IEJ1ZmZlciBhZGRyZXNzZXMgNyBhbmQgOCBwYWNrZWRcbiYjNDM7ICogQGlvYmE5MTA6IEJ1ZmZlciBhZGRyZXNzZXMgOSBhbmQgMTAgcGFja2VkXG4mIzQzOyAqIEBpb2JhMTExMjogQnVmZmVyIGFkZHJlc3NlcyAxMSBhbmQgMTIgcGFja2VkXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogICBIX1NVQ0NFU1MgLSBBbGwgYnVmZmVycyBhZGRlZCBzdWNjZXNzZnVsbHlcbiYjNDM7ICogICBIX1BBUkFNRVRFUiAtIEludmFsaWQgcGFyYW1ldGVyc1xuJiM0MzsgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgcXVldWVfaGFuZGxlLFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcnN6bnVtLFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlvYmExMixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhMzQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgaW9iYTU2LFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlvYmE3OCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhOTEwLFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlvYmExMTEyKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcGxwYXJfaGNhbGw5KEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlNfUVVFVUUsXG4mIzQzO1x0XHRcdCAgICByZXRidWYsIHVuaXRfYWRkcmVzcyxcbiYjNDM7XHRcdFx0ICAgIHF1ZXVlX2hhbmRsZSwgYnVmZmVyc3pudW0sXG4mIzQzO1x0XHRcdCAgICBpb2JhMTIsIGlvYmEzNCwgaW9iYTU2LFxuJiM0MztcdFx0XHQgICAgaW9iYTc4LCBpb2JhOTEwLCBpb2JhMTExMik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBoX2ZyZWVfbG9naWNhbF9sYW5fYnVmZmVyX3F1ZXVlIC0gRnJlZSBidWZmZXIgZnJvbSBzdWJvcmRpbmF0ZSBxdWV1ZVxuJiM0MzsgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzXG4mIzQzOyAqIEBidWZfc2l6ZTogU2l6ZSBvZiBidWZmZXIgdG8gcmVtb3ZlIGZyb20gcG9vbFxuJiM0MzsgKiBAcXVldWVfaGFuZGxlOiBRdWV1ZSBoYW5kbGUgZnJvbSBoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSgpXG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgYSBidWZmZXIgb2Ygc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgc3Vib3JkaW5hdGUgcXVldWUmIzM5O3MgYnVmZmVyIHBvb2wuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogICBIX1NVQ0NFU1MgLSBCdWZmZXIgcmVtb3ZlZCBzdWNjZXNzZnVsbHlcbiYjNDM7ICogICBIX1BBUkFNRVRFUiAtIEludmFsaWQgcGFyYW1ldGVyc1xuJiM0MzsgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxuJiM0MzsgKiAgIEhfTk9UX0ZPVU5EIC0gQnVmZmVyIHBvb2wgZG9lcyBub3QgZXhpc3RcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBoX2ZyZWVfbG9naWNhbF9sYW5fYnVmZmVyX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplLFxuJiM0MztcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHF1ZXVlX2hhbmRsZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHBscGFyX2hjYWxsOShIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSX1FVRVVFLFxuJiM0MztcdFx0XHQgICAgcmV0YnVmLCB1bml0X2FkZHJlc3MsIGJ1Zl9zaXplLCBxdWV1ZV9oYW5kbGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIC0gRGVyZWdpc3RlciBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlXG4mIzQzOyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcbiYjNDM7ICogQHF1ZXVlX2hhbmRsZTogUXVldWUgaGFuZGxlIGZyb20gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoKVxuJiM0MzsgKlxuJiM0MzsgKiBEZXJlZ2lzdGVycyBhbmQgZnJlZXMgYWxsIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJvcmRpbmF0ZSBxdWV1ZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiAgIEhfU1VDQ0VTUyAtIFF1ZXVlIGZyZWVkIHN1Y2Nlc3NmdWxseVxuJiM0MzsgKiAgIEhfUEFSQU1FVEVSIC0gSW52YWxpZCBwYXJhbWV0ZXJzXG4mIzQzOyAqICAgSF9IQVJEV0FSRSAtIEhhcmR3YXJlIGVycm9yXG4mIzQzOyAqICAgSF9TVEFURSAtIFZJT0Egbm90IGluIHZhbGlkIHN0YXRlXG4mIzQzOyAqICAgSF9CVVNZIC8gSF9MT05HX0JVU1lfKiAtIFJlc291cmNlIGJ1c3ksIHJldHJ5XG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgcXVldWVfaGFuZGxlKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcGxwYXJfaGNhbGw5KEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRSxcbiYjNDM7XHRcdFx0ICAgIHJldGJ1ZiwgdW5pdF9hZGRyZXNzLCBxdWV1ZV9oYW5kbGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl93aXRoX2hhbmRsZSAtIFJlZ2lzdGVyIHByaW1hcnkgcXVldWUgYW5kIGdldCBoYW5kbGVcbiYjNDM7ICogQHVuaXRfYWRkcmVzczogRGV2aWNlIHVuaXQgYWRkcmVzc1xuJiM0MzsgKiBAYnVmZmVyX2xpc3Q6IERNQSBhZGRyZXNzIG9mIGJ1ZmZlciBsaXN0XG4mIzQzOyAqIEByZWNfcXVldWU6IEJ1ZmZlciBkZXNjcmlwdG9yIG9mIHJlY2VpdmUgcXVldWVcbiYjNDM7ICogQGZpbHRlcl9saXN0OiBETUEgYWRkcmVzcyBvZiBmaWx0ZXIgbGlzdFxuJiM0MzsgKiBAbWFjX2FkZHJlc3M6IE1BQyBhZGRyZXNzXG4mIzQzOyAqIEBxdWV1ZV9oYW5kbGU6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIHF1ZXVlIGhhbmRsZVxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgdGhlIHByaW1hcnkgcmVjZWl2ZSBxdWV1ZSAocXVldWUgMCkgd2l0aCB0aGUgaHlwZXJ2aXNvciBhbmRcbiYjNDM7ICogcmV0dXJucyB0aGUgcXVldWUgaGFuZGxlLiBUaGlzIGlzIG5lZWRlZCBpbiBtdWx0aS1xdWV1ZSBtb2RlIHRvIHVzZVxuJiM0MzsgKiBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzX3F1ZXVlKCkgZm9yIGFsbCBxdWV1ZXMgaW5jbHVkaW5nIHF1ZXVlIDAuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogSF9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX2xpc3QsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjX3F1ZXVlLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGZpbHRlcl9saXN0LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG1hY19hZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICB1NjQgKnF1ZXVlX2hhbmRsZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTtcbiYjNDM7XHRsb25nIHJjO1xuJiM0MztcbiYjNDM7XHRyYyA9IHBscGFyX2hjYWxsOShIX1JFR0lTVEVSX0xPR0lDQUxfTEFOLCByZXRidWYsXG4mIzQzO1x0XHRcdCAgdW5pdF9hZGRyZXNzLCBidWZmZXJfbGlzdCwgcmVjX3F1ZXVlLFxuJiM0MztcdFx0XHQgIGZpbHRlcl9saXN0LCBtYWNfYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdGlmIChyYyA9PSBIX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IHF1ZXVlX2hhbmRsZSlcbiYjNDM7XHRcdCpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07XG4mIzQzO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiAvKiBGVyBhbGxvd3MgdXMgdG8gc2VuZCA2IGRlc2NyaXB0b3JzIGJ1dCB3ZSBvbmx5IHVzZSBvbmUgc28gbWFya1xuICAqIHRoZSBvdGhlciA1IGFzIHVudXNlZCAoMClcbiAgKi9cbkBAIC0xMjEsMTUgJiM0MzsyODIsNTUgQEAgc3RhdGljIGlubGluZSBsb25nIGhfaWxsYW5fYXR0cmlidXRlcyh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcyxcbiAjZGVmaW5lIElCTVZFVEhfTUFYX1RYX0JVRl9TSVpFICgxMDI0ICogNjQpXG4gI2RlZmluZSBJQk1WRVRIX01BWF9RVUVVRVMgMTZVXG4gI2RlZmluZSBJQk1WRVRIX0RFRkFVTFRfUVVFVUVTIDhVXG4tI2RlZmluZSBJQk1WRVRIX01BWF9SWF9QRVJfSENBTEwgOFVcbiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMgMTZVXG4mIzQzOyNkZWZpbmUgSUJNVkVUSF9ERUZBVUxUX1JYX1FVRVVFUyAxVVxuJiM0MzsjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1JFR1VMQVIgOFVcbiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRSAxMlVcbiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9QRVJfSENBTEwgMTJVXG4gXG4gc3RhdGljIGludCBwb29sX3NpemVbXSA9IHsgNTEyLCAxMDI0ICogMiwgMTAyNCAqIDE2LCAxMDI0ICogMzIsIDEwMjQgKiA2NCB9O1xuIHN0YXRpYyBpbnQgcG9vbF9jb3VudFtdID0geyAyNTYsIDUxMiwgMjU2LCAyNTYsIDI1NiB9O1xuIHN0YXRpYyBpbnQgcG9vbF9jb3VudF9jbW9bXSA9IHsgMjU2LCA1MTIsIDI1NiwgMjU2LCA2NCB9O1xuLXN0YXRpYyBpbnQgcG9vbF9hY3RpdmVbXSA9IHsgMSwgMSwgMCwgMCwgMX07XG4mIzQzO3N0YXRpYyBpbnQgcG9vbF9hY3RpdmVbXSA9IHsgMSwgMSwgMCwgMCwgMH07XG4gXG4gI2RlZmluZSBJQk1fVkVUSF9JTlZBTElEX01BUCAoKHUxNikweGZmZmYpXG4gXG4mIzQzO3N0cnVjdCBpYm12ZXRoX2hjYWxsX3N0YXRzIHtcbiYjNDM7XHR1NjQgcmVnX2xhbl9xdWV1ZTtcdC8qIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFICovXG4mIzQzO1x0dTY0IHJlZ19sYW47XHRcdC8qIEhfUkVHSVNURVJfTE9HSUNBTF9MQU4gKi9cbiYjNDM7XHR1NjQgYWRkX2J1ZnNfcXVldWU7XHQvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFICovXG4mIzQzO1x0dTY0IGFkZF9idWZzO1x0XHQvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTICovXG4mIzQzO1x0dTY0IGFkZF9idWY7XHRcdC8qIEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUiAqL1xuJiM0MztcdHU2NCBmcmVlX2xhbl9xdWV1ZTtcdC8qIEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRSAqL1xuJiM0MztcdHU2NCBmcmVlX2xhbjtcdFx0LyogSF9GUkVFX0xPR0lDQUxfTEFOICovXG4mIzQzO1x0dTY0IHNlbmRfbGFuO1x0XHQvKiBIX1NFTkRfTE9HSUNBTF9MQU4gKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBpYm12ZXRoX3J4X3F1ZXVlX3N0YXRzIHtcbiYjNDM7XHR1NjQgcGFja2V0cztcbiYjNDM7XHR1NjQgYnl0ZXM7XG4mIzQzO1x0dTY0IGludGVycnVwdHM7XG4mIzQzO1x0dTY0IHBvbGxzO1xuJiM0MztcdHU2NCBsYXJnZV9wYWNrZXRzO1xuJiM0MztcdHU2NCBpbnZhbGlkX2J1ZmZlcnM7XG4mIzQzO1x0dTY0IG5vX2J1ZmZlcl9kcm9wcztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzIHtcbiYjNDM7XHR1NjQgcGFja2V0cztcbiYjNDM7XHR1NjQgYnl0ZXM7XG4mIzQzO1x0dTY0IGxhcmdlX3BhY2tldHM7XG4mIzQzO1x0dTY0IGRyb3BwZWRfcGFja2V0cztcbiYjNDM7XHR1NjQgc2VuZF9mYWlsdXJlcztcbiYjNDM7XHR1NjQgY2hlY2tzdW1fb2ZmbG9hZDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgSUJNVkVUSF9OVU1fUlhfUVNUQVRTIFxcXG4mIzQzO1x0KHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgSUJNVkVUSF9OVU1fVFhfUVNUQVRTIFxcXG4mIzQzO1x0KHNpemVvZihzdHJ1Y3QgaWJtdmV0aF90eF9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSlcbiYjNDM7XG4gc3RydWN0IGlibXZldGhfYnVmZl9wb29sIHtcbiAgICAgdTMyIHNpemU7XG4gICAgIHUzMiBpbmRleDtcbkBAIC0xNTIsMjMgJiM0MzszNTMsMjggQEAgc3RydWN0IGlibXZldGhfcnhfcSB7XG4gICAgIGRtYV9hZGRyX3QgcXVldWVfZG1hO1xuICAgICB1MzIgICAgICAgIHF1ZXVlX2xlbjtcbiAgICAgc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSAqcXVldWVfYWRkcjtcbiYjNDM7XHRzcGlubG9ja190XHRyZXBsZW5pc2hfbG9jaztcdC8qIHNlcmlhbGl6ZXMgcGVyLXF1ZXVlIGJ1ZmZlciByZXBsZW5pc2ggKi9cbiB9O1xuIFxuIHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIge1xuIFx0c3RydWN0IHZpb19kZXYgKnZkZXY7XG4gXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2O1xuLVx0c3RydWN0IG5hcGlfc3RydWN0IG5hcGk7XG4mIzQzO1x0c3RydWN0IG5hcGlfc3RydWN0IG5hcGlbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xuIFx0dW5zaWduZWQgaW50IG1jYXN0RmlsdGVyU2l6ZTtcbi1cdHZvaWQgKmJ1ZmZlcl9saXN0X2FkZHI7XG4mIzQzO1x0dm9pZCAqYnVmZmVyX2xpc3RfYWRkcltJQk1WRVRIX01BWF9SWF9RVUVVRVNdO1xuIFx0dm9pZCAqZmlsdGVyX2xpc3RfYWRkcjtcbiBcdHZvaWQgKnR4X2x0Yl9wdHJbSUJNVkVUSF9NQVhfUVVFVUVTXTtcbiBcdHVuc2lnbmVkIGludCB0eF9sdGJfc2l6ZTtcbiBcdGRtYV9hZGRyX3QgdHhfbHRiX2RtYVtJQk1WRVRIX01BWF9RVUVVRVNdO1xuLVx0ZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWE7XG4mIzQzO1x0ZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbiBcdGRtYV9hZGRyX3QgZmlsdGVyX2xpc3RfZG1hO1xuLVx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sIHJ4X2J1ZmZfcG9vbFtJQk1WRVRIX05VTV9CVUZGX1BPT0xTXTtcbi1cdHN0cnVjdCBpYm12ZXRoX3J4X3EgcnhfcXVldWU7XG4mIzQzO1x0c3RydWN0IGlibXZldGhfYnVmZl9wb29sIHJ4X2J1ZmZfcG9vbFtJQk1WRVRIX01BWF9SWF9RVUVVRVNdW0lCTVZFVEhfTlVNX0JVRkZfUE9PTFNdO1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX3J4X3EgcnhfcXVldWVbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbiYjNDM7XHR1NjQgcXVldWVfaGFuZGxlW0lCTVZFVEhfTUFYX1JYX1FVRVVFU107XG4mIzQzO1x0dW5zaWduZWQgaW50IHF1ZXVlX2lycVtJQk1WRVRIX01BWF9SWF9RVUVVRVNdO1xuJiM0MztcdGludCBtdWx0aV9xdWV1ZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbnVtX3J4X3F1ZXVlcztcbiBcdGludCByeF9jc3VtO1xuIFx0aW50IGxhcmdlX3NlbmQ7XG4gXHRib29sIGlzX2FjdGl2ZV90cnVuaztcbkBAIC0xODgsNiAmIzQzOzM5NCwxMiBAQCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyIHtcbiBcdHU2NCB0eF9zZW5kX2ZhaWxlZDtcbiBcdHU2NCB0eF9sYXJnZV9wYWNrZXRzO1xuIFx0dTY0IHJ4X2xhcmdlX3BhY2tldHM7XG4mIzQzO1xuJiM0MztcdC8qIE11bHRpLXF1ZXVlIHN0YXRpc3RpY3MgKi9cbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9oY2FsbF9zdGF0cyBoY2FsbF9zdGF0cztcbiYjNDM7XHRzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyAqcnhfcXN0YXRzO1xuJiM0MztcdHN0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzICp0eF9xc3RhdHM7XG4mIzQzO1xuIFx0LyogRXRodG9vbCBzZXR0aW5ncyAqL1xuIFx0dTggZHVwbGV4O1xuIFx0dTMyIHNwZWVkO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzMwIDIzOjA1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lCTVZFVEgmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpYm12ZXRoX3NldF9jaGFubmVscyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzJiMzNDssCiAgICAmIzM0O2libXZldGhfdG9nZ2xlX2lycSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX29wZW4mIzM0OywKICAgICYjMzQ7aWJtdmV0aF9jbG9zZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIG11bHRpLXF1ZXVlIHN1cHBvcnQgdG8gdGhlIGlibXZldGggZHJpdmVyLCBpbnRyb2R1Y2luZyBuZXcgaHlwZXJjYWxscyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBxdWV1ZSBtYW5hZ2VtZW50LCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBldGh0b29sIG9wZXJhdGlvbnMuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCB2aWEgbmV0d29yayBvcGVyYXRpb25zIGFuZCBldGh0b29sIGNvbW1hbmRzLCBtYWtpbmcgdGhlbSBzdWl0YWJsZSBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNGI0YzBjZDQyY2NlZWRiOTgwM2I3YzY5YzRlZmUzMzI3NmZkZDcyMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgSnVuIDMwIDIzOjA1OjQ0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCmluZGV4IGRmZjkwYTdkN2Y3MGI4Li5iZjJmMWIwMzU2YzQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaApAQCAtMzYyLDcgJiM0MzszNjIsMTEgQEAKICNkZWZpbmUgSF9HVUVTVF9ERUxFVEUJCTB4NDg4CiAjZGVmaW5lIEhfUEtTX1dSQVBfT0JKRUNUCTB4NDkwCiAjZGVmaW5lIEhfUEtTX1VOV1JBUF9PQkpFQ1QJMHg0OTQKLSNkZWZpbmUgTUFYX0hDQUxMX09QQ09ERQlIX1BLU19VTldSQVBfT0JKRUNUCiYjNDM7I2RlZmluZSBIX1JFR19MT0dJQ0FMX0xBTl9RVUVVRSAweDQ5QwomIzQzOyNkZWZpbmUgSF9BRERfTE9HSUNBTF9MQU5fQlVGRkVSU19RVUVVRSAweDRBMAomIzQzOyNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX0JVRkZFUl9RVUVVRSAweDRBNAomIzQzOyNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX1FVRVVFIDB4NEE4CiYjNDM7I2RlZmluZSBNQVhfSENBTExfT1BDT0RFCUhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRQogCiAvKiBTY29wZSBhcmdzIGZvciBIX1NDTV9VTkJJTkRfQUxMICovCiAjZGVmaW5lIEhfVU5CSU5EX1NDT1BFX0FMTCAoMHgxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMKaW5kZXggNzNlMDUxZDI2YjlkODguLmQ3YmYwMTI3MTE2MWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMKQEAgLTIxLDYgJiM0MzsyMSw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvc2tidWZmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ludGVycnVwdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pcnEuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaXJxZG9tYWluLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wbS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2V0aHRvb2wuaCZndDsKQEAgLTI4LDYgJiM0MzszMCw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvaXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9pcHY2LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zcGlubG9jay5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9odmNhbGwuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKICNpbmNsdWRlICZsdDthc20vdmlvLmgmZ3Q7CkBAIC05NSw0OSAmIzQzOzk4LDg5IEBAIHN0YXRpYyBzdHJ1Y3QgaWJtdmV0aF9zdGF0IGlibXZldGhfc3RhdHNbXSA9IHsKIAl7ICYjMzQ7ZndfZW5hYmxlZF9pcHY2X2NzdW0mIzM0OywgSUJNVkVUSF9TVEFUX09GRihmd19pcHY2X2NzdW1fc3VwcG9ydCkgfSwKIAl7ICYjMzQ7dHhfbGFyZ2VfcGFja2V0cyYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKHR4X2xhcmdlX3BhY2tldHMpIH0sCiAJeyAmIzM0O3J4X2xhcmdlX3BhY2tldHMmIzM0OywgSUJNVkVUSF9TVEFUX09GRihyeF9sYXJnZV9wYWNrZXRzKSB9LAotCXsgJiMzNDtmd19lbmFibGVkX2xhcmdlX3NlbmQmIzM0OywgSUJNVkVUSF9TVEFUX09GRihmd19sYXJnZV9zZW5kX3N1cHBvcnQpIH0KJiM0MzsJeyAmIzM0O2Z3X2VuYWJsZWRfbGFyZ2Vfc2VuZCYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkgfSwKJiM0MzsJeyAmIzM0O2hjYWxsX3JlZ19sYW5fcXVldWUmIzM0OywgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5yZWdfbGFuX3F1ZXVlKSB9LAomIzQzOwl7ICYjMzQ7aGNhbGxfcmVnX2xhbiYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLnJlZ19sYW4pIH0sCiYjNDM7CXsgJiMzNDtoY2FsbF9hZGRfYnVmc19xdWV1ZSYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWZzX3F1ZXVlKSB9LAomIzQzOwl7ICYjMzQ7aGNhbGxfYWRkX2J1ZnMmIzM0OywgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5hZGRfYnVmcykgfSwKJiM0MzsJeyAmIzM0O2hjYWxsX2FkZF9idWYmIzM0OywgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5hZGRfYnVmKSB9LAomIzQzOwl7ICYjMzQ7aGNhbGxfZnJlZV9sYW5fcXVldWUmIzM0OywgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSkgfSwKJiM0MzsJeyAmIzM0O2hjYWxsX2ZyZWVfbGFuJiMzNDssIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuZnJlZV9sYW4pIH0sCiYjNDM7CXsgJiMzNDtoY2FsbF9zZW5kX2xhbiYjMzQ7LCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLnNlbmRfbGFuKSB9LAogfTsKIAogLyogc2ltcGxlIG1ldGhvZHMgb2YgZ2V0dGluZyBkYXRhIGZyb20gdGhlIGN1cnJlbnQgcnhxIGVudHJ5ICovCi1zdGF0aWMgaW5saW5lIHUzMiBpYm12ZXRoX3J4cV9mbGFncyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3N0YXRpYyBpbmxpbmUgdTMyIGlibXZldGhfcnhxX2ZsYWdzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCSAgICBpbnQgcXVldWVfaW5kZXgpCiB7Ci0JcmV0dXJuIGJlMzJfdG9fY3B1KGFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci0mZ3Q7cnhfcXVldWUuaW5kZXhdLmZsYWdzX29mZik7CiYjNDM7CXN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9ICZhbXA7YWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaW5kZXhdOwomIzQzOwomIzQzOwlyZXR1cm4gYmUzMl90b19jcHUocnhxLSZndDtxdWV1ZV9hZGRyW3J4cS0mZ3Q7aW5kZXhdLmZsYWdzX29mZik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3RvZ2dsZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkgICAgIGludCBxdWV1ZV9pbmRleCkKJiM0Mzt7CiYjNDM7CXJldHVybiAoaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpICZhbXA7IElCTVZFVEhfUlhRX1RPR0dMRSkgJmd0OyZndDsKJiM0MzsJCUlCTVZFVEhfUlhRX1RPR0dMRV9TSElGVDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfdG9nZ2xlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7c3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSAgICAgaW50IHF1ZXVlX2luZGV4KQogewotCXJldHVybiAoaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgJmFtcDsgSUJNVkVUSF9SWFFfVE9HR0xFKSAmZ3Q7Jmd0OwotCQkJSUJNVkVUSF9SWFFfVE9HR0xFX1NISUZUOwomIzQzOwlyZXR1cm4gaWJtdmV0aF9yeHFfdG9nZ2xlKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSA9PQomIzQzOwkJYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaW5kZXhdLnRvZ2dsZTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9idWZmZXJfdmFsaWQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSAgIGludCBxdWV1ZV9pbmRleCkKIHsKLQlyZXR1cm4gaWJtdmV0aF9yeHFfdG9nZ2xlKGFkYXB0ZXIpID09IGFkYXB0ZXItJmd0O3J4X3F1ZXVlLnRvZ2dsZTsKJiM0MzsJcmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSAmYW1wOyBJQk1WRVRIX1JYUV9WQUxJRDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7c3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfb2Zmc2V0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCQkgICBpbnQgcXVldWVfaW5kZXgpCiB7Ci0JcmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpICZhbXA7IElCTVZFVEhfUlhRX1ZBTElEOwomIzQzOwlyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpICZhbXA7IElCTVZFVEhfUlhRX09GRl9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0MztzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSAgIGludCBxdWV1ZV9pbmRleCkKIHsKLQlyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgJmFtcDsgSUJNVkVUSF9SWFFfT0ZGX01BU0s7CiYjNDM7CXJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgJmFtcDsgSUJNVkVUSF9SWFFfTFJHX1BLVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCQkgICBpbnQgcXVldWVfaW5kZXgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSAmYW1wO2FkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2luZGV4XTsKJiM0MzsKJiM0MzsJcmV0dXJuIGJlMzJfdG9fY3B1KHJ4cS0mZ3Q7cXVldWVfYWRkcltyeHEtJmd0O2luZGV4XS5sZW5ndGgpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wKJiM0MztpYm12ZXRoX3J4cV9jb3JyZWxhdG9yX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCwKJiM0MzsJCQkgICAgIHU2NCBjb3JyZWxhdG9yKQogewotCXJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSAmYW1wOyBJQk1WRVRIX1JYUV9MUkdfUEtUOwomIzQzOwl1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgJmd0OyZndDsgMzI7CiYjNDM7CXVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgJmFtcDsgMHhmZmZmZmZmZlVMOwomIzQzOwomIzQzOwlyZXR1cm4gcG9vbCAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFMgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgaW5kZXggJmx0OyBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2ZyYW1lX2xlbmd0aChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3J4cV9hZHZhbmNlKHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSkKIHsKLQlyZXR1cm4gYmUzMl90b19jcHUoYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLSZndDtyeF9xdWV1ZS5pbmRleF0ubGVuZ3RoKTsKJiM0MzsJaWYgKCYjNDM7JiM0MztyeHEtJmd0O2luZGV4ID09IHJ4cS0mZ3Q7bnVtX3Nsb3RzKSB7CiYjNDM7CQlyeHEtJmd0O2luZGV4ID0gMDsKJiM0MzsJCXJ4cS0mZ3Q7dG9nZ2xlID0gIXJ4cS0mZ3Q7dG9nZ2xlOwomIzQzOwl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2NzdW1fZ29vZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2NzdW1fZ29vZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkJaW50IHF1ZXVlX2luZGV4KQogewotCXJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSAmYW1wOyBJQk1WRVRIX1JYUV9DU1VNX0dPT0Q7CiYjNDM7CXJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgJmFtcDsgSUJNVkVUSF9SWFFfQ1NVTV9HT09EOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlibXZldGhfcmVhbF9tYXhfdHhfcXVldWVzKHZvaWQpCkBAIC0xNDcsNiAmIzQzOzE5MCw0NzIgQEAgc3RhdGljIHVuc2lnbmVkIGludCBpYm12ZXRoX3JlYWxfbWF4X3R4X3F1ZXVlcyh2b2lkKQogCXJldHVybiBtaW4obl9jcHUsIElCTVZFVEhfTUFYX1FVRVVFUyk7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2FsbG9jX2ZpbHRlcl9saXN0IC0gQWxsb2NhdGUgYW5kIG1hcCBmaWx0ZXIgbGlzdAomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBpYm12ZXRoX2FsbG9jX2ZpbHRlcl9saXN0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO2FkYXB0ZXItJmd0O3ZkZXYtJmd0O2RldjsKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItJmd0O25ldGRldjsKJiM0MzsKJiM0MzsJYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfYWRkciA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBmaWx0ZXIgcGFnZXNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKJiM0MzsJCQkJCQkgIGFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIsCiYjNDM7CQkJCQkJICA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7CiYjNDM7CWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2RtYSkpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBtYXAgZmlsdGVyIGxpc3QgcGFnZXNcbiYjMzQ7KTsKJiM0MzsJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9hZGRyKTsKJiM0MzsJCWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIgPSBOVUxMOwomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CX0KJiM0MzsKJiM0MzsJbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7ZmlsdGVyIGxpc3QgQCAweCVwIChETUE6IDB4JWxseClcbiYjMzQ7LAomIzQzOwkJICAgYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfYWRkciwKJiM0MzsJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZnJlZV9maWx0ZXJfbGlzdCAtIEZyZWUgZmlsdGVyIGxpc3QgcmVzb3VyY2VzCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhbXA7YWRhcHRlci0mZ3Q7dmRldi0mZ3Q7ZGV2OwomIzQzOwomIzQzOwlpZiAoYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hKSB7CiYjNDM7CQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hLCA0MDk2LAomIzQzOwkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOwomIzQzOwkJYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfYWRkcikgewomIzQzOwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIpOwomIzQzOwkJYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfYWRkciA9IE5VTEw7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9hbGxvY19yeF9xc3RhdHMgLSBBbGxvY2F0ZSBwZXItcXVldWUgUlggc3RhdGlzdGljcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBmYWlsdXJlCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3sKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfcXN0YXRzID0ga2NhbGxvYyhJQk1WRVRIX01BWF9SWF9RVUVVRVMsCiYjNDM7CQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3F1ZXVlX3N0YXRzKSwKJiM0MzsJCQkJICAgICBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFhZGFwdGVyLSZndDtyeF9xc3RhdHMpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZnJlZV9yeF9xc3RhdHMgLSBGcmVlIHBlci1xdWV1ZSBSWCBzdGF0aXN0aWNzCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlrZnJlZShhZGFwdGVyLSZndDtyeF9xc3RhdHMpOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xc3RhdHMgPSBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0cyAtIEFsbG9jYXRlIHBlci1xdWV1ZSBUWCBzdGF0aXN0aWNzCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGlibXZldGhfYWxsb2NfdHhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlhZGFwdGVyLSZndDt0eF9xc3RhdHMgPSBrY2FsbG9jKElCTVZFVEhfTUFYX1FVRVVFUywKJiM0MzsJCQkJICAgICBzaXplb2Yoc3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMpLAomIzQzOwkJCQkgICAgIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIWFkYXB0ZXItJmd0O3R4X3FzdGF0cykKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9mcmVlX3R4X3FzdGF0cyAtIEZyZWUgcGVyLXF1ZXVlIFRYIHN0YXRpc3RpY3MKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0Mzt7CiYjNDM7CWtmcmVlKGFkYXB0ZXItJmd0O3R4X3FzdGF0cyk7CiYjNDM7CWFkYXB0ZXItJmd0O3R4X3FzdGF0cyA9IE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfYWxsb2NfcnhfcXVldWVzIC0gQWxsb2NhdGUgcGVyLXF1ZXVlIFJYIHJlc291cmNlcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBwZXIgUlggcXVldWUKJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHJ4cV9lbnRyaWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IGRldmljZSAqZGV2ID0gJmFtcDthZGFwdGVyLSZndDt2ZGV2LSZndDtkZXY7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLSZndDtuZXRkZXY7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbaV0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJCWlmICghYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkcltpXSkgewomIzQzOwkJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgbGlzdCBmb3IgcXVldWUgJWRcbiYjMzQ7LCBpKTsKJiM0MzsJCQlnb3RvIGVycl9jbGVhbnVwOwomIzQzOwkJfQomIzQzOwomIzQzOwkJYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfbGVuID0KJiM0MzsJCQlzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllczsKJiM0MzsJCWFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIgPQomIzQzOwkJCWRtYV9hbGxvY19jb2hlcmVudChkZXYsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2xlbiwKJiM0MzsJCQkJCSAgICZhbXA7YWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfZG1hLAomIzQzOwkJCQkJICAgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAoIWFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIpIHsKJiM0MzsJCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDt1bmFibGUgdG8gYWxsb2NhdGUgUlggcXVldWUgZm9yIHF1ZXVlICVkXG4mIzM0OywgaSk7CiYjNDM7CQkJZ290byBlcnJfY2xlYW51cDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYVtpXSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKJiM0MzsJCQkJCQkJICAgICBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW2ldLAomIzQzOwkJCQkJCQkgICAgIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKJiM0MzsJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYVtpXSkpIHsKJiM0MzsJCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDt1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxuJiMzNDssIGkpOwomIzQzOwkJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYVtpXSA9IDA7CiYjNDM7CQkJZ290byBlcnJfY2xlYW51cDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLmluZGV4ID0gMDsKJiM0MzsJCWFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLm51bV9zbG90cyA9IHJ4cV9lbnRyaWVzOwomIzQzOwkJYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0udG9nZ2xlID0gMTsKJiM0MzsJCXNwaW5fbG9ja19pbml0KCZhbXA7YWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucmVwbGVuaXNoX2xvY2spOwomIzQzOwomIzQzOwkJbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7cXVldWUgJWQ6IGJ1ZmZlcl9saXN0IEAgMHglcCAoRE1BOiAweCVsbHgpLCByeF9xdWV1ZSBAIDB4JXAgKERNQTogMHglbGx4KSwgJWxsdSBlbnRyaWVzXG4mIzM0OywKJiM0MzsJCQkgICBpLCBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW2ldLAomIzQzOwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW2ldLAomIzQzOwkJCSAgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsCiYjNDM7CQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLSZndDtyeF9xdWV1ZVtpXS5xdWV1ZV9kbWEsCiYjNDM7CQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZW50cmllcyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7YWxsb2NhdGVkICVkIFJYIHF1ZXVlKHMpIHdpdGggJWQgZW50cmllcyBlYWNoXG4mIzM0OywKJiM0MzsJCSAgIGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXMsIHJ4cV9lbnRyaWVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyX2NsZWFudXA6CiYjNDM7CS8qIENsZWFuIHVwIHByZXZpb3VzbHkgYWxsb2NhdGVkIHF1ZXVlcyAqLwomIzQzOwlmb3IgKDsgaSAmZ3Q7PSAwOyBpLS0pIHsKJiM0MzsJCWlmIChhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbaV0pIHsKJiM0MzsJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW2ldLAomIzQzOwkJCQkJIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbaV0gPSAwOwomIzQzOwkJfQomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIpIHsKJiM0MzsJCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2xlbiwKJiM0MzsJCQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfYWRkciwKJiM0MzsJCQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfZG1hKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJCWlmIChhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW2ldKSB7CiYjNDM7CQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbaV0pOwomIzQzOwkJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbaV0gPSBOVUxMOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtRU5PTUVNOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzIC0gRnJlZSBhbGwgUlggcXVldWUgcmVzb3VyY2VzCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO2FkYXB0ZXItJmd0O3ZkZXYtJmd0O2RldjsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CW5ldGRldl9kYmcoYWRhcHRlci0mZ3Q7bmV0ZGV2LCAmIzM0O2NsZWFuaW5nIHVwICVkIFJYIHF1ZXVlKHMpXG4mIzM0OywKJiM0MzsJCSAgIGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXMpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbaV0pIHsKJiM0MzsJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW2ldLAomIzQzOwkJCQkJIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbaV0gPSAwOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIpIHsKJiM0MzsJCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW2ldLnF1ZXVlX2xlbiwKJiM0MzsJCQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfYWRkciwKJiM0MzsJCQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWVbaV0ucXVldWVfZG1hKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmIChhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW2ldKSB7CiYjNDM7CQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbaV0pOwomIzQzOwkJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbaV0gPSBOVUxMOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfdG9nZ2xlX2lycSAtIENvbW1vbiBoZWxwZXIgdG8gZW5hYmxlL2Rpc2FibGUgcXVldWUgaW50ZXJydXB0cwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHF1ZXVlX2luZGV4OiBJbmRleCBvZiB0aGUgcXVldWUgKDAgZm9yIHByaW1hcnksIDEmIzQzOyBmb3Igc3Vib3JkaW5hdGUpCiYjNDM7ICogQGVuYWJsZTogdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKJiM0MzsgKgomIzQzOyAqIEZvciBxdWV1ZSAwIChwcmltYXJ5KSwgdXNlcyBoX3Zpb19zaWduYWwoKSBhcyBpdCYjMzk7cyByZWdpc3RlcmVkIHZpYQomIzQzOyAqIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oKS4gRm9yIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMSYjNDM7KSwgdXNlcyBIX1ZJT0NUTAomIzQzOyAqIHdpdGggSF9FTkFCTEUvRElTQUJMRV9WSU9fSU5URVJSVVBUIGZvciBwZXItcXVldWUgaW50ZXJydXB0IGNvbnRyb2wuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF90b2dnbGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCwgYm9vbCBlbmFibGUpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHJjOwomIzQzOwl1bnNpZ25lZCBsb25nIGlycSA9IGFkYXB0ZXItJmd0O3F1ZXVlX2lycVtxdWV1ZV9pbmRleF07CiYjNDM7CWNvbnN0IGNoYXIgKmFjdGlvbiA9IGVuYWJsZSA/ICYjMzQ7ZW5hYmxlJiMzNDsgOiAmIzM0O2Rpc2FibGUmIzM0OzsKJiM0MzsKJiM0MzsJaWYgKHF1ZXVlX2luZGV4ID09IDApIHsKJiM0MzsJCS8qIFByaW1hcnkgcXVldWU6IHVzZSBoX3Zpb19zaWduYWwoKSAqLwomIzQzOwkJcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci0mZ3Q7dmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJCQkgIGVuYWJsZSA/IFZJT19JUlFfRU5BQkxFIDogVklPX0lSUV9ESVNBQkxFKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIFN1Ym9yZGluYXRlIHF1ZXVlczogdXNlIEhfVklPQ1RMIHdpdGggaGFyZHdhcmUgSVJRICovCiYjNDM7CQlzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwomIzQzOwkJaXJxX2h3X251bWJlcl90IGh3aXJxOwomIzQzOwkJdTY0IHZpb2N0bF9jbWQgPSBlbmFibGUgPyBIX0VOQUJMRV9WSU9fSU5URVJSVVBUIDogSF9ESVNBQkxFX1ZJT19JTlRFUlJVUFQ7CiYjNDM7CiYjNDM7CQlpZiAoIWlycV9kYXRhKSB7CiYjNDM7CQkJbmV0ZGV2X2VycihhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJCSAgICYjMzQ7RmFpbGVkIHRvIGdldCBJUlEgZGF0YSBmb3IgcXVldWUgJWQgKHZpcnE9JWx1KVxuJiMzNDssCiYjNDM7CQkJCSAgIHF1ZXVlX2luZGV4LCBpcnEpOwomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaHdpcnEgPSBpcnFkX3RvX2h3aXJxKGlycV9kYXRhKTsKJiM0MzsJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfVklPQ1RMLAomIzQzOwkJCQkJYWRhcHRlci0mZ3Q7dmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJCQkJdmlvY3RsX2NtZCwKJiM0MzsJCQkJCWh3aXJxLCAwLCAwKTsKJiM0MzsKJiM0MzsJCWlmIChyYyA9PSBIX1BBUkFNRVRFUikgewomIzQzOwkJCS8qIEhfUEFSQU1FVEVSIGlzIG5vbi1mYXRhbCB3aGVuIElSUSBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuICovCiYjNDM7CQkJbmV0ZGV2X3dhcm5fb25jZShhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJCQkgJiMzNDtIX1ZJT0NUTCAlcyBJUlEgcmV0dXJuZWQgSF9QQVJBTUVURVIgZm9yIHF1ZXVlICVkIChod2lycT0lbHUpXG4mIzM0OywKJiM0MzsJCQkJCSBhY3Rpb24sIHF1ZXVlX2luZGV4LCBod2lycSk7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHJjKQomIzQzOwkJbmV0ZGV2X2VycihhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJICAgJiMzNDtGYWlsZWQgdG8gJXMgSVJRIGZvciBxdWV1ZSAlZCwgcmM9JWxkXG4mIzM0OywKJiM0MzsJCQkgICBhY3Rpb24sIHF1ZXVlX2luZGV4LCByYyk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9kaXNhYmxlX2lycSAtIERpc2FibGUgaW50ZXJydXB0IGZvciBhIHNwZWNpZmljIHF1ZXVlCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAcXVldWVfaW5kZXg6IEluZGV4IG9mIHRoZSBxdWV1ZSAoMCBmb3IgcHJpbWFyeSwgMSYjNDM7IGZvciBzdWJvcmRpbmF0ZSkKJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX2Rpc2FibGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCkKJiM0Mzt7CiYjNDM7CXJldHVybiBpYm12ZXRoX3RvZ2dsZV9pcnEoYWRhcHRlciwgcXVldWVfaW5kZXgsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9lbmFibGVfaXJxIC0gRW5hYmxlIGludGVycnVwdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHF1ZXVlX2luZGV4OiBJbmRleCBvZiB0aGUgcXVldWUgKDAgZm9yIHByaW1hcnksIDEmIzQzOyBmb3Igc3Vib3JkaW5hdGUpCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF9lbmFibGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCkKJiM0Mzt7CiYjNDM7CXJldHVybiBpYm12ZXRoX3RvZ2dsZV9pcnEoYWRhcHRlciwgcXVldWVfaW5kZXgsIHRydWUpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzIC0gRHJvcCB2aXJxIG1hcHBpbmdzIGZvciBxdWV1ZXMgMS4uTgomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBTdWJvcmRpbmF0ZSBxdWV1ZXMgZ2V0IG1hcHBpbmdzIGZyb20gaXJxX2NyZWF0ZV9tYXBwaW5nKCkgZHVyaW5nIFBIWVAKJiM0MzsgKiByZWdpc3RyYXRpb24uICBRdWV1ZSAwIHVzZXMgbmV0ZGV2LSZndDtpcnEgZnJvbSBkZXZpY2UgdHJlZSBhbmQgaXMgbGVmdCBhbG9uZS4KJiM0MzsgKiBDYWxsIGFmdGVyIGZyZWVfaXJxKCkgd2hlbiBoYW5kbGVycyB3ZXJlIGluc3RhbGxlZCwgb3IgYWxvbmUgd2hlbiBvcGVuCiYjNDM7ICogZmFpbHMgZHVyaW5nIHJlZ2lzdGVyX3J4X3F1ZXVlcygpIGJlZm9yZSByZXF1ZXN0X2lycSgpLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkCiYjNDM7aWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3F1ZXVlX2lycVtpXSkgewomIzQzOwkJCWlycV9kaXNwb3NlX21hcHBpbmcoYWRhcHRlci0mZ3Q7cXVldWVfaXJxW2ldKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0gPSAwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfc2V0dXBfcnhfaW50ZXJydXB0cyAtIFJlZ2lzdGVyIElSUSBoYW5kbGVycyBhbmQgZW5hYmxlIE5BUEkKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqCiYjNDM7ICogUmVnaXN0ZXJzIGludGVycnVwdCBoYW5kbGVycyBmb3IgYWxsIFJYIHF1ZXVlcyBhbmQgZW5hYmxlcyBOQVBJIHBvbGxpbmcuCiYjNDM7ICogRm9yIG11bHRpLXF1ZXVlIG1vZGUsIGVuYWJsZXMgaHlwZXJ2aXNvciBpbnRlcnJ1cHQgZGVsaXZlcnkgb25seSBhZnRlcgomIzQzOyAqIGV2ZXJ5IHF1ZXVlIGhhcyBhIExpbnV4IGhhbmRsZXIgaW5zdGFsbGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLSZndDtuZXRkZXY7CiYjNDM7CWludCBpLCByYywgbnVtID0gYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG51bTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghYWRhcHRlci0mZ3Q7cXVldWVfaXJxW2ldKSB7CiYjNDM7CQkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7cXVldWUgJWQgaGFzIGludmFsaWQgSVJRICgwKVxuJiMzNDssIGkpOwomIzQzOwkJCXJjID0gLUVJTlZBTDsKJiM0MzsJCQlnb3RvIGVycl9mcmVlX2lycXM7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlyYyA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItJmd0O3F1ZXVlX2lycVtpXSwgaWJtdmV0aF9pbnRlcnJ1cHQsCiYjNDM7CQkJCSAwLCBuZXRkZXYtJmd0O25hbWUsICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSk7CiYjNDM7CQlpZiAocmMpIHsKJiM0MzsJCQluZXRkZXZfZXJyKG5ldGRldiwKJiM0MzsJCQkJICAgJiMzNDtyZXF1ZXN0X2lycSgpIGZhaWxlZCBmb3IgaXJxIDB4JXggcXVldWUgJWQ6ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgYWRhcHRlci0mZ3Q7cXVldWVfaXJxW2ldLCBpLCByYyk7CiYjNDM7CQkJZ290byBlcnJfZnJlZV9pcnFzOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBudW07IGkmIzQzOyYjNDM7KQomIzQzOwkJbmFwaV9lbmFibGUoJmFtcDthZGFwdGVyLSZndDtuYXBpW2ldKTsKJiM0MzsKJiM0MzsJaWYgKGFkYXB0ZXItJmd0O211bHRpX3F1ZXVlICZhbXA7JmFtcDsgbnVtICZndDsgMSkgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG51bTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlyYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBpKTsKJiM0MzsJCQlpZiAocmMpIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCQkgICAmIzM0O0ZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZCwgcmM9JWRcbiYjMzQ7LAomIzQzOwkJCQkJICAgaSwgcmMpOwomIzQzOwkJCQl3aGlsZSAoLS1pICZndDs9IDApCiYjNDM7CQkJCQlpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpOwomIzQzOwkJCQlyYyA9IC1FSU87CiYjNDM7CQkJCWdvdG8gZXJyX2Rpc2FibGVfbmFwaTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyX2Rpc2FibGVfbmFwaToKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG51bTsgaSYjNDM7JiM0MzspCiYjNDM7CQluYXBpX2Rpc2FibGUoJmFtcDthZGFwdGVyLSZndDtuYXBpW2ldKTsKJiM0MzsJaSA9IG51bTsKJiM0MztlcnJfZnJlZV9pcnFzOgomIzQzOwl3aGlsZSAoLS1pICZndDs9IDApCiYjNDM7CQlmcmVlX2lycShhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0sICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSk7CiYjNDM7CWlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMgLSBEaXNhYmxlIE5BUEkgYW5kIGZyZWUgSVJRcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBEaXNhYmxlcyBOQVBJIHBvbGxpbmcgYW5kIGZyZWVzIGludGVycnVwdCBoYW5kbGVycyBmb3IgYWxsIFJYIHF1ZXVlcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZAomIzQzO2libXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KQomIzQzOwkJbmFwaV9kaXNhYmxlKCZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3F1ZXVlX2lycVtpXSkKJiM0MzsJCQlmcmVlX2lycShhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0sICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhhZGFwdGVyKTsKJiM0MzsKJiM0MzsJLyogQ2xlYXIgcXVldWUgMCBJUlEgbnVtYmVyICovCiYjNDM7CWFkYXB0ZXItJmd0O3F1ZXVlX2lycVswXSA9IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdCAtIFNldHVwIGludGVycnVwdCBmb3IgYSBzaW5nbGUgUlggcXVldWUKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqIEBxdWV1ZV9pZHg6IFF1ZXVlIGluZGV4IHRvIHNldHVwCiYjNDM7ICoKJiM0MzsgKiBSZWdpc3RlcnMgdGhlIElSUSBoYW5kbGVyIGZvciBvbmUgcXVldWUuIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsCiYjNDM7ICogc2NhbGUtdXAgd2hlbiBhZGRpbmcgbmV3IFJYIHF1ZXVlczsgdGhlIGNhbGxlciBlbmFibGVzIE5BUEkgdmlhCiYjNDM7ICogbmFwaV9lbmFibGUoKSBhZnRlciBpYm12ZXRoX2VuYWJsZV9pcnEoKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF9zZXR1cF9zaW5nbGVfcnhfaW50ZXJydXB0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCSAgaW50IHF1ZXVlX2lkeCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLSZndDtuZXRkZXY7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJcmMgPSByZXF1ZXN0X2lycShhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaWR4XSwgaWJtdmV0aF9pbnRlcnJ1cHQsCiYjNDM7CQkJIDAsIG5ldGRldi0mZ3Q7bmFtZSwgJmFtcDthZGFwdGVyLSZndDtuYXBpW3F1ZXVlX2lkeF0pOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3JlcXVlc3RfaXJxKCkgZmFpbGVkIGZvciBxdWV1ZSAlZDogJWRcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2lkeCwgcmMpOwomIzQzOwkJcmV0dXJuIHJjOwomIzQzOwl9CiYjNDM7CiYjNDM7CW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O1NldHVwIElSUSAlZCBmb3IgcXVldWUgJWRcbiYjMzQ7LAomIzQzOwkJICAgYWRhcHRlci0mZ3Q7cXVldWVfaXJxW3F1ZXVlX2lkeF0sIHF1ZXVlX2lkeCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdCAtIENsZWFudXAgaW50ZXJydXB0IGZvciBhIHNpbmdsZSBSWCBxdWV1ZQomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gY2xlYW51cAomIzQzOyAqCiYjNDM7ICogRnJlZXMgdGhlIElSUSBoYW5kbGVyIGZvciBvbmUgcXVldWUuIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsIHNjYWxlLWRvd24uCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQKJiM0MztpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkgICAgaW50IHF1ZXVlX2lkeCkKJiM0Mzt7CiYjNDM7CWlmIChhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaWR4XSkgewomIzQzOwkJZnJlZV9pcnEoYWRhcHRlci0mZ3Q7cXVldWVfaXJxW3F1ZXVlX2lkeF0sICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtxdWV1ZV9pZHhdKTsKJiM0MzsJCW5ldGRldl9kYmcoYWRhcHRlci0mZ3Q7bmV0ZGV2LCAmIzM0O0ZyZWVkIElSUSBmb3IgcXVldWUgJWRcbiYjMzQ7LCBxdWV1ZV9pZHgpOwomIzQzOwl9CiYjNDM7fQomIzQzOwogLyogc2V0dXAgdGhlIGluaXRpYWwgc2V0dGluZ3MgZm9yIGEgYnVmZmVyIHBvb2wgKi8KIHN0YXRpYyB2b2lkIGlibXZldGhfaW5pdF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wsCiAJCQkJICAgICB1MzIgcG9vbF9pbmRleCwgdTMyIHBvb2xfc2l6ZSwKQEAgLTIwNSwxMSAmIzQzOzcxNCw3MyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9mbHVzaF9idWZmZXIodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCiAJCWFzbSgmIzM0O2RjYmYgJTAsJTEsMSYjMzQ7IDo6ICYjMzQ7YiYjMzQ7IChhZGRyKSwgJiMzNDtyJiMzNDsgKG9mZnNldCkpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyAtIEFkZCByZWNlaXZlIGJ1ZmZlcnMgdG8gaHlwZXJ2aXNvcgomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQGRlc2NzOiBhcnJheSBvZiBidWZmZXIgZGVzY3JpcHRvcnMgdG8gYWRkCiYjNDM7ICogQGZpbGxlZDogbnVtYmVyIG9mIHZhbGlkIGRlc2NyaXB0b3JzIGluIHRoZSBhcnJheQomIzQzOyAqIEBidWZmX3NpemU6IHNpemUgb2YgZWFjaCBidWZmZXIgKG11bHRpLXF1ZXVlIG1vZGUgb25seSkKJiM0MzsgKiBAcXVldWVfaW5kZXg6IFJYIHF1ZXVlIGluZGV4CiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IGh5cGVydmlzb3IgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCQkgICAgdW5pb24gaWJtdmV0aF9idWZfZGVzYyAqZGVzY3MsCiYjNDM7CQkJCQkgICAgaW50IGZpbGxlZCwKJiM0MzsJCQkJCSAgICB1bnNpZ25lZCBsb25nIGJ1ZmZfc2l6ZSwKJiM0MzsJCQkJCSAgICBpbnQgcXVldWVfaW5kZXgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IGFkYXB0ZXItJmd0O3ZkZXY7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcmM7CiYjNDM7CiYjNDM7CWlmIChhZGFwdGVyLSZndDttdWx0aV9xdWV1ZSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBidWZmZXJzem51bSA9IChidWZmX3NpemUgJmx0OyZsdDsgMzIpIHwgZmlsbGVkOwomIzQzOwkJdW5zaWduZWQgbG9uZyBpb2JhW0lCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAvIDJdID0gezB9OwomIzQzOwkJaW50IGk7CiYjNDM7CiYjNDM7CQkvKiBQYWNrIGRlc2NyaXB0b3IgYWRkcmVzc2VzIGludG8gaW9iYSBwYWlycy4KJiM0MzsJCSAqIEVhY2ggaW9iYSBob2xkcyB0d28gMzItYml0IGFkZHJlc3NlcyBwYWNrZWQgaW50byA2NCBiaXRzOgomIzQzOwkJICogLSBFdmVuIGRlc2NyaXB0b3JzICgwLDIsNC4uLikgZ28gaW4gaGlnaCAzMiBiaXRzCiYjNDM7CQkgKiAtIE9kZCBkZXNjcmlwdG9ycyAoMSwzLDUuLi4pIGdvIGluIGxvdyAzMiBiaXRzCiYjNDM7CQkgKi8KJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBmaWxsZWQgJmFtcDsmYW1wOyBpICZsdDsgSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWludCBwYWlyX2lkeCA9IGkgLyAyOyAgICAgICAgICAgLyogV2hpY2ggcGFpcjogMC01ICovCiYjNDM7CQkJaW50IGlzX2hpZ2ggPSAoaSAlIDIgPT0gMCk7ICAgICAvKiBIaWdoIG9yIGxvdyAzMiBiaXRzICovCiYjNDM7CiYjNDM7CQkJaWYgKGlzX2hpZ2gpCiYjNDM7CQkJCWlvYmFbcGFpcl9pZHhdID0gKHVuc2lnbmVkIGxvbmcpZGVzY3NbaV0uZmllbGRzLmFkZHJlc3MgJmx0OyZsdDsgMzI7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlpb2JhW3BhaXJfaWR4XSB8PSBkZXNjc1tpXS5maWVsZHMuYWRkcmVzczsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSh2ZGV2LSZndDt1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkJICAgICBhZGFwdGVyLSZndDtxdWV1ZV9oYW5kbGVbcXVldWVfaW5kZXhdLAomIzQzOwkJCQkJCSAgICAgYnVmZmVyc3pudW0sCiYjNDM7CQkJCQkJICAgICBpb2JhWzBdLCBpb2JhWzFdLCBpb2JhWzJdLAomIzQzOwkJCQkJCSAgICAgaW9iYVszXSwgaW9iYVs0XSwgaW9iYVs1XSk7CiYjNDM7CQlhZGFwdGVyLSZndDtoY2FsbF9zdGF0cy5hZGRfYnVmc19xdWV1ZSYjNDM7JiM0Mzs7CiYjNDM7CX0gZWxzZSBpZiAoZmlsbGVkID09IDEpIHsKJiM0MzsJCXJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyKHZkZXYtJmd0O3VuaXRfYWRkcmVzcywKJiM0MzsJCQkJCSAgICAgIGRlc2NzWzBdLmRlc2MpOwomIzQzOwkJYWRhcHRlci0mZ3Q7aGNhbGxfc3RhdHMuYWRkX2J1ZiYjNDM7JiM0Mzs7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJCQkJICAgICAgIGRlc2NzWzBdLmRlc2MsIGRlc2NzWzFdLmRlc2MsCiYjNDM7CQkJCQkgICAgICAgZGVzY3NbMl0uZGVzYywgZGVzY3NbM10uZGVzYywKJiM0MzsJCQkJCSAgICAgICBkZXNjc1s0XS5kZXNjLCBkZXNjc1s1XS5kZXNjLAomIzQzOwkJCQkJICAgICAgIGRlc2NzWzZdLmRlc2MsIGRlc2NzWzddLmRlc2MpOwomIzQzOwkJYWRhcHRlci0mZ3Q7aGNhbGxfc3RhdHMuYWRkX2J1ZnMmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiAvKiByZXBsZW5pc2ggdGhlIGJ1ZmZlcnMgZm9yIGEgcG9vbC4gIG5vdGUgdGhhdCB3ZSBkb24mIzM5O3QgbmVlZCB0bwogICogc2tiX3Jlc2VydmUgdGhlc2Ugc2luY2UgdGhleSBhcmUgdXNlZCBmb3IgaW5jb21pbmcuLi4KICAqLwogc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJICBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wpCiYjNDM7CQkJCQkgIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCwKJiM0MzsJCQkJCSAgaW50IHF1ZXVlX2luZGV4KQogewogCXVuaW9uIGlibXZldGhfYnVmX2Rlc2MgZGVzY3NbSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMXSA9IHswfTsKIAl1MzIgcmVtYWluaW5nID0gcG9vbC0mZ3Q7c2l6ZSAtIGF0b21pY19yZWFkKCZhbXA7cG9vbC0mZ3Q7YXZhaWxhYmxlKTsKQEAgLTI5NSwyNCAmIzQzOzg2NiwxNSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAogCQlpZiAoIWZpbGxlZCkKIAkJCWJyZWFrOwogCi0JCS8qIHNpbmdsZSBidWZmZXIgY2FzZSovCi0JCWlmIChmaWxsZWQgPT0gMSkKLQkJCWxwYXJfcmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXIodmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAotCQkJCQkJCSAgIGRlc2NzWzBdLmRlc2MpOwotCQllbHNlCi0JCQkvKiBNdWx0aS1idWZmZXIgaGNhbGwgKi8KLQkJCWxwYXJfcmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKHZkZXYtJmd0O3VuaXRfYWRkcmVzcywKLQkJCQkJCQkgICAgZGVzY3NbMF0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbMV0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbMl0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbM10uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbNF0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbNV0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbNl0uZGVzYywKLQkJCQkJCQkgICAgZGVzY3NbN10uZGVzYyk7CiYjNDM7CQlscGFyX3JjID0gaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyhhZGFwdGVyLCBkZXNjcywKJiM0MzsJCQkJCQkJICBmaWxsZWQsCiYjNDM7CQkJCQkJCSAgcG9vbC0mZ3Q7YnVmZl9zaXplLAomIzQzOwkJCQkJCQkgIHF1ZXVlX2luZGV4KTsKJiM0MzsKIAkJaWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7CiAJCQlkZXZfd2Fybl9yYXRlbGltaXRlZChkZXYsCi0JCQkJCSAgICAgJiMzNDtSWCBoX2FkZF9sb2dpY2FsX2xhbiBmYWlsZWQ6IGZpbGxlZD0ldSwgcmM9JWx1LCBiYXRjaD0ldVxuJiMzNDssCiYjNDM7CQkJCQkgICAgICYjMzQ7UlggaF9hZGRfbG9naWNhbF9sYW4gJXMgZmFpbGVkOiBmaWxsZWQ9JXUsIHJjPSVsdSwgYmF0Y2g9JXVcbiYjMzQ7LAomIzQzOwkJCQkJICAgICBhZGFwdGVyLSZndDttdWx0aV9xdWV1ZSA/ICYjMzQ7X3F1ZXVlJiMzNDsgOiAmIzM0OyYjMzQ7LAogCQkJCQkgICAgIGZpbGxlZCwgbHBhcl9yYywgYmF0Y2gpOwogCQkJZ290byBoY2FsbF9mYWlsdXJlOwogCQl9CkBAIC0zNTMsMjQgJiM0Mzs5MTUsMTkgQEAgc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKIAkJfQogCQlhZGFwdGVyLSZndDtyZXBsZW5pc2hfYWRkX2J1ZmZfZmFpbHVyZSAmIzQzOz0gZmlsbGVkOwogCi0JCS8qCi0JCSAqIElmIG11bHRpIHJ4IGJ1ZmZlcnMgaGNhbGwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBGVwotCQkgKiBlLmcuIGluIHRoZSBjYXNlIG9mIExpdmUgUGFydGl0aW9uIE1pZ3JhdGlvbgotCQkgKi8KLQkJaWYgKGJhdGNoICZndDsgMSAmYW1wOyZhbXA7IGxwYXJfcmMgPT0gSF9GVU5DVElPTikgewotCQkJLyoKLQkJCSAqIEluc3RlYWQgb2YgcmV0cnkgc3VibWl0IHNpbmdsZSBidWZmZXIgaW5kaXZpZHVhbGx5Ci0JCQkgKiBoZXJlIGp1c3Qgc2V0IHRoZSBtYXggcnggYnVmZmVyIHBlciBoY2FsbCB0byAxCi0JCQkgKiBidWZmZXJzIHdpbGwgYmUgcmVzcGxlc2hlZCBuZXh0IHRpbWUKLQkJCSAqIHdoZW4gaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woKSBpcyBjYWxsZWQgYWdhaW4KLQkJCSAqIHdpdGggc2luZ2xlLWJ1ZmZlciBjYXNlCi0JCQkgKi8KLQkJCW5ldGRldl9pbmZvKGFkYXB0ZXItJmd0O25ldGRldiwKLQkJCQkgICAgJiMzNDtSWCBNdWx0aSBidWZmZXJzIG5vdCBzdXBwb3J0ZWQgYnkgRlcsIHJjPSVsdVxuJiMzNDssCi0JCQkJICAgIGxwYXJfcmMpOwotCQkJYWRhcHRlci0mZ3Q7cnhfYnVmZmVyc19wZXJfaGNhbGwgPSAxOwotCQkJbmV0ZGV2X2luZm8oYWRhcHRlci0mZ3Q7bmV0ZGV2LAotCQkJCSAgICAmIzM0O05leHQgcnggcmVwbGVzaCB3aWxsIGZhbGwgYmFjayB0byBzaW5nbGUtYnVmZmVyIGhjYWxsXG4mIzM0Oyk7CiYjNDM7CQlpZiAobHBhcl9yYyA9PSBIX0ZVTkNUSU9OKSB7CiYjNDM7CQkJaWYgKGFkYXB0ZXItJmd0O211bHRpX3F1ZXVlKSB7CiYjNDM7CQkJCW5ldGRldl9lcnIoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJCQkJICAgJiMzNDtVbmV4cGVjdGVkIEhfRlVOQ1RJT04gZnJvbSBtdWx0aS1xdWV1ZSBidWZmZXIgYWRkIChxdWV1ZT0lZCwgYmF0Y2g9JWQpXG4mIzM0OywKJiM0MzsJCQkJCSAgIHF1ZXVlX2luZGV4LCBiYXRjaCk7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0gZWxzZSBpZiAoYmF0Y2ggJmd0OyAxKSB7CiYjNDM7CQkJCW5ldGRldl93YXJuKGFkYXB0ZXItJmd0O25ldGRldiwKJiM0MzsJCQkJCSAgICAmIzM0O0hfRlVOQ1RJT04gZnJvbSBsZWdhY3kgYmF0Y2ggYnVmZmVyIGFkZCAoYmF0Y2g9JWQpLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIGJ1ZmZlciBtb2RlXG4mIzM0OywKJiM0MzsJCQkJCSAgICBiYXRjaCk7CiYjNDM7CQkJCWFkYXB0ZXItJmd0O3J4X2J1ZmZlcnNfcGVyX2hjYWxsID0gMTsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTM4NiwyNyAmIzQzOzk0Myw1MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAogICovCiBzdGF0aWMgdm9pZCBpYm12ZXRoX3VwZGF0ZV9yeF9ub19idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlfX2JlNjQgKnAgPSBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyICYjNDM7IDQwOTYgLSA4OwomIzQzOwlpbnQgaTsKIAotCWFkYXB0ZXItJmd0O3J4X25vX2J1ZmZlciA9IGJlNjRfdG9fY3B1cChwKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlfX2JlNjQgKnAgPSBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW2ldICYjNDM7IDQwOTYgLSA4OwomIzQzOwkJdTY0IGRyb3BzID0gYmU2NF90b19jcHVwKHApOwomIzQzOwomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3J4X3FzdGF0cykKJiM0MzsJCQlhZGFwdGVyLSZndDtyeF9xc3RhdHNbaV0ubm9fYnVmZmVyX2Ryb3BzID0gZHJvcHM7CiYjNDM7CQlpZiAoaSA9PSAwKQomIzQzOwkJCWFkYXB0ZXItJmd0O3J4X25vX2J1ZmZlciA9IGRyb3BzOwomIzQzOwl9CiB9CiAKIC8qIHJlcGxlbmlzaCByb3V0aW5lICovCi1zdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF90YXNrKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7c3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkgICBpbnQgcXVldWVfaW5kZXgpCiB7CiYjNDM7CXN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9ICZhbXA7YWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaW5kZXhdOwomIzQzOwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCiAJYWRhcHRlci0mZ3Q7cmVwbGVuaXNoX3Rhc2tfY3ljbGVzJiM0MzsmIzQzOzsKIAomIzQzOwlpZiAocXVldWVfaW5kZXggJmd0Oz0gYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcykgewomIzQzOwkJbmV0ZGV2X2RiZyhhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJICAgJiMzNDtTa2lwcGluZyByZXBsZW5pc2ggZm9yIGZyZWVkIHF1ZXVlICVkIChudW1fcXVldWVzPSVkKVxuJiMzNDssCiYjNDM7CQkJICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXMpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNwaW5fbG9ja19pcnFzYXZlKCZhbXA7cnhxLSZndDtyZXBsZW5pc2hfbG9jaywgZmxhZ3MpOwomIzQzOwogCWZvciAoaSA9IChJQk1WRVRIX05VTV9CVUZGX1BPT0xTIC0gMSk7IGkgJmd0Oz0gMDsgaS0tKSB7Ci0JCXN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9ICZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldOwomIzQzOwkJc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0KJiM0MzsJCQkmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1baV07CiAKLQkJaWYgKHBvb2wtJmd0O2FjdGl2ZSAmYW1wOyZhbXA7CiYjNDM7CQlpZiAocG9vbC0mZ3Q7YWN0aXZlICZhbXA7JmFtcDsgcG9vbC0mZ3Q7ZnJlZV9tYXAgJmFtcDsmYW1wOwogCQkgICAgKGF0b21pY19yZWFkKCZhbXA7cG9vbC0mZ3Q7YXZhaWxhYmxlKSAmbHQ7IHBvb2wtJmd0O3RocmVzaG9sZCkpCi0JCQlpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sKTsKJiM0MzsJCQlpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sLAomIzQzOwkJCQkJCSAgICAgIHF1ZXVlX2luZGV4KTsKIAl9CiAKIAlpYm12ZXRoX3VwZGF0ZV9yeF9ub19idWZmZXIoYWRhcHRlcik7CiYjNDM7CiYjNDM7CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtcDtyeHEtJmd0O3JlcGxlbmlzaF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qIGVtcHR5IGFuZCBmcmVlIGFuYSBidWZmZXIgcG9vbCAtIGFsc28gdXNlZCB0byBkbyBjbGVhbnVwIGluIGVycm9yIHBhdGhzICovCkBAIC00NDQsMzYgJiM0MzsxMDI1LDI5MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKIH0KIAogLyoqCi0gKiBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sIC0gcmVtb3ZlIGEgYnVmZmVyIGZyb20gYSBwb29sCi0gKiBAYWRhcHRlcjogYWRhcHRlciBpbnN0YW5jZQotICogQGNvcnJlbGF0b3I6IGlkZW50aWZpZXMgcG9vbCBhbmQgaW5kZXgKLSAqIEByZXVzZTogd2hldGhlciB0byByZXVzZSBidWZmZXIKJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyAtIEFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgYSBzaW5nbGUgcXVldWUKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqIEBxdWV1ZTogcXVldWUgaW5kZXgKICAqCi0gKiBSZXR1cm46Ci0gKiAqICUwICAgICAgIC0gc3VjY2VzcwotICogKiAlLUVJTlZBTCAtIGNvcnJlbGF0b3IgbWFwcyB0byBwb29sIG9yIGluZGV4IG91dCBvZiByYW5nZQotICogKiAlLUVGQVVMVCAtIHBvb2wgYW5kIGluZGV4IG1hcCB0byBudWxsIHNrYgomIzQzOyAqIEFsbG9jYXRlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KJiM0MzsgKiBQb29sIG1ldGFkYXRhIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIGludCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgIHU2NCBjb3JyZWxhdG9yLCBib29sIHJldXNlKQomIzQzO3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19xdWV1ZV9idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSAgICBpbnQgcXVldWUpCiB7Ci0JdW5zaWduZWQgaW50IHBvb2wgID0gY29ycmVsYXRvciAmZ3Q7Jmd0OyAzMjsKLQl1bnNpZ25lZCBpbnQgaW5kZXggPSBjb3JyZWxhdG9yICZhbXA7IDB4ZmZmZmZmZmZVTDsKLQl1bnNpZ25lZCBpbnQgZnJlZV9pbmRleDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JaWYgKFdBUk5fT04ocG9vbCAmZ3Q7PSBJQk1WRVRIX05VTV9CVUZGX1BPT0xTKSB8fAotCSAgICBXQVJOX09OKGluZGV4ICZndDs9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5zaXplKSkgewotCQlzY2hlZHVsZV93b3JrKCZhbXA7YWRhcHRlci0mZ3Q7d29yayk7Ci0JCXJldHVybiAtRUlOVkFMOwomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIWFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYWN0aXZlKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJaWYgKGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2woJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVdW2ldKSkgewomIzQzOwkJCW5ldGRldl9lcnIobmV0ZGV2LAomIzQzOwkJCQkgICAmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgcG9vbCAlZCBmb3IgcXVldWUgJWQgKHNpemU9JXUsIGNvdW50PSV1KVxuJiMzNDssCiYjNDM7CQkJCSAgIGksIHF1ZXVlLAomIzQzOwkJCQkgICBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmJ1ZmZfc2l6ZSwKJiM0MzsJCQkJICAgYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5zaXplKTsKJiM0MzsJCQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmFjdGl2ZSA9IDA7CiYjNDM7CiYjNDM7CQkJLyogRnJlZSBwb29scyBhbGxvY2F0ZWQgc28gZmFyIGZvciB0aGlzIHF1ZXVlICovCiYjNDM7CQkJd2hpbGUgKC0taSAmZ3Q7PSAwKSB7CiYjNDM7CQkJCWlmIChhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmFjdGl2ZSkKJiM0MzsJCQkJCWlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLAomIzQzOwkJCQkJCQkJICZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlXVtpXSk7CiYjNDM7CQkJfQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwkJfQogCX0KIAotCXNrYiA9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdOwotCWlmIChXQVJOX09OKCFza2IpKSB7Ci0JCXNjaGVkdWxlX3dvcmsoJmFtcDthZGFwdGVyLSZndDt3b3JrKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzIC0gRnJlZSBidWZmZXIgcG9vbHMgZm9yIGEgc2luZ2xlIHF1ZXVlCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAcXVldWU6IHF1ZXVlIGluZGV4CiYjNDM7ICoKJiM0MzsgKiBGcmVlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCQkgICAgaW50IHF1ZXVlKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVdW2ldOwomIzQzOwomIzQzOwkJLyogRnJlZSBwb29sIGlmIGl0IGhhcyBhbGxvY2F0ZWQgbWVtb3J5LCByZWdhcmRsZXNzIG9mIGFjdGl2ZSBmbGFnLgomIzQzOwkJICogUG9vbHMgbWF5IGhhdmUgbWVtb3J5IGFsbG9jYXRlZCBidXQgbm90IG1hcmtlZCBhY3RpdmUgZHVyaW5nCiYjNDM7CQkgKiBxdWV1ZSBzY2FsZS11cCwgc28gd2UgbXVzdCBjaGVjayBmb3IgYWN0dWFsIGFsbG9jYXRpb25zLgomIzQzOwkJICovCiYjNDM7CQlpZiAocG9vbC0mZ3Q7ZnJlZV9tYXAgfHwgcG9vbC0mZ3Q7ZG1hX2FkZHIgfHwgcG9vbC0mZ3Q7c2tidWZmKQomIzQzOwkJCWlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29scyAtIEFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBJbml0aWFsaXplcyBwb29sIG1ldGFkYXRhIGZvciBxdWV1ZXMgMS1OIGZyb20gcXVldWUgMCBzZXR0aW5ncywKJiM0MzsgKiB0aGVuIGFsbG9jYXRlcyBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXMgdXNpbmcgdGhlIGhlbHBlciBmdW5jdGlvbi4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwlpbnQgaSwgcSwgcmM7CiYjNDM7CiYjNDM7CS8qIEluaXRpYWxpemUgcG9vbCBtZXRhZGF0YSBmb3IgcXVldWVzIDEtMTUgZnJvbSBxdWV1ZSAwIHNldHRpbmdzICovCiYjNDM7CWZvciAocSA9IDE7IHEgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBxJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpzcmMgPSAmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXTsKJiM0MzsJCQlzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKmRzdCA9ICZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3FdW2ldOwomIzQzOwomIzQzOwkJCWRzdC0mZ3Q7c2l6ZSA9IHNyYy0mZ3Q7c2l6ZTsKJiM0MzsJCQlkc3QtJmd0O2luZGV4ID0gc3JjLSZndDtpbmRleDsKJiM0MzsJCQlkc3QtJmd0O2J1ZmZfc2l6ZSA9IHNyYy0mZ3Q7YnVmZl9zaXplOwomIzQzOwkJCWRzdC0mZ3Q7dGhyZXNob2xkID0gc3JjLSZndDt0aHJlc2hvbGQ7CiYjNDM7CQkJZHN0LSZndDthY3RpdmUgPSBzcmMtJmd0O2FjdGl2ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBBbGxvY2F0ZSBhY3R1YWwgYnVmZmVycyBmb3IgYWxsIHF1ZXVlcyAqLwomIzQzOwlmb3IgKHEgPSAwOyBxICZsdDsgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsgcSYjNDM7JiM0MzspIHsKJiM0MzsJCXJjID0gaWJtdmV0aF9hbGxvY19xdWV1ZV9idWZmZXJfcG9vbHMoYWRhcHRlciwgcSk7CiYjNDM7CQlpZiAocmMpIHsKJiM0MzsJCQkvKiBGcmVlIHBvb2xzIGZvciBhbGwgcHJldmlvdXMgcXVldWVzICovCiYjNDM7CQkJd2hpbGUgKC0tcSAmZ3Q7PSAwKQomIzQzOwkJCQlpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHEpOwomIzQzOwkJCXJldHVybiByYzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDthbGxvY2F0ZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxuJiMzNDssCiYjNDM7CQkgICBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZnJlZV9idWZmZXJfcG9vbHMgLSBGcmVlIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBGcmVlcyBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXMgdXNpbmcgdGhlIGhlbHBlciBmdW5jdGlvbi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlpbnQgcTsKJiM0MzsKJiM0MzsJLyogRnJlZSBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXMgKi8KJiM0MzsJZm9yIChxID0gMDsgcSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IHEmIzQzOyYjNDM7KQomIzQzOwkJaWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTsKJiM0MzsKJiM0MzsJbmV0ZGV2X2RiZyhhZGFwdGVyLSZndDtuZXRkZXYsICYjMzQ7ZnJlZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxuJiMzNDssCiYjNDM7CQkgICBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWUgLSBBbGxvY2F0ZSByZXNvdXJjZXMgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBhbGxvY2F0ZQomIzQzOyAqIEByeHFfZW50cmllczogTnVtYmVyIG9mIFJYIHF1ZXVlIGVudHJpZXMKJiM0MzsgKgomIzQzOyAqIEFsbG9jYXRlcyBidWZmZXIgbGlzdCwgUlggcXVldWUsIGFuZCBwZXItcXVldWUgYnVmZmVyIHBvb2xzIGZvciBvbmUgcXVldWUuCiYjNDM7ICogVXNlZCBkdXJpbmcgaW5jcmVtZW50YWwgc2NhbGUtdXAgd2l0aG91dCBhZmZlY3RpbmcgZXhpc3RpbmcgcXVldWVzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaWR4LAomIzQzOwkJCSAgICAgIGludCByeHFfZW50cmllcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhbXA7YWRhcHRlci0mZ3Q7dmRldi0mZ3Q7ZGV2OwomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwlpbnQgaSwgcmMgPSAtRU5PTUVNOwomIzQzOwomIzQzOwlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgbGlzdCBmb3IgcXVldWUgJWRcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2lkeCk7CiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJfQomIzQzOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbiA9CiYjNDM7CQlzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllczsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID0KJiM0MzsJCWRtYV9hbGxvY19jb2hlcmVudChkZXYsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfbGVuLAomIzQzOwkJCQkgICAmYW1wO2FkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hLAomIzQzOwkJCQkgICBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBhbGxvY2F0ZSBSWCBxdWV1ZSBmb3IgcXVldWUgJWRcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2lkeCk7CiYjNDM7CQlnb3RvIG91dF9mcmVlX2J1Zmxpc3Q7CiYjNDM7CX0KJiM0MzsKJiM0MzsJYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPQomIzQzOwkJZG1hX21hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0sCiYjNDM7CQkJICAgICAgIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKJiM0MzsJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0pKSB7CiYjNDM7CQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDt1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxuJiMzNDssCiYjNDM7CQkJICAgcXVldWVfaWR4KTsKJiM0MzsJCWdvdG8gb3V0X2ZyZWVfcnhxOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlX2lkeF1baV0uc2l6ZSA9CiYjNDM7CQkJYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdW2ldLnNpemU7CiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5idWZmX3NpemUgPQomIzQzOwkJCWFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXS5idWZmX3NpemU7CiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS50aHJlc2hvbGQgPQomIzQzOwkJCWFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXS50aHJlc2hvbGQ7CiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5hY3RpdmUgPQomIzQzOwkJCWFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXS5hY3RpdmU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmMgPSBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxdWV1ZV9pZHgpOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgcXVldWUgJWRcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2lkeCk7CiYjNDM7CQlnb3RvIG91dF91bm1hcF9idWZsaXN0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0uaW5kZXggPSAwOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLm51bV9zbG90cyA9IHJ4cV9lbnRyaWVzOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnRvZ2dsZSA9IDE7CiYjNDM7CXNwaW5fbG9ja19pbml0KCZhbXA7YWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5yZXBsZW5pc2hfbG9jayk7CiYjNDM7CiYjNDM7CW5ldGRldl9kYmcobmV0ZGV2LAomIzQzOwkJICAgJiMzNDtBbGxvY2F0ZWQgcXVldWUgJWQ6IGJ1ZmZlcl9saXN0IEAgJXAgKERNQTogMHglbGx4KSwgcnhfcXVldWUgQCAlcCAoRE1BOiAweCVsbHgpLCAlZCBlbnRyaWVzXG4mIzM0OywKJiM0MzsJCSAgIHF1ZXVlX2lkeCwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdLAomIzQzOwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSwKJiM0MzsJCSAgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkciwKJiM0MzsJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEsCiYjNDM7CQkgICByeHFfZW50cmllcyk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO291dF91bm1hcF9idWZsaXN0OgomIzQzOwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0sCiYjNDM7CQkJIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKJiM0MzsJYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPSAwOwomIzQzO291dF9mcmVlX3J4cToKJiM0MzsJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbiwKJiM0MzsJCQkgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkciwKJiM0MzsJCQkgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hKTsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID0gTlVMTDsKJiM0MztvdXRfZnJlZV9idWZsaXN0OgomIzQzOwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdKTsKJiM0MzsJYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdID0gTlVMTDsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlIC0gRnJlZSByZXNvdXJjZXMgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBmcmVlCiYjNDM7ICoKJiM0MzsgKiBGcmVlcyBidWZmZXIgbGlzdCwgUlggcXVldWUsIGFuZCBwZXItcXVldWUgYnVmZmVyIHBvb2xzIGZvciBvbmUgcXVldWUuCiYjNDM7ICogVXNlZCBkdXJpbmcgaW5jcmVtZW50YWwgc2NhbGUtZG93biB3aXRob3V0IGFmZmVjdGluZyByZW1haW5pbmcgcXVldWVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkCiYjNDM7aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGRldmljZSAqZGV2ID0gJmFtcDthZGFwdGVyLSZndDt2ZGV2LSZndDtkZXY7CiYjNDM7CiYjNDM7CWlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMoYWRhcHRlciwgcXVldWVfaWR4KTsKJiM0MzsKJiM0MzsJaWYgKGFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdKSB7CiYjNDM7CQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0sCiYjNDM7CQkJCSA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7CiYjNDM7CQlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSA9IDA7CiAJfQogCiYjNDM7CWlmIChhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIpIHsKJiM0MzsJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sCiYjNDM7CQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyLAomIzQzOwkJCQkgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hKTsKJiM0MzsJCWFkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkciA9IE5VTEw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSkgewomIzQzOwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSk7CiYjNDM7CQlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSBOVUxMOwomIzQzOwl9CiYjNDM7CiYjNDM7CW5ldGRldl9kYmcoYWRhcHRlci0mZ3Q7bmV0ZGV2LCAmIzM0O0ZyZWVkIHF1ZXVlICVkIHJlc291cmNlc1xuJiMzNDssIHF1ZXVlX2lkeCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2wgLSByZW1vdmUgYSBidWZmZXIgZnJvbSBhIHBvb2wKJiM0MzsgKiBAYWRhcHRlcjogYWRhcHRlciBpbnN0YW5jZQomIzQzOyAqIEBjb3JyZWxhdG9yOiBpZGVudGlmaWVzIHBvb2wgYW5kIGluZGV4CiYjNDM7ICogQHJldXNlOiB3aGV0aGVyIHRvIHJldXNlIGJ1ZmZlcgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICogJTAgICAgICAgLSBzdWNjZXNzCiYjNDM7ICogKiAlLUVJTlZBTCAtIGNvcnJlbGF0b3IgbWFwcyB0byBwb29sIG9yIGluZGV4IG91dCBvZiByYW5nZQomIzQzOyAqICogJS1FRkFVTFQgLSBwb29sIGFuZCBpbmRleCBtYXAgdG8gbnVsbCBza2IKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSAgIHU2NCBjb3JyZWxhdG9yLCBpbnQgcXVldWVfaW5kZXgsCiYjNDM7CQkJCQkgICBib29sIHJldXNlKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHBvb2wgID0gY29ycmVsYXRvciAmZ3Q7Jmd0OyAzMjsKJiM0MzsJdW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciAmYW1wOyAweGZmZmZmZmZmVUw7CiYjNDM7CXVuc2lnbmVkIGludCBmcmVlX2luZGV4OwomIzQzOwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwomIzQzOwomIzQzOwlpZiAoIWlibXZldGhfcnhxX2NvcnJlbGF0b3JfdmFsaWQoYWRhcHRlciwgcXVldWVfaW5kZXgsIGNvcnJlbGF0b3IpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CXNrYiA9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2tidWZmW2luZGV4XTsKJiM0MzsJaWYgKCFza2IpCiYjNDM7CQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsKIAkvKiBpZiB3ZSBhcmUgZ29pbmcgdG8gcmV1c2UgdGhlIGJ1ZmZlciB0aGVuIGtlZXAgdGhlIHBvaW50ZXJzIGFyb3VuZAogCSAqIGJ1dCBtYXJrIGluZGV4IGFzIGF2YWlsYWJsZS4gcmVwbGVuaXNoIHdpbGwgc2VlIHRoZSBza2IgcG9pbnRlciBhbmQKIAkgKiBhc3N1bWUgaXQgaXMgdG8gYmUgcmVjeWNsZWQuCkBAIC00ODIsNDIgJiM0MzsxMzE4LDQxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAogCQkvKiByZW1vdmUgdGhlIHNrYiBwb2ludGVyIHRvIG1hcmsgZnJlZS4gYWN0dWFsIGZyZWVpbmcgaXMgZG9uZQogCQkgKiBieSB1cHBlciBsZXZlbCBuZXR3b3JraW5nIGFmdGVyIGdyb19yZWNlaXZlCiAJCSAqLwotCQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcG9vbF0uc2tidWZmW2luZGV4XSA9IE5VTEw7CiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF0gPSBOVUxMOwogCiAJCWRtYV91bm1hcF9zaW5nbGUoJmFtcDthZGFwdGVyLSZndDt2ZGV2LSZndDtkZXYsCi0JCQkJIGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5kbWFfYWRkcltpbmRleF0sCi0JCQkJIGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5idWZmX3NpemUsCiYjNDM7CQkJCSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmRtYV9hZGRyW2luZGV4XSwKJiM0MzsJCQkJIGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uYnVmZl9zaXplLAogCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCX0KIAotCWZyZWVfaW5kZXggPSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXg7Ci0JYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4JiM0MzsmIzQzOzsKLQlpZiAoYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4ICZndDs9Ci0JICAgIGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5zaXplKQotCQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXggPSAwOwotCWFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5mcmVlX21hcFtmcmVlX2luZGV4XSA9IGluZGV4OwomIzQzOwlmcmVlX2luZGV4ID0gYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5wcm9kdWNlcl9pbmRleDsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5wcm9kdWNlcl9pbmRleCYjNDM7JiM0Mzs7CiYjNDM7CWlmIChhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4ICZndDs9CiYjNDM7CSAgICBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNpemUpCiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4ID0gMDsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5mcmVlX21hcFtmcmVlX2luZGV4XSA9IGluZGV4OwogCiAJbWIoKTsKIAotCWF0b21pY19kZWMoJmFtcDsoYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3Bvb2xdLmF2YWlsYWJsZSkpOwomIzQzOwlhdG9taWNfZGVjKCZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5hdmFpbGFibGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIGdldCB0aGUgY3VycmVudCBidWZmZXIgb24gdGhlIHJ4IHF1ZXVlICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICppYm12ZXRoX3J4cV9nZXRfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkJCSAgICAgaW50IHF1ZXVlX2luZGV4KQogewotCXU2NCBjb3JyZWxhdG9yID0gYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLSZndDtyeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjsKJiM0MzsJc3RydWN0IGlibXZldGhfcnhfcSAqcnhxID0gJmFtcDthZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pbmRleF07CiYjNDM7CXU2NCBjb3JyZWxhdG9yID0gcnhxLSZndDtxdWV1ZV9hZGRyW3J4cS0mZ3Q7aW5kZXhdLmNvcnJlbGF0b3I7CiAJdW5zaWduZWQgaW50IHBvb2wgPSBjb3JyZWxhdG9yICZndDsmZ3Q7IDMyOwogCXVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgJmFtcDsgMHhmZmZmZmZmZlVMOwogCi0JaWYgKFdBUk5fT04ocG9vbCAmZ3Q7PSBJQk1WRVRIX05VTV9CVUZGX1BPT0xTKSB8fAotCSAgICBXQVJOX09OKGluZGV4ICZndDs9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtwb29sXS5zaXplKSkgewotCQlzY2hlZHVsZV93b3JrKCZhbXA7YWRhcHRlci0mZ3Q7d29yayk7CiYjNDM7CWlmICghaWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChhZGFwdGVyLCBxdWV1ZV9pbmRleCwgY29ycmVsYXRvcikpCiAJCXJldHVybiBOVUxMOwotCX0KIAotCXJldHVybiBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcG9vbF0uc2tidWZmW2luZGV4XTsKJiM0MzsJcmV0dXJuIGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2tidWZmW2luZGV4XTsKIH0KIAogLyoqCkBAIC01MzMsMjQgJiM0MzsxMzY4LDY5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhCiAgKiAqIG90aGVyIC0gbm9uLXplcm8gcmV0dXJuIGZyb20gaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbAogICovCiBzdGF0aWMgaW50IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgICAgYm9vbCByZXVzZSkKJiM0MzsJCQkJICAgICAgaW50IHF1ZXVlX2luZGV4LCBib29sIHJldXNlKQogewomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSAmYW1wO2FkYXB0ZXItJmd0O3J4X3F1ZXVlW3F1ZXVlX2luZGV4XTsKIAl1NjQgY29yOwogCWludCByYzsKIAotCWNvciA9IGFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci0mZ3Q7cnhfcXVldWUuaW5kZXhdLmNvcnJlbGF0b3I7Ci0JcmMgPSBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvciwgcmV1c2UpOwotCWlmICh1bmxpa2VseShyYykpCiYjNDM7CWNvciA9IHJ4cS0mZ3Q7cXVldWVfYWRkcltyeHEtJmd0O2luZGV4XS5jb3JyZWxhdG9yOwomIzQzOwlyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCBxdWV1ZV9pbmRleCwgcmV1c2UpOwomIzQzOwlpZiAodW5saWtlbHkocmMpKSB7CiYjNDM7CQlpZiAocmMgPT0gLUVJTlZBTCB8fCByYyA9PSAtRUZBVUxUKQomIzQzOwkJCWdvdG8gYWR2YW5jZTsKIAkJcmV0dXJuIHJjOwotCi0JaWYgKCYjNDM7JiM0MzthZGFwdGVyLSZndDtyeF9xdWV1ZS5pbmRleCA9PSBhZGFwdGVyLSZndDtyeF9xdWV1ZS5udW1fc2xvdHMpIHsKLQkJYWRhcHRlci0mZ3Q7cnhfcXVldWUuaW5kZXggPSAwOwotCQlhZGFwdGVyLSZndDtyeF9xdWV1ZS50b2dnbGUgPSAhYWRhcHRlci0mZ3Q7cnhfcXVldWUudG9nZ2xlOwogCX0KIAomIzQzO2FkdmFuY2U6CiYjNDM7CWlibXZldGhfcnhxX2FkdmFuY2UocnhxKTsKJiM0MzsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZHJhaW5fcnhfcXVldWUgLSBEcmFpbiBwZW5kaW5nIGJ1ZmZlcnMgZnJvbSBhbiBSWCBxdWV1ZQomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHF1ZXVlX2luZGV4OiBRdWV1ZSBpbmRleCB0byBkcmFpbgomIzQzOyAqCiYjNDM7ICogUmVjeWNsZXMgYWxsIHBlbmRpbmcgYnVmZmVycyBiYWNrIHRvIHRoZSBwZXItcXVldWUgYnVmZmVyIHBvb2xzLgomIzQzOyAqIE11c3QgYmUgY2FsbGVkIHdpdGggTkFQSSBkaXNhYmxlZCBmb3IgdGhpcyBxdWV1ZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogTnVtYmVyIG9mIGJ1ZmZlcnMgZHJhaW5lZAomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX2RyYWluX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLSZndDtuZXRkZXY7CiYjNDM7CWludCBkcmFpbmVkID0gMDsKJiM0MzsJaW50IGxpbWl0ID0gYWRhcHRlci0mZ3Q7cnhfcXVldWVbcXVldWVfaW5kZXhdLm51bV9zbG90czsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtEcmFpbmluZyBSWCBxdWV1ZSAlZCAobGltaXQ6ICVkIHNsb3RzKVxuJiMzNDssCiYjNDM7CQkgICBxdWV1ZV9pbmRleCwgbGltaXQpOwomIzQzOwomIzQzOwl3aGlsZSAoZHJhaW5lZCAmbHQ7IGxpbWl0ICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSkgewomIzQzOwkJcmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7CiYjNDM7CQlpZiAocmMpIHsKJiM0MzsJCQluZXRkZXZfZXJyKG5ldGRldiwKJiM0MzsJCQkJICAgJiMzNDtGYWlsZWQgdG8gaGFydmVzdCBidWZmZXIgZnJvbSBxdWV1ZSAlZCBkdXJpbmcgZHJhaW46ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgcXVldWVfaW5kZXgsIHJjKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWRyYWluZWQmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChkcmFpbmVkICZndDsgMCkKJiM0MzsJCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O0RyYWluZWQgJWQgYnVmZmVyKHMpIGZyb20gUlggcXVldWUgJWRcbiYjMzQ7LAomIzQzOwkJCSAgIGRyYWluZWQsIHF1ZXVlX2luZGV4KTsKJiM0MzsJZWxzZQomIzQzOwkJbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7Tm8gYnVmZmVycyB0byBkcmFpbiBmcm9tIFJYIHF1ZXVlICVkXG4mIzM0OywKJiM0MzsJCQkgICBxdWV1ZV9pbmRleCk7CiYjNDM7CiYjNDM7CXJldHVybiBkcmFpbmVkOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIGlibXZldGhfZnJlZV90eF9sdGIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IGlkeCkKIHsKIAlkbWFfdW5tYXBfc2luZ2xlKCZhbXA7YWRhcHRlci0mZ3Q7dmRldi0mZ3Q7ZGV2LCBhZGFwdGVyLSZndDt0eF9sdGJfZG1hW2lkeF0sCkBAIC01NzQsMjQ2ICYjNDM7MTQ1NCw2NjggQEAgc3RhdGljIGludCBpYm12ZXRoX2FsbG9jYXRlX3R4X2x0YihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KQogCQkJCQkJICBETUFfVE9fREVWSUNFKTsKIAlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmFtcDthZGFwdGVyLSZndDt2ZGV2LSZndDtkZXYsIGFkYXB0ZXItJmd0O3R4X2x0Yl9kbWFbaWR4XSkpIHsKIAkJbmV0ZGV2X2VycihhZGFwdGVyLSZndDtuZXRkZXYsCi0JCQkgICAmIzM0O3VuYWJsZSB0byBETUEgbWFwIHR4IGxvbmcgdGVybSBidWZmZXJcbiYjMzQ7KTsKLQkJa2ZyZWUoYWRhcHRlci0mZ3Q7dHhfbHRiX3B0cltpZHhdKTsKLQkJYWRhcHRlci0mZ3Q7dHhfbHRiX3B0cltpZHhdID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQkJICAgJiMzNDt1bmFibGUgdG8gRE1BIG1hcCB0eCBsb25nIHRlcm0gYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CQlrZnJlZShhZGFwdGVyLSZndDt0eF9sdGJfcHRyW2lkeF0pOwomIzQzOwkJYWRhcHRlci0mZ3Q7dHhfbHRiX3B0cltpZHhdID0gTlVMTDsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2FsbG9jX3R4X3Jlc291cmNlcyAtIEFsbG9jYXRlIFRYIHJlc291cmNlcyBmb3IgYWxsIHF1ZXVlcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBBbGxvY2F0ZXMgVFggTG9uZyBUZXJtIEJ1ZmZlcnMgKExUQnMpIGZvciBhbGwgVFggcXVldWVzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gZmFpbHVyZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX2FsbG9jX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3sKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItJmd0O25ldGRldjsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBuZXRkZXYtJmd0O3JlYWxfbnVtX3R4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChpYm12ZXRoX2FsbG9jYXRlX3R4X2x0YihhZGFwdGVyLCBpKSkKJiM0MzsJCQlnb3RvIGVycl9mcmVlX2x0YnM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyX2ZyZWVfbHRiczoKJiM0MzsJd2hpbGUgKC0taSAmZ3Q7PSAwKQomIzQzOwkJaWJtdmV0aF9mcmVlX3R4X2x0YihhZGFwdGVyLCBpKTsKJiM0MzsJcmV0dXJuIC1FTk9NRU07CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMgLSBGcmVlIFRYIHJlc291cmNlcyBmb3IgYWxsIHF1ZXVlcwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBGcmVlcyBUWCBMb25nIFRlcm0gQnVmZmVycyAoTFRCcykgZm9yIGFsbCBUWCBxdWV1ZXMuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQKJiM0MztpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5ldGRldi0mZ3Q7cmVhbF9udW1fdHhfcXVldWVzOyBpJiM0MzsmIzQzOykKJiM0MzsJCWlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAomIzQzOwkJCQkJdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYywKJiM0MzsJCQkJCXU2NCBtYWNfYWRkcmVzcykKJiM0Mzt7CiYjNDM7CWludCByYywgdHJ5X2FnYWluID0gMTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQWZ0ZXIgYSBrZXhlYyB0aGUgYWRhcHRlciB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIG91ciBhdHRlbXB0IHRvCiYjNDM7CSAqIG9wZW4gaXQgd2lsbCBmYWlsLiBTbyBpZiB3ZSBnZXQgYSBmYWlsdXJlIHdlIGZyZWUgdGhlIGFkYXB0ZXIgYW5kCiYjNDM7CSAqIHRyeSBhZ2FpbiwgYnV0IG9ubHkgb25jZS4KJiM0MzsJICovCiYjNDM7cmV0cnk6CiYjNDM7CS8qIEluIG11bHRpLXF1ZXVlIG1vZGUsIG9idGFpbiBhIHF1ZXVlIGhhbmRsZSBmb3IgcXVldWUgMCBzbyBhbGwgUlgKJiM0MzsJICogcXVldWVzIGNhbiB1c2UgdGhlIHNhbWUgcGVyLXF1ZXVlIGJ1ZmZlciBoeXBlcmNhbGxzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFkYXB0ZXItJmd0O211bHRpX3F1ZXVlKSB7CiYjNDM7CQlyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUoYWRhcHRlci0mZ3Q7dmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJCQkJCQlhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbMF0sCiYjNDM7CQkJCQkJCXJ4cV9kZXNjLmRlc2MsCiYjNDM7CQkJCQkJCWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2RtYSwKJiM0MzsJCQkJCQkJbWFjX2FkZHJlc3MsCiYjNDM7CQkJCQkJCSZhbXA7YWRhcHRlci0mZ3Q7cXVldWVfaGFuZGxlWzBdKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJjID0gaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkgICAgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hWzBdLAomIzQzOwkJCQkJICAgIHJ4cV9kZXNjLmRlc2MsCiYjNDM7CQkJCQkgICAgYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hLAomIzQzOwkJCQkJICAgIG1hY19hZGRyZXNzKTsKJiM0MzsJfQomIzQzOwlhZGFwdGVyLSZndDtoY2FsbF9zdGF0cy5yZWdfbGFuJiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJaWYgKHJjICE9IEhfU1VDQ0VTUyAmYW1wOyZhbXA7IHRyeV9hZ2FpbikgewomIzQzOwkJZG8gewomIzQzOwkJCXJjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcyk7CiYjNDM7CQkJYWRhcHRlci0mZ3Q7aGNhbGxfc3RhdHMuZnJlZV9sYW4mIzQzOyYjNDM7OwomIzQzOwkJfSB3aGlsZSAoSF9JU19MT05HX0JVU1kocmMpIHx8IChyYyA9PSBIX0JVU1kpKTsKJiM0MzsKJiM0MzsJCXRyeV9hZ2FpbiA9IDA7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSAtIFJlZ2lzdGVyIHN1Ym9yZGluYXRlIHF1ZXVlIHdpdGggaHlwZXJ2aXNvcgomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHJ4cV9kZXNjOiBSZWNlaXZlIHF1ZXVlIGRlc2NyaXB0b3IKJiM0MzsgKiBAcXVldWVfaW5kZXg6IFJYIHF1ZXVlIGluZGV4ICgxLi5OIGZvciBzdWJvcmRpbmF0ZSBxdWV1ZXMpCiYjNDM7ICoKJiM0MzsgKiBSZWdpc3RlcnMgYSBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlIHVzaW5nIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFLgomIzQzOyAqIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgcXVldWUgaGFuZGxlIGFuZCB2aXJ0dWFsIElSUSBpbiB0aGUgYWRhcHRlci4KJiM0MzsgKiBSZXRyaWVzIG9uY2UgaWYgcmVnaXN0cmF0aW9uIGZhaWxzIChoYW5kbGVzIGtleGVjIGNhc2UpLiAgSWYgSVJRIG1hcHBpbmcKJiM0MzsgKiBmYWlscyBhZnRlciBhIHN1Y2Nlc3NmdWwgaHlwZXJ2aXNvciByZWdpc3RyYXRpb24sIHRoZSBxdWV1ZSBpcyBmcmVlZAomIzQzOyAqIGJlZm9yZSByZXR1cm5pbmcuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IEhfU1VDQ0VTUyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBJUlEgbWFwcGluZyBmYWlsdXJlLAomIzQzOyAqICAgICAgICAgaHlwZXJ2aXNvciBlcnJvciBjb2RlIG90aGVyd2lzZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQKJiM0MztpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCSAgIHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2MsCiYjNDM7CQkJCSAgIGludCBxdWV1ZV9pbmRleCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaGFuZGxlLCBod2lycTsKJiM0MzsJdW5zaWduZWQgaW50IHZpcnE7CiYjNDM7CWxvbmcgbHBhcl9yYzsKJiM0MzsJaW50IHRyeV9hZ2FpbiA9IDE7CiYjNDM7CiYjNDM7cmV0cnk6CiYjNDM7CW5ldGRldl9kYmcoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJICAgJiMzNDtBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHF1ZXVlICVkOiB1bml0X2FkZHI9MHgleCBidWZmZXJfbGlzdF9kbWE9MHglbGx4IHJ4cV9kZXNjPTB4JWxseFxuJiMzNDssCiYjNDM7CQkgICBxdWV1ZV9pbmRleCwgYWRhcHRlci0mZ3Q7dmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLAomIzQzOwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZGVzYy5kZXNjKTsKJiM0MzsKJiM0MzsJbHBhcl9yYyA9IGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcywKJiM0MzsJCQkJCSAgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2luZGV4XSwKJiM0MzsJCQkJCSAgcnhxX2Rlc2MuZGVzYywgJmFtcDtoYW5kbGUsICZhbXA7aHdpcnEpOwomIzQzOwlhZGFwdGVyLSZndDtoY2FsbF9zdGF0cy5yZWdfbGFuX3F1ZXVlJiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJaWYgKGxwYXJfcmMgPT0gSF9TVUNDRVNTKSB7CiYjNDM7CQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3aXJxKTsKJiM0MzsJCWlmICghdmlycSkgewomIzQzOwkJCXVuc2lnbmVkIGxvbmcgZnJlZV9yYzsKJiM0MzsKJiM0MzsJCQluZXRkZXZfZXJyKGFkYXB0ZXItJmd0O25ldGRldiwKJiM0MzsJCQkJICAgJiMzNDtGYWlsZWQgdG8gbWFwIElSUSBmb3IgcXVldWUgJWQgKGh3aXJxPSVsdSlcbiYjMzQ7LAomIzQzOwkJCQkgICBxdWV1ZV9pbmRleCwgaHdpcnEpOwomIzQzOwkJCWRvIHsKJiM0MzsJCQkJZnJlZV9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkJCQkgICBoYW5kbGUpOwomIzQzOwkJCX0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGZyZWVfcmMpIHx8IChmcmVlX3JjID09IEhfQlVTWSkpOwomIzQzOwkJCWFkYXB0ZXItJmd0O2hjYWxsX3N0YXRzLmZyZWVfbGFuX3F1ZXVlJiM0MzsmIzQzOzsKJiM0MzsJCQlpZiAoZnJlZV9yYyAhPSBIX1NVQ0NFU1MpCiYjNDM7CQkJCW5ldGRldl9lcnIoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJCQkJICAgJiMzNDtoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUgZmFpbGVkIGZvciBxdWV1ZSAlZCBhZnRlciBJUlEgbWFwIGZhaWx1cmU6IHJjPTB4JWx4XG4mIzM0OywKJiM0MzsJCQkJCSAgIHF1ZXVlX2luZGV4LCBmcmVlX3JjKTsKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWFkYXB0ZXItJmd0O3F1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0gPSBoYW5kbGU7CiYjNDM7CQlhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaW5kZXhdID0gdmlycTsKJiM0MzsKJiM0MzsJCW5ldGRldl9kYmcoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7cXVldWUgJWQgcmVnaXN0ZXJlZDogaGFuZGxlPTB4JWxseCBpcnE9JXVcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLSZndDtxdWV1ZV9oYW5kbGVbcXVldWVfaW5kZXhdLAomIzQzOwkJCSAgIGFkYXB0ZXItJmd0O3F1ZXVlX2lycVtxdWV1ZV9pbmRleF0pOwomIzQzOwkJcmV0dXJuIEhfU1VDQ0VTUzsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobHBhcl9yYyA9PSBIX0ZVTkNUSU9OKSB7CiYjNDM7CQlpZiAoYWRhcHRlci0mZ3Q7bXVsdGlfcXVldWUpIHsKJiM0MzsJCQluZXRkZXZfaW5mbyhhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJCSAgICAmIzM0O011bHRpIHF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZSwgZmFsbGluZyBiYWNrIHRvIHNpbmdsZSBxdWV1ZVxuJiMzNDspOwomIzQzOwkJCWFkYXB0ZXItJmd0O211bHRpX3F1ZXVlID0gMDsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbmV0ZGV2X2VycihhZGFwdGVyLSZndDtuZXRkZXYsCiYjNDM7CQkJCSAgICYjMzQ7VW5leHBlY3RlZCBIX0ZVTkNUSU9OIGZvciBxdWV1ZSAlZCByZWdpc3RyYXRpb24gKE1RIG1vZGUgYWxyZWFkeSBkaXNhYmxlZClcbiYjMzQ7LAomIzQzOwkJCQkgICBxdWV1ZV9pbmRleCk7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gbHBhcl9yYzsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodHJ5X2FnYWluKSB7CiYjNDM7CQl0cnlfYWdhaW4gPSAwOwomIzQzOwkJZ290byByZXRyeTsKJiM0MzsJfQomIzQzOwomIzQzOwluZXRkZXZfZXJyKGFkYXB0ZXItJmd0O25ldGRldiwKJiM0MzsJCSAgICYjMzQ7aF9yZWdfbG9naWNhbF9sYW5fcXVldWUgZmFpbGVkIHdpdGggJWxkIGFmdGVyIHJldHJ5XG4mIzM0OywKJiM0MzsJCSAgIGxwYXJfcmMpOwomIzQzOwluZXRkZXZfZXJyKGFkYXB0ZXItJmd0O25ldGRldiwKJiM0MzsJCSAgICYjMzQ7cXVldWUgJWQgcGFyYW1zOiB1bml0X2FkZHI9MHgleCBidWZmZXJfbGlzdF9kbWE9MHglbGx4IHJ4cV9kZXNjPTB4JWxseFxuJiMzNDssCiYjNDM7CQkgICBxdWV1ZV9pbmRleCwgYWRhcHRlci0mZ3Q7dmRldi0mZ3Q7dW5pdF9hZGRyZXNzLAomIzQzOwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLAomIzQzOwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZGVzYy5kZXNjKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGxwYXJfcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlIC0gUmVnaXN0ZXIgb25lIHN1Ym9yZGluYXRlIFJYIHF1ZXVlCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byByZWdpc3RlciAoMS4uTikKJiM0MzsgKiBAbWFjX2FkZHJlc3M6IE1BQyBhZGRyZXNzICh1bnVzZWQ7IHJlc2VydmVkIGZvciBBUEkgc3ltbWV0cnkpCiYjNDM7ICoKJiM0MzsgKiBCdWlsZHMgdGhlIHF1ZXVlIGRlc2NyaXB0b3IgYW5kIHJlZ2lzdGVycyB3aXRoIHRoZSBoeXBlcnZpc29yIHZpYQomIzQzOyAqIGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWUoKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBxdWV1ZV9pZHggaXMgaW52YWxpZCwgLUVJTyBvbiBmYWlsdXJlCiYjNDM7ICovCiYjNDM7c3RhdGljIGludAomIzQzO2libXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCSBpbnQgcXVldWVfaWR4LCB1NjQgbWFjX2FkZHJlc3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjOwomIzQzOwlsb25nIGxwYXJfcmM7CiYjNDM7CiYjNDM7CSh2b2lkKW1hY19hZGRyZXNzOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTihxdWV1ZV9pZHggJmx0OyAxIHx8IHF1ZXVlX2lkeCAmZ3Q7PSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CXJ4cV9kZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBJQk1WRVRIX0JVRl9WQUxJRCB8CiYjNDM7CQkJCSAgICBhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbjsKJiM0MzsJcnhxX2Rlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLSZndDtyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2RtYTsKJiM0MzsKJiM0MzsJbHBhcl9yYyA9IGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlciwgcnhxX2Rlc2MsCiYjNDM7CQkJCQkJICAgICBxdWV1ZV9pZHgpOwomIzQzOwlpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O0ZhaWxlZCB0byByZWdpc3RlciBxdWV1ZSAlZDogcmM9MHglbHhcbiYjMzQ7LAomIzQzOwkJCSAgIHF1ZXVlX2lkeCwgbHBhcl9yYyk7CiYjNDM7CQlyZXR1cm4gLUVJTzsKJiM0MzsJfQomIzQzOwomIzQzOwluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtSZWdpc3RlcmVkIHF1ZXVlICVkIHdpdGggaGFuZGxlIDB4JWxseFxuJiMzNDssCiYjNDM7CQkgICBxdWV1ZV9pZHgsIGFkYXB0ZXItJmd0O3F1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUgLSBEZXJlZ2lzdGVyIG9uZSBzdWJvcmRpbmF0ZSBSWCBxdWV1ZQomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlCiYjNDM7ICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gZGVyZWdpc3RlciAoMS4uTikKJiM0MzsgKgomIzQzOyAqIERlcmVnaXN0ZXJzIGEgc2luZ2xlIHF1ZXVlIHZpYSBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgYW5kIGRpc3Bvc2VzCiYjNDM7ICogdGhlIElSUSBtYXBwaW5nIGZvciBzdWJvcmRpbmF0ZSBxdWV1ZXMuIFF1ZXVlIDAgaXMgZnJlZWQgb25seSB0aHJvdWdoCiYjNDM7ICogaWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoKSAoSF9GUkVFX0xPR0lDQUxfTEFOKS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZAomIzQzO2libXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJICAgaW50IHF1ZXVlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKJiM0MzsKJiM0MzsJaWYgKCFhZGFwdGVyLSZndDtxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJbHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkJICAgYWRhcHRlci0mZ3Q7cXVldWVfaGFuZGxlW3F1ZXVlX2lkeF0pOwomIzQzOwl9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTsKJiM0MzsKJiM0MzsJYWRhcHRlci0mZ3Q7aGNhbGxfc3RhdHMuZnJlZV9sYW5fcXVldWUmIzQzOyYjNDM7OwomIzQzOwomIzQzOwlpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHsKJiM0MzsJCW5ldGRldl9lcnIoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIGZhaWxlZCBmb3IgcXVldWUgJWQ6IHJjPTB4JWx4XG4mIzM0OywKJiM0MzsJCQkgICBxdWV1ZV9pZHgsIGxwYXJfcmMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWFkYXB0ZXItJmd0O3F1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdID0gMDsKJiM0MzsKJiM0MzsJaWYgKHF1ZXVlX2lkeCAmZ3Q7IDAgJmFtcDsmYW1wOyBhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaWR4XSkgewomIzQzOwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaWR4XSk7CiYjNDM7CQlhZGFwdGVyLSZndDtxdWV1ZV9pcnFbcXVldWVfaWR4XSA9IDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbmV0ZGV2X2RiZyhhZGFwdGVyLSZndDtuZXRkZXYsICYjMzQ7RGVyZWdpc3RlcmVkIHF1ZXVlICVkXG4mIzM0OywgcXVldWVfaWR4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsIC0gUmVzaXplIFJYIHF1ZXVlIGNvdW50IGluY3JlbWVudGFsbHkKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqIEBuZXdfY291bnQ6IFRhcmdldCBudW1iZXIgb2YgUlggcXVldWVzCiYjNDM7ICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBwZXIgUlggcXVldWUKJiM0MzsgKgomIzQzOyAqIEFkZHMgb3IgcmVtb3ZlcyBSWCBxdWV1ZXMgd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGVudGlyZSBhZGFwdGVyLgomIzQzOyAqIEFjdGl2ZSBxdWV1ZXMgY29udGludWUgcmVjZWl2aW5nIGR1cmluZyBzY2FsZS11cDsgc2NhbGUtZG93biBkcmFpbnMKJiM0MzsgKiBleGNlc3MgcXVldWVzIGJlZm9yZSBkZXJlZ2lzdGVyaW5nIHRoZW0gd2l0aCB0aGUgaHlwZXJ2aXNvci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiYjNDM7CQkJCSAgICAgaW50IG5ld19jb3VudCwgaW50IHJ4cV9lbnRyaWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItJmd0O25ldGRldjsKJiM0MzsJdTY0IG1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LSZndDtkZXZfYWRkcik7CiYjNDM7CWludCBvbGRfY291bnQgPSBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOwomIzQzOwlpbnQgZmFpbGVkX3F1ZXVlOwomIzQzOwlpbnQgcmMsIGk7CiYjNDM7CiYjNDM7CWlmIChvbGRfY291bnQgPT0gbmV3X2NvdW50KSB7CiYjNDM7CQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtSWCBxdWV1ZSBjb3VudCB1bmNoYW5nZWQgKCVkKSwgbm90aGluZyB0byBkb1xuJiMzNDssCiYjNDM7CQkJICAgb2xkX2NvdW50KTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChuZXdfY291bnQgJmx0OyAxIHx8IG5ld19jb3VudCAmZ3Q7IElCTVZFVEhfTUFYX1JYX1FVRVVFUykgewomIzQzOwkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7SW52YWxpZCBSWCBxdWV1ZSBjb3VudCAlZCAobXVzdCBiZSAxLSVkKVxuJiMzNDssCiYjNDM7CQkJICAgbmV3X2NvdW50LCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbmV0ZGV2X2luZm8obmV0ZGV2LCAmIzM0O0luY3JlbWVudGFsbHkgcmVzaXppbmcgUlggcXVldWVzOiAlZCB0byAlZFxuJiMzNDssCiYjNDM7CQkgICAgb2xkX2NvdW50LCBuZXdfY291bnQpOwomIzQzOwomIzQzOwlpZiAobmV3X2NvdW50ICZndDsgb2xkX2NvdW50KSB7CiYjNDM7CQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtTY2FsZS11cDogYWRkaW5nIHF1ZXVlcyAlZC0lZFxuJiMzNDssCiYjNDM7CQkJICAgb2xkX2NvdW50LCBuZXdfY291bnQgLSAxKTsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IG9sZF9jb3VudDsgaSAmbHQ7IG5ld19jb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlyYyA9IGlibXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGksIHJ4cV9lbnRyaWVzKTsKJiM0MzsJCQlpZiAocmMpIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIHF1ZXVlICVkOiAlZFxuJiMzNDssCiYjNDM7CQkJCQkgICBpLCByYyk7CiYjNDM7CQkJCWdvdG8gY2xlYW51cF9uZXdfcXVldWVzOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlyYyA9IGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGksCiYjNDM7CQkJCQkJCSAgICAgIG1hY19hZGRyZXNzKTsKJiM0MzsJCQlpZiAocmMpIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7RmFpbGVkIHRvIHJlZ2lzdGVyIHF1ZXVlICVkOiAlZFxuJiMzNDssCiYjNDM7CQkJCQkgICBpLCByYyk7CiYjNDM7CQkJCWlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7CiYjNDM7CQkJCWdvdG8gY2xlYW51cF9uZXdfcXVldWVzOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlyYyA9IGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTsKJiM0MzsJCQlpZiAocmMpIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCQkgICAmIzM0O0ZhaWxlZCB0byBzZXR1cCBJUlEgZm9yIHF1ZXVlICVkOiAlZFxuJiMzNDssCiYjNDM7CQkJCQkgICBpLCByYyk7CiYjNDM7CQkJCWlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7CiYjNDM7CQkJCWlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7CiYjNDM7CQkJCWdvdG8gY2xlYW51cF9uZXdfcXVldWVzOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlyYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBpKTsKJiM0MzsJCQlpZiAocmMpIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCQkgICAmIzM0O0ZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZDogJWRcbiYjMzQ7LAomIzQzOwkJCQkJICAgaSwgcmMpOwomIzQzOwkJCQlpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTsKJiM0MzsJCQkJaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTsKJiM0MzsJCQkJaWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTsKJiM0MzsJCQkJZ290byBjbGVhbnVwX25ld19xdWV1ZXM7CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCW5hcGlfZW5hYmxlKCZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzID0gbmV3X2NvdW50OwomIzQzOwomIzQzOwkJZm9yIChpID0gb2xkX2NvdW50OyBpICZsdDsgbmV3X2NvdW50OyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpOwomIzQzOwomIzQzOwkJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldGRldiwgbmV3X2NvdW50KTsKJiM0MzsJCWlmIChyYykgewomIzQzOwkJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O0ZhaWxlZCB0byBzZXQgcmVhbCBSWCBxdWV1ZXMgdG8gJWQ6ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgbmV3X2NvdW50LCByYyk7CiYjNDM7CQkJZ290byBjbGVhbnVwX25ld19xdWV1ZXM7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtTY2FsZS1kb3duOiByZW1vdmluZyBxdWV1ZXMgJWQtJWRcbiYjMzQ7LAomIzQzOwkJCSAgIG5ld19jb3VudCwgb2xkX2NvdW50IC0gMSk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSBuZXdfY291bnQ7IGkgJmx0OyBvbGRfY291bnQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJCW5hcGlfZGlzYWJsZSgmYW1wO2FkYXB0ZXItJmd0O25hcGlbaV0pOwomIzQzOwomIzQzOwkJZm9yIChpID0gbmV3X2NvdW50OyBpICZsdDsgb2xkX2NvdW50OyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpYm12ZXRoX2RyYWluX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpOwomIzQzOwomIzQzOwkJc3luY2hyb25pemVfbmV0KCk7CiYjNDM7CiYjNDM7CQlyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBuZXdfY291bnQpOwomIzQzOwkJaWYgKHJjKSB7CiYjNDM7CQkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7RmFpbGVkIHRvIHNldCByZWFsIFJYIHF1ZXVlcyB0byAlZDogJWRcbiYjMzQ7LAomIzQzOwkJCQkgICBuZXdfY291bnQsIHJjKTsKJiM0MzsJCQlmb3IgKGkgPSBuZXdfY291bnQ7IGkgJmx0OyBvbGRfY291bnQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQluYXBpX2VuYWJsZSgmYW1wO2FkYXB0ZXItJmd0O25hcGlbaV0pOwomIzQzOwkJCXJldHVybiByYzsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIERpc2FibGUgaHlwZXJ2aXNvciBpbnRlcnJ1cHRzIGFuZCB3YWl0IGZvciBoYW5kbGVycyB0byBjb21wbGV0ZQomIzQzOwkJICogYmVmb3JlIHVwZGF0aW5nIG51bV9yeF9xdWV1ZXMuCiYjNDM7CQkgKi8KJiM0MzsJCWZvciAoaSA9IG5ld19jb3VudDsgaSAmbHQ7IG9sZF9jb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpOwomIzQzOwkJCXN5bmNocm9uaXplX2lycShhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0pOwomIzQzOwkJfQomIzQzOwomIzQzOwkJYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyA9IG5ld19jb3VudDsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IG5ld19jb3VudDsgaSAmbHQ7IG9sZF9jb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTsKJiM0MzsJCQlpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpOwomIzQzOwkJCWlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJbmV0ZGV2X2luZm8obmV0ZGV2LCAmIzM0O1N1Y2Nlc3NmdWxseSByZXNpemVkIHRvICVkIFJYIHF1ZXVlcyAoaW5jcmVtZW50YWwpXG4mIzM0OywKJiM0MzsJCSAgICBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzKTsKJiM0MzsKJiM0MzsJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfQ01PKSkKJiM0MzsJCXZpb19jbW9fc2V0X2Rldl9kZXNpcmVkKGFkYXB0ZXItJmd0O3ZkZXYsCiYjNDM7CQkJCQlpYm12ZXRoX2dldF9kZXNpcmVkX2RtYShhZGFwdGVyLSZndDt2ZGV2KSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXBfbmV3X3F1ZXVlczoKJiM0MzsJZmFpbGVkX3F1ZXVlID0gaTsKJiM0MzsJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkgICAmIzM0O1NjYWxlLXVwIGZhaWxlZCBhdCBxdWV1ZSAlZCwgY2xlYW5pbmcgdXAgcXVldWVzICVkLSVkXG4mIzM0OywKJiM0MzsJCSAgIGZhaWxlZF9xdWV1ZSwgb2xkX2NvdW50LCBmYWlsZWRfcXVldWUgLSAxKTsKJiM0MzsJZm9yIChpID0gb2xkX2NvdW50OyBpICZsdDsgZmFpbGVkX3F1ZXVlOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5hcGlfZGlzYWJsZSgmYW1wO2FkYXB0ZXItJmd0O25hcGlbaV0pOwomIzQzOwomIzQzOwlmb3IgKGkgPSBvbGRfY291bnQ7IGkgJmx0OyBmYWlsZWRfcXVldWU7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZShhZGFwdGVyLCBpKTsKJiM0MzsKJiM0MzsJc3luY2hyb25pemVfbmV0KCk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IG9sZF9jb3VudDsgaSAmbHQ7IGZhaWxlZF9xdWV1ZTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgaSk7CiYjNDM7CQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0mZ3Q7cXVldWVfaXJxW2ldKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSBvbGRfY291bnQ7IGkgJmx0OyBmYWlsZWRfcXVldWU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTsKJiM0MzsJCWlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7CiYjNDM7CQlpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpOwomIzQzOwl9CiYjNDM7CWFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXMgPSBvbGRfY291bnQ7CiYjNDM7CW5ldGRldl93YXJuKG5ldGRldiwgJiMzNDtLZWVwaW5nICVkIHF1ZXVlcyBhZnRlciBzY2FsZS11cCBmYWlsdXJlXG4mIzM0OywKJiM0MzsJCSAgICBvbGRfY291bnQpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGlibXZldGhfZnJlZV9hbGxfcXVldWVzIC0gRnJlZSBhbGwgUlggcXVldWVzIGF0IG9uY2UKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZQomIzQzOyAqCiYjNDM7ICogVXNlcyBIX0ZSRUVfTE9HSUNBTF9MQU4gdG8gZnJlZSBhbGwgcXVldWVzIGluIG9uZSBoeXBlcmNhbGwuCiYjNDM7ICogVXNlZCBkdXJpbmcgaW50ZXJmYWNlIGNsb3NlIGFuZCByZWdpc3RyYXRpb24gZXJyb3IgY2xlYW51cC4KJiM0MzsgKgomIzQzOyAqIENsZWFycyBxdWV1ZSBoYW5kbGVzIG9ubHk7IHF1ZXVlX2lycVtdIGlzIHJlbGVhc2VkIGJ5CiYjNDM7ICogaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMoKSBvbiBjbG9zZSwgb3IgYnkKJiM0MzsgKiBpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKCkgb24gcGFydGlhbCByZWdpc3RlciBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9hbGxfcXVldWVzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwluZXRkZXZfZGJnKGFkYXB0ZXItJmd0O25ldGRldiwgJiMzNDtmcmVlaW5nIGFsbCBSWCBxdWV1ZXMgYXQgb25jZVxuJiMzNDspOwomIzQzOwomIzQzOwlkbyB7CiYjNDM7CQlscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcyk7CiYjNDM7CQlhZGFwdGVyLSZndDtoY2FsbF9zdGF0cy5mcmVlX2xhbiYjNDM7JiM0Mzs7CiYjNDM7CX0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpOwomIzQzOwomIzQzOwlpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHsKJiM0MzsJCW5ldGRldl9lcnIoYWRhcHRlci0mZ3Q7bmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7aF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZDogJWxkXG4mIzM0OywgbHBhcl9yYyk7CiAJfQogCi0JcmV0dXJuIDA7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykKJiM0MzsJCWFkYXB0ZXItJmd0O3F1ZXVlX2hhbmRsZVtpXSA9IDA7CiB9CiAKLXN0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICB1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLCB1NjQgbWFjX2FkZHJlc3MpCiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXMgLSBSZWdpc3RlciBSWCBxdWV1ZXMgd2l0aCBoeXBlcnZpc29yCiYjNDM7ICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmUKJiM0MzsgKiBAbWFjX2FkZHJlc3M6IE1BQyBhZGRyZXNzIGZvciBkZXZpY2UgcmVnaXN0cmF0aW9uCiYjNDM7ICoKJiM0MzsgKiBSZWdpc3RlcnMgcXVldWUgMCB2aWEgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbigpLCB0aGVuIHN1Ym9yZGluYXRlCiYjNDM7ICogcXVldWVzIDEuLk4gd2hlbiBtdWx0aS1xdWV1ZSBtb2RlIGlzIGVuYWJsZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT05FVCBpZiBxdWV1ZSAwIHJlZ2lzdHJhdGlvbiBmYWlscywgLUVJTyBvbgomIzQzOyAqICAgICAgICAgc3Vib3JkaW5hdGUgcXVldWUgcmVnaXN0cmF0aW9uIGZhaWx1cmUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50CiYjNDM7aWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgdTY0IG1hY19hZGRyZXNzKQogewotCWludCByYywgdHJ5X2FnYWluID0gMTsKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItJmd0O25ldGRldjsKJiM0MzsJdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYzsKJiM0MzsJdW5zaWduZWQgbG9uZyBscGFyX3JjOwomIzQzOwlpbnQgaSwgcmM7CiAKLQkvKgotCSAqIEFmdGVyIGEga2V4ZWMgdGhlIGFkYXB0ZXIgd2lsbCBzdGlsbCBiZSBvcGVuLCBzbyBvdXIgYXR0ZW1wdCB0bwotCSAqIG9wZW4gaXQgd2lsbCBmYWlsLiBTbyBpZiB3ZSBnZXQgYSBmYWlsdXJlIHdlIGZyZWUgdGhlIGFkYXB0ZXIgYW5kCi0JICogdHJ5IGFnYWluLCBidXQgb25seSBvbmNlLgotCSAqLwotcmV0cnk6Ci0JcmMgPSBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcywKLQkJCQkgICAgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hLCByeHFfZGVzYy5kZXNjLAotCQkJCSAgICBhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9kbWEsIG1hY19hZGRyZXNzKTsKJiM0MzsJcnhxX2Rlc2MuZmllbGRzLmZsYWdzX2xlbiA9IElCTVZFVEhfQlVGX1ZBTElEIHwKJiM0MzsJCQkJICAgIGFkYXB0ZXItJmd0O3J4X3F1ZXVlWzBdLnF1ZXVlX2xlbjsKJiM0MzsJcnhxX2Rlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLSZndDtyeF9xdWV1ZVswXS5xdWV1ZV9kbWE7CiYjNDM7CWFkYXB0ZXItJmd0O3F1ZXVlX2lycVswXSA9IG5ldGRldi0mZ3Q7aXJxOwogCi0JaWYgKHJjICE9IEhfU1VDQ0VTUyAmYW1wOyZhbXA7IHRyeV9hZ2FpbikgewotCQlkbyB7Ci0JCQlyYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MpOwotCQl9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShyYykgfHwgKHJjID09IEhfQlVTWSkpOwomIzQzOwlyYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgMCk7CiYjNDM7CWlmIChyYyAhPSBIX1NVQ0NFU1MpCiYjNDM7CQluZXRkZXZfZGJnKG5ldGRldiwKJiM0MzsJCQkgICAmIzM0O0ZhaWxlZCB0byBkaXNhYmxlIElSUSBmb3IgcXVldWUgMCBiZWZvcmUgcmVnaXN0cmF0aW9uLCByYz0lZFxuJiMzNDssCiYjNDM7CQkJICAgcmMpOwogCi0JCXRyeV9hZ2FpbiA9IDA7Ci0JCWdvdG8gcmV0cnk7CiYjNDM7CWxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXIsIHJ4cV9kZXNjLCBtYWNfYWRkcmVzcyk7CiYjNDM7CWlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykgewomIzQzOwkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQ6ICVsZFxuJiMzNDssIGxwYXJfcmMpOwomIzQzOwkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJICAgJiMzNDtidWZmZXIgVENFOjB4JWxseCBmaWx0ZXIgVENFOjB4JWxseCByeHEgZGVzYzoweCVsbHggTUFDOjB4JWxseFxuJiMzNDssCiYjNDM7CQkJICAgYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfZG1hWzBdLAomIzQzOwkJCSAgIGFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2RtYSwKJiM0MzsJCQkgICByeHFfZGVzYy5kZXNjLCBtYWNfYWRkcmVzcyk7CiYjNDM7CQlyZXR1cm4gLUVOT05FVDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyA9PSAxIHx8ICFhZGFwdGVyLSZndDttdWx0aV9xdWV1ZSkgewomIzQzOwkJbmV0ZGV2X2RiZyhuZXRkZXYsCiYjNDM7CQkJICAgJiMzNDtyZWdpc3RlcmVkIDEgUlggcXVldWUgd2l0aCBoeXBlcnZpc29yIChzaW5nbGUtcXVldWUgbW9kZSlcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O1JlZ2lzdGVyaW5nICVkIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMS0lZClcbiYjMzQ7LAomIzQzOwkJICAgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyAtIDEsIGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXMgLSAxKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyYyA9IGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGksIG1hY19hZGRyZXNzKTsKJiM0MzsJCWlmIChyYykgewomIzQzOwkJCWlmICghYWRhcHRlci0mZ3Q7cXVldWVfaGFuZGxlW2ldIHx8ICFhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0pIHsKJiM0MzsJCQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCQkgICAmIzM0O0ludmFsaWQgaHlwZXJ2aXNvciByZXR1cm4gZm9yIHF1ZXVlICVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxuJiMzNDssCiYjNDM7CQkJCQkgICBpLCBhZGFwdGVyLSZndDtxdWV1ZV9oYW5kbGVbaV0sCiYjNDM7CQkJCQkgICBhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0pOwomIzQzOwkJCX0KJiM0MzsJCQlnb3RvIGVycl91bnJlZ2lzdGVyOwomIzQzOwkJfQogCX0KIAomIzQzOwluZXRkZXZfZGJnKG5ldGRldiwKJiM0MzsJCSAgICYjMzQ7cmVnaXN0ZXJlZCAlZCBSWCBxdWV1ZXMgd2l0aCBoeXBlcnZpc29yIChtdWx0aS1xdWV1ZSBtb2RlKVxuJiMzNDssCiYjNDM7CQkgICBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyX3VucmVnaXN0ZXI6CiYjNDM7CWlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7CiYjNDM7CWlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBpYm12ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1NjQgbWFjX2FkZHJlc3M7CiYjNDM7CXU2NCBtYWNfYWRkcmVzcyA9IGV0aGVyX2FkZHJfdG9fdTY0KG5ldGRldi0mZ3Q7ZGV2X2FkZHIpOwogCWludCByeHFfZW50cmllcyA9IDE7Ci0JdW5zaWduZWQgbG9uZyBscGFyX3JjOwogCWludCByYzsKLQl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjOwogCWludCBpOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O29wZW4gc3RhcnRpbmdcbiYjMzQ7KTsKIAotCW5hcGlfZW5hYmxlKCZhbXA7YWRhcHRlci0mZ3Q7bmFwaSk7Ci0KLQlmb3IoaSA9IDA7IGkgJmx0OyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykKLQkJcnhxX2VudHJpZXMgJiM0Mzs9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXS5zaXplOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlyeHFfZW50cmllcyAmIzQzOz0gYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdW2ldLnNpemU7CiAKLQlyYyA9IC1FTk9NRU07Ci0JYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkciA9ICh2b2lkKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlci0mZ3Q7YnVmZmVyX2xpc3RfYWRkcikgewotCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDt1bmFibGUgdG8gYWxsb2NhdGUgbGlzdCBwYWdlc1xuJiMzNDspOwomIzQzOwlyYyA9IGlibXZldGhfYWxsb2NfcnhfcXN0YXRzKGFkYXB0ZXIpOwomIzQzOwlpZiAocmMpCiAJCWdvdG8gb3V0OwotCX0KLQotCWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIgPSAodm9pZCopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWFkYXB0ZXItJmd0O2ZpbHRlcl9saXN0X2FkZHIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7dW5hYmxlIHRvIGFsbG9jYXRlIGZpbHRlciBwYWdlc1xuJiMzNDspOwotCQlnb3RvIG91dF9mcmVlX2J1ZmZlcl9saXN0OwotCX0KIAotCWRldiA9ICZhbXA7YWRhcHRlci0mZ3Q7dmRldi0mZ3Q7ZGV2OwomIzQzOwlyYyA9IGlibXZldGhfYWxsb2NfZmlsdGVyX2xpc3QoYWRhcHRlcik7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0X2ZyZWVfcnhfcXN0YXRzOwogCi0JYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfbGVuID0gc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpICoKLQkJCQkJCXJ4cV9lbnRyaWVzOwotCWFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2FkZHIgPQotCQlkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9sZW4sCi0JCQkJICAgJmFtcDthZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9kbWEsIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfYWRkcikKJiM0MzsJcmMgPSBpYm12ZXRoX2FsbG9jX3J4X3F1ZXVlcyhhZGFwdGVyLCByeHFfZW50cmllcyk7CiYjNDM7CWlmIChyYykKIAkJZ290byBvdXRfZnJlZV9maWx0ZXJfbGlzdDsKIAotCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKLQkJCWFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWEpKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBtYXAgYnVmZmVyIGxpc3QgcGFnZXNcbiYjMzQ7KTsKJiM0MzsJcmMgPSBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29scyhhZGFwdGVyKTsKJiM0MzsJaWYgKHJjKQogCQlnb3RvIG91dF9mcmVlX3F1ZXVlX21lbTsKLQl9CiAKLQlhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCi0JCQlhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9hZGRyLCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci0mZ3Q7ZmlsdGVyX2xpc3RfZG1hKSkgewotCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDt1bmFibGUgdG8gbWFwIGZpbHRlciBsaXN0IHBhZ2VzXG4mIzM0Oyk7Ci0JCWdvdG8gb3V0X3VubWFwX2J1ZmZlcl9saXN0OwotCX0KJiM0MzsJcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyhhZGFwdGVyLCBtYWNfYWRkcmVzcyk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IG5ldGRldi0mZ3Q7cmVhbF9udW1fdHhfcXVldWVzOyBpJiM0MzsmIzQzOykgewotCQlpZiAoaWJtdmV0aF9hbGxvY2F0ZV90eF9sdGIoYWRhcHRlciwgaSkpCi0JCQlnb3RvIG91dF9mcmVlX3R4X2x0YjsKJiM0MzsJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldGRldiwgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyk7CiYjNDM7CWlmIChyYykgewomIzQzOwkJbmV0ZGV2X2VycihuZXRkZXYsICYjMzQ7ZmFpbGVkIHRvIHNldCBudW1iZXIgb2YgcnggcXVldWVzXG4mIzM0Oyk7CiYjNDM7CQlnb3RvIG91dF91bnJlZ2lzdGVyX3F1ZXVlczsKIAl9CiAKLQlhZGFwdGVyLSZndDtyeF9xdWV1ZS5pbmRleCA9IDA7Ci0JYWRhcHRlci0mZ3Q7cnhfcXVldWUubnVtX3Nsb3RzID0gcnhxX2VudHJpZXM7Ci0JYWRhcHRlci0mZ3Q7cnhfcXVldWUudG9nZ2xlID0gMTsKLQotCW1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LSZndDtkZXZfYWRkcik7Ci0KLQlyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfAotCQkJCQlhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9sZW47Ci0JcnhxX2Rlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9kbWE7Ci0KLQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtidWZmZXIgbGlzdCBAIDB4JXBcbiYjMzQ7LCBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyKTsKLQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtmaWx0ZXIgbGlzdCBAIDB4JXBcbiYjMzQ7LCBhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9hZGRyKTsKLQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtyZWNlaXZlIHEgICBAIDB4JXBcbiYjMzQ7LCBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9hZGRyKTsKLQotCWhfdmlvX3NpZ25hbChhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MsIFZJT19JUlFfRElTQUJMRSk7Ci0KLQlscGFyX3JjID0gaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLCByeHFfZGVzYywgbWFjX2FkZHJlc3MpOwotCi0JaWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O2hfcmVnaXN0ZXJfbG9naWNhbF9sYW4gZmFpbGVkIHdpdGggJWxkXG4mIzM0OywKLQkJCSAgIGxwYXJfcmMpOwotCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDtidWZmZXIgVENFOjB4JWxseCBmaWx0ZXIgVENFOjB4JWxseCByeHEgJiMzNDsKLQkJCSAgICYjMzQ7ZGVzYzoweCVsbHggTUFDOjB4JWxseFxuJiMzNDssCi0JCQkJICAgICBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWEsCi0JCQkJICAgICBhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9kbWEsCi0JCQkJICAgICByeHFfZGVzYy5kZXNjLAotCQkJCSAgICAgbWFjX2FkZHJlc3MpOwotCQlyYyA9IC1FTk9ORVQ7Ci0JCWdvdG8gb3V0X3VubWFwX2ZpbHRlcl9saXN0OwotCX0KJiM0MzsJcmMgPSBpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoYWRhcHRlcik7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0X3VucmVnaXN0ZXJfcXVldWVzOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmICghYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldLmFjdGl2ZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbCgmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXSkpIHsKLQkJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byBhbGxvYyBwb29sXG4mIzM0Oyk7Ci0JCQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMDsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzOwomIzQzOwlpZiAoYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyAmZ3Q7IDEpIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O2luaXRpYWwgcmVwbGVuaXNoIGN5Y2xlIGZvciBxdWV1ZSAlZFxuJiMzNDssIGkpOwomIzQzOwkJCWlibXZldGhfcmVwbGVuaXNoX3Rhc2soYWRhcHRlciwgaSk7CiAJCX0KJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O2luaXRpYWwgcmVwbGVuaXNoIGN5Y2xlXG4mIzM0Oyk7CiYjNDM7CQlpYm12ZXRoX2ludGVycnVwdChhZGFwdGVyLSZndDtxdWV1ZV9pcnFbMF0sICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVswXSk7CiAJfQogCi0JbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7cmVnaXN0ZXJpbmcgaXJxIDB4JXhcbiYjMzQ7LCBuZXRkZXYtJmd0O2lycSk7Ci0JcmMgPSByZXF1ZXN0X2lycShuZXRkZXYtJmd0O2lycSwgaWJtdmV0aF9pbnRlcnJ1cHQsIDAsIG5ldGRldi0mZ3Q7bmFtZSwKLQkJCSBuZXRkZXYpOwotCWlmIChyYyAhPSAwKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3VuYWJsZSB0byByZXF1ZXN0IGlycSAweCV4LCByYyAlZFxuJiMzNDssCi0JCQkgICBuZXRkZXYtJmd0O2lycSwgcmMpOwotCQlkbyB7Ci0JCQlscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcyk7Ci0JCX0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpOwotCi0JCWdvdG8gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzOwotCX0KLQotCXJjID0gLUVOT01FTTsKJiM0MzsJcmMgPSBpYm12ZXRoX2FsbG9jX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfY2xlYW51cF9yeF9pbnRlcnJ1cHRzOwogCi0JbmV0ZGV2X2RiZyhuZXRkZXYsICYjMzQ7aW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcbiYjMzQ7KTsKLQlpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtJmd0O2lycSwgbmV0ZGV2KTsKJiM0MzsJcmMgPSBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0cyhhZGFwdGVyKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfZnJlZV90eF9yZXNvdXJjZXM7CiAKIAluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKG5ldGRldik7CiAKIAluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtvcGVuIGNvbXBsZXRlXG4mIzM0Oyk7Ci0KIAlyZXR1cm4gMDsKIAomIzQzO291dF9jbGVhbnVwX3J4X2ludGVycnVwdHM6CiYjNDM7CWlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwomIzQzO291dF9mcmVlX3R4X3Jlc291cmNlczoKJiM0MzsJaWJtdmV0aF9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKIG91dF9mcmVlX2J1ZmZlcl9wb29sczoKLQl3aGlsZSAoLS1pICZndDs9IDApIHsKLQkJaWYgKGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpCi0JCQlpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlciwKLQkJCQkJCSAmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXSk7Ci0JfQotb3V0X3VubWFwX2ZpbHRlcl9saXN0OgotCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9kbWEsIDQwOTYsCi0JCQkgRE1BX0JJRElSRUNUSU9OQUwpOwotCi1vdXRfZnJlZV90eF9sdGI6Ci0Jd2hpbGUgKC0taSAmZ3Q7PSAwKSB7Ci0JCWlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7Ci0JfQotCi1vdXRfdW5tYXBfYnVmZmVyX2xpc3Q6Ci0JZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkYXB0ZXItJmd0O2J1ZmZlcl9saXN0X2RtYSwgNDA5NiwKLQkJCSBETUFfQklESVJFQ1RJT05BTCk7CiYjNDM7CWlibXZldGhfZnJlZV9idWZmZXJfcG9vbHMoYWRhcHRlcik7CiYjNDM7b3V0X3VucmVnaXN0ZXJfcXVldWVzOgomIzQzOwlpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKGFkYXB0ZXIpOwomIzQzOwlpYm12ZXRoX2ZyZWVfYWxsX3F1ZXVlcyhhZGFwdGVyKTsKIG91dF9mcmVlX3F1ZXVlX21lbToKLQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2xlbiwKLQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfYWRkciwKLQkJCSAgYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfZG1hKTsKJiM0MzsJaWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIG91dF9mcmVlX2ZpbHRlcl9saXN0OgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9hZGRyKTsKLW91dF9mcmVlX2J1ZmZlcl9saXN0OgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyKTsKJiM0MzsJaWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KGFkYXB0ZXIpOwomIzQzO291dF9mcmVlX3J4X3FzdGF0czoKJiM0MzsJaWJtdmV0aF9mcmVlX3J4X3FzdGF0cyhhZGFwdGVyKTsKIG91dDoKLQluYXBpX2Rpc2FibGUoJmFtcDthZGFwdGVyLSZndDtuYXBpKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgaWJtdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhbXA7YWRhcHRlci0mZ3Q7dmRldi0mZ3Q7ZGV2OwotCWxvbmcgbHBhcl9yYzsKIAlpbnQgaTsKIAogCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O2Nsb3NlIHN0YXJ0aW5nXG4mIzM0Oyk7CiAKLQluYXBpX2Rpc2FibGUoJmFtcDthZGFwdGVyLSZndDtuYXBpKTsKLQogCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOwogCi0JaF92aW9fc2lnbmFsKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTsKLQotCWRvIHsKLQkJbHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MpOwotCX0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpOwotCi0JaWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O2hfZnJlZV9sb2dpY2FsX2xhbiBmYWlsZWQgd2l0aCAlbHgsICYjMzQ7Ci0JCQkgICAmIzM0O2NvbnRpbnVpbmcgd2l0aCBjbG9zZVxuJiMzNDssIGxwYXJfcmMpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0pIHsKJiM0MzsJCQlpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpOwomIzQzOwkJCXN5bmNocm9uaXplX2lycShhZGFwdGVyLSZndDtxdWV1ZV9pcnFbaV0pOwomIzQzOwkJfQogCX0KIAotCWZyZWVfaXJxKG5ldGRldi0mZ3Q7aXJxLCBuZXRkZXYpOwotCiYjNDM7CWlibXZldGhfZnJlZV90eF9xc3RhdHMoYWRhcHRlcik7CiYjNDM7CWlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiYjNDM7CWlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwogCWlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihhZGFwdGVyKTsKLQotCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9kbWEsIDQwOTYsCi0JCQkgRE1BX0JJRElSRUNUSU9OQUwpOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLSZndDtidWZmZXJfbGlzdF9hZGRyKTsKLQotCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9kbWEsIDQwOTYsCi0JCQkgRE1BX0JJRElSRUNUSU9OQUwpOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLSZndDtmaWx0ZXJfbGlzdF9hZGRyKTsKLQotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfbGVuLAotCQkJICBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9hZGRyLAotCQkJICBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9kbWEpOwotCi0JZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KQotCQlpZiAoYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldLmFjdGl2ZSkKLQkJCWlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLAotCQkJCQkJICZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldKTsKLQotCWZvciAoaSA9IDA7IGkgJmx0OyBuZXRkZXYtJmd0O3JlYWxfbnVtX3R4X3F1ZXVlczsgaSYjNDM7JiM0MzspCi0JCWlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7CiYjNDM7CWlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpOwomIzQzOwlpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIpOwomIzQzOwlpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwomIzQzOwlpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3QoYWRhcHRlcik7CiYjNDM7CWlibXZldGhfZnJlZV9yeF9xc3RhdHMoYWRhcHRlcik7CiAKIAluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtjbG9zZSBjb21wbGV0ZVxuJiMzNDspOwogCkBAIC0xMDczLDIyICYjNDM7MjM3NSwxMDcgQEAgc3RhdGljIGludCBpYm12ZXRoX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCXJldHVybiByYzEgPyByYzEgOiByYzI7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2FnZ3JlZ2F0ZV9yeF9xc3RhdHMgLSBTdW0gcGVyLXF1ZXVlIFJYIHN0YXRzIGludG8gZ2xvYmFscwomIzQzOyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIKJiM0MzsgKgomIzQzOyAqIENvbGQgcGF0aCBvbmx5IChldGh0b29sKS4gS2VlcHMgbGVnYWN5IGdsb2JhbCBjb3VudGVycyBtZWFuaW5nZnVsIGZvcgomIzQzOyAqIHRvb2xzIHRoYXQgcmVhZCB0aGUgYWRhcHRlci1sZXZlbCBmaWVsZHMgaW4gaWJtdmV0aF9zdGF0c1tdLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQomIzQzO3sKJiM0MzsJdTY0IHRvdGFsX2ludmFsaWQgPSAwOwomIzQzOwl1NjQgdG90YWxfbGFyZ2UgPSAwOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKCFhZGFwdGVyLSZndDtyeF9xc3RhdHMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJdG90YWxfaW52YWxpZCAmIzQzOz0gYWRhcHRlci0mZ3Q7cnhfcXN0YXRzW2ldLmludmFsaWRfYnVmZmVyczsKJiM0MzsJCXRvdGFsX2xhcmdlICYjNDM7PSBhZGFwdGVyLSZndDtyeF9xc3RhdHNbaV0ubGFyZ2VfcGFja2V0czsKJiM0MzsJfQomIzQzOwomIzQzOwlhZGFwdGVyLSZndDtyeF9pbnZhbGlkX2J1ZmZlciA9IHRvdGFsX2ludmFsaWQ7CiYjNDM7CWFkYXB0ZXItJmd0O3J4X2xhcmdlX3BhY2tldHMgPSB0b3RhbF9sYXJnZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaWJtdmV0aF9hZ2dyZWdhdGVfdHhfcXN0YXRzIC0gU3VtIHBlci1xdWV1ZSBUWCBzdGF0cyBpbnRvIGdsb2JhbHMKJiM0MzsgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyCiYjNDM7ICoKJiM0MzsgKiBDb2xkIHBhdGggb25seSAoZXRodG9vbCkuIEtlZXBzIGxlZ2FjeSBnbG9iYWwgY291bnRlcnMgbWVhbmluZ2Z1bCBmb3IKJiM0MzsgKiB0b29scyB0aGF0IHJlYWQgdGhlIGFkYXB0ZXItbGV2ZWwgZmllbGRzIGluIGlibXZldGhfc3RhdHNbXS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLSZndDtuZXRkZXY7CiYjNDM7CXU2NCB0b3RhbF9sYXJnZSA9IDA7CiYjNDM7CXU2NCB0b3RhbF9zZW5kX2ZhaWxlZCA9IDA7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIWFkYXB0ZXItJmd0O3R4X3FzdGF0cykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5ldGRldi0mZ3Q7cmVhbF9udW1fdHhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJdG90YWxfbGFyZ2UgJiM0Mzs9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tpXS5sYXJnZV9wYWNrZXRzOwomIzQzOwkJdG90YWxfc2VuZF9mYWlsZWQgJiM0Mzs9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tpXS5zZW5kX2ZhaWx1cmVzOwomIzQzOwl9CiYjNDM7CiYjNDM7CWFkYXB0ZXItJmd0O3R4X2xhcmdlX3BhY2tldHMgPSB0b3RhbF9sYXJnZTsKJiM0MzsJYWRhcHRlci0mZ3Q7dHhfc2VuZF9mYWlsZWQgPSB0b3RhbF9zZW5kX2ZhaWxlZDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBpYm12ZXRoX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQogewomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKJiM0MzsJdTggKnAgPSBkYXRhOwogCWludCBpOwogCiAJaWYgKHN0cmluZ3NldCAhPSBFVEhfU1NfU1RBVFMpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOyBpJiM0MzsmIzQzOywgZGF0YSAmIzQzOz0gRVRIX0dTVFJJTkdfTEVOKQotCQltZW1jcHkoZGF0YSwgaWJtdmV0aF9zdGF0c1tpXS5uYW1lLCBFVEhfR1NUUklOR19MRU4pOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShpYm12ZXRoX3N0YXRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCW1lbWNweShwLCBpYm12ZXRoX3N0YXRzW2ldLm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7CiYjNDM7CQlwICYjNDM7PSBFVEhfR1NUUklOR19MRU47CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlldGh0b29sX3NwcmludGYoJmFtcDtwLCAmIzM0O3J4JWRfcGFja2V0cyYjMzQ7LCBpKTsKJiM0MzsJCWV0aHRvb2xfc3ByaW50ZigmYW1wO3AsICYjMzQ7cnglZF9ieXRlcyYjMzQ7LCBpKTsKJiM0MzsJCWV0aHRvb2xfc3ByaW50ZigmYW1wO3AsICYjMzQ7cnglZF9pbnRlcnJ1cHRzJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDtyeCVkX3BvbGxzJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDtyeCVkX2xhcmdlX3BhY2tldHMmIzM0OywgaSk7CiYjNDM7CQlldGh0b29sX3NwcmludGYoJmFtcDtwLCAmIzM0O3J4JWRfaW52YWxpZF9idWZmZXJzJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDtyeCVkX25vX2J1ZmZlcl9kcm9wcyYjMzQ7LCBpKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGV2LSZndDtyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlldGh0b29sX3NwcmludGYoJmFtcDtwLCAmIzM0O3R4JWRfcGFja2V0cyYjMzQ7LCBpKTsKJiM0MzsJCWV0aHRvb2xfc3ByaW50ZigmYW1wO3AsICYjMzQ7dHglZF9ieXRlcyYjMzQ7LCBpKTsKJiM0MzsJCWV0aHRvb2xfc3ByaW50ZigmYW1wO3AsICYjMzQ7dHglZF9sYXJnZV9wYWNrZXRzJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDt0eCVkX2Ryb3BwZWRfcGFja2V0cyYjMzQ7LCBpKTsKJiM0MzsJCWV0aHRvb2xfc3ByaW50ZigmYW1wO3AsICYjMzQ7dHglZF9zZW5kX2ZhaWx1cmVzJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDt0eCVkX2NoZWNrc3VtX29mZmxvYWQmIzM0OywgaSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlldGh0b29sX3NwcmludGYoJmFtcDtwLCAmIzM0O3Bvb2wlZF9zaXplJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDtwb29sJWRfYWN0aXZlJiMzNDssIGkpOwomIzQzOwkJZXRodG9vbF9zcHJpbnRmKCZhbXA7cCwgJiMzNDtwb29sJWRfYXZhaWxhYmxlJiMzNDssIGkpOwomIzQzOwl9CiB9CiAKIHN0YXRpYyBpbnQgaWJtdmV0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKIHsKJiM0MzsJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiYjNDM7CiAJc3dpdGNoIChzc2V0KSB7CiAJY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCXJldHVybiBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOwomIzQzOwkJcmV0dXJuIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cykgJiM0MzsKJiM0MzsJCSAgICAgICBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzICogSUJNVkVUSF9OVU1fUlhfUVNUQVRTICYjNDM7CiYjNDM7CQkgICAgICAgZGV2LSZndDtyZWFsX251bV90eF9xdWV1ZXMgKiBJQk1WRVRIX05VTV9UWF9RU1RBVFMgJiM0MzsKJiM0MzsJCSAgICAgICBJQk1WRVRIX05VTV9CVUZGX1BPT0xTICogMzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtMTA5Nyw0MCAmIzQzOzI0ODQsMTMxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKIHN0YXRpYyB2b2lkIGlibXZldGhfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKJiM0MzsJaW50IGksIGo7CiYjNDM7CiYjNDM7CWlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0cyhhZGFwdGVyKTsKJiM0MzsJaWJtdmV0aF9hZ2dyZWdhdGVfdHhfcXN0YXRzKGFkYXB0ZXIpOwogCiAJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7IGkmIzQzOyYjNDM7KQogCQlkYXRhW2ldID0gSUJNVkVUSF9HRVRfU1RBVChhZGFwdGVyLCBpYm12ZXRoX3N0YXRzW2ldLm9mZnNldCk7CiYjNDM7CiYjNDM7CWZvciAoaiA9IDA7IGogJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBqJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3J4X3FzdGF0cykgewomIzQzOwkJCWRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci0mZ3Q7cnhfcXN0YXRzW2pdLnBhY2tldHM7CiYjNDM7CQkJZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLSZndDtyeF9xc3RhdHNbal0uYnl0ZXM7CiYjNDM7CQkJZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLSZndDtyeF9xc3RhdHNbal0uaW50ZXJydXB0czsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3J4X3FzdGF0c1tqXS5wb2xsczsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3J4X3FzdGF0c1tqXS5sYXJnZV9wYWNrZXRzOwomIzQzOwkJCWRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci0mZ3Q7cnhfcXN0YXRzW2pdLmludmFsaWRfYnVmZmVyczsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3J4X3FzdGF0c1tqXS5ub19idWZmZXJfZHJvcHM7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWkgJiM0Mzs9IElCTVZFVEhfTlVNX1JYX1FTVEFUUzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGogPSAwOyBqICZsdDsgZGV2LSZndDtyZWFsX251bV90eF9xdWV1ZXM7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoYWRhcHRlci0mZ3Q7dHhfcXN0YXRzKSB7CiYjNDM7CQkJZGF0YVtpJiM0MzsmIzQzO10gPSBhZGFwdGVyLSZndDt0eF9xc3RhdHNbal0ucGFja2V0czsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tqXS5ieXRlczsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tqXS5sYXJnZV9wYWNrZXRzOwomIzQzOwkJCWRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW2pdLmRyb3BwZWRfcGFja2V0czsKJiM0MzsJCQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tqXS5zZW5kX2ZhaWx1cmVzOwomIzQzOwkJCWRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW2pdLmNoZWNrc3VtX29mZmxvYWQ7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWkgJiM0Mzs9IElCTVZFVEhfTlVNX1RYX1FTVEFUUzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGogPSAwOyBqICZsdDsgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCWRhdGFbaSYjNDM7JiM0MztdID0gYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdW2pdLnNpemU7CiYjNDM7CQlkYXRhW2kmIzQzOyYjNDM7XSA9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtqXS5hY3RpdmU7CiYjNDM7CQlkYXRhW2kmIzQzOyYjNDM7XSA9IGF0b21pY19yZWFkKCZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdW2pdLmF2YWlsYWJsZSk7CiYjNDM7CX0KIH0KIAogc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCQkgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoYW5uZWxzKQogewomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKJiM0MzsKIAljaGFubmVscy0mZ3Q7bWF4X3R4ID0gaWJtdmV0aF9yZWFsX21heF90eF9xdWV1ZXMoKTsKIAljaGFubmVscy0mZ3Q7dHhfY291bnQgPSBuZXRkZXYtJmd0O3JlYWxfbnVtX3R4X3F1ZXVlczsKIAotCWNoYW5uZWxzLSZndDttYXhfcnggPSBuZXRkZXYtJmd0O3JlYWxfbnVtX3J4X3F1ZXVlczsKLQljaGFubmVscy0mZ3Q7cnhfY291bnQgPSBuZXRkZXYtJmd0O3JlYWxfbnVtX3J4X3F1ZXVlczsKJiM0MzsJaWYgKGFkYXB0ZXItJmd0O211bHRpX3F1ZXVlKQomIzQzOwkJY2hhbm5lbHMtJmd0O21heF9yeCA9IElCTVZFVEhfTUFYX1JYX1FVRVVFUzsKJiM0MzsJZWxzZQomIzQzOwkJY2hhbm5lbHMtJmd0O21heF9yeCA9IDE7CiYjNDM7CWNoYW5uZWxzLSZndDtyeF9jb3VudCA9IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7CiB9CiAKIHN0YXRpYyBpbnQgaWJtdmV0aF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCQlzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hhbm5lbHMpCiB7CiAJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdW5zaWduZWQgaW50IG9sZCA9IG5ldGRldi0mZ3Q7cmVhbF9udW1fdHhfcXVldWVzLAotCQkgICAgIGdvYWwgPSBjaGFubmVscy0mZ3Q7dHhfY291bnQ7CiYjNDM7CXVuc2lnbmVkIGludCBvbGRfcnggPSBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOwomIzQzOwl1bnNpZ25lZCBpbnQgZ29hbF9yeCA9IGNoYW5uZWxzLSZndDtyeF9jb3VudDsKJiM0MzsJdW5zaWduZWQgaW50IG9sZCA9IG5ldGRldi0mZ3Q7cmVhbF9udW1fdHhfcXVldWVzOwomIzQzOwl1bnNpZ25lZCBpbnQgZ29hbCA9IGNoYW5uZWxzLSZndDt0eF9jb3VudDsKJiM0MzsJaW50IHJ4cV9lbnRyaWVzID0gYWRhcHRlci0mZ3Q7cnhfcXVldWVbMF0ubnVtX3Nsb3RzOwogCWludCByYywgaTsKIAogCS8qIElmIG5kb19vcGVuIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0IHRoZW4gZG9uJiMzOTt0IGFsbG9jYXRlLCBqdXN0IHNldAogCSAqIGRlc2lyZWQgbmV0ZGV2X3F1ZXVlJiMzOTtzIGFuZCByZXR1cm4KIAkgKi8KLQlpZiAoIShuZXRkZXYtJmd0O2ZsYWdzICZhbXA7IElGRl9VUCkpCiYjNDM7CWlmICghKG5ldGRldi0mZ3Q7ZmxhZ3MgJmFtcDsgSUZGX1VQKSkgewomIzQzOwkJaWYgKGdvYWxfcnggJmd0OyAxICZhbXA7JmFtcDsgIWFkYXB0ZXItJmd0O211bHRpX3F1ZXVlKSB7CiYjNDM7CQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCSAgICYjMzQ7Q2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxuJiMzNDssCiYjNDM7CQkJCSAgIGdvYWxfcngpOwomIzQzOwkJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmIChnb2FsX3J4ICZsdDsgMSB8fCBnb2FsX3J4ICZndDsgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKSB7CiYjNDM7CQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCSAgICYjMzQ7SW52YWxpZCBSWCBxdWV1ZSBjb3VudCAldSAobXVzdCBiZSAxLSVkKVxuJiMzNDssCiYjNDM7CQkJCSAgIGdvYWxfcngsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7CiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBTdGFzaCBkZXNpcmVkIFJYIGNvdW50OyBvcGVuKCkgcHVibGlzaGVzIGl0IHZpYQomIzQzOwkJICogbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcygpIGFmdGVyIHF1ZXVlIHJlZ2lzdHJhdGlvbi4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGdvYWxfcnggIT0gYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcykKJiM0MzsJCQlhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzID0gZ29hbF9yeDsKJiM0MzsKIAkJcmV0dXJuIG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmV0ZGV2LCBnb2FsKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZ29hbF9yeCAmZ3Q7IDEgJmFtcDsmYW1wOyAhYWRhcHRlci0mZ3Q7bXVsdGlfcXVldWUpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7Q2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxuJiMzNDssCiYjNDM7CQkJICAgZ29hbF9yeCk7CiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdvYWxfcnggJmx0OyAxIHx8IGdvYWxfcnggJmd0OyBJQk1WRVRIX01BWF9SWF9RVUVVRVMpIHsKJiM0MzsJCW5ldGRldl9lcnIobmV0ZGV2LAomIzQzOwkJCSAgICYjMzQ7SW52YWxpZCBSWCBxdWV1ZSBjb3VudCAldSAobXVzdCBiZSAxLSVkKVxuJiMzNDssCiYjNDM7CQkJICAgZ29hbF9yeCwgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChnb2FsX3J4ICE9IG9sZF9yeCkgewomIzQzOwkJcmMgPSBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwoYWRhcHRlciwgZ29hbF9yeCwKJiM0MzsJCQkJCQkJICByeHFfZW50cmllcyk7CiYjNDM7CQlpZiAocmMpIHsKJiM0MzsJCQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDtGYWlsZWQgdG8gcmVzaXplIFJYIHF1ZXVlczogJWRcbiYjMzQ7LCByYyk7CiYjNDM7CQkJcmV0dXJuIHJjOwomIzQzOwkJfQomIzQzOwl9CiAKIAkvKiBXZSBoYXZlIElCTVZFVEhfTUFYX1FVRVVFUyBuZXRkZXZfcXVldWUmIzM5O3MgYWxsb2NhdGVkCiAJICogYnV0IHdlIG1heSBuZWVkIHRvIGFsbG9jL2ZyZWUgdGhlIGx0YiYjMzk7cy4KIAkgKi8KJiM0MzsJaWYgKGdvYWwgPT0gb2xkKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CiAKIAkvKiBBbGxvY2F0ZSBhbnkgcXVldWUgdGhhdCB3ZSBuZWVkICovCkBAIC0xMTY0LDcgJiM0MzsyNjQyLDcgQEAgc3RhdGljIGludCBpYm12ZXRoX3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCiAJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG5ldGRldik7CiAKLQlyZXR1cm4gcmM7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKQEAgLTEyMDksMTIgJiM0MzsyNjg3LDE1IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9zZW5kKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCXJldHVybiAxOwogCX0KIAomIzQzOwlhZGFwdGVyLSZndDtoY2FsbF9zdGF0cy5zZW5kX2xhbiYjNDM7JiM0Mzs7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiYjNDM7CQkJCQkgc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwKJiM0MzsJCQkJCSBpbnQgcXVldWVfbnVtKQogewomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwogCXN0cnVjdCBldGhoZHIgKmV0aGVyX2hlYWRlcjsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTIyMiw3ICYjNDM7MjcwMyw4IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAogCWlmIChldGhlcl9hZGRyX2VxdWFsKGV0aGVyX2hlYWRlci0mZ3Q7aF9kZXN0LCBuZXRkZXYtJmd0O2Rldl9hZGRyKSkgewogCQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDt2ZXRoIGRvZXNuJiMzOTt0IHN1cHBvcnQgbG9vcGJhY2sgcGFja2V0cywgZHJvcHBpbmcgcGFja2V0LlxuJiMzNDspOwotCQluZXRkZXYtJmd0O3N0YXRzLnR4X2Ryb3BwZWQmIzQzOyYjNDM7OwomIzQzOwkJaWYgKGFkYXB0ZXItJmd0O3R4X3FzdGF0cykKJiM0MzsJCQlhZGFwdGVyLSZndDt0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMmIzQzOyYjNDM7OwogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTEyMzgsNyAmIzQzOzI3MjAsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJaW50IGksIHF1ZXVlX251bSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCXVuc2lnbmVkIGxvbmcgbXNzID0gMDsKIAotCWlmIChpYm12ZXRoX2lzX3BhY2tldF91bnN1cHBvcnRlZChza2IsIG5ldGRldikpCiYjNDM7CWlmIChpYm12ZXRoX2lzX3BhY2tldF91bnN1cHBvcnRlZChza2IsIGFkYXB0ZXIsIHF1ZXVlX251bSkpCiAJCWdvdG8gb3V0OwogCS8qIHZldGggY2FuJiMzOTt0IGNoZWNrc3VtIG9mZmxvYWQgVURQICovCiAJaWYgKHNrYi0mZ3Q7aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgJmFtcDsmYW1wOwpAQCAtMTI0OSw3ICYjNDM7MjczMSw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkgICAgc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkgewogCiAJCW5ldGRldl9lcnIobmV0ZGV2LCAmIzM0O3R4OiBmYWlsZWQgdG8gY2hlY2tzdW0gcGFja2V0XG4mIzM0Oyk7Ci0JCW5ldGRldi0mZ3Q7c3RhdHMudHhfZHJvcHBlZCYjNDM7JiM0Mzs7CiYjNDM7CQlhZGFwdGVyLSZndDt0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEyNjEsNiAmIzQzOzI3NDMsOCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAKIAkJZGVzY19mbGFncyB8PSAoSUJNVkVUSF9CVUZfTk9fQ1NVTSB8IElCTVZFVEhfQlVGX0NTVU1fR09PRCk7CiAKJiM0MzsJCWFkYXB0ZXItJmd0O3R4X3FzdGF0c1txdWV1ZV9udW1dLmNoZWNrc3VtX29mZmxvYWQmIzQzOyYjNDM7OwomIzQzOwogCQkvKiBOZWVkIHRvIHplcm8gb3V0IHRoZSBjaGVja3N1bSAqLwogCQlidWZbMF0gPSAwOwogCQlidWZbMV0gPSAwOwpAQCAtMTI3Miw3ICYjNDM7Mjc1Niw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAlpZiAoc2tiLSZndDtpcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmYW1wOyZhbXA7IHNrYl9pc19nc28oc2tiKSkgewogCQlpZiAoYWRhcHRlci0mZ3Q7ZndfbGFyZ2Vfc2VuZF9zdXBwb3J0KSB7CiAJCQltc3MgPSAodW5zaWduZWQgbG9uZylza2Jfc2hpbmZvKHNrYiktJmd0O2dzb19zaXplOwotCQkJYWRhcHRlci0mZ3Q7dHhfbGFyZ2VfcGFja2V0cyYjNDM7JiM0Mzs7CiYjNDM7CQkJYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW3F1ZXVlX251bV0ubGFyZ2VfcGFja2V0cyYjNDM7JiM0Mzs7CiAJCX0gZWxzZSBpZiAoIXNrYl9pc19nc29fdjYoc2tiKSkgewogCQkJLyogUHV0IC0xIGluIHRoZSBJUCBjaGVja3N1bSB0byB0ZWxsIHBoeXAgaXQKIAkJCSAqIGlzIGEgbGFyZ2VzZW5kIHBhY2tldC4gUHV0IHRoZSBtc3MgaW4KQEAgLTEyODEsNyAmIzQzOzI3NjUsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQlpcF9oZHIoc2tiKS0mZ3Q7Y2hlY2sgPSAweGZmZmY7CiAJCQl0Y3BfaGRyKHNrYiktJmd0O2NoZWNrID0KIAkJCQljcHVfdG9fYmUxNihza2Jfc2hpbmZvKHNrYiktJmd0O2dzb19zaXplKTsKLQkJCWFkYXB0ZXItJmd0O3R4X2xhcmdlX3BhY2tldHMmIzQzOyYjNDM7OwomIzQzOwkJCWFkYXB0ZXItJmd0O3R4X3FzdGF0c1txdWV1ZV9udW1dLmxhcmdlX3BhY2tldHMmIzQzOyYjNDM7OwogCQl9CiAJfQogCkBAIC0xMjg5LDcgJiM0MzsyNzczLDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCWlmICh1bmxpa2VseShza2ItJmd0O2xlbiAmZ3Q7IGFkYXB0ZXItJmd0O3R4X2x0Yl9zaXplKSkgewogCQluZXRkZXZfZXJyKGFkYXB0ZXItJmd0O25ldGRldiwgJiMzNDt0eDogcGFja2V0IHNpemUgKCV1KSBleGNlZWRzIGx0YiAoJXUpXG4mIzM0OywKIAkJCSAgIHNrYi0mZ3Q7bGVuLCBhZGFwdGVyLSZndDt0eF9sdGJfc2l6ZSk7Ci0JCW5ldGRldi0mZ3Q7c3RhdHMudHhfZHJvcHBlZCYjNDM7JiM0Mzs7CiYjNDM7CQlhZGFwdGVyLSZndDt0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAJbWVtY3B5KGFkYXB0ZXItJmd0O3R4X2x0Yl9wdHJbcXVldWVfbnVtXSwgc2tiLSZndDtkYXRhLCBza2JfaGVhZGxlbihza2IpKTsKQEAgLTEzMDYsNyAmIzQzOzI3OTAsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJaWYgKHVubGlrZWx5KHRvdGFsX2J5dGVzICE9IHNrYi0mZ3Q7bGVuKSkgewogCQluZXRkZXZfZXJyKGFkYXB0ZXItJmd0O25ldGRldiwgJiMzNDt0eDogaW5jb3JyZWN0IHBhY2tldCBsZW4gY29waWVkIGludG8gbHRiICgldSAhPSAldSlcbiYjMzQ7LAogCQkJICAgc2tiLSZndDtsZW4sIHRvdGFsX2J5dGVzKTsKLQkJbmV0ZGV2LSZndDtzdGF0cy50eF9kcm9wcGVkJiM0MzsmIzQzOzsKJiM0MzsJCWFkYXB0ZXItJmd0O3R4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cyYjNDM7JiM0Mzs7CiAJCWdvdG8gb3V0OwogCX0KIAlkZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBkZXNjX2ZsYWdzIHwgc2tiLSZndDtsZW47CkBAIC0xMzE1LDExICYjNDM7Mjc5OSwxMSBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJZG1hX3dtYigpOwogCiAJaWYgKGlibXZldGhfc2VuZChhZGFwdGVyLCBkZXNjLmRlc2MsIG1zcykpIHsKLQkJYWRhcHRlci0mZ3Q7dHhfc2VuZF9mYWlsZWQmIzQzOyYjNDM7OwotCQluZXRkZXYtJmd0O3N0YXRzLnR4X2Ryb3BwZWQmIzQzOyYjNDM7OwomIzQzOwkJYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW3F1ZXVlX251bV0uc2VuZF9mYWlsdXJlcyYjNDM7JiM0Mzs7CiYjNDM7CQlhZGFwdGVyLSZndDt0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMmIzQzOyYjNDM7OwogCX0gZWxzZSB7Ci0JCW5ldGRldi0mZ3Q7c3RhdHMudHhfcGFja2V0cyYjNDM7JiM0Mzs7Ci0JCW5ldGRldi0mZ3Q7c3RhdHMudHhfYnl0ZXMgJiM0Mzs9IHNrYi0mZ3Q7bGVuOwomIzQzOwkJYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW3F1ZXVlX251bV0ucGFja2V0cyYjNDM7JiM0Mzs7CiYjNDM7CQlhZGFwdGVyLSZndDt0eF9xc3RhdHNbcXVldWVfbnVtXS5ieXRlcyAmIzQzOz0gc2tiLSZndDtsZW47CiAJfQogCiBvdXQ6CkBAIC0xNDQ3LDM2ICYjNDM7MjkzMSw2OSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3J4X2NzdW1faGVscGVyKHN0cnVjdCBza19idWZmICpza2IsCiAKIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0KLQkJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyLCBuYXBpKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0mZ3Q7bmV0ZGV2OwomIzQzOwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbmFwaS0mZ3Q7ZGV2OwomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgZnJhbWVzX3Byb2Nlc3NlZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwomIzQzOwlpbnQgcXVldWVfaW5kZXgsIHJjOwogCXUxNiBtc3MgPSAwOwogCiYjNDM7CXF1ZXVlX2luZGV4ID0gbmFwaSAtIGFkYXB0ZXItJmd0O25hcGk7CiYjNDM7CiYjNDM7CWlmIChXQVJOX09OKHF1ZXVlX2luZGV4ICZsdDsgMCB8fCBxdWV1ZV9pbmRleCAmZ3Q7PSBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSkgewomIzQzOwkJbmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIDApOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGFkYXB0ZXItJmd0O3J4X3FzdGF0cykKJiM0MzsJCWFkYXB0ZXItJmd0O3J4X3FzdGF0c1txdWV1ZV9pbmRleF0ucG9sbHMmIzQzOyYjNDM7OwomIzQzOwogcmVzdGFydF9wb2xsOgogCXdoaWxlIChmcmFtZXNfcHJvY2Vzc2VkICZsdDsgYnVkZ2V0KSB7Ci0JCWlmICghaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoYWRhcHRlcikpCiYjNDM7CQlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSkKJiM0MzsJCQlicmVhazsKJiM0MzsKJiM0MzsJCWlmICghaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgpKQogCQkJYnJlYWs7CiAKIAkJc21wX3JtYigpOwotCQlpZiAoIWlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChhZGFwdGVyKSkgewomIzQzOwkJaWYgKCFpYm12ZXRoX3J4cV9idWZmZXJfdmFsaWQoYWRhcHRlciwgcXVldWVfaW5kZXgpKSB7CiAJCQl3bWIoKTsgLyogc3VnZ2VzdGVkIGJ5IGxhcnNvbjEgKi8KLQkJCWFkYXB0ZXItJmd0O3J4X2ludmFsaWRfYnVmZmVyJiM0MzsmIzQzOzsKJiM0MzsJCQlpZiAoYWRhcHRlci0mZ3Q7cnhfcXN0YXRzKQomIzQzOwkJCQlhZGFwdGVyLSZndDtyeF9xc3RhdHNbcXVldWVfaW5kZXhdLmludmFsaWRfYnVmZmVycyYjNDM7JiM0Mzs7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlhZGFwdGVyLSZndDtyeF9pbnZhbGlkX2J1ZmZlciYjNDM7JiM0Mzs7CiAJCQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtyZWN5Y2xpbmcgaW52YWxpZCBidWZmZXJcbiYjMzQ7KTsKLQkJCWlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpCiYjNDM7CQkJcmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7CiYjNDM7CQkJaWYgKHVubGlrZWx5KHJjKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBza19idWZmICpza2IsICpuZXdfc2tiOwotCQkJaW50IGxlbmd0aCA9IGlibXZldGhfcnhxX2ZyYW1lX2xlbmd0aChhZGFwdGVyKTsKLQkJCWludCBvZmZzZXQgPSBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoYWRhcHRlcik7Ci0JCQlpbnQgY3N1bV9nb29kID0gaWJtdmV0aF9yeHFfY3N1bV9nb29kKGFkYXB0ZXIpOwotCQkJaW50IGxyZ19wa3QgPSBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoYWRhcHRlcik7CiYjNDM7CQkJaW50IGxlbmd0aCA9IGlibXZldGhfcnhxX2ZyYW1lX2xlbmd0aChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7CiYjNDM7CQkJaW50IG9mZnNldCA9IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7CiYjNDM7CQkJaW50IGNzdW1fZ29vZCA9IGlibXZldGhfcnhxX2NzdW1fZ29vZChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7CiYjNDM7CQkJaW50IGxyZ19wa3QgPSBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoYWRhcHRlciwgcXVldWVfaW5kZXgpOwogCQkJX19zdW0xNiBpcGhfY2hlY2sgPSAwOwogCi0JCQlza2IgPSBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIpOwotCQkJaWYgKHVubGlrZWx5KCFza2IpKQotCQkJCWJyZWFrOwomIzQzOwkJCXNrYiA9IGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgpOwomIzQzOwkJCWlmICh1bmxpa2VseSghc2tiKSkgewomIzQzOwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQomIzQzOwkJCQkJbmV0ZGV2X2VycihuZXRkZXYsCiYjNDM7CQkJCQkJICAgJiMzNDtiYWQgY29ycmVsYXRvciBvbiBxdWV1ZSAlZCwgc2tpcHBpbmcgc2xvdFxuJiMzNDssCiYjNDM7CQkJCQkJICAgcXVldWVfaW5kZXgpOwomIzQzOwkJCQlpZiAoYWRhcHRlci0mZ3Q7cnhfcXN0YXRzKQomIzQzOwkJCQkJYWRhcHRlci0mZ3Q7cnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5pbnZhbGlkX2J1ZmZlcnMmIzQzOyYjNDM7OwomIzQzOwkJCQllbHNlCiYjNDM7CQkJCQlhZGFwdGVyLSZndDtyeF9pbnZhbGlkX2J1ZmZlciYjNDM7JiM0Mzs7CiYjNDM7CQkJCXJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsCiYjNDM7CQkJCQkJCQl0cnVlKTsKJiM0MzsJCQkJaWYgKHVubGlrZWx5KHJjKSkKJiM0MzsJCQkJCWJyZWFrOwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiAKIAkJCS8qIGlmIHRoZSBsYXJnZSBwYWNrZXQgYml0IGlzIHNldCBpbiB0aGUgcnggcXVldWUKIAkJCSAqIGRlc2NyaXB0b3IsIHRoZSBtc3Mgd2lsbCBiZSB3cml0dGVuIGJ5IFBIWVAgZWlnaHQKQEAgLTE0OTksMTIgJiM0MzszMDE2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIAkJCQkJCQlsZW5ndGgpOwogCQkJCWlmIChyeF9mbHVzaCkKIAkJCQkJaWJtdmV0aF9mbHVzaF9idWZmZXIoc2tiLSZndDtkYXRhLAotCQkJCQkJbGVuZ3RoICYjNDM7IG9mZnNldCk7Ci0JCQkJaWYgKHVubGlrZWx5KGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHRydWUpKSkKJiM0MzsJCQkJCQkJICAgICBsZW5ndGggJiM0Mzsgb2Zmc2V0KTsKJiM0MzsJCQkJcmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7CiYjNDM7CQkJCWlmICh1bmxpa2VseShyYykpCiAJCQkJCWJyZWFrOwogCQkJCXNrYiA9IG5ld19za2I7CiAJCQl9IGVsc2UgewotCQkJCWlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBmYWxzZSkpKQomIzQzOwkJCQlyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCBmYWxzZSk7CiYjNDM7CQkJCWlmICh1bmxpa2VseShyYykpCiAJCQkJCWJyZWFrOwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgb2Zmc2V0KTsKIAkJCX0KQEAgLTE1MjQsNyAmIzQzOzMwNDMsMTAgQEAgc3RhdGljIGludCBpYm12ZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogCQkJaWYgKChsZW5ndGggJmd0OyBuZXRkZXYtJmd0O210dSAmIzQzOyBFVEhfSExFTikgfHwKIAkJCSAgICBscmdfcGt0IHx8IGlwaF9jaGVjayA9PSAweGZmZmYpIHsKIAkJCQlpYm12ZXRoX3J4X21zc19oZWxwZXIoc2tiLCBtc3MsIGxyZ19wa3QpOwotCQkJCWFkYXB0ZXItJmd0O3J4X2xhcmdlX3BhY2tldHMmIzQzOyYjNDM7OwomIzQzOwkJCQlpZiAoYWRhcHRlci0mZ3Q7cnhfcXN0YXRzKQomIzQzOwkJCQkJYWRhcHRlci0mZ3Q7cnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5sYXJnZV9wYWNrZXRzJiM0MzsmIzQzOzsKJiM0MzsJCQkJZWxzZQomIzQzOwkJCQkJYWRhcHRlci0mZ3Q7cnhfbGFyZ2VfcGFja2V0cyYjNDM7JiM0Mzs7CiAJCQl9CiAKIAkJCWlmIChjc3VtX2dvb2QpIHsKQEAgLTE1MzQsMTYgJiM0MzszMDU2LDIyIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIAogCQkJbmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpOwkvKiBzZW5kIGl0IHVwICovCiAKLQkJCW5ldGRldi0mZ3Q7c3RhdHMucnhfcGFja2V0cyYjNDM7JiM0Mzs7Ci0JCQluZXRkZXYtJmd0O3N0YXRzLnJ4X2J5dGVzICYjNDM7PSBsZW5ndGg7CiYjNDM7CQkJaWYgKGFkYXB0ZXItJmd0O3J4X3FzdGF0cykgewomIzQzOwkJCQlhZGFwdGVyLSZndDtyeF9xc3RhdHNbcXVldWVfaW5kZXhdLnBhY2tldHMmIzQzOyYjNDM7OwomIzQzOwkJCQlhZGFwdGVyLSZndDtyeF9xc3RhdHNbcXVldWVfaW5kZXhdLmJ5dGVzICYjNDM7PSBsZW5ndGg7CiYjNDM7CQkJfQomIzQzOwogCQkJZnJhbWVzX3Byb2Nlc3NlZCYjNDM7JiM0Mzs7CiAJCX0KIAl9CiAKLQlpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIpOwomIzQzOwlpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTsKIAotCWlmIChmcmFtZXNfcHJvY2Vzc2VkID09IGJ1ZGdldCkKJiM0MzsJaWYgKGZyYW1lc19wcm9jZXNzZWQgPT0gYnVkZ2V0KSB7CiYjNDM7CQlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSkKJiM0MzsJCQluYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgZnJhbWVzX3Byb2Nlc3NlZCk7CiAJCWdvdG8gb3V0OwomIzQzOwl9CiAKIAlpZiAoIW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCBmcmFtZXNfcHJvY2Vzc2VkKSkKIAkJZ290byBvdXQ7CkBAIC0xNTUxLDE1ICYjNDM7MzA3OSwyMSBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiAJLyogV2UgdGhpbmsgd2UgYXJlIGRvbmUgLSByZWVuYWJsZSBpbnRlcnJ1cHRzLAogCSAqIHRoZW4gY2hlY2sgb25jZSBtb3JlIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgZG9uZS4KIAkgKi8KLQlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpOwotCWlmIChXQVJOX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSkgewomIzQzOwlscGFyX3JjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTsKJiM0MzsJaWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7CiYjNDM7CQluZXRkZXZfZXJyKG5ldGRldiwKJiM0MzsJCQkgICAmIzM0O0ZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZCAocmM9MHglbHgpLCBzY2hlZHVsaW5nIHJlc2V0XG4mIzM0OywKJiM0MzsJCQkgICBxdWV1ZV9pbmRleCwgbHBhcl9yYyk7CiAJCXNjaGVkdWxlX3dvcmsoJmFtcDthZGFwdGVyLSZndDt3b3JrKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpICZhbXA7JmFtcDsgbmFwaV9zY2hlZHVsZShuYXBpKSkgewotCQlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItJmd0O3ZkZXYtJmd0O3VuaXRfYWRkcmVzcywKLQkJCQkgICAgICAgVklPX0lSUV9ESVNBQkxFKTsKJiM0MzsJaWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBuZXRpZl9ydW5uaW5nKG5ldGRldikgJmFtcDsmYW1wOwomIzQzOwkgICAgIW5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpICZhbXA7JmFtcDsKJiM0MzsJICAgIG5hcGlfc2NoZWR1bGUobmFwaSkpIHsKJiM0MzsJCWxwYXJfcmMgPSBpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTsKJiM0MzsJCVdBUk5fT04obHBhcl9yYyAhPSBIX1NVQ0NFU1MpOwogCQlnb3RvIHJlc3RhcnRfcG9sbDsKIAl9CiAKQEAgLTE1NjksMTUgJiM0MzszMTAzLDI0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIAogc3RhdGljIGlycXJldHVybl90IGlibXZldGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2luc3RhbmNlOwomIzQzOwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkgPSBkZXZfaW5zdGFuY2U7CiYjNDM7CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBuYXBpLSZndDtkZXY7CiAJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwomIzQzOwlpbnQgcWluZGV4OwomIzQzOwomIzQzOwlxaW5kZXggPSBuYXBpIC0gYWRhcHRlci0mZ3Q7bmFwaTsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT04ocWluZGV4ICZsdDsgMCB8fCBxaW5kZXggJmd0Oz0gYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcykpCiYjNDM7CQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpZiAobmFwaV9zY2hlZHVsZV9wcmVwKCZhbXA7YWRhcHRlci0mZ3Q7bmFwaSkpIHsKLQkJbHBhcl9yYyA9IGhfdmlvX3NpZ25hbChhZGFwdGVyLSZndDt2ZGV2LSZndDt1bml0X2FkZHJlc3MsCi0JCQkJICAgICAgIFZJT19JUlFfRElTQUJMRSk7CiYjNDM7CWlmIChhZGFwdGVyLSZndDtyeF9xc3RhdHMpCiYjNDM7CQlhZGFwdGVyLSZndDtyeF9xc3RhdHNbcWluZGV4XS5pbnRlcnJ1cHRzJiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJaWYgKG5hcGlfc2NoZWR1bGVfcHJlcChuYXBpKSkgewomIzQzOwkJbHBhcl9yYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgcWluZGV4KTsKIAkJV0FSTl9PTihscGFyX3JjICE9IEhfU1VDQ0VTUyk7Ci0JCV9fbmFwaV9zY2hlZHVsZSgmYW1wO2FkYXB0ZXItJmd0O25hcGkpOwomIzQzOwkJX19uYXBpX3NjaGVkdWxlKG5hcGkpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xNjQ1LDcgJiM0MzszMTg4LDcgQEAgc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiAJaW50IG5lZWRfcmVzdGFydCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspCi0JCWlmIChuZXdfbXR1X29oICZsdDs9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXS5idWZmX3NpemUpCiYjNDM7CQlpZiAobmV3X210dV9vaCAmbHQ7PSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplKQogCQkJYnJlYWs7CiAKIAlpZiAoaSA9PSBJQk1WRVRIX05VTV9CVUZGX1BPT0xTKQpAQCAtMTY2MCw5ICYjNDM7MzIwMyw5IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogCiAJLyogTG9vayBmb3IgYW4gYWN0aXZlIGJ1ZmZlciBwb29sIHRoYXQgY2FuIGhvbGQgdGhlIG5ldyBNVFUgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHsKLQkJYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldLmFjdGl2ZSA9IDE7CiYjNDM7CQlhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlID0gMTsKIAotCQlpZiAobmV3X210dV9vaCAmbHQ7PSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKSB7CiYjNDM7CQlpZiAobmV3X210dV9vaCAmbHQ7PSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplKSB7CiAJCQlXUklURV9PTkNFKGRldi0mZ3Q7bXR1LCBuZXdfbXR1KTsKIAkJCXZpb19jbW9fc2V0X2Rldl9kZXNpcmVkKHZpb2RldiwKIAkJCQkJCWlibXZldGhfZ2V0X2Rlc2lyZWRfZG1hCkBAIC0xNjgzLDggJiM0MzszMjI2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBpYm12ZXRoX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWlibXZldGhfcmVwbGVuaXNoX3Rhc2sobmV0ZGV2X3ByaXYoZGV2KSk7Ci0JaWJtdmV0aF9pbnRlcnJ1cHQoZGV2LSZndDtpcnEsIGRldik7CiYjNDM7CXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBpKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGFkYXB0ZXItJmd0O251bV9yeF9xdWV1ZXM7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWJtdmV0aF9pbnRlcnJ1cHQoYWRhcHRlci0mZ3Q7cXVldWVfaXJxW2ldLCAmYW1wO2FkYXB0ZXItJmd0O25hcGlbaV0pOwogfQogI2VuZGlmCiAKQEAgLTE3MDIsOCAmIzQzOzMyNTEsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBpYm12ZXRoX2dldF9kZXNpcmVkX2RtYShzdHJ1Y3QgdmlvX2RldiAqdmRldikKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXVuc2lnbmVkIGxvbmcgcmV0OwotCWludCBpOwotCWludCByeHFlbnRyaWVzID0gMTsKJiM0MzsJaW50IGksIHE7CiAKIAl0YmwgPSBnZXRfaW9tbXVfdGFibGVfYmFzZSgmYW1wO3ZkZXYtJmd0O2Rldik7CiAKQEAgLTE3MTgsMTggJiM0MzszMjY2LDIyIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlibXZldGhfZ2V0X2Rlc2lyZWRfZG1hKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQogCS8qIGFkZCBzaXplIG9mIG1hcHBlZCB0eCBidWZmZXJzICovCiAJcmV0ICYjNDM7PSBJT01NVV9QQUdFX0FMSUdOKElCTVZFVEhfTUFYX1RYX0JVRl9TSVpFLCB0YmwpOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7Ci0JCS8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHJlY2VpdmUgYnVmZmVycyAqLwotCQlpZiAoYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldLmFjdGl2ZSkKLQkJCXJldCAmIzQzOz0KLQkJCSAgICBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0uc2l6ZSAqCi0JCQkgICAgSU9NTVVfUEFHRV9BTElHTihhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0uCi0JCQkJCSAgICAgYnVmZl9zaXplLCB0YmwpOwotCQlyeHFlbnRyaWVzICYjNDM7PSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0uc2l6ZTsKLQl9Ci0JLyogYWRkIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIHF1ZXVlIGVudHJpZXMgKi8KLQlyZXQgJiM0Mzs9IElPTU1VX1BBR0VfQUxJR04oCi0JCXJ4cWVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSksIHRibCk7CiYjNDM7CWZvciAocSA9IDA7IHEgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBxJiM0MzsmIzQzOykgewomIzQzOwkJaW50IHJ4cWVudHJpZXMgPSAxOwomIzQzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJLyogYWRkIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgcmVjZWl2ZSBidWZmZXJzICovCiYjNDM7CQkJaWYgKGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtxXVtpXS5hY3RpdmUpCiYjNDM7CQkJCXJldCAmIzQzOz0gYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW3FdW2ldLnNpemUgKgomIzQzOwkJCQkJSU9NTVVfUEFHRV9BTElHTihhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcV1baV0uYnVmZl9zaXplLAomIzQzOwkJCQkJCQkgdGJsKTsKJiM0MzsJCQlyeHFlbnRyaWVzICYjNDM7PSBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbcV1baV0uc2l6ZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBxdWV1ZSBlbnRyaWVzICovCiYjNDM7CQlyZXQgJiM0Mzs9IElPTU1VX1BBR0VfQUxJR04ocnhxZW50cmllcyAqCiYjNDM7CQkJCQlzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSksIHRibCk7CiYjNDM7CX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNzc3LDYgJiM0MzszMzI5LDM5IEBAIHN0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBpYm12ZXRoX2ZlYXR1cmVzX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsCiAJcmV0dXJuIHZsYW5fZmVhdHVyZXNfY2hlY2soc2tiLCBmZWF0dXJlcyk7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBpYm12ZXRoX2dldF9zdGF0czY0IC0gUmV0dXJuIGFnZ3JlZ2F0ZWQgcGVyLXF1ZXVlIHN0YXRpc3RpY3MKJiM0MzsgKiBAZGV2OiBuZXR3b3JrIGRldmljZQomIzQzOyAqIEBzdGF0czogcnRubCBsaW5rIHN0YXRpc3RpY3Mgc3RvcmFnZQomIzQzOyAqCiYjNDM7ICogU3VtcyBwZXItcXVldWUgcnhfcXN0YXRzIGFuZCB0eF9xc3RhdHMgaW50byB0aGUgcnRubCBjb3VudGVycy4KJiM0MzsgKiBDYWxsZXJzIHVzZSBuZG9fZ2V0X3N0YXRzNjQoKTsgYXZvaWQgdXBkYXRpbmcgbmV0ZGV2LSZndDtzdGF0cyBvbiB0aGUKJiM0MzsgKiB4bWl0L3BvbGwgcGF0aHMgdG8ga2VlcCBwZXItcXVldWUgY291bnRlcnMgb2ZmIHRoZSBob3QgY2FjaGUgbGluZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBpYm12ZXRoX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiYjNDM7CQkJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChhZGFwdGVyLSZndDtyeF9xc3RhdHMpIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCXN0YXRzLSZndDtyeF9wYWNrZXRzICYjNDM7PSBhZGFwdGVyLSZndDtyeF9xc3RhdHNbaV0ucGFja2V0czsKJiM0MzsJCQlzdGF0cy0mZ3Q7cnhfYnl0ZXMgJiM0Mzs9IGFkYXB0ZXItJmd0O3J4X3FzdGF0c1tpXS5ieXRlczsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoYWRhcHRlci0mZ3Q7dHhfcXN0YXRzKSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgZGV2LSZndDtyZWFsX251bV90eF9xdWV1ZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RhdHMtJmd0O3R4X3BhY2tldHMgJiM0Mzs9IGFkYXB0ZXItJmd0O3R4X3FzdGF0c1tpXS5wYWNrZXRzOwomIzQzOwkJCXN0YXRzLSZndDt0eF9ieXRlcyAmIzQzOz0gYWRhcHRlci0mZ3Q7dHhfcXN0YXRzW2ldLmJ5dGVzOwomIzQzOwkJCXN0YXRzLSZndDt0eF9kcm9wcGVkICYjNDM7PSBhZGFwdGVyLSZndDt0eF9xc3RhdHNbaV0uZHJvcHBlZF9wYWNrZXRzOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXN0YXRzLSZndDt0eF9lcnJvcnMgPSBkZXYtJmd0O3N0YXRzLnR4X2Vycm9yczsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlibXZldGhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaWJtdmV0aF9vcGVuLAogCS5uZG9fc3RvcAkJPSBpYm12ZXRoX2Nsb3NlLApAQCAtMTc4OSwxMSAmIzQzOzMzNzQsNTggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpYm12ZXRoX25ldGRldl9vcHMgPSB7CiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSBpYm12ZXRoX3NldF9tYWNfYWRkciwKIAkubmRvX2ZlYXR1cmVzX2NoZWNrCT0gaWJtdmV0aF9mZWF0dXJlc19jaGVjaywKJiM0MzsJLm5kb19nZXRfc3RhdHM2NAk9IGlibXZldGhfZ2V0X3N0YXRzNjQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGlibXZldGhfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCiB9OwogCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWJtdmV0aF9hdHRyX2dyb3VwOwomIzQzOwomIzQzO3N0YXRpYyBzc2l6ZV90IGJ1ZmZlcl9wb29sc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAomIzQzOwkJCQkgY2hhciAqYnVmKQomIzQzO3sKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKJiM0MzsJaW50IGxlbiA9IDA7CiYjNDM7CWludCBpLCBqOwomIzQzOwomIzQzOwlsZW4gJiM0Mzs9IHNjbnByaW50ZihidWYgJiM0MzsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCiYjNDM7CQkJICYjMzQ7UXVldWUgIFBvb2wgIFNpemUgIEJ1ZmZTaXplICBBY3RpdmUgIEF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwlsZW4gJiM0Mzs9IHNjbnByaW50ZihidWYgJiM0MzsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCiYjNDM7CQkJICYjMzQ7LS0tLS0gIC0tLS0gIC0tLS0gIC0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0tLVxuJiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaiA9IDA7IGogJmx0OyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBqJiM0MzsmIzQzOykgewomIzQzOwkJCXN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9CiYjNDM7CQkJCSZhbXA7YWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldW2pdOwomIzQzOwomIzQzOwkJCWxlbiAmIzQzOz0gc2NucHJpbnRmKGJ1ZiAmIzQzOyBsZW4sIFBBR0VfU0laRSAtIGxlbiwKJiM0MzsJCQkJCSAmIzM0OyU1ZCAgJTRkICAlNHUgICU4dSAgJTZkICAlOWRcbiYjMzQ7LAomIzQzOwkJCQkJIGksIGosIHBvb2wtJmd0O3NpemUsIHBvb2wtJmd0O2J1ZmZfc2l6ZSwKJiM0MzsJCQkJCSBwb29sLSZndDthY3RpdmUsCiYjNDM7CQkJCQkgYXRvbWljX3JlYWQoJmFtcDtwb29sLSZndDthdmFpbGFibGUpKTsKJiM0MzsKJiM0MzsJCQlpZiAobGVuICZndDs9IFBBR0VfU0laRSAtIDEwMCkKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiBsZW47CiYjNDM7fQomIzQzO3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidWZmZXJfcG9vbHMpOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppYm12ZXRoX2F0dHJzW10gPSB7CiYjNDM7CSZhbXA7ZGV2X2F0dHJfYnVmZmVyX3Bvb2xzLmF0dHIsCiYjNDM7CU5VTEwsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpYm12ZXRoX2F0dHJfZ3JvdXAgPSB7CiYjNDM7CS5hdHRycyA9IGlibXZldGhfYXR0cnMsCiYjNDM7fTsKJiM0MzsKIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHJjLCBpLCBtYWNfbGVuOwpAQCAtMTgzMSw3ICYjNDM7MzQ2Myw4IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2Yoc3RydWN0IGlibXZldGhfYWRhcHRlciksIElCTVZFVEhfTUFYX1FVRVVFUywgMSk7CiYjNDM7CW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2Yoc3RydWN0IGlibXZldGhfYWRhcHRlciksCiYjNDM7CQkJCSAgICBJQk1WRVRIX01BWF9RVUVVRVMsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7CiAJaWYgKCFuZXRkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xODQ0LDcgJiM0MzszNDc3LDggQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKIAlhZGFwdGVyLSZndDttY2FzdEZpbHRlclNpemUgPSBiZTMyX3RvX2NwdSgqbWNhc3RGaWx0ZXJTaXplX3ApOwogCWlibXZldGhfaW5pdF9saW5rX3NldHRpbmdzKG5ldGRldik7CiAKLQluZXRpZl9uYXBpX2FkZF93ZWlnaHQobmV0ZGV2LCAmYW1wO2FkYXB0ZXItJmd0O25hcGksIGlibXZldGhfcG9sbCwgMTYpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgSUJNVkVUSF9NQVhfUlhfUVVFVUVTOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5ldGlmX25hcGlfYWRkX3dlaWdodChuZXRkZXYsICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVtpXSwgaWJtdmV0aF9wb2xsLCAxNik7CiAKIAluZXRkZXYtJmd0O2lycSA9IGRldi0mZ3Q7aXJxOwogCW5ldGRldi0mZ3Q7bmV0ZGV2X29wcyA9ICZhbXA7aWJtdmV0aF9uZXRkZXZfb3BzOwpAQCAtMTg3NiwxMiAmIzQzOzM1MTAsMjcgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKIAkJbmV0ZGV2LSZndDtmZWF0dXJlcyB8PSBORVRJRl9GX0ZSQUdMSVNUOwogCX0KIAomIzQzOwlpZiAocmV0ID09IEhfU1VDQ0VTUyAmYW1wOyZhbXA7CiYjNDM7CSAgICAocmV0X2F0dHIgJmFtcDsgSUJNVkVUSF9JTExBTl9SWF9NVUxUSV9RVUVVRV9TVVBQT1JUKSkgewomIzQzOwkJYWRhcHRlci0mZ3Q7bXVsdGlfcXVldWUgPSAxOwomIzQzOwkJYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyA9IG1pbihudW1fb25saW5lX2NwdXMoKSwgSUJNVkVUSF9ERUZBVUxUX1FVRVVFUyk7CiYjNDM7CQluZXRkZXZfZGJnKG5ldGRldiwgJiMzNDtSWCBtdWx0aSBxdWV1ZSBtb2RlIGVuYWJsZWQ6ICVkIHF1ZXVlc1xuJiMzNDssCiYjNDM7CQkJICAgYWRhcHRlci0mZ3Q7bnVtX3J4X3F1ZXVlcyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlhZGFwdGVyLSZndDttdWx0aV9xdWV1ZSA9IDA7CiYjNDM7CQlhZGFwdGVyLSZndDtudW1fcnhfcXVldWVzID0gMTsKJiM0MzsJfQomIzQzOwogCWlmIChyZXQgPT0gSF9TVUNDRVNTICZhbXA7JmFtcDsKIAkgICAgKHJldF9hdHRyICZhbXA7IElCTVZFVEhfSUxMQU5fUlhfTVVMVElfQlVGRl9TVVBQT1JUKSkgewotCQlhZGFwdGVyLSZndDtyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTDsKJiM0MzsJCWlmIChhZGFwdGVyLSZndDttdWx0aV9xdWV1ZSkKJiM0MzsJCQlhZGFwdGVyLSZndDtyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1FVRVVFOwomIzQzOwkJZWxzZQomIzQzOwkJCWFkYXB0ZXItJmd0O3J4X2J1ZmZlcnNfcGVyX2hjYWxsID0gSUJNVkVUSF9NQVhfUlhfUkVHVUxBUjsKJiM0MzsKIAkJbmV0ZGV2X2RiZyhuZXRkZXYsCiAJCQkgICAmIzM0O1JYIE11bHRpLWJ1ZmZlciBoY2FsbCBzdXBwb3J0ZWQgYnkgRlcsIGJhdGNoIHNldCB0byAldVxuJiMzNDssCi0JCQkgICAgYWRhcHRlci0mZ3Q7cnhfYnVmZmVyc19wZXJfaGNhbGwpOwomIzQzOwkJCSAgIGFkYXB0ZXItJmd0O3J4X2J1ZmZlcnNfcGVyX2hjYWxsKTsKIAl9IGVsc2UgewogCQlhZGFwdGVyLSZndDtyeF9idWZmZXJzX3Blcl9oY2FsbCA9IDE7CiAJCW5ldGRldl9kYmcobmV0ZGV2LApAQCAtMTg5OCwxMCAmIzQzOzM1NDcsMTAgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKIAkJbWVtY3B5KHBvb2xfY291bnQsIHBvb2xfY291bnRfY21vLCBzaXplb2YocG9vbF9jb3VudCkpOwogCiAJZm9yIChpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KSB7Ci0JCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0ua29iajsKJiM0MzsJCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0ua29iajsKIAkJaW50IGVycm9yOwogCi0JCWlibXZldGhfaW5pdF9idWZmZXJfcG9vbCgmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXSwgaSwKJiM0MzsJCWlibXZldGhfaW5pdF9idWZmZXJfcG9vbCgmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXSwgaSwKIAkJCQkJIHBvb2xfY291bnRbaV0sIHBvb2xfc2l6ZVtpXSwKIAkJCQkJIHBvb2xfYWN0aXZlW2ldKTsKIAkJZXJyb3IgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChrb2JqLCAmYW1wO2t0eXBlX3ZldGhfcG9vbCwKQEAgLTE5MzcsNiAmIzQzOzM1ODYsMTQgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKIAogCW5ldGRldl9kYmcobmV0ZGV2LCAmIzM0O3JlZ2lzdGVyZWRcbiYjMzQ7KTsKIAomIzQzOwlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYW1wO2Rldi0mZ3Q7ZGV2LmtvYmosICZhbXA7aWJtdmV0aF9hdHRyX2dyb3VwKTsKJiM0MzsJaWYgKHJjKSB7CiYjNDM7CQluZXRkZXZfZXJyKG5ldGRldiwgJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXMgcmM9JWRcbiYjMzQ7LCByYyk7CiYjNDM7CQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwomIzQzOwkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKJiM0MzsJCXJldHVybiByYzsKJiM0MzsJfQomIzQzOwogCXJldHVybiAwOwogfQogCkBAIC0xOTQ4LDggJiM0MzszNjA1LDEwIEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpCiAKIAljYW5jZWxfd29ya19zeW5jKCZhbXA7YWRhcHRlci0mZ3Q7d29yayk7CiAKJiM0MzsJc3lzZnNfcmVtb3ZlX2dyb3VwKCZhbXA7ZGV2LSZndDtkZXYua29iaiwgJmFtcDtpYm12ZXRoX2F0dHJfZ3JvdXApOwomIzQzOwogCWZvciAoaSA9IDA7IGkgJmx0OyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpJiM0MzsmIzQzOykKLQkJa29iamVjdF9wdXQoJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0ua29iaik7CiYjNDM7CQlrb2JqZWN0X3B1dCgmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVtpXS5rb2JqKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKQEAgLTIwMzUsMTEgJiM0MzszNjk0LDExIEBAIHN0YXRpYyBzc2l6ZV90IHZldGhfcG9vbF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGJ1ZmZlciBwb29sIHdpdGggYnVmZmVycyB0aGF0CiAJCQkgICBjYW4gaG9sZCBhIHBhY2tldCBvZiB0aGUgc2l6ZSBvZiB0aGUgTVRVICovCiAJCQlmb3IgKGkgPSAwOyBpICZsdDsgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSYjNDM7JiM0MzspIHsKLQkJCQlpZiAocG9vbCA9PSAmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXSkKJiM0MzsJCQkJaWYgKHBvb2wgPT0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0pCiAJCQkJCWNvbnRpbnVlOwotCQkJCWlmICghYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sW2ldLmFjdGl2ZSkKJiM0MzsJCQkJaWYgKCFhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlKQogCQkJCQljb250aW51ZTsKLQkJCQlpZiAobXR1ICZsdDs9IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFtpXS5idWZmX3NpemUpCiYjNDM7CQkJCWlmIChtdHUgJmx0Oz0gYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdW2ldLmJ1ZmZfc2l6ZSkKIAkJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwOTMsNyAmIzQzOzM3NTIsNyBAQCBzdGF0aWMgc3NpemVfdCB2ZXRoX3Bvb2xfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJcnRubF91bmxvY2soKTsKIAogCS8qIGtpY2sgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIGFsbG9jYXRlL2RlYWxsb2NhdGUgcG9vbHMgKi8KLQlpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtJmd0O2lycSwgbmV0ZGV2KTsKJiM0MzsJaWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LSZndDtpcnEsICZhbXA7YWRhcHRlci0mZ3Q7bmFwaVswXSk7CiAJcmV0dXJuIGNvdW50OwogCiB1bmxvY2tfZXJyOgpAQCAtMjEzMyw3ICYjNDM7Mzc5Miw5IEBAIHN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX3ZldGhfcG9vbCA9IHsKIHN0YXRpYyBpbnQgaWJtdmV0aF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtJmd0O2lycSwgbmV0ZGV2KTsKJiM0MzsJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiYjNDM7CiYjNDM7CWlibXZldGhfaW50ZXJydXB0KG5ldGRldi0mZ3Q7aXJxLCAmYW1wO2FkYXB0ZXItJmd0O25hcGlbMF0pOwogCXJldHVybiAwOwogfQogCkBAIC0yMjEzLDI2ICYjNDM7Mzg3NCwzMiBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sX3Rlc3Qoc3RydWN0IGt1bml0ICp0ZXN0KQogCiAJLyogU2V0IHNhbmUgdmFsdWVzIGZvciBidWZmZXIgcG9vbHMgKi8KIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KQotCQlpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0sIGksCiYjNDM7CQlpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0sIGksCiAJCQkJCSBwb29sX2NvdW50W2ldLCBwb29sX3NpemVbaV0sCiAJCQkJCSBwb29sX2FjdGl2ZVtpXSk7CiAKLQlwb29sID0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF07CiYjNDM7CXBvb2wgPSAmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVswXTsKIAlwb29sLSZndDtza2J1ZmYgPSBrdW5pdF9rY2FsbG9jKHRlc3QsIHBvb2wtJmd0O3NpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKIAlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHBvb2wtJmd0O3NrYnVmZik7CiAKIAljb3JyZWxhdG9yID0gKCh1NjQpSUJNVkVUSF9OVU1fQlVGRl9QT09MUyAmbHQ7Jmx0OyAzMikgfCAwOwotCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIGZhbHNlKSk7Ci0JS1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpOwomIzQzOwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwKJiM0MzsJCQlpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7CiYjNDM7CUtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLAomIzQzOwkJCWlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpOwogCi0JY29ycmVsYXRvciA9ICgodTY0KTAgJmx0OyZsdDsgMzIpIHwgYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdLnNpemU7Ci0JS1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgZmFsc2UpKTsKLQlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCB0cnVlKSk7CiYjNDM7CWNvcnJlbGF0b3IgPSAoKHU2NCkwICZsdDsmbHQ7IDMyKSB8IGFkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVswXS5zaXplOwomIzQzOwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwKJiM0MzsJCQlpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7CiYjNDM7CUtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLAomIzQzOwkJCWlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpOwogCiAJY29ycmVsYXRvciA9ICh1NjQpMCB8IDA7CiAJcG9vbC0mZ3Q7c2tidWZmWzBdID0gTlVMTDsKLQlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpOwotCUtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUZBVUxULCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIHRydWUpKTsKJiM0MzsJS1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsCiYjNDM7CQkJaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCBmYWxzZSkpOwomIzQzOwlLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCwKJiM0MzsJCQlpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIHRydWUpKTsKIAogCWZsdXNoX3dvcmsoJmFtcDthZGFwdGVyLSZndDt3b3JrKTsKIH0KQEAgLTIyNTgsMzEgJiM0MzszOTI1LDMzIEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcnhxX2dldF9idWZmZXJfdGVzdChzdHJ1Y3Qga3VuaXQgKnRlc3QpCiAKIAlJTklUX1dPUksoJmFtcDthZGFwdGVyLSZndDt3b3JrLCBpYm12ZXRoX3Jlc2V0X2t1bml0KTsKIAotCWFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2xlbiA9IDE7Ci0JYWRhcHRlci0mZ3Q7cnhfcXVldWUuaW5kZXggPSAwOwotCWFkYXB0ZXItJmd0O3J4X3F1ZXVlLnF1ZXVlX2FkZHIgPSBrdW5pdF9remFsbG9jKHRlc3QsIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSwKLQkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JS1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9hZGRyKTsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfcXVldWVbMF0ucXVldWVfbGVuID0gMTsKJiM0MzsJYWRhcHRlci0mZ3Q7cnhfcXVldWVbMF0uaW5kZXggPSAwOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyID0KJiM0MzsJCWt1bml0X2t6YWxsb2ModGVzdCwgc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpLAomIzQzOwkJCSAgICAgIEdGUF9LRVJORUwpOwomIzQzOwlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIGFkYXB0ZXItJmd0O3J4X3F1ZXVlWzBdLnF1ZXVlX2FkZHIpOwogCiAJLyogU2V0IHNhbmUgdmFsdWVzIGZvciBidWZmZXIgcG9vbHMgKi8KIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkmIzQzOyYjNDM7KQotCQlpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbaV0sIGksCiYjNDM7CQlpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF1baV0sIGksCiAJCQkJCSBwb29sX2NvdW50W2ldLCBwb29sX3NpemVbaV0sCiAJCQkJCSBwb29sX2FjdGl2ZVtpXSk7CiAKLQlwb29sID0gJmFtcDthZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF07CiYjNDM7CXBvb2wgPSAmYW1wO2FkYXB0ZXItJmd0O3J4X2J1ZmZfcG9vbFswXVswXTsKIAlwb29sLSZndDtza2J1ZmYgPSBrdW5pdF9rY2FsbG9jKHRlc3QsIHBvb2wtJmd0O3NpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKIAlLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHBvb2wtJmd0O3NrYnVmZik7CiAKLQlhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgJmx0OyZsdDsgMzIgfCAwOwotCUtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7CiYjNDM7CWFkYXB0ZXItJmd0O3J4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpSUJNVkVUSF9OVU1fQlVGRl9QT09MUyAmbHQ7Jmx0OyAzMiB8IDA7CiYjNDM7CUtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyLCAwKSk7CiAKLQlhZGFwdGVyLSZndDtyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KTAgJmx0OyZsdDsgMzIgfCBhZGFwdGVyLSZndDtyeF9idWZmX3Bvb2xbMF0uc2l6ZTsKLQlLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlcikpOwomIzQzOwlhZGFwdGVyLSZndDtyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPQomIzQzOwkJKHU2NCkwICZsdDsmbHQ7IDMyIHwgYWRhcHRlci0mZ3Q7cnhfYnVmZl9wb29sWzBdWzBdLnNpemU7CiYjNDM7CUtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyLCAwKSk7CiAKIAlwb29sLSZndDtza2J1ZmZbMF0gPSBza2I7Ci0JYWRhcHRlci0mZ3Q7cnhfcXVldWUucXVldWVfYWRkclswXS5jb3JyZWxhdG9yID0gKHU2NCkwICZsdDsmbHQ7IDMyIHwgMDsKLQlLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIHNrYiwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7CiYjNDM7CWFkYXB0ZXItJmd0O3J4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpMCAmbHQ7Jmx0OyAzMiB8IDA7CiYjNDM7CUtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgc2tiLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIDApKTsKIAogCWZsdXNoX3dvcmsoJmFtcDthZGFwdGVyLSZndDt3b3JrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5oCmluZGV4IGQ4NzcxMzY2OGVkMzAwLi4zOTBjNjYwYWY5NzllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5oCkBAIC0xNCw2ICYjNDM7MTQsOCBAQAogI2lmbmRlZiBfSUJNVkVUSF9ICiAjZGVmaW5lIF9JQk1WRVRIX0gKIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zcGlubG9ja190eXBlcy5oJmd0OwomIzQzOwogLyogY29uc3RhbnRzIGZvciBIX01VTFRJQ0FTVF9DVFJMICovCiAjZGVmaW5lIElibVZldGhNY2FzdFJlY2VwdGlvbk1vZGlmeUJpdCAgICAgMHg4MDAwMFVMCiAjZGVmaW5lIElibVZldGhNY2FzdFJlY2VwdGlvbkVuYWJsZUJpdCAgICAgMHgyMDAwMFVMCkBAIC0yOCw2ICYjNDM7MzAsNyBAQAogI2RlZmluZSBJYm1WZXRoTWNhc3RSZW1vdmVGaWx0ZXIgICAgIDB4MlVMCiAjZGVmaW5lIElibVZldGhNY2FzdENsZWFyRmlsdGVyVGFibGUgMHgzVUwKIAomIzQzOyNkZWZpbmUgSUJNVkVUSF9JTExBTl9SWF9NVUxUSV9RVUVVRV9TVVBQT1JUCTB4MDAwMDAwMDAwMDA4MDAwMFVMCiAjZGVmaW5lIElCTVZFVEhfSUxMQU5fUlhfTVVMVElfQlVGRl9TVVBQT1JUCTB4MDAwMDAwMDAwMDA0MDAwMFVMCiAjZGVmaW5lIElCTVZFVEhfSUxMQU5fTFJHX1NSX0VOQUJMRUQJMHgwMDAwMDAwMDAwMDEwMDAwVUwKICNkZWZpbmUgSUJNVkVUSF9JTExBTl9MUkdfU05EX1NVUFBPUlQJMHgwMDAwMDAwMDAwMDA4MDAwVUwKQEAgLTY2LDYgJiM0Mzs2OSwxNjQgQEAgc3RhdGljIGlubGluZSBsb25nIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsCiAJCQkgICAgZGVzYzUsIGRlc2M2LCBkZXNjNywgZGVzYzgpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogaF9yZWdfbG9naWNhbF9sYW5fcXVldWUgLSBSZWdpc3RlciBhIHN1Ym9yZGluYXRlIHJlY2VpdmUgcXVldWUKJiM0MzsgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzCiYjNDM7ICogQGJ1ZmZlcl9saXN0OiBETUEgYWRkcmVzcyBvZiA0S0IgcGFnZSBmb3IgdHJhY2tpbmcgcmVnaXN0ZXJlZCBidWZmZXJzCiYjNDM7ICogQHJlY19xdWV1ZTogQnVmZmVyIGRlc2NyaXB0b3Igb2YgcmVjZWl2ZSBxdWV1ZQomIzQzOyAqCiYjNDM7ICogUmVnaXN0ZXJzIGEgc3Vib3JkaW5hdGUgcmVjZWl2ZSBxdWV1ZSB3aXRoIHRoZSBoeXBlcnZpc29yLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgSF9TVUNDRVNTICgwKSBvbiBzdWNjZXNzCiYjNDM7ICogICBIX1BBUkFNRVRFUiBpZiBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiYjNDM7ICoKJiM0MzsgKiBPbiBzdWNjZXNzLCBoeXBlcnZpc29yIHJldHVybnM6CiYjNDM7ICogICBSMzogSF9TVUNDRVNTCiYjNDM7ICogICBSNDogUXVldWUgaGFuZGxlCiYjNDM7ICogICBSNTogSVJRIG51bWJlciBmb3IgdGhpcyBxdWV1ZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcywKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX2xpc3QsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nIHJlY19xdWV1ZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnF1ZXVlX2hhbmRsZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmlycSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKJiM0MzsJbG9uZyByYzsKJiM0MzsKJiM0MzsJcmMgPSBwbHBhcl9oY2FsbDkoSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUsCiYjNDM7CQkJICByZXRidWYsIHVuaXRfYWRkcmVzcywKJiM0MzsJCQkgIGJ1ZmZlcl9saXN0LCByZWNfcXVldWUpOwomIzQzOwomIzQzOwlpZiAocmMgPT0gSF9TVUNDRVNTKSB7CiYjNDM7CQlpZiAocXVldWVfaGFuZGxlKQomIzQzOwkJCSpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07CiYjNDM7CQlpZiAoaXJxKQomIzQzOwkJCSppcnEgPSByZXRidWZbMV07CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzX3F1ZXVlIC0gQWRkIGJ1ZmZlcnMgdG8gc3Vib3JkaW5hdGUgcXVldWUKJiM0MzsgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzCiYjNDM7ICogQHF1ZXVlX2hhbmRsZTogUXVldWUgaGFuZGxlIGZyb20gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoKQomIzQzOyAqIEBidWZmZXJzem51bTogQnVmZmVyIHNpemUgKHVwcGVyIDMyIGJpdHMpIHwgY291bnQgKGxvd2VyIDMyIGJpdHMpCiYjNDM7ICogQGlvYmExMjogQnVmZmVyIGFkZHJlc3NlcyAxIGFuZCAyIHBhY2tlZCAoYWRkcjEgfCBhZGRyMiAmbHQ7Jmx0OyAzMikKJiM0MzsgKiBAaW9iYTM0OiBCdWZmZXIgYWRkcmVzc2VzIDMgYW5kIDQgcGFja2VkCiYjNDM7ICogQGlvYmE1NjogQnVmZmVyIGFkZHJlc3NlcyA1IGFuZCA2IHBhY2tlZAomIzQzOyAqIEBpb2JhNzg6IEJ1ZmZlciBhZGRyZXNzZXMgNyBhbmQgOCBwYWNrZWQKJiM0MzsgKiBAaW9iYTkxMDogQnVmZmVyIGFkZHJlc3NlcyA5IGFuZCAxMCBwYWNrZWQKJiM0MzsgKiBAaW9iYTExMTI6IEJ1ZmZlciBhZGRyZXNzZXMgMTEgYW5kIDEyIHBhY2tlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgSF9TVUNDRVNTIC0gQWxsIGJ1ZmZlcnMgYWRkZWQgc3VjY2Vzc2Z1bGx5CiYjNDM7ICogICBIX1BBUkFNRVRFUiAtIEludmFsaWQgcGFyYW1ldGVycwomIzQzOyAqICAgSF9IQVJEV0FSRSAtIEhhcmR3YXJlIGVycm9yCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkJICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUsCiYjNDM7CQkJCQkJICAgdW5zaWduZWQgbG9uZyBidWZmZXJzem51bSwKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGlvYmExMiwKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGlvYmEzNCwKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGlvYmE1NiwKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGlvYmE3OCwKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGlvYmE5MTAsCiYjNDM7CQkJCQkJICAgdW5zaWduZWQgbG9uZyBpb2JhMTExMikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKJiM0MzsKJiM0MzsJcmV0dXJuIHBscGFyX2hjYWxsOShIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFLAomIzQzOwkJCSAgICByZXRidWYsIHVuaXRfYWRkcmVzcywKJiM0MzsJCQkgICAgcXVldWVfaGFuZGxlLCBidWZmZXJzem51bSwKJiM0MzsJCQkgICAgaW9iYTEyLCBpb2JhMzQsIGlvYmE1NiwKJiM0MzsJCQkgICAgaW9iYTc4LCBpb2JhOTEwLCBpb2JhMTExMik7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGhfZnJlZV9sb2dpY2FsX2xhbl9idWZmZXJfcXVldWUgLSBGcmVlIGJ1ZmZlciBmcm9tIHN1Ym9yZGluYXRlIHF1ZXVlCiYjNDM7ICogQHVuaXRfYWRkcmVzczogRGV2aWNlIHVuaXQgYWRkcmVzcwomIzQzOyAqIEBidWZfc2l6ZTogU2l6ZSBvZiBidWZmZXIgdG8gcmVtb3ZlIGZyb20gcG9vbAomIzQzOyAqIEBxdWV1ZV9oYW5kbGU6IFF1ZXVlIGhhbmRsZSBmcm9tIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKCkKJiM0MzsgKgomIzQzOyAqIFJlbW92ZXMgYSBidWZmZXIgb2Ygc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgc3Vib3JkaW5hdGUgcXVldWUmIzM5O3MgYnVmZmVyIHBvb2wuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46CiYjNDM7ICogICBIX1NVQ0NFU1MgLSBCdWZmZXIgcmVtb3ZlZCBzdWNjZXNzZnVsbHkKJiM0MzsgKiAgIEhfUEFSQU1FVEVSIC0gSW52YWxpZCBwYXJhbWV0ZXJzCiYjNDM7ICogICBIX0hBUkRXQVJFIC0gSGFyZHdhcmUgZXJyb3IKJiM0MzsgKiAgIEhfTk9UX0ZPVU5EIC0gQnVmZmVyIHBvb2wgZG9lcyBub3QgZXhpc3QKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgaF9mcmVlX2xvZ2ljYWxfbGFuX2J1ZmZlcl9xdWV1ZSh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcywKJiM0MzsJCQkJCQkgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplLAomIzQzOwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcXVldWVfaGFuZGxlKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdOwomIzQzOwomIzQzOwlyZXR1cm4gcGxwYXJfaGNhbGw5KEhfRlJFRV9MT0dJQ0FMX0xBTl9CVUZGRVJfUVVFVUUsCiYjNDM7CQkJICAgIHJldGJ1ZiwgdW5pdF9hZGRyZXNzLCBidWZfc2l6ZSwgcXVldWVfaGFuZGxlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIC0gRGVyZWdpc3RlciBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlCiYjNDM7ICogQHVuaXRfYWRkcmVzczogRGV2aWNlIHVuaXQgYWRkcmVzcwomIzQzOyAqIEBxdWV1ZV9oYW5kbGU6IFF1ZXVlIGhhbmRsZSBmcm9tIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKCkKJiM0MzsgKgomIzQzOyAqIERlcmVnaXN0ZXJzIGFuZCBmcmVlcyBhbGwgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1Ym9yZGluYXRlIHF1ZXVlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgSF9TVUNDRVNTIC0gUXVldWUgZnJlZWQgc3VjY2Vzc2Z1bGx5CiYjNDM7ICogICBIX1BBUkFNRVRFUiAtIEludmFsaWQgcGFyYW1ldGVycwomIzQzOyAqICAgSF9IQVJEV0FSRSAtIEhhcmR3YXJlIGVycm9yCiYjNDM7ICogICBIX1NUQVRFIC0gVklPQSBub3QgaW4gdmFsaWQgc3RhdGUKJiM0MzsgKiAgIEhfQlVTWSAvIEhfTE9OR19CVVNZXyogLSBSZXNvdXJjZSBidXN5LCByZXRyeQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsCiYjNDM7CQkJCQkgICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiYjNDM7CiYjNDM7CXJldHVybiBwbHBhcl9oY2FsbDkoSF9GUkVFX0xPR0lDQUxfTEFOX1FVRVVFLAomIzQzOwkJCSAgICByZXRidWYsIHVuaXRfYWRkcmVzcywgcXVldWVfaGFuZGxlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl93aXRoX2hhbmRsZSAtIFJlZ2lzdGVyIHByaW1hcnkgcXVldWUgYW5kIGdldCBoYW5kbGUKJiM0MzsgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzCiYjNDM7ICogQGJ1ZmZlcl9saXN0OiBETUEgYWRkcmVzcyBvZiBidWZmZXIgbGlzdAomIzQzOyAqIEByZWNfcXVldWU6IEJ1ZmZlciBkZXNjcmlwdG9yIG9mIHJlY2VpdmUgcXVldWUKJiM0MzsgKiBAZmlsdGVyX2xpc3Q6IERNQSBhZGRyZXNzIG9mIGZpbHRlciBsaXN0CiYjNDM7ICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzcwomIzQzOyAqIEBxdWV1ZV9oYW5kbGU6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIHF1ZXVlIGhhbmRsZQomIzQzOyAqCiYjNDM7ICogUmVnaXN0ZXJzIHRoZSBwcmltYXJ5IHJlY2VpdmUgcXVldWUgKHF1ZXVlIDApIHdpdGggdGhlIGh5cGVydmlzb3IgYW5kCiYjNDM7ICogcmV0dXJucyB0aGUgcXVldWUgaGFuZGxlLiBUaGlzIGlzIG5lZWRlZCBpbiBtdWx0aS1xdWV1ZSBtb2RlIHRvIHVzZQomIzQzOyAqIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUoKSBmb3IgYWxsIHF1ZXVlcyBpbmNsdWRpbmcgcXVldWUgMC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogSF9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3dpdGhfaGFuZGxlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLAomIzQzOwkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX2xpc3QsCiYjNDM7CQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWNfcXVldWUsCiYjNDM7CQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBmaWx0ZXJfbGlzdCwKJiM0MzsJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG1hY19hZGRyZXNzLAomIzQzOwkJCQkJCSAgICAgIHU2NCAqcXVldWVfaGFuZGxlKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdOwomIzQzOwlsb25nIHJjOwomIzQzOwomIzQzOwlyYyA9IHBscGFyX2hjYWxsOShIX1JFR0lTVEVSX0xPR0lDQUxfTEFOLCByZXRidWYsCiYjNDM7CQkJICB1bml0X2FkZHJlc3MsIGJ1ZmZlcl9saXN0LCByZWNfcXVldWUsCiYjNDM7CQkJICBmaWx0ZXJfbGlzdCwgbWFjX2FkZHJlc3MpOwomIzQzOwomIzQzOwlpZiAocmMgPT0gSF9TVUNDRVNTICZhbXA7JmFtcDsgcXVldWVfaGFuZGxlKQomIzQzOwkJKnF1ZXVlX2hhbmRsZSA9IHJldGJ1ZlswXTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKIC8qIEZXIGFsbG93cyB1cyB0byBzZW5kIDYgZGVzY3JpcHRvcnMgYnV0IHdlIG9ubHkgdXNlIG9uZSBzbyBtYXJrCiAgKiB0aGUgb3RoZXIgNSBhcyB1bnVzZWQgKDApCiAgKi8KQEAgLTEyMSwxNSAmIzQzOzI4Miw1NSBAQCBzdGF0aWMgaW5saW5lIGxvbmcgaF9pbGxhbl9hdHRyaWJ1dGVzKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLAogI2RlZmluZSBJQk1WRVRIX01BWF9UWF9CVUZfU0laRSAoMTAyNCAqIDY0KQogI2RlZmluZSBJQk1WRVRIX01BWF9RVUVVRVMgMTZVCiAjZGVmaW5lIElCTVZFVEhfREVGQVVMVF9RVUVVRVMgOFUKLSNkZWZpbmUgSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMIDhVCiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMgMTZVCiYjNDM7I2RlZmluZSBJQk1WRVRIX0RFRkFVTFRfUlhfUVVFVUVTIDFVCiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9SRUdVTEFSIDhVCiYjNDM7I2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRSAxMlUKJiM0MzsjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAxMlUKIAogc3RhdGljIGludCBwb29sX3NpemVbXSA9IHsgNTEyLCAxMDI0ICogMiwgMTAyNCAqIDE2LCAxMDI0ICogMzIsIDEwMjQgKiA2NCB9Owogc3RhdGljIGludCBwb29sX2NvdW50W10gPSB7IDI1NiwgNTEyLCAyNTYsIDI1NiwgMjU2IH07CiBzdGF0aWMgaW50IHBvb2xfY291bnRfY21vW10gPSB7IDI1NiwgNTEyLCAyNTYsIDI1NiwgNjQgfTsKLXN0YXRpYyBpbnQgcG9vbF9hY3RpdmVbXSA9IHsgMSwgMSwgMCwgMCwgMX07CiYjNDM7c3RhdGljIGludCBwb29sX2FjdGl2ZVtdID0geyAxLCAxLCAwLCAwLCAwfTsKIAogI2RlZmluZSBJQk1fVkVUSF9JTlZBTElEX01BUCAoKHUxNikweGZmZmYpCiAKJiM0MztzdHJ1Y3QgaWJtdmV0aF9oY2FsbF9zdGF0cyB7CiYjNDM7CXU2NCByZWdfbGFuX3F1ZXVlOwkvKiBIX1JFR19MT0dJQ0FMX0xBTl9RVUVVRSAqLwomIzQzOwl1NjQgcmVnX2xhbjsJCS8qIEhfUkVHSVNURVJfTE9HSUNBTF9MQU4gKi8KJiM0MzsJdTY0IGFkZF9idWZzX3F1ZXVlOwkvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFICovCiYjNDM7CXU2NCBhZGRfYnVmczsJCS8qIEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlMgKi8KJiM0MzsJdTY0IGFkZF9idWY7CQkvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVIgKi8KJiM0MzsJdTY0IGZyZWVfbGFuX3F1ZXVlOwkvKiBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgKi8KJiM0MzsJdTY0IGZyZWVfbGFuOwkJLyogSF9GUkVFX0xPR0lDQUxfTEFOICovCiYjNDM7CXU2NCBzZW5kX2xhbjsJCS8qIEhfU0VORF9MT0dJQ0FMX0xBTiAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGlibXZldGhfcnhfcXVldWVfc3RhdHMgewomIzQzOwl1NjQgcGFja2V0czsKJiM0MzsJdTY0IGJ5dGVzOwomIzQzOwl1NjQgaW50ZXJydXB0czsKJiM0MzsJdTY0IHBvbGxzOwomIzQzOwl1NjQgbGFyZ2VfcGFja2V0czsKJiM0MzsJdTY0IGludmFsaWRfYnVmZmVyczsKJiM0MzsJdTY0IG5vX2J1ZmZlcl9kcm9wczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzIHsKJiM0MzsJdTY0IHBhY2tldHM7CiYjNDM7CXU2NCBieXRlczsKJiM0MzsJdTY0IGxhcmdlX3BhY2tldHM7CiYjNDM7CXU2NCBkcm9wcGVkX3BhY2tldHM7CiYjNDM7CXU2NCBzZW5kX2ZhaWx1cmVzOwomIzQzOwl1NjQgY2hlY2tzdW1fb2ZmbG9hZDsKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgSUJNVkVUSF9OVU1fUlhfUVNUQVRTIFwKJiM0MzsJKHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSkKJiM0MzsKJiM0MzsjZGVmaW5lIElCTVZFVEhfTlVNX1RYX1FTVEFUUyBcCiYjNDM7CShzaXplb2Yoc3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMpIC8gc2l6ZW9mKHU2NCkpCiYjNDM7CiBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgewogICAgIHUzMiBzaXplOwogICAgIHUzMiBpbmRleDsKQEAgLTE1MiwyMyAmIzQzOzM1MywyOCBAQCBzdHJ1Y3QgaWJtdmV0aF9yeF9xIHsKICAgICBkbWFfYWRkcl90IHF1ZXVlX2RtYTsKICAgICB1MzIgICAgICAgIHF1ZXVlX2xlbjsKICAgICBzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5ICpxdWV1ZV9hZGRyOwomIzQzOwlzcGlubG9ja190CXJlcGxlbmlzaF9sb2NrOwkvKiBzZXJpYWxpemVzIHBlci1xdWV1ZSBidWZmZXIgcmVwbGVuaXNoICovCiB9OwogCiBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyIHsKIAlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwomIzQzOwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaVtJQk1WRVRIX01BWF9SWF9RVUVVRVNdOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXVuc2lnbmVkIGludCBtY2FzdEZpbHRlclNpemU7Ci0Jdm9pZCAqYnVmZmVyX2xpc3RfYWRkcjsKJiM0MzsJdm9pZCAqYnVmZmVyX2xpc3RfYWRkcltJQk1WRVRIX01BWF9SWF9RVUVVRVNdOwogCXZvaWQgKmZpbHRlcl9saXN0X2FkZHI7CiAJdm9pZCAqdHhfbHRiX3B0cltJQk1WRVRIX01BWF9RVUVVRVNdOwogCXVuc2lnbmVkIGludCB0eF9sdGJfc2l6ZTsKIAlkbWFfYWRkcl90IHR4X2x0Yl9kbWFbSUJNVkVUSF9NQVhfUVVFVUVTXTsKLQlkbWFfYWRkcl90IGJ1ZmZlcl9saXN0X2RtYTsKJiM0MzsJZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTsKIAlkbWFfYWRkcl90IGZpbHRlcl9saXN0X2RtYTsKLQlzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgcnhfYnVmZl9wb29sW0lCTVZFVEhfTlVNX0JVRkZfUE9PTFNdOwotCXN0cnVjdCBpYm12ZXRoX3J4X3EgcnhfcXVldWU7CiYjNDM7CXN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCByeF9idWZmX3Bvb2xbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXVtJQk1WRVRIX05VTV9CVUZGX1BPT0xTXTsKJiM0MzsJc3RydWN0IGlibXZldGhfcnhfcSByeF9xdWV1ZVtJQk1WRVRIX01BWF9SWF9RVUVVRVNdOwomIzQzOwl1NjQgcXVldWVfaGFuZGxlW0lCTVZFVEhfTUFYX1JYX1FVRVVFU107CiYjNDM7CXVuc2lnbmVkIGludCBxdWV1ZV9pcnFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTsKJiM0MzsJaW50IG11bHRpX3F1ZXVlOwomIzQzOwl1bnNpZ25lZCBpbnQgbnVtX3J4X3F1ZXVlczsKIAlpbnQgcnhfY3N1bTsKIAlpbnQgbGFyZ2Vfc2VuZDsKIAlib29sIGlzX2FjdGl2ZV90cnVuazsKQEAgLTE4OCw2ICYjNDM7Mzk0LDEyIEBAIHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgewogCXU2NCB0eF9zZW5kX2ZhaWxlZDsKIAl1NjQgdHhfbGFyZ2VfcGFja2V0czsKIAl1NjQgcnhfbGFyZ2VfcGFja2V0czsKJiM0MzsKJiM0MzsJLyogTXVsdGktcXVldWUgc3RhdGlzdGljcyAqLwomIzQzOwlzdHJ1Y3QgaWJtdmV0aF9oY2FsbF9zdGF0cyBoY2FsbF9zdGF0czsKJiM0MzsJc3RydWN0IGlibXZldGhfcnhfcXVldWVfc3RhdHMgKnJ4X3FzdGF0czsKJiM0MzsJc3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMgKnR4X3FzdGF0czsKJiM0MzsKIAkvKiBFdGh0b29sIHNldHRpbmdzICovCiAJdTggZHVwbGV4OwogCXUzMiBzcGVlZDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMzAgMjM6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDU3NzUKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAzNjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBpYm12ZXRoIE11bHRpLVF1ZXVlIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciB0aGUgYGlibXZldGhgIGRyaXZlci4gSXQmIzM5O3MgbWFraW5nIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGNoYW5nZXMsIGFkZGluZyBtdWx0aS1xdWV1ZSBzdXBwb3J0LiBUaGUgbW9kaWZpY2F0aW9ucyBhcmUgaW4gYGlibXZldGguY2AgYW5kIGBpYm12ZXRoLmhgLCB3aGljaCBpcyB3aGF0IEkmIzM5O2QgZXhwZWN0LiBUaGV5JiMzOTt2ZSBpbnRyb2R1Y2VkIG5ldyBoeXBlcmNhbGxzOiBgSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUVgLCBgSF9BRERfTE9HSUNBTF9MQU5fQlVGRkVSU19RVUVVRWAsIGV0Yy4gQ2xhc3NpYyBtdWx0aS1xdWV1ZSBhcmNoaXRlY3R1cmUgY2hhbmdlcyDigJMgbmV3IGh5cGVyY2FsbHMsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFJYIHF1ZXVlIGxvZ2ljLCBhbmQgbXVsdGktcXVldWUgc3RhdGlzdGljcywgYWxsIHNvdW5kcyBhYm91dCByaWdodC4gVGhleSYjMzk7dmUgYWxzbyByZS13b3JrZWQgdGhlIGludGVycnVwdCBoYW5kbGluZywgdXNpbmcgYEhfVklPQ1RMYCBmb3IgdGhlIHN1Ym9yZGluYXRlIHF1ZXVlcy4KClRoZSBiaWcgcXVlc3Rpb24gbm93IGlzLCBjYW4gSSBldmVuIGdldCB0byB0aGlzIGNvZGUgaW4gYSB0ZXN0aW5nIGVudmlyb25tZW50PyBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiBpdCYjMzk7cyByZWFjaGFibGUuIGBpYm12ZXRoYCBpcyBzcGVjaWZpY2FsbHkgZm9yIElCTSBQb3dlclZNLCB0aGUgcFNlcmllcyB2aXJ0dWFsIEV0aGVybmV0LiBRRU1VIHVzZXMgYHNwYXByLXZsYW5gLCB3aGljaCBpcyBjb25jZXB0dWFsbHkgdGhlIHNhbWUgZGV2aWNlLCBidXQgaXQgbWFrZXMgbWUgd29uZGVyIGlmIFFFTVUgZnVsbHkgc3VwcG9ydHMgdGhlc2UgaHlwZXJjYWxscyB5ZXQuIElmIGl0IGRvZXMgbm90LCB0aGVuIGhvdyBjYW4gSSB0ZXN0IGl0PyBJJiMzOTttIHN1cmUgaXQmIzM5O3MgcmVhY2hhYmxlIHRob3VnaCBiZWNhdXNlIEkgY2FuIHJ1biBhIFBvd2VyUEMgKHBwYzY0bGUpIFZNIHdpdGggYHNwYXByLXZsYW5gLiBJIG5lZWQgdG8gdmVyaWZ5IFFFTVUmIzM5O3Mgc3VwcG9ydC4KCkkgY2FuIGNoZWNrIGlmIEkgY2FuIGZ1enogaXQuIFN5emthbGxlciBzdXBwb3J0cyBgcHBjNjRsZWAgYW5kIFFFTVUgYHBzZXJpZXNgIGFzIGEgbWFjaGluZSB0eXBlLiBUaGF0JiMzOTtzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gSSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBkcml2ZXIgaXMgYWN0dWFsbHkgYGlibXZldGhgIGluIHRoZSBjb25maWd1cmF0aW9uLiBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIGZvciBgQ09ORklHX0lCTVZFVEhgLiBJJiMzOTtsbCBzZWFyY2ggZm9yIGl0LCBhbmQgdGhlbiBJIHNob3VsZCBiZSBnb29kIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzMwIDIzOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBJQk1WRVRIJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9LY29uZmlnPTE4PWlmIE5FVF9WRU5ET1JfSUJNXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy0xOS1cbmRyaXZlcnMvbmV0L2V0aGVybmV0L2libS9LY29uZmlnOjIwOmNvbmZpZyBJQk1WRVRIXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy0yMS1cdHRyaXN0YXRlIFwmIzM0O0lCTSBMQU4gVmlydHVhbCBFdGhlcm5ldCBzdXBwb3J0XCYjMzQ7XG4tLVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWctMjktXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZzozMDpjb25maWcgSUJNVkVUSF9LVU5JVF9URVNUXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy0zMS1cdGJvb2wgXCYjMzQ7S1VuaXQgdGVzdCBmb3IgSUJNIExBTiBWaXJ0dWFsIEV0aGVybmV0IHN1cHBvcnRcJiMzNDsgaWYgIUtVTklUX0FMTF9URVNUU1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzMwIDIzOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ2NzI2CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogOTU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgaWJtdmV0aCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCByZWxhdGVkIHRvIGBDT05GSUdfSUJNVkVUSGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgYmVpbmcgdG91Y2hlZCBoZXJlLiBBaCwgaXQgYWxzbyBtb2RpZmllcyBgYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oYCwgd2hpY2ggaXMgd29ydGgga2VlcGluZyBhbiBleWUgb24g4oCTIHBvdGVudGlhbGx5IHJlbGF0ZWQgdG8gaHlwZXJ2aXNvciBpbnRlcmFjdGlvbnMuCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgZnVuY3Rpb24gYWRkaXRpb25zLiBUaGVyZSYjMzk7cyBhIGZsdXJyeSBvZiBuZXcgZnVuY3Rpb25zIGhlcmUg4oCTIGEgbWl4IG9mIGFsbG9jYXRpb24vZnJlZWluZyBmb3IgZmlsdGVycywgcXVldWUgc3RhdGlzdGljcywgYnVmZmVyIHBvb2xzLCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBxdWV1ZSBtYW5hZ2VtZW50OgpgaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdGAsIGBpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3RgLCBgaWJtdmV0aF9hbGxvY19yeF9xc3RhdHNgLCBgaWJtdmV0aF9mcmVlX3J4X3FzdGF0c2AsIGBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0c2AsIGBpYm12ZXRoX2ZyZWVfdHhfcXN0YXRzYCwgYGlibXZldGhfYWxsb2NfcnhfcXVldWVzYCwgYGlibXZldGhfY2xlYW51cF9yeF9yZXNvdXJjZXNgLCBgaWJtdmV0aF90b2dnbGVfaXJxYCwgYGlibXZldGhfZGlzYWJsZV9pcnFgLCBgaWJtdmV0aF9lbmFibGVfaXJxYCwgYGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3NgLCBgaWJtdmV0aF9zZXR1cF9yeF9pbnRlcnJ1cHRzYCwgYGlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzYCwgYGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdGAsIGBpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdGAsIGBpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzYCwgYGlibXZldGhfYWxsb2NfcXVldWVfYnVmZmVyX3Bvb2xzYCwgYGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHNgLCBgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbHNgLCBgaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sc2AsIGBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlYCwgYGlibXZldGhfZHJhaW5fcnhfcXVldWVgLCBgaWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXNgLCBgaWJtdmV0aF9mcmVlX3R4X3Jlc291cmNlc2AsIGBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlYCwgYGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlYCwgYGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVgLCBgaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsYCwgYGlibXZldGhfZnJlZV9hbGxfcXVldWVzYCwgYGlibXZldGhfcmVnaXN0ZXJfcnhfcXVldWVzYCwgYGlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0c2AsIGBpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHNgLCBgaWJtdmV0aF9nZXRfc3RhdHM2NGAuCgpBbmQsIGl0JiMzOTtzIG1vZGlmeWluZyBhIGJ1bmNoIG9mIGV4aXN0aW5nIGNvcmUgZnVuY3Rpb25zOiBgaWJtdmV0aF9vcGVuYCwgYGlibXZldGhfY2xvc2VgLCBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgLCBgaWJtdmV0aF9zdGFydF94bWl0YCwgYGlibXZldGhfcG9sbGAsIGBpYm12ZXRoX2ludGVycnVwdGAsIGBpYm12ZXRoX2NoYW5nZV9tdHVgLCBgaWJtdmV0aF9wcm9iZWAsIGBpYm12ZXRoX3JlbW92ZWAuIFNpbmNlIHRoaXMgaXMgYSBuZXR3b3JrIGRyaXZlciwgdGhlIGZ1bmN0aW9uYWwgY2hhbmdlcyBhcmUgY2xlYXIgYW5kIGVhc3kgdG8gdGVzdCDigJMgcGFja2V0IHNlbmRpbmcsIE1UVSBjaGFuZ2VzLCBjaGFubmVsIG1hbmlwdWxhdGlvbnMgdmlhIGBldGh0b29sYCwgYWxsIHRoYXQgamF6ei4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGEgZ29vZCBmdXp6aW5nIGNhbXBhaWduLgoKU28sIGxldCYjMzk7cyBpZGVudGlmeSBzb21lIGhpZ2gtdmFsdWUgdGFyZ2V0cyBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucywgSSYjMzk7ZCBzYXkgdGhlIHJlYWwgaW50ZXJlc3RpbmcgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGFyZSBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgLCBgaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsYCwgYGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWVgLCBgaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVgLCBgaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlYCwgYGlibXZldGhfZHJhaW5fcnhfcXVldWVgLCBgaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc2AsIGBpYm12ZXRoX3RvZ2dsZV9pcnFgLCBgaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXNgLCBgaWJtdmV0aF9vcGVuYCwgYW5kIGBpYm12ZXRoX2Nsb3NlYC4KCk5vdywgbGV0JiMzOTtzIHNlZSBpZiB3ZSBjYW4gdHJpZ2dlciBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgLiBHb29kLCBjaGVja2luZyB0aGUgYGV0aHRvb2xfb3BzYCBzdHJ1Y3R1cmUsIGFuZCB5ZXAsIGBpYm12ZXRoX3NldF9jaGFubmVsc2AgaXMgYXNzaWduZWQgdG8gYHNldF9jaGFubmVsc2AuIFRoaXMgaXMgcGVyZmVjdCDigJMgYSBkaXJlY3QgYW5kIHJlbGF0aXZlbHkgZWFzeSB0YXJnZXQgZm9yIGZ1enppbmcuIFdlIGNhbiB1c2UgZXRodG9vbCB0byBtYW5pcHVsYXRlIHRoaXMgYW5kIGxvb2sgZm9yIGFueSBpbnRlcmVzdGluZyBiZWhhdmlvciBvciBjcmFzaGVzLgoKQW5kIGp1c3QgdG8gY29uZmlybSwgaXQgYXBwZWFycyBgSUJNVkVUSGAgZGVwZW5kcyBvbiBgTkVUX1ZFTkRPUl9JQk1gIGFuZCBgUFBDX1BTRVJJRVNgLiBHb3QgaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMzAgMjM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE5FVF9WRU5ET1JfSUJNJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9LY29uZmlnLTUtXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZzo2OmNvbmZpZyBORVRfVkVORE9SX0lCTVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWctNy1cdGJvb2wgXCYjMzQ7SUJNIGRldmljZXNcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8zMCAyMzowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODc1NAoJCQkJCQkJb3V0cHV0OiAyNTUKCQkJCQkJCXRob3VnaHRzOiAxODU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgU3RyYXRlZ3kgZm9yIElCTVZFVEggRHJpdmVyKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gcmV2aWV3aW5nIHRoZSBgSUJNVkVUSGAgY29uZmlndXJhdGlvbi4gVGhhdCBsb29rcyBzdWZmaWNpZW50IHRvIGVuYWJsZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eSwgc28gd2UmIzM5O2xsIHN0YXJ0IHRoZXJlLiBOb3csIGxldCYjMzk7cyByZWZpbmUgdGhlIGxpc3Qgb2YgZm9jdXMgc3ltYm9scyBmb3IgZnV6emluZy4gSSYjMzk7dmUgY29tcGlsZWQgYSBsaXN0IG9mIHBvdGVudGlhbCBjYW5kaWRhdGVzLCBzdGFydGluZyB3aXRoOgoKKiAgIGBpYm12ZXRoX3NldF9jaGFubmVsc2AKKiAgIGBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWxgCiogICBgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZWAKKiAgIGBpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZWAKKiAgIGBpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlYAoqICAgYGlibXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlYAoqICAgYGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWVgCiogICBgaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZWAKKiAgIGBpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzYAoqICAgYGlibXZldGhfdG9nZ2xlX2lycWAKKiAgIGBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlc2AKCkxldCYjMzk7cyBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgYWxsIHN0YXRpYyBmdW5jdGlvbnMsIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhleSBhcmUgbm90IGRpcmVjdGx5IGV4cG9zZWQgYW5kIG5lZWQgdG8gYmUgcmVhY2hlZCBpbmRpcmVjdGx5LCBhIGdvb2QgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBJJiMzOTt2ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4gVGhleSBhbGwgc2VlbSB0byBiZS4gSSYjMzk7dmUgYWxzbyB2ZXJpZmllZCB0aGF0IHRoZXNlIGFyZSBpbmRlZWQgdGhlIGNvcnJlY3QgZnVuY3Rpb24gbmFtZXMuCgpJJiMzOTttIGFsc28gZ29pbmcgdG8gYWRkIGBpYm12ZXRoX29wZW5gIGFuZCBgaWJtdmV0aF9jbG9zZWAsIGV2ZW4gdGhvdWdoIHRoZXNlIGFyZSBzdGFuZGFyZCBuZXR3b3JrIGRldmljZSBvcGVyYXRpb25zLCB0aGV5IGFyZSBtb2RpZmllZCBoZXJlIGZvciBtdWx0aS1xdWV1ZSBzdXBwb3J0LiBUaGV5IGFyZSBrZXkgZW50cnkgcG9pbnRzIGFuZCBnb29kIGNhbmRpZGF0ZXMgZm9yIGZ1enppbmcgYXMgd2VsbC4KClNwZWNpZmljYWxseSwgYGlibXZldGhfc2V0X2NoYW5uZWxzYCBzdGFuZHMgb3V0IGJlY2F1c2UgaXQmIzM5O3MgdGhlIGVudHJ5IHBvaW50IGZvciBxdWV1ZSByZXNpemluZywgd2hpY2ggaXMgZnVuZGFtZW50YWwgdG8gdGhlIG5ldyBkeW5hbWljIHF1ZXVlIG1hbmFnZW1lbnQgZmVhdHVyZSwgc28gaXQgd2lsbCBnZXQgc3BlY2lhbCBmb2N1cy4KClRoZXJlZm9yZSwgZm9yIHRoaXMgZnV6emluZyBjYW1wYWlnbiwgSSYjMzk7bGwgc2V0IGBXb3J0aEZ1enppbmdgIHRvIGB0cnVlYCwgYEVuYWJsZUNvbmZpZ3NgIHRvIGBbJiMzNDtJQk1WRVRIJiMzNDtdYCwgYW5kIHRoZSBgRm9jdXNTeW1ib2xzYCB0byB0aGUgbGlzdCBhYm92ZS4KClRoZSByYXRpb25hbGUgaXMgY2xlYXIuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIGBpYm12ZXRoYCBkcml2ZXIgdG8gc3VwcG9ydCBtdWx0aS1xdWV1ZSwgaW5jbHVkaW5nIG5ldyBoeXBlcmNhbGxzIGFuZCBtb2RpZmljYXRpb25zIHRvIHF1ZXVlIG1hbmFnZW1lbnQsIGludGVycnVwdCBoYW5kbGluZywgYW5kIGV0aHRvb2wgb3BlcmF0aW9ucy4gQWxsIG9mIHRoZXNlIGZ1bmN0aW9uYWxpdGllcyBhcmUgcmVhY2hhYmxlIHRocm91Z2ggbmV0d29yayBvcGVyYXRpb25zIGFuZCBldGh0b29sIGNvbW1hbmRzLCBtYWtpbmcgdGhlbSBpZGVhbCBjYW5kaWRhdGVzIGZvciBmdXp6aW5nLCBhbmQgSSBpbnRlbmQgdG8gcHJvdmlkZSBhIGZ1enppbmcgY29uZmlndXJhdGlvbiB0byB0ZXN0IHRoZXNlIG5ldyBpbXBsZW1lbnRhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMzAgMjM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lCTVZFVEgmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpYm12ZXRoX3NldF9jaGFubmVscyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzJiMzNDssCiAgICAmIzM0O2libXZldGhfdG9nZ2xlX2lycSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX29wZW4mIzM0OywKICAgICYjMzQ7aWJtdmV0aF9jbG9zZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIG11bHRpLXF1ZXVlIHN1cHBvcnQgdG8gdGhlIGlibXZldGggZHJpdmVyLCBpbnRyb2R1Y2luZyBuZXcgaHlwZXJjYWxscyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBxdWV1ZSBtYW5hZ2VtZW50LCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBldGh0b29sIG9wZXJhdGlvbnMuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCB2aWEgbmV0d29yayBvcGVyYXRpb25zIGFuZCBldGh0b29sIGNvbW1hbmRzLCBtYWtpbmcgdGhlbSBzdWl0YWJsZSBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SUJNVkVUSCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2libXZldGhfc2V0X2NoYW5uZWxzJiMzNDssCiAgICAmIzM0O2libXZldGhfcmVzaXplX3J4X3F1ZXVlc19pbmNyZW1lbnRhbCYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWUmIzM0OywKICAgICYjMzQ7aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZSYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2RyYWluX3J4X3F1ZXVlJiMzNDssCiAgICAmIzM0O2libXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnMmIzM0OywKICAgICYjMzQ7aWJtdmV0aF90b2dnbGVfaXJxJiMzNDssCiAgICAmIzM0O2libXZldGhfcmVnaXN0ZXJfcnhfcXVldWVzJiMzNDssCiAgICAmIzM0O2libXZldGhfb3BlbiYjMzQ7LAogICAgJiMzNDtpYm12ZXRoX2Nsb3NlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgbXVsdGktcXVldWUgc3VwcG9ydCB0byB0aGUgaWJtdmV0aCBkcml2ZXIsIGludHJvZHVjaW5nIG5ldyBoeXBlcmNhbGxzIGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHF1ZXVlIG1hbmFnZW1lbnQsIGludGVycnVwdCBoYW5kbGluZywgYW5kIGV0aHRvb2wgb3BlcmF0aW9ucy4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0aGF0IGNhbiBiZSByZWFjaGVkIHZpYSBuZXR3b3JrIG9wZXJhdGlvbnMgYW5kIGV0aHRvb2wgY29tbWFuZHMsIG1ha2luZyB0aGVtIHN1aXRhYmxlIGZvciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDYtMzBUMjM6MDU6NDUuNDA3MjgxNzk2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUyNzMwMDE0MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSUJNVkVUSFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlibXZldGhfc2V0X2NoYW5uZWxzXCIsXG4gICAgXCJpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWxcIixcbiAgICBcImlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWVcIixcbiAgICBcImlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc1wiLFxuICAgIFwiaWJtdmV0aF90b2dnbGVfaXJxXCIsXG4gICAgXCJpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlc1wiLFxuICAgIFwiaWJtdmV0aF9vcGVuXCIsXG4gICAgXCJpYm12ZXRoX2Nsb3NlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBtdWx0aS1xdWV1ZSBzdXBwb3J0IHRvIHRoZSBpYm12ZXRoIGRyaXZlciwgaW50cm9kdWNpbmcgbmV3IGh5cGVyY2FsbHMgYW5kIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gcXVldWUgbWFuYWdlbWVudCwgaW50ZXJydXB0IGhhbmRsaW5nLCBhbmQgZXRodG9vbCBvcGVyYXRpb25zLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgdmlhIG5ldHdvcmsgb3BlcmF0aW9ucyBhbmQgZXRodG9vbCBjb21tYW5kcywgbWFraW5nIHRoZW0gc3VpdGFibGUgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTMwVDIzOjA1OjQ1LjQwNzI4OTgwNloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ5NDU0Njk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNGI0YzBjZDQyY2NlZWRiOTgwM2I3YzY5YzRlZmUzMzI3NmZkZDcyMlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEp1biAzMCAyMzowNTo0NCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmhcXG5pbmRleCBkZmY5MGE3ZDdmNzBiOC4uYmYyZjFiMDM1NmM0NzcgMTAwNjQ0XFxuLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oXFxuKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oXFxuQEAgLTM2Miw3ICszNjIsMTEgQEBcXG4gI2RlZmluZSBIX0dVRVNUX0RFTEVURVxcdFxcdDB4NDg4XFxuICNkZWZpbmUgSF9QS1NfV1JBUF9PQkpFQ1RcXHQweDQ5MFxcbiAjZGVmaW5lIEhfUEtTX1VOV1JBUF9PQkpFQ1RcXHQweDQ5NFxcbi0jZGVmaW5lIE1BWF9IQ0FMTF9PUENPREVcXHRIX1BLU19VTldSQVBfT0JKRUNUXFxuKyNkZWZpbmUgSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUgMHg0OUNcXG4rI2RlZmluZSBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFIDB4NEEwXFxuKyNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX0JVRkZFUl9RVUVVRSAweDRBNFxcbisjZGVmaW5lIEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRSAweDRBOFxcbisjZGVmaW5lIE1BWF9IQ0FMTF9PUENPREVcXHRIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUVcXG4gXFxuIC8qIFNjb3BlIGFyZ3MgZm9yIEhfU0NNX1VOQklORF9BTEwgKi9cXG4gI2RlZmluZSBIX1VOQklORF9TQ09QRV9BTEwgKDB4MSlcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmNcXG5pbmRleCA3M2UwNTFkMjZiOWQ4OC4uZDdiZjAxMjcxMTYxY2IgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguY1xcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmNcXG5AQCAtMjEsNiArMjEsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2tidWZmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbnRlcnJ1cHQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2lycS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaXJxZG9tYWluLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcG0uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V0aHRvb2wuaFxcdTAwM2VcXG5AQCAtMjgsNiArMzAsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvaXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2lwdjYuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vaHZjYWxsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9hdG9taWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS92aW8uaFxcdTAwM2VcXG5AQCAtOTUsNDkgKzk4LDg5IEBAIHN0YXRpYyBzdHJ1Y3QgaWJtdmV0aF9zdGF0IGlibXZldGhfc3RhdHNbXSA9IHtcXG4gXFx0eyBcXFwiZndfZW5hYmxlZF9pcHY2X2NzdW1cXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2lwdjZfY3N1bV9zdXBwb3J0KSB9LFxcbiBcXHR7IFxcXCJ0eF9sYXJnZV9wYWNrZXRzXFxcIiwgSUJNVkVUSF9TVEFUX09GRih0eF9sYXJnZV9wYWNrZXRzKSB9LFxcbiBcXHR7IFxcXCJyeF9sYXJnZV9wYWNrZXRzXFxcIiwgSUJNVkVUSF9TVEFUX09GRihyeF9sYXJnZV9wYWNrZXRzKSB9LFxcbi1cXHR7IFxcXCJmd19lbmFibGVkX2xhcmdlX3NlbmRcXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkgfVxcbitcXHR7IFxcXCJmd19lbmFibGVkX2xhcmdlX3NlbmRcXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkgfSxcXG4rXFx0eyBcXFwiaGNhbGxfcmVnX2xhbl9xdWV1ZVxcXCIsIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMucmVnX2xhbl9xdWV1ZSkgfSxcXG4rXFx0eyBcXFwiaGNhbGxfcmVnX2xhblxcXCIsIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMucmVnX2xhbikgfSxcXG4rXFx0eyBcXFwiaGNhbGxfYWRkX2J1ZnNfcXVldWVcXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWZzX3F1ZXVlKSB9LFxcbitcXHR7IFxcXCJoY2FsbF9hZGRfYnVmc1xcXCIsIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuYWRkX2J1ZnMpIH0sXFxuK1xcdHsgXFxcImhjYWxsX2FkZF9idWZcXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWYpIH0sXFxuK1xcdHsgXFxcImhjYWxsX2ZyZWVfbGFuX3F1ZXVlXFxcIiwgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSkgfSxcXG4rXFx0eyBcXFwiaGNhbGxfZnJlZV9sYW5cXFwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmZyZWVfbGFuKSB9LFxcbitcXHR7IFxcXCJoY2FsbF9zZW5kX2xhblxcXCIsIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuc2VuZF9sYW4pIH0sXFxuIH07XFxuIFxcbiAvKiBzaW1wbGUgbWV0aG9kcyBvZiBnZXR0aW5nIGRhdGEgZnJvbSB0aGUgY3VycmVudCByeHEgZW50cnkgKi9cXG4tc3RhdGljIGlubGluZSB1MzIgaWJtdmV0aF9yeHFfZmxhZ3Moc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4rc3RhdGljIGlubGluZSB1MzIgaWJtdmV0aF9yeHFfZmxhZ3Moc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0ICAgIGludCBxdWV1ZV9pbmRleClcXG4ge1xcbi1cXHRyZXR1cm4gYmUzMl90b19jcHUoYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5pbmRleF0uZmxhZ3Nfb2ZmKTtcXG4rXFx0c3RydWN0IGlibXZldGhfcnhfcSAqcnhxID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcXG4rXFxuK1xcdHJldHVybiBiZTMyX3RvX2NwdShyeHEtXFx1MDAzZXF1ZXVlX2FkZHJbcnhxLVxcdTAwM2VpbmRleF0uZmxhZ3Nfb2ZmKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfdG9nZ2xlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXFxuK1xcdFxcdFxcdFxcdCAgICAgaW50IHF1ZXVlX2luZGV4KVxcbit7XFxuK1xcdHJldHVybiAoaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFxcdTAwMjYgSUJNVkVUSF9SWFFfVE9HR0xFKSBcXHUwMDNlXFx1MDAzZVxcbitcXHRcXHRJQk1WRVRIX1JYUV9UT0dHTEVfU0hJRlQ7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3RvZ2dsZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbitzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIGludCBxdWV1ZV9pbmRleClcXG4ge1xcbi1cXHRyZXR1cm4gKGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFxcdTAwMjYgSUJNVkVUSF9SWFFfVE9HR0xFKSBcXHUwMDNlXFx1MDAzZVxcbi1cXHRcXHRcXHRJQk1WRVRIX1JYUV9UT0dHTEVfU0hJRlQ7XFxuK1xcdHJldHVybiBpYm12ZXRoX3J4cV90b2dnbGUoYWRhcHRlciwgcXVldWVfaW5kZXgpID09XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XS50b2dnbGU7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4tXFx0cmV0dXJuIGlibXZldGhfcnhxX3RvZ2dsZShhZGFwdGVyKSA9PSBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS50b2dnbGU7XFxuK1xcdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXFx1MDAyNiBJQk1WRVRIX1JYUV9WQUxJRDtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4tXFx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFxcdTAwMjYgSUJNVkVUSF9SWFFfVkFMSUQ7XFxuK1xcdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXFx1MDAyNiBJQk1WRVRIX1JYUV9PRkZfTUFTSztcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfb2Zmc2V0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2xhcmdlX3BhY2tldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4tXFx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFxcdTAwMjYgSUJNVkVUSF9SWFFfT0ZGX01BU0s7XFxuK1xcdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXFx1MDAyNiBJQk1WRVRIX1JYUV9MUkdfUEtUO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgaW50IHF1ZXVlX2luZGV4KVxcbit7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF07XFxuK1xcbitcXHRyZXR1cm4gYmUzMl90b19jcHUocnhxLVxcdTAwM2VxdWV1ZV9hZGRyW3J4cS1cXHUwMDNlaW5kZXhdLmxlbmd0aCk7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2xhcmdlX3BhY2tldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbitzdGF0aWMgaW5saW5lIGJvb2xcXG4raWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaW5kZXgsXFxuK1xcdFxcdFxcdCAgICAgdTY0IGNvcnJlbGF0b3IpXFxuIHtcXG4tXFx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFxcdTAwMjYgSUJNVkVUSF9SWFFfTFJHX1BLVDtcXG4rXFx0dW5zaWduZWQgaW50IHBvb2wgPSBjb3JyZWxhdG9yIFxcdTAwM2VcXHUwMDNlIDMyO1xcbitcXHR1bnNpZ25lZCBpbnQgaW5kZXggPSBjb3JyZWxhdG9yIFxcdTAwMjYgMHhmZmZmZmZmZlVMO1xcbitcXG4rXFx0cmV0dXJuIHBvb2wgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBpbmRleCBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2l6ZTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3J4cV9hZHZhbmNlKHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSlcXG4ge1xcbi1cXHRyZXR1cm4gYmUzMl90b19jcHUoYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5pbmRleF0ubGVuZ3RoKTtcXG4rXFx0aWYgKCsrcnhxLVxcdTAwM2VpbmRleCA9PSByeHEtXFx1MDAzZW51bV9zbG90cykge1xcbitcXHRcXHRyeHEtXFx1MDAzZWluZGV4ID0gMDtcXG4rXFx0XFx0cnhxLVxcdTAwM2V0b2dnbGUgPSAhcnhxLVxcdTAwM2V0b2dnbGU7XFxuK1xcdH1cXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfY3N1bV9nb29kKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2NzdW1fZ29vZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHRpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4tXFx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFxcdTAwMjYgSUJNVkVUSF9SWFFfQ1NVTV9HT09EO1xcbitcXHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFxcdTAwMjYgSUJNVkVUSF9SWFFfQ1NVTV9HT09EO1xcbiB9XFxuIFxcbiBzdGF0aWMgdW5zaWduZWQgaW50IGlibXZldGhfcmVhbF9tYXhfdHhfcXVldWVzKHZvaWQpXFxuQEAgLTE0Nyw2ICsxOTAsNDcyIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgaWJtdmV0aF9yZWFsX21heF90eF9xdWV1ZXModm9pZClcXG4gXFx0cmV0dXJuIG1pbihuX2NwdSwgSUJNVkVUSF9NQVhfUVVFVUVTKTtcXG4gfVxcbiBcXG4rLyoqXFxuKyAqIGlibXZldGhfYWxsb2NfZmlsdGVyX2xpc3QgLSBBbGxvY2F0ZSBhbmQgbWFwIGZpbHRlciBsaXN0XFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2VkZXY7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9hZGRyID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xcbitcXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBhbGxvY2F0ZSBmaWx0ZXIgcGFnZXNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0fVxcbitcXG4rXFx0YWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2FkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xcbitcXHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9kbWEpKSB7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwidW5hYmxlIHRvIG1hcCBmaWx0ZXIgbGlzdCBwYWdlc1xcXFxuXFxcIik7XFxuK1xcdFxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKTtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkciA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcImZpbHRlciBsaXN0IEAgMHglcCAoRE1BOiAweCVsbHgpXFxcXG5cXFwiLFxcbitcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9hZGRyLFxcbitcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2RtYSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZnJlZV9maWx0ZXJfbGlzdCAtIEZyZWUgZmlsdGVyIGxpc3QgcmVzb3VyY2VzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNlZGV2O1xcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2RtYSkge1xcbitcXHRcXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hLCA0MDk2LFxcbitcXHRcXHRcXHRcXHQgRE1BX0JJRElSRUNUSU9OQUwpO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9kbWEgPSAwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xcbitcXHRcXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSBOVUxMO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyAtIEFsbG9jYXRlIHBlci1xdWV1ZSBSWCBzdGF0aXN0aWNzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19yeF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHMgPSBrY2FsbG9jKElCTVZFVEhfTUFYX1JYX1FVRVVFUyxcXG4rXFx0XFx0XFx0XFx0ICAgICBzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcXVldWVfc3RhdHMpLFxcbitcXHRcXHRcXHRcXHQgICAgIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIWFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0cylcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZnJlZV9yeF9xc3RhdHMgLSBGcmVlIHBlci1xdWV1ZSBSWCBzdGF0aXN0aWNzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3tcXG4rXFx0a2ZyZWUoYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzKTtcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzID0gTlVMTDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfYWxsb2NfdHhfcXN0YXRzIC0gQWxsb2NhdGUgcGVyLXF1ZXVlIFRYIHN0YXRpc3RpY3NcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gZmFpbHVyZVxcbisgKi9cXG4rc3RhdGljIGludCBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0cyA9IGtjYWxsb2MoSUJNVkVUSF9NQVhfUVVFVUVTLFxcbitcXHRcXHRcXHRcXHQgICAgIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF90eF9xdWV1ZV9zdGF0cyksXFxuK1xcdFxcdFxcdFxcdCAgICAgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9mcmVlX3R4X3FzdGF0cyAtIEZyZWUgcGVyLXF1ZXVlIFRYIHN0YXRpc3RpY3NcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICovXFxuK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRrZnJlZShhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHMpO1xcbitcXHRhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHMgPSBOVUxMO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMgLSBBbGxvY2F0ZSBwZXItcXVldWUgUlggcmVzb3VyY2VzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEByeHFfZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgcGVyIFJYIHF1ZXVlXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnRcXG4raWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHJ4cV9lbnRyaWVzKVxcbit7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2VkZXY7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdGlmICghYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSkge1xcbitcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgbGlzdCBmb3IgcXVldWUgJWRcXFxcblxcXCIsIGkpO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbGVhbnVwO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9sZW4gPVxcbitcXHRcXHRcXHRzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllcztcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9XFxuK1xcdFxcdFxcdGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2RtYSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdGlmICghYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkcikge1xcbitcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBhbGxvY2F0ZSBSWCBxdWV1ZSBmb3IgcXVldWUgJWRcXFxcblxcXCIsIGkpO1xcbitcXHRcXHRcXHRnb3RvIGVycl9jbGVhbnVwO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0gPSBkbWFfbWFwX3NpbmdsZShkZXYsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XFxuK1xcdFxcdGlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSkpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcXFxuXFxcIiwgaSk7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSA9IDA7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2NsZWFudXA7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLmluZGV4ID0gMDtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ubnVtX3Nsb3RzID0gcnhxX2VudHJpZXM7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnRvZ2dsZSA9IDE7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtpXS5yZXBsZW5pc2hfbG9jayk7XFxuK1xcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcInF1ZXVlICVkOiBidWZmZXJfbGlzdCBAIDB4JXAgKERNQTogMHglbGx4KSwgcnhfcXVldWUgQCAweCVwIChETUE6IDB4JWxseCksICVsbHUgZW50cmllc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgaSwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSxcXG4rXFx0XFx0XFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0sXFxuK1xcdFxcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXFxuK1xcdFxcdFxcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hLFxcbitcXHRcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4cV9lbnRyaWVzKTtcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJhbGxvY2F0ZWQgJWQgUlggcXVldWUocykgd2l0aCAlZCBlbnRyaWVzIGVhY2hcXFxcblxcXCIsXFxuK1xcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXMsIHJ4cV9lbnRyaWVzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyX2NsZWFudXA6XFxuK1xcdC8qIENsZWFuIHVwIHByZXZpb3VzbHkgYWxsb2NhdGVkIHF1ZXVlcyAqL1xcbitcXHRmb3IgKDsgaSBcXHUwMDNlPSAwOyBpLS0pIHtcXG4rXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSkge1xcbitcXHRcXHRcXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldLFxcbitcXHRcXHRcXHRcXHRcXHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0gPSAwO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyKSB7XFxuK1xcdFxcdFxcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfbGVuLFxcbitcXHRcXHRcXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hKTtcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pIHtcXG4rXFx0XFx0XFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pO1xcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLUVOT01FTTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfY2xlYW51cF9yeF9yZXNvdXJjZXMgLSBGcmVlIGFsbCBSWCBxdWV1ZSByZXNvdXJjZXNcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICovXFxuK3N0YXRpYyB2b2lkIGlibXZldGhfY2xlYW51cF9yeF9yZXNvdXJjZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNlZGV2O1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG5ldGRldl9kYmcoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LCBcXFwiY2xlYW5pbmcgdXAgJWQgUlggcXVldWUocylcXFxcblxcXCIsXFxuK1xcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXMpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xcbitcXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldKSB7XFxuK1xcdFxcdFxcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0sXFxuK1xcdFxcdFxcdFxcdFxcdCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSA9IDA7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyKSB7XFxuK1xcdFxcdFxcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfbGVuLFxcbitcXHRcXHRcXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hKTtcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldKSB7XFxuK1xcdFxcdFxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldKTtcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF90b2dnbGVfaXJxIC0gQ29tbW9uIGhlbHBlciB0byBlbmFibGUvZGlzYWJsZSBxdWV1ZSBpbnRlcnJ1cHRzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEBxdWV1ZV9pbmRleDogSW5kZXggb2YgdGhlIHF1ZXVlICgwIGZvciBwcmltYXJ5LCAxKyBmb3Igc3Vib3JkaW5hdGUpXFxuKyAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlXFxuKyAqXFxuKyAqIEZvciBxdWV1ZSAwIChwcmltYXJ5KSwgdXNlcyBoX3Zpb19zaWduYWwoKSBhcyBpdCdzIHJlZ2lzdGVyZWQgdmlhXFxuKyAqIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oKS4gRm9yIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMSspLCB1c2VzIEhfVklPQ1RMXFxuKyAqIHdpdGggSF9FTkFCTEUvRElTQUJMRV9WSU9fSU5URVJSVVBUIGZvciBwZXItcXVldWUgaW50ZXJydXB0IGNvbnRyb2wuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX3RvZ2dsZV9pcnEoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4LCBib29sIGVuYWJsZSlcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHJjO1xcbitcXHR1bnNpZ25lZCBsb25nIGlycSA9IGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pbmRleF07XFxuK1xcdGNvbnN0IGNoYXIgKmFjdGlvbiA9IGVuYWJsZSA/IFxcXCJlbmFibGVcXFwiIDogXFxcImRpc2FibGVcXFwiO1xcbitcXG4rXFx0aWYgKHF1ZXVlX2luZGV4ID09IDApIHtcXG4rXFx0XFx0LyogUHJpbWFyeSBxdWV1ZTogdXNlIGhfdmlvX3NpZ25hbCgpICovXFxuK1xcdFxcdHJjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0ICBlbmFibGUgPyBWSU9fSVJRX0VOQUJMRSA6IFZJT19JUlFfRElTQUJMRSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFN1Ym9yZGluYXRlIHF1ZXVlczogdXNlIEhfVklPQ1RMIHdpdGggaGFyZHdhcmUgSVJRICovXFxuK1xcdFxcdHN0cnVjdCBpcnFfZGF0YSAqaXJxX2RhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGlycSk7XFxuK1xcdFxcdGlycV9od19udW1iZXJfdCBod2lycTtcXG4rXFx0XFx0dTY0IHZpb2N0bF9jbWQgPSBlbmFibGUgPyBIX0VOQUJMRV9WSU9fSU5URVJSVVBUIDogSF9ESVNBQkxFX1ZJT19JTlRFUlJVUFQ7XFxuK1xcbitcXHRcXHRpZiAoIWlycV9kYXRhKSB7XFxuK1xcdFxcdFxcdG5ldGRldl9lcnIoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbitcXHRcXHRcXHRcXHQgICBcXFwiRmFpbGVkIHRvIGdldCBJUlEgZGF0YSBmb3IgcXVldWUgJWQgKHZpcnE9JWx1KVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgcXVldWVfaW5kZXgsIGlycSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRod2lycSA9IGlycWRfdG9faHdpcnEoaXJxX2RhdGEpO1xcbitcXHRcXHRyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX1ZJT0NUTCxcXG4rXFx0XFx0XFx0XFx0XFx0YWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHR2aW9jdGxfY21kLFxcbitcXHRcXHRcXHRcXHRcXHRod2lycSwgMCwgMCk7XFxuK1xcbitcXHRcXHRpZiAocmMgPT0gSF9QQVJBTUVURVIpIHtcXG4rXFx0XFx0XFx0LyogSF9QQVJBTUVURVIgaXMgbm9uLWZhdGFsIHdoZW4gSVJRIGlzIGFscmVhZHkgaW4gdGhlIHJlcXVlc3RlZCBzdGF0ZS4gKi9cXG4rXFx0XFx0XFx0bmV0ZGV2X3dhcm5fb25jZShhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdFxcdCBcXFwiSF9WSU9DVEwgJXMgSVJRIHJldHVybmVkIEhfUEFSQU1FVEVSIGZvciBxdWV1ZSAlZCAoaHdpcnE9JWx1KVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0IGFjdGlvbiwgcXVldWVfaW5kZXgsIGh3aXJxKTtcXG4rXFx0XFx0XFx0cmV0dXJuIDA7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcIkZhaWxlZCB0byAlcyBJUlEgZm9yIHF1ZXVlICVkLCByYz0lbGRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgIGFjdGlvbiwgcXVldWVfaW5kZXgsIHJjKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9kaXNhYmxlX2lycSAtIERpc2FibGUgaW50ZXJydXB0IGZvciBhIHNwZWNpZmljIHF1ZXVlXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEBxdWV1ZV9pbmRleDogSW5kZXggb2YgdGhlIHF1ZXVlICgwIGZvciBwcmltYXJ5LCAxKyBmb3Igc3Vib3JkaW5hdGUpXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX2Rpc2FibGVfaXJxKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pbmRleClcXG4re1xcbitcXHRyZXR1cm4gaWJtdmV0aF90b2dnbGVfaXJxKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCBmYWxzZSk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX2VuYWJsZV9pcnEgLSBFbmFibGUgaW50ZXJydXB0IGZvciBhIHNwZWNpZmljIHF1ZXVlXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEBxdWV1ZV9pbmRleDogSW5kZXggb2YgdGhlIHF1ZXVlICgwIGZvciBwcmltYXJ5LCAxKyBmb3Igc3Vib3JkaW5hdGUpXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX2VuYWJsZV9pcnEoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4KVxcbit7XFxuK1xcdHJldHVybiBpYm12ZXRoX3RvZ2dsZV9pcnEoYWRhcHRlciwgcXVldWVfaW5kZXgsIHRydWUpO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyAtIERyb3AgdmlycSBtYXBwaW5ncyBmb3IgcXVldWVzIDEuLk5cXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICpcXG4rICogU3Vib3JkaW5hdGUgcXVldWVzIGdldCBtYXBwaW5ncyBmcm9tIGlycV9jcmVhdGVfbWFwcGluZygpIGR1cmluZyBQSFlQXFxuKyAqIHJlZ2lzdHJhdGlvbi4gIFF1ZXVlIDAgdXNlcyBuZXRkZXYtXFx1MDAzZWlycSBmcm9tIGRldmljZSB0cmVlIGFuZCBpcyBsZWZ0IGFsb25lLlxcbisgKiBDYWxsIGFmdGVyIGZyZWVfaXJxKCkgd2hlbiBoYW5kbGVycyB3ZXJlIGluc3RhbGxlZCwgb3IgYWxvbmUgd2hlbiBvcGVuXFxuKyAqIGZhaWxzIGR1cmluZyByZWdpc3Rlcl9yeF9xdWV1ZXMoKSBiZWZvcmUgcmVxdWVzdF9pcnEoKS5cXG4rICovXFxuK3N0YXRpYyB2b2lkXFxuK2libXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3Moc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSkge1xcbitcXHRcXHRcXHRpcnFfZGlzcG9zZV9tYXBwaW5nKGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSk7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSA9IDA7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9zZXR1cF9yeF9pbnRlcnJ1cHRzIC0gUmVnaXN0ZXIgSVJRIGhhbmRsZXJzIGFuZCBlbmFibGUgTkFQSVxcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKlxcbisgKiBSZWdpc3RlcnMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBhbGwgUlggcXVldWVzIGFuZCBlbmFibGVzIE5BUEkgcG9sbGluZy5cXG4rICogRm9yIG11bHRpLXF1ZXVlIG1vZGUsIGVuYWJsZXMgaHlwZXJ2aXNvciBpbnRlcnJ1cHQgZGVsaXZlcnkgb25seSBhZnRlclxcbisgKiBldmVyeSBxdWV1ZSBoYXMgYSBMaW51eCBoYW5kbGVyIGluc3RhbGxlZC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cXHUwMDNlbmV0ZGV2O1xcbitcXHRpbnQgaSwgcmMsIG51bSA9IGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnVtOyBpKyspIHtcXG4rXFx0XFx0aWYgKCFhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbaV0pIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJxdWV1ZSAlZCBoYXMgaW52YWxpZCBJUlEgKDApXFxcXG5cXFwiLCBpKTtcXG4rXFx0XFx0XFx0cmMgPSAtRUlOVkFMO1xcbitcXHRcXHRcXHRnb3RvIGVycl9mcmVlX2lycXM7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHJjID0gcmVxdWVzdF9pcnEoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW2ldLCBpYm12ZXRoX2ludGVycnVwdCxcXG4rXFx0XFx0XFx0XFx0IDAsIG5ldGRldi1cXHUwMDNlbmFtZSwgXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbaV0pO1xcbitcXHRcXHRpZiAocmMpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdCAgIFxcXCJyZXF1ZXN0X2lycSgpIGZhaWxlZCBmb3IgaXJxIDB4JXggcXVldWUgJWQ6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbaV0sIGksIHJjKTtcXG4rXFx0XFx0XFx0Z290byBlcnJfZnJlZV9pcnFzO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBudW07IGkrKylcXG4rXFx0XFx0bmFwaV9lbmFibGUoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbaV0pO1xcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZW11bHRpX3F1ZXVlIFxcdTAwMjZcXHUwMDI2IG51bSBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG51bTsgaSsrKSB7XFxuK1xcdFxcdFxcdHJjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRcXHRpZiAocmMpIHtcXG4rXFx0XFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcXCJGYWlsZWQgdG8gZW5hYmxlIElSUSBmb3IgcXVldWUgJWQsIHJjPSVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpLCByYyk7XFxuK1xcdFxcdFxcdFxcdHdoaWxlICgtLWkgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0XFx0XFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0XFx0cmMgPSAtRUlPO1xcbitcXHRcXHRcXHRcXHRnb3RvIGVycl9kaXNhYmxlX25hcGk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2Vycl9kaXNhYmxlX25hcGk6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBudW07IGkrKylcXG4rXFx0XFx0bmFwaV9kaXNhYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFx0aSA9IG51bTtcXG4rZXJyX2ZyZWVfaXJxczpcXG4rXFx0d2hpbGUgKC0taSBcXHUwMDNlPSAwKVxcbitcXHRcXHRmcmVlX2lycShhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbaV0sIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFx0aWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhhZGFwdGVyKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMgLSBEaXNhYmxlIE5BUEkgYW5kIGZyZWUgSVJRc1xcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKlxcbisgKiBEaXNhYmxlcyBOQVBJIHBvbGxpbmcgYW5kIGZyZWVzIGludGVycnVwdCBoYW5kbGVycyBmb3IgYWxsIFJYIHF1ZXVlcy5cXG4rICovXFxuK3N0YXRpYyB2b2lkXFxuK2libXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3tcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKVxcbitcXHRcXHRuYXBpX2Rpc2FibGUoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbaV0pO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xcbitcXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW2ldKVxcbitcXHRcXHRcXHRmcmVlX2lycShhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbaV0sIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFx0fVxcbitcXG4rXFx0aWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhhZGFwdGVyKTtcXG4rXFxuK1xcdC8qIENsZWFyIHF1ZXVlIDAgSVJRIG51bWJlciAqL1xcbitcXHRhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbMF0gPSAwO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9zZXR1cF9zaW5nbGVfcnhfaW50ZXJydXB0IC0gU2V0dXAgaW50ZXJydXB0IGZvciBhIHNpbmdsZSBSWCBxdWV1ZVxcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBzZXR1cFxcbisgKlxcbisgKiBSZWdpc3RlcnMgdGhlIElSUSBoYW5kbGVyIGZvciBvbmUgcXVldWUuIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsXFxuKyAqIHNjYWxlLXVwIHdoZW4gYWRkaW5nIG5ldyBSWCBxdWV1ZXM7IHRoZSBjYWxsZXIgZW5hYmxlcyBOQVBJIHZpYVxcbisgKiBuYXBpX2VuYWJsZSgpIGFmdGVyIGlibXZldGhfZW5hYmxlX2lycSgpLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXFxuKyAqL1xcbitzdGF0aWMgaW50XFxuK2libXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHQgIGludCBxdWV1ZV9pZHgpXFxuK3tcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0cmMgPSByZXF1ZXN0X2lycShhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSwgaWJtdmV0aF9pbnRlcnJ1cHQsXFxuK1xcdFxcdFxcdCAwLCBuZXRkZXYtXFx1MDAzZW5hbWUsIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW3F1ZXVlX2lkeF0pO1xcbitcXHRpZiAocmMpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJyZXF1ZXN0X2lycSgpIGZhaWxlZCBmb3IgcXVldWUgJWQ6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pZHgsIHJjKTtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbitcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcIlNldHVwIElSUSAlZCBmb3IgcXVldWUgJWRcXFxcblxcXCIsXFxuK1xcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdLCBxdWV1ZV9pZHgpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0IC0gQ2xlYW51cCBpbnRlcnJ1cHQgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEBxdWV1ZV9pZHg6IFF1ZXVlIGluZGV4IHRvIGNsZWFudXBcXG4rICpcXG4rICogRnJlZXMgdGhlIElSUSBoYW5kbGVyIGZvciBvbmUgcXVldWUuIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsIHNjYWxlLWRvd24uXFxuKyAqL1xcbitzdGF0aWMgdm9pZFxcbitpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHQgICAgaW50IHF1ZXVlX2lkeClcXG4re1xcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0pIHtcXG4rXFx0XFx0ZnJlZV9pcnEoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0sIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW3F1ZXVlX2lkeF0pO1xcbitcXHRcXHRuZXRkZXZfZGJnKGFkYXB0ZXItXFx1MDAzZW5ldGRldiwgXFxcIkZyZWVkIElSUSBmb3IgcXVldWUgJWRcXFxcblxcXCIsIHF1ZXVlX2lkeCk7XFxuK1xcdH1cXG4rfVxcbitcXG4gLyogc2V0dXAgdGhlIGluaXRpYWwgc2V0dGluZ3MgZm9yIGEgYnVmZmVyIHBvb2wgKi9cXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCxcXG4gXFx0XFx0XFx0XFx0ICAgICB1MzIgcG9vbF9pbmRleCwgdTMyIHBvb2xfc2l6ZSxcXG5AQCAtMjA1LDExICs3MTQsNzMgQEAgc3RhdGljIGlubGluZSB2b2lkIGlibXZldGhfZmx1c2hfYnVmZmVyKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKVxcbiBcXHRcXHRhc20oXFxcImRjYmYgJTAsJTEsMVxcXCIgOjogXFxcImJcXFwiIChhZGRyKSwgXFxcInJcXFwiIChvZmZzZXQpKTtcXG4gfVxcbiBcXG4rLyoqXFxuKyAqIGlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnMgLSBBZGQgcmVjZWl2ZSBidWZmZXJzIHRvIGh5cGVydmlzb3JcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQGRlc2NzOiBhcnJheSBvZiBidWZmZXIgZGVzY3JpcHRvcnMgdG8gYWRkXFxuKyAqIEBmaWxsZWQ6IG51bWJlciBvZiB2YWxpZCBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXlcXG4rICogQGJ1ZmZfc2l6ZTogc2l6ZSBvZiBlYWNoIGJ1ZmZlciAobXVsdGktcXVldWUgbW9kZSBvbmx5KVxcbisgKiBAcXVldWVfaW5kZXg6IFJYIHF1ZXVlIGluZGV4XFxuKyAqXFxuKyAqIFJldHVybjogaHlwZXJ2aXNvciByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGxvbmcgaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgdW5pb24gaWJtdmV0aF9idWZfZGVzYyAqZGVzY3MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBpbnQgZmlsbGVkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBidWZmX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBpbnQgcXVldWVfaW5kZXgpXFxuK3tcXG4rXFx0c3RydWN0IHZpb19kZXYgKnZkZXYgPSBhZGFwdGVyLVxcdTAwM2V2ZGV2O1xcbitcXHR1bnNpZ25lZCBsb25nIHJjO1xcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZW11bHRpX3F1ZXVlKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYnVmZmVyc3pudW0gPSAoYnVmZl9zaXplIFxcdTAwM2NcXHUwMDNjIDMyKSB8IGZpbGxlZDtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBpb2JhW0lCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAvIDJdID0gezB9O1xcbitcXHRcXHRpbnQgaTtcXG4rXFxuK1xcdFxcdC8qIFBhY2sgZGVzY3JpcHRvciBhZGRyZXNzZXMgaW50byBpb2JhIHBhaXJzLlxcbitcXHRcXHQgKiBFYWNoIGlvYmEgaG9sZHMgdHdvIDMyLWJpdCBhZGRyZXNzZXMgcGFja2VkIGludG8gNjQgYml0czpcXG4rXFx0XFx0ICogLSBFdmVuIGRlc2NyaXB0b3JzICgwLDIsNC4uLikgZ28gaW4gaGlnaCAzMiBiaXRzXFxuK1xcdFxcdCAqIC0gT2RkIGRlc2NyaXB0b3JzICgxLDMsNS4uLikgZ28gaW4gbG93IDMyIGJpdHNcXG4rXFx0XFx0ICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBmaWxsZWQgXFx1MDAyNlxcdTAwMjYgaSBcXHUwMDNjIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTDsgaSsrKSB7XFxuK1xcdFxcdFxcdGludCBwYWlyX2lkeCA9IGkgLyAyOyAgICAgICAgICAgLyogV2hpY2ggcGFpcjogMC01ICovXFxuK1xcdFxcdFxcdGludCBpc19oaWdoID0gKGkgJSAyID09IDApOyAgICAgLyogSGlnaCBvciBsb3cgMzIgYml0cyAqL1xcbitcXG4rXFx0XFx0XFx0aWYgKGlzX2hpZ2gpXFxuK1xcdFxcdFxcdFxcdGlvYmFbcGFpcl9pZHhdID0gKHVuc2lnbmVkIGxvbmcpZGVzY3NbaV0uZmllbGRzLmFkZHJlc3MgXFx1MDAzY1xcdTAwM2MgMzI7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0aW9iYVtwYWlyX2lkeF0gfD0gZGVzY3NbaV0uZmllbGRzLmFkZHJlc3M7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSh2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgYWRhcHRlci1cXHUwMDNlcXVldWVfaGFuZGxlW3F1ZXVlX2luZGV4XSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBidWZmZXJzem51bSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpb2JhWzBdLCBpb2JhWzFdLCBpb2JhWzJdLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGlvYmFbM10sIGlvYmFbNF0sIGlvYmFbNV0pO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VoY2FsbF9zdGF0cy5hZGRfYnVmc19xdWV1ZSsrO1xcbitcXHR9IGVsc2UgaWYgKGZpbGxlZCA9PSAxKSB7XFxuK1xcdFxcdHJjID0gaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyKHZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgZGVzY3NbMF0uZGVzYyk7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZWhjYWxsX3N0YXRzLmFkZF9idWYrKztcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKHZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGRlc2NzWzBdLmRlc2MsIGRlc2NzWzFdLmRlc2MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBkZXNjc1syXS5kZXNjLCBkZXNjc1szXS5kZXNjLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgZGVzY3NbNF0uZGVzYywgZGVzY3NbNV0uZGVzYyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGRlc2NzWzZdLmRlc2MsIGRlc2NzWzddLmRlc2MpO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VoY2FsbF9zdGF0cy5hZGRfYnVmcysrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuIC8qIHJlcGxlbmlzaCB0aGUgYnVmZmVycyBmb3IgYSBwb29sLiAgbm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG9cXG4gICogc2tiX3Jlc2VydmUgdGhlc2Ugc2luY2UgdGhleSBhcmUgdXNlZCBmb3IgaW5jb21pbmcuLi5cXG4gICovXFxuIHN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sKVxcbitcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCxcXG4rXFx0XFx0XFx0XFx0XFx0ICBpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4gXFx0dW5pb24gaWJtdmV0aF9idWZfZGVzYyBkZXNjc1tJQk1WRVRIX01BWF9SWF9QRVJfSENBTExdID0gezB9O1xcbiBcXHR1MzIgcmVtYWluaW5nID0gcG9vbC1cXHUwMDNlc2l6ZSAtIGF0b21pY19yZWFkKFxcdTAwMjZwb29sLVxcdTAwM2VhdmFpbGFibGUpO1xcbkBAIC0yOTUsMjQgKzg2NiwxNSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbiBcXHRcXHRpZiAoIWZpbGxlZClcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcbi1cXHRcXHQvKiBzaW5nbGUgYnVmZmVyIGNhc2UqL1xcbi1cXHRcXHRpZiAoZmlsbGVkID09IDEpXFxuLVxcdFxcdFxcdGxwYXJfcmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXIodmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBkZXNjc1swXS5kZXNjKTtcXG4tXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHQvKiBNdWx0aS1idWZmZXIgaGNhbGwgKi9cXG4tXFx0XFx0XFx0bHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgZGVzY3NbMF0uZGVzYyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGRlc2NzWzFdLmRlc2MsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBkZXNjc1syXS5kZXNjLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgZGVzY3NbM10uZGVzYyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGRlc2NzWzRdLmRlc2MsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBkZXNjc1s1XS5kZXNjLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgZGVzY3NbNl0uZGVzYyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGRlc2NzWzddLmRlc2MpO1xcbitcXHRcXHRscGFyX3JjID0gaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyhhZGFwdGVyLCBkZXNjcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBmaWxsZWQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcG9vbC1cXHUwMDNlYnVmZl9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIHF1ZXVlX2luZGV4KTtcXG4rXFxuIFxcdFxcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xcbiBcXHRcXHRcXHRkZXZfd2Fybl9yYXRlbGltaXRlZChkZXYsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgXFxcIlJYIGhfYWRkX2xvZ2ljYWxfbGFuIGZhaWxlZDogZmlsbGVkPSV1LCByYz0lbHUsIGJhdGNoPSV1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIFxcXCJSWCBoX2FkZF9sb2dpY2FsX2xhbiAlcyBmYWlsZWQ6IGZpbGxlZD0ldSwgcmM9JWx1LCBiYXRjaD0ldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBhZGFwdGVyLVxcdTAwM2VtdWx0aV9xdWV1ZSA/IFxcXCJfcXVldWVcXFwiIDogXFxcIlxcXCIsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgZmlsbGVkLCBscGFyX3JjLCBiYXRjaCk7XFxuIFxcdFxcdFxcdGdvdG8gaGNhbGxfZmFpbHVyZTtcXG4gXFx0XFx0fVxcbkBAIC0zNTMsMjQgKzkxNSwxOSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbiBcXHRcXHR9XFxuIFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJlcGxlbmlzaF9hZGRfYnVmZl9mYWlsdXJlICs9IGZpbGxlZDtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIG11bHRpIHJ4IGJ1ZmZlcnMgaGNhbGwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBGV1xcbi1cXHRcXHQgKiBlLmcuIGluIHRoZSBjYXNlIG9mIExpdmUgUGFydGl0aW9uIE1pZ3JhdGlvblxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGJhdGNoIFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiBscGFyX3JjID09IEhfRlVOQ1RJT04pIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogSW5zdGVhZCBvZiByZXRyeSBzdWJtaXQgc2luZ2xlIGJ1ZmZlciBpbmRpdmlkdWFsbHlcXG4tXFx0XFx0XFx0ICogaGVyZSBqdXN0IHNldCB0aGUgbWF4IHJ4IGJ1ZmZlciBwZXIgaGNhbGwgdG8gMVxcbi1cXHRcXHRcXHQgKiBidWZmZXJzIHdpbGwgYmUgcmVzcGxlc2hlZCBuZXh0IHRpbWVcXG4tXFx0XFx0XFx0ICogd2hlbiBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbCgpIGlzIGNhbGxlZCBhZ2Fpblxcbi1cXHRcXHRcXHQgKiB3aXRoIHNpbmdsZS1idWZmZXIgY2FzZVxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0bmV0ZGV2X2luZm8oYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbi1cXHRcXHRcXHRcXHQgICAgXFxcIlJYIE11bHRpIGJ1ZmZlcnMgbm90IHN1cHBvcnRlZCBieSBGVywgcmM9JWx1XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgbHBhcl9yYyk7XFxuLVxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsID0gMTtcXG4tXFx0XFx0XFx0bmV0ZGV2X2luZm8oYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbi1cXHRcXHRcXHRcXHQgICAgXFxcIk5leHQgcnggcmVwbGVzaCB3aWxsIGZhbGwgYmFjayB0byBzaW5nbGUtYnVmZmVyIGhjYWxsXFxcXG5cXFwiKTtcXG4rXFx0XFx0aWYgKGxwYXJfcmMgPT0gSF9GVU5DVElPTikge1xcbitcXHRcXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlbXVsdGlfcXVldWUpIHtcXG4rXFx0XFx0XFx0XFx0bmV0ZGV2X2VycihhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcXCJVbmV4cGVjdGVkIEhfRlVOQ1RJT04gZnJvbSBtdWx0aS1xdWV1ZSBidWZmZXIgYWRkIChxdWV1ZT0lZCwgYmF0Y2g9JWQpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICBxdWV1ZV9pbmRleCwgYmF0Y2gpO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fSBlbHNlIGlmIChiYXRjaCBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0XFx0XFx0bmV0ZGV2X3dhcm4oYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgXFxcIkhfRlVOQ1RJT04gZnJvbSBsZWdhY3kgYmF0Y2ggYnVmZmVyIGFkZCAoYmF0Y2g9JWQpLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIGJ1ZmZlciBtb2RlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgYmF0Y2gpO1xcbitcXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IDE7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdH1cXG4gXFx0XFx0YnJlYWs7XFxuIFxcdH1cXG5AQCAtMzg2LDI3ICs5NDMsNTEgQEAgc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4gICovXFxuIHN0YXRpYyB2b2lkIGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbiB7XFxuLVxcdF9fYmU2NCAqcCA9IGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIgKyA0MDk2IC0gODtcXG4rXFx0aW50IGk7XFxuIFxcbi1cXHRhZGFwdGVyLVxcdTAwM2VyeF9ub19idWZmZXIgPSBiZTY0X3RvX2NwdXAocCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0X19iZTY0ICpwID0gYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSArIDQwOTYgLSA4O1xcbitcXHRcXHR1NjQgZHJvcHMgPSBiZTY0X3RvX2NwdXAocCk7XFxuK1xcbitcXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzKVxcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHNbaV0ubm9fYnVmZmVyX2Ryb3BzID0gZHJvcHM7XFxuK1xcdFxcdGlmIChpID09IDApXFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X25vX2J1ZmZlciA9IGRyb3BzO1xcbitcXHR9XFxuIH1cXG4gXFxuIC8qIHJlcGxlbmlzaCByb3V0aW5lICovXFxuLXN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX3Rhc2soc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHQgICBpbnQgcXVldWVfaW5kZXgpXFxuIHtcXG4rXFx0c3RydWN0IGlibXZldGhfcnhfcSAqcnhxID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcXG4rXFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gXFx0aW50IGk7XFxuIFxcbiBcXHRhZGFwdGVyLVxcdTAwM2VyZXBsZW5pc2hfdGFza19jeWNsZXMrKztcXG4gXFxuK1xcdGlmIChxdWV1ZV9pbmRleCBcXHUwMDNlPSBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzKSB7XFxuK1xcdFxcdG5ldGRldl9kYmcoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbitcXHRcXHRcXHQgICBcXFwiU2tpcHBpbmcgcmVwbGVuaXNoIGZvciBmcmVlZCBxdWV1ZSAlZCAobnVtX3F1ZXVlcz0lZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRzcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2cnhxLVxcdTAwM2VyZXBsZW5pc2hfbG9jaywgZmxhZ3MpO1xcbitcXG4gXFx0Zm9yIChpID0gKElCTVZFVEhfTlVNX0JVRkZfUE9PTFMgLSAxKTsgaSBcXHUwMDNlPSAwOyBpLS0pIHtcXG4tXFx0XFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXTtcXG4rXFx0XFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID1cXG4rXFx0XFx0XFx0XFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1baV07XFxuIFxcbi1cXHRcXHRpZiAocG9vbC1cXHUwMDNlYWN0aXZlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdGlmIChwb29sLVxcdTAwM2VhY3RpdmUgXFx1MDAyNlxcdTAwMjYgcG9vbC1cXHUwMDNlZnJlZV9tYXAgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0ICAgIChhdG9taWNfcmVhZChcXHUwMDI2cG9vbC1cXHUwMDNlYXZhaWxhYmxlKSBcXHUwMDNjIHBvb2wtXFx1MDAzZXRocmVzaG9sZCkpXFxuLVxcdFxcdFxcdGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsIHBvb2wpO1xcbitcXHRcXHRcXHRpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBxdWV1ZV9pbmRleCk7XFxuIFxcdH1cXG4gXFxuIFxcdGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihhZGFwdGVyKTtcXG4rXFxuK1xcdHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoXFx1MDAyNnJ4cS1cXHUwMDNlcmVwbGVuaXNoX2xvY2ssIGZsYWdzKTtcXG4gfVxcbiBcXG4gLyogZW1wdHkgYW5kIGZyZWUgYW5hIGJ1ZmZlciBwb29sIC0gYWxzbyB1c2VkIHRvIGRvIGNsZWFudXAgaW4gZXJyb3IgcGF0aHMgKi9cXG5AQCAtNDQ0LDM2ICsxMDI1LDI5MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2wgLSByZW1vdmUgYSBidWZmZXIgZnJvbSBhIHBvb2xcXG4tICogQGFkYXB0ZXI6IGFkYXB0ZXIgaW5zdGFuY2VcXG4tICogQGNvcnJlbGF0b3I6IGlkZW50aWZpZXMgcG9vbCBhbmQgaW5kZXhcXG4tICogQHJldXNlOiB3aGV0aGVyIHRvIHJldXNlIGJ1ZmZlclxcbisgKiBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyAtIEFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgYSBzaW5nbGUgcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlOiBxdWV1ZSBpbmRleFxcbiAgKlxcbi0gKiBSZXR1cm46XFxuLSAqICogJTAgICAgICAgLSBzdWNjZXNzXFxuLSAqICogJS1FSU5WQUwgLSBjb3JyZWxhdG9yIG1hcHMgdG8gcG9vbCBvciBpbmRleCBvdXQgb2YgcmFuZ2VcXG4tICogKiAlLUVGQVVMVCAtIHBvb2wgYW5kIGluZGV4IG1hcCB0byBudWxsIHNrYlxcbisgKiBBbGxvY2F0ZXMgYWxsIGFjdGl2ZSBidWZmZXIgcG9vbHMgZm9yIHRoZSBzcGVjaWZpZWQgcXVldWUuXFxuKyAqIFBvb2wgbWV0YWRhdGEgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXFxuICAqL1xcbi1zdGF0aWMgaW50IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4tXFx0XFx0XFx0XFx0XFx0ICAgdTY0IGNvcnJlbGF0b3IsIGJvb2wgcmV1c2UpXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19xdWV1ZV9idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGludCBxdWV1ZSlcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgcG9vbCAgPSBjb3JyZWxhdG9yIFxcdTAwM2VcXHUwMDNlIDMyO1xcbi1cXHR1bnNpZ25lZCBpbnQgaW5kZXggPSBjb3JyZWxhdG9yIFxcdTAwMjYgMHhmZmZmZmZmZlVMO1xcbi1cXHR1bnNpZ25lZCBpbnQgZnJlZV9pbmRleDtcXG4tXFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4tXFxuLVxcdGlmIChXQVJOX09OKHBvb2wgXFx1MDAzZT0gSUJNVkVUSF9OVU1fQlVGRl9QT09MUykgfHxcXG4tXFx0ICAgIFdBUk5fT04oaW5kZXggXFx1MDAzZT0gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpKSB7XFxuLVxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXdvcmspO1xcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XFxuK1xcdFxcdGlmICghYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5hY3RpdmUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0aWYgKGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2woXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0pKSB7XFxuK1xcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHRcXHQgICBcXFwidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29sICVkIGZvciBxdWV1ZSAlZCAoc2l6ZT0ldSwgY291bnQ9JXUpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBpLCBxdWV1ZSxcXG4rXFx0XFx0XFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5idWZmX3NpemUsXFxuK1xcdFxcdFxcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uc2l6ZSk7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYWN0aXZlID0gMDtcXG4rXFxuK1xcdFxcdFxcdC8qIEZyZWUgcG9vbHMgYWxsb2NhdGVkIHNvIGZhciBmb3IgdGhpcyBxdWV1ZSAqL1xcbitcXHRcXHRcXHR3aGlsZSAoLS1pIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0XFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYWN0aXZlKVxcbitcXHRcXHRcXHRcXHRcXHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVdW2ldKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRza2IgPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uc2tidWZmW2luZGV4XTtcXG4tXFx0aWYgKFdBUk5fT04oIXNrYikpIHtcXG4tXFx0XFx0c2NoZWR1bGVfd29yayhcXHUwMDI2YWRhcHRlci1cXHUwMDNld29yayk7XFxuLVxcdFxcdHJldHVybiAtRUZBVUxUO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMgLSBGcmVlIGJ1ZmZlciBwb29scyBmb3IgYSBzaW5nbGUgcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlOiBxdWV1ZSBpbmRleFxcbisgKlxcbisgKiBGcmVlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9xdWV1ZV9idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGludCBxdWV1ZSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4rXFx0XFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV07XFxuK1xcbitcXHRcXHQvKiBGcmVlIHBvb2wgaWYgaXQgaGFzIGFsbG9jYXRlZCBtZW1vcnksIHJlZ2FyZGxlc3Mgb2YgYWN0aXZlIGZsYWcuXFxuK1xcdFxcdCAqIFBvb2xzIG1heSBoYXZlIG1lbW9yeSBhbGxvY2F0ZWQgYnV0IG5vdCBtYXJrZWQgYWN0aXZlIGR1cmluZ1xcbitcXHRcXHQgKiBxdWV1ZSBzY2FsZS11cCwgc28gd2UgbXVzdCBjaGVjayBmb3IgYWN0dWFsIGFsbG9jYXRpb25zLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHBvb2wtXFx1MDAzZWZyZWVfbWFwIHx8IHBvb2wtXFx1MDAzZWRtYV9hZGRyIHx8IHBvb2wtXFx1MDAzZXNrYnVmZilcXG4rXFx0XFx0XFx0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsIHBvb2wpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29scyAtIEFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlc1xcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKlxcbisgKiBJbml0aWFsaXplcyBwb29sIG1ldGFkYXRhIGZvciBxdWV1ZXMgMS1OIGZyb20gcXVldWUgMCBzZXR0aW5ncyxcXG4rICogdGhlbiBhbGxvY2F0ZXMgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzIHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24uXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cXHUwMDNlbmV0ZGV2O1xcbitcXHRpbnQgaSwgcSwgcmM7XFxuK1xcbitcXHQvKiBJbml0aWFsaXplIHBvb2wgbWV0YWRhdGEgZm9yIHF1ZXVlcyAxLTE1IGZyb20gcXVldWUgMCBzZXR0aW5ncyAqL1xcbitcXHRmb3IgKHEgPSAxOyBxIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgcSsrKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpzcmMgPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldO1xcbitcXHRcXHRcXHRzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKmRzdCA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcV1baV07XFxuK1xcbitcXHRcXHRcXHRkc3QtXFx1MDAzZXNpemUgPSBzcmMtXFx1MDAzZXNpemU7XFxuK1xcdFxcdFxcdGRzdC1cXHUwMDNlaW5kZXggPSBzcmMtXFx1MDAzZWluZGV4O1xcbitcXHRcXHRcXHRkc3QtXFx1MDAzZWJ1ZmZfc2l6ZSA9IHNyYy1cXHUwMDNlYnVmZl9zaXplO1xcbitcXHRcXHRcXHRkc3QtXFx1MDAzZXRocmVzaG9sZCA9IHNyYy1cXHUwMDNldGhyZXNob2xkO1xcbitcXHRcXHRcXHRkc3QtXFx1MDAzZWFjdGl2ZSA9IHNyYy1cXHUwMDNlYWN0aXZlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEFsbG9jYXRlIGFjdHVhbCBidWZmZXJzIGZvciBhbGwgcXVldWVzICovXFxuK1xcdGZvciAocSA9IDA7IHEgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBxKyspIHtcXG4rXFx0XFx0cmMgPSBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcXG4rXFx0XFx0aWYgKHJjKSB7XFxuK1xcdFxcdFxcdC8qIEZyZWUgcG9vbHMgZm9yIGFsbCBwcmV2aW91cyBxdWV1ZXMgKi9cXG4rXFx0XFx0XFx0d2hpbGUgKC0tcSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRcXHRpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHEpO1xcbitcXHRcXHRcXHRyZXR1cm4gcmM7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJhbGxvY2F0ZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxcXFxuXFxcIixcXG4rXFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyAtIEZyZWUgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqXFxuKyAqIEZyZWVzIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlcyB1c2luZyB0aGUgaGVscGVyIGZ1bmN0aW9uLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdGludCBxO1xcbitcXG4rXFx0LyogRnJlZSBidWZmZXIgcG9vbHMgZm9yIGFsbCBxdWV1ZXMgKi9cXG4rXFx0Zm9yIChxID0gMDsgcSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IHErKylcXG4rXFx0XFx0aWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcXG4rXFxuK1xcdG5ldGRldl9kYmcoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LCBcXFwiZnJlZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxcXFxuXFxcIixcXG4rXFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZSAtIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYSBzaW5nbGUgUlggcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gYWxsb2NhdGVcXG4rICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgUlggcXVldWUgZW50cmllc1xcbisgKlxcbisgKiBBbGxvY2F0ZXMgYnVmZmVyIGxpc3QsIFJYIHF1ZXVlLCBhbmQgcGVyLXF1ZXVlIGJ1ZmZlciBwb29scyBmb3Igb25lIHF1ZXVlLlxcbisgKiBVc2VkIGR1cmluZyBpbmNyZW1lbnRhbCBzY2FsZS11cCB3aXRob3V0IGFmZmVjdGluZyBleGlzdGluZyBxdWV1ZXMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnRcXG4raWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2lkeCxcXG4rXFx0XFx0XFx0ICAgICAgaW50IHJ4cV9lbnRyaWVzKVxcbit7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2VkZXY7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdGludCBpLCByYyA9IC1FTk9NRU07XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGxpc3QgZm9yIHF1ZXVlICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pZHgpO1xcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0fVxcbitcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4gPVxcbitcXHRcXHRzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllcztcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID1cXG4rXFx0XFx0ZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sXFxuK1xcdFxcdFxcdFxcdCAgIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2RtYSxcXG4rXFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyKSB7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwidW5hYmxlIHRvIGFsbG9jYXRlIFJYIHF1ZXVlIGZvciBxdWV1ZSAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgcXVldWVfaWR4KTtcXG4rXFx0XFx0Z290byBvdXRfZnJlZV9idWZsaXN0O1xcbitcXHR9XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSA9XFxuK1xcdFxcdGRtYV9tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdLFxcbitcXHRcXHRcXHQgICAgICAgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xcbitcXHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSkpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgcXVldWVfaWR4KTtcXG4rXFx0XFx0Z290byBvdXRfZnJlZV9yeHE7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2lkeF1baV0uc2l6ZSA9XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5zaXplO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5idWZmX3NpemUgPVxcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS50aHJlc2hvbGQgPVxcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0udGhyZXNob2xkO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5hY3RpdmUgPVxcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlO1xcbitcXHR9XFxuK1xcbitcXHRyYyA9IGlibXZldGhfYWxsb2NfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHF1ZXVlX2lkeCk7XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHRuZXRkZXZfZXJyKG5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgcG9vbHMgZm9yIHF1ZXVlICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pZHgpO1xcbitcXHRcXHRnb3RvIG91dF91bm1hcF9idWZsaXN0O1xcbitcXHR9XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLmluZGV4ID0gMDtcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5udW1fc2xvdHMgPSByeHFfZW50cmllcztcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS50b2dnbGUgPSAxO1xcbitcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5yZXBsZW5pc2hfbG9jayk7XFxuK1xcbitcXHRuZXRkZXZfZGJnKG5ldGRldixcXG4rXFx0XFx0ICAgXFxcIkFsbG9jYXRlZCBxdWV1ZSAlZDogYnVmZmVyX2xpc3QgQCAlcCAoRE1BOiAweCVsbHgpLCByeF9xdWV1ZSBAICVwIChETUE6IDB4JWxseCksICVkIGVudHJpZXNcXFxcblxcXCIsXFxuK1xcdFxcdCAgIHF1ZXVlX2lkeCwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdLFxcbitcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdLFxcbitcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIsXFxuK1xcdFxcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEsXFxuK1xcdFxcdCAgIHJ4cV9lbnRyaWVzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rb3V0X3VubWFwX2J1Zmxpc3Q6XFxuK1xcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSxcXG4rXFx0XFx0XFx0IDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcXG4rXFx0YWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPSAwO1xcbitvdXRfZnJlZV9yeHE6XFxuK1xcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sXFxuK1xcdFxcdFxcdCAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyLFxcbitcXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hKTtcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID0gTlVMTDtcXG4rb3V0X2ZyZWVfYnVmbGlzdDpcXG4rXFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSk7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSA9IE5VTEw7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUgLSBGcmVlIHJlc291cmNlcyBmb3IgYSBzaW5nbGUgUlggcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gZnJlZVxcbisgKlxcbisgKiBGcmVlcyBidWZmZXIgbGlzdCwgUlggcXVldWUsIGFuZCBwZXItcXVldWUgYnVmZmVyIHBvb2xzIGZvciBvbmUgcXVldWUuXFxuKyAqIFVzZWQgZHVyaW5nIGluY3JlbWVudGFsIHNjYWxlLWRvd24gd2l0aG91dCBhZmZlY3RpbmcgcmVtYWluaW5nIHF1ZXVlcy5cXG4rICovXFxuK3N0YXRpYyB2b2lkXFxuK2libXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2lkeClcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNlZGV2O1xcbitcXG4rXFx0aWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxdWV1ZV9pZHgpO1xcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdKSB7XFxuK1xcdFxcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSxcXG4rXFx0XFx0XFx0XFx0IDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPSAwO1xcbiBcXHR9XFxuIFxcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyKSB7XFxuK1xcdFxcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sXFxuK1xcdFxcdFxcdFxcdCAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyLFxcbitcXHRcXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hKTtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyID0gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSkge1xcbitcXHRcXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdKTtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdID0gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2RiZyhhZGFwdGVyLVxcdTAwM2VuZXRkZXYsIFxcXCJGcmVlZCBxdWV1ZSAlZCByZXNvdXJjZXNcXFxcblxcXCIsIHF1ZXVlX2lkeCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sIC0gcmVtb3ZlIGEgYnVmZmVyIGZyb20gYSBwb29sXFxuKyAqIEBhZGFwdGVyOiBhZGFwdGVyIGluc3RhbmNlXFxuKyAqIEBjb3JyZWxhdG9yOiBpZGVudGlmaWVzIHBvb2wgYW5kIGluZGV4XFxuKyAqIEByZXVzZTogd2hldGhlciB0byByZXVzZSBidWZmZXJcXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAqICUwICAgICAgIC0gc3VjY2Vzc1xcbisgKiAqICUtRUlOVkFMIC0gY29ycmVsYXRvciBtYXBzIHRvIHBvb2wgb3IgaW5kZXggb3V0IG9mIHJhbmdlXFxuKyAqICogJS1FRkFVTFQgLSBwb29sIGFuZCBpbmRleCBtYXAgdG8gbnVsbCBza2JcXG4rICovXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1NjQgY29ycmVsYXRvciwgaW50IHF1ZXVlX2luZGV4LFxcbitcXHRcXHRcXHRcXHRcXHQgICBib29sIHJldXNlKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBwb29sICA9IGNvcnJlbGF0b3IgXFx1MDAzZVxcdTAwM2UgMzI7XFxuK1xcdHVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgXFx1MDAyNiAweGZmZmZmZmZmVUw7XFxuK1xcdHVuc2lnbmVkIGludCBmcmVlX2luZGV4O1xcbitcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xcbitcXG4rXFx0aWYgKCFpYm12ZXRoX3J4cV9jb3JyZWxhdG9yX3ZhbGlkKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCBjb3JyZWxhdG9yKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRza2IgPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF07XFxuK1xcdGlmICghc2tiKVxcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFxuIFxcdC8qIGlmIHdlIGFyZSBnb2luZyB0byByZXVzZSB0aGUgYnVmZmVyIHRoZW4ga2VlcCB0aGUgcG9pbnRlcnMgYXJvdW5kXFxuIFxcdCAqIGJ1dCBtYXJrIGluZGV4IGFzIGF2YWlsYWJsZS4gcmVwbGVuaXNoIHdpbGwgc2VlIHRoZSBza2IgcG9pbnRlciBhbmRcXG4gXFx0ICogYXNzdW1lIGl0IGlzIHRvIGJlIHJlY3ljbGVkLlxcbkBAIC00ODIsNDIgKzEzMTgsNDEgQEAgc3RhdGljIGludCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXFxuIFxcdFxcdC8qIHJlbW92ZSB0aGUgc2tiIHBvaW50ZXIgdG8gbWFyayBmcmVlLiBhY3R1YWwgZnJlZWluZyBpcyBkb25lXFxuIFxcdFxcdCAqIGJ5IHVwcGVyIGxldmVsIG5ldHdvcmtpbmcgYWZ0ZXIgZ3JvX3JlY2VpdmVcXG4gXFx0XFx0ICovXFxuLVxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdID0gTlVMTDtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5za2J1ZmZbaW5kZXhdID0gTlVMTDtcXG4gXFxuIFxcdFxcdGRtYV91bm1hcF9zaW5nbGUoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZWRldixcXG4tXFx0XFx0XFx0XFx0IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5kbWFfYWRkcltpbmRleF0sXFxuLVxcdFxcdFxcdFxcdCBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplLFxcbitcXHRcXHRcXHRcXHQgYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5kbWFfYWRkcltpbmRleF0sXFxuK1xcdFxcdFxcdFxcdCBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmJ1ZmZfc2l6ZSxcXG4gXFx0XFx0XFx0XFx0IERNQV9GUk9NX0RFVklDRSk7XFxuIFxcdH1cXG4gXFxuLVxcdGZyZWVfaW5kZXggPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXg7XFxuLVxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleCsrO1xcbi1cXHRpZiAoYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4IFxcdTAwM2U9XFxuLVxcdCAgICBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZSlcXG4tXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4ID0gMDtcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmZyZWVfbWFwW2ZyZWVfaW5kZXhdID0gaW5kZXg7XFxuK1xcdGZyZWVfaW5kZXggPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4O1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4Kys7XFxuK1xcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4IFxcdTAwM2U9XFxuK1xcdCAgICBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNpemUpXFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0ucHJvZHVjZXJfaW5kZXggPSAwO1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLmZyZWVfbWFwW2ZyZWVfaW5kZXhdID0gaW5kZXg7XFxuIFxcbiBcXHRtYigpO1xcbiBcXG4tXFx0YXRvbWljX2RlYyhcXHUwMDI2KGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5hdmFpbGFibGUpKTtcXG4rXFx0YXRvbWljX2RlYyhcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5hdmFpbGFibGUpO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIC8qIGdldCB0aGUgY3VycmVudCBidWZmZXIgb24gdGhlIHJ4IHF1ZXVlICovXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGludCBxdWV1ZV9pbmRleClcXG4ge1xcbi1cXHR1NjQgY29ycmVsYXRvciA9IGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci1cXHUwMDNlcnhfcXVldWUuaW5kZXhdLmNvcnJlbGF0b3I7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF07XFxuK1xcdHU2NCBjb3JyZWxhdG9yID0gcnhxLVxcdTAwM2VxdWV1ZV9hZGRyW3J4cS1cXHUwMDNlaW5kZXhdLmNvcnJlbGF0b3I7XFxuIFxcdHVuc2lnbmVkIGludCBwb29sID0gY29ycmVsYXRvciBcXHUwMDNlXFx1MDAzZSAzMjtcXG4gXFx0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcXHUwMDI2IDB4ZmZmZmZmZmZVTDtcXG4gXFxuLVxcdGlmIChXQVJOX09OKHBvb2wgXFx1MDAzZT0gSUJNVkVUSF9OVU1fQlVGRl9QT09MUykgfHxcXG4tXFx0ICAgIFdBUk5fT04oaW5kZXggXFx1MDAzZT0gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpKSB7XFxuLVxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXdvcmspO1xcbitcXHRpZiAoIWlibXZldGhfcnhxX2NvcnJlbGF0b3JfdmFsaWQoYWRhcHRlciwgcXVldWVfaW5kZXgsIGNvcnJlbGF0b3IpKVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0fVxcbiBcXG4tXFx0cmV0dXJuIGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdO1xcbitcXHRyZXR1cm4gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5za2J1ZmZbaW5kZXhdO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtNTMzLDI0ICsxMzY4LDY5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhXFxuICAqICogb3RoZXIgLSBub24temVybyByZXR1cm4gZnJvbSBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sXFxuICAqL1xcbiBzdGF0aWMgaW50IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXFxuLVxcdFxcdFxcdFxcdCAgICAgIGJvb2wgcmV1c2UpXFxuK1xcdFxcdFxcdFxcdCAgICAgIGludCBxdWV1ZV9pbmRleCwgYm9vbCByZXVzZSlcXG4ge1xcbitcXHRzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdO1xcbiBcXHR1NjQgY29yO1xcbiBcXHRpbnQgcmM7XFxuIFxcbi1cXHRjb3IgPSBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLmluZGV4XS5jb3JyZWxhdG9yO1xcbi1cXHRyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCByZXVzZSk7XFxuLVxcdGlmICh1bmxpa2VseShyYykpXFxuK1xcdGNvciA9IHJ4cS1cXHUwMDNlcXVldWVfYWRkcltyeHEtXFx1MDAzZWluZGV4XS5jb3JyZWxhdG9yO1xcbitcXHRyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCBxdWV1ZV9pbmRleCwgcmV1c2UpO1xcbitcXHRpZiAodW5saWtlbHkocmMpKSB7XFxuK1xcdFxcdGlmIChyYyA9PSAtRUlOVkFMIHx8IHJjID09IC1FRkFVTFQpXFxuK1xcdFxcdFxcdGdvdG8gYWR2YW5jZTtcXG4gXFx0XFx0cmV0dXJuIHJjO1xcbi1cXG4tXFx0aWYgKCsrYWRhcHRlci1cXHUwMDNlcnhfcXVldWUuaW5kZXggPT0gYWRhcHRlci1cXHUwMDNlcnhfcXVldWUubnVtX3Nsb3RzKSB7XFxuLVxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLmluZGV4ID0gMDtcXG4tXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUudG9nZ2xlID0gIWFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnRvZ2dsZTtcXG4gXFx0fVxcbiBcXG4rYWR2YW5jZTpcXG4rXFx0aWJtdmV0aF9yeHFfYWR2YW5jZShyeHEpO1xcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBpYm12ZXRoX2RyYWluX3J4X3F1ZXVlIC0gRHJhaW4gcGVuZGluZyBidWZmZXJzIGZyb20gYW4gUlggcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlX2luZGV4OiBRdWV1ZSBpbmRleCB0byBkcmFpblxcbisgKlxcbisgKiBSZWN5Y2xlcyBhbGwgcGVuZGluZyBidWZmZXJzIGJhY2sgdG8gdGhlIHBlci1xdWV1ZSBidWZmZXIgcG9vbHMuXFxuKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggTkFQSSBkaXNhYmxlZCBmb3IgdGhpcyBxdWV1ZS5cXG4rICpcXG4rICogUmV0dXJuOiBOdW1iZXIgb2YgYnVmZmVycyBkcmFpbmVkXFxuKyAqL1xcbitzdGF0aWMgaW50XFxuK2libXZldGhfZHJhaW5fcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4KVxcbit7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdGludCBkcmFpbmVkID0gMDtcXG4rXFx0aW50IGxpbWl0ID0gYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdLm51bV9zbG90cztcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJEcmFpbmluZyBSWCBxdWV1ZSAlZCAobGltaXQ6ICVkIHNsb3RzKVxcXFxuXFxcIixcXG4rXFx0XFx0ICAgcXVldWVfaW5kZXgsIGxpbWl0KTtcXG4rXFxuK1xcdHdoaWxlIChkcmFpbmVkIFxcdTAwM2MgbGltaXQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSkge1xcbitcXHRcXHRyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCB0cnVlKTtcXG4rXFx0XFx0aWYgKHJjKSB7XFxuK1xcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHRcXHQgICBcXFwiRmFpbGVkIHRvIGhhcnZlc3QgYnVmZmVyIGZyb20gcXVldWUgJWQgZHVyaW5nIGRyYWluOiAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgcXVldWVfaW5kZXgsIHJjKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZHJhaW5lZCsrO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZHJhaW5lZCBcXHUwMDNlIDApXFxuK1xcdFxcdG5ldGRldl9kYmcobmV0ZGV2LCBcXFwiRHJhaW5lZCAlZCBidWZmZXIocykgZnJvbSBSWCBxdWV1ZSAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgZHJhaW5lZCwgcXVldWVfaW5kZXgpO1xcbitcXHRlbHNlXFxuK1xcdFxcdG5ldGRldl9kYmcobmV0ZGV2LCBcXFwiTm8gYnVmZmVycyB0byBkcmFpbiBmcm9tIFJYIHF1ZXVlICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pbmRleCk7XFxuK1xcbitcXHRyZXR1cm4gZHJhaW5lZDtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX3R4X2x0YihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KVxcbiB7XFxuIFxcdGRtYV91bm1hcF9zaW5nbGUoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZWRldiwgYWRhcHRlci1cXHUwMDNldHhfbHRiX2RtYVtpZHhdLFxcbkBAIC01NzQsMjQ2ICsxNDU0LDY2OCBAQCBzdGF0aWMgaW50IGlibXZldGhfYWxsb2NhdGVfdHhfbHRiKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZHgpXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgRE1BX1RPX0RFVklDRSk7XFxuIFxcdGlmIChkbWFfbWFwcGluZ19lcnJvcihcXHUwMDI2YWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNlZGV2LCBhZGFwdGVyLVxcdTAwM2V0eF9sdGJfZG1hW2lkeF0pKSB7XFxuIFxcdFxcdG5ldGRldl9lcnIoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbi1cXHRcXHRcXHQgICBcXFwidW5hYmxlIHRvIERNQSBtYXAgdHggbG9uZyB0ZXJtIGJ1ZmZlclxcXFxuXFxcIik7XFxuLVxcdFxcdGtmcmVlKGFkYXB0ZXItXFx1MDAzZXR4X2x0Yl9wdHJbaWR4XSk7XFxuLVxcdFxcdGFkYXB0ZXItXFx1MDAzZXR4X2x0Yl9wdHJbaWR4XSA9IE5VTEw7XFxuLVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRcXHRcXHQgICBcXFwidW5hYmxlIHRvIERNQSBtYXAgdHggbG9uZyB0ZXJtIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcdFxcdGtmcmVlKGFkYXB0ZXItXFx1MDAzZXR4X2x0Yl9wdHJbaWR4XSk7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXR4X2x0Yl9wdHJbaWR4XSA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfYWxsb2NfdHhfcmVzb3VyY2VzIC0gQWxsb2NhdGUgVFggcmVzb3VyY2VzIGZvciBhbGwgcXVldWVzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqXFxuKyAqIEFsbG9jYXRlcyBUWCBMb25nIFRlcm0gQnVmZmVycyAoTFRCcykgZm9yIGFsbCBUWCBxdWV1ZXMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmVcXG4rICovXFxuK3N0YXRpYyBpbnRcXG4raWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcXG4re1xcbitcXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cXHUwMDNlbmV0ZGV2O1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuZXRkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XFxuK1xcdFxcdGlmIChpYm12ZXRoX2FsbG9jYXRlX3R4X2x0YihhZGFwdGVyLCBpKSlcXG4rXFx0XFx0XFx0Z290byBlcnJfZnJlZV9sdGJzO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2Vycl9mcmVlX2x0YnM6XFxuK1xcdHdoaWxlICgtLWkgXFx1MDAzZT0gMClcXG4rXFx0XFx0aWJtdmV0aF9mcmVlX3R4X2x0YihhZGFwdGVyLCBpKTtcXG4rXFx0cmV0dXJuIC1FTk9NRU07XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzIC0gRnJlZSBUWCByZXNvdXJjZXMgZm9yIGFsbCBxdWV1ZXNcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICpcXG4rICogRnJlZXMgVFggTG9uZyBUZXJtIEJ1ZmZlcnMgKExUQnMpIGZvciBhbGwgVFggcXVldWVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWRcXG4raWJtdmV0aF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5ldGRldi1cXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpKyspXFxuK1xcdFxcdGlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLFxcbitcXHRcXHRcXHRcXHRcXHR1NjQgbWFjX2FkZHJlc3MpXFxuK3tcXG4rXFx0aW50IHJjLCB0cnlfYWdhaW4gPSAxO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQWZ0ZXIgYSBrZXhlYyB0aGUgYWRhcHRlciB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIG91ciBhdHRlbXB0IHRvXFxuK1xcdCAqIG9wZW4gaXQgd2lsbCBmYWlsLiBTbyBpZiB3ZSBnZXQgYSBmYWlsdXJlIHdlIGZyZWUgdGhlIGFkYXB0ZXIgYW5kXFxuK1xcdCAqIHRyeSBhZ2FpbiwgYnV0IG9ubHkgb25jZS5cXG4rXFx0ICovXFxuK3JldHJ5OlxcbitcXHQvKiBJbiBtdWx0aS1xdWV1ZSBtb2RlLCBvYnRhaW4gYSBxdWV1ZSBoYW5kbGUgZm9yIHF1ZXVlIDAgc28gYWxsIFJYXFxuK1xcdCAqIHF1ZXVlcyBjYW4gdXNlIHRoZSBzYW1lIHBlci1xdWV1ZSBidWZmZXIgaHlwZXJjYWxscy5cXG4rXFx0ICovXFxuK1xcdGlmIChhZGFwdGVyLVxcdTAwM2VtdWx0aV9xdWV1ZSkge1xcbitcXHRcXHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUoYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbMF0sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdHJ4cV9kZXNjLmRlc2MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2RtYSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0bWFjX2FkZHJlc3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VxdWV1ZV9oYW5kbGVbMF0pO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hWzBdLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgcnhxX2Rlc2MuZGVzYyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2RtYSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIG1hY19hZGRyZXNzKTtcXG4rXFx0fVxcbitcXHRhZGFwdGVyLVxcdTAwM2VoY2FsbF9zdGF0cy5yZWdfbGFuKys7XFxuK1xcbitcXHRpZiAocmMgIT0gSF9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IHRyeV9hZ2Fpbikge1xcbitcXHRcXHRkbyB7XFxuK1xcdFxcdFxcdHJjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyk7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWhjYWxsX3N0YXRzLmZyZWVfbGFuKys7XFxuK1xcdFxcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKHJjKSB8fCAocmMgPT0gSF9CVVNZKSk7XFxuK1xcbitcXHRcXHR0cnlfYWdhaW4gPSAwO1xcbitcXHRcXHRnb3RvIHJldHJ5O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlIC0gUmVnaXN0ZXIgc3Vib3JkaW5hdGUgcXVldWUgd2l0aCBoeXBlcnZpc29yXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXFxuKyAqIEByeHFfZGVzYzogUmVjZWl2ZSBxdWV1ZSBkZXNjcmlwdG9yXFxuKyAqIEBxdWV1ZV9pbmRleDogUlggcXVldWUgaW5kZXggKDEuLk4gZm9yIHN1Ym9yZGluYXRlIHF1ZXVlcylcXG4rICpcXG4rICogUmVnaXN0ZXJzIGEgc3Vib3JkaW5hdGUgcmVjZWl2ZSBxdWV1ZSB1c2luZyBIX1JFR19MT0dJQ0FMX0xBTl9RVUVVRS5cXG4rICogT24gc3VjY2Vzcywgc3RvcmVzIHRoZSBxdWV1ZSBoYW5kbGUgYW5kIHZpcnR1YWwgSVJRIGluIHRoZSBhZGFwdGVyLlxcbisgKiBSZXRyaWVzIG9uY2UgaWYgcmVnaXN0cmF0aW9uIGZhaWxzIChoYW5kbGVzIGtleGVjIGNhc2UpLiAgSWYgSVJRIG1hcHBpbmdcXG4rICogZmFpbHMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGh5cGVydmlzb3IgcmVnaXN0cmF0aW9uLCB0aGUgcXVldWUgaXMgZnJlZWRcXG4rICogYmVmb3JlIHJldHVybmluZy5cXG4rICpcXG4rICogUmV0dXJuOiBIX1NVQ0NFU1Mgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gSVJRIG1hcHBpbmcgZmFpbHVyZSxcXG4rICogICAgICAgICBoeXBlcnZpc29yIGVycm9yIGNvZGUgb3RoZXJ3aXNlXFxuKyAqL1xcbitzdGF0aWMgaW50XFxuK2libXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0ICAgdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYyxcXG4rXFx0XFx0XFx0XFx0ICAgaW50IHF1ZXVlX2luZGV4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaGFuZGxlLCBod2lycTtcXG4rXFx0dW5zaWduZWQgaW50IHZpcnE7XFxuK1xcdGxvbmcgbHBhcl9yYztcXG4rXFx0aW50IHRyeV9hZ2FpbiA9IDE7XFxuK1xcbityZXRyeTpcXG4rXFx0bmV0ZGV2X2RiZyhhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdCAgIFxcXCJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHF1ZXVlICVkOiB1bml0X2FkZHI9MHgleCBidWZmZXJfbGlzdF9kbWE9MHglbGx4IHJ4cV9kZXNjPTB4JWxseFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLFxcbitcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4cV9kZXNjLmRlc2MpO1xcbitcXG4rXFx0bHBhcl9yYyA9IGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICBhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLFxcbitcXHRcXHRcXHRcXHRcXHQgIHJ4cV9kZXNjLmRlc2MsIFxcdTAwMjZoYW5kbGUsIFxcdTAwMjZod2lycSk7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZWhjYWxsX3N0YXRzLnJlZ19sYW5fcXVldWUrKztcXG4rXFxuK1xcdGlmIChscGFyX3JjID09IEhfU1VDQ0VTUykge1xcbitcXHRcXHR2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3aXJxKTtcXG4rXFx0XFx0aWYgKCF2aXJxKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZnJlZV9yYztcXG4rXFxuK1xcdFxcdFxcdG5ldGRldl9lcnIoYWRhcHRlci1cXHUwMDNlbmV0ZGV2LFxcbitcXHRcXHRcXHRcXHQgICBcXFwiRmFpbGVkIHRvIG1hcCBJUlEgZm9yIHF1ZXVlICVkIChod2lycT0lbHUpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBxdWV1ZV9pbmRleCwgaHdpcnEpO1xcbitcXHRcXHRcXHRkbyB7XFxuK1xcdFxcdFxcdFxcdGZyZWVfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBoYW5kbGUpO1xcbitcXHRcXHRcXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShmcmVlX3JjKSB8fCAoZnJlZV9yYyA9PSBIX0JVU1kpKTtcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlaGNhbGxfc3RhdHMuZnJlZV9sYW5fcXVldWUrKztcXG4rXFx0XFx0XFx0aWYgKGZyZWVfcmMgIT0gSF9TVUNDRVNTKVxcbitcXHRcXHRcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFxcImhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZSBmYWlsZWQgZm9yIHF1ZXVlICVkIGFmdGVyIElSUSBtYXAgZmFpbHVyZTogcmM9MHglbHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHF1ZXVlX2luZGV4LCBmcmVlX3JjKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0gPSBoYW5kbGU7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pbmRleF0gPSB2aXJxO1xcbitcXG4rXFx0XFx0bmV0ZGV2X2RiZyhhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdFxcdCAgIFxcXCJxdWV1ZSAlZCByZWdpc3RlcmVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0sXFxuK1xcdFxcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pbmRleF0pO1xcbitcXHRcXHRyZXR1cm4gSF9TVUNDRVNTO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobHBhcl9yYyA9PSBIX0ZVTkNUSU9OKSB7XFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VtdWx0aV9xdWV1ZSkge1xcbitcXHRcXHRcXHRuZXRkZXZfaW5mbyhhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdCAgICBcXFwiTXVsdGkgcXVldWUgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGZpcm13YXJlLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIHF1ZXVlXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlbXVsdGlfcXVldWUgPSAwO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0XFx0XFx0ICAgXFxcIlVuZXhwZWN0ZWQgSF9GVU5DVElPTiBmb3IgcXVldWUgJWQgcmVnaXN0cmF0aW9uIChNUSBtb2RlIGFscmVhZHkgZGlzYWJsZWQpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBxdWV1ZV9pbmRleCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIGxwYXJfcmM7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0cnlfYWdhaW4pIHtcXG4rXFx0XFx0dHJ5X2FnYWluID0gMDtcXG4rXFx0XFx0Z290byByZXRyeTtcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2VycihhZGFwdGVyLVxcdTAwM2VuZXRkZXYsXFxuK1xcdFxcdCAgIFxcXCJoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSBmYWlsZWQgd2l0aCAlbGQgYWZ0ZXIgcmV0cnlcXFxcblxcXCIsXFxuK1xcdFxcdCAgIGxwYXJfcmMpO1xcbitcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0ICAgXFxcInF1ZXVlICVkIHBhcmFtczogdW5pdF9hZGRyPTB4JXggYnVmZmVyX2xpc3RfZG1hPTB4JWxseCByeHFfZGVzYz0weCVsbHhcXFxcblxcXCIsXFxuK1xcdFxcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MsXFxuK1xcdFxcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2luZGV4XSxcXG4rXFx0XFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZGVzYy5kZXNjKTtcXG4rXFxuK1xcdHJldHVybiBscGFyX3JjO1xcbit9XFxuK1xcbisvKipcXG4rICogaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUgLSBSZWdpc3RlciBvbmUgc3Vib3JkaW5hdGUgUlggcXVldWVcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gcmVnaXN0ZXIgKDEuLk4pXFxuKyAqIEBtYWNfYWRkcmVzczogTUFDIGFkZHJlc3MgKHVudXNlZDsgcmVzZXJ2ZWQgZm9yIEFQSSBzeW1tZXRyeSlcXG4rICpcXG4rICogQnVpbGRzIHRoZSBxdWV1ZSBkZXNjcmlwdG9yIGFuZCByZWdpc3RlcnMgd2l0aCB0aGUgaHlwZXJ2aXNvciB2aWFcXG4rICogaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSgpLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAcXVldWVfaWR4IGlzIGludmFsaWQsIC1FSU8gb24gZmFpbHVyZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxcbitcXHRcXHRcXHRcXHQgaW50IHF1ZXVlX2lkeCwgdTY0IG1hY19hZGRyZXNzKVxcbit7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2M7XFxuK1xcdGxvbmcgbHBhcl9yYztcXG4rXFxuK1xcdCh2b2lkKW1hY19hZGRyZXNzO1xcbitcXG4rXFx0aWYgKFdBUk5fT04ocXVldWVfaWR4IFxcdTAwM2MgMSB8fCBxdWV1ZV9pZHggXFx1MDAzZT0gSUJNVkVUSF9NQVhfUlhfUVVFVUVTKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfFxcbitcXHRcXHRcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW47XFxuK1xcdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWE7XFxuK1xcbitcXHRscGFyX3JjID0gaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLCByeHFfZGVzYyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBxdWV1ZV9pZHgpO1xcbitcXHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJGYWlsZWQgdG8gcmVnaXN0ZXIgcXVldWUgJWQ6IHJjPTB4JWx4XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pZHgsIGxwYXJfcmMpO1xcbitcXHRcXHRyZXR1cm4gLUVJTztcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJSZWdpc3RlcmVkIHF1ZXVlICVkIHdpdGggaGFuZGxlIDB4JWxseFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgcXVldWVfaWR4LCBhZGFwdGVyLVxcdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUgLSBEZXJlZ2lzdGVyIG9uZSBzdWJvcmRpbmF0ZSBSWCBxdWV1ZVxcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBkZXJlZ2lzdGVyICgxLi5OKVxcbisgKlxcbisgKiBEZXJlZ2lzdGVycyBhIHNpbmdsZSBxdWV1ZSB2aWEgSF9GUkVFX0xPR0lDQUxfTEFOX1FVRVVFIGFuZCBkaXNwb3Nlc1xcbisgKiB0aGUgSVJRIG1hcHBpbmcgZm9yIHN1Ym9yZGluYXRlIHF1ZXVlcy4gUXVldWUgMCBpcyBmcmVlZCBvbmx5IHRocm91Z2hcXG4rICogaWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoKSAoSF9GUkVFX0xPR0lDQUxfTEFOKS5cXG4rICovXFxuK3N0YXRpYyB2b2lkXFxuK2libXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0ICAgaW50IHF1ZXVlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XFxuK1xcbitcXHRpZiAoIWFkYXB0ZXItXFx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSk7XFxuK1xcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpO1xcbitcXG4rXFx0YWRhcHRlci1cXHUwMDNlaGNhbGxfc3RhdHMuZnJlZV9sYW5fcXVldWUrKztcXG4rXFxuK1xcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xcbitcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcImhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZSBmYWlsZWQgZm9yIHF1ZXVlICVkOiByYz0weCVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgcXVldWVfaWR4LCBscGFyX3JjKTtcXG4rXFx0fVxcbitcXG4rXFx0YWRhcHRlci1cXHUwMDNlcXVldWVfaGFuZGxlW3F1ZXVlX2lkeF0gPSAwO1xcbitcXG4rXFx0aWYgKHF1ZXVlX2lkeCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0pIHtcXG4rXFx0XFx0aXJxX2Rpc3Bvc2VfbWFwcGluZyhhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSk7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdID0gMDtcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2RiZyhhZGFwdGVyLVxcdTAwM2VuZXRkZXYsIFxcXCJEZXJlZ2lzdGVyZWQgcXVldWUgJWRcXFxcblxcXCIsIHF1ZXVlX2lkeCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwgLSBSZXNpemUgUlggcXVldWUgY291bnQgaW5jcmVtZW50YWxseVxcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxcbisgKiBAbmV3X2NvdW50OiBUYXJnZXQgbnVtYmVyIG9mIFJYIHF1ZXVlc1xcbisgKiBAcnhxX2VudHJpZXM6IE51bWJlciBvZiBlbnRyaWVzIHBlciBSWCBxdWV1ZVxcbisgKlxcbisgKiBBZGRzIG9yIHJlbW92ZXMgUlggcXVldWVzIHdpdGhvdXQgdGVhcmluZyBkb3duIHRoZSBlbnRpcmUgYWRhcHRlci5cXG4rICogQWN0aXZlIHF1ZXVlcyBjb250aW51ZSByZWNlaXZpbmcgZHVyaW5nIHNjYWxlLXVwOyBzY2FsZS1kb3duIGRyYWluc1xcbisgKiBleGNlc3MgcXVldWVzIGJlZm9yZSBkZXJlZ2lzdGVyaW5nIHRoZW0gd2l0aCB0aGUgaHlwZXJ2aXNvci5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxcbisgKi9cXG4rc3RhdGljIGludFxcbitpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBpbnQgbmV3X2NvdW50LCBpbnQgcnhxX2VudHJpZXMpXFxuK3tcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4rXFx0dTY0IG1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LVxcdTAwM2VkZXZfYWRkcik7XFxuK1xcdGludCBvbGRfY291bnQgPSBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzO1xcbitcXHRpbnQgZmFpbGVkX3F1ZXVlO1xcbitcXHRpbnQgcmMsIGk7XFxuK1xcbitcXHRpZiAob2xkX2NvdW50ID09IG5ld19jb3VudCkge1xcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcIlJYIHF1ZXVlIGNvdW50IHVuY2hhbmdlZCAoJWQpLCBub3RoaW5nIHRvIGRvXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBvbGRfY291bnQpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG5ld19jb3VudCBcXHUwMDNjIDEgfHwgbmV3X2NvdW50IFxcdTAwM2UgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKSB7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwiSW52YWxpZCBSWCBxdWV1ZSBjb3VudCAlZCAobXVzdCBiZSAxLSVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgbmV3X2NvdW50LCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0bmV0ZGV2X2luZm8obmV0ZGV2LCBcXFwiSW5jcmVtZW50YWxseSByZXNpemluZyBSWCBxdWV1ZXM6ICVkIHRvICVkXFxcXG5cXFwiLFxcbitcXHRcXHQgICAgb2xkX2NvdW50LCBuZXdfY291bnQpO1xcbitcXG4rXFx0aWYgKG5ld19jb3VudCBcXHUwMDNlIG9sZF9jb3VudCkge1xcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcIlNjYWxlLXVwOiBhZGRpbmcgcXVldWVzICVkLSVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBvbGRfY291bnQsIG5ld19jb3VudCAtIDEpO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gb2xkX2NvdW50OyBpIFxcdTAwM2MgbmV3X2NvdW50OyBpKyspIHtcXG4rXFx0XFx0XFx0cmMgPSBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpLCByeHFfZW50cmllcyk7XFxuK1xcdFxcdFxcdGlmIChyYykge1xcbitcXHRcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcIkZhaWxlZCB0byBhbGxvY2F0ZSBxdWV1ZSAlZDogJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIGksIHJjKTtcXG4rXFx0XFx0XFx0XFx0Z290byBjbGVhbnVwX25ld19xdWV1ZXM7XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdHJjID0gaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgbWFjX2FkZHJlc3MpO1xcbitcXHRcXHRcXHRpZiAocmMpIHtcXG4rXFx0XFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJGYWlsZWQgdG8gcmVnaXN0ZXIgcXVldWUgJWQ6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpLCByYyk7XFxuK1xcdFxcdFxcdFxcdGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRyYyA9IGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0aWYgKHJjKSB7XFxuK1xcdFxcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHRcXHRcXHQgICBcXFwiRmFpbGVkIHRvIHNldHVwIElSUSBmb3IgcXVldWUgJWQ6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICBpLCByYyk7XFxuK1xcdFxcdFxcdFxcdGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcdFxcdFxcdFxcdGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRyYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0aWYgKHJjKSB7XFxuK1xcdFxcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHRcXHRcXHQgICBcXFwiRmFpbGVkIHRvIGVuYWJsZSBJUlEgZm9yIHF1ZXVlICVkOiAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgaSwgcmMpO1xcbitcXHRcXHRcXHRcXHRpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0XFx0aWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0XFx0aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcXG4rXFx0XFx0XFx0XFx0Z290byBjbGVhbnVwX25ld19xdWV1ZXM7XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdG5hcGlfZW5hYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG5ld19jb3VudDtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IG9sZF9jb3VudDsgaSBcXHUwMDNjIG5ld19jb3VudDsgaSsrKVxcbitcXHRcXHRcXHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpO1xcbitcXG4rXFx0XFx0cmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldGRldiwgbmV3X2NvdW50KTtcXG4rXFx0XFx0aWYgKHJjKSB7XFxuK1xcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwiRmFpbGVkIHRvIHNldCByZWFsIFJYIHF1ZXVlcyB0byAlZDogJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIG5ld19jb3VudCwgcmMpO1xcbitcXHRcXHRcXHRnb3RvIGNsZWFudXBfbmV3X3F1ZXVlcztcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcIlNjYWxlLWRvd246IHJlbW92aW5nIHF1ZXVlcyAlZC0lZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgbmV3X2NvdW50LCBvbGRfY291bnQgLSAxKTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcXHUwMDNjIG9sZF9jb3VudDsgaSsrKVxcbitcXHRcXHRcXHRuYXBpX2Rpc2FibGUoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbaV0pO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gbmV3X2NvdW50OyBpIFxcdTAwM2Mgb2xkX2NvdW50OyBpKyspXFxuK1xcdFxcdFxcdGlibXZldGhfZHJhaW5fcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcbitcXHRcXHRzeW5jaHJvbml6ZV9uZXQoKTtcXG4rXFxuK1xcdFxcdHJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIG5ld19jb3VudCk7XFxuK1xcdFxcdGlmIChyYykge1xcbitcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcIkZhaWxlZCB0byBzZXQgcmVhbCBSWCBxdWV1ZXMgdG8gJWQ6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBuZXdfY291bnQsIHJjKTtcXG4rXFx0XFx0XFx0Zm9yIChpID0gbmV3X2NvdW50OyBpIFxcdTAwM2Mgb2xkX2NvdW50OyBpKyspXFxuK1xcdFxcdFxcdFxcdG5hcGlfZW5hYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHJjO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKiBEaXNhYmxlIGh5cGVydmlzb3IgaW50ZXJydXB0cyBhbmQgd2FpdCBmb3IgaGFuZGxlcnMgdG8gY29tcGxldGVcXG4rXFx0XFx0ICogYmVmb3JlIHVwZGF0aW5nIG51bV9yeF9xdWV1ZXMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRmb3IgKGkgPSBuZXdfY291bnQ7IGkgXFx1MDAzYyBvbGRfY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHRpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRcXHRzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG5ld19jb3VudDtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcXHUwMDNjIG9sZF9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdFxcdGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRcXHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRcXHRpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdG5ldGRldl9pbmZvKG5ldGRldiwgXFxcIlN1Y2Nlc3NmdWxseSByZXNpemVkIHRvICVkIFJYIHF1ZXVlcyAoaW5jcmVtZW50YWwpXFxcXG5cXFwiLFxcbitcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XFxuK1xcbitcXHRpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9DTU8pKVxcbitcXHRcXHR2aW9fY21vX3NldF9kZXZfZGVzaXJlZChhZGFwdGVyLVxcdTAwM2V2ZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRpYm12ZXRoX2dldF9kZXNpcmVkX2RtYShhZGFwdGVyLVxcdTAwM2V2ZGV2KSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2NsZWFudXBfbmV3X3F1ZXVlczpcXG4rXFx0ZmFpbGVkX3F1ZXVlID0gaTtcXG4rXFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdCAgIFxcXCJTY2FsZS11cCBmYWlsZWQgYXQgcXVldWUgJWQsIGNsZWFuaW5nIHVwIHF1ZXVlcyAlZC0lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgZmFpbGVkX3F1ZXVlLCBvbGRfY291bnQsIGZhaWxlZF9xdWV1ZSAtIDEpO1xcbitcXHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXFx1MDAzYyBmYWlsZWRfcXVldWU7IGkrKylcXG4rXFx0XFx0bmFwaV9kaXNhYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpW2ldKTtcXG4rXFxuK1xcdGZvciAoaSA9IG9sZF9jb3VudDsgaSBcXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSsrKVxcbitcXHRcXHRpYm12ZXRoX2RyYWluX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xcbitcXG4rXFx0c3luY2hyb25pemVfbmV0KCk7XFxuK1xcbitcXHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXFx1MDAzYyBmYWlsZWRfcXVldWU7IGkrKykge1xcbitcXHRcXHRpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW2ldKTtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gb2xkX2NvdW50OyBpIFxcdTAwM2MgZmFpbGVkX3F1ZXVlOyBpKyspIHtcXG4rXFx0XFx0aWJtdmV0aF9jbGVhbnVwX3NpbmdsZV9yeF9pbnRlcnJ1cHQoYWRhcHRlciwgaSk7XFxuK1xcdFxcdGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcdFxcdGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XFxuK1xcdH1cXG4rXFx0YWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG9sZF9jb3VudDtcXG4rXFx0bmV0ZGV2X3dhcm4obmV0ZGV2LCBcXFwiS2VlcGluZyAlZCBxdWV1ZXMgYWZ0ZXIgc2NhbGUtdXAgZmFpbHVyZVxcXFxuXFxcIixcXG4rXFx0XFx0ICAgIG9sZF9jb3VudCk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfZnJlZV9hbGxfcXVldWVzIC0gRnJlZSBhbGwgUlggcXVldWVzIGF0IG9uY2VcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICpcXG4rICogVXNlcyBIX0ZSRUVfTE9HSUNBTF9MQU4gdG8gZnJlZSBhbGwgcXVldWVzIGluIG9uZSBoeXBlcmNhbGwuXFxuKyAqIFVzZWQgZHVyaW5nIGludGVyZmFjZSBjbG9zZSBhbmQgcmVnaXN0cmF0aW9uIGVycm9yIGNsZWFudXAuXFxuKyAqXFxuKyAqIENsZWFycyBxdWV1ZSBoYW5kbGVzIG9ubHk7IHF1ZXVlX2lycVtdIGlzIHJlbGVhc2VkIGJ5XFxuKyAqIGlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKCkgb24gY2xvc2UsIG9yIGJ5XFxuKyAqIGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoKSBvbiBwYXJ0aWFsIHJlZ2lzdGVyIGZhaWx1cmUuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYWxsX3F1ZXVlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRuZXRkZXZfZGJnKGFkYXB0ZXItXFx1MDAzZW5ldGRldiwgXFxcImZyZWVpbmcgYWxsIFJYIHF1ZXVlcyBhdCBvbmNlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGRvIHtcXG4rXFx0XFx0bHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MpO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VoY2FsbF9zdGF0cy5mcmVlX2xhbisrO1xcbitcXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcXG4rXFxuK1xcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xcbitcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcImhfZnJlZV9sb2dpY2FsX2xhbiBmYWlsZWQ6ICVsZFxcXFxuXFxcIiwgbHBhcl9yYyk7XFxuIFxcdH1cXG4gXFxuLVxcdHJldHVybiAwO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKVxcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VxdWV1ZV9oYW5kbGVbaV0gPSAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4tICAgICAgICB1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLCB1NjQgbWFjX2FkZHJlc3MpXFxuKy8qKlxcbisgKiBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyAtIFJlZ2lzdGVyIFJYIHF1ZXVlcyB3aXRoIGh5cGVydmlzb3JcXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcXG4rICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzcyBmb3IgZGV2aWNlIHJlZ2lzdHJhdGlvblxcbisgKlxcbisgKiBSZWdpc3RlcnMgcXVldWUgMCB2aWEgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbigpLCB0aGVuIHN1Ym9yZGluYXRlXFxuKyAqIHF1ZXVlcyAxLi5OIHdoZW4gbXVsdGktcXVldWUgbW9kZSBpcyBlbmFibGVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT05FVCBpZiBxdWV1ZSAwIHJlZ2lzdHJhdGlvbiBmYWlscywgLUVJTyBvblxcbisgKiAgICAgICAgIHN1Ym9yZGluYXRlIHF1ZXVlIHJlZ2lzdHJhdGlvbiBmYWlsdXJlXFxuKyAqL1xcbitzdGF0aWMgaW50XFxuK2libXZldGhfcmVnaXN0ZXJfcnhfcXVldWVzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBtYWNfYWRkcmVzcylcXG4ge1xcbi1cXHRpbnQgcmMsIHRyeV9hZ2FpbiA9IDE7XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVxcdTAwM2VuZXRkZXY7XFxuK1xcdHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcXG4rXFx0aW50IGksIHJjO1xcbiBcXG4tXFx0LypcXG4tXFx0ICogQWZ0ZXIgYSBrZXhlYyB0aGUgYWRhcHRlciB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIG91ciBhdHRlbXB0IHRvXFxuLVxcdCAqIG9wZW4gaXQgd2lsbCBmYWlsLiBTbyBpZiB3ZSBnZXQgYSBmYWlsdXJlIHdlIGZyZWUgdGhlIGFkYXB0ZXIgYW5kXFxuLVxcdCAqIHRyeSBhZ2FpbiwgYnV0IG9ubHkgb25jZS5cXG4tXFx0ICovXFxuLXJldHJ5Olxcbi1cXHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbi1cXHRcXHRcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCByeHFfZGVzYy5kZXNjLFxcbi1cXHRcXHRcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hLCBtYWNfYWRkcmVzcyk7XFxuK1xcdHJ4cV9kZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBJQk1WRVRIX0JVRl9WQUxJRCB8XFxuK1xcdFxcdFxcdFxcdCAgICBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9sZW47XFxuK1xcdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cXHUwMDNlcnhfcXVldWVbMF0ucXVldWVfZG1hO1xcbitcXHRhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbMF0gPSBuZXRkZXYtXFx1MDAzZWlycTtcXG4gXFxuLVxcdGlmIChyYyAhPSBIX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgdHJ5X2FnYWluKSB7XFxuLVxcdFxcdGRvIHtcXG4tXFx0XFx0XFx0cmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzKTtcXG4tXFx0XFx0fSB3aGlsZSAoSF9JU19MT05HX0JVU1kocmMpIHx8IChyYyA9PSBIX0JVU1kpKTtcXG4rXFx0cmMgPSBpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDApO1xcbitcXHRpZiAocmMgIT0gSF9TVUNDRVNTKVxcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcIkZhaWxlZCB0byBkaXNhYmxlIElSUSBmb3IgcXVldWUgMCBiZWZvcmUgcmVnaXN0cmF0aW9uLCByYz0lZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgcmMpO1xcbiBcXG4tXFx0XFx0dHJ5X2FnYWluID0gMDtcXG4tXFx0XFx0Z290byByZXRyeTtcXG4rXFx0bHBhcl9yYyA9IGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlciwgcnhxX2Rlc2MsIG1hY19hZGRyZXNzKTtcXG4rXFx0aWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwiaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQ6ICVsZFxcXFxuXFxcIiwgbHBhcl9yYyk7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHQgICBcXFwiYnVmZmVyIFRDRToweCVsbHggZmlsdGVyIFRDRToweCVsbHggcnhxIGRlc2M6MHglbGx4IE1BQzoweCVsbHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYVswXSxcXG4rXFx0XFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hLFxcbitcXHRcXHRcXHQgICByeHFfZGVzYy5kZXNjLCBtYWNfYWRkcmVzcyk7XFxuK1xcdFxcdHJldHVybiAtRU5PTkVUO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9PSAxIHx8ICFhZGFwdGVyLVxcdTAwM2VtdWx0aV9xdWV1ZSkge1xcbitcXHRcXHRuZXRkZXZfZGJnKG5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcInJlZ2lzdGVyZWQgMSBSWCBxdWV1ZSB3aXRoIGh5cGVydmlzb3IgKHNpbmdsZS1xdWV1ZSBtb2RlKVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcIlJlZ2lzdGVyaW5nICVkIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMS0lZClcXFxcblxcXCIsXFxuK1xcdFxcdCAgIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXMgLSAxLCBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzIC0gMSk7XFxuK1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XFxuK1xcdFxcdHJjID0gaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSwgbWFjX2FkZHJlc3MpO1xcbitcXHRcXHRpZiAocmMpIHtcXG4rXFx0XFx0XFx0aWYgKCFhZGFwdGVyLVxcdTAwM2VxdWV1ZV9oYW5kbGVbaV0gfHwgIWFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSkge1xcbitcXHRcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFxcIkludmFsaWQgaHlwZXJ2aXNvciByZXR1cm4gZm9yIHF1ZXVlICVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgaSwgYWRhcHRlci1cXHUwMDNlcXVldWVfaGFuZGxlW2ldLFxcbitcXHRcXHRcXHRcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbaV0pO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGdvdG8gZXJyX3VucmVnaXN0ZXI7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0bmV0ZGV2X2RiZyhuZXRkZXYsXFxuK1xcdFxcdCAgIFxcXCJyZWdpc3RlcmVkICVkIFJYIHF1ZXVlcyB3aXRoIGh5cGVydmlzb3IgKG11bHRpLXF1ZXVlIG1vZGUpXFxcXG5cXFwiLFxcbitcXHRcXHQgICBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyX3VucmVnaXN0ZXI6XFxuK1xcdGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7XFxuK1xcdGlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpO1xcbiBcXHRyZXR1cm4gcmM7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpXFxuIHtcXG4gXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XFxuLVxcdHU2NCBtYWNfYWRkcmVzcztcXG4rXFx0dTY0IG1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LVxcdTAwM2VkZXZfYWRkcik7XFxuIFxcdGludCByeHFfZW50cmllcyA9IDE7XFxuLVxcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcXG4gXFx0aW50IHJjO1xcbi1cXHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjO1xcbiBcXHRpbnQgaTtcXG4tXFx0c3RydWN0IGRldmljZSAqZGV2O1xcbiBcXG4gXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJvcGVuIHN0YXJ0aW5nXFxcXG5cXFwiKTtcXG4gXFxuLVxcdG5hcGlfZW5hYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpKTtcXG4tXFxuLVxcdGZvcihpID0gMDsgaSBcXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKylcXG4tXFx0XFx0cnhxX2VudHJpZXMgKz0gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLnNpemU7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspXFxuK1xcdFxcdHJ4cV9lbnRyaWVzICs9IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5zaXplO1xcbiBcXG4tXFx0cmMgPSAtRU5PTUVNO1xcbi1cXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuLVxcdGlmICghYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcikge1xcbi1cXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBhbGxvY2F0ZSBsaXN0IHBhZ2VzXFxcXG5cXFwiKTtcXG4rXFx0cmMgPSBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyhhZGFwdGVyKTtcXG4rXFx0aWYgKHJjKVxcbiBcXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0YWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkciA9ICh2b2lkKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIWFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2FkZHIpIHtcXG4tXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ1bmFibGUgdG8gYWxsb2NhdGUgZmlsdGVyIHBhZ2VzXFxcXG5cXFwiKTtcXG4tXFx0XFx0Z290byBvdXRfZnJlZV9idWZmZXJfbGlzdDtcXG4tXFx0fVxcbiBcXG4tXFx0ZGV2ID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZWRldjtcXG4rXFx0cmMgPSBpYm12ZXRoX2FsbG9jX2ZpbHRlcl9saXN0KGFkYXB0ZXIpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X2ZyZWVfcnhfcXN0YXRzO1xcbiBcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfbGVuID0gc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpICpcXG4tXFx0XFx0XFx0XFx0XFx0XFx0cnhxX2VudHJpZXM7XFxuLVxcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIgPVxcbi1cXHRcXHRkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9sZW4sXFxuLVxcdFxcdFxcdFxcdCAgIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9kbWEsIEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIWFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIpXFxuK1xcdHJjID0gaWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMoYWRhcHRlciwgcnhxX2VudHJpZXMpO1xcbitcXHRpZiAocmMpXFxuIFxcdFxcdGdvdG8gb3V0X2ZyZWVfZmlsdGVyX2xpc3Q7XFxuIFxcbi1cXHRhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsXFxuLVxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcXG4tXFx0aWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hKSkge1xcbi1cXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBtYXAgYnVmZmVyIGxpc3QgcGFnZXNcXFxcblxcXCIpO1xcbitcXHRyYyA9IGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIpO1xcbitcXHRpZiAocmMpXFxuIFxcdFxcdGdvdG8gb3V0X2ZyZWVfcXVldWVfbWVtO1xcbi1cXHR9XFxuIFxcbi1cXHRhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsXFxuLVxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZWZpbHRlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcXG4tXFx0aWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hKSkge1xcbi1cXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcInVuYWJsZSB0byBtYXAgZmlsdGVyIGxpc3QgcGFnZXNcXFxcblxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF91bm1hcF9idWZmZXJfbGlzdDtcXG4tXFx0fVxcbitcXHRyYyA9IGlibXZldGhfcmVnaXN0ZXJfcnhfcXVldWVzKGFkYXB0ZXIsIG1hY19hZGRyZXNzKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcXG4gXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuZXRkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XFxuLVxcdFxcdGlmIChpYm12ZXRoX2FsbG9jYXRlX3R4X2x0YihhZGFwdGVyLCBpKSlcXG4tXFx0XFx0XFx0Z290byBvdXRfZnJlZV90eF9sdGI7XFxuK1xcdHJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXMpO1xcbitcXHRpZiAocmMpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJmYWlsZWQgdG8gc2V0IG51bWJlciBvZiByeCBxdWV1ZXNcXFxcblxcXCIpO1xcbitcXHRcXHRnb3RvIG91dF91bnJlZ2lzdGVyX3F1ZXVlcztcXG4gXFx0fVxcbiBcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUuaW5kZXggPSAwO1xcbi1cXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5udW1fc2xvdHMgPSByeHFfZW50cmllcztcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUudG9nZ2xlID0gMTtcXG4tXFxuLVxcdG1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LVxcdTAwM2VkZXZfYWRkcik7XFxuLVxcbi1cXHRyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfFxcbi1cXHRcXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9sZW47XFxuLVxcdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfZG1hO1xcbi1cXG4tXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJidWZmZXIgbGlzdCBAIDB4JXBcXFxcblxcXCIsIGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIpO1xcbi1cXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcImZpbHRlciBsaXN0IEAgMHglcFxcXFxuXFxcIiwgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XFxuLVxcdG5ldGRldl9kYmcobmV0ZGV2LCBcXFwicmVjZWl2ZSBxICAgQCAweCVwXFxcXG5cXFwiLCBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyKTtcXG4tXFxuLVxcdGhfdmlvX3NpZ25hbChhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MsIFZJT19JUlFfRElTQUJMRSk7XFxuLVxcbi1cXHRscGFyX3JjID0gaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLCByeHFfZGVzYywgbWFjX2FkZHJlc3MpO1xcbi1cXG4tXFx0aWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7XFxuLVxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwiaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQgd2l0aCAlbGRcXFxcblxcXCIsXFxuLVxcdFxcdFxcdCAgIGxwYXJfcmMpO1xcbi1cXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcImJ1ZmZlciBUQ0U6MHglbGx4IGZpbHRlciBUQ0U6MHglbGx4IHJ4cSBcXFwiXFxuLVxcdFxcdFxcdCAgIFxcXCJkZXNjOjB4JWxseCBNQUM6MHglbGx4XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgIGFkYXB0ZXItXFx1MDAzZWJ1ZmZlcl9saXN0X2RtYSxcXG4tXFx0XFx0XFx0XFx0ICAgICBhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9kbWEsXFxuLVxcdFxcdFxcdFxcdCAgICAgcnhxX2Rlc2MuZGVzYyxcXG4tXFx0XFx0XFx0XFx0ICAgICBtYWNfYWRkcmVzcyk7XFxuLVxcdFxcdHJjID0gLUVOT05FVDtcXG4tXFx0XFx0Z290byBvdXRfdW5tYXBfZmlsdGVyX2xpc3Q7XFxuLVxcdH1cXG4rXFx0cmMgPSBpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoYWRhcHRlcik7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXRfdW5yZWdpc3Rlcl9xdWV1ZXM7XFxuIFxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XFxuLVxcdFxcdGlmICghYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdGlmIChpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0pKSB7XFxuLVxcdFxcdFxcdG5ldGRldl9lcnIobmV0ZGV2LCBcXFwidW5hYmxlIHRvIGFsbG9jIHBvb2xcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMDtcXG4tXFx0XFx0XFx0cmMgPSAtRU5PTUVNO1xcbi1cXHRcXHRcXHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXMgXFx1MDAzZSAxKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJpbml0aWFsIHJlcGxlbmlzaCBjeWNsZSBmb3IgcXVldWUgJWRcXFxcblxcXCIsIGkpO1xcbitcXHRcXHRcXHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpO1xcbiBcXHRcXHR9XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG5ldGRldl9kYmcobmV0ZGV2LCBcXFwiaW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcXFxcblxcXCIpO1xcbitcXHRcXHRpYm12ZXRoX2ludGVycnVwdChhZGFwdGVyLVxcdTAwM2VxdWV1ZV9pcnFbMF0sIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpWzBdKTtcXG4gXFx0fVxcbiBcXG4tXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJyZWdpc3RlcmluZyBpcnEgMHgleFxcXFxuXFxcIiwgbmV0ZGV2LVxcdTAwM2VpcnEpO1xcbi1cXHRyYyA9IHJlcXVlc3RfaXJxKG5ldGRldi1cXHUwMDNlaXJxLCBpYm12ZXRoX2ludGVycnVwdCwgMCwgbmV0ZGV2LVxcdTAwM2VuYW1lLFxcbi1cXHRcXHRcXHQgbmV0ZGV2KTtcXG4tXFx0aWYgKHJjICE9IDApIHtcXG4tXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ1bmFibGUgdG8gcmVxdWVzdCBpcnEgMHgleCwgcmMgJWRcXFxcblxcXCIsXFxuLVxcdFxcdFxcdCAgIG5ldGRldi1cXHUwMDNlaXJxLCByYyk7XFxuLVxcdFxcdGRvIHtcXG4tXFx0XFx0XFx0bHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MpO1xcbi1cXHRcXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcXG4tXFxuLVxcdFxcdGdvdG8gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzO1xcbi1cXHR9XFxuLVxcbi1cXHRyYyA9IC1FTk9NRU07XFxuK1xcdHJjID0gaWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXMoYWRhcHRlcik7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXRfY2xlYW51cF9yeF9pbnRlcnJ1cHRzO1xcbiBcXG4tXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJpbml0aWFsIHJlcGxlbmlzaCBjeWNsZVxcXFxuXFxcIik7XFxuLVxcdGlibXZldGhfaW50ZXJydXB0KG5ldGRldi1cXHUwMDNlaXJxLCBuZXRkZXYpO1xcbitcXHRyYyA9IGlibXZldGhfYWxsb2NfdHhfcXN0YXRzKGFkYXB0ZXIpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X2ZyZWVfdHhfcmVzb3VyY2VzO1xcbiBcXG4gXFx0bmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpO1xcbiBcXG4gXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJvcGVuIGNvbXBsZXRlXFxcXG5cXFwiKTtcXG4tXFxuIFxcdHJldHVybiAwO1xcbiBcXG4rb3V0X2NsZWFudXBfcnhfaW50ZXJydXB0czpcXG4rXFx0aWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMoYWRhcHRlcik7XFxuK291dF9mcmVlX3R4X3Jlc291cmNlczpcXG4rXFx0aWJtdmV0aF9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTtcXG4gb3V0X2ZyZWVfYnVmZmVyX3Bvb2xzOlxcbi1cXHR3aGlsZSAoLS1pIFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXFxuLVxcdFxcdFxcdGlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSk7XFxuLVxcdH1cXG4tb3V0X3VubWFwX2ZpbHRlcl9saXN0Olxcbi1cXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hLCA0MDk2LFxcbi1cXHRcXHRcXHQgRE1BX0JJRElSRUNUSU9OQUwpO1xcbi1cXG4tb3V0X2ZyZWVfdHhfbHRiOlxcbi1cXHR3aGlsZSAoLS1pIFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0aWJtdmV0aF9mcmVlX3R4X2x0YihhZGFwdGVyLCBpKTtcXG4tXFx0fVxcbi1cXG4tb3V0X3VubWFwX2J1ZmZlcl9saXN0Olxcbi1cXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCA0MDk2LFxcbi1cXHRcXHRcXHQgRE1BX0JJRElSRUNUSU9OQUwpO1xcbitcXHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIpO1xcbitvdXRfdW5yZWdpc3Rlcl9xdWV1ZXM6XFxuK1xcdGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7XFxuK1xcdGlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpO1xcbiBvdXRfZnJlZV9xdWV1ZV9tZW06XFxuLVxcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfbGVuLFxcbi1cXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIsXFxuLVxcdFxcdFxcdCAgYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfZG1hKTtcXG4rXFx0aWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKTtcXG4gb3V0X2ZyZWVfZmlsdGVyX2xpc3Q6XFxuLVxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVxcdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKTtcXG4tb3V0X2ZyZWVfYnVmZmVyX2xpc3Q6XFxuLVxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVxcdTAwM2VidWZmZXJfbGlzdF9hZGRyKTtcXG4rXFx0aWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KGFkYXB0ZXIpO1xcbitvdXRfZnJlZV9yeF9xc3RhdHM6XFxuK1xcdGlibXZldGhfZnJlZV9yeF9xc3RhdHMoYWRhcHRlcik7XFxuIG91dDpcXG4tXFx0bmFwaV9kaXNhYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpKTtcXG4gXFx0cmV0dXJuIHJjO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGlibXZldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldilcXG4ge1xcbiBcXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcXG4tXFx0c3RydWN0IGRldmljZSAqZGV2ID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZWRldjtcXG4tXFx0bG9uZyBscGFyX3JjO1xcbiBcXHRpbnQgaTtcXG4gXFxuIFxcdG5ldGRldl9kYmcobmV0ZGV2LCBcXFwiY2xvc2Ugc3RhcnRpbmdcXFxcblxcXCIpO1xcbiBcXG4tXFx0bmFwaV9kaXNhYmxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpKTtcXG4tXFxuIFxcdG5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpO1xcbiBcXG4tXFx0aF92aW9fc2lnbmFsKGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTtcXG4tXFxuLVxcdGRvIHtcXG4tXFx0XFx0bHBhcl9yYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MpO1xcbi1cXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcXG4tXFxuLVxcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xcbi1cXHRcXHRuZXRkZXZfZXJyKG5ldGRldiwgXFxcImhfZnJlZV9sb2dpY2FsX2xhbiBmYWlsZWQgd2l0aCAlbHgsIFxcXCJcXG4tXFx0XFx0XFx0ICAgXFxcImNvbnRpbnVpbmcgd2l0aCBjbG9zZVxcXFxuXFxcIiwgbHBhcl9yYyk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSkge1xcbitcXHRcXHRcXHRpYm12ZXRoX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIGkpO1xcbitcXHRcXHRcXHRzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci1cXHUwMDNlcXVldWVfaXJxW2ldKTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRmcmVlX2lycShuZXRkZXYtXFx1MDAzZWlycSwgbmV0ZGV2KTtcXG4tXFxuK1xcdGlibXZldGhfZnJlZV90eF9xc3RhdHMoYWRhcHRlcik7XFxuK1xcdGlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7XFxuK1xcdGlibXZldGhfY2xlYW51cF9yeF9pbnRlcnJ1cHRzKGFkYXB0ZXIpO1xcbiBcXHRpYm12ZXRoX3VwZGF0ZV9yeF9ub19idWZmZXIoYWRhcHRlcik7XFxuLVxcbi1cXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCA0MDk2LFxcbi1cXHRcXHRcXHQgRE1BX0JJRElSRUNUSU9OQUwpO1xcbi1cXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cXHUwMDNlYnVmZmVyX2xpc3RfYWRkcik7XFxuLVxcbi1cXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfZG1hLCA0MDk2LFxcbi1cXHRcXHRcXHQgRE1BX0JJRElSRUNUSU9OQUwpO1xcbi1cXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XFxuLVxcbi1cXHRkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbixcXG4tXFx0XFx0XFx0ICBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyLFxcbi1cXHRcXHRcXHQgIGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2RtYSk7XFxuLVxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxcbi1cXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcXG4tXFx0XFx0XFx0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldKTtcXG4tXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuZXRkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKVxcbi1cXHRcXHRpYm12ZXRoX2ZyZWVfdHhfbHRiKGFkYXB0ZXIsIGkpO1xcbitcXHRpYm12ZXRoX2ZyZWVfYWxsX3F1ZXVlcyhhZGFwdGVyKTtcXG4rXFx0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyhhZGFwdGVyKTtcXG4rXFx0aWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKTtcXG4rXFx0aWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KGFkYXB0ZXIpO1xcbitcXHRpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzKGFkYXB0ZXIpO1xcbiBcXG4gXFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJjbG9zZSBjb21wbGV0ZVxcXFxuXFxcIik7XFxuIFxcbkBAIC0xMDczLDIyICsyMzc1LDEwNyBAQCBzdGF0aWMgaW50IGlibXZldGhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuIFxcdHJldHVybiByYzEgPyByYzEgOiByYzI7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBpYm12ZXRoX2FnZ3JlZ2F0ZV9yeF9xc3RhdHMgLSBTdW0gcGVyLXF1ZXVlIFJYIHN0YXRzIGludG8gZ2xvYmFsc1xcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyXFxuKyAqXFxuKyAqIENvbGQgcGF0aCBvbmx5IChldGh0b29sKS4gS2VlcHMgbGVnYWN5IGdsb2JhbCBjb3VudGVycyBtZWFuaW5nZnVsIGZvclxcbisgKiB0b29scyB0aGF0IHJlYWQgdGhlIGFkYXB0ZXItbGV2ZWwgZmllbGRzIGluIGlibXZldGhfc3RhdHNbXS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxcbit7XFxuK1xcdHU2NCB0b3RhbF9pbnZhbGlkID0gMDtcXG4rXFx0dTY0IHRvdGFsX2xhcmdlID0gMDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoIWFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0cylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xcbitcXHRcXHR0b3RhbF9pbnZhbGlkICs9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tpXS5pbnZhbGlkX2J1ZmZlcnM7XFxuK1xcdFxcdHRvdGFsX2xhcmdlICs9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tpXS5sYXJnZV9wYWNrZXRzO1xcbitcXHR9XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9pbnZhbGlkX2J1ZmZlciA9IHRvdGFsX2ludmFsaWQ7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXJ4X2xhcmdlX3BhY2tldHMgPSB0b3RhbF9sYXJnZTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGlibXZldGhfYWdncmVnYXRlX3R4X3FzdGF0cyAtIFN1bSBwZXItcXVldWUgVFggc3RhdHMgaW50byBnbG9iYWxzXFxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXJcXG4rICpcXG4rICogQ29sZCBwYXRoIG9ubHkgKGV0aHRvb2wpLiBLZWVwcyBsZWdhY3kgZ2xvYmFsIGNvdW50ZXJzIG1lYW5pbmdmdWwgZm9yXFxuKyAqIHRvb2xzIHRoYXQgcmVhZCB0aGUgYWRhcHRlci1sZXZlbCBmaWVsZHMgaW4gaWJtdmV0aF9zdGF0c1tdLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9hZ2dyZWdhdGVfdHhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXFxuK3tcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4rXFx0dTY0IHRvdGFsX2xhcmdlID0gMDtcXG4rXFx0dTY0IHRvdGFsX3NlbmRfZmFpbGVkID0gMDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoIWFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0cylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5ldGRldi1cXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0dG90YWxfbGFyZ2UgKz0gYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW2ldLmxhcmdlX3BhY2tldHM7XFxuK1xcdFxcdHRvdGFsX3NlbmRfZmFpbGVkICs9IGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1tpXS5zZW5kX2ZhaWx1cmVzO1xcbitcXHR9XFxuK1xcbitcXHRhZGFwdGVyLVxcdTAwM2V0eF9sYXJnZV9wYWNrZXRzID0gdG90YWxfbGFyZ2U7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXR4X3NlbmRfZmFpbGVkID0gdG90YWxfc2VuZF9mYWlsZWQ7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIGlibXZldGhfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpXFxuIHtcXG4rXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XFxuK1xcdHU4ICpwID0gZGF0YTtcXG4gXFx0aW50IGk7XFxuIFxcbiBcXHRpZiAoc3RyaW5nc2V0ICE9IEVUSF9TU19TVEFUUylcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7IGkrKywgZGF0YSArPSBFVEhfR1NUUklOR19MRU4pXFxuLVxcdFxcdG1lbWNweShkYXRhLCBpYm12ZXRoX3N0YXRzW2ldLm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOyBpKyspIHtcXG4rXFx0XFx0bWVtY3B5KHAsIGlibXZldGhfc3RhdHNbaV0ubmFtZSwgRVRIX0dTVFJJTkdfTEVOKTtcXG4rXFx0XFx0cCArPSBFVEhfR1NUUklOR19MRU47XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwicnglZF9wYWNrZXRzXFxcIiwgaSk7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInJ4JWRfYnl0ZXNcXFwiLCBpKTtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwicnglZF9pbnRlcnJ1cHRzXFxcIiwgaSk7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInJ4JWRfcG9sbHNcXFwiLCBpKTtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwicnglZF9sYXJnZV9wYWNrZXRzXFxcIiwgaSk7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInJ4JWRfaW52YWxpZF9idWZmZXJzXFxcIiwgaSk7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInJ4JWRfbm9fYnVmZmVyX2Ryb3BzXFxcIiwgaSk7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInR4JWRfcGFja2V0c1xcXCIsIGkpO1xcbitcXHRcXHRldGh0b29sX3NwcmludGYoXFx1MDAyNnAsIFxcXCJ0eCVkX2J5dGVzXFxcIiwgaSk7XFxuK1xcdFxcdGV0aHRvb2xfc3ByaW50ZihcXHUwMDI2cCwgXFxcInR4JWRfbGFyZ2VfcGFja2V0c1xcXCIsIGkpO1xcbitcXHRcXHRldGh0b29sX3NwcmludGYoXFx1MDAyNnAsIFxcXCJ0eCVkX2Ryb3BwZWRfcGFja2V0c1xcXCIsIGkpO1xcbitcXHRcXHRldGh0b29sX3NwcmludGYoXFx1MDAyNnAsIFxcXCJ0eCVkX3NlbmRfZmFpbHVyZXNcXFwiLCBpKTtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwidHglZF9jaGVja3N1bV9vZmZsb2FkXFxcIiwgaSk7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwicG9vbCVkX3NpemVcXFwiLCBpKTtcXG4rXFx0XFx0ZXRodG9vbF9zcHJpbnRmKFxcdTAwMjZwLCBcXFwicG9vbCVkX2FjdGl2ZVxcXCIsIGkpO1xcbitcXHRcXHRldGh0b29sX3NwcmludGYoXFx1MDAyNnAsIFxcXCJwb29sJWRfYXZhaWxhYmxlXFxcIiwgaSk7XFxuK1xcdH1cXG4gfVxcbiBcXG4gc3RhdGljIGludCBpYm12ZXRoX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KVxcbiB7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xcbitcXG4gXFx0c3dpdGNoIChzc2V0KSB7XFxuIFxcdGNhc2UgRVRIX1NTX1NUQVRTOlxcbi1cXHRcXHRyZXR1cm4gQVJSQVlfU0laRShpYm12ZXRoX3N0YXRzKTtcXG4rXFx0XFx0cmV0dXJuIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cykgK1xcbitcXHRcXHQgICAgICAgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyAqIElCTVZFVEhfTlVNX1JYX1FTVEFUUyArXFxuK1xcdFxcdCAgICAgICBkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlcyAqIElCTVZFVEhfTlVNX1RYX1FTVEFUUyArXFxuK1xcdFxcdCAgICAgICBJQk1WRVRIX05VTV9CVUZGX1BPT0xTICogMztcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiBcXHR9XFxuQEAgLTEwOTcsNDAgKzI0ODQsMTMxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldClcXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbiBcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSlcXG4ge1xcbi1cXHRpbnQgaTtcXG4gXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XFxuK1xcdGludCBpLCBqO1xcbitcXG4rXFx0aWJtdmV0aF9hZ2dyZWdhdGVfcnhfcXN0YXRzKGFkYXB0ZXIpO1xcbitcXHRpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoYWRhcHRlcik7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShpYm12ZXRoX3N0YXRzKTsgaSsrKVxcbiBcXHRcXHRkYXRhW2ldID0gSUJNVkVUSF9HRVRfU1RBVChhZGFwdGVyLCBpYm12ZXRoX3N0YXRzW2ldLm9mZnNldCk7XFxuK1xcbitcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgaisrKSB7XFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHMpIHtcXG4rXFx0XFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW2pdLnBhY2tldHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tqXS5ieXRlcztcXG4rXFx0XFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW2pdLmludGVycnVwdHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tqXS5wb2xscztcXG4rXFx0XFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW2pdLmxhcmdlX3BhY2tldHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tqXS5pbnZhbGlkX2J1ZmZlcnM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tqXS5ub19idWZmZXJfZHJvcHM7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGkgKz0gSUJNVkVUSF9OVU1fUlhfUVNUQVRTO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaisrKSB7XFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHMpIHtcXG4rXFx0XFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW2pdLnBhY2tldHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1tqXS5ieXRlcztcXG4rXFx0XFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW2pdLmxhcmdlX3BhY2tldHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1tqXS5kcm9wcGVkX3BhY2tldHM7XFxuK1xcdFxcdFxcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1tqXS5zZW5kX2ZhaWx1cmVzO1xcbitcXHRcXHRcXHRkYXRhW2krK10gPSBhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHNbal0uY2hlY2tzdW1fb2ZmbG9hZDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0aSArPSBJQk1WRVRIX05VTV9UWF9RU1RBVFM7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGorKykge1xcbitcXHRcXHRkYXRhW2krK10gPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1bal0uc2l6ZTtcXG4rXFx0XFx0ZGF0YVtpKytdID0gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sWzBdW2pdLmFjdGl2ZTtcXG4rXFx0XFx0ZGF0YVtpKytdID0gYXRvbWljX3JlYWQoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtqXS5hdmFpbGFibGUpO1xcbitcXHR9XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGlibXZldGhfZ2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXFxuIFxcdFxcdFxcdFxcdCBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hhbm5lbHMpXFxuIHtcXG4rXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XFxuK1xcbiBcXHRjaGFubmVscy1cXHUwMDNlbWF4X3R4ID0gaWJtdmV0aF9yZWFsX21heF90eF9xdWV1ZXMoKTtcXG4gXFx0Y2hhbm5lbHMtXFx1MDAzZXR4X2NvdW50ID0gbmV0ZGV2LVxcdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7XFxuIFxcbi1cXHRjaGFubmVscy1cXHUwMDNlbWF4X3J4ID0gbmV0ZGV2LVxcdTAwM2VyZWFsX251bV9yeF9xdWV1ZXM7XFxuLVxcdGNoYW5uZWxzLVxcdTAwM2VyeF9jb3VudCA9IG5ldGRldi1cXHUwMDNlcmVhbF9udW1fcnhfcXVldWVzO1xcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNlbXVsdGlfcXVldWUpXFxuK1xcdFxcdGNoYW5uZWxzLVxcdTAwM2VtYXhfcnggPSBJQk1WRVRIX01BWF9SWF9RVUVVRVM7XFxuK1xcdGVsc2VcXG4rXFx0XFx0Y2hhbm5lbHMtXFx1MDAzZW1heF9yeCA9IDE7XFxuK1xcdGNoYW5uZWxzLVxcdTAwM2VyeF9jb3VudCA9IGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gXFx0XFx0XFx0XFx0c3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoYW5uZWxzKVxcbiB7XFxuIFxcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xcbi1cXHR1bnNpZ25lZCBpbnQgb2xkID0gbmV0ZGV2LVxcdTAwM2VyZWFsX251bV90eF9xdWV1ZXMsXFxuLVxcdFxcdCAgICAgZ29hbCA9IGNoYW5uZWxzLVxcdTAwM2V0eF9jb3VudDtcXG4rXFx0dW5zaWduZWQgaW50IG9sZF9yeCA9IGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7XFxuK1xcdHVuc2lnbmVkIGludCBnb2FsX3J4ID0gY2hhbm5lbHMtXFx1MDAzZXJ4X2NvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQgb2xkID0gbmV0ZGV2LVxcdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7XFxuK1xcdHVuc2lnbmVkIGludCBnb2FsID0gY2hhbm5lbHMtXFx1MDAzZXR4X2NvdW50O1xcbitcXHRpbnQgcnhxX2VudHJpZXMgPSBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVswXS5udW1fc2xvdHM7XFxuIFxcdGludCByYywgaTtcXG4gXFxuIFxcdC8qIElmIG5kb19vcGVuIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0IHRoZW4gZG9uJ3QgYWxsb2NhdGUsIGp1c3Qgc2V0XFxuIFxcdCAqIGRlc2lyZWQgbmV0ZGV2X3F1ZXVlJ3MgYW5kIHJldHVyblxcbiBcXHQgKi9cXG4tXFx0aWYgKCEobmV0ZGV2LVxcdTAwM2VmbGFncyBcXHUwMDI2IElGRl9VUCkpXFxuK1xcdGlmICghKG5ldGRldi1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJRkZfVVApKSB7XFxuK1xcdFxcdGlmIChnb2FsX3J4IFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiAhYWRhcHRlci1cXHUwMDNlbXVsdGlfcXVldWUpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdCAgIFxcXCJDYW5ub3QgcmVzaXplIHRvICV1IFJYIHF1ZXVlczogbXVsdGktcXVldWUgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGZpcm13YXJlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBnb2FsX3J4KTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoZ29hbF9yeCBcXHUwMDNjIDEgfHwgZ29hbF9yeCBcXHUwMDNlIElCTVZFVEhfTUFYX1JYX1FVRVVFUykge1xcbitcXHRcXHRcXHRuZXRkZXZfZXJyKG5ldGRldixcXG4rXFx0XFx0XFx0XFx0ICAgXFxcIkludmFsaWQgUlggcXVldWUgY291bnQgJXUgKG11c3QgYmUgMS0lZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIGdvYWxfcngsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKiBTdGFzaCBkZXNpcmVkIFJYIGNvdW50OyBvcGVuKCkgcHVibGlzaGVzIGl0IHZpYVxcbitcXHRcXHQgKiBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKCkgYWZ0ZXIgcXVldWUgcmVnaXN0cmF0aW9uLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGdvYWxfcnggIT0gYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcylcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IGdvYWxfcng7XFxuK1xcbiBcXHRcXHRyZXR1cm4gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXRkZXYsIGdvYWwpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZ29hbF9yeCBcXHUwMDNlIDEgXFx1MDAyNlxcdTAwMjYgIWFkYXB0ZXItXFx1MDAzZW11bHRpX3F1ZXVlKSB7XFxuK1xcdFxcdG5ldGRldl9lcnIobmV0ZGV2LFxcbitcXHRcXHRcXHQgICBcXFwiQ2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgZ29hbF9yeCk7XFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdvYWxfcnggXFx1MDAzYyAxIHx8IGdvYWxfcnggXFx1MDAzZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdFxcdCAgIFxcXCJJbnZhbGlkIFJYIHF1ZXVlIGNvdW50ICV1IChtdXN0IGJlIDEtJWQpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBnb2FsX3J4LCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdvYWxfcnggIT0gb2xkX3J4KSB7XFxuK1xcdFxcdHJjID0gaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsKGFkYXB0ZXIsIGdvYWxfcngsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcnhxX2VudHJpZXMpO1xcbitcXHRcXHRpZiAocmMpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJGYWlsZWQgdG8gcmVzaXplIFJYIHF1ZXVlczogJWRcXFxcblxcXCIsIHJjKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHJjO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4gXFxuIFxcdC8qIFdlIGhhdmUgSUJNVkVUSF9NQVhfUVVFVUVTIG5ldGRldl9xdWV1ZSdzIGFsbG9jYXRlZFxcbiBcXHQgKiBidXQgd2UgbWF5IG5lZWQgdG8gYWxsb2MvZnJlZSB0aGUgbHRiJ3MuXFxuIFxcdCAqL1xcbitcXHRpZiAoZ29hbCA9PSBvbGQpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4gXFx0bmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7XFxuIFxcbiBcXHQvKiBBbGxvY2F0ZSBhbnkgcXVldWUgdGhhdCB3ZSBuZWVkICovXFxuQEAgLTExNjQsNyArMjY0Miw3IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gXFxuIFxcdG5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhuZXRkZXYpO1xcbiBcXG4tXFx0cmV0dXJuIHJjO1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7XFxuQEAgLTEyMDksMTIgKzI2ODcsMTUgQEAgc3RhdGljIGludCBpYm12ZXRoX3NlbmQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcdH1cXG4gXFxuK1xcdGFkYXB0ZXItXFx1MDAzZWhjYWxsX3N0YXRzLnNlbmRfbGFuKys7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHN0cnVjdCBza19idWZmICpza2IsXFxuLVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KVxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcXG4rXFx0XFx0XFx0XFx0XFx0IGludCBxdWV1ZV9udW0pXFxuIHtcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4gXFx0c3RydWN0IGV0aGhkciAqZXRoZXJfaGVhZGVyO1xcbiBcXHRpbnQgcmV0ID0gMDtcXG4gXFxuQEAgLTEyMjIsNyArMjcwMyw4IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gXFxuIFxcdGlmIChldGhlcl9hZGRyX2VxdWFsKGV0aGVyX2hlYWRlci1cXHUwMDNlaF9kZXN0LCBuZXRkZXYtXFx1MDAzZWRldl9hZGRyKSkge1xcbiBcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcInZldGggZG9lc24ndCBzdXBwb3J0IGxvb3BiYWNrIHBhY2tldHMsIGRyb3BwaW5nIHBhY2tldC5cXFxcblxcXCIpO1xcbi1cXHRcXHRuZXRkZXYtXFx1MDAzZXN0YXRzLnR4X2Ryb3BwZWQrKztcXG4rXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0cylcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uZHJvcHBlZF9wYWNrZXRzKys7XFxuIFxcdFxcdHJldCA9IC1FT1BOT1RTVVBQO1xcbiBcXHR9XFxuIFxcbkBAIC0xMjM4LDcgKzI3MjAsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXFxuIFxcdGludCBpLCBxdWV1ZV9udW0gPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTtcXG4gXFx0dW5zaWduZWQgbG9uZyBtc3MgPSAwO1xcbiBcXG4tXFx0aWYgKGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHNrYiwgbmV0ZGV2KSlcXG4rXFx0aWYgKGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHNrYiwgYWRhcHRlciwgcXVldWVfbnVtKSlcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdC8qIHZldGggY2FuJ3QgY2hlY2tzdW0gb2ZmbG9hZCBVRFAgKi9cXG4gXFx0aWYgKHNrYi1cXHUwMDNlaXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgXFx1MDAyNlxcdTAwMjZcXG5AQCAtMTI0OSw3ICsyNzMxLDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHQgICAgc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkge1xcbiBcXG4gXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJ0eDogZmFpbGVkIHRvIGNoZWNrc3VtIHBhY2tldFxcXFxuXFxcIik7XFxuLVxcdFxcdG5ldGRldi1cXHUwMDNlc3RhdHMudHhfZHJvcHBlZCsrO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMrKztcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTEyNjEsNiArMjc0Myw4IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gXFxuIFxcdFxcdGRlc2NfZmxhZ3MgfD0gKElCTVZFVEhfQlVGX05PX0NTVU0gfCBJQk1WRVRIX0JVRl9DU1VNX0dPT0QpO1xcbiBcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uY2hlY2tzdW1fb2ZmbG9hZCsrO1xcbitcXG4gXFx0XFx0LyogTmVlZCB0byB6ZXJvIG91dCB0aGUgY2hlY2tzdW0gKi9cXG4gXFx0XFx0YnVmWzBdID0gMDtcXG4gXFx0XFx0YnVmWzFdID0gMDtcXG5AQCAtMTI3Miw3ICsyNzU2LDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRpZiAoc2tiLVxcdTAwM2VpcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCBcXHUwMDI2XFx1MDAyNiBza2JfaXNfZ3NvKHNrYikpIHtcXG4gXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZWZ3X2xhcmdlX3NlbmRfc3VwcG9ydCkge1xcbiBcXHRcXHRcXHRtc3MgPSAodW5zaWduZWQgbG9uZylza2Jfc2hpbmZvKHNrYiktXFx1MDAzZWdzb19zaXplO1xcbi1cXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2V0eF9sYXJnZV9wYWNrZXRzKys7XFxuK1xcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmxhcmdlX3BhY2tldHMrKztcXG4gXFx0XFx0fSBlbHNlIGlmICghc2tiX2lzX2dzb192Nihza2IpKSB7XFxuIFxcdFxcdFxcdC8qIFB1dCAtMSBpbiB0aGUgSVAgY2hlY2tzdW0gdG8gdGVsbCBwaHlwIGl0XFxuIFxcdFxcdFxcdCAqIGlzIGEgbGFyZ2VzZW5kIHBhY2tldC4gUHV0IHRoZSBtc3MgaW5cXG5AQCAtMTI4MSw3ICsyNzY1LDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRcXHRcXHRpcF9oZHIoc2tiKS1cXHUwMDNlY2hlY2sgPSAweGZmZmY7XFxuIFxcdFxcdFxcdHRjcF9oZHIoc2tiKS1cXHUwMDNlY2hlY2sgPVxcbiBcXHRcXHRcXHRcXHRjcHVfdG9fYmUxNihza2Jfc2hpbmZvKHNrYiktXFx1MDAzZWdzb19zaXplKTtcXG4tXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNldHhfbGFyZ2VfcGFja2V0cysrO1xcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5sYXJnZV9wYWNrZXRzKys7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG5AQCAtMTI4OSw3ICsyNzczLDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRpZiAodW5saWtlbHkoc2tiLVxcdTAwM2VsZW4gXFx1MDAzZSBhZGFwdGVyLVxcdTAwM2V0eF9sdGJfc2l6ZSkpIHtcXG4gXFx0XFx0bmV0ZGV2X2VycihhZGFwdGVyLVxcdTAwM2VuZXRkZXYsIFxcXCJ0eDogcGFja2V0IHNpemUgKCV1KSBleGNlZWRzIGx0YiAoJXUpXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHQgICBza2ItXFx1MDAzZWxlbiwgYWRhcHRlci1cXHUwMDNldHhfbHRiX3NpemUpO1xcbi1cXHRcXHRuZXRkZXYtXFx1MDAzZXN0YXRzLnR4X2Ryb3BwZWQrKztcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uZHJvcHBlZF9wYWNrZXRzKys7XFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcdG1lbWNweShhZGFwdGVyLVxcdTAwM2V0eF9sdGJfcHRyW3F1ZXVlX251bV0sIHNrYi1cXHUwMDNlZGF0YSwgc2tiX2hlYWRsZW4oc2tiKSk7XFxuQEAgLTEzMDYsNyArMjc5MCw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gXFx0aWYgKHVubGlrZWx5KHRvdGFsX2J5dGVzICE9IHNrYi1cXHUwMDNlbGVuKSkge1xcbiBcXHRcXHRuZXRkZXZfZXJyKGFkYXB0ZXItXFx1MDAzZW5ldGRldiwgXFxcInR4OiBpbmNvcnJlY3QgcGFja2V0IGxlbiBjb3BpZWQgaW50byBsdGIgKCV1ICE9ICV1KVxcXFxuXFxcIixcXG4gXFx0XFx0XFx0ICAgc2tiLVxcdTAwM2VsZW4sIHRvdGFsX2J5dGVzKTtcXG4tXFx0XFx0bmV0ZGV2LVxcdTAwM2VzdGF0cy50eF9kcm9wcGVkKys7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cysrO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXHRkZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBkZXNjX2ZsYWdzIHwgc2tiLVxcdTAwM2VsZW47XFxuQEAgLTEzMTUsMTEgKzI3OTksMTEgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRkbWFfd21iKCk7XFxuIFxcbiBcXHRpZiAoaWJtdmV0aF9zZW5kKGFkYXB0ZXIsIGRlc2MuZGVzYywgbXNzKSkge1xcbi1cXHRcXHRhZGFwdGVyLVxcdTAwM2V0eF9zZW5kX2ZhaWxlZCsrO1xcbi1cXHRcXHRuZXRkZXYtXFx1MDAzZXN0YXRzLnR4X2Ryb3BwZWQrKztcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uc2VuZF9mYWlsdXJlcysrO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMrKztcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0bmV0ZGV2LVxcdTAwM2VzdGF0cy50eF9wYWNrZXRzKys7XFxuLVxcdFxcdG5ldGRldi1cXHUwMDNlc3RhdHMudHhfYnl0ZXMgKz0gc2tiLVxcdTAwM2VsZW47XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLnBhY2tldHMrKztcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uYnl0ZXMgKz0gc2tiLVxcdTAwM2VsZW47XFxuIFxcdH1cXG4gXFxuIG91dDpcXG5AQCAtMTQ0NywzNiArMjkzMSw2OSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3J4X2NzdW1faGVscGVyKHN0cnVjdCBza19idWZmICpza2IsXFxuIFxcbiBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXFxuIHtcXG4tXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9XFxuLVxcdFxcdFxcdGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyLCBuYXBpKTtcXG4tXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXFx1MDAzZW5ldGRldjtcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktXFx1MDAzZWRldjtcXG4rXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XFxuIFxcdGludCBmcmFtZXNfcHJvY2Vzc2VkID0gMDtcXG4gXFx0dW5zaWduZWQgbG9uZyBscGFyX3JjO1xcbitcXHRpbnQgcXVldWVfaW5kZXgsIHJjO1xcbiBcXHR1MTYgbXNzID0gMDtcXG4gXFxuK1xcdHF1ZXVlX2luZGV4ID0gbmFwaSAtIGFkYXB0ZXItXFx1MDAzZW5hcGk7XFxuK1xcbitcXHRpZiAoV0FSTl9PTihxdWV1ZV9pbmRleCBcXHUwMDNjIDAgfHwgcXVldWVfaW5kZXggXFx1MDAzZT0gYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcykpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0aWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikgfHwgbmFwaV9kaXNhYmxlX3BlbmRpbmcobmFwaSkpIHtcXG4rXFx0XFx0bmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIDApO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0cylcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5wb2xscysrO1xcbitcXG4gcmVzdGFydF9wb2xsOlxcbiBcXHR3aGlsZSAoZnJhbWVzX3Byb2Nlc3NlZCBcXHUwMDNjIGJ1ZGdldCkge1xcbi1cXHRcXHRpZiAoIWlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpKVxcbitcXHRcXHRpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcbitcXHRcXHRpZiAoIWlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSlcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRcXHRzbXBfcm1iKCk7XFxuLVxcdFxcdGlmICghaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKGFkYXB0ZXIpKSB7XFxuK1xcdFxcdGlmICghaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSkge1xcbiBcXHRcXHRcXHR3bWIoKTsgLyogc3VnZ2VzdGVkIGJ5IGxhcnNvbjEgKi9cXG4tXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfaW52YWxpZF9idWZmZXIrKztcXG4rXFx0XFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0cylcXG4rXFx0XFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5pbnZhbGlkX2J1ZmZlcnMrKztcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9pbnZhbGlkX2J1ZmZlcisrO1xcbiBcXHRcXHRcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcInJlY3ljbGluZyBpbnZhbGlkIGJ1ZmZlclxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXFxuK1xcdFxcdFxcdHJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsIHRydWUpO1xcbitcXHRcXHRcXHRpZiAodW5saWtlbHkocmMpKVxcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7XFxuLVxcdFxcdFxcdGludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlcik7XFxuLVxcdFxcdFxcdGludCBvZmZzZXQgPSBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoYWRhcHRlcik7XFxuLVxcdFxcdFxcdGludCBjc3VtX2dvb2QgPSBpYm12ZXRoX3J4cV9jc3VtX2dvb2QoYWRhcHRlcik7XFxuLVxcdFxcdFxcdGludCBscmdfcGt0ID0gaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KGFkYXB0ZXIpO1xcbitcXHRcXHRcXHRpbnQgbGVuZ3RoID0gaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcXG4rXFx0XFx0XFx0aW50IG9mZnNldCA9IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XFxuK1xcdFxcdFxcdGludCBjc3VtX2dvb2QgPSBpYm12ZXRoX3J4cV9jc3VtX2dvb2QoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xcbitcXHRcXHRcXHRpbnQgbHJnX3BrdCA9IGlibXZldGhfcnhxX2xhcmdlX3BhY2tldChhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XFxuIFxcdFxcdFxcdF9fc3VtMTYgaXBoX2NoZWNrID0gMDtcXG4gXFxuLVxcdFxcdFxcdHNrYiA9IGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlcik7XFxuLVxcdFxcdFxcdGlmICh1bmxpa2VseSghc2tiKSlcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdHNrYiA9IGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xcbitcXHRcXHRcXHRpZiAodW5saWtlbHkoIXNrYikpIHtcXG4rXFx0XFx0XFx0XFx0aWYgKG5ldF9yYXRlbGltaXQoKSlcXG4rXFx0XFx0XFx0XFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXCJiYWQgY29ycmVsYXRvciBvbiBxdWV1ZSAlZCwgc2tpcHBpbmcgc2xvdFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgcXVldWVfaW5kZXgpO1xcbitcXHRcXHRcXHRcXHRpZiAoYWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzKVxcbitcXHRcXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLmludmFsaWRfYnVmZmVycysrO1xcbitcXHRcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2ludmFsaWRfYnVmZmVyKys7XFxuK1xcdFxcdFxcdFxcdHJjID0gaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdHRydWUpO1xcbitcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkocmMpKVxcbitcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4gXFxuIFxcdFxcdFxcdC8qIGlmIHRoZSBsYXJnZSBwYWNrZXQgYml0IGlzIHNldCBpbiB0aGUgcnggcXVldWVcXG4gXFx0XFx0XFx0ICogZGVzY3JpcHRvciwgdGhlIG1zcyB3aWxsIGJlIHdyaXR0ZW4gYnkgUEhZUCBlaWdodFxcbkBAIC0xNDk5LDEyICszMDE2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0bGVuZ3RoKTtcXG4gXFx0XFx0XFx0XFx0aWYgKHJ4X2ZsdXNoKVxcbiBcXHRcXHRcXHRcXHRcXHRpYm12ZXRoX2ZsdXNoX2J1ZmZlcihza2ItXFx1MDAzZWRhdGEsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdGxlbmd0aCArIG9mZnNldCk7XFxuLVxcdFxcdFxcdFxcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgbGVuZ3RoICsgb2Zmc2V0KTtcXG4rXFx0XFx0XFx0XFx0cmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7XFxuK1xcdFxcdFxcdFxcdGlmICh1bmxpa2VseShyYykpXFxuIFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRcXHRcXHRza2IgPSBuZXdfc2tiO1xcbiBcXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRpZiAodW5saWtlbHkoaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlciwgZmFsc2UpKSlcXG4rXFx0XFx0XFx0XFx0cmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgZmFsc2UpO1xcbitcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkocmMpKVxcbiBcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0XFx0c2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpO1xcbiBcXHRcXHRcXHR9XFxuQEAgLTE1MjQsNyArMzA0MywxMCBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXFxuIFxcdFxcdFxcdGlmICgobGVuZ3RoIFxcdTAwM2UgbmV0ZGV2LVxcdTAwM2VtdHUgKyBFVEhfSExFTikgfHxcXG4gXFx0XFx0XFx0ICAgIGxyZ19wa3QgfHwgaXBoX2NoZWNrID09IDB4ZmZmZikge1xcbiBcXHRcXHRcXHRcXHRpYm12ZXRoX3J4X21zc19oZWxwZXIoc2tiLCBtc3MsIGxyZ19wa3QpO1xcbi1cXHRcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9sYXJnZV9wYWNrZXRzKys7XFxuK1xcdFxcdFxcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHMpXFxuK1xcdFxcdFxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1txdWV1ZV9pbmRleF0ubGFyZ2VfcGFja2V0cysrO1xcbitcXHRcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X2xhcmdlX3BhY2tldHMrKztcXG4gXFx0XFx0XFx0fVxcbiBcXG4gXFx0XFx0XFx0aWYgKGNzdW1fZ29vZCkge1xcbkBAIC0xNTM0LDE2ICszMDU2LDIyIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcXG4gXFxuIFxcdFxcdFxcdG5hcGlfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTtcXHQvKiBzZW5kIGl0IHVwICovXFxuIFxcbi1cXHRcXHRcXHRuZXRkZXYtXFx1MDAzZXN0YXRzLnJ4X3BhY2tldHMrKztcXG4tXFx0XFx0XFx0bmV0ZGV2LVxcdTAwM2VzdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7XFxuK1xcdFxcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHMpIHtcXG4rXFx0XFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5wYWNrZXRzKys7XFxuK1xcdFxcdFxcdFxcdGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1txdWV1ZV9pbmRleF0uYnl0ZXMgKz0gbGVuZ3RoO1xcbitcXHRcXHRcXHR9XFxuK1xcbiBcXHRcXHRcXHRmcmFtZXNfcHJvY2Vzc2VkKys7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4tXFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyKTtcXG4rXFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XFxuIFxcbi1cXHRpZiAoZnJhbWVzX3Byb2Nlc3NlZCA9PSBidWRnZXQpXFxuK1xcdGlmIChmcmFtZXNfcHJvY2Vzc2VkID09IGJ1ZGdldCkge1xcbitcXHRcXHRpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSlcXG4rXFx0XFx0XFx0bmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIGZyYW1lc19wcm9jZXNzZWQpO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbiBcXG4gXFx0aWYgKCFuYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgZnJhbWVzX3Byb2Nlc3NlZCkpXFxuIFxcdFxcdGdvdG8gb3V0O1xcbkBAIC0xNTUxLDE1ICszMDc5LDIxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcXG4gXFx0LyogV2UgdGhpbmsgd2UgYXJlIGRvbmUgLSByZWVuYWJsZSBpbnRlcnJ1cHRzLFxcbiBcXHQgKiB0aGVuIGNoZWNrIG9uY2UgbW9yZSB0byBtYWtlIHN1cmUgd2UgYXJlIGRvbmUuXFxuIFxcdCAqL1xcbi1cXHRscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItXFx1MDAzZXZkZXYtXFx1MDAzZXVuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpO1xcbi1cXHRpZiAoV0FSTl9PTihscGFyX3JjICE9IEhfU1VDQ0VTUykpIHtcXG4rXFx0bHBhcl9yYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XFxuK1xcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xcbitcXHRcXHRuZXRkZXZfZXJyKG5ldGRldixcXG4rXFx0XFx0XFx0ICAgXFxcIkZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZCAocmM9MHglbHgpLCBzY2hlZHVsaW5nIHJlc2V0XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICBxdWV1ZV9pbmRleCwgbHBhcl9yYyk7XFxuIFxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXdvcmspO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpIFxcdTAwMjZcXHUwMDI2IG5hcGlfc2NoZWR1bGUobmFwaSkpIHtcXG4tXFx0XFx0bHBhcl9yYyA9IGhfdmlvX3NpZ25hbChhZGFwdGVyLVxcdTAwM2V2ZGV2LVxcdTAwM2V1bml0X2FkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBWSU9fSVJRX0RJU0FCTEUpO1xcbitcXHRpZiAoaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoYWRhcHRlciwgcXVldWVfaW5kZXgpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBuZXRpZl9ydW5uaW5nKG5ldGRldikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbmFwaV9zY2hlZHVsZShuYXBpKSkge1xcbitcXHRcXHRscGFyX3JjID0gaWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCk7XFxuK1xcdFxcdFdBUk5fT04obHBhcl9yYyAhPSBIX1NVQ0NFU1MpO1xcbiBcXHRcXHRnb3RvIHJlc3RhcnRfcG9sbDtcXG4gXFx0fVxcbiBcXG5AQCAtMTU2OSwxNSArMzEwMywyNCBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXFxuIFxcbiBzdGF0aWMgaXJxcmV0dXJuX3QgaWJtdmV0aF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKVxcbiB7XFxuLVxcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfaW5zdGFuY2U7XFxuK1xcdHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSA9IGRldl9pbnN0YW5jZTtcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktXFx1MDAzZWRldjtcXG4gXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcXG4rXFx0aW50IHFpbmRleDtcXG4rXFxuK1xcdHFpbmRleCA9IG5hcGkgLSBhZGFwdGVyLVxcdTAwM2VuYXBpO1xcbitcXG4rXFx0aWYgKFdBUk5fT04ocWluZGV4IFxcdTAwM2MgMCB8fCBxaW5kZXggXFx1MDAzZT0gYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcykpXFxuK1xcdFxcdHJldHVybiBJUlFfTk9ORTtcXG4gXFxuLVxcdGlmIChuYXBpX3NjaGVkdWxlX3ByZXAoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGkpKSB7XFxuLVxcdFxcdGxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci1cXHUwMDNldmRldi1cXHUwMDNldW5pdF9hZGRyZXNzLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgVklPX0lSUV9ESVNBQkxFKTtcXG4rXFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0cylcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfcXN0YXRzW3FpbmRleF0uaW50ZXJydXB0cysrO1xcbitcXG4rXFx0aWYgKG5hcGlfc2NoZWR1bGVfcHJlcChuYXBpKSkge1xcbitcXHRcXHRscGFyX3JjID0gaWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBxaW5kZXgpO1xcbiBcXHRcXHRXQVJOX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKTtcXG4tXFx0XFx0X19uYXBpX3NjaGVkdWxlKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpKTtcXG4rXFx0XFx0X19uYXBpX3NjaGVkdWxlKG5hcGkpO1xcbiBcXHR9XFxuIFxcdHJldHVybiBJUlFfSEFORExFRDtcXG4gfVxcbkBAIC0xNjQ1LDcgKzMxODgsNyBAQCBzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSlcXG4gXFx0aW50IG5lZWRfcmVzdGFydCA9IDA7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxcbi1cXHRcXHRpZiAobmV3X210dV9vaCBcXHUwMDNjPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKVxcbitcXHRcXHRpZiAobmV3X210dV9vaCBcXHUwMDNjPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFxuIFxcdGlmIChpID09IElCTVZFVEhfTlVNX0JVRkZfUE9PTFMpXFxuQEAgLTE2NjAsOSArMzIwMyw5IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KVxcbiBcXG4gXFx0LyogTG9vayBmb3IgYW4gYWN0aXZlIGJ1ZmZlciBwb29sIHRoYXQgY2FuIGhvbGQgdGhlIG5ldyBNVFUgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKykge1xcbi1cXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMTtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmFjdGl2ZSA9IDE7XFxuIFxcbi1cXHRcXHRpZiAobmV3X210dV9vaCBcXHUwMDNjPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKSB7XFxuK1xcdFxcdGlmIChuZXdfbXR1X29oIFxcdTAwM2M9IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5idWZmX3NpemUpIHtcXG4gXFx0XFx0XFx0V1JJVEVfT05DRShkZXYtXFx1MDAzZW10dSwgbmV3X210dSk7XFxuIFxcdFxcdFxcdHZpb19jbW9fc2V0X2Rldl9kZXNpcmVkKHZpb2RldixcXG4gXFx0XFx0XFx0XFx0XFx0XFx0aWJtdmV0aF9nZXRfZGVzaXJlZF9kbWFcXG5AQCAtMTY4Myw4ICszMjI2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KVxcbiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVJcXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4ge1xcbi1cXHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKG5ldGRldl9wcml2KGRldikpO1xcbi1cXHRpYm12ZXRoX2ludGVycnVwdChkZXYtXFx1MDAzZWlycSwgZGV2KTtcXG4rXFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKylcXG4rXFx0XFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBpKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspXFxuK1xcdFxcdGlibXZldGhfaW50ZXJydXB0KGFkYXB0ZXItXFx1MDAzZXF1ZXVlX2lycVtpXSwgXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbaV0pO1xcbiB9XFxuICNlbmRpZlxcbiBcXG5AQCAtMTcwMiw4ICszMjUxLDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJtdmV0aF9nZXRfZGVzaXJlZF9kbWEoc3RydWN0IHZpb19kZXYgKnZkZXYpXFxuIFxcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXI7XFxuIFxcdHN0cnVjdCBpb21tdV90YWJsZSAqdGJsO1xcbiBcXHR1bnNpZ25lZCBsb25nIHJldDtcXG4tXFx0aW50IGk7XFxuLVxcdGludCByeHFlbnRyaWVzID0gMTtcXG4rXFx0aW50IGksIHE7XFxuIFxcbiBcXHR0YmwgPSBnZXRfaW9tbXVfdGFibGVfYmFzZShcXHUwMDI2dmRldi1cXHUwMDNlZGV2KTtcXG4gXFxuQEAgLTE3MTgsMTggKzMyNjYsMjIgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJtdmV0aF9nZXRfZGVzaXJlZF9kbWEoc3RydWN0IHZpb19kZXYgKnZkZXYpXFxuIFxcdC8qIGFkZCBzaXplIG9mIG1hcHBlZCB0eCBidWZmZXJzICovXFxuIFxcdHJldCArPSBJT01NVV9QQUdFX0FMSUdOKElCTVZFVEhfTUFYX1RYX0JVRl9TSVpFLCB0YmwpO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKykge1xcbi1cXHRcXHQvKiBhZGQgdGhlIHNpemUgb2YgdGhlIGFjdGl2ZSByZWNlaXZlIGJ1ZmZlcnMgKi9cXG4tXFx0XFx0aWYgKGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXFxuLVxcdFxcdFxcdHJldCArPVxcbi1cXHRcXHRcXHQgICAgYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLnNpemUgKlxcbi1cXHRcXHRcXHQgICAgSU9NTVVfUEFHRV9BTElHTihhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgYnVmZl9zaXplLCB0YmwpO1xcbi1cXHRcXHRyeHFlbnRyaWVzICs9IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5zaXplO1xcbi1cXHR9XFxuLVxcdC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBxdWV1ZSBlbnRyaWVzICovXFxuLVxcdHJldCArPSBJT01NVV9QQUdFX0FMSUdOKFxcbi1cXHRcXHRyeHFlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpLCB0YmwpO1xcbitcXHRmb3IgKHEgPSAwOyBxIFxcdTAwM2MgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlczsgcSsrKSB7XFxuK1xcdFxcdGludCByeHFlbnRyaWVzID0gMTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4rXFx0XFx0XFx0LyogYWRkIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgcmVjZWl2ZSBidWZmZXJzICovXFxuK1xcdFxcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbcV1baV0uYWN0aXZlKVxcbitcXHRcXHRcXHRcXHRyZXQgKz0gYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW3FdW2ldLnNpemUgKlxcbitcXHRcXHRcXHRcXHRcXHRJT01NVV9QQUdFX0FMSUdOKGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5idWZmX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCB0YmwpO1xcbitcXHRcXHRcXHRyeHFlbnRyaWVzICs9IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5zaXplO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKiBhZGQgdGhlIHNpemUgb2YgdGhlIHJlY2VpdmUgcXVldWUgZW50cmllcyAqL1xcbitcXHRcXHRyZXQgKz0gSU9NTVVfUEFHRV9BTElHTihyeHFlbnRyaWVzICpcXG4rXFx0XFx0XFx0XFx0XFx0c2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpLCB0YmwpO1xcbitcXHR9XFxuIFxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuQEAgLTE3NzcsNiArMzMyOSwzOSBAQCBzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgaWJtdmV0aF9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRyZXR1cm4gdmxhbl9mZWF0dXJlc19jaGVjayhza2IsIGZlYXR1cmVzKTtcXG4gfVxcbiBcXG4rLyoqXFxuKyAqIGlibXZldGhfZ2V0X3N0YXRzNjQgLSBSZXR1cm4gYWdncmVnYXRlZCBwZXItcXVldWUgc3RhdGlzdGljc1xcbisgKiBAZGV2OiBuZXR3b3JrIGRldmljZVxcbisgKiBAc3RhdHM6IHJ0bmwgbGluayBzdGF0aXN0aWNzIHN0b3JhZ2VcXG4rICpcXG4rICogU3VtcyBwZXItcXVldWUgcnhfcXN0YXRzIGFuZCB0eF9xc3RhdHMgaW50byB0aGUgcnRubCBjb3VudGVycy5cXG4rICogQ2FsbGVycyB1c2UgbmRvX2dldF9zdGF0czY0KCk7IGF2b2lkIHVwZGF0aW5nIG5ldGRldi1cXHUwMDNlc3RhdHMgb24gdGhlXFxuKyAqIHhtaXQvcG9sbCBwYXRocyB0byBrZWVwIHBlci1xdWV1ZSBjb3VudGVycyBvZmYgdGhlIGhvdCBjYWNoZSBsaW5lLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKVxcbit7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHMpIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGFkYXB0ZXItXFx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xcbitcXHRcXHRcXHRzdGF0cy1cXHUwMDNlcnhfcGFja2V0cyArPSBhZGFwdGVyLVxcdTAwM2VyeF9xc3RhdHNbaV0ucGFja2V0cztcXG4rXFx0XFx0XFx0c3RhdHMtXFx1MDAzZXJ4X2J5dGVzICs9IGFkYXB0ZXItXFx1MDAzZXJ4X3FzdGF0c1tpXS5ieXRlcztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAoYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkZXYtXFx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XFxuK1xcdFxcdFxcdHN0YXRzLVxcdTAwM2V0eF9wYWNrZXRzICs9IGFkYXB0ZXItXFx1MDAzZXR4X3FzdGF0c1tpXS5wYWNrZXRzO1xcbitcXHRcXHRcXHRzdGF0cy1cXHUwMDNldHhfYnl0ZXMgKz0gYWRhcHRlci1cXHUwMDNldHhfcXN0YXRzW2ldLmJ5dGVzO1xcbitcXHRcXHRcXHRzdGF0cy1cXHUwMDNldHhfZHJvcHBlZCArPSBhZGFwdGVyLVxcdTAwM2V0eF9xc3RhdHNbaV0uZHJvcHBlZF9wYWNrZXRzO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHN0YXRzLVxcdTAwM2V0eF9lcnJvcnMgPSBkZXYtXFx1MDAzZXN0YXRzLnR4X2Vycm9ycztcXG4rfVxcbitcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpYm12ZXRoX25ldGRldl9vcHMgPSB7XFxuIFxcdC5uZG9fb3BlblxcdFxcdD0gaWJtdmV0aF9vcGVuLFxcbiBcXHQubmRvX3N0b3BcXHRcXHQ9IGlibXZldGhfY2xvc2UsXFxuQEAgLTE3ODksMTEgKzMzNzQsNTggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpYm12ZXRoX25ldGRldl9vcHMgPSB7XFxuIFxcdC5uZG9fdmFsaWRhdGVfYWRkclxcdD0gZXRoX3ZhbGlkYXRlX2FkZHIsXFxuIFxcdC5uZG9fc2V0X21hY19hZGRyZXNzICAgID0gaWJtdmV0aF9zZXRfbWFjX2FkZHIsXFxuIFxcdC5uZG9fZmVhdHVyZXNfY2hlY2tcXHQ9IGlibXZldGhfZmVhdHVyZXNfY2hlY2ssXFxuK1xcdC5uZG9fZ2V0X3N0YXRzNjRcXHQ9IGlibXZldGhfZ2V0X3N0YXRzNjQsXFxuICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUlxcbiBcXHQubmRvX3BvbGxfY29udHJvbGxlclxcdD0gaWJtdmV0aF9wb2xsX2NvbnRyb2xsZXIsXFxuICNlbmRpZlxcbiB9O1xcbiBcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWJtdmV0aF9hdHRyX2dyb3VwO1xcbitcXG4rc3RhdGljIHNzaXplX3QgYnVmZmVyX3Bvb2xzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxcbitcXHRcXHRcXHRcXHQgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXFxuK1xcdFxcdFxcdFxcdCBjaGFyICpidWYpXFxuK3tcXG4rXFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpO1xcbitcXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTtcXG4rXFx0aW50IGxlbiA9IDA7XFxuK1xcdGludCBpLCBqO1xcbitcXG4rXFx0bGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbixcXG4rXFx0XFx0XFx0IFxcXCJRdWV1ZSAgUG9vbCAgU2l6ZSAgQnVmZlNpemUgIEFjdGl2ZSAgQXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFx0bGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbixcXG4rXFx0XFx0XFx0IFxcXCItLS0tLSAgLS0tLSAgLS0tLSAgLS0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcXG4rXFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGorKykge1xcbitcXHRcXHRcXHRzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wgPVxcbitcXHRcXHRcXHRcXHRcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldW2pdO1xcbitcXG4rXFx0XFx0XFx0bGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbixcXG4rXFx0XFx0XFx0XFx0XFx0IFxcXCIlNWQgICU0ZCAgJTR1ICAlOHUgICU2ZCAgJTlkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgaSwgaiwgcG9vbC1cXHUwMDNlc2l6ZSwgcG9vbC1cXHUwMDNlYnVmZl9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHQgcG9vbC1cXHUwMDNlYWN0aXZlLFxcbitcXHRcXHRcXHRcXHRcXHQgYXRvbWljX3JlYWQoXFx1MDAyNnBvb2wtXFx1MDAzZWF2YWlsYWJsZSkpO1xcbitcXG4rXFx0XFx0XFx0aWYgKGxlbiBcXHUwMDNlPSBQQUdFX1NJWkUgLSAxMDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK291dDpcXG4rXFx0cmV0dXJuIGxlbjtcXG4rfVxcbitzdGF0aWMgREVWSUNFX0FUVFJfUk8oYnVmZmVyX3Bvb2xzKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppYm12ZXRoX2F0dHJzW10gPSB7XFxuK1xcdFxcdTAwMjZkZXZfYXR0cl9idWZmZXJfcG9vbHMuYXR0cixcXG4rXFx0TlVMTCxcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlibXZldGhfYXR0cl9ncm91cCA9IHtcXG4rXFx0LmF0dHJzID0gaWJtdmV0aF9hdHRycyxcXG4rfTtcXG4rXFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXFxuIHtcXG4gXFx0aW50IHJjLCBpLCBtYWNfbGVuO1xcbkBAIC0xODMxLDcgKzM0NjMsOCBAQCBzdGF0aWMgaW50IGlibXZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0fVxcbiBcXG4tXFx0bmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSwgSUJNVkVUSF9NQVhfUVVFVUVTLCAxKTtcXG4rXFx0bmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSxcXG4rXFx0XFx0XFx0XFx0ICAgIElCTVZFVEhfTUFYX1FVRVVFUywgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKTtcXG4gXFx0aWYgKCFuZXRkZXYpXFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXG5AQCAtMTg0NCw3ICszNDc3LDggQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcXG4gXFx0YWRhcHRlci1cXHUwMDNlbWNhc3RGaWx0ZXJTaXplID0gYmUzMl90b19jcHUoKm1jYXN0RmlsdGVyU2l6ZV9wKTtcXG4gXFx0aWJtdmV0aF9pbml0X2xpbmtfc2V0dGluZ3MobmV0ZGV2KTtcXG4gXFxuLVxcdG5ldGlmX25hcGlfYWRkX3dlaWdodChuZXRkZXYsIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpLCBpYm12ZXRoX3BvbGwsIDE2KTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIElCTVZFVEhfTUFYX1JYX1FVRVVFUzsgaSsrKVxcbitcXHRcXHRuZXRpZl9uYXBpX2FkZF93ZWlnaHQobmV0ZGV2LCBcXHUwMDI2YWRhcHRlci1cXHUwMDNlbmFwaVtpXSwgaWJtdmV0aF9wb2xsLCAxNik7XFxuIFxcbiBcXHRuZXRkZXYtXFx1MDAzZWlycSA9IGRldi1cXHUwMDNlaXJxO1xcbiBcXHRuZXRkZXYtXFx1MDAzZW5ldGRldl9vcHMgPSBcXHUwMDI2aWJtdmV0aF9uZXRkZXZfb3BzO1xcbkBAIC0xODc2LDEyICszNTEwLDI3IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXFxuIFxcdFxcdG5ldGRldi1cXHUwMDNlZmVhdHVyZXMgfD0gTkVUSUZfRl9GUkFHTElTVDtcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKHJldCA9PSBIX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChyZXRfYXR0ciBcXHUwMDI2IElCTVZFVEhfSUxMQU5fUlhfTVVMVElfUVVFVUVfU1VQUE9SVCkpIHtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlbXVsdGlfcXVldWUgPSAxO1xcbitcXHRcXHRhZGFwdGVyLVxcdTAwM2VudW1fcnhfcXVldWVzID0gbWluKG51bV9vbmxpbmVfY3B1cygpLCBJQk1WRVRIX0RFRkFVTFRfUVVFVUVTKTtcXG4rXFx0XFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFxcXCJSWCBtdWx0aSBxdWV1ZSBtb2RlIGVuYWJsZWQ6ICVkIHF1ZXVlc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGFkYXB0ZXItXFx1MDAzZW11bHRpX3F1ZXVlID0gMDtcXG4rXFx0XFx0YWRhcHRlci1cXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IDE7XFxuK1xcdH1cXG4rXFxuIFxcdGlmIChyZXQgPT0gSF9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAocmV0X2F0dHIgXFx1MDAyNiBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX0JVRkZfU1VQUE9SVCkpIHtcXG4tXFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwgPSBJQk1WRVRIX01BWF9SWF9QRVJfSENBTEw7XFxuK1xcdFxcdGlmIChhZGFwdGVyLVxcdTAwM2VtdWx0aV9xdWV1ZSlcXG4rXFx0XFx0XFx0YWRhcHRlci1cXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwgPSBJQk1WRVRIX01BWF9SWF9RVUVVRTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1JFR1VMQVI7XFxuK1xcbiBcXHRcXHRuZXRkZXZfZGJnKG5ldGRldixcXG4gXFx0XFx0XFx0ICAgXFxcIlJYIE11bHRpLWJ1ZmZlciBoY2FsbCBzdXBwb3J0ZWQgYnkgRlcsIGJhdGNoIHNldCB0byAldVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ICAgIGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsKTtcXG4rXFx0XFx0XFx0ICAgYWRhcHRlci1cXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwpO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRhZGFwdGVyLVxcdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IDE7XFxuIFxcdFxcdG5ldGRldl9kYmcobmV0ZGV2LFxcbkBAIC0xODk4LDEwICszNTQ3LDEwIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXFxuIFxcdFxcdG1lbWNweShwb29sX2NvdW50LCBwb29sX2NvdW50X2Ntbywgc2l6ZW9mKHBvb2xfY291bnQpKTtcXG4gXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4tXFx0XFx0c3RydWN0IGtvYmplY3QgKmtvYmogPSBcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLmtvYmo7XFxuK1xcdFxcdHN0cnVjdCBrb2JqZWN0ICprb2JqID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5rb2JqO1xcbiBcXHRcXHRpbnQgZXJyb3I7XFxuIFxcbi1cXHRcXHRpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSwgaSxcXG4rXFx0XFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0sIGksXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2NvdW50W2ldLCBwb29sX3NpemVbaV0sXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2FjdGl2ZVtpXSk7XFxuIFxcdFxcdGVycm9yID0ga29iamVjdF9pbml0X2FuZF9hZGQoa29iaiwgXFx1MDAyNmt0eXBlX3ZldGhfcG9vbCxcXG5AQCAtMTkzNyw2ICszNTg2LDE0IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpXFxuIFxcbiBcXHRuZXRkZXZfZGJnKG5ldGRldiwgXFxcInJlZ2lzdGVyZWRcXFxcblxcXCIpO1xcbiBcXG4rXFx0cmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoXFx1MDAyNmRldi1cXHUwMDNlZGV2LmtvYmosIFxcdTAwMjZpYm12ZXRoX2F0dHJfZ3JvdXApO1xcbitcXHRpZiAocmMpIHtcXG4rXFx0XFx0bmV0ZGV2X2VycihuZXRkZXYsIFxcXCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXMgcmM9JWRcXFxcblxcXCIsIHJjKTtcXG4rXFx0XFx0dW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTtcXG4rXFx0XFx0ZnJlZV9uZXRkZXYobmV0ZGV2KTtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG5AQCAtMTk0OCw4ICszNjA1LDEwIEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpXFxuIFxcbiBcXHRjYW5jZWxfd29ya19zeW5jKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2V3b3JrKTtcXG4gXFxuK1xcdHN5c2ZzX3JlbW92ZV9ncm91cChcXHUwMDI2ZGV2LVxcdTAwM2VkZXYua29iaiwgXFx1MDAyNmlibXZldGhfYXR0cl9ncm91cCk7XFxuK1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxcbi1cXHRcXHRrb2JqZWN0X3B1dChcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLmtvYmopO1xcbitcXHRcXHRrb2JqZWN0X3B1dChcXHUwMDI2YWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmtvYmopO1xcbiBcXG4gXFx0dW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTtcXG4gXFxuQEAgLTIwMzUsMTEgKzM2OTQsMTEgQEAgc3RhdGljIHNzaXplX3QgdmV0aF9wb29sX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLFxcbiBcXHRcXHRcXHQvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBidWZmZXIgcG9vbCB3aXRoIGJ1ZmZlcnMgdGhhdFxcbiBcXHRcXHRcXHQgICBjYW4gaG9sZCBhIHBhY2tldCBvZiB0aGUgc2l6ZSBvZiB0aGUgTVRVICovXFxuIFxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcXG4tXFx0XFx0XFx0XFx0aWYgKHBvb2wgPT0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSlcXG4rXFx0XFx0XFx0XFx0aWYgKHBvb2wgPT0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXSlcXG4gXFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdFxcdFxcdGlmICghYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcXG4rXFx0XFx0XFx0XFx0aWYgKCFhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlKVxcbiBcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0XFx0aWYgKG10dSBcXHUwMDNjPSBhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKVxcbitcXHRcXHRcXHRcXHRpZiAobXR1IFxcdTAwM2M9IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5idWZmX3NpemUpXFxuIFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRcXHR9XFxuIFxcbkBAIC0yMDkzLDcgKzM3NTIsNyBAQCBzdGF0aWMgc3NpemVfdCB2ZXRoX3Bvb2xfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsXFxuIFxcdHJ0bmxfdW5sb2NrKCk7XFxuIFxcbiBcXHQvKiBraWNrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIHBvb2xzICovXFxuLVxcdGlibXZldGhfaW50ZXJydXB0KG5ldGRldi1cXHUwMDNlaXJxLCBuZXRkZXYpO1xcbitcXHRpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtXFx1MDAzZWlycSwgXFx1MDAyNmFkYXB0ZXItXFx1MDAzZW5hcGlbMF0pO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIFxcbiB1bmxvY2tfZXJyOlxcbkBAIC0yMTMzLDcgKzM3OTIsOSBAQCBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV92ZXRoX3Bvb2wgPSB7XFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KVxcbiB7XFxuIFxcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcXG4tXFx0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVxcdTAwM2VpcnEsIG5ldGRldik7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xcbitcXG4rXFx0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVxcdTAwM2VpcnEsIFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VuYXBpWzBdKTtcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuQEAgLTIyMTMsMjYgKzM4NzQsMzIgQEAgc3RhdGljIHZvaWQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbF90ZXN0KHN0cnVjdCBrdW5pdCAqdGVzdClcXG4gXFxuIFxcdC8qIFNldCBzYW5lIHZhbHVlcyBmb3IgYnVmZmVyIHBvb2xzICovXFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxcbi1cXHRcXHRpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSwgaSxcXG4rXFx0XFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0sIGksXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2NvdW50W2ldLCBwb29sX3NpemVbaV0sXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2FjdGl2ZVtpXSk7XFxuIFxcbi1cXHRwb29sID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXTtcXG4rXFx0cG9vbCA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1bMF07XFxuIFxcdHBvb2wtXFx1MDAzZXNrYnVmZiA9IGt1bml0X2tjYWxsb2ModGVzdCwgcG9vbC1cXHUwMDNlc2l6ZSwgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xcbiBcXHRLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHBvb2wtXFx1MDAzZXNrYnVmZik7XFxuIFxcbiBcXHRjb3JyZWxhdG9yID0gKCh1NjQpSUJNVkVUSF9OVU1fQlVGRl9QT09MUyBcXHUwMDNjXFx1MDAzYyAzMikgfCAwO1xcbi1cXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xcbi1cXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCB0cnVlKSk7XFxuK1xcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxcbitcXHRcXHRcXHRpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIGZhbHNlKSk7XFxuK1xcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxcbitcXHRcXHRcXHRpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIDAsIHRydWUpKTtcXG4gXFxuLVxcdGNvcnJlbGF0b3IgPSAoKHU2NCkwIFxcdTAwM2NcXHUwMDNjIDMyKSB8IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXS5zaXplO1xcbi1cXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xcbi1cXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCB0cnVlKSk7XFxuK1xcdGNvcnJlbGF0b3IgPSAoKHU2NCkwIFxcdTAwM2NcXHUwMDNjIDMyKSB8IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXS5zaXplO1xcbitcXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCxcXG4rXFx0XFx0XFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCBmYWxzZSkpO1xcbitcXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCxcXG4rXFx0XFx0XFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCB0cnVlKSk7XFxuIFxcbiBcXHRjb3JyZWxhdG9yID0gKHU2NCkwIHwgMDtcXG4gXFx0cG9vbC1cXHUwMDNlc2tidWZmWzBdID0gTlVMTDtcXG4tXFx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgZmFsc2UpKTtcXG4tXFx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xcbitcXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCxcXG4rXFx0XFx0XFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCBmYWxzZSkpO1xcbitcXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCxcXG4rXFx0XFx0XFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCB0cnVlKSk7XFxuIFxcbiBcXHRmbHVzaF93b3JrKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2V3b3JrKTtcXG4gfVxcbkBAIC0yMjU4LDMxICszOTI1LDMzIEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcnhxX2dldF9idWZmZXJfdGVzdChzdHJ1Y3Qga3VuaXQgKnRlc3QpXFxuIFxcbiBcXHRJTklUX1dPUksoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXdvcmssIGlibXZldGhfcmVzZXRfa3VuaXQpO1xcbiBcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfbGVuID0gMTtcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUuaW5kZXggPSAwO1xcbi1cXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyID0ga3VuaXRfa3phbGxvYyh0ZXN0LCBzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSksXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgR0ZQX0tFUk5FTCk7XFxuLVxcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgYWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcik7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2xlbiA9IDE7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlWzBdLmluZGV4ID0gMDtcXG4rXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWVbMF0ucXVldWVfYWRkciA9XFxuK1xcdFxcdGt1bml0X2t6YWxsb2ModGVzdCwgc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpLFxcbitcXHRcXHRcXHQgICAgICBHRlBfS0VSTkVMKTtcXG4rXFx0S1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyKTtcXG4gXFxuIFxcdC8qIFNldCBzYW5lIHZhbHVlcyBmb3IgYnVmZmVyIHBvb2xzICovXFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxcbi1cXHRcXHRpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSwgaSxcXG4rXFx0XFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0sIGksXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2NvdW50W2ldLCBwb29sX3NpemVbaV0sXFxuIFxcdFxcdFxcdFxcdFxcdCBwb29sX2FjdGl2ZVtpXSk7XFxuIFxcbi1cXHRwb29sID0gXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXTtcXG4rXFx0cG9vbCA9IFxcdTAwMjZhZGFwdGVyLVxcdTAwM2VyeF9idWZmX3Bvb2xbMF1bMF07XFxuIFxcdHBvb2wtXFx1MDAzZXNrYnVmZiA9IGt1bml0X2tjYWxsb2ModGVzdCwgcG9vbC1cXHUwMDNlc2l6ZSwgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xcbiBcXHRLVU5JVF9BU1NFUlRfTk9UX0VSUl9PUl9OVUxMKHRlc3QsIHBvb2wtXFx1MDAzZXNrYnVmZik7XFxuIFxcbi1cXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXFx1MDAzY1xcdTAwM2MgMzIgfCAwO1xcbi1cXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlcikpO1xcbitcXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXFx1MDAzY1xcdTAwM2MgMzIgfCAwO1xcbitcXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgMCkpO1xcbiBcXG4tXFx0YWRhcHRlci1cXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclswXS5jb3JyZWxhdG9yID0gKHU2NCkwIFxcdTAwM2NcXHUwMDNjIDMyIHwgYWRhcHRlci1cXHUwMDNlcnhfYnVmZl9wb29sWzBdLnNpemU7XFxuLVxcdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9XFxuK1xcdFxcdCh1NjQpMCBcXHUwMDNjXFx1MDAzYyAzMiB8IGFkYXB0ZXItXFx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXS5zaXplO1xcbitcXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgMCkpO1xcbiBcXG4gXFx0cG9vbC1cXHUwMDNlc2tidWZmWzBdID0gc2tiO1xcbi1cXHRhZGFwdGVyLVxcdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KTAgXFx1MDAzY1xcdTAwM2MgMzIgfCAwO1xcbi1cXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIHNrYiwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XFxuK1xcdGFkYXB0ZXItXFx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpMCBcXHUwMDNjXFx1MDAzYyAzMiB8IDA7XFxuK1xcdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgc2tiLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIDApKTtcXG4gXFxuIFxcdGZsdXNoX3dvcmsoXFx1MDAyNmFkYXB0ZXItXFx1MDAzZXdvcmspO1xcbiB9XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5oXFxuaW5kZXggZDg3NzEzNjY4ZWQzMDAuLjM5MGM2NjBhZjk3OWU3IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmhcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5oXFxuQEAgLTE0LDYgKzE0LDggQEBcXG4gI2lmbmRlZiBfSUJNVkVUSF9IXFxuICNkZWZpbmUgX0lCTVZFVEhfSFxcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NwaW5sb2NrX3R5cGVzLmhcXHUwMDNlXFxuK1xcbiAvKiBjb25zdGFudHMgZm9yIEhfTVVMVElDQVNUX0NUUkwgKi9cXG4gI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25Nb2RpZnlCaXQgICAgIDB4ODAwMDBVTFxcbiAjZGVmaW5lIElibVZldGhNY2FzdFJlY2VwdGlvbkVuYWJsZUJpdCAgICAgMHgyMDAwMFVMXFxuQEAgLTI4LDYgKzMwLDcgQEBcXG4gI2RlZmluZSBJYm1WZXRoTWNhc3RSZW1vdmVGaWx0ZXIgICAgIDB4MlVMXFxuICNkZWZpbmUgSWJtVmV0aE1jYXN0Q2xlYXJGaWx0ZXJUYWJsZSAweDNVTFxcbiBcXG4rI2RlZmluZSBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX1FVRVVFX1NVUFBPUlRcXHQweDAwMDAwMDAwMDAwODAwMDBVTFxcbiAjZGVmaW5lIElCTVZFVEhfSUxMQU5fUlhfTVVMVElfQlVGRl9TVVBQT1JUXFx0MHgwMDAwMDAwMDAwMDQwMDAwVUxcXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX0xSR19TUl9FTkFCTEVEXFx0MHgwMDAwMDAwMDAwMDEwMDAwVUxcXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX0xSR19TTkRfU1VQUE9SVFxcdDB4MDAwMDAwMDAwMDAwODAwMFVMXFxuQEAgLTY2LDYgKzY5LDE2NCBAQCBzdGF0aWMgaW5saW5lIGxvbmcgaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcyxcXG4gXFx0XFx0XFx0ICAgIGRlc2M1LCBkZXNjNiwgZGVzYzcsIGRlc2M4KTtcXG4gfVxcbiBcXG4rLyoqXFxuKyAqIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlIC0gUmVnaXN0ZXIgYSBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlXFxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcXG4rICogQGJ1ZmZlcl9saXN0OiBETUEgYWRkcmVzcyBvZiA0S0IgcGFnZSBmb3IgdHJhY2tpbmcgcmVnaXN0ZXJlZCBidWZmZXJzXFxuKyAqIEByZWNfcXVldWU6IEJ1ZmZlciBkZXNjcmlwdG9yIG9mIHJlY2VpdmUgcXVldWVcXG4rICpcXG4rICogUmVnaXN0ZXJzIGEgc3Vib3JkaW5hdGUgcmVjZWl2ZSBxdWV1ZSB3aXRoIHRoZSBoeXBlcnZpc29yLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgSF9TVUNDRVNTICgwKSBvbiBzdWNjZXNzXFxuKyAqICAgSF9QQVJBTUVURVIgaWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZFxcbisgKlxcbisgKiBPbiBzdWNjZXNzLCBoeXBlcnZpc29yIHJldHVybnM6XFxuKyAqICAgUjM6IEhfU1VDQ0VTU1xcbisgKiAgIFI0OiBRdWV1ZSBoYW5kbGVcXG4rICogICBSNTogSVJRIG51bWJlciBmb3IgdGhpcyBxdWV1ZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9saXN0LFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIHJlY19xdWV1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqcXVldWVfaGFuZGxlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICppcnEpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xcbitcXHRsb25nIHJjO1xcbitcXG4rXFx0cmMgPSBwbHBhcl9oY2FsbDkoSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUsXFxuK1xcdFxcdFxcdCAgcmV0YnVmLCB1bml0X2FkZHJlc3MsXFxuK1xcdFxcdFxcdCAgYnVmZmVyX2xpc3QsIHJlY19xdWV1ZSk7XFxuK1xcbitcXHRpZiAocmMgPT0gSF9TVUNDRVNTKSB7XFxuK1xcdFxcdGlmIChxdWV1ZV9oYW5kbGUpXFxuK1xcdFxcdFxcdCpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07XFxuK1xcdFxcdGlmIChpcnEpXFxuK1xcdFxcdFxcdCppcnEgPSByZXRidWZbMV07XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUgLSBBZGQgYnVmZmVycyB0byBzdWJvcmRpbmF0ZSBxdWV1ZVxcbisgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzXFxuKyAqIEBxdWV1ZV9oYW5kbGU6IFF1ZXVlIGhhbmRsZSBmcm9tIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKClcXG4rICogQGJ1ZmZlcnN6bnVtOiBCdWZmZXIgc2l6ZSAodXBwZXIgMzIgYml0cykgfCBjb3VudCAobG93ZXIgMzIgYml0cylcXG4rICogQGlvYmExMjogQnVmZmVyIGFkZHJlc3NlcyAxIGFuZCAyIHBhY2tlZCAoYWRkcjEgfCBhZGRyMiBcXHUwMDNjXFx1MDAzYyAzMilcXG4rICogQGlvYmEzNDogQnVmZmVyIGFkZHJlc3NlcyAzIGFuZCA0IHBhY2tlZFxcbisgKiBAaW9iYTU2OiBCdWZmZXIgYWRkcmVzc2VzIDUgYW5kIDYgcGFja2VkXFxuKyAqIEBpb2JhNzg6IEJ1ZmZlciBhZGRyZXNzZXMgNyBhbmQgOCBwYWNrZWRcXG4rICogQGlvYmE5MTA6IEJ1ZmZlciBhZGRyZXNzZXMgOSBhbmQgMTAgcGFja2VkXFxuKyAqIEBpb2JhMTExMjogQnVmZmVyIGFkZHJlc3NlcyAxMSBhbmQgMTIgcGFja2VkXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogICBIX1NVQ0NFU1MgLSBBbGwgYnVmZmVycyBhZGRlZCBzdWNjZXNzZnVsbHlcXG4rICogICBIX1BBUkFNRVRFUiAtIEludmFsaWQgcGFyYW1ldGVyc1xcbisgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgcXVldWVfaGFuZGxlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcnN6bnVtLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGlvYmExMixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhMzQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgaW9iYTU2LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGlvYmE3OCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhOTEwLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGlvYmExMTEyKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTtcXG4rXFxuK1xcdHJldHVybiBwbHBhcl9oY2FsbDkoSF9BRERfTE9HSUNBTF9MQU5fQlVGRkVSU19RVUVVRSxcXG4rXFx0XFx0XFx0ICAgIHJldGJ1ZiwgdW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHQgICAgcXVldWVfaGFuZGxlLCBidWZmZXJzem51bSxcXG4rXFx0XFx0XFx0ICAgIGlvYmExMiwgaW9iYTM0LCBpb2JhNTYsXFxuK1xcdFxcdFxcdCAgICBpb2JhNzgsIGlvYmE5MTAsIGlvYmExMTEyKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGhfZnJlZV9sb2dpY2FsX2xhbl9idWZmZXJfcXVldWUgLSBGcmVlIGJ1ZmZlciBmcm9tIHN1Ym9yZGluYXRlIHF1ZXVlXFxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcXG4rICogQGJ1Zl9zaXplOiBTaXplIG9mIGJ1ZmZlciB0byByZW1vdmUgZnJvbSBwb29sXFxuKyAqIEBxdWV1ZV9oYW5kbGU6IFF1ZXVlIGhhbmRsZSBmcm9tIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKClcXG4rICpcXG4rICogUmVtb3ZlcyBhIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZSBmcm9tIHRoZSBzdWJvcmRpbmF0ZSBxdWV1ZSdzIGJ1ZmZlciBwb29sLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgSF9TVUNDRVNTIC0gQnVmZmVyIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5XFxuKyAqICAgSF9QQVJBTUVURVIgLSBJbnZhbGlkIHBhcmFtZXRlcnNcXG4rICogICBIX0hBUkRXQVJFIC0gSGFyZHdhcmUgZXJyb3JcXG4rICogICBIX05PVF9GT1VORCAtIEJ1ZmZlciBwb29sIGRvZXMgbm90IGV4aXN0XFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgaF9mcmVlX2xvZ2ljYWxfbGFuX2J1ZmZlcl9xdWV1ZSh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xcbitcXG4rXFx0cmV0dXJuIHBscGFyX2hjYWxsOShIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSX1FVRVVFLFxcbitcXHRcXHRcXHQgICAgcmV0YnVmLCB1bml0X2FkZHJlc3MsIGJ1Zl9zaXplLCBxdWV1ZV9oYW5kbGUpO1xcbit9XFxuK1xcbisvKipcXG4rICogaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlIC0gRGVyZWdpc3RlciBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlXFxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcXG4rICogQHF1ZXVlX2hhbmRsZTogUXVldWUgaGFuZGxlIGZyb20gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoKVxcbisgKlxcbisgKiBEZXJlZ2lzdGVycyBhbmQgZnJlZXMgYWxsIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJvcmRpbmF0ZSBxdWV1ZS5cXG4rICpcXG4rICogUmV0dXJuOlxcbisgKiAgIEhfU1VDQ0VTUyAtIFF1ZXVlIGZyZWVkIHN1Y2Nlc3NmdWxseVxcbisgKiAgIEhfUEFSQU1FVEVSIC0gSW52YWxpZCBwYXJhbWV0ZXJzXFxuKyAqICAgSF9IQVJEV0FSRSAtIEhhcmR3YXJlIGVycm9yXFxuKyAqICAgSF9TVEFURSAtIFZJT0Egbm90IGluIHZhbGlkIHN0YXRlXFxuKyAqICAgSF9CVVNZIC8gSF9MT05HX0JVU1lfKiAtIFJlc291cmNlIGJ1c3ksIHJldHJ5XFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xcbitcXG4rXFx0cmV0dXJuIHBscGFyX2hjYWxsOShIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUsXFxuK1xcdFxcdFxcdCAgICByZXRidWYsIHVuaXRfYWRkcmVzcywgcXVldWVfaGFuZGxlKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUgLSBSZWdpc3RlciBwcmltYXJ5IHF1ZXVlIGFuZCBnZXQgaGFuZGxlXFxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcXG4rICogQGJ1ZmZlcl9saXN0OiBETUEgYWRkcmVzcyBvZiBidWZmZXIgbGlzdFxcbisgKiBAcmVjX3F1ZXVlOiBCdWZmZXIgZGVzY3JpcHRvciBvZiByZWNlaXZlIHF1ZXVlXFxuKyAqIEBmaWx0ZXJfbGlzdDogRE1BIGFkZHJlc3Mgb2YgZmlsdGVyIGxpc3RcXG4rICogQG1hY19hZGRyZXNzOiBNQUMgYWRkcmVzc1xcbisgKiBAcXVldWVfaGFuZGxlOiBPdXRwdXQgcGFyYW1ldGVyIGZvciBxdWV1ZSBoYW5kbGVcXG4rICpcXG4rICogUmVnaXN0ZXJzIHRoZSBwcmltYXJ5IHJlY2VpdmUgcXVldWUgKHF1ZXVlIDApIHdpdGggdGhlIGh5cGVydmlzb3IgYW5kXFxuKyAqIHJldHVybnMgdGhlIHF1ZXVlIGhhbmRsZS4gVGhpcyBpcyBuZWVkZWQgaW4gbXVsdGktcXVldWUgbW9kZSB0byB1c2VcXG4rICogaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSgpIGZvciBhbGwgcXVldWVzIGluY2x1ZGluZyBxdWV1ZSAwLlxcbisgKlxcbisgKiBSZXR1cm46IEhfU1VDQ0VTUyAoMCkgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2VcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3dpdGhfaGFuZGxlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9saXN0LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHJlY19xdWV1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmaWx0ZXJfbGlzdCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBtYWNfYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdTY0ICpxdWV1ZV9oYW5kbGUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xcbitcXHRsb25nIHJjO1xcbitcXG4rXFx0cmMgPSBwbHBhcl9oY2FsbDkoSF9SRUdJU1RFUl9MT0dJQ0FMX0xBTiwgcmV0YnVmLFxcbitcXHRcXHRcXHQgIHVuaXRfYWRkcmVzcywgYnVmZmVyX2xpc3QsIHJlY19xdWV1ZSxcXG4rXFx0XFx0XFx0ICBmaWx0ZXJfbGlzdCwgbWFjX2FkZHJlc3MpO1xcbitcXG4rXFx0aWYgKHJjID09IEhfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBxdWV1ZV9oYW5kbGUpXFxuK1xcdFxcdCpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07XFxuK1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuIC8qIEZXIGFsbG93cyB1cyB0byBzZW5kIDYgZGVzY3JpcHRvcnMgYnV0IHdlIG9ubHkgdXNlIG9uZSBzbyBtYXJrXFxuICAqIHRoZSBvdGhlciA1IGFzIHVudXNlZCAoMClcXG4gICovXFxuQEAgLTEyMSwxNSArMjgyLDU1IEBAIHN0YXRpYyBpbmxpbmUgbG9uZyBoX2lsbGFuX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXFxuICNkZWZpbmUgSUJNVkVUSF9NQVhfVFhfQlVGX1NJWkUgKDEwMjQgKiA2NClcXG4gI2RlZmluZSBJQk1WRVRIX01BWF9RVUVVRVMgMTZVXFxuICNkZWZpbmUgSUJNVkVUSF9ERUZBVUxUX1FVRVVFUyA4VVxcbi0jZGVmaW5lIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCA4VVxcbisjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1FVRVVFUyAxNlVcXG4rI2RlZmluZSBJQk1WRVRIX0RFRkFVTFRfUlhfUVVFVUVTIDFVXFxuKyNkZWZpbmUgSUJNVkVUSF9NQVhfUlhfUkVHVUxBUiA4VVxcbisjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1FVRVVFIDEyVVxcbisjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAxMlVcXG4gXFxuIHN0YXRpYyBpbnQgcG9vbF9zaXplW10gPSB7IDUxMiwgMTAyNCAqIDIsIDEwMjQgKiAxNiwgMTAyNCAqIDMyLCAxMDI0ICogNjQgfTtcXG4gc3RhdGljIGludCBwb29sX2NvdW50W10gPSB7IDI1NiwgNTEyLCAyNTYsIDI1NiwgMjU2IH07XFxuIHN0YXRpYyBpbnQgcG9vbF9jb3VudF9jbW9bXSA9IHsgMjU2LCA1MTIsIDI1NiwgMjU2LCA2NCB9O1xcbi1zdGF0aWMgaW50IHBvb2xfYWN0aXZlW10gPSB7IDEsIDEsIDAsIDAsIDF9O1xcbitzdGF0aWMgaW50IHBvb2xfYWN0aXZlW10gPSB7IDEsIDEsIDAsIDAsIDB9O1xcbiBcXG4gI2RlZmluZSBJQk1fVkVUSF9JTlZBTElEX01BUCAoKHUxNikweGZmZmYpXFxuIFxcbitzdHJ1Y3QgaWJtdmV0aF9oY2FsbF9zdGF0cyB7XFxuK1xcdHU2NCByZWdfbGFuX3F1ZXVlO1xcdC8qIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFICovXFxuK1xcdHU2NCByZWdfbGFuO1xcdFxcdC8qIEhfUkVHSVNURVJfTE9HSUNBTF9MQU4gKi9cXG4rXFx0dTY0IGFkZF9idWZzX3F1ZXVlO1xcdC8qIEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlNfUVVFVUUgKi9cXG4rXFx0dTY0IGFkZF9idWZzO1xcdFxcdC8qIEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlMgKi9cXG4rXFx0dTY0IGFkZF9idWY7XFx0XFx0LyogSF9BRERfTE9HSUNBTF9MQU5fQlVGRkVSICovXFxuK1xcdHU2NCBmcmVlX2xhbl9xdWV1ZTtcXHQvKiBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgKi9cXG4rXFx0dTY0IGZyZWVfbGFuO1xcdFxcdC8qIEhfRlJFRV9MT0dJQ0FMX0xBTiAqL1xcbitcXHR1NjQgc2VuZF9sYW47XFx0XFx0LyogSF9TRU5EX0xPR0lDQUxfTEFOICovXFxuK307XFxuK1xcbitzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyB7XFxuK1xcdHU2NCBwYWNrZXRzO1xcbitcXHR1NjQgYnl0ZXM7XFxuK1xcdHU2NCBpbnRlcnJ1cHRzO1xcbitcXHR1NjQgcG9sbHM7XFxuK1xcdHU2NCBsYXJnZV9wYWNrZXRzO1xcbitcXHR1NjQgaW52YWxpZF9idWZmZXJzO1xcbitcXHR1NjQgbm9fYnVmZmVyX2Ryb3BzO1xcbit9O1xcbitcXG4rc3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMge1xcbitcXHR1NjQgcGFja2V0cztcXG4rXFx0dTY0IGJ5dGVzO1xcbitcXHR1NjQgbGFyZ2VfcGFja2V0cztcXG4rXFx0dTY0IGRyb3BwZWRfcGFja2V0cztcXG4rXFx0dTY0IHNlbmRfZmFpbHVyZXM7XFxuK1xcdHU2NCBjaGVja3N1bV9vZmZsb2FkO1xcbit9O1xcbitcXG4rI2RlZmluZSBJQk1WRVRIX05VTV9SWF9RU1RBVFMgXFxcXFxcbitcXHQoc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1NjQpKVxcbitcXG4rI2RlZmluZSBJQk1WRVRIX05VTV9UWF9RU1RBVFMgXFxcXFxcbitcXHQoc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1NjQpKVxcbitcXG4gc3RydWN0IGlibXZldGhfYnVmZl9wb29sIHtcXG4gICAgIHUzMiBzaXplO1xcbiAgICAgdTMyIGluZGV4O1xcbkBAIC0xNTIsMjMgKzM1MywyOCBAQCBzdHJ1Y3QgaWJtdmV0aF9yeF9xIHtcXG4gICAgIGRtYV9hZGRyX3QgcXVldWVfZG1hO1xcbiAgICAgdTMyICAgICAgICBxdWV1ZV9sZW47XFxuICAgICBzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5ICpxdWV1ZV9hZGRyO1xcbitcXHRzcGlubG9ja190XFx0cmVwbGVuaXNoX2xvY2s7XFx0Lyogc2VyaWFsaXplcyBwZXItcXVldWUgYnVmZmVyIHJlcGxlbmlzaCAqL1xcbiB9O1xcbiBcXG4gc3RydWN0IGlibXZldGhfYWRhcHRlciB7XFxuIFxcdHN0cnVjdCB2aW9fZGV2ICp2ZGV2O1xcbiBcXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2O1xcbi1cXHRzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTtcXG4rXFx0c3RydWN0IG5hcGlfc3RydWN0IG5hcGlbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcXG4gXFx0c3RydWN0IHdvcmtfc3RydWN0IHdvcms7XFxuIFxcdHVuc2lnbmVkIGludCBtY2FzdEZpbHRlclNpemU7XFxuLVxcdHZvaWQgKmJ1ZmZlcl9saXN0X2FkZHI7XFxuK1xcdHZvaWQgKmJ1ZmZlcl9saXN0X2FkZHJbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcXG4gXFx0dm9pZCAqZmlsdGVyX2xpc3RfYWRkcjtcXG4gXFx0dm9pZCAqdHhfbHRiX3B0cltJQk1WRVRIX01BWF9RVUVVRVNdO1xcbiBcXHR1bnNpZ25lZCBpbnQgdHhfbHRiX3NpemU7XFxuIFxcdGRtYV9hZGRyX3QgdHhfbHRiX2RtYVtJQk1WRVRIX01BWF9RVUVVRVNdO1xcbi1cXHRkbWFfYWRkcl90IGJ1ZmZlcl9saXN0X2RtYTtcXG4rXFx0ZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcXG4gXFx0ZG1hX2FkZHJfdCBmaWx0ZXJfbGlzdF9kbWE7XFxuLVxcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCByeF9idWZmX3Bvb2xbSUJNVkVUSF9OVU1fQlVGRl9QT09MU107XFxuLVxcdHN0cnVjdCBpYm12ZXRoX3J4X3EgcnhfcXVldWU7XFxuK1xcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCByeF9idWZmX3Bvb2xbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXVtJQk1WRVRIX05VTV9CVUZGX1BPT0xTXTtcXG4rXFx0c3RydWN0IGlibXZldGhfcnhfcSByeF9xdWV1ZVtJQk1WRVRIX01BWF9SWF9RVUVVRVNdO1xcbitcXHR1NjQgcXVldWVfaGFuZGxlW0lCTVZFVEhfTUFYX1JYX1FVRVVFU107XFxuK1xcdHVuc2lnbmVkIGludCBxdWV1ZV9pcnFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcXG4rXFx0aW50IG11bHRpX3F1ZXVlO1xcbitcXHR1bnNpZ25lZCBpbnQgbnVtX3J4X3F1ZXVlcztcXG4gXFx0aW50IHJ4X2NzdW07XFxuIFxcdGludCBsYXJnZV9zZW5kO1xcbiBcXHRib29sIGlzX2FjdGl2ZV90cnVuaztcXG5AQCAtMTg4LDYgKzM5NCwxMiBAQCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyIHtcXG4gXFx0dTY0IHR4X3NlbmRfZmFpbGVkO1xcbiBcXHR1NjQgdHhfbGFyZ2VfcGFja2V0cztcXG4gXFx0dTY0IHJ4X2xhcmdlX3BhY2tldHM7XFxuK1xcbitcXHQvKiBNdWx0aS1xdWV1ZSBzdGF0aXN0aWNzICovXFxuK1xcdHN0cnVjdCBpYm12ZXRoX2hjYWxsX3N0YXRzIGhjYWxsX3N0YXRzO1xcbitcXHRzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyAqcnhfcXN0YXRzO1xcbitcXHRzdHJ1Y3QgaWJtdmV0aF90eF9xdWV1ZV9zdGF0cyAqdHhfcXN0YXRzO1xcbitcXG4gXFx0LyogRXRodG9vbCBzZXR0aW5ncyAqL1xcbiBcXHR1OCBkdXBsZXg7XFxuIFxcdHUzMiBzcGVlZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMzBUMjM6MDU6NDUuODU3NTQ2NTEyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDgyMjcyNTY4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJQk1WRVRIXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaWJtdmV0aF9zZXRfY2hhbm5lbHNcIixcbiAgICBcImlibXZldGhfcmVzaXplX3J4X3F1ZXVlc19pbmNyZW1lbnRhbFwiLFxuICAgIFwiaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX2RyYWluX3J4X3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzXCIsXG4gICAgXCJpYm12ZXRoX3RvZ2dsZV9pcnFcIixcbiAgICBcImlibXZldGhfcmVnaXN0ZXJfcnhfcXVldWVzXCIsXG4gICAgXCJpYm12ZXRoX29wZW5cIixcbiAgICBcImlibXZldGhfY2xvc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIG11bHRpLXF1ZXVlIHN1cHBvcnQgdG8gdGhlIGlibXZldGggZHJpdmVyLCBpbnRyb2R1Y2luZyBuZXcgaHlwZXJjYWxscyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBxdWV1ZSBtYW5hZ2VtZW50LCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBldGh0b29sIG9wZXJhdGlvbnMuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCB2aWEgbmV0d29yayBvcGVyYXRpb25zIGFuZCBldGh0b29sIGNvbW1hbmRzLCBtYWtpbmcgdGhlbSBzdWl0YWJsZSBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0YjRjMGNkNDJjY2VlZGI5ODAzYjdjNjljNGVmZTMzMjc2ZmRkNzIyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBKdW4gMzAgMjM6MDU6NDQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmhcbmluZGV4IGRmZjkwYTdkN2Y3MGI4Li5iZjJmMWIwMzU2YzQ3NyAxMDA2NDRcbi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaFxuKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oXG5AQCAtMzYyLDcgKzM2MiwxMSBAQFxuICNkZWZpbmUgSF9HVUVTVF9ERUxFVEVcdFx0MHg0ODhcbiAjZGVmaW5lIEhfUEtTX1dSQVBfT0JKRUNUXHQweDQ5MFxuICNkZWZpbmUgSF9QS1NfVU5XUkFQX09CSkVDVFx0MHg0OTRcbi0jZGVmaW5lIE1BWF9IQ0FMTF9PUENPREVcdEhfUEtTX1VOV1JBUF9PQkpFQ1RcbisjZGVmaW5lIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFIDB4NDlDXG4rI2RlZmluZSBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFIDB4NEEwXG4rI2RlZmluZSBIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSX1FVRVVFIDB4NEE0XG4rI2RlZmluZSBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgMHg0QThcbisjZGVmaW5lIE1BWF9IQ0FMTF9PUENPREVcdEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRVxuIFxuIC8qIFNjb3BlIGFyZ3MgZm9yIEhfU0NNX1VOQklORF9BTEwgKi9cbiAjZGVmaW5lIEhfVU5CSU5EX1NDT1BFX0FMTCAoMHgxKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG5pbmRleCA3M2UwNTFkMjZiOWQ4OC4uZDdiZjAxMjcxMTYxY2IgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jXG5AQCAtMjEsNiArMjEsOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NrYnVmZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaW50ZXJydXB0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pcnEuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycWRvbWFpbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BtLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ldGh0b29sLmhcdTAwM2VcbkBAIC0yOCw2ICszMCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwdjYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vaHZjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS92aW8uaFx1MDAzZVxuQEAgLTk1LDQ5ICs5OCw4OSBAQCBzdGF0aWMgc3RydWN0IGlibXZldGhfc3RhdCBpYm12ZXRoX3N0YXRzW10gPSB7XG4gXHR7IFwiZndfZW5hYmxlZF9pcHY2X2NzdW1cIiwgSUJNVkVUSF9TVEFUX09GRihmd19pcHY2X2NzdW1fc3VwcG9ydCkgfSxcbiBcdHsgXCJ0eF9sYXJnZV9wYWNrZXRzXCIsIElCTVZFVEhfU1RBVF9PRkYodHhfbGFyZ2VfcGFja2V0cykgfSxcbiBcdHsgXCJyeF9sYXJnZV9wYWNrZXRzXCIsIElCTVZFVEhfU1RBVF9PRkYocnhfbGFyZ2VfcGFja2V0cykgfSxcbi1cdHsgXCJmd19lbmFibGVkX2xhcmdlX3NlbmRcIiwgSUJNVkVUSF9TVEFUX09GRihmd19sYXJnZV9zZW5kX3N1cHBvcnQpIH1cbitcdHsgXCJmd19lbmFibGVkX2xhcmdlX3NlbmRcIiwgSUJNVkVUSF9TVEFUX09GRihmd19sYXJnZV9zZW5kX3N1cHBvcnQpIH0sXG4rXHR7IFwiaGNhbGxfcmVnX2xhbl9xdWV1ZVwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLnJlZ19sYW5fcXVldWUpIH0sXG4rXHR7IFwiaGNhbGxfcmVnX2xhblwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLnJlZ19sYW4pIH0sXG4rXHR7IFwiaGNhbGxfYWRkX2J1ZnNfcXVldWVcIiwgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5hZGRfYnVmc19xdWV1ZSkgfSxcbitcdHsgXCJoY2FsbF9hZGRfYnVmc1wiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLmFkZF9idWZzKSB9LFxuK1x0eyBcImhjYWxsX2FkZF9idWZcIiwgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5hZGRfYnVmKSB9LFxuK1x0eyBcImhjYWxsX2ZyZWVfbGFuX3F1ZXVlXCIsIElCTVZFVEhfU1RBVF9PRkYoaGNhbGxfc3RhdHMuZnJlZV9sYW5fcXVldWUpIH0sXG4rXHR7IFwiaGNhbGxfZnJlZV9sYW5cIiwgSUJNVkVUSF9TVEFUX09GRihoY2FsbF9zdGF0cy5mcmVlX2xhbikgfSxcbitcdHsgXCJoY2FsbF9zZW5kX2xhblwiLCBJQk1WRVRIX1NUQVRfT0ZGKGhjYWxsX3N0YXRzLnNlbmRfbGFuKSB9LFxuIH07XG4gXG4gLyogc2ltcGxlIG1ldGhvZHMgb2YgZ2V0dGluZyBkYXRhIGZyb20gdGhlIGN1cnJlbnQgcnhxIGVudHJ5ICovXG4tc3RhdGljIGlubGluZSB1MzIgaWJtdmV0aF9yeHFfZmxhZ3Moc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgaW5saW5lIHUzMiBpYm12ZXRoX3J4cV9mbGFncyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0ICAgIGludCBxdWV1ZV9pbmRleClcbiB7XG4tXHRyZXR1cm4gYmUzMl90b19jcHUoYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItXHUwMDNlcnhfcXVldWUuaW5kZXhdLmZsYWdzX29mZik7XG4rXHRzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcbitcbitcdHJldHVybiBiZTMyX3RvX2NwdShyeHEtXHUwMDNlcXVldWVfYWRkcltyeHEtXHUwMDNlaW5kZXhdLmZsYWdzX29mZik7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3RvZ2dsZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0ICAgICBpbnQgcXVldWVfaW5kZXgpXG4re1xuK1x0cmV0dXJuIChpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXHUwMDI2IElCTVZFVEhfUlhRX1RPR0dMRSkgXHUwMDNlXHUwMDNlXG4rXHRcdElCTVZFVEhfUlhRX1RPR0dMRV9TSElGVDtcbiB9XG4gXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfdG9nZ2xlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4rc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfcGVuZGluZ19idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdFx0ICAgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0cmV0dXJuIChpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSBcdTAwMjYgSUJNVkVUSF9SWFFfVE9HR0xFKSBcdTAwM2VcdTAwM2Vcbi1cdFx0XHRJQk1WRVRIX1JYUV9UT0dHTEVfU0hJRlQ7XG4rXHRyZXR1cm4gaWJtdmV0aF9yeHFfdG9nZ2xlKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSA9PVxuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XS50b2dnbGU7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4rc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHRcdCAgIGludCBxdWV1ZV9pbmRleClcbiB7XG4tXHRyZXR1cm4gaWJtdmV0aF9yeHFfdG9nZ2xlKGFkYXB0ZXIpID09IGFkYXB0ZXItXHUwMDNlcnhfcXVldWUudG9nZ2xlO1xuK1x0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSBcdTAwMjYgSUJNVkVUSF9SWFFfVkFMSUQ7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHQgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIpIFx1MDAyNiBJQk1WRVRIX1JYUV9WQUxJRDtcbitcdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyLCBxdWV1ZV9pbmRleCkgXHUwMDI2IElCTVZFVEhfUlhRX09GRl9NQVNLO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9sYXJnZV9wYWNrZXQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuIHtcbi1cdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSBcdTAwMjYgSUJNVkVUSF9SWFFfT0ZGX01BU0s7XG4rXHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlciwgcXVldWVfaW5kZXgpIFx1MDAyNiBJQk1WRVRIX1JYUV9MUkdfUEtUO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuK3tcbitcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdO1xuK1xuK1x0cmV0dXJuIGJlMzJfdG9fY3B1KHJ4cS1cdTAwM2VxdWV1ZV9hZGRyW3J4cS1cdTAwM2VpbmRleF0ubGVuZ3RoKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4rc3RhdGljIGlubGluZSBib29sXG4raWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaW5kZXgsXG4rXHRcdFx0ICAgICB1NjQgY29ycmVsYXRvcilcbiB7XG4tXHRyZXR1cm4gaWJtdmV0aF9yeHFfZmxhZ3MoYWRhcHRlcikgXHUwMDI2IElCTVZFVEhfUlhRX0xSR19QS1Q7XG4rXHR1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuK1x0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuK1xuK1x0cmV0dXJuIHBvb2wgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgaW5kZXggXHUwMDNjIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5zaXplO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9yeHFfYWR2YW5jZShzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEpXG4ge1xuLVx0cmV0dXJuIGJlMzJfdG9fY3B1KGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4XS5sZW5ndGgpO1xuK1x0aWYgKCsrcnhxLVx1MDAzZWluZGV4ID09IHJ4cS1cdTAwM2VudW1fc2xvdHMpIHtcbitcdFx0cnhxLVx1MDAzZWluZGV4ID0gMDtcbitcdFx0cnhxLVx1MDAzZXRvZ2dsZSA9ICFyeHEtXHUwMDNldG9nZ2xlO1xuK1x0fVxuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9jc3VtX2dvb2Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgaW5saW5lIGludCBpYm12ZXRoX3J4cV9jc3VtX2dvb2Qoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdFx0aW50IHF1ZXVlX2luZGV4KVxuIHtcbi1cdHJldHVybiBpYm12ZXRoX3J4cV9mbGFncyhhZGFwdGVyKSBcdTAwMjYgSUJNVkVUSF9SWFFfQ1NVTV9HT09EO1xuK1x0cmV0dXJuIGlibXZldGhfcnhxX2ZsYWdzKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSBcdTAwMjYgSUJNVkVUSF9SWFFfQ1NVTV9HT09EO1xuIH1cbiBcbiBzdGF0aWMgdW5zaWduZWQgaW50IGlibXZldGhfcmVhbF9tYXhfdHhfcXVldWVzKHZvaWQpXG5AQCAtMTQ3LDYgKzE5MCw0NzIgQEAgc3RhdGljIHVuc2lnbmVkIGludCBpYm12ZXRoX3JlYWxfbWF4X3R4X3F1ZXVlcyh2b2lkKVxuIFx0cmV0dXJuIG1pbihuX2NwdSwgSUJNVkVUSF9NQVhfUVVFVUVTKTtcbiB9XG4gXG4rLyoqXG4rICogaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdCAtIEFsbG9jYXRlIGFuZCBtYXAgZmlsdGVyIGxpc3RcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxuKyAqL1xuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXG4rXHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbitcdGlmICghYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInVuYWJsZSB0byBhbGxvY2F0ZSBmaWx0ZXIgcGFnZXNcXG5cIik7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsXG4rXHRcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIsXG4rXHRcdFx0XHRcdFx0ICA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4rXHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSkpIHtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwidW5hYmxlIHRvIG1hcCBmaWx0ZXIgbGlzdCBwYWdlc1xcblwiKTtcbitcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcik7XG4rXHRcdGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkciA9IE5VTEw7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiZmlsdGVyIGxpc3QgQCAweCVwIChETUE6IDB4JWxseClcXG5cIixcbitcdFx0ICAgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyLFxuK1x0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2ZyZWVfZmlsdGVyX2xpc3QgLSBGcmVlIGZpbHRlciBsaXN0IHJlc291cmNlc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICovXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbitcbitcdGlmIChhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSkge1xuK1x0XHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEsIDQwOTYsXG4rXHRcdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuK1x0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSA9IDA7XG4rXHR9XG4rXG4rXHRpZiAoYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKSB7XG4rXHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIpO1xuK1x0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIgPSBOVUxMO1xuK1x0fVxuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0cyAtIEFsbG9jYXRlIHBlci1xdWV1ZSBSWCBzdGF0aXN0aWNzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmVcbisgKi9cbitzdGF0aWMgaW50IGlibXZldGhfYWxsb2NfcnhfcXN0YXRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHMgPSBrY2FsbG9jKElCTVZFVEhfTUFYX1JYX1FVRVVFUyxcbitcdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3F1ZXVlX3N0YXRzKSxcbitcdFx0XHRcdCAgICAgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzIC0gRnJlZSBwZXItcXVldWUgUlggc3RhdGlzdGljc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICovXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuK3tcbitcdGtmcmVlKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKTtcbitcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzID0gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9hbGxvY190eF9xc3RhdHMgLSBBbGxvY2F0ZSBwZXItcXVldWUgVFggc3RhdGlzdGljc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBmYWlsdXJlXG4rICovXG4rc3RhdGljIGludCBpYm12ZXRoX2FsbG9jX3R4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuK3tcbitcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzID0ga2NhbGxvYyhJQk1WRVRIX01BWF9RVUVVRVMsXG4rXHRcdFx0XHQgICAgIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF90eF9xdWV1ZV9zdGF0cyksXG4rXHRcdFx0XHQgICAgIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cylcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9mcmVlX3R4X3FzdGF0cyAtIEZyZWUgcGVyLXF1ZXVlIFRYIHN0YXRpc3RpY3NcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqL1xuK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRrZnJlZShhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cyk7XG4rXHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cyA9IE5VTEw7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfYWxsb2NfcnhfcXVldWVzIC0gQWxsb2NhdGUgcGVyLXF1ZXVlIFJYIHJlc291cmNlc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBwZXIgUlggcXVldWVcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9hbGxvY19yeF9xdWV1ZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHJ4cV9lbnRyaWVzKVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuK1x0XHRpZiAoIWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSkge1xuK1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgbGlzdCBmb3IgcXVldWUgJWRcXG5cIiwgaSk7XG4rXHRcdFx0Z290byBlcnJfY2xlYW51cDtcbitcdFx0fVxuK1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbiA9XG4rXHRcdFx0c2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3FfZW50cnkpICogcnhxX2VudHJpZXM7XG4rXHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9XG4rXHRcdFx0ZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9sZW4sXG4rXHRcdFx0XHRcdCAgIFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfZG1hLFxuK1x0XHRcdFx0XHQgICBHRlBfS0VSTkVMKTtcbitcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gYWxsb2NhdGUgUlggcXVldWUgZm9yIHF1ZXVlICVkXFxuXCIsIGkpO1xuK1x0XHRcdGdvdG8gZXJyX2NsZWFudXA7XG4rXHRcdH1cbitcbitcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0gPSBkbWFfbWFwX3NpbmdsZShkZXYsXG4rXHRcdFx0XHRcdFx0XHQgICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSxcbitcdFx0XHRcdFx0XHRcdCAgICAgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuK1x0XHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSkpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcblwiLCBpKTtcbitcdFx0XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtpXSA9IDA7XG4rXHRcdFx0Z290byBlcnJfY2xlYW51cDtcbitcdFx0fVxuK1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLmluZGV4ID0gMDtcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5udW1fc2xvdHMgPSByeHFfZW50cmllcztcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS50b2dnbGUgPSAxO1xuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnJlcGxlbmlzaF9sb2NrKTtcbitcbitcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwicXVldWUgJWQ6IGJ1ZmZlcl9saXN0IEAgMHglcCAoRE1BOiAweCVsbHgpLCByeF9xdWV1ZSBAIDB4JXAgKERNQTogMHglbGx4KSwgJWxsdSBlbnRyaWVzXFxuXCIsXG4rXHRcdFx0ICAgaSwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW2ldLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbaV0sXG4rXHRcdFx0ICAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9kbWEsXG4rXHRcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZW50cmllcyk7XG4rXHR9XG4rXG4rXHRuZXRkZXZfZGJnKG5ldGRldiwgXCJhbGxvY2F0ZWQgJWQgUlggcXVldWUocykgd2l0aCAlZCBlbnRyaWVzIGVhY2hcXG5cIixcbitcdFx0ICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzLCByeHFfZW50cmllcyk7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitlcnJfY2xlYW51cDpcbitcdC8qIENsZWFuIHVwIHByZXZpb3VzbHkgYWxsb2NhdGVkIHF1ZXVlcyAqL1xuK1x0Zm9yICg7IGkgXHUwMDNlPSAwOyBpLS0pIHtcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldKSB7XG4rXHRcdFx0ZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldLFxuK1x0XHRcdFx0XHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldID0gMDtcbitcdFx0fVxuK1x0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyKSB7XG4rXHRcdFx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbixcbitcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXG4rXHRcdFx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9kbWEpO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSkge1xuK1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSA9IE5VTEw7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiAtRU5PTUVNO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzIC0gRnJlZSBhbGwgUlggcXVldWUgcmVzb3VyY2VzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKi9cbitzdGF0aWMgdm9pZCBpYm12ZXRoX2NsZWFudXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbitcdGludCBpO1xuK1xuK1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCJjbGVhbmluZyB1cCAlZCBSWCBxdWV1ZShzKVxcblwiLFxuK1x0XHQgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldKSB7XG4rXHRcdFx0ZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldLFxuK1x0XHRcdFx0XHQgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW2ldID0gMDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9hZGRyKSB7XG4rXHRcdFx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2xlbixcbitcdFx0XHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW2ldLnF1ZXVlX2FkZHIsXG4rXHRcdFx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtpXS5xdWV1ZV9kbWEpO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbaV0ucXVldWVfYWRkciA9IE5VTEw7XG4rXHRcdH1cbitcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSkge1xuK1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbaV0pO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSA9IE5VTEw7XG4rXHRcdH1cbitcdH1cbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF90b2dnbGVfaXJxIC0gQ29tbW9uIGhlbHBlciB0byBlbmFibGUvZGlzYWJsZSBxdWV1ZSBpbnRlcnJ1cHRzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWVfaW5kZXg6IEluZGV4IG9mIHRoZSBxdWV1ZSAoMCBmb3IgcHJpbWFyeSwgMSsgZm9yIHN1Ym9yZGluYXRlKVxuKyAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlXG4rICpcbisgKiBGb3IgcXVldWUgMCAocHJpbWFyeSksIHVzZXMgaF92aW9fc2lnbmFsKCkgYXMgaXQncyByZWdpc3RlcmVkIHZpYVxuKyAqIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oKS4gRm9yIHN1Ym9yZGluYXRlIHF1ZXVlcyAoMSspLCB1c2VzIEhfVklPQ1RMXG4rICogd2l0aCBIX0VOQUJMRS9ESVNBQkxFX1ZJT19JTlRFUlJVUFQgZm9yIHBlci1xdWV1ZSBpbnRlcnJ1cHQgY29udHJvbC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZVxuKyAqL1xuK3N0YXRpYyBpbnRcbitpYm12ZXRoX3RvZ2dsZV9pcnEoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciwgaW50IHF1ZXVlX2luZGV4LCBib29sIGVuYWJsZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIHJjO1xuK1x0dW5zaWduZWQgbG9uZyBpcnEgPSBhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pbmRleF07XG4rXHRjb25zdCBjaGFyICphY3Rpb24gPSBlbmFibGUgPyBcImVuYWJsZVwiIDogXCJkaXNhYmxlXCI7XG4rXG4rXHRpZiAocXVldWVfaW5kZXggPT0gMCkge1xuK1x0XHQvKiBQcmltYXJ5IHF1ZXVlOiB1c2UgaF92aW9fc2lnbmFsKCkgKi9cbitcdFx0cmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdCAgZW5hYmxlID8gVklPX0lSUV9FTkFCTEUgOiBWSU9fSVJRX0RJU0FCTEUpO1xuK1x0fSBlbHNlIHtcbitcdFx0LyogU3Vib3JkaW5hdGUgcXVldWVzOiB1c2UgSF9WSU9DVEwgd2l0aCBoYXJkd2FyZSBJUlEgKi9cbitcdFx0c3RydWN0IGlycV9kYXRhICppcnFfZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoaXJxKTtcbitcdFx0aXJxX2h3X251bWJlcl90IGh3aXJxO1xuK1x0XHR1NjQgdmlvY3RsX2NtZCA9IGVuYWJsZSA/IEhfRU5BQkxFX1ZJT19JTlRFUlJVUFQgOiBIX0RJU0FCTEVfVklPX0lOVEVSUlVQVDtcbitcbitcdFx0aWYgKCFpcnFfZGF0YSkge1xuK1x0XHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0XHQgICBcIkZhaWxlZCB0byBnZXQgSVJRIGRhdGEgZm9yIHF1ZXVlICVkICh2aXJxPSVsdSlcXG5cIixcbitcdFx0XHRcdCAgIHF1ZXVlX2luZGV4LCBpcnEpO1xuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4rXG4rXHRcdGh3aXJxID0gaXJxZF90b19od2lycShpcnFfZGF0YSk7XG4rXHRcdHJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfVklPQ1RMLFxuK1x0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHR2aW9jdGxfY21kLFxuK1x0XHRcdFx0XHRod2lycSwgMCwgMCk7XG4rXG4rXHRcdGlmIChyYyA9PSBIX1BBUkFNRVRFUikge1xuK1x0XHRcdC8qIEhfUEFSQU1FVEVSIGlzIG5vbi1mYXRhbCB3aGVuIElSUSBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuICovXG4rXHRcdFx0bmV0ZGV2X3dhcm5fb25jZShhZGFwdGVyLVx1MDAzZW5ldGRldixcbitcdFx0XHRcdFx0IFwiSF9WSU9DVEwgJXMgSVJRIHJldHVybmVkIEhfUEFSQU1FVEVSIGZvciBxdWV1ZSAlZCAoaHdpcnE9JWx1KVxcblwiLFxuK1x0XHRcdFx0XHQgYWN0aW9uLCBxdWV1ZV9pbmRleCwgaHdpcnEpO1xuK1x0XHRcdHJldHVybiAwO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAocmMpXG4rXHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0ICAgXCJGYWlsZWQgdG8gJXMgSVJRIGZvciBxdWV1ZSAlZCwgcmM9JWxkXFxuXCIsXG4rXHRcdFx0ICAgYWN0aW9uLCBxdWV1ZV9pbmRleCwgcmMpO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2Rpc2FibGVfaXJxIC0gRGlzYWJsZSBpbnRlcnJ1cHQgZm9yIGEgc3BlY2lmaWMgcXVldWVcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBxdWV1ZV9pbmRleDogSW5kZXggb2YgdGhlIHF1ZXVlICgwIGZvciBwcmltYXJ5LCAxKyBmb3Igc3Vib3JkaW5hdGUpXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2VcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9kaXNhYmxlX2lycShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaW5kZXgpXG4re1xuK1x0cmV0dXJuIGlibXZldGhfdG9nZ2xlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCwgZmFsc2UpO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2VuYWJsZV9pcnEgLSBFbmFibGUgaW50ZXJydXB0IGZvciBhIHNwZWNpZmljIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWVfaW5kZXg6IEluZGV4IG9mIHRoZSBxdWV1ZSAoMCBmb3IgcHJpbWFyeSwgMSsgZm9yIHN1Ym9yZGluYXRlKVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlXG4rICovXG4rc3RhdGljIGludFxuK2libXZldGhfZW5hYmxlX2lycShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaW5kZXgpXG4re1xuK1x0cmV0dXJuIGlibXZldGhfdG9nZ2xlX2lycShhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MgLSBEcm9wIHZpcnEgbWFwcGluZ3MgZm9yIHF1ZXVlcyAxLi5OXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIFN1Ym9yZGluYXRlIHF1ZXVlcyBnZXQgbWFwcGluZ3MgZnJvbSBpcnFfY3JlYXRlX21hcHBpbmcoKSBkdXJpbmcgUEhZUFxuKyAqIHJlZ2lzdHJhdGlvbi4gIFF1ZXVlIDAgdXNlcyBuZXRkZXYtXHUwMDNlaXJxIGZyb20gZGV2aWNlIHRyZWUgYW5kIGlzIGxlZnQgYWxvbmUuXG4rICogQ2FsbCBhZnRlciBmcmVlX2lycSgpIHdoZW4gaGFuZGxlcnMgd2VyZSBpbnN0YWxsZWQsIG9yIGFsb25lIHdoZW4gb3BlblxuKyAqIGZhaWxzIGR1cmluZyByZWdpc3Rlcl9yeF9xdWV1ZXMoKSBiZWZvcmUgcmVxdWVzdF9pcnEoKS5cbisgKi9cbitzdGF0aWMgdm9pZFxuK2libXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3Moc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdGlmIChhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSkge1xuK1x0XHRcdGlycV9kaXNwb3NlX21hcHBpbmcoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldID0gMDtcbitcdFx0fVxuK1x0fVxuK31cbitcbisvKipcbisgKiBpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMgLSBSZWdpc3RlciBJUlEgaGFuZGxlcnMgYW5kIGVuYWJsZSBOQVBJXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIFJlZ2lzdGVycyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIGFsbCBSWCBxdWV1ZXMgYW5kIGVuYWJsZXMgTkFQSSBwb2xsaW5nLlxuKyAqIEZvciBtdWx0aS1xdWV1ZSBtb2RlLCBlbmFibGVzIGh5cGVydmlzb3IgaW50ZXJydXB0IGRlbGl2ZXJ5IG9ubHkgYWZ0ZXJcbisgKiBldmVyeSBxdWV1ZSBoYXMgYSBMaW51eCBoYW5kbGVyIGluc3RhbGxlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9zZXR1cF9yeF9pbnRlcnJ1cHRzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuK1x0aW50IGksIHJjLCBudW0gPSBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW07IGkrKykge1xuK1x0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKSB7XG4rXHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwicXVldWUgJWQgaGFzIGludmFsaWQgSVJRICgwKVxcblwiLCBpKTtcbitcdFx0XHRyYyA9IC1FSU5WQUw7XG4rXHRcdFx0Z290byBlcnJfZnJlZV9pcnFzO1xuK1x0XHR9XG4rXG4rXHRcdHJjID0gcmVxdWVzdF9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0sIGlibXZldGhfaW50ZXJydXB0LFxuK1x0XHRcdFx0IDAsIG5ldGRldi1cdTAwM2VuYW1lLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuK1x0XHRpZiAocmMpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbitcdFx0XHRcdCAgIFwicmVxdWVzdF9pcnEoKSBmYWlsZWQgZm9yIGlycSAweCV4IHF1ZXVlICVkOiAlZFxcblwiLFxuK1x0XHRcdFx0ICAgYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0sIGksIHJjKTtcbitcdFx0XHRnb3RvIGVycl9mcmVlX2lycXM7XG4rXHRcdH1cbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG51bTsgaSsrKVxuK1x0XHRuYXBpX2VuYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuK1xuK1x0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUgXHUwMDI2XHUwMDI2IG51bSBcdTAwM2UgMSkge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW07IGkrKykge1xuK1x0XHRcdHJjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIGkpO1xuK1x0XHRcdGlmIChyYykge1xuK1x0XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdFx0XHRcdCAgIFwiRmFpbGVkIHRvIGVuYWJsZSBJUlEgZm9yIHF1ZXVlICVkLCByYz0lZFxcblwiLFxuK1x0XHRcdFx0XHQgICBpLCByYyk7XG4rXHRcdFx0XHR3aGlsZSAoLS1pIFx1MDAzZT0gMClcbitcdFx0XHRcdFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcbitcdFx0XHRcdHJjID0gLUVJTztcbitcdFx0XHRcdGdvdG8gZXJyX2Rpc2FibGVfbmFwaTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiAwO1xuK1xuK2Vycl9kaXNhYmxlX25hcGk6XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW07IGkrKylcbitcdFx0bmFwaV9kaXNhYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4rXHRpID0gbnVtO1xuK2Vycl9mcmVlX2lycXM6XG4rXHR3aGlsZSAoLS1pIFx1MDAzZT0gMClcbitcdFx0ZnJlZV9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0sIFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4rXHRpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKGFkYXB0ZXIpO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2NsZWFudXBfcnhfaW50ZXJydXB0cyAtIERpc2FibGUgTkFQSSBhbmQgZnJlZSBJUlFzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIERpc2FibGVzIE5BUEkgcG9sbGluZyBhbmQgZnJlZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBhbGwgUlggcXVldWVzLlxuKyAqL1xuK3N0YXRpYyB2b2lkXG4raWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKVxuK1x0XHRuYXBpX2Rpc2FibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdGlmIChhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSlcbitcdFx0XHRmcmVlX2lycShhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbitcdH1cbitcbitcdGlibXZldGhfZGlzcG9zZV9zdWJvcmRpbmF0ZV9pcnFfbWFwcGluZ3MoYWRhcHRlcik7XG4rXG4rXHQvKiBDbGVhciBxdWV1ZSAwIElSUSBudW1iZXIgKi9cbitcdGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxWzBdID0gMDtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9zZXR1cF9zaW5nbGVfcnhfaW50ZXJydXB0IC0gU2V0dXAgaW50ZXJydXB0IGZvciBhIHNpbmdsZSBSWCBxdWV1ZVxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gc2V0dXBcbisgKlxuKyAqIFJlZ2lzdGVycyB0aGUgSVJRIGhhbmRsZXIgZm9yIG9uZSBxdWV1ZS4gVXNlZCBkdXJpbmcgaW5jcmVtZW50YWxcbisgKiBzY2FsZS11cCB3aGVuIGFkZGluZyBuZXcgUlggcXVldWVzOyB0aGUgY2FsbGVyIGVuYWJsZXMgTkFQSSB2aWFcbisgKiBuYXBpX2VuYWJsZSgpIGFmdGVyIGlibXZldGhfZW5hYmxlX2lycSgpLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxuKyAqL1xuK3N0YXRpYyBpbnRcbitpYm12ZXRoX3NldHVwX3NpbmdsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdCAgaW50IHF1ZXVlX2lkeClcbit7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgcmM7XG4rXG4rXHRyYyA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0sIGlibXZldGhfaW50ZXJydXB0LFxuK1x0XHRcdCAwLCBuZXRkZXYtXHUwMDNlbmFtZSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW3F1ZXVlX2lkeF0pO1xuK1x0aWYgKHJjKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInJlcXVlc3RfaXJxKCkgZmFpbGVkIGZvciBxdWV1ZSAlZDogJWRcXG5cIixcbitcdFx0XHQgICBxdWV1ZV9pZHgsIHJjKTtcbitcdFx0cmV0dXJuIHJjO1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiU2V0dXAgSVJRICVkIGZvciBxdWV1ZSAlZFxcblwiLFxuK1x0XHQgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdLCBxdWV1ZV9pZHgpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0IC0gQ2xlYW51cCBpbnRlcnJ1cHQgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBjbGVhbnVwXG4rICpcbisgKiBGcmVlcyB0aGUgSVJRIGhhbmRsZXIgZm9yIG9uZSBxdWV1ZS4gVXNlZCBkdXJpbmcgaW5jcmVtZW50YWwgc2NhbGUtZG93bi5cbisgKi9cbitzdGF0aWMgdm9pZFxuK2libXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHQgICAgaW50IHF1ZXVlX2lkeClcbit7XG4rXHRpZiAoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSkge1xuK1x0XHRmcmVlX2lycShhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbcXVldWVfaWR4XSk7XG4rXHRcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsIFwiRnJlZWQgSVJRIGZvciBxdWV1ZSAlZFxcblwiLCBxdWV1ZV9pZHgpO1xuK1x0fVxuK31cbitcbiAvKiBzZXR1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyBmb3IgYSBidWZmZXIgcG9vbCAqL1xuIHN0YXRpYyB2b2lkIGlibXZldGhfaW5pdF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wsXG4gXHRcdFx0XHQgICAgIHUzMiBwb29sX2luZGV4LCB1MzIgcG9vbF9zaXplLFxuQEAgLTIwNSwxMSArNzE0LDczIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX2ZsdXNoX2J1ZmZlcih2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbmd0aClcbiBcdFx0YXNtKFwiZGNiZiAlMCwlMSwxXCIgOjogXCJiXCIgKGFkZHIpLCBcInJcIiAob2Zmc2V0KSk7XG4gfVxuIFxuKy8qKlxuKyAqIGlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnMgLSBBZGQgcmVjZWl2ZSBidWZmZXJzIHRvIGh5cGVydmlzb3JcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBkZXNjczogYXJyYXkgb2YgYnVmZmVyIGRlc2NyaXB0b3JzIHRvIGFkZFxuKyAqIEBmaWxsZWQ6IG51bWJlciBvZiB2YWxpZCBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXlcbisgKiBAYnVmZl9zaXplOiBzaXplIG9mIGVhY2ggYnVmZmVyIChtdWx0aS1xdWV1ZSBtb2RlIG9ubHkpXG4rICogQHF1ZXVlX2luZGV4OiBSWCBxdWV1ZSBpbmRleFxuKyAqXG4rICogUmV0dXJuOiBoeXBlcnZpc29yIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGxvbmcgaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVycyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHQgICAgdW5pb24gaWJtdmV0aF9idWZfZGVzYyAqZGVzY3MsXG4rXHRcdFx0XHRcdCAgICBpbnQgZmlsbGVkLFxuK1x0XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBidWZmX3NpemUsXG4rXHRcdFx0XHRcdCAgICBpbnQgcXVldWVfaW5kZXgpXG4re1xuK1x0c3RydWN0IHZpb19kZXYgKnZkZXYgPSBhZGFwdGVyLVx1MDAzZXZkZXY7XG4rXHR1bnNpZ25lZCBsb25nIHJjO1xuK1xuK1x0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBidWZmZXJzem51bSA9IChidWZmX3NpemUgXHUwMDNjXHUwMDNjIDMyKSB8IGZpbGxlZDtcbitcdFx0dW5zaWduZWQgbG9uZyBpb2JhW0lCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAvIDJdID0gezB9O1xuK1x0XHRpbnQgaTtcbitcbitcdFx0LyogUGFjayBkZXNjcmlwdG9yIGFkZHJlc3NlcyBpbnRvIGlvYmEgcGFpcnMuXG4rXHRcdCAqIEVhY2ggaW9iYSBob2xkcyB0d28gMzItYml0IGFkZHJlc3NlcyBwYWNrZWQgaW50byA2NCBiaXRzOlxuK1x0XHQgKiAtIEV2ZW4gZGVzY3JpcHRvcnMgKDAsMiw0Li4uKSBnbyBpbiBoaWdoIDMyIGJpdHNcbitcdFx0ICogLSBPZGQgZGVzY3JpcHRvcnMgKDEsMyw1Li4uKSBnbyBpbiBsb3cgMzIgYml0c1xuK1x0XHQgKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZmlsbGVkIFx1MDAyNlx1MDAyNiBpIFx1MDAzYyBJQk1WRVRIX01BWF9SWF9QRVJfSENBTEw7IGkrKykge1xuK1x0XHRcdGludCBwYWlyX2lkeCA9IGkgLyAyOyAgICAgICAgICAgLyogV2hpY2ggcGFpcjogMC01ICovXG4rXHRcdFx0aW50IGlzX2hpZ2ggPSAoaSAlIDIgPT0gMCk7ICAgICAvKiBIaWdoIG9yIGxvdyAzMiBiaXRzICovXG4rXG4rXHRcdFx0aWYgKGlzX2hpZ2gpXG4rXHRcdFx0XHRpb2JhW3BhaXJfaWR4XSA9ICh1bnNpZ25lZCBsb25nKWRlc2NzW2ldLmZpZWxkcy5hZGRyZXNzIFx1MDAzY1x1MDAzYyAzMjtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRpb2JhW3BhaXJfaWR4XSB8PSBkZXNjc1tpXS5maWVsZHMuYWRkcmVzcztcbitcdFx0fVxuK1xuK1x0XHRyYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNfcXVldWUodmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4rXHRcdFx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0sXG4rXHRcdFx0XHRcdFx0ICAgICBidWZmZXJzem51bSxcbitcdFx0XHRcdFx0XHQgICAgIGlvYmFbMF0sIGlvYmFbMV0sIGlvYmFbMl0sXG4rXHRcdFx0XHRcdFx0ICAgICBpb2JhWzNdLCBpb2JhWzRdLCBpb2JhWzVdKTtcbitcdFx0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5hZGRfYnVmc19xdWV1ZSsrO1xuK1x0fSBlbHNlIGlmIChmaWxsZWQgPT0gMSkge1xuK1x0XHRyYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcih2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0ICAgICAgZGVzY3NbMF0uZGVzYyk7XG4rXHRcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMuYWRkX2J1ZisrO1xuK1x0fSBlbHNlIHtcbitcdFx0cmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzKHZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHQgICAgICAgZGVzY3NbMF0uZGVzYywgZGVzY3NbMV0uZGVzYyxcbitcdFx0XHRcdFx0ICAgICAgIGRlc2NzWzJdLmRlc2MsIGRlc2NzWzNdLmRlc2MsXG4rXHRcdFx0XHRcdCAgICAgICBkZXNjc1s0XS5kZXNjLCBkZXNjc1s1XS5kZXNjLFxuK1x0XHRcdFx0XHQgICAgICAgZGVzY3NbNl0uZGVzYywgZGVzY3NbN10uZGVzYyk7XG4rXHRcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMuYWRkX2J1ZnMrKztcbitcdH1cbitcbitcdHJldHVybiByYztcbit9XG4rXG4gLyogcmVwbGVuaXNoIHRoZSBidWZmZXJzIGZvciBhIHBvb2wuICBub3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0b1xuICAqIHNrYl9yZXNlcnZlIHRoZXNlIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIGluY29taW5nLi4uXG4gICovXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbi1cdFx0XHRcdFx0ICBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wpXG4rXHRcdFx0XHRcdCAgc3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sLFxuK1x0XHRcdFx0XHQgIGludCBxdWV1ZV9pbmRleClcbiB7XG4gXHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIGRlc2NzW0lCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTF0gPSB7MH07XG4gXHR1MzIgcmVtYWluaW5nID0gcG9vbC1cdTAwM2VzaXplIC0gYXRvbWljX3JlYWQoXHUwMDI2cG9vbC1cdTAwM2VhdmFpbGFibGUpO1xuQEAgLTI5NSwyNCArODY2LDE1IEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4gXHRcdGlmICghZmlsbGVkKVxuIFx0XHRcdGJyZWFrO1xuIFxuLVx0XHQvKiBzaW5nbGUgYnVmZmVyIGNhc2UqL1xuLVx0XHRpZiAoZmlsbGVkID09IDEpXG4tXHRcdFx0bHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcih2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHRcdCAgIGRlc2NzWzBdLmRlc2MpO1xuLVx0XHRlbHNlXG4tXHRcdFx0LyogTXVsdGktYnVmZmVyIGhjYWxsICovXG4tXHRcdFx0bHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbMF0uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1sxXS5kZXNjLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGRlc2NzWzJdLmRlc2MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbM10uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1s0XS5kZXNjLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGRlc2NzWzVdLmRlc2MsXG4tXHRcdFx0XHRcdFx0XHQgICAgZGVzY3NbNl0uZGVzYyxcbi1cdFx0XHRcdFx0XHRcdCAgICBkZXNjc1s3XS5kZXNjKTtcbitcdFx0bHBhcl9yYyA9IGlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnMoYWRhcHRlciwgZGVzY3MsXG4rXHRcdFx0XHRcdFx0XHQgIGZpbGxlZCxcbitcdFx0XHRcdFx0XHRcdCAgcG9vbC1cdTAwM2VidWZmX3NpemUsXG4rXHRcdFx0XHRcdFx0XHQgIHF1ZXVlX2luZGV4KTtcbitcbiBcdFx0aWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7XG4gXHRcdFx0ZGV2X3dhcm5fcmF0ZWxpbWl0ZWQoZGV2LFxuLVx0XHRcdFx0XHQgICAgIFwiUlggaF9hZGRfbG9naWNhbF9sYW4gZmFpbGVkOiBmaWxsZWQ9JXUsIHJjPSVsdSwgYmF0Y2g9JXVcXG5cIixcbitcdFx0XHRcdFx0ICAgICBcIlJYIGhfYWRkX2xvZ2ljYWxfbGFuICVzIGZhaWxlZDogZmlsbGVkPSV1LCByYz0lbHUsIGJhdGNoPSV1XFxuXCIsXG4rXHRcdFx0XHRcdCAgICAgYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSA/IFwiX3F1ZXVlXCIgOiBcIlwiLFxuIFx0XHRcdFx0XHQgICAgIGZpbGxlZCwgbHBhcl9yYywgYmF0Y2gpO1xuIFx0XHRcdGdvdG8gaGNhbGxfZmFpbHVyZTtcbiBcdFx0fVxuQEAgLTM1MywyNCArOTE1LDE5IEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4gXHRcdH1cbiBcdFx0YWRhcHRlci1cdTAwM2VyZXBsZW5pc2hfYWRkX2J1ZmZfZmFpbHVyZSArPSBmaWxsZWQ7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIG11bHRpIHJ4IGJ1ZmZlcnMgaGNhbGwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBGV1xuLVx0XHQgKiBlLmcuIGluIHRoZSBjYXNlIG9mIExpdmUgUGFydGl0aW9uIE1pZ3JhdGlvblxuLVx0XHQgKi9cbi1cdFx0aWYgKGJhdGNoIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBscGFyX3JjID09IEhfRlVOQ1RJT04pIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEluc3RlYWQgb2YgcmV0cnkgc3VibWl0IHNpbmdsZSBidWZmZXIgaW5kaXZpZHVhbGx5XG4tXHRcdFx0ICogaGVyZSBqdXN0IHNldCB0aGUgbWF4IHJ4IGJ1ZmZlciBwZXIgaGNhbGwgdG8gMVxuLVx0XHRcdCAqIGJ1ZmZlcnMgd2lsbCBiZSByZXNwbGVzaGVkIG5leHQgdGltZVxuLVx0XHRcdCAqIHdoZW4gaWJtdmV0aF9yZXBsZW5pc2hfYnVmZmVyX3Bvb2woKSBpcyBjYWxsZWQgYWdhaW5cbi1cdFx0XHQgKiB3aXRoIHNpbmdsZS1idWZmZXIgY2FzZVxuLVx0XHRcdCAqL1xuLVx0XHRcdG5ldGRldl9pbmZvKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuLVx0XHRcdFx0ICAgIFwiUlggTXVsdGkgYnVmZmVycyBub3Qgc3VwcG9ydGVkIGJ5IEZXLCByYz0lbHVcXG5cIixcbi1cdFx0XHRcdCAgICBscGFyX3JjKTtcbi1cdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsID0gMTtcbi1cdFx0XHRuZXRkZXZfaW5mbyhhZGFwdGVyLVx1MDAzZW5ldGRldixcbi1cdFx0XHRcdCAgICBcIk5leHQgcnggcmVwbGVzaCB3aWxsIGZhbGwgYmFjayB0byBzaW5nbGUtYnVmZmVyIGhjYWxsXFxuXCIpO1xuK1x0XHRpZiAobHBhcl9yYyA9PSBIX0ZVTkNUSU9OKSB7XG4rXHRcdFx0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpIHtcbitcdFx0XHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0XHRcdCAgIFwiVW5leHBlY3RlZCBIX0ZVTkNUSU9OIGZyb20gbXVsdGktcXVldWUgYnVmZmVyIGFkZCAocXVldWU9JWQsIGJhdGNoPSVkKVxcblwiLFxuK1x0XHRcdFx0XHQgICBxdWV1ZV9pbmRleCwgYmF0Y2gpO1xuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fSBlbHNlIGlmIChiYXRjaCBcdTAwM2UgMSkge1xuK1x0XHRcdFx0bmV0ZGV2X3dhcm4oYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0XHRcdCAgICBcIkhfRlVOQ1RJT04gZnJvbSBsZWdhY3kgYmF0Y2ggYnVmZmVyIGFkZCAoYmF0Y2g9JWQpLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIGJ1ZmZlciBtb2RlXFxuXCIsXG4rXHRcdFx0XHRcdCAgICBiYXRjaCk7XG4rXHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZlcnNfcGVyX2hjYWxsID0gMTtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcdFx0fVxuIFx0XHRicmVhaztcbiBcdH1cbkBAIC0zODYsMjcgKzk0Myw1MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuICAqL1xuIHN0YXRpYyB2b2lkIGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuIHtcbi1cdF9fYmU2NCAqcCA9IGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkciArIDQwOTYgLSA4O1xuK1x0aW50IGk7XG4gXG4tXHRhZGFwdGVyLVx1MDAzZXJ4X25vX2J1ZmZlciA9IGJlNjRfdG9fY3B1cChwKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdF9fYmU2NCAqcCA9IGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltpXSArIDQwOTYgLSA4O1xuK1x0XHR1NjQgZHJvcHMgPSBiZTY0X3RvX2NwdXAocCk7XG4rXG4rXHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbitcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tpXS5ub19idWZmZXJfZHJvcHMgPSBkcm9wcztcbitcdFx0aWYgKGkgPT0gMClcbitcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X25vX2J1ZmZlciA9IGRyb3BzO1xuK1x0fVxuIH1cbiBcbiAvKiByZXBsZW5pc2ggcm91dGluZSAqL1xuLXN0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX3Rhc2soc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgdm9pZCBpYm12ZXRoX3JlcGxlbmlzaF90YXNrKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHQgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuK1x0c3RydWN0IGlibXZldGhfcnhfcSAqcnhxID0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF07XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuIFx0aW50IGk7XG4gXG4gXHRhZGFwdGVyLVx1MDAzZXJlcGxlbmlzaF90YXNrX2N5Y2xlcysrO1xuIFxuK1x0aWYgKHF1ZXVlX2luZGV4IFx1MDAzZT0gYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKSB7XG4rXHRcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0ICAgXCJTa2lwcGluZyByZXBsZW5pc2ggZm9yIGZyZWVkIHF1ZXVlICVkIChudW1fcXVldWVzPSVkKVxcblwiLFxuK1x0XHRcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRzcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZyeHEtXHUwMDNlcmVwbGVuaXNoX2xvY2ssIGZsYWdzKTtcbitcbiBcdGZvciAoaSA9IChJQk1WRVRIX05VTV9CVUZGX1BPT0xTIC0gMSk7IGkgXHUwMDNlPSAwOyBpLS0pIHtcbi1cdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV07XG4rXHRcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9XG4rXHRcdFx0XHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW2ldO1xuIFxuLVx0XHRpZiAocG9vbC1cdTAwM2VhY3RpdmUgXHUwMDI2XHUwMDI2XG4rXHRcdGlmIChwb29sLVx1MDAzZWFjdGl2ZSBcdTAwMjZcdTAwMjYgcG9vbC1cdTAwM2VmcmVlX21hcCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgIChhdG9taWNfcmVhZChcdTAwMjZwb29sLVx1MDAzZWF2YWlsYWJsZSkgXHUwMDNjIHBvb2wtXHUwMDNldGhyZXNob2xkKSlcbi1cdFx0XHRpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sKTtcbitcdFx0XHRpYm12ZXRoX3JlcGxlbmlzaF9idWZmZXJfcG9vbChhZGFwdGVyLCBwb29sLFxuK1x0XHRcdFx0XHRcdCAgICAgIHF1ZXVlX2luZGV4KTtcbiBcdH1cbiBcbiBcdGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihhZGFwdGVyKTtcbitcbitcdHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2cnhxLVx1MDAzZXJlcGxlbmlzaF9sb2NrLCBmbGFncyk7XG4gfVxuIFxuIC8qIGVtcHR5IGFuZCBmcmVlIGFuYSBidWZmZXIgcG9vbCAtIGFsc28gdXNlZCB0byBkbyBjbGVhbnVwIGluIGVycm9yIHBhdGhzICovXG5AQCAtNDQ0LDM2ICsxMDI1LDI5MSBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbiB9XG4gXG4gLyoqXG4tICogaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbCAtIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbFxuLSAqIEBhZGFwdGVyOiBhZGFwdGVyIGluc3RhbmNlXG4tICogQGNvcnJlbGF0b3I6IGlkZW50aWZpZXMgcG9vbCBhbmQgaW5kZXhcbi0gKiBAcmV1c2U6IHdoZXRoZXIgdG8gcmV1c2UgYnVmZmVyXG4rICogaWJtdmV0aF9hbGxvY19xdWV1ZV9idWZmZXJfcG9vbHMgLSBBbGxvY2F0ZSBidWZmZXIgcG9vbHMgZm9yIGEgc2luZ2xlIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWU6IHF1ZXVlIGluZGV4XG4gICpcbi0gKiBSZXR1cm46XG4tICogKiAlMCAgICAgICAtIHN1Y2Nlc3Ncbi0gKiAqICUtRUlOVkFMIC0gY29ycmVsYXRvciBtYXBzIHRvIHBvb2wgb3IgaW5kZXggb3V0IG9mIHJhbmdlXG4tICogKiAlLUVGQVVMVCAtIHBvb2wgYW5kIGluZGV4IG1hcCB0byBudWxsIHNrYlxuKyAqIEFsbG9jYXRlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS5cbisgKiBQb29sIG1ldGFkYXRhIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgaW50IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbi1cdFx0XHRcdFx0ICAgdTY0IGNvcnJlbGF0b3IsIGJvb2wgcmV1c2UpXG4rc3RhdGljIGludCBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHQgICAgaW50IHF1ZXVlKVxuIHtcbi1cdHVuc2lnbmVkIGludCBwb29sICA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuLVx0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuLVx0dW5zaWduZWQgaW50IGZyZWVfaW5kZXg7XG4tXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuLVxuLVx0aWYgKFdBUk5fT04ocG9vbCBcdTAwM2U9IElCTVZFVEhfTlVNX0JVRkZfUE9PTFMpIHx8XG4tXHQgICAgV0FSTl9PTihpbmRleCBcdTAwM2U9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpKSB7XG4tXHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2YWRhcHRlci1cdTAwM2V3b3JrKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKykge1xuK1x0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5hY3RpdmUpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdGlmIChpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXSkpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldixcbitcdFx0XHRcdCAgIFwidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29sICVkIGZvciBxdWV1ZSAlZCAoc2l6ZT0ldSwgY291bnQ9JXUpXFxuXCIsXG4rXHRcdFx0XHQgICBpLCBxdWV1ZSxcbitcdFx0XHRcdCAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXS5idWZmX3NpemUsXG4rXHRcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uc2l6ZSk7XG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVdW2ldLmFjdGl2ZSA9IDA7XG4rXG4rXHRcdFx0LyogRnJlZSBwb29scyBhbGxvY2F0ZWQgc28gZmFyIGZvciB0aGlzIHF1ZXVlICovXG4rXHRcdFx0d2hpbGUgKC0taSBcdTAwM2U9IDApIHtcbitcdFx0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV1baV0uYWN0aXZlKVxuK1x0XHRcdFx0XHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlcixcbitcdFx0XHRcdFx0XHRcdFx0IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlXVtpXSk7XG4rXHRcdFx0fVxuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1x0XHR9XG4gXHR9XG4gXG4tXHRza2IgPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdO1xuLVx0aWYgKFdBUk5fT04oIXNrYikpIHtcbi1cdFx0c2NoZWR1bGVfd29yayhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuLVx0XHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzIC0gRnJlZSBidWZmZXIgcG9vbHMgZm9yIGEgc2luZ2xlIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWU6IHF1ZXVlIGluZGV4XG4rICpcbisgKiBGcmVlcyBhbGwgYWN0aXZlIGJ1ZmZlciBwb29scyBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS5cbisgKi9cbitzdGF0aWMgdm9pZCBpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHRcdCAgICBpbnQgcXVldWUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcbitcdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpwb29sID0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVdW2ldO1xuK1xuK1x0XHQvKiBGcmVlIHBvb2wgaWYgaXQgaGFzIGFsbG9jYXRlZCBtZW1vcnksIHJlZ2FyZGxlc3Mgb2YgYWN0aXZlIGZsYWcuXG4rXHRcdCAqIFBvb2xzIG1heSBoYXZlIG1lbW9yeSBhbGxvY2F0ZWQgYnV0IG5vdCBtYXJrZWQgYWN0aXZlIGR1cmluZ1xuK1x0XHQgKiBxdWV1ZSBzY2FsZS11cCwgc28gd2UgbXVzdCBjaGVjayBmb3IgYWN0dWFsIGFsbG9jYXRpb25zLlxuK1x0XHQgKi9cbitcdFx0aWYgKHBvb2wtXHUwMDNlZnJlZV9tYXAgfHwgcG9vbC1cdTAwM2VkbWFfYWRkciB8fCBwb29sLVx1MDAzZXNrYnVmZilcbitcdFx0XHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlciwgcG9vbCk7XG4rXHR9XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2xzIC0gQWxsb2NhdGUgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIEluaXRpYWxpemVzIHBvb2wgbWV0YWRhdGEgZm9yIHF1ZXVlcyAxLU4gZnJvbSBxdWV1ZSAwIHNldHRpbmdzLFxuKyAqIHRoZW4gYWxsb2NhdGVzIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlcyB1c2luZyB0aGUgaGVscGVyIGZ1bmN0aW9uLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZVxuKyAqL1xuK3N0YXRpYyBpbnQgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgaSwgcSwgcmM7XG4rXG4rXHQvKiBJbml0aWFsaXplIHBvb2wgbWV0YWRhdGEgZm9yIHF1ZXVlcyAxLTE1IGZyb20gcXVldWUgMCBzZXR0aW5ncyAqL1xuK1x0Zm9yIChxID0gMTsgcSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBxKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XG4rXHRcdFx0c3RydWN0IGlibXZldGhfYnVmZl9wb29sICpzcmMgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXTtcbitcdFx0XHRzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKmRzdCA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3FdW2ldO1xuK1xuK1x0XHRcdGRzdC1cdTAwM2VzaXplID0gc3JjLVx1MDAzZXNpemU7XG4rXHRcdFx0ZHN0LVx1MDAzZWluZGV4ID0gc3JjLVx1MDAzZWluZGV4O1xuK1x0XHRcdGRzdC1cdTAwM2VidWZmX3NpemUgPSBzcmMtXHUwMDNlYnVmZl9zaXplO1xuK1x0XHRcdGRzdC1cdTAwM2V0aHJlc2hvbGQgPSBzcmMtXHUwMDNldGhyZXNob2xkO1xuK1x0XHRcdGRzdC1cdTAwM2VhY3RpdmUgPSBzcmMtXHUwMDNlYWN0aXZlO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKiBBbGxvY2F0ZSBhY3R1YWwgYnVmZmVycyBmb3IgYWxsIHF1ZXVlcyAqL1xuK1x0Zm9yIChxID0gMDsgcSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBxKyspIHtcbitcdFx0cmMgPSBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcbitcdFx0aWYgKHJjKSB7XG4rXHRcdFx0LyogRnJlZSBwb29scyBmb3IgYWxsIHByZXZpb3VzIHF1ZXVlcyAqL1xuK1x0XHRcdHdoaWxlICgtLXEgXHUwMDNlPSAwKVxuK1x0XHRcdFx0aWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHRcdH1cbitcdH1cbitcbitcdG5ldGRldl9kYmcobmV0ZGV2LCBcImFsbG9jYXRlZCBidWZmZXIgcG9vbHMgZm9yICVkIHF1ZXVlKHMpXFxuXCIsXG4rXHRcdCAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyAtIEZyZWUgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKlxuKyAqIEZyZWVzIGJ1ZmZlciBwb29scyBmb3IgYWxsIHF1ZXVlcyB1c2luZyB0aGUgaGVscGVyIGZ1bmN0aW9uLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9idWZmZXJfcG9vbHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRpbnQgcTtcbitcbitcdC8qIEZyZWUgYnVmZmVyIHBvb2xzIGZvciBhbGwgcXVldWVzICovXG4rXHRmb3IgKHEgPSAwOyBxIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IHErKylcbitcdFx0aWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxKTtcbitcbitcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsIFwiZnJlZWQgYnVmZmVyIHBvb2xzIGZvciAlZCBxdWV1ZShzKVxcblwiLFxuK1x0XHQgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZSAtIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYSBzaW5nbGUgUlggcXVldWVcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBxdWV1ZV9pZHg6IFF1ZXVlIGluZGV4IHRvIGFsbG9jYXRlXG4rICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgUlggcXVldWUgZW50cmllc1xuKyAqXG4rICogQWxsb2NhdGVzIGJ1ZmZlciBsaXN0LCBSWCBxdWV1ZSwgYW5kIHBlci1xdWV1ZSBidWZmZXIgcG9vbHMgZm9yIG9uZSBxdWV1ZS5cbisgKiBVc2VkIGR1cmluZyBpbmNyZW1lbnRhbCBzY2FsZS11cCB3aXRob3V0IGFmZmVjdGluZyBleGlzdGluZyBxdWV1ZXMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlXG4rICovXG4rc3RhdGljIGludFxuK2libXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxdWV1ZV9pZHgsXG4rXHRcdFx0ICAgICAgaW50IHJ4cV9lbnRyaWVzKVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgaSwgcmMgPSAtRU5PTUVNO1xuK1xuK1x0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbitcdGlmICghYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pIHtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBsaXN0IGZvciBxdWV1ZSAlZFxcblwiLFxuK1x0XHRcdCAgIHF1ZXVlX2lkeCk7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbiA9XG4rXHRcdHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSAqIHJ4cV9lbnRyaWVzO1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIgPVxuK1x0XHRkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfbGVuLFxuK1x0XHRcdFx0ICAgXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2RtYSxcbitcdFx0XHRcdCAgIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkcikge1xuK1x0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gYWxsb2NhdGUgUlggcXVldWUgZm9yIHF1ZXVlICVkXFxuXCIsXG4rXHRcdFx0ICAgcXVldWVfaWR4KTtcbitcdFx0Z290byBvdXRfZnJlZV9idWZsaXN0O1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSA9XG4rXHRcdGRtYV9tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0sXG4rXHRcdFx0ICAgICAgIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcbitcdGlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0pKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInVuYWJsZSB0byBtYXAgYnVmZmVyIGxpc3QgZm9yIHF1ZXVlICVkXFxuXCIsXG4rXHRcdFx0ICAgcXVldWVfaWR4KTtcbitcdFx0Z290byBvdXRfZnJlZV9yeHE7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaWR4XVtpXS5zaXplID1cbitcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5zaXplO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pZHhdW2ldLmJ1ZmZfc2l6ZSA9XG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pZHhdW2ldLnRocmVzaG9sZCA9XG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0udGhyZXNob2xkO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pZHhdW2ldLmFjdGl2ZSA9XG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlO1xuK1x0fVxuK1xuK1x0cmMgPSBpYm12ZXRoX2FsbG9jX3F1ZXVlX2J1ZmZlcl9wb29scyhhZGFwdGVyLCBxdWV1ZV9pZHgpO1xuK1x0aWYgKHJjKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdCAgIFwiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29scyBmb3IgcXVldWUgJWRcXG5cIixcbitcdFx0XHQgICBxdWV1ZV9pZHgpO1xuK1x0XHRnb3RvIG91dF91bm1hcF9idWZsaXN0O1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLmluZGV4ID0gMDtcbitcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5udW1fc2xvdHMgPSByeHFfZW50cmllcztcbitcdGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS50b2dnbGUgPSAxO1xuK1x0c3Bpbl9sb2NrX2luaXQoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnJlcGxlbmlzaF9sb2NrKTtcbitcbitcdG5ldGRldl9kYmcobmV0ZGV2LFxuK1x0XHQgICBcIkFsbG9jYXRlZCBxdWV1ZSAlZDogYnVmZmVyX2xpc3QgQCAlcCAoRE1BOiAweCVsbHgpLCByeF9xdWV1ZSBAICVwIChETUE6IDB4JWxseCksICVkIGVudHJpZXNcXG5cIixcbitcdFx0ICAgcXVldWVfaWR4LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHJbcXVldWVfaWR4XSxcbitcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdLFxuK1x0XHQgICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkcixcbitcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfZG1hLFxuK1x0XHQgICByeHFfZW50cmllcyk7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitvdXRfdW5tYXBfYnVmbGlzdDpcbitcdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdLFxuK1x0XHRcdCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4rXHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYVtxdWV1ZV9pZHhdID0gMDtcbitvdXRfZnJlZV9yeHE6XG4rXHRkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9sZW4sXG4rXHRcdFx0ICBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkcixcbitcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEpO1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIgPSBOVUxMO1xuK291dF9mcmVlX2J1Zmxpc3Q6XG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pO1xuK1x0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSBOVUxMO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKipcbisgKiBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlIC0gRnJlZSByZXNvdXJjZXMgZm9yIGEgc2luZ2xlIFJYIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byBmcmVlXG4rICpcbisgKiBGcmVlcyBidWZmZXIgbGlzdCwgUlggcXVldWUsIGFuZCBwZXItcXVldWUgYnVmZmVyIHBvb2xzIGZvciBvbmUgcXVldWUuXG4rICogVXNlZCBkdXJpbmcgaW5jcmVtZW50YWwgc2NhbGUtZG93biB3aXRob3V0IGFmZmVjdGluZyByZW1haW5pbmcgcXVldWVzLlxuKyAqL1xuK3N0YXRpYyB2b2lkXG4raWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaWR4KVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXY7XG4rXG4rXHRpYm12ZXRoX2ZyZWVfcXVldWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIsIHF1ZXVlX2lkeCk7XG4rXG4rXHRpZiAoYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSkge1xuK1x0XHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaWR4XSxcbitcdFx0XHRcdCA0MDk2LCBETUFfQklESVJFQ1RJT05BTCk7XG4rXHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2lkeF0gPSAwO1xuIFx0fVxuIFxuK1x0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9hZGRyKSB7XG4rXHRcdGRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbixcbitcdFx0XHRcdCAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2FkZHIsXG4rXHRcdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaWR4XS5xdWV1ZV9kbWEpO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2lkeF0ucXVldWVfYWRkciA9IE5VTEw7XG4rXHR9XG4rXG4rXHRpZiAoYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0pIHtcbitcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcltxdWV1ZV9pZHhdKTtcbitcdFx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyW3F1ZXVlX2lkeF0gPSBOVUxMO1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCJGcmVlZCBxdWV1ZSAlZCByZXNvdXJjZXNcXG5cIiwgcXVldWVfaWR4KTtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbCAtIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbFxuKyAqIEBhZGFwdGVyOiBhZGFwdGVyIGluc3RhbmNlXG4rICogQGNvcnJlbGF0b3I6IGlkZW50aWZpZXMgcG9vbCBhbmQgaW5kZXhcbisgKiBAcmV1c2U6IHdoZXRoZXIgdG8gcmV1c2UgYnVmZmVyXG4rICpcbisgKiBSZXR1cm46XG4rICogKiAlMCAgICAgICAtIHN1Y2Nlc3NcbisgKiAqICUtRUlOVkFMIC0gY29ycmVsYXRvciBtYXBzIHRvIHBvb2wgb3IgaW5kZXggb3V0IG9mIHJhbmdlXG4rICogKiAlLUVGQVVMVCAtIHBvb2wgYW5kIGluZGV4IG1hcCB0byBudWxsIHNrYlxuKyAqL1xuK3N0YXRpYyBpbnQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHQgICB1NjQgY29ycmVsYXRvciwgaW50IHF1ZXVlX2luZGV4LFxuK1x0XHRcdFx0XHQgICBib29sIHJldXNlKVxuK3tcbitcdHVuc2lnbmVkIGludCBwb29sICA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuK1x0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuK1x0dW5zaWduZWQgaW50IGZyZWVfaW5kZXg7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuK1xuK1x0aWYgKCFpYm12ZXRoX3J4cV9jb3JyZWxhdG9yX3ZhbGlkKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCBjb3JyZWxhdG9yKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRza2IgPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2tidWZmW2luZGV4XTtcbitcdGlmICghc2tiKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcbiBcdC8qIGlmIHdlIGFyZSBnb2luZyB0byByZXVzZSB0aGUgYnVmZmVyIHRoZW4ga2VlcCB0aGUgcG9pbnRlcnMgYXJvdW5kXG4gXHQgKiBidXQgbWFyayBpbmRleCBhcyBhdmFpbGFibGUuIHJlcGxlbmlzaCB3aWxsIHNlZSB0aGUgc2tiIHBvaW50ZXIgYW5kXG4gXHQgKiBhc3N1bWUgaXQgaXMgdG8gYmUgcmVjeWNsZWQuXG5AQCAtNDgyLDQyICsxMzE4LDQxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuIFx0XHQvKiByZW1vdmUgdGhlIHNrYiBwb2ludGVyIHRvIG1hcmsgZnJlZS4gYWN0dWFsIGZyZWVpbmcgaXMgZG9uZVxuIFx0XHQgKiBieSB1cHBlciBsZXZlbCBuZXR3b3JraW5nIGFmdGVyIGdyb19yZWNlaXZlXG4gXHRcdCAqL1xuLVx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdID0gTlVMTDtcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF0gPSBOVUxMO1xuIFxuIFx0XHRkbWFfdW5tYXBfc2luZ2xlKFx1MDAyNmFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2VkZXYsXG4tXHRcdFx0XHQgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0uZG1hX2FkZHJbaW5kZXhdLFxuLVx0XHRcdFx0IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmJ1ZmZfc2l6ZSxcbitcdFx0XHRcdCBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uZG1hX2FkZHJbaW5kZXhdLFxuK1x0XHRcdFx0IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5idWZmX3NpemUsXG4gXHRcdFx0XHQgRE1BX0ZST01fREVWSUNFKTtcbiBcdH1cbiBcbi1cdGZyZWVfaW5kZXggPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleDtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4Kys7XG4tXHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXggXHUwMDNlPVxuLVx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpXG4tXHRcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4ID0gMDtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmZyZWVfbWFwW2ZyZWVfaW5kZXhdID0gaW5kZXg7XG4rXHRmcmVlX2luZGV4ID0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4O1xuK1x0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4Kys7XG4rXHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4IFx1MDAzZT1cbitcdCAgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uc2l6ZSlcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnByb2R1Y2VyX2luZGV4ID0gMDtcbitcdGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3F1ZXVlX2luZGV4XVtwb29sXS5mcmVlX21hcFtmcmVlX2luZGV4XSA9IGluZGV4O1xuIFxuIFx0bWIoKTtcbiBcbi1cdGF0b21pY19kZWMoXHUwMDI2KGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLmF2YWlsYWJsZSkpO1xuK1x0YXRvbWljX2RlYyhcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxdWV1ZV9pbmRleF1bcG9vbF0uYXZhaWxhYmxlKTtcbiBcbiBcdHJldHVybiAwO1xuIH1cbiBcbiAvKiBnZXQgdGhlIGN1cnJlbnQgYnVmZmVyIG9uIHRoZSByeCBxdWV1ZSAqL1xuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmlibXZldGhfcnhxX2dldF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICppYm12ZXRoX3J4cV9nZXRfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHRcdFx0ICAgICBpbnQgcXVldWVfaW5kZXgpXG4ge1xuLVx0dTY0IGNvcnJlbGF0b3IgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjtcbitcdHN0cnVjdCBpYm12ZXRoX3J4X3EgKnJ4cSA9IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWVbcXVldWVfaW5kZXhdO1xuK1x0dTY0IGNvcnJlbGF0b3IgPSByeHEtXHUwMDNlcXVldWVfYWRkcltyeHEtXHUwMDNlaW5kZXhdLmNvcnJlbGF0b3I7XG4gXHR1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgXHUwMDNlXHUwMDNlIDMyO1xuIFx0dW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciBcdTAwMjYgMHhmZmZmZmZmZlVMO1xuIFxuLVx0aWYgKFdBUk5fT04ocG9vbCBcdTAwM2U9IElCTVZFVEhfTlVNX0JVRkZfUE9PTFMpIHx8XG4tXHQgICAgV0FSTl9PTihpbmRleCBcdTAwM2U9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpKSB7XG4tXHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2YWRhcHRlci1cdTAwM2V3b3JrKTtcbitcdGlmICghaWJtdmV0aF9yeHFfY29ycmVsYXRvcl92YWxpZChhZGFwdGVyLCBxdWV1ZV9pbmRleCwgY29ycmVsYXRvcikpXG4gXHRcdHJldHVybiBOVUxMO1xuLVx0fVxuIFxuLVx0cmV0dXJuIGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3Bvb2xdLnNrYnVmZltpbmRleF07XG4rXHRyZXR1cm4gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbcXVldWVfaW5kZXhdW3Bvb2xdLnNrYnVmZltpbmRleF07XG4gfVxuIFxuIC8qKlxuQEAgLTUzMywyNCArMTM2OCw2OSBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICppYm12ZXRoX3J4cV9nZXRfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYVxuICAqICogb3RoZXIgLSBub24temVybyByZXR1cm4gZnJvbSBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sXG4gICovXG4gc3RhdGljIGludCBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuLVx0XHRcdFx0ICAgICAgYm9vbCByZXVzZSlcbitcdFx0XHRcdCAgICAgIGludCBxdWV1ZV9pbmRleCwgYm9vbCByZXVzZSlcbiB7XG4rXHRzdHJ1Y3QgaWJtdmV0aF9yeF9xICpyeHEgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlW3F1ZXVlX2luZGV4XTtcbiBcdHU2NCBjb3I7XG4gXHRpbnQgcmM7XG4gXG4tXHRjb3IgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjtcbi1cdHJjID0gaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3IsIHJldXNlKTtcbi1cdGlmICh1bmxpa2VseShyYykpXG4rXHRjb3IgPSByeHEtXHUwMDNlcXVldWVfYWRkcltyeHEtXHUwMDNlaW5kZXhdLmNvcnJlbGF0b3I7XG4rXHRyYyA9IGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29yLCBxdWV1ZV9pbmRleCwgcmV1c2UpO1xuK1x0aWYgKHVubGlrZWx5KHJjKSkge1xuK1x0XHRpZiAocmMgPT0gLUVJTlZBTCB8fCByYyA9PSAtRUZBVUxUKVxuK1x0XHRcdGdvdG8gYWR2YW5jZTtcbiBcdFx0cmV0dXJuIHJjO1xuLVxuLVx0aWYgKCsrYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5pbmRleCA9PSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLm51bV9zbG90cykge1xuLVx0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4ID0gMDtcbi1cdFx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS50b2dnbGUgPSAhYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS50b2dnbGU7XG4gXHR9XG4gXG4rYWR2YW5jZTpcbitcdGlibXZldGhfcnhxX2FkdmFuY2UocnhxKTtcbitcbiBcdHJldHVybiAwO1xuIH1cbiBcbisvKipcbisgKiBpYm12ZXRoX2RyYWluX3J4X3F1ZXVlIC0gRHJhaW4gcGVuZGluZyBidWZmZXJzIGZyb20gYW4gUlggcXVldWVcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBxdWV1ZV9pbmRleDogUXVldWUgaW5kZXggdG8gZHJhaW5cbisgKlxuKyAqIFJlY3ljbGVzIGFsbCBwZW5kaW5nIGJ1ZmZlcnMgYmFjayB0byB0aGUgcGVyLXF1ZXVlIGJ1ZmZlciBwb29scy5cbisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIE5BUEkgZGlzYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4rICpcbisgKiBSZXR1cm46IE51bWJlciBvZiBidWZmZXJzIGRyYWluZWRcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9kcmFpbl9yeF9xdWV1ZShzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVldWVfaW5kZXgpXG4re1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuK1x0aW50IGRyYWluZWQgPSAwO1xuK1x0aW50IGxpbWl0ID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pbmRleF0ubnVtX3Nsb3RzO1xuK1x0aW50IHJjO1xuK1xuK1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiRHJhaW5pbmcgUlggcXVldWUgJWQgKGxpbWl0OiAlZCBzbG90cylcXG5cIixcbitcdFx0ICAgcXVldWVfaW5kZXgsIGxpbWl0KTtcbitcbitcdHdoaWxlIChkcmFpbmVkIFx1MDAzYyBsaW1pdCBcdTAwMjZcdTAwMjZcbitcdCAgICAgICBpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCkpIHtcbitcdFx0cmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7XG4rXHRcdGlmIChyYykge1xuK1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdFx0ICAgXCJGYWlsZWQgdG8gaGFydmVzdCBidWZmZXIgZnJvbSBxdWV1ZSAlZCBkdXJpbmcgZHJhaW46ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBxdWV1ZV9pbmRleCwgcmMpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGRyYWluZWQrKztcbitcdH1cbitcbitcdGlmIChkcmFpbmVkIFx1MDAzZSAwKVxuK1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCJEcmFpbmVkICVkIGJ1ZmZlcihzKSBmcm9tIFJYIHF1ZXVlICVkXFxuXCIsXG4rXHRcdFx0ICAgZHJhaW5lZCwgcXVldWVfaW5kZXgpO1xuK1x0ZWxzZVxuK1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCJObyBidWZmZXJzIHRvIGRyYWluIGZyb20gUlggcXVldWUgJWRcXG5cIixcbitcdFx0XHQgICBxdWV1ZV9pbmRleCk7XG4rXG4rXHRyZXR1cm4gZHJhaW5lZDtcbit9XG4rXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9mcmVlX3R4X2x0YihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KVxuIHtcbiBcdGRtYV91bm1hcF9zaW5nbGUoXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldiwgYWRhcHRlci1cdTAwM2V0eF9sdGJfZG1hW2lkeF0sXG5AQCAtNTc0LDI0NiArMTQ1NCw2NjggQEAgc3RhdGljIGludCBpYm12ZXRoX2FsbG9jYXRlX3R4X2x0YihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KVxuIFx0XHRcdFx0XHRcdCAgRE1BX1RPX0RFVklDRSk7XG4gXHRpZiAoZG1hX21hcHBpbmdfZXJyb3IoXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldiwgYWRhcHRlci1cdTAwM2V0eF9sdGJfZG1hW2lkeF0pKSB7XG4gXHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4tXHRcdFx0ICAgXCJ1bmFibGUgdG8gRE1BIG1hcCB0eCBsb25nIHRlcm0gYnVmZmVyXFxuXCIpO1xuLVx0XHRrZnJlZShhZGFwdGVyLVx1MDAzZXR4X2x0Yl9wdHJbaWR4XSk7XG4tXHRcdGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltpZHhdID0gTlVMTDtcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRcdFx0ICAgXCJ1bmFibGUgdG8gRE1BIG1hcCB0eCBsb25nIHRlcm0gYnVmZmVyXFxuXCIpO1xuK1x0XHRrZnJlZShhZGFwdGVyLVx1MDAzZXR4X2x0Yl9wdHJbaWR4XSk7XG4rXHRcdGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltpZHhdID0gTlVMTDtcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXMgLSBBbGxvY2F0ZSBUWCByZXNvdXJjZXMgZm9yIGFsbCBxdWV1ZXNcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqXG4rICogQWxsb2NhdGVzIFRYIExvbmcgVGVybSBCdWZmZXJzIChMVEJzKSBmb3IgYWxsIFRYIHF1ZXVlcy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGZhaWx1cmVcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkrKykge1xuK1x0XHRpZiAoaWJtdmV0aF9hbGxvY2F0ZV90eF9sdGIoYWRhcHRlciwgaSkpXG4rXHRcdFx0Z290byBlcnJfZnJlZV9sdGJzO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyX2ZyZWVfbHRiczpcbitcdHdoaWxlICgtLWkgXHUwMDNlPSAwKVxuK1x0XHRpYm12ZXRoX2ZyZWVfdHhfbHRiKGFkYXB0ZXIsIGkpO1xuK1x0cmV0dXJuIC1FTk9NRU07XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMgLSBGcmVlIFRYIHJlc291cmNlcyBmb3IgYWxsIHF1ZXVlc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICpcbisgKiBGcmVlcyBUWCBMb25nIFRlcm0gQnVmZmVycyAoTFRCcykgZm9yIGFsbCBUWCBxdWV1ZXMuXG4rICovXG4rc3RhdGljIHZvaWRcbitpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuZXRkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpKyspXG4rXHRcdGlibXZldGhfZnJlZV90eF9sdGIoYWRhcHRlciwgaSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLFxuK1x0XHRcdFx0XHR1NjQgbWFjX2FkZHJlc3MpXG4re1xuK1x0aW50IHJjLCB0cnlfYWdhaW4gPSAxO1xuK1xuK1x0LypcbitcdCAqIEFmdGVyIGEga2V4ZWMgdGhlIGFkYXB0ZXIgd2lsbCBzdGlsbCBiZSBvcGVuLCBzbyBvdXIgYXR0ZW1wdCB0b1xuK1x0ICogb3BlbiBpdCB3aWxsIGZhaWwuIFNvIGlmIHdlIGdldCBhIGZhaWx1cmUgd2UgZnJlZSB0aGUgYWRhcHRlciBhbmRcbitcdCAqIHRyeSBhZ2FpbiwgYnV0IG9ubHkgb25jZS5cbitcdCAqL1xuK3JldHJ5OlxuK1x0LyogSW4gbXVsdGktcXVldWUgbW9kZSwgb2J0YWluIGEgcXVldWUgaGFuZGxlIGZvciBxdWV1ZSAwIHNvIGFsbCBSWFxuK1x0ICogcXVldWVzIGNhbiB1c2UgdGhlIHNhbWUgcGVyLXF1ZXVlIGJ1ZmZlciBoeXBlcmNhbGxzLlxuK1x0ICovXG4rXHRpZiAoYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSkge1xuK1x0XHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0XHRcdGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hWzBdLFxuK1x0XHRcdFx0XHRcdFx0cnhxX2Rlc2MuZGVzYyxcbitcdFx0XHRcdFx0XHRcdGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hLFxuK1x0XHRcdFx0XHRcdFx0bWFjX2FkZHJlc3MsXG4rXHRcdFx0XHRcdFx0XHRcdTAwMjZhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVswXSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRyYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hWzBdLFxuK1x0XHRcdFx0XHQgICAgcnhxX2Rlc2MuZGVzYyxcbitcdFx0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hLFxuK1x0XHRcdFx0XHQgICAgbWFjX2FkZHJlc3MpO1xuK1x0fVxuK1x0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5yZWdfbGFuKys7XG4rXG4rXHRpZiAocmMgIT0gSF9TVUNDRVNTIFx1MDAyNlx1MDAyNiB0cnlfYWdhaW4pIHtcbitcdFx0ZG8ge1xuK1x0XHRcdHJjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MpO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMuZnJlZV9sYW4rKztcbitcdFx0fSB3aGlsZSAoSF9JU19MT05HX0JVU1kocmMpIHx8IChyYyA9PSBIX0JVU1kpKTtcbitcbitcdFx0dHJ5X2FnYWluID0gMDtcbitcdFx0Z290byByZXRyeTtcbitcdH1cbitcbitcdHJldHVybiByYztcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9yZWdpc3Rlcl9sb2dpY2FsX2xhbl9xdWV1ZSAtIFJlZ2lzdGVyIHN1Ym9yZGluYXRlIHF1ZXVlIHdpdGggaHlwZXJ2aXNvclxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICogQHJ4cV9kZXNjOiBSZWNlaXZlIHF1ZXVlIGRlc2NyaXB0b3JcbisgKiBAcXVldWVfaW5kZXg6IFJYIHF1ZXVlIGluZGV4ICgxLi5OIGZvciBzdWJvcmRpbmF0ZSBxdWV1ZXMpXG4rICpcbisgKiBSZWdpc3RlcnMgYSBzdWJvcmRpbmF0ZSByZWNlaXZlIHF1ZXVlIHVzaW5nIEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFLlxuKyAqIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgcXVldWUgaGFuZGxlIGFuZCB2aXJ0dWFsIElSUSBpbiB0aGUgYWRhcHRlci5cbisgKiBSZXRyaWVzIG9uY2UgaWYgcmVnaXN0cmF0aW9uIGZhaWxzIChoYW5kbGVzIGtleGVjIGNhc2UpLiAgSWYgSVJRIG1hcHBpbmdcbisgKiBmYWlscyBhZnRlciBhIHN1Y2Nlc3NmdWwgaHlwZXJ2aXNvciByZWdpc3RyYXRpb24sIHRoZSBxdWV1ZSBpcyBmcmVlZFxuKyAqIGJlZm9yZSByZXR1cm5pbmcuXG4rICpcbisgKiBSZXR1cm46IEhfU1VDQ0VTUyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBJUlEgbWFwcGluZyBmYWlsdXJlLFxuKyAqICAgICAgICAgaHlwZXJ2aXNvciBlcnJvciBjb2RlIG90aGVyd2lzZVxuKyAqL1xuK3N0YXRpYyBpbnRcbitpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHQgICB1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjLFxuK1x0XHRcdFx0ICAgaW50IHF1ZXVlX2luZGV4KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgaGFuZGxlLCBod2lycTtcbitcdHVuc2lnbmVkIGludCB2aXJxO1xuK1x0bG9uZyBscGFyX3JjO1xuK1x0aW50IHRyeV9hZ2FpbiA9IDE7XG4rXG4rcmV0cnk6XG4rXHRuZXRkZXZfZGJnKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuK1x0XHQgICBcIkF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgcXVldWUgJWQ6IHVuaXRfYWRkcj0weCV4IGJ1ZmZlcl9saXN0X2RtYT0weCVsbHggcnhxX2Rlc2M9MHglbGx4XFxuXCIsXG4rXHRcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuK1x0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2luZGV4XSxcbitcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyeHFfZGVzYy5kZXNjKTtcbitcbitcdGxwYXJfcmMgPSBoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZShhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHQgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hW3F1ZXVlX2luZGV4XSxcbitcdFx0XHRcdFx0ICByeHFfZGVzYy5kZXNjLCBcdTAwMjZoYW5kbGUsIFx1MDAyNmh3aXJxKTtcbitcdGFkYXB0ZXItXHUwMDNlaGNhbGxfc3RhdHMucmVnX2xhbl9xdWV1ZSsrO1xuK1xuK1x0aWYgKGxwYXJfcmMgPT0gSF9TVUNDRVNTKSB7XG4rXHRcdHZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdpcnEpO1xuK1x0XHRpZiAoIXZpcnEpIHtcbitcdFx0XHR1bnNpZ25lZCBsb25nIGZyZWVfcmM7XG4rXG4rXHRcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbitcdFx0XHRcdCAgIFwiRmFpbGVkIHRvIG1hcCBJUlEgZm9yIHF1ZXVlICVkIChod2lycT0lbHUpXFxuXCIsXG4rXHRcdFx0XHQgICBxdWV1ZV9pbmRleCwgaHdpcnEpO1xuK1x0XHRcdGRvIHtcbitcdFx0XHRcdGZyZWVfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0XHRcdFx0ICAgaGFuZGxlKTtcbitcdFx0XHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShmcmVlX3JjKSB8fCAoZnJlZV9yYyA9PSBIX0JVU1kpKTtcbitcdFx0XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLmZyZWVfbGFuX3F1ZXVlKys7XG4rXHRcdFx0aWYgKGZyZWVfcmMgIT0gSF9TVUNDRVNTKVxuK1x0XHRcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbitcdFx0XHRcdFx0ICAgXCJoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUgZmFpbGVkIGZvciBxdWV1ZSAlZCBhZnRlciBJUlEgbWFwIGZhaWx1cmU6IHJjPTB4JWx4XFxuXCIsXG4rXHRcdFx0XHRcdCAgIHF1ZXVlX2luZGV4LCBmcmVlX3JjKTtcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0fVxuK1xuK1x0XHRhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0gPSBoYW5kbGU7XG4rXHRcdGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2luZGV4XSA9IHZpcnE7XG4rXG4rXHRcdG5ldGRldl9kYmcoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0ICAgXCJxdWV1ZSAlZCByZWdpc3RlcmVkOiBoYW5kbGU9MHglbGx4IGlycT0ldVxcblwiLFxuK1x0XHRcdCAgIHF1ZXVlX2luZGV4LCBhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pbmRleF0sXG4rXHRcdFx0ICAgYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaW5kZXhdKTtcbitcdFx0cmV0dXJuIEhfU1VDQ0VTUztcbitcdH1cbitcbitcdGlmIChscGFyX3JjID09IEhfRlVOQ1RJT04pIHtcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpIHtcbitcdFx0XHRuZXRkZXZfaW5mbyhhZGFwdGVyLVx1MDAzZW5ldGRldixcbitcdFx0XHRcdCAgICBcIk11bHRpIHF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZSwgZmFsbGluZyBiYWNrIHRvIHNpbmdsZSBxdWV1ZVxcblwiKTtcbitcdFx0XHRhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlID0gMDtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuK1x0XHRcdFx0ICAgXCJVbmV4cGVjdGVkIEhfRlVOQ1RJT04gZm9yIHF1ZXVlICVkIHJlZ2lzdHJhdGlvbiAoTVEgbW9kZSBhbHJlYWR5IGRpc2FibGVkKVxcblwiLFxuK1x0XHRcdFx0ICAgcXVldWVfaW5kZXgpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBscGFyX3JjO1xuK1x0fVxuK1xuK1x0aWYgKHRyeV9hZ2Fpbikge1xuK1x0XHR0cnlfYWdhaW4gPSAwO1xuK1x0XHRnb3RvIHJldHJ5O1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldixcbitcdFx0ICAgXCJoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSBmYWlsZWQgd2l0aCAlbGQgYWZ0ZXIgcmV0cnlcXG5cIixcbitcdFx0ICAgbHBhcl9yYyk7XG4rXHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuK1x0XHQgICBcInF1ZXVlICVkIHBhcmFtczogdW5pdF9hZGRyPTB4JXggYnVmZmVyX2xpc3RfZG1hPTB4JWxseCByeHFfZGVzYz0weCVsbHhcXG5cIixcbitcdFx0ICAgcXVldWVfaW5kZXgsIGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsXG4rXHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9kbWFbcXVldWVfaW5kZXhdLFxuK1x0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXJ4cV9kZXNjLmRlc2MpO1xuK1xuK1x0cmV0dXJuIGxwYXJfcmM7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlIC0gUmVnaXN0ZXIgb25lIHN1Ym9yZGluYXRlIFJYIHF1ZXVlXG4rICogQGFkYXB0ZXI6IGlibXZldGggYWRhcHRlciBzdHJ1Y3R1cmVcbisgKiBAcXVldWVfaWR4OiBRdWV1ZSBpbmRleCB0byByZWdpc3RlciAoMS4uTilcbisgKiBAbWFjX2FkZHJlc3M6IE1BQyBhZGRyZXNzICh1bnVzZWQ7IHJlc2VydmVkIGZvciBBUEkgc3ltbWV0cnkpXG4rICpcbisgKiBCdWlsZHMgdGhlIHF1ZXVlIGRlc2NyaXB0b3IgYW5kIHJlZ2lzdGVycyB3aXRoIHRoZSBoeXBlcnZpc29yIHZpYVxuKyAqIGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWUoKS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBxdWV1ZV9pZHggaXMgaW52YWxpZCwgLUVJTyBvbiBmYWlsdXJlXG4rICovXG4rc3RhdGljIGludFxuK2libXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHQgaW50IHF1ZXVlX2lkeCwgdTY0IG1hY19hZGRyZXNzKVxuK3tcbitcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLVx1MDAzZW5ldGRldjtcbitcdHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2M7XG4rXHRsb25nIGxwYXJfcmM7XG4rXG4rXHQodm9pZCltYWNfYWRkcmVzcztcbitcbitcdGlmIChXQVJOX09OKHF1ZXVlX2lkeCBcdTAwM2MgMSB8fCBxdWV1ZV9pZHggXHUwMDNlPSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHJ4cV9kZXNjLmZpZWxkcy5mbGFnc19sZW4gPSBJQk1WRVRIX0JVRl9WQUxJRCB8XG4rXHRcdFx0XHQgICAgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2xlbjtcbitcdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVtxdWV1ZV9pZHhdLnF1ZXVlX2RtYTtcbitcbitcdGxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlKGFkYXB0ZXIsIHJ4cV9kZXNjLFxuK1x0XHRcdFx0XHRcdCAgICAgcXVldWVfaWR4KTtcbitcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuK1x0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJGYWlsZWQgdG8gcmVnaXN0ZXIgcXVldWUgJWQ6IHJjPTB4JWx4XFxuXCIsXG4rXHRcdFx0ICAgcXVldWVfaWR4LCBscGFyX3JjKTtcbitcdFx0cmV0dXJuIC1FSU87XG4rXHR9XG4rXG4rXHRuZXRkZXZfZGJnKG5ldGRldiwgXCJSZWdpc3RlcmVkIHF1ZXVlICVkIHdpdGggaGFuZGxlIDB4JWxseFxcblwiLFxuK1x0XHQgICBxdWV1ZV9pZHgsIGFkYXB0ZXItXHUwMDNlcXVldWVfaGFuZGxlW3F1ZXVlX2lkeF0pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUgLSBEZXJlZ2lzdGVyIG9uZSBzdWJvcmRpbmF0ZSBSWCBxdWV1ZVxuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXIgc3RydWN0dXJlXG4rICogQHF1ZXVlX2lkeDogUXVldWUgaW5kZXggdG8gZGVyZWdpc3RlciAoMS4uTilcbisgKlxuKyAqIERlcmVnaXN0ZXJzIGEgc2luZ2xlIHF1ZXVlIHZpYSBIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUgYW5kIGRpc3Bvc2VzXG4rICogdGhlIElSUSBtYXBwaW5nIGZvciBzdWJvcmRpbmF0ZSBxdWV1ZXMuIFF1ZXVlIDAgaXMgZnJlZWQgb25seSB0aHJvdWdoXG4rICogaWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoKSAoSF9GUkVFX0xPR0lDQUxfTEFOKS5cbisgKi9cbitzdGF0aWMgdm9pZFxuK2libXZldGhfZGVyZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbitcdFx0XHRcdCAgIGludCBxdWV1ZV9pZHgpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBscGFyX3JjO1xuK1xuK1x0aWYgKCFhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRkbyB7XG4rXHRcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2hhbmRsZVtxdWV1ZV9pZHhdKTtcbitcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpO1xuK1xuK1x0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5mcmVlX2xhbl9xdWV1ZSsrO1xuK1xuK1x0aWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7XG4rXHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsXG4rXHRcdFx0ICAgXCJoX2ZyZWVfbG9naWNhbF9sYW5fcXVldWUgZmFpbGVkIGZvciBxdWV1ZSAlZDogcmM9MHglbHhcXG5cIixcbitcdFx0XHQgICBxdWV1ZV9pZHgsIGxwYXJfcmMpO1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbcXVldWVfaWR4XSA9IDA7XG4rXG4rXHRpZiAocXVldWVfaWR4IFx1MDAzZSAwIFx1MDAyNlx1MDAyNiBhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtxdWV1ZV9pZHhdKSB7XG4rXHRcdGlycV9kaXNwb3NlX21hcHBpbmcoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbcXVldWVfaWR4XSk7XG4rXHRcdGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW3F1ZXVlX2lkeF0gPSAwO1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2RiZyhhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCJEZXJlZ2lzdGVyZWQgcXVldWUgJWRcXG5cIiwgcXVldWVfaWR4KTtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsIC0gUmVzaXplIFJYIHF1ZXVlIGNvdW50IGluY3JlbWVudGFsbHlcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBuZXdfY291bnQ6IFRhcmdldCBudW1iZXIgb2YgUlggcXVldWVzXG4rICogQHJ4cV9lbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBwZXIgUlggcXVldWVcbisgKlxuKyAqIEFkZHMgb3IgcmVtb3ZlcyBSWCBxdWV1ZXMgd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGVudGlyZSBhZGFwdGVyLlxuKyAqIEFjdGl2ZSBxdWV1ZXMgY29udGludWUgcmVjZWl2aW5nIGR1cmluZyBzY2FsZS11cDsgc2NhbGUtZG93biBkcmFpbnNcbisgKiBleGNlc3MgcXVldWVzIGJlZm9yZSBkZXJlZ2lzdGVyaW5nIHRoZW0gd2l0aCB0aGUgaHlwZXJ2aXNvci5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmVcbisgKi9cbitzdGF0aWMgaW50XG4raWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4rXHRcdFx0XHQgICAgIGludCBuZXdfY291bnQsIGludCByeHFfZW50cmllcylcbit7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHR1NjQgbWFjX2FkZHJlc3MgPSBldGhlcl9hZGRyX3RvX3U2NChuZXRkZXYtXHUwMDNlZGV2X2FkZHIpO1xuK1x0aW50IG9sZF9jb3VudCA9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcztcbitcdGludCBmYWlsZWRfcXVldWU7XG4rXHRpbnQgcmMsIGk7XG4rXG4rXHRpZiAob2xkX2NvdW50ID09IG5ld19jb3VudCkge1xuK1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCJSWCBxdWV1ZSBjb3VudCB1bmNoYW5nZWQgKCVkKSwgbm90aGluZyB0byBkb1xcblwiLFxuK1x0XHRcdCAgIG9sZF9jb3VudCk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKG5ld19jb3VudCBcdTAwM2MgMSB8fCBuZXdfY291bnQgXHUwMDNlIElCTVZFVEhfTUFYX1JYX1FVRVVFUykge1xuK1x0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJJbnZhbGlkIFJYIHF1ZXVlIGNvdW50ICVkIChtdXN0IGJlIDEtJWQpXFxuXCIsXG4rXHRcdFx0ICAgbmV3X2NvdW50LCBJQk1WRVRIX01BWF9SWF9RVUVVRVMpO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdG5ldGRldl9pbmZvKG5ldGRldiwgXCJJbmNyZW1lbnRhbGx5IHJlc2l6aW5nIFJYIHF1ZXVlczogJWQgdG8gJWRcXG5cIixcbitcdFx0ICAgIG9sZF9jb3VudCwgbmV3X2NvdW50KTtcbitcbitcdGlmIChuZXdfY291bnQgXHUwMDNlIG9sZF9jb3VudCkge1xuK1x0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCJTY2FsZS11cDogYWRkaW5nIHF1ZXVlcyAlZC0lZFxcblwiLFxuK1x0XHRcdCAgIG9sZF9jb3VudCwgbmV3X2NvdW50IC0gMSk7XG4rXG4rXHRcdGZvciAoaSA9IG9sZF9jb3VudDsgaSBcdTAwM2MgbmV3X2NvdW50OyBpKyspIHtcbitcdFx0XHRyYyA9IGlibXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGksIHJ4cV9lbnRyaWVzKTtcbitcdFx0XHRpZiAocmMpIHtcbitcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcIkZhaWxlZCB0byBhbGxvY2F0ZSBxdWV1ZSAlZDogJWRcXG5cIixcbitcdFx0XHRcdFx0ICAgaSwgcmMpO1xuK1x0XHRcdFx0Z290byBjbGVhbnVwX25ld19xdWV1ZXM7XG4rXHRcdFx0fVxuK1xuK1x0XHRcdHJjID0gaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSxcbitcdFx0XHRcdFx0XHRcdCAgICAgIG1hY19hZGRyZXNzKTtcbitcdFx0XHRpZiAocmMpIHtcbitcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcIkZhaWxlZCB0byByZWdpc3RlciBxdWV1ZSAlZDogJWRcXG5cIixcbitcdFx0XHRcdFx0ICAgaSwgcmMpO1xuK1x0XHRcdFx0aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbitcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuK1x0XHRcdH1cbitcbitcdFx0XHRyYyA9IGlibXZldGhfc2V0dXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTtcbitcdFx0XHRpZiAocmMpIHtcbitcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdFx0XHQgICBcIkZhaWxlZCB0byBzZXR1cCBJUlEgZm9yIHF1ZXVlICVkOiAlZFxcblwiLFxuK1x0XHRcdFx0XHQgICBpLCByYyk7XG4rXHRcdFx0XHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1x0XHRcdFx0aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbitcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuK1x0XHRcdH1cbitcbitcdFx0XHRyYyA9IGlibXZldGhfZW5hYmxlX2lycShhZGFwdGVyLCBpKTtcbitcdFx0XHRpZiAocmMpIHtcbitcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdFx0XHQgICBcIkZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZDogJWRcXG5cIixcbitcdFx0XHRcdFx0ICAgaSwgcmMpO1xuK1x0XHRcdFx0aWJtdmV0aF9jbGVhbnVwX3NpbmdsZV9yeF9pbnRlcnJ1cHQoYWRhcHRlciwgaSk7XG4rXHRcdFx0XHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1x0XHRcdFx0aWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbitcdFx0XHRcdGdvdG8gY2xlYW51cF9uZXdfcXVldWVzO1xuK1x0XHRcdH1cbitcbitcdFx0XHRuYXBpX2VuYWJsZShcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuK1x0XHR9XG4rXG4rXHRcdGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG5ld19jb3VudDtcbitcbitcdFx0Zm9yIChpID0gb2xkX2NvdW50OyBpIFx1MDAzYyBuZXdfY291bnQ7IGkrKylcbitcdFx0XHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpO1xuK1xuK1x0XHRyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBuZXdfY291bnQpO1xuK1x0XHRpZiAocmMpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJGYWlsZWQgdG8gc2V0IHJlYWwgUlggcXVldWVzIHRvICVkOiAlZFxcblwiLFxuK1x0XHRcdFx0ICAgbmV3X2NvdW50LCByYyk7XG4rXHRcdFx0Z290byBjbGVhbnVwX25ld19xdWV1ZXM7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcIlNjYWxlLWRvd246IHJlbW92aW5nIHF1ZXVlcyAlZC0lZFxcblwiLFxuK1x0XHRcdCAgIG5ld19jb3VudCwgb2xkX2NvdW50IC0gMSk7XG4rXG4rXHRcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcdTAwM2Mgb2xkX2NvdW50OyBpKyspXG4rXHRcdFx0bmFwaV9kaXNhYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4rXG4rXHRcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcdTAwM2Mgb2xkX2NvdW50OyBpKyspXG4rXHRcdFx0aWJtdmV0aF9kcmFpbl9yeF9xdWV1ZShhZGFwdGVyLCBpKTtcbitcbitcdFx0c3luY2hyb25pemVfbmV0KCk7XG4rXG4rXHRcdHJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIG5ld19jb3VudCk7XG4rXHRcdGlmIChyYykge1xuK1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcIkZhaWxlZCB0byBzZXQgcmVhbCBSWCBxdWV1ZXMgdG8gJWQ6ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBuZXdfY291bnQsIHJjKTtcbitcdFx0XHRmb3IgKGkgPSBuZXdfY291bnQ7IGkgXHUwMDNjIG9sZF9jb3VudDsgaSsrKVxuK1x0XHRcdFx0bmFwaV9lbmFibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpW2ldKTtcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHRcdH1cbitcbitcdFx0LyogRGlzYWJsZSBoeXBlcnZpc29yIGludGVycnVwdHMgYW5kIHdhaXQgZm9yIGhhbmRsZXJzIHRvIGNvbXBsZXRlXG4rXHRcdCAqIGJlZm9yZSB1cGRhdGluZyBudW1fcnhfcXVldWVzLlxuK1x0XHQgKi9cbitcdFx0Zm9yIChpID0gbmV3X2NvdW50OyBpIFx1MDAzYyBvbGRfY291bnQ7IGkrKykge1xuK1x0XHRcdGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgaSk7XG4rXHRcdFx0c3luY2hyb25pemVfaXJxKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKTtcbitcdFx0fVxuK1xuK1x0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSBuZXdfY291bnQ7XG4rXG4rXHRcdGZvciAoaSA9IG5ld19jb3VudDsgaSBcdTAwM2Mgb2xkX2NvdW50OyBpKyspIHtcbitcdFx0XHRpYm12ZXRoX2NsZWFudXBfc2luZ2xlX3J4X2ludGVycnVwdChhZGFwdGVyLCBpKTtcbitcdFx0XHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1x0XHRcdGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSk7XG4rXHRcdH1cbitcdH1cbitcbitcdG5ldGRldl9pbmZvKG5ldGRldiwgXCJTdWNjZXNzZnVsbHkgcmVzaXplZCB0byAlZCBSWCBxdWV1ZXMgKGluY3JlbWVudGFsKVxcblwiLFxuK1x0XHQgICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbitcbitcdGlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0NNTykpXG4rXHRcdHZpb19jbW9fc2V0X2Rldl9kZXNpcmVkKGFkYXB0ZXItXHUwMDNldmRldixcbitcdFx0XHRcdFx0aWJtdmV0aF9nZXRfZGVzaXJlZF9kbWEoYWRhcHRlci1cdTAwM2V2ZGV2KSk7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwX25ld19xdWV1ZXM6XG4rXHRmYWlsZWRfcXVldWUgPSBpO1xuK1x0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdCAgIFwiU2NhbGUtdXAgZmFpbGVkIGF0IHF1ZXVlICVkLCBjbGVhbmluZyB1cCBxdWV1ZXMgJWQtJWRcXG5cIixcbitcdFx0ICAgZmFpbGVkX3F1ZXVlLCBvbGRfY291bnQsIGZhaWxlZF9xdWV1ZSAtIDEpO1xuK1x0Zm9yIChpID0gb2xkX2NvdW50OyBpIFx1MDAzYyBmYWlsZWRfcXVldWU7IGkrKylcbitcdFx0bmFwaV9kaXNhYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSk7XG4rXG4rXHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSsrKVxuK1x0XHRpYm12ZXRoX2RyYWluX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1xuK1x0c3luY2hyb25pemVfbmV0KCk7XG4rXG4rXHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSsrKSB7XG4rXHRcdGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgaSk7XG4rXHRcdHN5bmNocm9uaXplX2lycShhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSBvbGRfY291bnQ7IGkgXHUwMDNjIGZhaWxlZF9xdWV1ZTsgaSsrKSB7XG4rXHRcdGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0KGFkYXB0ZXIsIGkpO1xuK1x0XHRpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1x0XHRpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpO1xuK1x0fVxuK1x0YWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzID0gb2xkX2NvdW50O1xuK1x0bmV0ZGV2X3dhcm4obmV0ZGV2LCBcIktlZXBpbmcgJWQgcXVldWVzIGFmdGVyIHNjYWxlLXVwIGZhaWx1cmVcXG5cIixcbitcdFx0ICAgIG9sZF9jb3VudCk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuKy8qKlxuKyAqIGlibXZldGhfZnJlZV9hbGxfcXVldWVzIC0gRnJlZSBhbGwgUlggcXVldWVzIGF0IG9uY2VcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqXG4rICogVXNlcyBIX0ZSRUVfTE9HSUNBTF9MQU4gdG8gZnJlZSBhbGwgcXVldWVzIGluIG9uZSBoeXBlcmNhbGwuXG4rICogVXNlZCBkdXJpbmcgaW50ZXJmYWNlIGNsb3NlIGFuZCByZWdpc3RyYXRpb24gZXJyb3IgY2xlYW51cC5cbisgKlxuKyAqIENsZWFycyBxdWV1ZSBoYW5kbGVzIG9ubHk7IHF1ZXVlX2lycVtdIGlzIHJlbGVhc2VkIGJ5XG4rICogaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHMoKSBvbiBjbG9zZSwgb3IgYnlcbisgKiBpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKCkgb24gcGFydGlhbCByZWdpc3RlciBmYWlsdXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9hbGxfcXVldWVzKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBscGFyX3JjO1xuK1x0aW50IGk7XG4rXG4rXHRuZXRkZXZfZGJnKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LCBcImZyZWVpbmcgYWxsIFJYIHF1ZXVlcyBhdCBvbmNlXFxuXCIpO1xuK1xuK1x0ZG8ge1xuK1x0XHRscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MpO1xuK1x0XHRhZGFwdGVyLVx1MDAzZWhjYWxsX3N0YXRzLmZyZWVfbGFuKys7XG4rXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcbitcbitcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuK1x0XHRuZXRkZXZfZXJyKGFkYXB0ZXItXHUwMDNlbmV0ZGV2LFxuK1x0XHRcdCAgIFwiaF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZDogJWxkXFxuXCIsIGxwYXJfcmMpO1xuIFx0fVxuIFxuLVx0cmV0dXJuIDA7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKylcbitcdFx0YWRhcHRlci1cdTAwM2VxdWV1ZV9oYW5kbGVbaV0gPSAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcixcbi0gICAgICAgIHVuaW9uIGlibXZldGhfYnVmX2Rlc2MgcnhxX2Rlc2MsIHU2NCBtYWNfYWRkcmVzcylcbisvKipcbisgKiBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyAtIFJlZ2lzdGVyIFJYIHF1ZXVlcyB3aXRoIGh5cGVydmlzb3JcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyIHN0cnVjdHVyZVxuKyAqIEBtYWNfYWRkcmVzczogTUFDIGFkZHJlc3MgZm9yIGRldmljZSByZWdpc3RyYXRpb25cbisgKlxuKyAqIFJlZ2lzdGVycyBxdWV1ZSAwIHZpYSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKCksIHRoZW4gc3Vib3JkaW5hdGVcbisgKiBxdWV1ZXMgMS4uTiB3aGVuIG11bHRpLXF1ZXVlIG1vZGUgaXMgZW5hYmxlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTkVUIGlmIHF1ZXVlIDAgcmVnaXN0cmF0aW9uIGZhaWxzLCAtRUlPIG9uXG4rICogICAgICAgICBzdWJvcmRpbmF0ZSBxdWV1ZSByZWdpc3RyYXRpb24gZmFpbHVyZVxuKyAqL1xuK3N0YXRpYyBpbnRcbitpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlcyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCB1NjQgbWFjX2FkZHJlc3MpXG4ge1xuLVx0aW50IHJjLCB0cnlfYWdhaW4gPSAxO1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuK1x0dW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYztcbitcdHVuc2lnbmVkIGxvbmcgbHBhcl9yYztcbitcdGludCBpLCByYztcbiBcbi1cdC8qXG4tXHQgKiBBZnRlciBhIGtleGVjIHRoZSBhZGFwdGVyIHdpbGwgc3RpbGwgYmUgb3Blbiwgc28gb3VyIGF0dGVtcHQgdG9cbi1cdCAqIG9wZW4gaXQgd2lsbCBmYWlsLiBTbyBpZiB3ZSBnZXQgYSBmYWlsdXJlIHdlIGZyZWUgdGhlIGFkYXB0ZXIgYW5kXG4tXHQgKiB0cnkgYWdhaW4sIGJ1dCBvbmx5IG9uY2UuXG4tXHQgKi9cbi1yZXRyeTpcbi1cdHJjID0gaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbihhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuLVx0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hLCByeHFfZGVzYy5kZXNjLFxuLVx0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hLCBtYWNfYWRkcmVzcyk7XG4rXHRyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfFxuK1x0XHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWVbMF0ucXVldWVfbGVuO1xuK1x0cnhxX2Rlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2RtYTtcbitcdGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxWzBdID0gbmV0ZGV2LVx1MDAzZWlycTtcbiBcbi1cdGlmIChyYyAhPSBIX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IHRyeV9hZ2Fpbikge1xuLVx0XHRkbyB7XG4tXHRcdFx0cmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4tXHRcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKHJjKSB8fCAocmMgPT0gSF9CVVNZKSk7XG4rXHRyYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgMCk7XG4rXHRpZiAocmMgIT0gSF9TVUNDRVNTKVxuK1x0XHRuZXRkZXZfZGJnKG5ldGRldixcbitcdFx0XHQgICBcIkZhaWxlZCB0byBkaXNhYmxlIElSUSBmb3IgcXVldWUgMCBiZWZvcmUgcmVnaXN0cmF0aW9uLCByYz0lZFxcblwiLFxuK1x0XHRcdCAgIHJjKTtcbiBcbi1cdFx0dHJ5X2FnYWluID0gMDtcbi1cdFx0Z290byByZXRyeTtcbitcdGxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXIsIHJ4cV9kZXNjLCBtYWNfYWRkcmVzcyk7XG4rXHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwiaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQ6ICVsZFxcblwiLCBscGFyX3JjKTtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdFx0ICAgXCJidWZmZXIgVENFOjB4JWxseCBmaWx0ZXIgVENFOjB4JWxseCByeHEgZGVzYzoweCVsbHggTUFDOjB4JWxseFxcblwiLFxuK1x0XHRcdCAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hWzBdLFxuK1x0XHRcdCAgIGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hLFxuK1x0XHRcdCAgIHJ4cV9kZXNjLmRlc2MsIG1hY19hZGRyZXNzKTtcbitcdFx0cmV0dXJuIC1FTk9ORVQ7XG4rXHR9XG4rXG4rXHRpZiAoYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzID09IDEgfHwgIWFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpIHtcbitcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsXG4rXHRcdFx0ICAgXCJyZWdpc3RlcmVkIDEgUlggcXVldWUgd2l0aCBoeXBlcnZpc29yIChzaW5nbGUtcXVldWUgbW9kZSlcXG5cIik7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiUmVnaXN0ZXJpbmcgJWQgc3Vib3JkaW5hdGUgcXVldWVzICgxLSVkKVxcblwiLFxuK1x0XHQgICBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgLSAxLCBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgLSAxKTtcbitcbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdHJjID0gaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWUoYWRhcHRlciwgaSwgbWFjX2FkZHJlc3MpO1xuK1x0XHRpZiAocmMpIHtcbitcdFx0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcXVldWVfaGFuZGxlW2ldIHx8ICFhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSkge1xuK1x0XHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdFx0XHRcdCAgIFwiSW52YWxpZCBoeXBlcnZpc29yIHJldHVybiBmb3IgcXVldWUgJWQ6IGhhbmRsZT0weCVsbHggaXJxPSV1XFxuXCIsXG4rXHRcdFx0XHRcdCAgIGksIGFkYXB0ZXItXHUwMDNlcXVldWVfaGFuZGxlW2ldLFxuK1x0XHRcdFx0XHQgICBhZGFwdGVyLVx1MDAzZXF1ZXVlX2lycVtpXSk7XG4rXHRcdFx0fVxuK1x0XHRcdGdvdG8gZXJyX3VucmVnaXN0ZXI7XG4rXHRcdH1cbiBcdH1cbiBcbitcdG5ldGRldl9kYmcobmV0ZGV2LFxuK1x0XHQgICBcInJlZ2lzdGVyZWQgJWQgUlggcXVldWVzIHdpdGggaHlwZXJ2aXNvciAobXVsdGktcXVldWUgbW9kZSlcXG5cIixcbitcdFx0ICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbitcbitcdHJldHVybiAwO1xuK1xuK2Vycl91bnJlZ2lzdGVyOlxuK1x0aWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5ncyhhZGFwdGVyKTtcbitcdGlibXZldGhfZnJlZV9hbGxfcXVldWVzKGFkYXB0ZXIpO1xuIFx0cmV0dXJuIHJjO1xuIH1cbiBcbiBzdGF0aWMgaW50IGlibXZldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KVxuIHtcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuLVx0dTY0IG1hY19hZGRyZXNzO1xuK1x0dTY0IG1hY19hZGRyZXNzID0gZXRoZXJfYWRkcl90b191NjQobmV0ZGV2LVx1MDAzZWRldl9hZGRyKTtcbiBcdGludCByeHFfZW50cmllcyA9IDE7XG4tXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4gXHRpbnQgcmM7XG4tXHR1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIHJ4cV9kZXNjO1xuIFx0aW50IGk7XG4tXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG4gXG4gXHRuZXRkZXZfZGJnKG5ldGRldiwgXCJvcGVuIHN0YXJ0aW5nXFxuXCIpO1xuIFxuLVx0bmFwaV9lbmFibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpKTtcbi1cbi1cdGZvcihpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxuLVx0XHRyeHFfZW50cmllcyArPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5zaXplO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxuK1x0XHRyeHFfZW50cmllcyArPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5zaXplO1xuIFxuLVx0cmMgPSAtRU5PTUVNO1xuLVx0YWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcikge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gYWxsb2NhdGUgbGlzdCBwYWdlc1xcblwiKTtcbitcdHJjID0gaWJtdmV0aF9hbGxvY19yeF9xc3RhdHMoYWRhcHRlcik7XG4rXHRpZiAocmMpXG4gXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0YWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIWFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfYWRkcikge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gYWxsb2NhdGUgZmlsdGVyIHBhZ2VzXFxuXCIpO1xuLVx0XHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9saXN0O1xuLVx0fVxuIFxuLVx0ZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbitcdHJjID0gaWJtdmV0aF9hbGxvY19maWx0ZXJfbGlzdChhZGFwdGVyKTtcbitcdGlmIChyYylcbitcdFx0Z290byBvdXRfZnJlZV9yeF9xc3RhdHM7XG4gXG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSAqXG4tXHRcdFx0XHRcdFx0cnhxX2VudHJpZXM7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIgPVxuLVx0XHRkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbixcbi1cdFx0XHRcdCAgIFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfZG1hLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyKVxuK1x0cmMgPSBpYm12ZXRoX2FsbG9jX3J4X3F1ZXVlcyhhZGFwdGVyLCByeHFfZW50cmllcyk7XG4rXHRpZiAocmMpXG4gXHRcdGdvdG8gb3V0X2ZyZWVfZmlsdGVyX2xpc3Q7XG4gXG4tXHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldixcbi1cdFx0XHRhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcbi1cdGlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hKSkge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBsaXN0IHBhZ2VzXFxuXCIpO1xuK1x0cmMgPSBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29scyhhZGFwdGVyKTtcbitcdGlmIChyYylcbiBcdFx0Z290byBvdXRfZnJlZV9xdWV1ZV9tZW07XG4tXHR9XG4gXG4tXHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldixcbi1cdFx0XHRhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTtcbi1cdGlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItXHUwMDNlZmlsdGVyX2xpc3RfZG1hKSkge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gbWFwIGZpbHRlciBsaXN0IHBhZ2VzXFxuXCIpO1xuLVx0XHRnb3RvIG91dF91bm1hcF9idWZmZXJfbGlzdDtcbi1cdH1cbitcdHJjID0gaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXMoYWRhcHRlciwgbWFjX2FkZHJlc3MpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGkrKykge1xuLVx0XHRpZiAoaWJtdmV0aF9hbGxvY2F0ZV90eF9sdGIoYWRhcHRlciwgaSkpXG4tXHRcdFx0Z290byBvdXRfZnJlZV90eF9sdGI7XG4rXHRyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpO1xuK1x0aWYgKHJjKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcImZhaWxlZCB0byBzZXQgbnVtYmVyIG9mIHJ4IHF1ZXVlc1xcblwiKTtcbitcdFx0Z290byBvdXRfdW5yZWdpc3Rlcl9xdWV1ZXM7XG4gXHR9XG4gXG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLmluZGV4ID0gMDtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUubnVtX3Nsb3RzID0gcnhxX2VudHJpZXM7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnRvZ2dsZSA9IDE7XG4tXG4tXHRtYWNfYWRkcmVzcyA9IGV0aGVyX2FkZHJfdG9fdTY0KG5ldGRldi1cdTAwM2VkZXZfYWRkcik7XG4tXG4tXHRyeHFfZGVzYy5maWVsZHMuZmxhZ3NfbGVuID0gSUJNVkVUSF9CVUZfVkFMSUQgfFxuLVx0XHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbjtcbi1cdHJ4cV9kZXNjLmZpZWxkcy5hZGRyZXNzID0gYWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9kbWE7XG4tXG4tXHRuZXRkZXZfZGJnKG5ldGRldiwgXCJidWZmZXIgbGlzdCBAIDB4JXBcXG5cIiwgYWRhcHRlci1cdTAwM2VidWZmZXJfbGlzdF9hZGRyKTtcbi1cdG5ldGRldl9kYmcobmV0ZGV2LCBcImZpbHRlciBsaXN0IEAgMHglcFxcblwiLCBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIpO1xuLVx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwicmVjZWl2ZSBxICAgQCAweCVwXFxuXCIsIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcik7XG4tXG4tXHRoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTtcbi1cbi1cdGxwYXJfcmMgPSBpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKGFkYXB0ZXIsIHJ4cV9kZXNjLCBtYWNfYWRkcmVzcyk7XG4tXG4tXHRpZiAobHBhcl9yYyAhPSBIX1NVQ0NFU1MpIHtcbi1cdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwiaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbiBmYWlsZWQgd2l0aCAlbGRcXG5cIixcbi1cdFx0XHQgICBscGFyX3JjKTtcbi1cdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwiYnVmZmVyIFRDRToweCVsbHggZmlsdGVyIFRDRToweCVsbHggcnhxIFwiXG4tXHRcdFx0ICAgXCJkZXNjOjB4JWxseCBNQUM6MHglbGx4XFxuXCIsXG4tXHRcdFx0XHQgICAgIGFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfZG1hLFxuLVx0XHRcdFx0ICAgICBhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2RtYSxcbi1cdFx0XHRcdCAgICAgcnhxX2Rlc2MuZGVzYyxcbi1cdFx0XHRcdCAgICAgbWFjX2FkZHJlc3MpO1xuLVx0XHRyYyA9IC1FTk9ORVQ7XG4tXHRcdGdvdG8gb3V0X3VubWFwX2ZpbHRlcl9saXN0O1xuLVx0fVxuK1x0cmMgPSBpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHMoYWRhcHRlcik7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X3VucmVnaXN0ZXJfcXVldWVzO1xuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XG4tXHRcdGlmICghYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRpZiAoaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSkpIHtcbi1cdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJ1bmFibGUgdG8gYWxsb2MgcG9vbFxcblwiKTtcbi1cdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUgPSAwO1xuLVx0XHRcdHJjID0gLUVOT01FTTtcbi1cdFx0XHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcbitcdGlmIChhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgXHUwMDNlIDEpIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcbitcdFx0XHRuZXRkZXZfZGJnKG5ldGRldiwgXCJpbml0aWFsIHJlcGxlbmlzaCBjeWNsZSBmb3IgcXVldWUgJWRcXG5cIiwgaSk7XG4rXHRcdFx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyLCBpKTtcbiBcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiaW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcXG5cIik7XG4rXHRcdGlibXZldGhfaW50ZXJydXB0KGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxWzBdLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbMF0pO1xuIFx0fVxuIFxuLVx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwicmVnaXN0ZXJpbmcgaXJxIDB4JXhcXG5cIiwgbmV0ZGV2LVx1MDAzZWlycSk7XG4tXHRyYyA9IHJlcXVlc3RfaXJxKG5ldGRldi1cdTAwM2VpcnEsIGlibXZldGhfaW50ZXJydXB0LCAwLCBuZXRkZXYtXHUwMDNlbmFtZSxcbi1cdFx0XHQgbmV0ZGV2KTtcbi1cdGlmIChyYyAhPSAwKSB7XG4tXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInVuYWJsZSB0byByZXF1ZXN0IGlycSAweCV4LCByYyAlZFxcblwiLFxuLVx0XHRcdCAgIG5ldGRldi1cdTAwM2VpcnEsIHJjKTtcbi1cdFx0ZG8ge1xuLVx0XHRcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4tXHRcdH0gd2hpbGUgKEhfSVNfTE9OR19CVVNZKGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQlVTWSkpO1xuLVxuLVx0XHRnb3RvIG91dF9mcmVlX2J1ZmZlcl9wb29scztcbi1cdH1cbi1cbi1cdHJjID0gLUVOT01FTTtcbitcdHJjID0gaWJtdmV0aF9hbGxvY190eF9yZXNvdXJjZXMoYWRhcHRlcik7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2NsZWFudXBfcnhfaW50ZXJydXB0cztcbiBcbi1cdG5ldGRldl9kYmcobmV0ZGV2LCBcImluaXRpYWwgcmVwbGVuaXNoIGN5Y2xlXFxuXCIpO1xuLVx0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVx1MDAzZWlycSwgbmV0ZGV2KTtcbitcdHJjID0gaWJtdmV0aF9hbGxvY190eF9xc3RhdHMoYWRhcHRlcik7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2ZyZWVfdHhfcmVzb3VyY2VzO1xuIFxuIFx0bmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpO1xuIFxuIFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwib3BlbiBjb21wbGV0ZVxcblwiKTtcbi1cbiBcdHJldHVybiAwO1xuIFxuK291dF9jbGVhbnVwX3J4X2ludGVycnVwdHM6XG4rXHRpYm12ZXRoX2NsZWFudXBfcnhfaW50ZXJydXB0cyhhZGFwdGVyKTtcbitvdXRfZnJlZV90eF9yZXNvdXJjZXM6XG4rXHRpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpO1xuIG91dF9mcmVlX2J1ZmZlcl9wb29sczpcbi1cdHdoaWxlICgtLWkgXHUwMDNlPSAwKSB7XG4tXHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXG4tXHRcdFx0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsXG4tXHRcdFx0XHRcdFx0IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldKTtcbi1cdH1cbi1vdXRfdW5tYXBfZmlsdGVyX2xpc3Q6XG4tXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEsIDQwOTYsXG4tXHRcdFx0IERNQV9CSURJUkVDVElPTkFMKTtcbi1cbi1vdXRfZnJlZV90eF9sdGI6XG4tXHR3aGlsZSAoLS1pIFx1MDAzZT0gMCkge1xuLVx0XHRpYm12ZXRoX2ZyZWVfdHhfbHRiKGFkYXB0ZXIsIGkpO1xuLVx0fVxuLVxuLW91dF91bm1hcF9idWZmZXJfbGlzdDpcbi1cdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYSwgNDA5Nixcbi1cdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuK1x0aWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29scyhhZGFwdGVyKTtcbitvdXRfdW5yZWdpc3Rlcl9xdWV1ZXM6XG4rXHRpYm12ZXRoX2Rpc3Bvc2Vfc3Vib3JkaW5hdGVfaXJxX21hcHBpbmdzKGFkYXB0ZXIpO1xuK1x0aWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoYWRhcHRlcik7XG4gb3V0X2ZyZWVfcXVldWVfbWVtOlxuLVx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfZG1hKTtcbitcdGlibXZldGhfY2xlYW51cF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7XG4gb3V0X2ZyZWVfZmlsdGVyX2xpc3Q6XG4tXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9hZGRyKTtcbi1vdXRfZnJlZV9idWZmZXJfbGlzdDpcbi1cdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2FkZHIpO1xuK1x0aWJtdmV0aF9mcmVlX2ZpbHRlcl9saXN0KGFkYXB0ZXIpO1xuK291dF9mcmVlX3J4X3FzdGF0czpcbitcdGlibXZldGhfZnJlZV9yeF9xc3RhdHMoYWRhcHRlcik7XG4gb3V0OlxuLVx0bmFwaV9kaXNhYmxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaSk7XG4gXHRyZXR1cm4gcmM7XG4gfVxuIFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KVxuIHtcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuLVx0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2YWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZWRldjtcbi1cdGxvbmcgbHBhcl9yYztcbiBcdGludCBpO1xuIFxuIFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwiY2xvc2Ugc3RhcnRpbmdcXG5cIik7XG4gXG4tXHRuYXBpX2Rpc2FibGUoXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpKTtcbi1cbiBcdG5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpO1xuIFxuLVx0aF92aW9fc2lnbmFsKGFkYXB0ZXItXHUwMDNldmRldi1cdTAwM2V1bml0X2FkZHJlc3MsIFZJT19JUlFfRElTQUJMRSk7XG4tXG4tXHRkbyB7XG4tXHRcdGxwYXJfcmMgPSBoX2ZyZWVfbG9naWNhbF9sYW4oYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyk7XG4tXHR9IHdoaWxlIChIX0lTX0xPTkdfQlVTWShscGFyX3JjKSB8fCAobHBhcl9yYyA9PSBIX0JVU1kpKTtcbi1cbi1cdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuLVx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJoX2ZyZWVfbG9naWNhbF9sYW4gZmFpbGVkIHdpdGggJWx4LCBcIlxuLVx0XHRcdCAgIFwiY29udGludWluZyB3aXRoIGNsb3NlXFxuXCIsIGxwYXJfcmMpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpKyspIHtcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldKSB7XG4rXHRcdFx0aWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBpKTtcbitcdFx0XHRzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci1cdTAwM2VxdWV1ZV9pcnFbaV0pO1xuK1x0XHR9XG4gXHR9XG4gXG4tXHRmcmVlX2lycShuZXRkZXYtXHUwMDNlaXJxLCBuZXRkZXYpO1xuLVxuK1x0aWJtdmV0aF9mcmVlX3R4X3FzdGF0cyhhZGFwdGVyKTtcbitcdGlibXZldGhfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7XG4rXHRpYm12ZXRoX2NsZWFudXBfcnhfaW50ZXJydXB0cyhhZGFwdGVyKTtcbiBcdGlibXZldGhfdXBkYXRlX3J4X25vX2J1ZmZlcihhZGFwdGVyKTtcbi1cbi1cdGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGFwdGVyLVx1MDAzZWJ1ZmZlcl9saXN0X2RtYSwgNDA5Nixcbi1cdFx0XHQgRE1BX0JJRElSRUNUSU9OQUwpO1xuLVx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItXHUwMDNlYnVmZmVyX2xpc3RfYWRkcik7XG4tXG4tXHRkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRhcHRlci1cdTAwM2VmaWx0ZXJfbGlzdF9kbWEsIDQwOTYsXG4tXHRcdFx0IERNQV9CSURJUkVDVElPTkFMKTtcbi1cdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGFwdGVyLVx1MDAzZWZpbHRlcl9saXN0X2FkZHIpO1xuLVxuLVx0ZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2xlbixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkcixcbi1cdFx0XHQgIGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfZG1hKTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKylcbi1cdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldLmFjdGl2ZSlcbi1cdFx0XHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlcixcbi1cdFx0XHRcdFx0XHQgXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0pO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmV0ZGV2LVx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKVxuLVx0XHRpYm12ZXRoX2ZyZWVfdHhfbHRiKGFkYXB0ZXIsIGkpO1xuK1x0aWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXMoYWRhcHRlcik7XG4rXHRpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzKGFkYXB0ZXIpO1xuK1x0aWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKTtcbitcdGlibXZldGhfZnJlZV9maWx0ZXJfbGlzdChhZGFwdGVyKTtcbitcdGlibXZldGhfZnJlZV9yeF9xc3RhdHMoYWRhcHRlcik7XG4gXG4gXHRuZXRkZXZfZGJnKG5ldGRldiwgXCJjbG9zZSBjb21wbGV0ZVxcblwiKTtcbiBcbkBAIC0xMDczLDIyICsyMzc1LDEwNyBAQCBzdGF0aWMgaW50IGlibXZldGhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4gXHRyZXR1cm4gcmMxID8gcmMxIDogcmMyO1xuIH1cbiBcbisvKipcbisgKiBpYm12ZXRoX2FnZ3JlZ2F0ZV9yeF9xc3RhdHMgLSBTdW0gcGVyLXF1ZXVlIFJYIHN0YXRzIGludG8gZ2xvYmFsc1xuKyAqIEBhZGFwdGVyOiBpYm12ZXRoIGFkYXB0ZXJcbisgKlxuKyAqIENvbGQgcGF0aCBvbmx5IChldGh0b29sKS4gS2VlcHMgbGVnYWN5IGdsb2JhbCBjb3VudGVycyBtZWFuaW5nZnVsIGZvclxuKyAqIHRvb2xzIHRoYXQgcmVhZCB0aGUgYWRhcHRlci1sZXZlbCBmaWVsZHMgaW4gaWJtdmV0aF9zdGF0c1tdLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGlibXZldGhfYWdncmVnYXRlX3J4X3FzdGF0cyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKVxuK3tcbitcdHU2NCB0b3RhbF9pbnZhbGlkID0gMDtcbitcdHU2NCB0b3RhbF9sYXJnZSA9IDA7XG4rXHRpbnQgaTtcbitcbitcdGlmICghYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpXG4rXHRcdHJldHVybjtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdHRvdGFsX2ludmFsaWQgKz0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbaV0uaW52YWxpZF9idWZmZXJzO1xuK1x0XHR0b3RhbF9sYXJnZSArPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tpXS5sYXJnZV9wYWNrZXRzO1xuK1x0fVxuK1xuK1x0YWRhcHRlci1cdTAwM2VyeF9pbnZhbGlkX2J1ZmZlciA9IHRvdGFsX2ludmFsaWQ7XG4rXHRhZGFwdGVyLVx1MDAzZXJ4X2xhcmdlX3BhY2tldHMgPSB0b3RhbF9sYXJnZTtcbit9XG4rXG4rLyoqXG4rICogaWJtdmV0aF9hZ2dyZWdhdGVfdHhfcXN0YXRzIC0gU3VtIHBlci1xdWV1ZSBUWCBzdGF0cyBpbnRvIGdsb2JhbHNcbisgKiBAYWRhcHRlcjogaWJtdmV0aCBhZGFwdGVyXG4rICpcbisgKiBDb2xkIHBhdGggb25seSAoZXRodG9vbCkuIEtlZXBzIGxlZ2FjeSBnbG9iYWwgY291bnRlcnMgbWVhbmluZ2Z1bCBmb3JcbisgKiB0b29scyB0aGF0IHJlYWQgdGhlIGFkYXB0ZXItbGV2ZWwgZmllbGRzIGluIGlibXZldGhfc3RhdHNbXS5cbisgKi9cbitzdGF0aWMgdm9pZCBpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcilcbit7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4rXHR1NjQgdG90YWxfbGFyZ2UgPSAwO1xuK1x0dTY0IHRvdGFsX3NlbmRfZmFpbGVkID0gMDtcbitcdGludCBpO1xuK1xuK1x0aWYgKCFhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cylcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmV0ZGV2LVx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdHRvdGFsX2xhcmdlICs9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2ldLmxhcmdlX3BhY2tldHM7XG4rXHRcdHRvdGFsX3NlbmRfZmFpbGVkICs9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2ldLnNlbmRfZmFpbHVyZXM7XG4rXHR9XG4rXG4rXHRhZGFwdGVyLVx1MDAzZXR4X2xhcmdlX3BhY2tldHMgPSB0b3RhbF9sYXJnZTtcbitcdGFkYXB0ZXItXHUwMDNldHhfc2VuZF9mYWlsZWQgPSB0b3RhbF9zZW5kX2ZhaWxlZDtcbit9XG4rXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSlcbiB7XG4rXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTtcbitcdHU4ICpwID0gZGF0YTtcbiBcdGludCBpO1xuIFxuIFx0aWYgKHN0cmluZ3NldCAhPSBFVEhfU1NfU1RBVFMpXG4gXHRcdHJldHVybjtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7IGkrKywgZGF0YSArPSBFVEhfR1NUUklOR19MRU4pXG4tXHRcdG1lbWNweShkYXRhLCBpYm12ZXRoX3N0YXRzW2ldLm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOyBpKyspIHtcbitcdFx0bWVtY3B5KHAsIGlibXZldGhfc3RhdHNbaV0ubmFtZSwgRVRIX0dTVFJJTkdfTEVOKTtcbitcdFx0cCArPSBFVEhfR1NUUklOR19MRU47XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXM7IGkrKykge1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJyeCVkX3BhY2tldHNcIiwgaSk7XG4rXHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcInJ4JWRfYnl0ZXNcIiwgaSk7XG4rXHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcInJ4JWRfaW50ZXJydXB0c1wiLCBpKTtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwicnglZF9wb2xsc1wiLCBpKTtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwicnglZF9sYXJnZV9wYWNrZXRzXCIsIGkpO1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJyeCVkX2ludmFsaWRfYnVmZmVyc1wiLCBpKTtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwicnglZF9ub19idWZmZXJfZHJvcHNcIiwgaSk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzOyBpKyspIHtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwidHglZF9wYWNrZXRzXCIsIGkpO1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJ0eCVkX2J5dGVzXCIsIGkpO1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJ0eCVkX2xhcmdlX3BhY2tldHNcIiwgaSk7XG4rXHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcInR4JWRfZHJvcHBlZF9wYWNrZXRzXCIsIGkpO1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJ0eCVkX3NlbmRfZmFpbHVyZXNcIiwgaSk7XG4rXHRcdGV0aHRvb2xfc3ByaW50ZihcdTAwMjZwLCBcInR4JWRfY2hlY2tzdW1fb2ZmbG9hZFwiLCBpKTtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKykge1xuK1x0XHRldGh0b29sX3NwcmludGYoXHUwMDI2cCwgXCJwb29sJWRfc2l6ZVwiLCBpKTtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwicG9vbCVkX2FjdGl2ZVwiLCBpKTtcbitcdFx0ZXRodG9vbF9zcHJpbnRmKFx1MDAyNnAsIFwicG9vbCVkX2F2YWlsYWJsZVwiLCBpKTtcbitcdH1cbiB9XG4gXG4gc3RhdGljIGludCBpYm12ZXRoX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KVxuIHtcbitcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xuK1xuIFx0c3dpdGNoIChzc2V0KSB7XG4gXHRjYXNlIEVUSF9TU19TVEFUUzpcbi1cdFx0cmV0dXJuIEFSUkFZX1NJWkUoaWJtdmV0aF9zdGF0cyk7XG4rXHRcdHJldHVybiBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpICtcbitcdFx0ICAgICAgIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyAqIElCTVZFVEhfTlVNX1JYX1FTVEFUUyArXG4rXHRcdCAgICAgICBkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzICogSUJNVkVUSF9OVU1fVFhfUVNUQVRTICtcbitcdFx0ICAgICAgIElCTVZFVEhfTlVNX0JVRkZfUE9PTFMgKiAzO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIFx0fVxuQEAgLTEwOTcsNDAgKzI0ODQsMTMxIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldClcbiBzdGF0aWMgdm9pZCBpYm12ZXRoX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4gXHRcdFx0XHQgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSlcbiB7XG4tXHRpbnQgaTtcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpO1xuK1x0aW50IGksIGo7XG4rXG4rXHRpYm12ZXRoX2FnZ3JlZ2F0ZV9yeF9xc3RhdHMoYWRhcHRlcik7XG4rXHRpYm12ZXRoX2FnZ3JlZ2F0ZV90eF9xc3RhdHMoYWRhcHRlcik7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGlibXZldGhfc3RhdHMpOyBpKyspXG4gXHRcdGRhdGFbaV0gPSBJQk1WRVRIX0dFVF9TVEFUKGFkYXB0ZXIsIGlibXZldGhfc3RhdHNbaV0ub2Zmc2V0KTtcbitcbitcdGZvciAoaiA9IDA7IGogXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaisrKSB7XG4rXHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cykge1xuK1x0XHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2pdLnBhY2tldHM7XG4rXHRcdFx0ZGF0YVtpKytdID0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbal0uYnl0ZXM7XG4rXHRcdFx0ZGF0YVtpKytdID0gYWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbal0uaW50ZXJydXB0cztcbitcdFx0XHRkYXRhW2krK10gPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tqXS5wb2xscztcbitcdFx0XHRkYXRhW2krK10gPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tqXS5sYXJnZV9wYWNrZXRzO1xuK1x0XHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2pdLmludmFsaWRfYnVmZmVycztcbitcdFx0XHRkYXRhW2krK10gPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tqXS5ub19idWZmZXJfZHJvcHM7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0aSArPSBJQk1WRVRIX05VTV9SWF9RU1RBVFM7XG4rXHRcdH1cbitcdH1cbitcbitcdGZvciAoaiA9IDA7IGogXHUwMDNjIGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXM7IGorKykge1xuK1x0XHRpZiAoYWRhcHRlci1cdTAwM2V0eF9xc3RhdHMpIHtcbitcdFx0XHRkYXRhW2krK10gPSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tqXS5wYWNrZXRzO1xuK1x0XHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2pdLmJ5dGVzO1xuK1x0XHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2pdLmxhcmdlX3BhY2tldHM7XG4rXHRcdFx0ZGF0YVtpKytdID0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbal0uZHJvcHBlZF9wYWNrZXRzO1xuK1x0XHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2pdLnNlbmRfZmFpbHVyZXM7XG4rXHRcdFx0ZGF0YVtpKytdID0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbal0uY2hlY2tzdW1fb2ZmbG9hZDtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRpICs9IElCTVZFVEhfTlVNX1RYX1FTVEFUUztcbitcdFx0fVxuK1x0fVxuK1xuK1x0Zm9yIChqID0gMDsgaiBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaisrKSB7XG4rXHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2pdLnNpemU7XG4rXHRcdGRhdGFbaSsrXSA9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2pdLmFjdGl2ZTtcbitcdFx0ZGF0YVtpKytdID0gYXRvbWljX3JlYWQoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1bal0uYXZhaWxhYmxlKTtcbitcdH1cbiB9XG4gXG4gc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcbiBcdFx0XHRcdCBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hhbm5lbHMpXG4ge1xuK1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4rXG4gXHRjaGFubmVscy1cdTAwM2VtYXhfdHggPSBpYm12ZXRoX3JlYWxfbWF4X3R4X3F1ZXVlcygpO1xuIFx0Y2hhbm5lbHMtXHUwMDNldHhfY291bnQgPSBuZXRkZXYtXHUwMDNlcmVhbF9udW1fdHhfcXVldWVzO1xuIFxuLVx0Y2hhbm5lbHMtXHUwMDNlbWF4X3J4ID0gbmV0ZGV2LVx1MDAzZXJlYWxfbnVtX3J4X3F1ZXVlcztcbi1cdGNoYW5uZWxzLVx1MDAzZXJ4X2NvdW50ID0gbmV0ZGV2LVx1MDAzZXJlYWxfbnVtX3J4X3F1ZXVlcztcbitcdGlmIChhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKVxuK1x0XHRjaGFubmVscy1cdTAwM2VtYXhfcnggPSBJQk1WRVRIX01BWF9SWF9RVUVVRVM7XG4rXHRlbHNlXG4rXHRcdGNoYW5uZWxzLVx1MDAzZW1heF9yeCA9IDE7XG4rXHRjaGFubmVscy1cdTAwM2VyeF9jb3VudCA9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcztcbiB9XG4gXG4gc3RhdGljIGludCBpYm12ZXRoX3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LFxuIFx0XHRcdFx0c3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoYW5uZWxzKVxuIHtcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuLVx0dW5zaWduZWQgaW50IG9sZCA9IG5ldGRldi1cdTAwM2VyZWFsX251bV90eF9xdWV1ZXMsXG4tXHRcdCAgICAgZ29hbCA9IGNoYW5uZWxzLVx1MDAzZXR4X2NvdW50O1xuK1x0dW5zaWduZWQgaW50IG9sZF9yeCA9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcztcbitcdHVuc2lnbmVkIGludCBnb2FsX3J4ID0gY2hhbm5lbHMtXHUwMDNlcnhfY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQgb2xkID0gbmV0ZGV2LVx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlcztcbitcdHVuc2lnbmVkIGludCBnb2FsID0gY2hhbm5lbHMtXHUwMDNldHhfY291bnQ7XG4rXHRpbnQgcnhxX2VudHJpZXMgPSBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLm51bV9zbG90cztcbiBcdGludCByYywgaTtcbiBcbiBcdC8qIElmIG5kb19vcGVuIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0IHRoZW4gZG9uJ3QgYWxsb2NhdGUsIGp1c3Qgc2V0XG4gXHQgKiBkZXNpcmVkIG5ldGRldl9xdWV1ZSdzIGFuZCByZXR1cm5cbiBcdCAqL1xuLVx0aWYgKCEobmV0ZGV2LVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVVApKVxuK1x0aWYgKCEobmV0ZGV2LVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVVApKSB7XG4rXHRcdGlmIChnb2FsX3J4IFx1MDAzZSAxIFx1MDAyNlx1MDAyNiAhYWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSkge1xuK1x0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdFx0ICAgXCJDYW5ub3QgcmVzaXplIHRvICV1IFJYIHF1ZXVlczogbXVsdGktcXVldWUgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGZpcm13YXJlXFxuXCIsXG4rXHRcdFx0XHQgICBnb2FsX3J4KTtcbitcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHRcdH1cbitcbitcdFx0aWYgKGdvYWxfcnggXHUwMDNjIDEgfHwgZ29hbF9yeCBcdTAwM2UgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKSB7XG4rXHRcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdFx0XHQgICBcIkludmFsaWQgUlggcXVldWUgY291bnQgJXUgKG11c3QgYmUgMS0lZClcXG5cIixcbitcdFx0XHRcdCAgIGdvYWxfcngsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcbitcdFx0LyogU3Rhc2ggZGVzaXJlZCBSWCBjb3VudDsgb3BlbigpIHB1Ymxpc2hlcyBpdCB2aWFcbitcdFx0ICogbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcygpIGFmdGVyIHF1ZXVlIHJlZ2lzdHJhdGlvbi5cbitcdFx0ICovXG4rXHRcdGlmIChnb2FsX3J4ICE9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcylcbitcdFx0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSBnb2FsX3J4O1xuK1xuIFx0XHRyZXR1cm4gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXRkZXYsIGdvYWwpO1xuK1x0fVxuK1xuK1x0aWYgKGdvYWxfcnggXHUwMDNlIDEgXHUwMDI2XHUwMDI2ICFhZGFwdGVyLVx1MDAzZW11bHRpX3F1ZXVlKSB7XG4rXHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdCAgIFwiQ2Fubm90IHJlc2l6ZSB0byAldSBSWCBxdWV1ZXM6IG11bHRpLXF1ZXVlIG1vZGUgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxcblwiLFxuK1x0XHRcdCAgIGdvYWxfcngpO1xuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHR9XG4rXG4rXHRpZiAoZ29hbF9yeCBcdTAwM2MgMSB8fCBnb2FsX3J4IFx1MDAzZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMpIHtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsXG4rXHRcdFx0ICAgXCJJbnZhbGlkIFJYIHF1ZXVlIGNvdW50ICV1IChtdXN0IGJlIDEtJWQpXFxuXCIsXG4rXHRcdFx0ICAgZ29hbF9yeCwgSUJNVkVUSF9NQVhfUlhfUVVFVUVTKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRpZiAoZ29hbF9yeCAhPSBvbGRfcngpIHtcbitcdFx0cmMgPSBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWwoYWRhcHRlciwgZ29hbF9yeCxcbitcdFx0XHRcdFx0XHRcdCAgcnhxX2VudHJpZXMpO1xuK1x0XHRpZiAocmMpIHtcbitcdFx0XHRuZXRkZXZfZXJyKG5ldGRldiwgXCJGYWlsZWQgdG8gcmVzaXplIFJYIHF1ZXVlczogJWRcXG5cIiwgcmMpO1xuK1x0XHRcdHJldHVybiByYztcbitcdFx0fVxuK1x0fVxuIFxuIFx0LyogV2UgaGF2ZSBJQk1WRVRIX01BWF9RVUVVRVMgbmV0ZGV2X3F1ZXVlJ3MgYWxsb2NhdGVkXG4gXHQgKiBidXQgd2UgbWF5IG5lZWQgdG8gYWxsb2MvZnJlZSB0aGUgbHRiJ3MuXG4gXHQgKi9cbitcdGlmIChnb2FsID09IG9sZClcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHRuZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTtcbiBcbiBcdC8qIEFsbG9jYXRlIGFueSBxdWV1ZSB0aGF0IHdlIG5lZWQgKi9cbkBAIC0xMTY0LDcgKzI2NDIsNyBAQCBzdGF0aWMgaW50IGlibXZldGhfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXG4gXHRuZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMobmV0ZGV2KTtcbiBcbi1cdHJldHVybiByYztcbitcdHJldHVybiAwO1xuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHtcbkBAIC0xMjA5LDEyICsyNjg3LDE1IEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9zZW5kKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsXG4gXHRcdHJldHVybiAxO1xuIFx0fVxuIFxuK1x0YWRhcHRlci1cdTAwM2VoY2FsbF9zdGF0cy5zZW5kX2xhbisrO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyBpbnQgaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbi1cdFx0XHRcdFx0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLFxuK1x0XHRcdFx0XHQgaW50IHF1ZXVlX251bSlcbiB7XG4rXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci1cdTAwM2VuZXRkZXY7XG4gXHRzdHJ1Y3QgZXRoaGRyICpldGhlcl9oZWFkZXI7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbkBAIC0xMjIyLDcgKzI3MDMsOCBAQCBzdGF0aWMgaW50IGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHN0cnVjdCBza19idWZmICpza2IsXG4gXG4gXHRpZiAoZXRoZXJfYWRkcl9lcXVhbChldGhlcl9oZWFkZXItXHUwMDNlaF9kZXN0LCBuZXRkZXYtXHUwMDNlZGV2X2FkZHIpKSB7XG4gXHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcInZldGggZG9lc24ndCBzdXBwb3J0IGxvb3BiYWNrIHBhY2tldHMsIGRyb3BwaW5nIHBhY2tldC5cXG5cIik7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9kcm9wcGVkKys7XG4rXHRcdGlmIChhZGFwdGVyLVx1MDAzZXR4X3FzdGF0cylcbitcdFx0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cysrO1xuIFx0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbiBcdH1cbiBcbkBAIC0xMjM4LDcgKzI3MjAsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXHRpbnQgaSwgcXVldWVfbnVtID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7XG4gXHR1bnNpZ25lZCBsb25nIG1zcyA9IDA7XG4gXG4tXHRpZiAoaWJtdmV0aF9pc19wYWNrZXRfdW5zdXBwb3J0ZWQoc2tiLCBuZXRkZXYpKVxuK1x0aWYgKGlibXZldGhfaXNfcGFja2V0X3Vuc3VwcG9ydGVkKHNrYiwgYWRhcHRlciwgcXVldWVfbnVtKSlcbiBcdFx0Z290byBvdXQ7XG4gXHQvKiB2ZXRoIGNhbid0IGNoZWNrc3VtIG9mZmxvYWQgVURQICovXG4gXHRpZiAoc2tiLVx1MDAzZWlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMIFx1MDAyNlx1MDAyNlxuQEAgLTEyNDksNyArMjczMSw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBpYm12ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdCAgICBza2JfY2hlY2tzdW1faGVscChza2IpKSB7XG4gXG4gXHRcdG5ldGRldl9lcnIobmV0ZGV2LCBcInR4OiBmYWlsZWQgdG8gY2hlY2tzdW0gcGFja2V0XFxuXCIpO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCsrO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cysrO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC0xMjYxLDYgKzI3NDMsOCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXG4gXHRcdGRlc2NfZmxhZ3MgfD0gKElCTVZFVEhfQlVGX05PX0NTVU0gfCBJQk1WRVRIX0JVRl9DU1VNX0dPT0QpO1xuIFxuK1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmNoZWNrc3VtX29mZmxvYWQrKztcbitcbiBcdFx0LyogTmVlZCB0byB6ZXJvIG91dCB0aGUgY2hlY2tzdW0gKi9cbiBcdFx0YnVmWzBdID0gMDtcbiBcdFx0YnVmWzFdID0gMDtcbkBAIC0xMjcyLDcgKzI3NTYsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXHRpZiAoc2tiLVx1MDAzZWlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMIFx1MDAyNlx1MDAyNiBza2JfaXNfZ3NvKHNrYikpIHtcbiBcdFx0aWYgKGFkYXB0ZXItXHUwMDNlZndfbGFyZ2Vfc2VuZF9zdXBwb3J0KSB7XG4gXHRcdFx0bXNzID0gKHVuc2lnbmVkIGxvbmcpc2tiX3NoaW5mbyhza2IpLVx1MDAzZWdzb19zaXplO1xuLVx0XHRcdGFkYXB0ZXItXHUwMDNldHhfbGFyZ2VfcGFja2V0cysrO1xuK1x0XHRcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0ubGFyZ2VfcGFja2V0cysrO1xuIFx0XHR9IGVsc2UgaWYgKCFza2JfaXNfZ3NvX3Y2KHNrYikpIHtcbiBcdFx0XHQvKiBQdXQgLTEgaW4gdGhlIElQIGNoZWNrc3VtIHRvIHRlbGwgcGh5cCBpdFxuIFx0XHRcdCAqIGlzIGEgbGFyZ2VzZW5kIHBhY2tldC4gUHV0IHRoZSBtc3MgaW5cbkBAIC0xMjgxLDcgKzI3NjUsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXHRcdFx0aXBfaGRyKHNrYiktXHUwMDNlY2hlY2sgPSAweGZmZmY7XG4gXHRcdFx0dGNwX2hkcihza2IpLVx1MDAzZWNoZWNrID1cbiBcdFx0XHRcdGNwdV90b19iZTE2KHNrYl9zaGluZm8oc2tiKS1cdTAwM2Vnc29fc2l6ZSk7XG4tXHRcdFx0YWRhcHRlci1cdTAwM2V0eF9sYXJnZV9wYWNrZXRzKys7XG4rXHRcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5sYXJnZV9wYWNrZXRzKys7XG4gXHRcdH1cbiBcdH1cbiBcbkBAIC0xMjg5LDcgKzI3NzMsNyBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4gXHRpZiAodW5saWtlbHkoc2tiLVx1MDAzZWxlbiBcdTAwM2UgYWRhcHRlci1cdTAwM2V0eF9sdGJfc2l6ZSkpIHtcbiBcdFx0bmV0ZGV2X2VycihhZGFwdGVyLVx1MDAzZW5ldGRldiwgXCJ0eDogcGFja2V0IHNpemUgKCV1KSBleGNlZWRzIGx0YiAoJXUpXFxuXCIsXG4gXHRcdFx0ICAgc2tiLVx1MDAzZWxlbiwgYWRhcHRlci1cdTAwM2V0eF9sdGJfc2l6ZSk7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9kcm9wcGVkKys7XG4rXHRcdGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW3F1ZXVlX251bV0uZHJvcHBlZF9wYWNrZXRzKys7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0bWVtY3B5KGFkYXB0ZXItXHUwMDNldHhfbHRiX3B0cltxdWV1ZV9udW1dLCBza2ItXHUwMDNlZGF0YSwgc2tiX2hlYWRsZW4oc2tiKSk7XG5AQCAtMTMwNiw3ICsyNzkwLDcgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0aWYgKHVubGlrZWx5KHRvdGFsX2J5dGVzICE9IHNrYi1cdTAwM2VsZW4pKSB7XG4gXHRcdG5ldGRldl9lcnIoYWRhcHRlci1cdTAwM2VuZXRkZXYsIFwidHg6IGluY29ycmVjdCBwYWNrZXQgbGVuIGNvcGllZCBpbnRvIGx0YiAoJXUgIT0gJXUpXFxuXCIsXG4gXHRcdFx0ICAgc2tiLVx1MDAzZWxlbiwgdG90YWxfYnl0ZXMpO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCsrO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLmRyb3BwZWRfcGFja2V0cysrO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcdGRlc2MuZmllbGRzLmZsYWdzX2xlbiA9IGRlc2NfZmxhZ3MgfCBza2ItXHUwMDNlbGVuO1xuQEAgLTEzMTUsMTEgKzI3OTksMTEgQEAgc3RhdGljIG5ldGRldl90eF90IGlibXZldGhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0ZG1hX3dtYigpO1xuIFxuIFx0aWYgKGlibXZldGhfc2VuZChhZGFwdGVyLCBkZXNjLmRlc2MsIG1zcykpIHtcbi1cdFx0YWRhcHRlci1cdTAwM2V0eF9zZW5kX2ZhaWxlZCsrO1xuLVx0XHRuZXRkZXYtXHUwMDNlc3RhdHMudHhfZHJvcHBlZCsrO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLnNlbmRfZmFpbHVyZXMrKztcbitcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5kcm9wcGVkX3BhY2tldHMrKztcbiBcdH0gZWxzZSB7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9wYWNrZXRzKys7XG4tXHRcdG5ldGRldi1cdTAwM2VzdGF0cy50eF9ieXRlcyArPSBza2ItXHUwMDNlbGVuO1xuK1x0XHRhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1txdWV1ZV9udW1dLnBhY2tldHMrKztcbitcdFx0YWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbcXVldWVfbnVtXS5ieXRlcyArPSBza2ItXHUwMDNlbGVuO1xuIFx0fVxuIFxuIG91dDpcbkBAIC0xNDQ3LDM2ICsyOTMxLDY5IEBAIHN0YXRpYyB2b2lkIGlibXZldGhfcnhfY3N1bV9oZWxwZXIoc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcbiBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4ge1xuLVx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9XG4tXHRcdFx0Y29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIsIG5hcGkpO1xuLVx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItXHUwMDNlbmV0ZGV2O1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktXHUwMDNlZGV2O1xuK1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4gXHRpbnQgZnJhbWVzX3Byb2Nlc3NlZCA9IDA7XG4gXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4rXHRpbnQgcXVldWVfaW5kZXgsIHJjO1xuIFx0dTE2IG1zcyA9IDA7XG4gXG4rXHRxdWV1ZV9pbmRleCA9IG5hcGkgLSBhZGFwdGVyLVx1MDAzZW5hcGk7XG4rXG4rXHRpZiAoV0FSTl9PTihxdWV1ZV9pbmRleCBcdTAwM2MgMCB8fCBxdWV1ZV9pbmRleCBcdTAwM2U9IGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcykpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikgfHwgbmFwaV9kaXNhYmxlX3BlbmRpbmcobmFwaSkpIHtcbitcdFx0bmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIDApO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLnBvbGxzKys7XG4rXG4gcmVzdGFydF9wb2xsOlxuIFx0d2hpbGUgKGZyYW1lc19wcm9jZXNzZWQgXHUwMDNjIGJ1ZGdldCkge1xuLVx0XHRpZiAoIWlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpKVxuK1x0XHRpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSB8fCBuYXBpX2Rpc2FibGVfcGVuZGluZyhuYXBpKSlcbitcdFx0XHRicmVhaztcbitcbitcdFx0aWYgKCFpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCkpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdHNtcF9ybWIoKTtcbi1cdFx0aWYgKCFpYm12ZXRoX3J4cV9idWZmZXJfdmFsaWQoYWRhcHRlcikpIHtcbitcdFx0aWYgKCFpYm12ZXRoX3J4cV9idWZmZXJfdmFsaWQoYWRhcHRlciwgcXVldWVfaW5kZXgpKSB7XG4gXHRcdFx0d21iKCk7IC8qIHN1Z2dlc3RlZCBieSBsYXJzb24xICovXG4tXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9pbnZhbGlkX2J1ZmZlcisrO1xuK1x0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbitcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5pbnZhbGlkX2J1ZmZlcnMrKztcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2ludmFsaWRfYnVmZmVyKys7XG4gXHRcdFx0bmV0ZGV2X2RiZyhuZXRkZXYsIFwicmVjeWNsaW5nIGludmFsaWQgYnVmZmVyXFxuXCIpO1xuLVx0XHRcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXG4rXHRcdFx0cmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCwgdHJ1ZSk7XG4rXHRcdFx0aWYgKHVubGlrZWx5KHJjKSlcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdHN0cnVjdCBza19idWZmICpza2IsICpuZXdfc2tiO1xuLVx0XHRcdGludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlcik7XG4tXHRcdFx0aW50IG9mZnNldCA9IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChhZGFwdGVyKTtcbi1cdFx0XHRpbnQgY3N1bV9nb29kID0gaWJtdmV0aF9yeHFfY3N1bV9nb29kKGFkYXB0ZXIpO1xuLVx0XHRcdGludCBscmdfcGt0ID0gaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KGFkYXB0ZXIpO1xuK1x0XHRcdGludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuK1x0XHRcdGludCBvZmZzZXQgPSBpYm12ZXRoX3J4cV9mcmFtZV9vZmZzZXQoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuK1x0XHRcdGludCBjc3VtX2dvb2QgPSBpYm12ZXRoX3J4cV9jc3VtX2dvb2QoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuK1x0XHRcdGludCBscmdfcGt0ID0gaWJtdmV0aF9yeHFfbGFyZ2VfcGFja2V0KGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbiBcdFx0XHRfX3N1bTE2IGlwaF9jaGVjayA9IDA7XG4gXG4tXHRcdFx0c2tiID0gaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKTtcbi1cdFx0XHRpZiAodW5saWtlbHkoIXNrYikpXG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHRza2IgPSBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbitcdFx0XHRpZiAodW5saWtlbHkoIXNrYikpIHtcbitcdFx0XHRcdGlmIChuZXRfcmF0ZWxpbWl0KCkpXG4rXHRcdFx0XHRcdG5ldGRldl9lcnIobmV0ZGV2LFxuK1x0XHRcdFx0XHRcdCAgIFwiYmFkIGNvcnJlbGF0b3Igb24gcXVldWUgJWQsIHNraXBwaW5nIHNsb3RcXG5cIixcbitcdFx0XHRcdFx0XHQgICBxdWV1ZV9pbmRleCk7XG4rXHRcdFx0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpXG4rXHRcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5pbnZhbGlkX2J1ZmZlcnMrKztcbitcdFx0XHRcdGVsc2VcbitcdFx0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9pbnZhbGlkX2J1ZmZlcisrO1xuK1x0XHRcdFx0cmMgPSBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCBxdWV1ZV9pbmRleCxcbitcdFx0XHRcdFx0XHRcdFx0dHJ1ZSk7XG4rXHRcdFx0XHRpZiAodW5saWtlbHkocmMpKVxuK1x0XHRcdFx0XHRicmVhaztcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcbiBcdFx0XHQvKiBpZiB0aGUgbGFyZ2UgcGFja2V0IGJpdCBpcyBzZXQgaW4gdGhlIHJ4IHF1ZXVlXG4gXHRcdFx0ICogZGVzY3JpcHRvciwgdGhlIG1zcyB3aWxsIGJlIHdyaXR0ZW4gYnkgUEhZUCBlaWdodFxuQEAgLTE0OTksMTIgKzMwMTYsMTQgQEAgc3RhdGljIGludCBpYm12ZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KVxuIFx0XHRcdFx0XHRcdFx0bGVuZ3RoKTtcbiBcdFx0XHRcdGlmIChyeF9mbHVzaClcbiBcdFx0XHRcdFx0aWJtdmV0aF9mbHVzaF9idWZmZXIoc2tiLVx1MDAzZWRhdGEsXG4tXHRcdFx0XHRcdFx0bGVuZ3RoICsgb2Zmc2V0KTtcbi1cdFx0XHRcdGlmICh1bmxpa2VseShpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihhZGFwdGVyLCB0cnVlKSkpXG4rXHRcdFx0XHRcdFx0XHQgICAgIGxlbmd0aCArIG9mZnNldCk7XG4rXHRcdFx0XHRyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCB0cnVlKTtcbitcdFx0XHRcdGlmICh1bmxpa2VseShyYykpXG4gXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0c2tiID0gbmV3X3NrYjtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aWYgKHVubGlrZWx5KGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIGZhbHNlKSkpXG4rXHRcdFx0XHRyYyA9IGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4LCBmYWxzZSk7XG4rXHRcdFx0XHRpZiAodW5saWtlbHkocmMpKVxuIFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdHNrYl9yZXNlcnZlKHNrYiwgb2Zmc2V0KTtcbiBcdFx0XHR9XG5AQCAtMTUyNCw3ICszMDQzLDEwIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcbiBcdFx0XHRpZiAoKGxlbmd0aCBcdTAwM2UgbmV0ZGV2LVx1MDAzZW10dSArIEVUSF9ITEVOKSB8fFxuIFx0XHRcdCAgICBscmdfcGt0IHx8IGlwaF9jaGVjayA9PSAweGZmZmYpIHtcbiBcdFx0XHRcdGlibXZldGhfcnhfbXNzX2hlbHBlcihza2IsIG1zcywgbHJnX3BrdCk7XG4tXHRcdFx0XHRhZGFwdGVyLVx1MDAzZXJ4X2xhcmdlX3BhY2tldHMrKztcbitcdFx0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cylcbitcdFx0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLmxhcmdlX3BhY2tldHMrKztcbitcdFx0XHRcdGVsc2VcbitcdFx0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9sYXJnZV9wYWNrZXRzKys7XG4gXHRcdFx0fVxuIFxuIFx0XHRcdGlmIChjc3VtX2dvb2QpIHtcbkBAIC0xNTM0LDE2ICszMDU2LDIyIEBAIHN0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldClcbiBcbiBcdFx0XHRuYXBpX2dyb19yZWNlaXZlKG5hcGksIHNrYik7XHQvKiBzZW5kIGl0IHVwICovXG4gXG4tXHRcdFx0bmV0ZGV2LVx1MDAzZXN0YXRzLnJ4X3BhY2tldHMrKztcbi1cdFx0XHRuZXRkZXYtXHUwMDNlc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoO1xuK1x0XHRcdGlmIChhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0cykge1xuK1x0XHRcdFx0YWRhcHRlci1cdTAwM2VyeF9xc3RhdHNbcXVldWVfaW5kZXhdLnBhY2tldHMrKztcbitcdFx0XHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3F1ZXVlX2luZGV4XS5ieXRlcyArPSBsZW5ndGg7XG4rXHRcdFx0fVxuK1xuIFx0XHRcdGZyYW1lc19wcm9jZXNzZWQrKztcbiBcdFx0fVxuIFx0fVxuIFxuLVx0aWJtdmV0aF9yZXBsZW5pc2hfdGFzayhhZGFwdGVyKTtcbitcdGlibXZldGhfcmVwbGVuaXNoX3Rhc2soYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuIFxuLVx0aWYgKGZyYW1lc19wcm9jZXNzZWQgPT0gYnVkZ2V0KVxuK1x0aWYgKGZyYW1lc19wcm9jZXNzZWQgPT0gYnVkZ2V0KSB7XG4rXHRcdGlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpIHx8IG5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpKVxuK1x0XHRcdG5hcGlfY29tcGxldGVfZG9uZShuYXBpLCBmcmFtZXNfcHJvY2Vzc2VkKTtcbiBcdFx0Z290byBvdXQ7XG4rXHR9XG4gXG4gXHRpZiAoIW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCBmcmFtZXNfcHJvY2Vzc2VkKSlcbiBcdFx0Z290byBvdXQ7XG5AQCAtMTU1MSwxNSArMzA3OSwyMSBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4gXHQvKiBXZSB0aGluayB3ZSBhcmUgZG9uZSAtIHJlZW5hYmxlIGludGVycnVwdHMsXG4gXHQgKiB0aGVuIGNoZWNrIG9uY2UgbW9yZSB0byBtYWtlIHN1cmUgd2UgYXJlIGRvbmUuXG4gXHQgKi9cbi1cdGxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpO1xuLVx0aWYgKFdBUk5fT04obHBhcl9yYyAhPSBIX1NVQ0NFU1MpKSB7XG4rXHRscGFyX3JjID0gaWJtdmV0aF9lbmFibGVfaXJxKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KTtcbitcdGlmIChscGFyX3JjICE9IEhfU1VDQ0VTUykge1xuK1x0XHRuZXRkZXZfZXJyKG5ldGRldixcbitcdFx0XHQgICBcIkZhaWxlZCB0byBlbmFibGUgSVJRIGZvciBxdWV1ZSAlZCAocmM9MHglbHgpLCBzY2hlZHVsaW5nIHJlc2V0XFxuXCIsXG4rXHRcdFx0ICAgcXVldWVfaW5kZXgsIGxwYXJfcmMpO1xuIFx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNmFkYXB0ZXItXHUwMDNld29yayk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0aWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpIFx1MDAyNlx1MDAyNiBuYXBpX3NjaGVkdWxlKG5hcGkpKSB7XG4tXHRcdGxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci1cdTAwM2V2ZGV2LVx1MDAzZXVuaXRfYWRkcmVzcyxcbi1cdFx0XHRcdCAgICAgICBWSU9fSVJRX0RJU0FCTEUpO1xuK1x0aWYgKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIsIHF1ZXVlX2luZGV4KSBcdTAwMjZcdTAwMjZcbitcdCAgICBuZXRpZl9ydW5uaW5nKG5ldGRldikgXHUwMDI2XHUwMDI2XG4rXHQgICAgIW5hcGlfZGlzYWJsZV9wZW5kaW5nKG5hcGkpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG5hcGlfc2NoZWR1bGUobmFwaSkpIHtcbitcdFx0bHBhcl9yYyA9IGlibXZldGhfZGlzYWJsZV9pcnEoYWRhcHRlciwgcXVldWVfaW5kZXgpO1xuK1x0XHRXQVJOX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKTtcbiBcdFx0Z290byByZXN0YXJ0X3BvbGw7XG4gXHR9XG4gXG5AQCAtMTU2OSwxNSArMzEwMywyNCBAQCBzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpXG4gXG4gc3RhdGljIGlycXJldHVybl90IGlibXZldGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSlcbiB7XG4tXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2luc3RhbmNlO1xuK1x0c3RydWN0IG5hcGlfc3RydWN0ICpuYXBpID0gZGV2X2luc3RhbmNlO1xuK1x0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5hcGktXHUwMDNlZGV2O1xuIFx0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4gXHR1bnNpZ25lZCBsb25nIGxwYXJfcmM7XG4rXHRpbnQgcWluZGV4O1xuK1xuK1x0cWluZGV4ID0gbmFwaSAtIGFkYXB0ZXItXHUwMDNlbmFwaTtcbitcbitcdGlmIChXQVJOX09OKHFpbmRleCBcdTAwM2MgMCB8fCBxaW5kZXggXHUwMDNlPSBhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMpKVxuK1x0XHRyZXR1cm4gSVJRX05PTkU7XG4gXG4tXHRpZiAobmFwaV9zY2hlZHVsZV9wcmVwKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaSkpIHtcbi1cdFx0bHBhcl9yYyA9IGhfdmlvX3NpZ25hbChhZGFwdGVyLVx1MDAzZXZkZXYtXHUwMDNldW5pdF9hZGRyZXNzLFxuLVx0XHRcdFx0ICAgICAgIFZJT19JUlFfRElTQUJMRSk7XG4rXHRpZiAoYWRhcHRlci1cdTAwM2VyeF9xc3RhdHMpXG4rXHRcdGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW3FpbmRleF0uaW50ZXJydXB0cysrO1xuK1xuK1x0aWYgKG5hcGlfc2NoZWR1bGVfcHJlcChuYXBpKSkge1xuK1x0XHRscGFyX3JjID0gaWJtdmV0aF9kaXNhYmxlX2lycShhZGFwdGVyLCBxaW5kZXgpO1xuIFx0XHRXQVJOX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKTtcbi1cdFx0X19uYXBpX3NjaGVkdWxlKFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaSk7XG4rXHRcdF9fbmFwaV9zY2hlZHVsZShuYXBpKTtcbiBcdH1cbiBcdHJldHVybiBJUlFfSEFORExFRDtcbiB9XG5AQCAtMTY0NSw3ICszMTg4LDcgQEAgc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpXG4gXHRpbnQgbmVlZF9yZXN0YXJ0ID0gMDtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKylcbi1cdFx0aWYgKG5ld19tdHVfb2ggXHUwMDNjPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5idWZmX3NpemUpXG4rXHRcdGlmIChuZXdfbXR1X29oIFx1MDAzYz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYnVmZl9zaXplKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0aWYgKGkgPT0gSUJNVkVUSF9OVU1fQlVGRl9QT09MUylcbkBAIC0xNjYwLDkgKzMyMDMsOSBAQCBzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSlcbiBcbiBcdC8qIExvb2sgZm9yIGFuIGFjdGl2ZSBidWZmZXIgcG9vbCB0aGF0IGNhbiBob2xkIHRoZSBuZXcgTVRVICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcbi1cdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlID0gMTtcbitcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0uYWN0aXZlID0gMTtcbiBcbi1cdFx0aWYgKG5ld19tdHVfb2ggXHUwMDNjPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5idWZmX3NpemUpIHtcbitcdFx0aWYgKG5ld19tdHVfb2ggXHUwMDNjPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5idWZmX3NpemUpIHtcbiBcdFx0XHRXUklURV9PTkNFKGRldi1cdTAwM2VtdHUsIG5ld19tdHUpO1xuIFx0XHRcdHZpb19jbW9fc2V0X2Rldl9kZXNpcmVkKHZpb2RldixcbiBcdFx0XHRcdFx0XHRpYm12ZXRoX2dldF9kZXNpcmVkX2RtYVxuQEAgLTE2ODMsOCArMzIyNiwxNCBAQCBzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSlcbiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVJcbiBzdGF0aWMgdm9pZCBpYm12ZXRoX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIHtcbi1cdGlibXZldGhfcmVwbGVuaXNoX3Rhc2sobmV0ZGV2X3ByaXYoZGV2KSk7XG4tXHRpYm12ZXRoX2ludGVycnVwdChkZXYtXHUwMDNlaXJxLCBkZXYpO1xuK1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKVxuK1x0XHRpYm12ZXRoX3JlcGxlbmlzaF90YXNrKGFkYXB0ZXIsIGkpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzOyBpKyspXG4rXHRcdGlibXZldGhfaW50ZXJydXB0KGFkYXB0ZXItXHUwMDNlcXVldWVfaXJxW2ldLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbaV0pO1xuIH1cbiAjZW5kaWZcbiBcbkBAIC0xNzAyLDggKzMyNTEsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBpYm12ZXRoX2dldF9kZXNpcmVkX2RtYShzdHJ1Y3QgdmlvX2RldiAqdmRldilcbiBcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXI7XG4gXHRzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDtcbiBcdHVuc2lnbmVkIGxvbmcgcmV0O1xuLVx0aW50IGk7XG4tXHRpbnQgcnhxZW50cmllcyA9IDE7XG4rXHRpbnQgaSwgcTtcbiBcbiBcdHRibCA9IGdldF9pb21tdV90YWJsZV9iYXNlKFx1MDAyNnZkZXYtXHUwMDNlZGV2KTtcbiBcbkBAIC0xNzE4LDE4ICszMjY2LDIyIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlibXZldGhfZ2V0X2Rlc2lyZWRfZG1hKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KVxuIFx0LyogYWRkIHNpemUgb2YgbWFwcGVkIHR4IGJ1ZmZlcnMgKi9cbiBcdHJldCArPSBJT01NVV9QQUdFX0FMSUdOKElCTVZFVEhfTUFYX1RYX0JVRl9TSVpFLCB0YmwpO1xuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XG4tXHRcdC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHJlY2VpdmUgYnVmZmVycyAqL1xuLVx0XHRpZiAoYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYWN0aXZlKVxuLVx0XHRcdHJldCArPVxuLVx0XHRcdCAgICBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5zaXplICpcbi1cdFx0XHQgICAgSU9NTVVfUEFHRV9BTElHTihhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5cbi1cdFx0XHRcdFx0ICAgICBidWZmX3NpemUsIHRibCk7XG4tXHRcdHJ4cWVudHJpZXMgKz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uc2l6ZTtcbi1cdH1cbi1cdC8qIGFkZCB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBxdWV1ZSBlbnRyaWVzICovXG4tXHRyZXQgKz0gSU9NTVVfUEFHRV9BTElHTihcbi1cdFx0cnhxZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSwgdGJsKTtcbitcdGZvciAocSA9IDA7IHEgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgcSsrKSB7XG4rXHRcdGludCByeHFlbnRyaWVzID0gMTtcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XG4rXHRcdFx0LyogYWRkIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgcmVjZWl2ZSBidWZmZXJzICovXG4rXHRcdFx0aWYgKGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3FdW2ldLmFjdGl2ZSlcbitcdFx0XHRcdHJldCArPSBhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5zaXplICpcbitcdFx0XHRcdFx0SU9NTVVfUEFHRV9BTElHTihhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtxXVtpXS5idWZmX3NpemUsXG4rXHRcdFx0XHRcdFx0XHQgdGJsKTtcbitcdFx0XHRyeHFlbnRyaWVzICs9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW3FdW2ldLnNpemU7XG4rXHRcdH1cbitcbitcdFx0LyogYWRkIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIHF1ZXVlIGVudHJpZXMgKi9cbitcdFx0cmV0ICs9IElPTU1VX1BBR0VfQUxJR04ocnhxZW50cmllcyAqXG4rXHRcdFx0XHRcdHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSwgdGJsKTtcbitcdH1cbiBcbiBcdHJldHVybiByZXQ7XG4gfVxuQEAgLTE3NzcsNiArMzMyOSwzOSBAQCBzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgaWJtdmV0aF9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0cmV0dXJuIHZsYW5fZmVhdHVyZXNfY2hlY2soc2tiLCBmZWF0dXJlcyk7XG4gfVxuIFxuKy8qKlxuKyAqIGlibXZldGhfZ2V0X3N0YXRzNjQgLSBSZXR1cm4gYWdncmVnYXRlZCBwZXItcXVldWUgc3RhdGlzdGljc1xuKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlXG4rICogQHN0YXRzOiBydG5sIGxpbmsgc3RhdGlzdGljcyBzdG9yYWdlXG4rICpcbisgKiBTdW1zIHBlci1xdWV1ZSByeF9xc3RhdHMgYW5kIHR4X3FzdGF0cyBpbnRvIHRoZSBydG5sIGNvdW50ZXJzLlxuKyAqIENhbGxlcnMgdXNlIG5kb19nZXRfc3RhdHM2NCgpOyBhdm9pZCB1cGRhdGluZyBuZXRkZXYtXHUwMDNlc3RhdHMgb24gdGhlXG4rICogeG1pdC9wb2xsIHBhdGhzIHRvIGtlZXAgcGVyLXF1ZXVlIGNvdW50ZXJzIG9mZiB0aGUgaG90IGNhY2hlIGxpbmUuXG4rICovXG4rc3RhdGljIHZvaWQgaWJtdmV0aF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuK1x0XHRcdFx0c3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cylcbit7XG4rXHRzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdFx0c3RhdHMtXHUwMDNlcnhfcGFja2V0cyArPSBhZGFwdGVyLVx1MDAzZXJ4X3FzdGF0c1tpXS5wYWNrZXRzO1xuK1x0XHRcdHN0YXRzLVx1MDAzZXJ4X2J5dGVzICs9IGFkYXB0ZXItXHUwMDNlcnhfcXN0YXRzW2ldLmJ5dGVzO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAoYWRhcHRlci1cdTAwM2V0eF9xc3RhdHMpIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZGV2LVx1MDAzZXJlYWxfbnVtX3R4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdFx0c3RhdHMtXHUwMDNldHhfcGFja2V0cyArPSBhZGFwdGVyLVx1MDAzZXR4X3FzdGF0c1tpXS5wYWNrZXRzO1xuK1x0XHRcdHN0YXRzLVx1MDAzZXR4X2J5dGVzICs9IGFkYXB0ZXItXHUwMDNldHhfcXN0YXRzW2ldLmJ5dGVzO1xuK1x0XHRcdHN0YXRzLVx1MDAzZXR4X2Ryb3BwZWQgKz0gYWRhcHRlci1cdTAwM2V0eF9xc3RhdHNbaV0uZHJvcHBlZF9wYWNrZXRzO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRzdGF0cy1cdTAwM2V0eF9lcnJvcnMgPSBkZXYtXHUwMDNlc3RhdHMudHhfZXJyb3JzO1xuK31cbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlibXZldGhfbmV0ZGV2X29wcyA9IHtcbiBcdC5uZG9fb3Blblx0XHQ9IGlibXZldGhfb3BlbixcbiBcdC5uZG9fc3RvcFx0XHQ9IGlibXZldGhfY2xvc2UsXG5AQCAtMTc4OSwxMSArMzM3NCw1OCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlibXZldGhfbmV0ZGV2X29wcyA9IHtcbiBcdC5uZG9fdmFsaWRhdGVfYWRkclx0PSBldGhfdmFsaWRhdGVfYWRkcixcbiBcdC5uZG9fc2V0X21hY19hZGRyZXNzICAgID0gaWJtdmV0aF9zZXRfbWFjX2FkZHIsXG4gXHQubmRvX2ZlYXR1cmVzX2NoZWNrXHQ9IGlibXZldGhfZmVhdHVyZXNfY2hlY2ssXG4rXHQubmRvX2dldF9zdGF0czY0XHQ9IGlibXZldGhfZ2V0X3N0YXRzNjQsXG4gI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSXG4gXHQubmRvX3BvbGxfY29udHJvbGxlclx0PSBpYm12ZXRoX3BvbGxfY29udHJvbGxlcixcbiAjZW5kaWZcbiB9O1xuIFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlibXZldGhfYXR0cl9ncm91cDtcbitcbitzdGF0aWMgc3NpemVfdCBidWZmZXJfcG9vbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHQgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG4rXHRcdFx0XHQgY2hhciAqYnVmKVxuK3tcbitcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTtcbitcdHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpO1xuK1x0aW50IGxlbiA9IDA7XG4rXHRpbnQgaSwgajtcbitcbitcdGxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sXG4rXHRcdFx0IFwiUXVldWUgIFBvb2wgIFNpemUgIEJ1ZmZTaXplICBBY3RpdmUgIEF2YWlsYWJsZVxcblwiKTtcbitcdGxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sXG4rXHRcdFx0IFwiLS0tLS0gIC0tLS0gIC0tLS0gIC0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0tLVxcblwiKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlczsgaSsrKSB7XG4rXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGorKykge1xuK1x0XHRcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCA9XG4rXHRcdFx0XHRcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXVtqXTtcbitcbitcdFx0XHRsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLFxuK1x0XHRcdFx0XHQgXCIlNWQgICU0ZCAgJTR1ICAlOHUgICU2ZCAgJTlkXFxuXCIsXG4rXHRcdFx0XHRcdCBpLCBqLCBwb29sLVx1MDAzZXNpemUsIHBvb2wtXHUwMDNlYnVmZl9zaXplLFxuK1x0XHRcdFx0XHQgcG9vbC1cdTAwM2VhY3RpdmUsXG4rXHRcdFx0XHRcdCBhdG9taWNfcmVhZChcdTAwMjZwb29sLVx1MDAzZWF2YWlsYWJsZSkpO1xuK1xuK1x0XHRcdGlmIChsZW4gXHUwMDNlPSBQQUdFX1NJWkUgLSAxMDApXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fVxuK1xuK291dDpcbitcdHJldHVybiBsZW47XG4rfVxuK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidWZmZXJfcG9vbHMpO1xuK1xuK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppYm12ZXRoX2F0dHJzW10gPSB7XG4rXHRcdTAwMjZkZXZfYXR0cl9idWZmZXJfcG9vbHMuYXR0cixcbitcdE5VTEwsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpYm12ZXRoX2F0dHJfZ3JvdXAgPSB7XG4rXHQuYXR0cnMgPSBpYm12ZXRoX2F0dHJzLFxuK307XG4rXG4gc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiB7XG4gXHRpbnQgcmMsIGksIG1hY19sZW47XG5AQCAtMTgzMSw3ICszNDYzLDggQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHR9XG4gXG4tXHRuZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIpLCBJQk1WRVRIX01BWF9RVUVVRVMsIDEpO1xuK1x0bmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSxcbitcdFx0XHRcdCAgICBJQk1WRVRIX01BWF9RVUVVRVMsIElCTVZFVEhfTUFYX1JYX1FVRVVFUyk7XG4gXHRpZiAoIW5ldGRldilcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXG5AQCAtMTg0NCw3ICszNDc3LDggQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiBcdGFkYXB0ZXItXHUwMDNlbWNhc3RGaWx0ZXJTaXplID0gYmUzMl90b19jcHUoKm1jYXN0RmlsdGVyU2l6ZV9wKTtcbiBcdGlibXZldGhfaW5pdF9saW5rX3NldHRpbmdzKG5ldGRldik7XG4gXG4tXHRuZXRpZl9uYXBpX2FkZF93ZWlnaHQobmV0ZGV2LCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGksIGlibXZldGhfcG9sbCwgMTYpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9NQVhfUlhfUVVFVUVTOyBpKyspXG4rXHRcdG5ldGlmX25hcGlfYWRkX3dlaWdodChuZXRkZXYsIFx1MDAyNmFkYXB0ZXItXHUwMDNlbmFwaVtpXSwgaWJtdmV0aF9wb2xsLCAxNik7XG4gXG4gXHRuZXRkZXYtXHUwMDNlaXJxID0gZGV2LVx1MDAzZWlycTtcbiBcdG5ldGRldi1cdTAwM2VuZXRkZXZfb3BzID0gXHUwMDI2aWJtdmV0aF9uZXRkZXZfb3BzO1xuQEAgLTE4NzYsMTIgKzM1MTAsMjcgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiBcdFx0bmV0ZGV2LVx1MDAzZWZlYXR1cmVzIHw9IE5FVElGX0ZfRlJBR0xJU1Q7XG4gXHR9XG4gXG4rXHRpZiAocmV0ID09IEhfU1VDQ0VTUyBcdTAwMjZcdTAwMjZcbitcdCAgICAocmV0X2F0dHIgXHUwMDI2IElCTVZFVEhfSUxMQU5fUlhfTVVMVElfUVVFVUVfU1VQUE9SVCkpIHtcbitcdFx0YWRhcHRlci1cdTAwM2VtdWx0aV9xdWV1ZSA9IDE7XG4rXHRcdGFkYXB0ZXItXHUwMDNlbnVtX3J4X3F1ZXVlcyA9IG1pbihudW1fb25saW5lX2NwdXMoKSwgSUJNVkVUSF9ERUZBVUxUX1FVRVVFUyk7XG4rXHRcdG5ldGRldl9kYmcobmV0ZGV2LCBcIlJYIG11bHRpIHF1ZXVlIG1vZGUgZW5hYmxlZDogJWQgcXVldWVzXFxuXCIsXG4rXHRcdFx0ICAgYWRhcHRlci1cdTAwM2VudW1fcnhfcXVldWVzKTtcbitcdH0gZWxzZSB7XG4rXHRcdGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUgPSAwO1xuK1x0XHRhZGFwdGVyLVx1MDAzZW51bV9yeF9xdWV1ZXMgPSAxO1xuK1x0fVxuK1xuIFx0aWYgKHJldCA9PSBIX1NVQ0NFU1MgXHUwMDI2XHUwMDI2XG4gXHQgICAgKHJldF9hdHRyIFx1MDAyNiBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX0JVRkZfU1VQUE9SVCkpIHtcbi1cdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTDtcbitcdFx0aWYgKGFkYXB0ZXItXHUwMDNlbXVsdGlfcXVldWUpXG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1FVRVVFO1xuK1x0XHRlbHNlXG4rXHRcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IElCTVZFVEhfTUFYX1JYX1JFR1VMQVI7XG4rXG4gXHRcdG5ldGRldl9kYmcobmV0ZGV2LFxuIFx0XHRcdCAgIFwiUlggTXVsdGktYnVmZmVyIGhjYWxsIHN1cHBvcnRlZCBieSBGVywgYmF0Y2ggc2V0IHRvICV1XFxuXCIsXG4tXHRcdFx0ICAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwpO1xuK1x0XHRcdCAgIGFkYXB0ZXItXHUwMDNlcnhfYnVmZmVyc19wZXJfaGNhbGwpO1xuIFx0fSBlbHNlIHtcbiBcdFx0YWRhcHRlci1cdTAwM2VyeF9idWZmZXJzX3Blcl9oY2FsbCA9IDE7XG4gXHRcdG5ldGRldl9kYmcobmV0ZGV2LFxuQEAgLTE4OTgsMTAgKzM1NDcsMTAgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiBcdFx0bWVtY3B5KHBvb2xfY291bnQsIHBvb2xfY291bnRfY21vLCBzaXplb2YocG9vbF9jb3VudCkpO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKSB7XG4tXHRcdHN0cnVjdCBrb2JqZWN0ICprb2JqID0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0ua29iajtcbitcdFx0c3RydWN0IGtvYmplY3QgKmtvYmogPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXS5rb2JqO1xuIFx0XHRpbnQgZXJyb3I7XG4gXG4tXHRcdGlibXZldGhfaW5pdF9idWZmZXJfcG9vbChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXSwgaSxcbitcdFx0aWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLCBpLFxuIFx0XHRcdFx0XHQgcG9vbF9jb3VudFtpXSwgcG9vbF9zaXplW2ldLFxuIFx0XHRcdFx0XHQgcG9vbF9hY3RpdmVbaV0pO1xuIFx0XHRlcnJvciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKGtvYmosIFx1MDAyNmt0eXBlX3ZldGhfcG9vbCxcbkBAIC0xOTM3LDYgKzM1ODYsMTQgQEAgc3RhdGljIGludCBpYm12ZXRoX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZClcbiBcbiBcdG5ldGRldl9kYmcobmV0ZGV2LCBcInJlZ2lzdGVyZWRcXG5cIik7XG4gXG4rXHRyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cChcdTAwMjZkZXYtXHUwMDNlZGV2LmtvYmosIFx1MDAyNmlibXZldGhfYXR0cl9ncm91cCk7XG4rXHRpZiAocmMpIHtcbitcdFx0bmV0ZGV2X2VycihuZXRkZXYsIFwiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBhdHRyaWJ1dGVzIHJjPSVkXFxuXCIsIHJjKTtcbitcdFx0dW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTtcbitcdFx0ZnJlZV9uZXRkZXYobmV0ZGV2KTtcbitcdFx0cmV0dXJuIHJjO1xuK1x0fVxuK1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTE5NDgsOCArMzYwNSwxMCBAQCBzdGF0aWMgdm9pZCBpYm12ZXRoX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KVxuIFxuIFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuIFxuK1x0c3lzZnNfcmVtb3ZlX2dyb3VwKFx1MDAyNmRldi1cdTAwM2VkZXYua29iaiwgXHUwMDI2aWJtdmV0aF9hdHRyX2dyb3VwKTtcbitcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIElCTVZFVEhfTlVNX0JVRkZfUE9PTFM7IGkrKylcbi1cdFx0a29iamVjdF9wdXQoXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0ua29iaik7XG4rXHRcdGtvYmplY3RfcHV0KFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmtvYmopO1xuIFxuIFx0dW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTtcbiBcbkBAIC0yMDM1LDExICszNjk0LDExIEBAIHN0YXRpYyBzc2l6ZV90IHZldGhfcG9vbF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbiBcdFx0XHQvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBidWZmZXIgcG9vbCB3aXRoIGJ1ZmZlcnMgdGhhdFxuIFx0XHRcdCAgIGNhbiBob2xkIGEgcGFja2V0IG9mIHRoZSBzaXplIG9mIHRoZSBNVFUgKi9cbiBcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBJQk1WRVRIX05VTV9CVUZGX1BPT0xTOyBpKyspIHtcbi1cdFx0XHRcdGlmIChwb29sID09IFx1MDAyNmFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sW2ldKVxuK1x0XHRcdFx0aWYgKHBvb2wgPT0gXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1baV0pXG4gXHRcdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdFx0aWYgKCFhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFtpXS5hY3RpdmUpXG4rXHRcdFx0XHRpZiAoIWFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmFjdGl2ZSlcbiBcdFx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0XHRpZiAobXR1IFx1MDAzYz0gYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0uYnVmZl9zaXplKVxuK1x0XHRcdFx0aWYgKG10dSBcdTAwM2M9IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdW2ldLmJ1ZmZfc2l6ZSlcbiBcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuIFxuQEAgLTIwOTMsNyArMzc1Miw3IEBAIHN0YXRpYyBzc2l6ZV90IHZldGhfcG9vbF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbiBcdHJ0bmxfdW5sb2NrKCk7XG4gXG4gXHQvKiBraWNrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIHBvb2xzICovXG4tXHRpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtXHUwMDNlaXJxLCBuZXRkZXYpO1xuK1x0aWJtdmV0aF9pbnRlcnJ1cHQobmV0ZGV2LVx1MDAzZWlycSwgXHUwMDI2YWRhcHRlci1cdTAwM2VuYXBpWzBdKTtcbiBcdHJldHVybiBjb3VudDtcbiBcbiB1bmxvY2tfZXJyOlxuQEAgLTIxMzMsNyArMzc5Miw5IEBAIHN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX3ZldGhfcG9vbCA9IHtcbiBzdGF0aWMgaW50IGlibXZldGhfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldilcbiB7XG4gXHRzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7XG4tXHRpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtXHUwMDNlaXJxLCBuZXRkZXYpO1xuK1x0c3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7XG4rXG4rXHRpYm12ZXRoX2ludGVycnVwdChuZXRkZXYtXHUwMDNlaXJxLCBcdTAwMjZhZGFwdGVyLVx1MDAzZW5hcGlbMF0pO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTIyMTMsMjYgKzM4NzQsMzIgQEAgc3RhdGljIHZvaWQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbF90ZXN0KHN0cnVjdCBrdW5pdCAqdGVzdClcbiBcbiBcdC8qIFNldCBzYW5lIHZhbHVlcyBmb3IgYnVmZmVyIHBvb2xzICovXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxuLVx0XHRpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0sIGksXG4rXHRcdGlibXZldGhfaW5pdF9idWZmZXJfcG9vbChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXSwgaSxcbiBcdFx0XHRcdFx0IHBvb2xfY291bnRbaV0sIHBvb2xfc2l6ZVtpXSxcbiBcdFx0XHRcdFx0IHBvb2xfYWN0aXZlW2ldKTtcbiBcbi1cdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXTtcbitcdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXTtcbiBcdHBvb2wtXHUwMDNlc2tidWZmID0ga3VuaXRfa2NhbGxvYyh0ZXN0LCBwb29sLVx1MDAzZXNpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbiBcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgcG9vbC1cdTAwM2Vza2J1ZmYpO1xuIFxuIFx0Y29ycmVsYXRvciA9ICgodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDNjXHUwMDNjIDMyKSB8IDA7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xuLVx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xuK1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsXG4rXHRcdFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCBmYWxzZSkpO1xuK1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FSU5WQUwsXG4rXHRcdFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCB0cnVlKSk7XG4gXG4tXHRjb3JyZWxhdG9yID0gKCh1NjQpMCBcdTAwM2NcdTAwM2MgMzIpIHwgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF0uc2l6ZTtcbi1cdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLCBpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGNvcnJlbGF0b3IsIGZhbHNlKSk7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVJTlZBTCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCB0cnVlKSk7XG4rXHRjb3JyZWxhdG9yID0gKCh1NjQpMCBcdTAwM2NcdTAwM2MgMzIpIHwgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1bMF0uc2l6ZTtcbitcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxuK1x0XHRcdGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgZmFsc2UpKTtcbitcdEtVTklUX0VYUEVDVF9FUSh0ZXN0LCAtRUlOVkFMLFxuK1x0XHRcdGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgMCwgdHJ1ZSkpO1xuIFxuIFx0Y29ycmVsYXRvciA9ICh1NjQpMCB8IDA7XG4gXHRwb29sLVx1MDAzZXNrYnVmZlswXSA9IE5VTEw7XG4tXHRLVU5JVF9FWFBFQ1RfRVEodGVzdCwgLUVGQVVMVCwgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCBmYWxzZSkpO1xuLVx0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsIGlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgY29ycmVsYXRvciwgdHJ1ZSkpO1xuK1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsXG4rXHRcdFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCBmYWxzZSkpO1xuK1x0S1VOSVRfRVhQRUNUX0VRKHRlc3QsIC1FRkFVTFQsXG4rXHRcdFx0aWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBjb3JyZWxhdG9yLCAwLCB0cnVlKSk7XG4gXG4gXHRmbHVzaF93b3JrKFx1MDAyNmFkYXB0ZXItXHUwMDNld29yayk7XG4gfVxuQEAgLTIyNTgsMzEgKzM5MjUsMzMgQEAgc3RhdGljIHZvaWQgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcl90ZXN0KHN0cnVjdCBrdW5pdCAqdGVzdClcbiBcbiBcdElOSVRfV09SSyhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmssIGlibXZldGhfcmVzZXRfa3VuaXQpO1xuIFxuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9sZW4gPSAxO1xuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5pbmRleCA9IDA7XG4tXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIgPSBrdW5pdF9remFsbG9jKHRlc3QsIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSxcbi1cdFx0XHRcdFx0XHQgICAgIEdGUF9LRVJORUwpO1xuLVx0S1VOSVRfQVNTRVJUX05PVF9FUlJfT1JfTlVMTCh0ZXN0LCBhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlLnF1ZXVlX2FkZHIpO1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9sZW4gPSAxO1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5pbmRleCA9IDA7XG4rXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHIgPVxuK1x0XHRrdW5pdF9remFsbG9jKHRlc3QsIHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5KSxcbitcdFx0XHQgICAgICBHRlBfS0VSTkVMKTtcbitcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgYWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyKTtcbiBcbiBcdC8qIFNldCBzYW5lIHZhbHVlcyBmb3IgYnVmZmVyIHBvb2xzICovXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgSUJNVkVUSF9OVU1fQlVGRl9QT09MUzsgaSsrKVxuLVx0XHRpYm12ZXRoX2luaXRfYnVmZmVyX3Bvb2woXHUwMDI2YWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbaV0sIGksXG4rXHRcdGlibXZldGhfaW5pdF9idWZmZXJfcG9vbChcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVtpXSwgaSxcbiBcdFx0XHRcdFx0IHBvb2xfY291bnRbaV0sIHBvb2xfc2l6ZVtpXSxcbiBcdFx0XHRcdFx0IHBvb2xfYWN0aXZlW2ldKTtcbiBcbi1cdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXTtcbitcdHBvb2wgPSBcdTAwMjZhZGFwdGVyLVx1MDAzZXJ4X2J1ZmZfcG9vbFswXVswXTtcbiBcdHBvb2wtXHUwMDNlc2tidWZmID0ga3VuaXRfa2NhbGxvYyh0ZXN0LCBwb29sLVx1MDAzZXNpemUsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbiBcdEtVTklUX0FTU0VSVF9OT1RfRVJSX09SX05VTEwodGVzdCwgcG9vbC1cdTAwM2Vza2J1ZmYpO1xuIFxuLVx0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPSAodTY0KUlCTVZFVEhfTlVNX0JVRkZfUE9PTFMgXHUwMDNjXHUwMDNjIDMyIHwgMDtcbi1cdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XG4rXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpSUJNVkVUSF9OVU1fQlVGRl9QT09MUyBcdTAwM2NcdTAwM2MgMzIgfCAwO1xuK1x0S1VOSVRfRVhQRUNUX1BUUl9FUSh0ZXN0LCBOVUxMLCBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIsIDApKTtcbiBcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclswXS5jb3JyZWxhdG9yID0gKHU2NCkwIFx1MDAzY1x1MDAzYyAzMiB8IGFkYXB0ZXItXHUwMDNlcnhfYnVmZl9wb29sWzBdLnNpemU7XG4tXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIE5VTEwsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlcikpO1xuK1x0YWRhcHRlci1cdTAwM2VyeF9xdWV1ZVswXS5xdWV1ZV9hZGRyWzBdLmNvcnJlbGF0b3IgPVxuK1x0XHQodTY0KTAgXHUwMDNjXHUwMDNjIDMyIHwgYWRhcHRlci1cdTAwM2VyeF9idWZmX3Bvb2xbMF1bMF0uc2l6ZTtcbitcdEtVTklUX0VYUEVDVF9QVFJfRVEodGVzdCwgTlVMTCwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyLCAwKSk7XG4gXG4gXHRwb29sLVx1MDAzZXNrYnVmZlswXSA9IHNrYjtcbi1cdGFkYXB0ZXItXHUwMDNlcnhfcXVldWUucXVldWVfYWRkclswXS5jb3JyZWxhdG9yID0gKHU2NCkwIFx1MDAzY1x1MDAzYyAzMiB8IDA7XG4tXHRLVU5JVF9FWFBFQ1RfUFRSX0VRKHRlc3QsIHNrYiwgaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihhZGFwdGVyKSk7XG4rXHRhZGFwdGVyLVx1MDAzZXJ4X3F1ZXVlWzBdLnF1ZXVlX2FkZHJbMF0uY29ycmVsYXRvciA9ICh1NjQpMCBcdTAwM2NcdTAwM2MgMzIgfCAwO1xuK1x0S1VOSVRfRVhQRUNUX1BUUl9FUSh0ZXN0LCBza2IsIGlibXZldGhfcnhxX2dldF9idWZmZXIoYWRhcHRlciwgMCkpO1xuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZhZGFwdGVyLVx1MDAzZXdvcmspO1xuIH1cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguaFxuaW5kZXggZDg3NzEzNjY4ZWQzMDAuLjM5MGM2NjBhZjk3OWU3IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguaFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguaFxuQEAgLTE0LDYgKzE0LDggQEBcbiAjaWZuZGVmIF9JQk1WRVRIX0hcbiAjZGVmaW5lIF9JQk1WRVRIX0hcbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9ja190eXBlcy5oXHUwMDNlXG4rXG4gLyogY29uc3RhbnRzIGZvciBIX01VTFRJQ0FTVF9DVFJMICovXG4gI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25Nb2RpZnlCaXQgICAgIDB4ODAwMDBVTFxuICNkZWZpbmUgSWJtVmV0aE1jYXN0UmVjZXB0aW9uRW5hYmxlQml0ICAgICAweDIwMDAwVUxcbkBAIC0yOCw2ICszMCw3IEBAXG4gI2RlZmluZSBJYm1WZXRoTWNhc3RSZW1vdmVGaWx0ZXIgICAgIDB4MlVMXG4gI2RlZmluZSBJYm1WZXRoTWNhc3RDbGVhckZpbHRlclRhYmxlIDB4M1VMXG4gXG4rI2RlZmluZSBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX1FVRVVFX1NVUFBPUlRcdDB4MDAwMDAwMDAwMDA4MDAwMFVMXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX1JYX01VTFRJX0JVRkZfU1VQUE9SVFx0MHgwMDAwMDAwMDAwMDQwMDAwVUxcbiAjZGVmaW5lIElCTVZFVEhfSUxMQU5fTFJHX1NSX0VOQUJMRURcdDB4MDAwMDAwMDAwMDAxMDAwMFVMXG4gI2RlZmluZSBJQk1WRVRIX0lMTEFOX0xSR19TTkRfU1VQUE9SVFx0MHgwMDAwMDAwMDAwMDA4MDAwVUxcbkBAIC02Niw2ICs2OSwxNjQgQEAgc3RhdGljIGlubGluZSBsb25nIGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnModW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4gXHRcdFx0ICAgIGRlc2M1LCBkZXNjNiwgZGVzYzcsIGRlc2M4KTtcbiB9XG4gXG4rLyoqXG4rICogaF9yZWdfbG9naWNhbF9sYW5fcXVldWUgLSBSZWdpc3RlciBhIHN1Ym9yZGluYXRlIHJlY2VpdmUgcXVldWVcbisgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzXG4rICogQGJ1ZmZlcl9saXN0OiBETUEgYWRkcmVzcyBvZiA0S0IgcGFnZSBmb3IgdHJhY2tpbmcgcmVnaXN0ZXJlZCBidWZmZXJzXG4rICogQHJlY19xdWV1ZTogQnVmZmVyIGRlc2NyaXB0b3Igb2YgcmVjZWl2ZSBxdWV1ZVxuKyAqXG4rICogUmVnaXN0ZXJzIGEgc3Vib3JkaW5hdGUgcmVjZWl2ZSBxdWV1ZSB3aXRoIHRoZSBoeXBlcnZpc29yLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgSF9TVUNDRVNTICgwKSBvbiBzdWNjZXNzXG4rICogICBIX1BBUkFNRVRFUiBpZiBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkXG4rICpcbisgKiBPbiBzdWNjZXNzLCBoeXBlcnZpc29yIHJldHVybnM6XG4rICogICBSMzogSF9TVUNDRVNTXG4rICogICBSNDogUXVldWUgaGFuZGxlXG4rICogICBSNTogSVJRIG51bWJlciBmb3IgdGhpcyBxdWV1ZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSh1bnNpZ25lZCBsb25nIHVuaXRfYWRkcmVzcyxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBidWZmZXJfbGlzdCxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyByZWNfcXVldWUsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKnF1ZXVlX2hhbmRsZSxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqaXJxKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTtcbitcdGxvbmcgcmM7XG4rXG4rXHRyYyA9IHBscGFyX2hjYWxsOShIX1JFR19MT0dJQ0FMX0xBTl9RVUVVRSxcbitcdFx0XHQgIHJldGJ1ZiwgdW5pdF9hZGRyZXNzLFxuK1x0XHRcdCAgYnVmZmVyX2xpc3QsIHJlY19xdWV1ZSk7XG4rXG4rXHRpZiAocmMgPT0gSF9TVUNDRVNTKSB7XG4rXHRcdGlmIChxdWV1ZV9oYW5kbGUpXG4rXHRcdFx0KnF1ZXVlX2hhbmRsZSA9IHJldGJ1ZlswXTtcbitcdFx0aWYgKGlycSlcbitcdFx0XHQqaXJxID0gcmV0YnVmWzFdO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKipcbisgKiBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzX3F1ZXVlIC0gQWRkIGJ1ZmZlcnMgdG8gc3Vib3JkaW5hdGUgcXVldWVcbisgKiBAdW5pdF9hZGRyZXNzOiBEZXZpY2UgdW5pdCBhZGRyZXNzXG4rICogQHF1ZXVlX2hhbmRsZTogUXVldWUgaGFuZGxlIGZyb20gaF9yZWdfbG9naWNhbF9sYW5fcXVldWUoKVxuKyAqIEBidWZmZXJzem51bTogQnVmZmVyIHNpemUgKHVwcGVyIDMyIGJpdHMpIHwgY291bnQgKGxvd2VyIDMyIGJpdHMpXG4rICogQGlvYmExMjogQnVmZmVyIGFkZHJlc3NlcyAxIGFuZCAyIHBhY2tlZCAoYWRkcjEgfCBhZGRyMiBcdTAwM2NcdTAwM2MgMzIpXG4rICogQGlvYmEzNDogQnVmZmVyIGFkZHJlc3NlcyAzIGFuZCA0IHBhY2tlZFxuKyAqIEBpb2JhNTY6IEJ1ZmZlciBhZGRyZXNzZXMgNSBhbmQgNiBwYWNrZWRcbisgKiBAaW9iYTc4OiBCdWZmZXIgYWRkcmVzc2VzIDcgYW5kIDggcGFja2VkXG4rICogQGlvYmE5MTA6IEJ1ZmZlciBhZGRyZXNzZXMgOSBhbmQgMTAgcGFja2VkXG4rICogQGlvYmExMTEyOiBCdWZmZXIgYWRkcmVzc2VzIDExIGFuZCAxMiBwYWNrZWRcbisgKlxuKyAqIFJldHVybjpcbisgKiAgIEhfU1VDQ0VTUyAtIEFsbCBidWZmZXJzIGFkZGVkIHN1Y2Nlc3NmdWxseVxuKyAqICAgSF9QQVJBTUVURVIgLSBJbnZhbGlkIHBhcmFtZXRlcnNcbisgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXJzX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgcXVldWVfaGFuZGxlLFxuK1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyc3pudW0sXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhMTIsXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhMzQsXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhNTYsXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhNzgsXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpb2JhOTEwLFxuK1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgaW9iYTExMTIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuK1xuK1x0cmV0dXJuIHBscGFyX2hjYWxsOShIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFLFxuK1x0XHRcdCAgICByZXRidWYsIHVuaXRfYWRkcmVzcyxcbitcdFx0XHQgICAgcXVldWVfaGFuZGxlLCBidWZmZXJzem51bSxcbitcdFx0XHQgICAgaW9iYTEyLCBpb2JhMzQsIGlvYmE1NixcbitcdFx0XHQgICAgaW9iYTc4LCBpb2JhOTEwLCBpb2JhMTExMik7XG4rfVxuK1xuKy8qKlxuKyAqIGhfZnJlZV9sb2dpY2FsX2xhbl9idWZmZXJfcXVldWUgLSBGcmVlIGJ1ZmZlciBmcm9tIHN1Ym9yZGluYXRlIHF1ZXVlXG4rICogQHVuaXRfYWRkcmVzczogRGV2aWNlIHVuaXQgYWRkcmVzc1xuKyAqIEBidWZfc2l6ZTogU2l6ZSBvZiBidWZmZXIgdG8gcmVtb3ZlIGZyb20gcG9vbFxuKyAqIEBxdWV1ZV9oYW5kbGU6IFF1ZXVlIGhhbmRsZSBmcm9tIGhfcmVnX2xvZ2ljYWxfbGFuX3F1ZXVlKClcbisgKlxuKyAqIFJlbW92ZXMgYSBidWZmZXIgb2Ygc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgc3Vib3JkaW5hdGUgcXVldWUncyBidWZmZXIgcG9vbC5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIEhfU1VDQ0VTUyAtIEJ1ZmZlciByZW1vdmVkIHN1Y2Nlc3NmdWxseVxuKyAqICAgSF9QQVJBTUVURVIgLSBJbnZhbGlkIHBhcmFtZXRlcnNcbisgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxuKyAqICAgSF9OT1RfRk9VTkQgLSBCdWZmZXIgcG9vbCBkb2VzIG5vdCBleGlzdFxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBoX2ZyZWVfbG9naWNhbF9sYW5fYnVmZmVyX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUsXG4rXHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuK1xuK1x0cmV0dXJuIHBscGFyX2hjYWxsOShIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSX1FVRVVFLFxuK1x0XHRcdCAgICByZXRidWYsIHVuaXRfYWRkcmVzcywgYnVmX3NpemUsIHF1ZXVlX2hhbmRsZSk7XG4rfVxuK1xuKy8qKlxuKyAqIGhfZnJlZV9sb2dpY2FsX2xhbl9xdWV1ZSAtIERlcmVnaXN0ZXIgc3Vib3JkaW5hdGUgcmVjZWl2ZSBxdWV1ZVxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcbisgKiBAcXVldWVfaGFuZGxlOiBRdWV1ZSBoYW5kbGUgZnJvbSBoX3JlZ19sb2dpY2FsX2xhbl9xdWV1ZSgpXG4rICpcbisgKiBEZXJlZ2lzdGVycyBhbmQgZnJlZXMgYWxsIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJvcmRpbmF0ZSBxdWV1ZS5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIEhfU1VDQ0VTUyAtIFF1ZXVlIGZyZWVkIHN1Y2Nlc3NmdWxseVxuKyAqICAgSF9QQVJBTUVURVIgLSBJbnZhbGlkIHBhcmFtZXRlcnNcbisgKiAgIEhfSEFSRFdBUkUgLSBIYXJkd2FyZSBlcnJvclxuKyAqICAgSF9TVEFURSAtIFZJT0Egbm90IGluIHZhbGlkIHN0YXRlXG4rICogICBIX0JVU1kgLyBIX0xPTkdfQlVTWV8qIC0gUmVzb3VyY2UgYnVzeSwgcmV0cnlcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgaF9mcmVlX2xvZ2ljYWxfbGFuX3F1ZXVlKHVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzLFxuK1x0XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBxdWV1ZV9oYW5kbGUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuK1xuK1x0cmV0dXJuIHBscGFyX2hjYWxsOShIX0ZSRUVfTE9HSUNBTF9MQU5fUVVFVUUsXG4rXHRcdFx0ICAgIHJldGJ1ZiwgdW5pdF9hZGRyZXNzLCBxdWV1ZV9oYW5kbGUpO1xuK31cbitcbisvKipcbisgKiBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3dpdGhfaGFuZGxlIC0gUmVnaXN0ZXIgcHJpbWFyeSBxdWV1ZSBhbmQgZ2V0IGhhbmRsZVxuKyAqIEB1bml0X2FkZHJlc3M6IERldmljZSB1bml0IGFkZHJlc3NcbisgKiBAYnVmZmVyX2xpc3Q6IERNQSBhZGRyZXNzIG9mIGJ1ZmZlciBsaXN0XG4rICogQHJlY19xdWV1ZTogQnVmZmVyIGRlc2NyaXB0b3Igb2YgcmVjZWl2ZSBxdWV1ZVxuKyAqIEBmaWx0ZXJfbGlzdDogRE1BIGFkZHJlc3Mgb2YgZmlsdGVyIGxpc3RcbisgKiBAbWFjX2FkZHJlc3M6IE1BQyBhZGRyZXNzXG4rICogQHF1ZXVlX2hhbmRsZTogT3V0cHV0IHBhcmFtZXRlciBmb3IgcXVldWUgaGFuZGxlXG4rICpcbisgKiBSZWdpc3RlcnMgdGhlIHByaW1hcnkgcmVjZWl2ZSBxdWV1ZSAocXVldWUgMCkgd2l0aCB0aGUgaHlwZXJ2aXNvciBhbmRcbisgKiByZXR1cm5zIHRoZSBxdWV1ZSBoYW5kbGUuIFRoaXMgaXMgbmVlZGVkIGluIG11bHRpLXF1ZXVlIG1vZGUgdG8gdXNlXG4rICogaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc19xdWV1ZSgpIGZvciBhbGwgcXVldWVzIGluY2x1ZGluZyBxdWV1ZSAwLlxuKyAqXG4rICogUmV0dXJuOiBIX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fd2l0aF9oYW5kbGUodW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4rXHRcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBidWZmZXJfbGlzdCxcbitcdFx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHJlY19xdWV1ZSxcbitcdFx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGZpbHRlcl9saXN0LFxuK1x0XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbWFjX2FkZHJlc3MsXG4rXHRcdFx0XHRcdFx0ICAgICAgdTY0ICpxdWV1ZV9oYW5kbGUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdO1xuK1x0bG9uZyByYztcbitcbitcdHJjID0gcGxwYXJfaGNhbGw5KEhfUkVHSVNURVJfTE9HSUNBTF9MQU4sIHJldGJ1ZixcbitcdFx0XHQgIHVuaXRfYWRkcmVzcywgYnVmZmVyX2xpc3QsIHJlY19xdWV1ZSxcbitcdFx0XHQgIGZpbHRlcl9saXN0LCBtYWNfYWRkcmVzcyk7XG4rXG4rXHRpZiAocmMgPT0gSF9TVUNDRVNTIFx1MDAyNlx1MDAyNiBxdWV1ZV9oYW5kbGUpXG4rXHRcdCpxdWV1ZV9oYW5kbGUgPSByZXRidWZbMF07XG4rXG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuIC8qIEZXIGFsbG93cyB1cyB0byBzZW5kIDYgZGVzY3JpcHRvcnMgYnV0IHdlIG9ubHkgdXNlIG9uZSBzbyBtYXJrXG4gICogdGhlIG90aGVyIDUgYXMgdW51c2VkICgwKVxuICAqL1xuQEAgLTEyMSwxNSArMjgyLDU1IEBAIHN0YXRpYyBpbmxpbmUgbG9uZyBoX2lsbGFuX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3MsXG4gI2RlZmluZSBJQk1WRVRIX01BWF9UWF9CVUZfU0laRSAoMTAyNCAqIDY0KVxuICNkZWZpbmUgSUJNVkVUSF9NQVhfUVVFVUVTIDE2VVxuICNkZWZpbmUgSUJNVkVUSF9ERUZBVUxUX1FVRVVFUyA4VVxuLSNkZWZpbmUgSUJNVkVUSF9NQVhfUlhfUEVSX0hDQUxMIDhVXG4rI2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRVMgMTZVXG4rI2RlZmluZSBJQk1WRVRIX0RFRkFVTFRfUlhfUVVFVUVTIDFVXG4rI2RlZmluZSBJQk1WRVRIX01BWF9SWF9SRUdVTEFSIDhVXG4rI2RlZmluZSBJQk1WRVRIX01BWF9SWF9RVUVVRSAxMlVcbisjZGVmaW5lIElCTVZFVEhfTUFYX1JYX1BFUl9IQ0FMTCAxMlVcbiBcbiBzdGF0aWMgaW50IHBvb2xfc2l6ZVtdID0geyA1MTIsIDEwMjQgKiAyLCAxMDI0ICogMTYsIDEwMjQgKiAzMiwgMTAyNCAqIDY0IH07XG4gc3RhdGljIGludCBwb29sX2NvdW50W10gPSB7IDI1NiwgNTEyLCAyNTYsIDI1NiwgMjU2IH07XG4gc3RhdGljIGludCBwb29sX2NvdW50X2Ntb1tdID0geyAyNTYsIDUxMiwgMjU2LCAyNTYsIDY0IH07XG4tc3RhdGljIGludCBwb29sX2FjdGl2ZVtdID0geyAxLCAxLCAwLCAwLCAxfTtcbitzdGF0aWMgaW50IHBvb2xfYWN0aXZlW10gPSB7IDEsIDEsIDAsIDAsIDB9O1xuIFxuICNkZWZpbmUgSUJNX1ZFVEhfSU5WQUxJRF9NQVAgKCh1MTYpMHhmZmZmKVxuIFxuK3N0cnVjdCBpYm12ZXRoX2hjYWxsX3N0YXRzIHtcbitcdHU2NCByZWdfbGFuX3F1ZXVlO1x0LyogSF9SRUdfTE9HSUNBTF9MQU5fUVVFVUUgKi9cbitcdHU2NCByZWdfbGFuO1x0XHQvKiBIX1JFR0lTVEVSX0xPR0lDQUxfTEFOICovXG4rXHR1NjQgYWRkX2J1ZnNfcXVldWU7XHQvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVJTX1FVRVVFICovXG4rXHR1NjQgYWRkX2J1ZnM7XHRcdC8qIEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlMgKi9cbitcdHU2NCBhZGRfYnVmO1x0XHQvKiBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVIgKi9cbitcdHU2NCBmcmVlX2xhbl9xdWV1ZTtcdC8qIEhfRlJFRV9MT0dJQ0FMX0xBTl9RVUVVRSAqL1xuK1x0dTY0IGZyZWVfbGFuO1x0XHQvKiBIX0ZSRUVfTE9HSUNBTF9MQU4gKi9cbitcdHU2NCBzZW5kX2xhbjtcdFx0LyogSF9TRU5EX0xPR0lDQUxfTEFOICovXG4rfTtcbitcbitzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyB7XG4rXHR1NjQgcGFja2V0cztcbitcdHU2NCBieXRlcztcbitcdHU2NCBpbnRlcnJ1cHRzO1xuK1x0dTY0IHBvbGxzO1xuK1x0dTY0IGxhcmdlX3BhY2tldHM7XG4rXHR1NjQgaW52YWxpZF9idWZmZXJzO1xuK1x0dTY0IG5vX2J1ZmZlcl9kcm9wcztcbit9O1xuK1xuK3N0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzIHtcbitcdHU2NCBwYWNrZXRzO1xuK1x0dTY0IGJ5dGVzO1xuK1x0dTY0IGxhcmdlX3BhY2tldHM7XG4rXHR1NjQgZHJvcHBlZF9wYWNrZXRzO1xuK1x0dTY0IHNlbmRfZmFpbHVyZXM7XG4rXHR1NjQgY2hlY2tzdW1fb2ZmbG9hZDtcbit9O1xuK1xuKyNkZWZpbmUgSUJNVkVUSF9OVU1fUlhfUVNUQVRTIFxcXG4rXHQoc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3J4X3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1NjQpKVxuK1xuKyNkZWZpbmUgSUJNVkVUSF9OVU1fVFhfUVNUQVRTIFxcXG4rXHQoc2l6ZW9mKHN0cnVjdCBpYm12ZXRoX3R4X3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1NjQpKVxuK1xuIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCB7XG4gICAgIHUzMiBzaXplO1xuICAgICB1MzIgaW5kZXg7XG5AQCAtMTUyLDIzICszNTMsMjggQEAgc3RydWN0IGlibXZldGhfcnhfcSB7XG4gICAgIGRtYV9hZGRyX3QgcXVldWVfZG1hO1xuICAgICB1MzIgICAgICAgIHF1ZXVlX2xlbjtcbiAgICAgc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSAqcXVldWVfYWRkcjtcbitcdHNwaW5sb2NrX3RcdHJlcGxlbmlzaF9sb2NrO1x0Lyogc2VyaWFsaXplcyBwZXItcXVldWUgYnVmZmVyIHJlcGxlbmlzaCAqL1xuIH07XG4gXG4gc3RydWN0IGlibXZldGhfYWRhcHRlciB7XG4gXHRzdHJ1Y3QgdmlvX2RldiAqdmRldjtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7XG4tXHRzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTtcbitcdHN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpW0lCTVZFVEhfTUFYX1JYX1FVRVVFU107XG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbiBcdHVuc2lnbmVkIGludCBtY2FzdEZpbHRlclNpemU7XG4tXHR2b2lkICpidWZmZXJfbGlzdF9hZGRyO1xuK1x0dm9pZCAqYnVmZmVyX2xpc3RfYWRkcltJQk1WRVRIX01BWF9SWF9RVUVVRVNdO1xuIFx0dm9pZCAqZmlsdGVyX2xpc3RfYWRkcjtcbiBcdHZvaWQgKnR4X2x0Yl9wdHJbSUJNVkVUSF9NQVhfUVVFVUVTXTtcbiBcdHVuc2lnbmVkIGludCB0eF9sdGJfc2l6ZTtcbiBcdGRtYV9hZGRyX3QgdHhfbHRiX2RtYVtJQk1WRVRIX01BWF9RVUVVRVNdO1xuLVx0ZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWE7XG4rXHRkbWFfYWRkcl90IGJ1ZmZlcl9saXN0X2RtYVtJQk1WRVRIX01BWF9SWF9RVUVVRVNdO1xuIFx0ZG1hX2FkZHJfdCBmaWx0ZXJfbGlzdF9kbWE7XG4tXHRzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgcnhfYnVmZl9wb29sW0lCTVZFVEhfTlVNX0JVRkZfUE9PTFNdO1xuLVx0c3RydWN0IGlibXZldGhfcnhfcSByeF9xdWV1ZTtcbitcdHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCByeF9idWZmX3Bvb2xbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXVtJQk1WRVRIX05VTV9CVUZGX1BPT0xTXTtcbitcdHN0cnVjdCBpYm12ZXRoX3J4X3EgcnhfcXVldWVbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbitcdHU2NCBxdWV1ZV9oYW5kbGVbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbitcdHVuc2lnbmVkIGludCBxdWV1ZV9pcnFbSUJNVkVUSF9NQVhfUlhfUVVFVUVTXTtcbitcdGludCBtdWx0aV9xdWV1ZTtcbitcdHVuc2lnbmVkIGludCBudW1fcnhfcXVldWVzO1xuIFx0aW50IHJ4X2NzdW07XG4gXHRpbnQgbGFyZ2Vfc2VuZDtcbiBcdGJvb2wgaXNfYWN0aXZlX3RydW5rO1xuQEAgLTE4OCw2ICszOTQsMTIgQEAgc3RydWN0IGlibXZldGhfYWRhcHRlciB7XG4gXHR1NjQgdHhfc2VuZF9mYWlsZWQ7XG4gXHR1NjQgdHhfbGFyZ2VfcGFja2V0cztcbiBcdHU2NCByeF9sYXJnZV9wYWNrZXRzO1xuK1xuK1x0LyogTXVsdGktcXVldWUgc3RhdGlzdGljcyAqL1xuK1x0c3RydWN0IGlibXZldGhfaGNhbGxfc3RhdHMgaGNhbGxfc3RhdHM7XG4rXHRzdHJ1Y3QgaWJtdmV0aF9yeF9xdWV1ZV9zdGF0cyAqcnhfcXN0YXRzO1xuK1x0c3RydWN0IGlibXZldGhfdHhfcXVldWVfc3RhdHMgKnR4X3FzdGF0cztcbitcbiBcdC8qIEV0aHRvb2wgc2V0dGluZ3MgKi9cbiBcdHU4IGR1cGxleDtcbiBcdHUzMiBzcGVlZDtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTMwVDIzOjA1OjQ1Ljg1NzU0OTY0MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc3MjE5NTg2OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBpYm12ZXRoIE11bHRpLVF1ZXVlIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgdGhlIGBpYm12ZXRoYCBkcml2ZXIuIEl0J3MgbWFraW5nIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGNoYW5nZXMsIGFkZGluZyBtdWx0aS1xdWV1ZSBzdXBwb3J0LiBUaGUgbW9kaWZpY2F0aW9ucyBhcmUgaW4gYGlibXZldGguY2AgYW5kIGBpYm12ZXRoLmhgLCB3aGljaCBpcyB3aGF0IEknZCBleHBlY3QuIFRoZXkndmUgaW50cm9kdWNlZCBuZXcgaHlwZXJjYWxsczogYEhfUkVHX0xPR0lDQUxfTEFOX1FVRVVFYCwgYEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUlNfUVVFVUVgLCBldGMuIENsYXNzaWMgbXVsdGktcXVldWUgYXJjaGl0ZWN0dXJlIGNoYW5nZXMg4oCTIG5ldyBoeXBlcmNhbGxzLCBtb2RpZmljYXRpb25zIHRvIHRoZSBSWCBxdWV1ZSBsb2dpYywgYW5kIG11bHRpLXF1ZXVlIHN0YXRpc3RpY3MsIGFsbCBzb3VuZHMgYWJvdXQgcmlnaHQuIFRoZXkndmUgYWxzbyByZS13b3JrZWQgdGhlIGludGVycnVwdCBoYW5kbGluZywgdXNpbmcgYEhfVklPQ1RMYCBmb3IgdGhlIHN1Ym9yZGluYXRlIHF1ZXVlcy5cblxuVGhlIGJpZyBxdWVzdGlvbiBub3cgaXMsIGNhbiBJIGV2ZW4gZ2V0IHRvIHRoaXMgY29kZSBpbiBhIHRlc3RpbmcgZW52aXJvbm1lbnQ/IEkgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGl0J3MgcmVhY2hhYmxlLiBgaWJtdmV0aGAgaXMgc3BlY2lmaWNhbGx5IGZvciBJQk0gUG93ZXJWTSwgdGhlIHBTZXJpZXMgdmlydHVhbCBFdGhlcm5ldC4gUUVNVSB1c2VzIGBzcGFwci12bGFuYCwgd2hpY2ggaXMgY29uY2VwdHVhbGx5IHRoZSBzYW1lIGRldmljZSwgYnV0IGl0IG1ha2VzIG1lIHdvbmRlciBpZiBRRU1VIGZ1bGx5IHN1cHBvcnRzIHRoZXNlIGh5cGVyY2FsbHMgeWV0LiBJZiBpdCBkb2VzIG5vdCwgdGhlbiBob3cgY2FuIEkgdGVzdCBpdD8gSSdtIHN1cmUgaXQncyByZWFjaGFibGUgdGhvdWdoIGJlY2F1c2UgSSBjYW4gcnVuIGEgUG93ZXJQQyAocHBjNjRsZSkgVk0gd2l0aCBgc3BhcHItdmxhbmAuIEkgbmVlZCB0byB2ZXJpZnkgUUVNVSdzIHN1cHBvcnQuXG5cbkkgY2FuIGNoZWNrIGlmIEkgY2FuIGZ1enogaXQuIFN5emthbGxlciBzdXBwb3J0cyBgcHBjNjRsZWAgYW5kIFFFTVUgYHBzZXJpZXNgIGFzIGEgbWFjaGluZSB0eXBlLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRyaXZlciBpcyBhY3R1YWxseSBgaWJtdmV0aGAgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIEknbGwgcXVpY2tseSBjaGVjayBmb3IgYENPTkZJR19JQk1WRVRIYC4gSSdsbCBzZWFyY2ggZm9yIGl0LCBhbmQgdGhlbiBJIHNob3VsZCBiZSBnb29kIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTc3NSwiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTMwVDIzOjA1OjUzLjU3OTUxMjI1OFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTg4ODY1NjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBJQk1WRVRIXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvbmV0L2V0aGVybmV0L2libS9LY29uZmlnPTE4PWlmIE5FVF9WRU5ET1JfSUJNXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWctMTktXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWc6MjA6Y29uZmlnIElCTVZFVEhcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy0yMS1cXHR0cmlzdGF0ZSBcXFwiSUJNIExBTiBWaXJ0dWFsIEV0aGVybmV0IHN1cHBvcnRcXFwiXFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy0yOS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZzozMDpjb25maWcgSUJNVkVUSF9LVU5JVF9URVNUXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWctMzEtXFx0Ym9vbCBcXFwiS1VuaXQgdGVzdCBmb3IgSUJNIExBTiBWaXJ0dWFsIEV0aGVybmV0IHN1cHBvcnRcXFwiIGlmICFLVU5JVF9BTExfVEVTVFNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMzBUMjM6MDU6NTYuMTY4MzkyODc1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTMwNTE3NTM2OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBpYm12ZXRoIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCByZWxhdGVkIHRvIGBDT05GSUdfSUJNVkVUSGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBzZWUgd2hhdCdzIGJlaW5nIHRvdWNoZWQgaGVyZS4gQWgsIGl0IGFsc28gbW9kaWZpZXMgYGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaGAsIHdoaWNoIGlzIHdvcnRoIGtlZXBpbmcgYW4gZXllIG9uIOKAkyBwb3RlbnRpYWxseSByZWxhdGVkIHRvIGh5cGVydmlzb3IgaW50ZXJhY3Rpb25zLlxuXG5SaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBmdW5jdGlvbiBhZGRpdGlvbnMuIFRoZXJlJ3MgYSBmbHVycnkgb2YgbmV3IGZ1bmN0aW9ucyBoZXJlIOKAkyBhIG1peCBvZiBhbGxvY2F0aW9uL2ZyZWVpbmcgZm9yIGZpbHRlcnMsIHF1ZXVlIHN0YXRpc3RpY3MsIGJ1ZmZlciBwb29scywgaW50ZXJydXB0IGhhbmRsaW5nLCBhbmQgcXVldWUgbWFuYWdlbWVudDpcbmBpYm12ZXRoX2FsbG9jX2ZpbHRlcl9saXN0YCwgYGlibXZldGhfZnJlZV9maWx0ZXJfbGlzdGAsIGBpYm12ZXRoX2FsbG9jX3J4X3FzdGF0c2AsIGBpYm12ZXRoX2ZyZWVfcnhfcXN0YXRzYCwgYGlibXZldGhfYWxsb2NfdHhfcXN0YXRzYCwgYGlibXZldGhfZnJlZV90eF9xc3RhdHNgLCBgaWJtdmV0aF9hbGxvY19yeF9xdWV1ZXNgLCBgaWJtdmV0aF9jbGVhbnVwX3J4X3Jlc291cmNlc2AsIGBpYm12ZXRoX3RvZ2dsZV9pcnFgLCBgaWJtdmV0aF9kaXNhYmxlX2lycWAsIGBpYm12ZXRoX2VuYWJsZV9pcnFgLCBgaWJtdmV0aF9kaXNwb3NlX3N1Ym9yZGluYXRlX2lycV9tYXBwaW5nc2AsIGBpYm12ZXRoX3NldHVwX3J4X2ludGVycnVwdHNgLCBgaWJtdmV0aF9jbGVhbnVwX3J4X2ludGVycnVwdHNgLCBgaWJtdmV0aF9zZXR1cF9zaW5nbGVfcnhfaW50ZXJydXB0YCwgYGlibXZldGhfY2xlYW51cF9zaW5nbGVfcnhfaW50ZXJydXB0YCwgYGlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNgLCBgaWJtdmV0aF9hbGxvY19xdWV1ZV9idWZmZXJfcG9vbHNgLCBgaWJtdmV0aF9mcmVlX3F1ZXVlX2J1ZmZlcl9wb29sc2AsIGBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sc2AsIGBpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2xzYCwgYGlibXZldGhfYWxsb2Nfc2luZ2xlX3J4X3F1ZXVlYCwgYGlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWVgLCBgaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZWAsIGBpYm12ZXRoX2FsbG9jX3R4X3Jlc291cmNlc2AsIGBpYm12ZXRoX2ZyZWVfdHhfcmVzb3VyY2VzYCwgYGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWVgLCBgaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVgLCBgaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWxgLCBgaWJtdmV0aF9mcmVlX2FsbF9xdWV1ZXNgLCBgaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXNgLCBgaWJtdmV0aF9hZ2dyZWdhdGVfcnhfcXN0YXRzYCwgYGlibXZldGhfYWdncmVnYXRlX3R4X3FzdGF0c2AsIGBpYm12ZXRoX2dldF9zdGF0czY0YC5cblxuQW5kLCBpdCdzIG1vZGlmeWluZyBhIGJ1bmNoIG9mIGV4aXN0aW5nIGNvcmUgZnVuY3Rpb25zOiBgaWJtdmV0aF9vcGVuYCwgYGlibXZldGhfY2xvc2VgLCBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgLCBgaWJtdmV0aF9zdGFydF94bWl0YCwgYGlibXZldGhfcG9sbGAsIGBpYm12ZXRoX2ludGVycnVwdGAsIGBpYm12ZXRoX2NoYW5nZV9tdHVgLCBgaWJtdmV0aF9wcm9iZWAsIGBpYm12ZXRoX3JlbW92ZWAuIFNpbmNlIHRoaXMgaXMgYSBuZXR3b3JrIGRyaXZlciwgdGhlIGZ1bmN0aW9uYWwgY2hhbmdlcyBhcmUgY2xlYXIgYW5kIGVhc3kgdG8gdGVzdCDigJMgcGFja2V0IHNlbmRpbmcsIE1UVSBjaGFuZ2VzLCBjaGFubmVsIG1hbmlwdWxhdGlvbnMgdmlhIGBldGh0b29sYCwgYWxsIHRoYXQgamF6ei4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGEgZ29vZCBmdXp6aW5nIGNhbXBhaWduLlxuXG5TbywgbGV0J3MgaWRlbnRpZnkgc29tZSBoaWdoLXZhbHVlIHRhcmdldHMgZm9yIGZ1enppbmcuIEdpdmVuIHRoZSBhZGRpdGlvbnMgYW5kIG1vZGlmaWNhdGlvbnMsIEknZCBzYXkgdGhlIHJlYWwgaW50ZXJlc3RpbmcgZnVuY3Rpb25zIHRvIGZvY3VzIG9uIGFyZSBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgLCBgaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsYCwgYGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWVgLCBgaWJtdmV0aF9yZWdpc3Rlcl9zaW5nbGVfcnhfcXVldWVgLCBgaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZWAsIGBpYm12ZXRoX2ZyZWVfc2luZ2xlX3J4X3F1ZXVlYCwgYGlibXZldGhfZHJhaW5fcnhfcXVldWVgLCBgaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc2AsIGBpYm12ZXRoX3RvZ2dsZV9pcnFgLCBgaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXNgLCBgaWJtdmV0aF9vcGVuYCwgYW5kIGBpYm12ZXRoX2Nsb3NlYC5cblxuTm93LCBsZXQncyBzZWUgaWYgd2UgY2FuIHRyaWdnZXIgYGlibXZldGhfc2V0X2NoYW5uZWxzYC4gR29vZCwgY2hlY2tpbmcgdGhlIGBldGh0b29sX29wc2Agc3RydWN0dXJlLCBhbmQgeWVwLCBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgIGlzIGFzc2lnbmVkIHRvIGBzZXRfY2hhbm5lbHNgLiBUaGlzIGlzIHBlcmZlY3Qg4oCTIGEgZGlyZWN0IGFuZCByZWxhdGl2ZWx5IGVhc3kgdGFyZ2V0IGZvciBmdXp6aW5nLiBXZSBjYW4gdXNlIGV0aHRvb2wgdG8gbWFuaXB1bGF0ZSB0aGlzIGFuZCBsb29rIGZvciBhbnkgaW50ZXJlc3RpbmcgYmVoYXZpb3Igb3IgY3Jhc2hlcy5cblxuQW5kIGp1c3QgdG8gY29uZmlybSwgaXQgYXBwZWFycyBgSUJNVkVUSGAgZGVwZW5kcyBvbiBgTkVUX1ZFTkRPUl9JQk1gIGFuZCBgUFBDX1BTRVJJRVNgLiBHb3QgaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2NzI2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTU2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTMwVDIzOjA2OjA5LjIyMDE0OTYwOFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTMxNzExMTE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBORVRfVkVORE9SX0lCTVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vS2NvbmZpZy01LVxcbmRyaXZlcnMvbmV0L2V0aGVybmV0L2libS9LY29uZmlnOjY6Y29uZmlnIE5FVF9WRU5ET1JfSUJNXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL0tjb25maWctNy1cXHRib29sIFxcXCJJQk0gZGV2aWNlc1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMzBUMjM6MDY6MTEuMzUxODY4MDA2WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTkyNDcyMjc4NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBTdHJhdGVneSBmb3IgSUJNVkVUSCBEcml2ZXIqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gcmV2aWV3aW5nIHRoZSBgSUJNVkVUSGAgY29uZmlndXJhdGlvbi4gVGhhdCBsb29rcyBzdWZmaWNpZW50IHRvIGVuYWJsZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eSwgc28gd2UnbGwgc3RhcnQgdGhlcmUuIE5vdywgbGV0J3MgcmVmaW5lIHRoZSBsaXN0IG9mIGZvY3VzIHN5bWJvbHMgZm9yIGZ1enppbmcuIEkndmUgY29tcGlsZWQgYSBsaXN0IG9mIHBvdGVudGlhbCBjYW5kaWRhdGVzLCBzdGFydGluZyB3aXRoOlxuXG4qICAgYGlibXZldGhfc2V0X2NoYW5uZWxzYFxuKiAgIGBpYm12ZXRoX3Jlc2l6ZV9yeF9xdWV1ZXNfaW5jcmVtZW50YWxgXG4qICAgYGlibXZldGhfcmVnaXN0ZXJfbG9naWNhbF9sYW5fcXVldWVgXG4qICAgYGlibXZldGhfcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlYFxuKiAgIGBpYm12ZXRoX2RlcmVnaXN0ZXJfc2luZ2xlX3J4X3F1ZXVlYFxuKiAgIGBpYm12ZXRoX2FsbG9jX3NpbmdsZV9yeF9xdWV1ZWBcbiogICBgaWJtdmV0aF9mcmVlX3NpbmdsZV9yeF9xdWV1ZWBcbiogICBgaWJtdmV0aF9kcmFpbl9yeF9xdWV1ZWBcbiogICBgaWJtdmV0aF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyc2BcbiogICBgaWJtdmV0aF90b2dnbGVfaXJxYFxuKiAgIGBpYm12ZXRoX3JlZ2lzdGVyX3J4X3F1ZXVlc2BcblxuTGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlc2UgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb25zLCB3aGljaCB1c3VhbGx5IG1lYW5zIHRoZXkgYXJlIG5vdCBkaXJlY3RseSBleHBvc2VkIGFuZCBuZWVkIHRvIGJlIHJlYWNoZWQgaW5kaXJlY3RseSwgYSBnb29kIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4gVGhleSBhbGwgc2VlbSB0byBiZS4gSSd2ZSBhbHNvIHZlcmlmaWVkIHRoYXQgdGhlc2UgYXJlIGluZGVlZCB0aGUgY29ycmVjdCBmdW5jdGlvbiBuYW1lcy5cblxuSSdtIGFsc28gZ29pbmcgdG8gYWRkIGBpYm12ZXRoX29wZW5gIGFuZCBgaWJtdmV0aF9jbG9zZWAsIGV2ZW4gdGhvdWdoIHRoZXNlIGFyZSBzdGFuZGFyZCBuZXR3b3JrIGRldmljZSBvcGVyYXRpb25zLCB0aGV5IGFyZSBtb2RpZmllZCBoZXJlIGZvciBtdWx0aS1xdWV1ZSBzdXBwb3J0LiBUaGV5IGFyZSBrZXkgZW50cnkgcG9pbnRzIGFuZCBnb29kIGNhbmRpZGF0ZXMgZm9yIGZ1enppbmcgYXMgd2VsbC5cblxuU3BlY2lmaWNhbGx5LCBgaWJtdmV0aF9zZXRfY2hhbm5lbHNgIHN0YW5kcyBvdXQgYmVjYXVzZSBpdCdzIHRoZSBlbnRyeSBwb2ludCBmb3IgcXVldWUgcmVzaXppbmcsIHdoaWNoIGlzIGZ1bmRhbWVudGFsIHRvIHRoZSBuZXcgZHluYW1pYyBxdWV1ZSBtYW5hZ2VtZW50IGZlYXR1cmUsIHNvIGl0IHdpbGwgZ2V0IHNwZWNpYWwgZm9jdXMuXG5cblRoZXJlZm9yZSwgZm9yIHRoaXMgZnV6emluZyBjYW1wYWlnbiwgSSdsbCBzZXQgYFdvcnRoRnV6emluZ2AgdG8gYHRydWVgLCBgRW5hYmxlQ29uZmlnc2AgdG8gYFtcIklCTVZFVEhcIl1gLCBhbmQgdGhlIGBGb2N1c1N5bWJvbHNgIHRvIHRoZSBsaXN0IGFib3ZlLlxuXG5UaGUgcmF0aW9uYWxlIGlzIGNsZWFyLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSBgaWJtdmV0aGAgZHJpdmVyIHRvIHN1cHBvcnQgbXVsdGktcXVldWUsIGluY2x1ZGluZyBuZXcgaHlwZXJjYWxscyBhbmQgbW9kaWZpY2F0aW9ucyB0byBxdWV1ZSBtYW5hZ2VtZW50LCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGFuZCBldGh0b29sIG9wZXJhdGlvbnMuIEFsbCBvZiB0aGVzZSBmdW5jdGlvbmFsaXRpZXMgYXJlIHJlYWNoYWJsZSB0aHJvdWdoIG5ldHdvcmsgb3BlcmF0aW9ucyBhbmQgZXRodG9vbCBjb21tYW5kcywgbWFraW5nIHRoZW0gaWRlYWwgY2FuZGlkYXRlcyBmb3IgZnV6emluZywgYW5kIEkgaW50ZW5kIHRvIHByb3ZpZGUgYSBmdXp6aW5nIGNvbmZpZ3VyYXRpb24gdG8gdGVzdCB0aGVzZSBuZXcgaW1wbGVtZW50YXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODc1NCwiT3V0cHV0VG9rZW5zIjoyNTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODU2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTMwVDIzOjA2OjMwLjU5OTA5ODk4MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODExNjczMjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklCTVZFVEhcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpYm12ZXRoX3NldF9jaGFubmVsc1wiLFxuICAgIFwiaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsXCIsXG4gICAgXCJpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfZHJhaW5fcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNcIixcbiAgICBcImlibXZldGhfdG9nZ2xlX2lycVwiLFxuICAgIFwiaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXNcIixcbiAgICBcImlibXZldGhfb3BlblwiLFxuICAgIFwiaWJtdmV0aF9jbG9zZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgbXVsdGktcXVldWUgc3VwcG9ydCB0byB0aGUgaWJtdmV0aCBkcml2ZXIsIGludHJvZHVjaW5nIG5ldyBoeXBlcmNhbGxzIGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHF1ZXVlIG1hbmFnZW1lbnQsIGludGVycnVwdCBoYW5kbGluZywgYW5kIGV0aHRvb2wgb3BlcmF0aW9ucy4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0aGF0IGNhbiBiZSByZWFjaGVkIHZpYSBuZXR3b3JrIG9wZXJhdGlvbnMgYW5kIGV0aHRvb2wgY29tbWFuZHMsIG1ha2luZyB0aGVtIHN1aXRhYmxlIGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklCTVZFVEhcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpYm12ZXRoX3NldF9jaGFubmVsc1wiLFxuICAgIFwiaWJtdmV0aF9yZXNpemVfcnhfcXVldWVzX2luY3JlbWVudGFsXCIsXG4gICAgXCJpYm12ZXRoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuX3F1ZXVlXCIsXG4gICAgXCJpYm12ZXRoX3JlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9kZXJlZ2lzdGVyX3NpbmdsZV9yeF9xdWV1ZVwiLFxuICAgIFwiaWJtdmV0aF9hbGxvY19zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfZnJlZV9zaW5nbGVfcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfZHJhaW5fcnhfcXVldWVcIixcbiAgICBcImlibXZldGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcnNcIixcbiAgICBcImlibXZldGhfdG9nZ2xlX2lycVwiLFxuICAgIFwiaWJtdmV0aF9yZWdpc3Rlcl9yeF9xdWV1ZXNcIixcbiAgICBcImlibXZldGhfb3BlblwiLFxuICAgIFwiaWJtdmV0aF9jbG9zZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgbXVsdGktcXVldWUgc3VwcG9ydCB0byB0aGUgaWJtdmV0aCBkcml2ZXIsIGludHJvZHVjaW5nIG5ldyBoeXBlcmNhbGxzIGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHF1ZXVlIG1hbmFnZW1lbnQsIGludGVycnVwdCBoYW5kbGluZywgYW5kIGV0aHRvb2wgb3BlcmF0aW9ucy4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0aGF0IGNhbiBiZSByZWFjaGVkIHZpYSBuZXR3b3JrIG9wZXJhdGlvbnMgYW5kIGV0aHRvb2wgY29tbWFuZHMsIG1ha2luZyB0aGVtIHN1aXRhYmxlIGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:nil,}