Name: series-workflowb7xrs Phase: Failed StartedAt: 2026-09-09 20:55:19 +0000 UTC FinishedAt: 2026-09-09 20:57:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7xrs[0] Phase: Succeeded StartedAt: 2026-09-09 20:55:19 +0000 UTC FinishedAt: 2026-09-09 20:57:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7xrs[0].run-triage Phase: Succeeded StartedAt: 2026-09-09 20:55:19 +0000 UTC FinishedAt: 2026-09-09 20:57:43 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMjA6NTc6MjUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuaW5kZXggYmQzYjhkMmZhNDdlMC4uOGFlYmRjNmZlYjE3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuQEAgLTE4LDEwICYjNDM7MTgsNiBAQCBlbHNlXG4gJCh3YXJuaW5nIGV4Y2x1ZGluZyBpb3VyaW5nIHRlc3RzLCBsaWJ1cmluZyBub3QgaW5zdGFsbGVkIG9yIHRvbyBvbGQpXG4gZW5kaWZcbiBcbi1URVNUX0dFTl9GSUxFUyA6PSBcXFxuLVx0JChDT05EX0dFTl9GSUxFUykgXFxcbi0jIGVuZCBvZiBURVNUX0dFTl9GSUxFU1xuLVxuIFRFU1RfUFJPR1MgPSBcXFxuIFx0Y3N1bS5weSBcXFxuIFx0ZGV2bGlua19yYXRlX2Nyb3NzX2Vzdy5weSBcXFxuQEAgLTgwLDYgJiM0Mzs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXFxcbiBZTkxfR0VOX0ZJTEVTIDo9IFxcXG4gXHRuY2Rldm1lbSBcXFxuIFx0dG9lcGxpdHogXFxcbiYjNDM7XHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuICMgZW5kIG9mIFlOTF9HRU5fRklMRVNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gJChZTkxfR0VOX0ZJTEVTKVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSAkKHBhdHN1YnN0ICUuYywlLm8sJCh3aWxkY2FyZCAqLmJwZi5jKSlcbkBAIC05Nyw1ICYjNDM7OTQsNSBAQCBpbmNsdWRlIC4uLy4uLy4uL25ldC95bmwubWtcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcbiBcbiBpZmVxICgkKEhBU19JT1VSSU5HX1pDUlgpLHkpXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmdcbiYjNDM7JChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmcgLWxwdGhyZWFkXG4gZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xuaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbkBAIC00LDYgJiM0Mzs0LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NlcnJvci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGludC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuQEAgLTM3LDYgJiM0MzszOCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY2xpYnVyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjeW5sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bmV0ZGV2LXVzZXIuaFwmIzM0O1xuIFxuICNkZWZpbmUgU0tJUF9DT0RFXHQ0MlxuIFxuQEAgLTg1LDE2ICYjNDM7ODgsMjkgQEAgc3RhdGljIGludCBjZmdfc2VuZF9zaXplID0gU0VORF9TSVpFO1xuIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW42IGNmZ19hZGRyO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2ZnX3J4X2J1Zl9sZW47XG4gc3RhdGljIGJvb2wgY2ZnX2RyeV9ydW47XG4mIzQzO3N0YXRpYyBpbnQgY2ZnX251bV90aHJlYWRzID0gMTtcbiBcbiBzdGF0aWMgY2hhciAqcGF5bG9hZDtcbi1zdGF0aWMgdm9pZCAqYXJlYV9wdHI7XG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xuLXN0YXRpYyBzaXplX3QgcmluZ19zaXplO1xuLXN0YXRpYyBzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycSBycV9yaW5nO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XG4tc3RhdGljIGludCBjb25uZmQ7XG4tc3RhdGljIGJvb2wgc3RvcDtcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xuJiM0MztcbiYjNDM7I2RlZmluZSBNQVhfQ09OTlNfUEVSX1RIUkVBRFx0NjRcbiYjNDM7XG4mIzQzO3N0cnVjdCB0aHJlYWRfY3R4IHtcbiYjNDM7XHRzdHJ1Y3QgaW9fdXJpbmdcdFx0cmluZztcbiYjNDM7XHR2b2lkXHRcdFx0KmFyZWFfcHRyO1xuJiM0MztcdHZvaWRcdFx0XHQqcmluZ19wdHI7XG4mIzQzO1x0c2l6ZV90XHRcdFx0cmluZ19zaXplO1xuJiM0MztcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxXHRycV9yaW5nO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0YXJlYV90b2tlbjtcbiYjNDM7XHRpbnRcdFx0XHRxdWV1ZV9pZDtcbiYjNDM7XHRpbnRcdFx0XHRuYXBpX2lkO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl90XHQqc2V0dXBfZG9uZTtcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfdFx0KmRpc3BhdGNoX2RvbmU7XG4mIzQzO1xuJiM0MztcdGludFx0XHRcdGNvbm5mZHNbTUFYX0NPTk5TX1BFUl9USFJFQURdO1xuJiM0MztcdHNpemVfdFx0XHRcdHJlY2VpdmVkW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbiYjNDM7XHRpbnRcdFx0XHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbiYjNDM7XHRpbnRcdFx0XHRucl9jb25ucztcbiYjNDM7fTtcbiBcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2ZkYXlfbXModm9pZClcbiB7XG5AQCAtMTMyLDE2ICYjNDM7MTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKVxuIHtcbiBcdHNpemVfdCBzaXplO1xuIFxuLVx0cmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpO1xuJiM0MztcdHNpemUgPSBycV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSk7XG4gXHQvKiBhZGQgc3BhY2UgZm9yIHRoZSBoZWFkZXIgKGhlYWQvdGFpbC9ldGMuKSAqL1xuLVx0cmluZ19zaXplICYjNDM7PSBwYWdlX3NpemU7XG4tXHRyZXR1cm4gQUxJR05fVVAocmluZ19zaXplLCBwYWdlX3NpemUpO1xuJiM0MztcdHNpemUgJiM0Mzs9IHBhZ2Vfc2l6ZTtcbiYjNDM7XHRyZXR1cm4gQUxJR05fVVAoc2l6ZSwgcGFnZV9zaXplKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpXG4mIzQzO3N0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IHRocmVhZF9jdHggKmN0eClcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSBBUkVBX1NJWkUgLyBwYWdlX3NpemU7XG4gXHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcbi1cdHVuc2lnbmVkIGludCBycV9lbnRyaWVzID0gNDA5NjtcbiBcdGludCByZXQ7XG4gXG4gXHRpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoY2ZnX2lmbmFtZSk7XG5AQCAtMTQ5LDU4ICYjNDM7MTY1LDU4IEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCYjMzQ7LCBjZmdfaWZuYW1lKTtcbiBcbiBcdGlmIChjZmdfcnhfYnVmX2xlbiBcdTAwMjZcdTAwMjYgY2ZnX3J4X2J1Zl9sZW4gIT0gcGFnZV9zaXplKSB7XG4tXHRcdGFyZWFfcHRyID0gbW1hcChOVUxMLFxuLVx0XHRcdFx0QVJFQV9TSVpFLFxuLVx0XHRcdFx0UFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbi1cdFx0XHRcdE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8XG4tXHRcdFx0XHRNQVBfSFVHRVRMQiB8IE1BUF9IVUdFXzJNQixcbi1cdFx0XHRcdC0xLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7XG4mIzQzO1x0XHRjdHgtXHUwMDNlYXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4mIzQzO1x0XHRcdFx0ICAgICBBUkVBX1NJWkUsXG4mIzQzO1x0XHRcdFx0ICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcbiYjNDM7XHRcdFx0XHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuJiM0MztcdFx0XHRcdCAgICAgLTEsXG4mIzQzO1x0XHRcdFx0ICAgICAwKTtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRCkge1xuIFx0XHRcdHByaW50ZihcJiMzNDtDYW4mIzM5O3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xcblwmIzM0Oyk7XG4gXHRcdFx0ZXhpdChTS0lQX0NPREUpO1xuIFx0XHR9XG4gXHR9IGVsc2Uge1xuLVx0XHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcbi1cdFx0XHRcdEFSRUFfU0laRSxcbi1cdFx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0XHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXG4tXHRcdFx0XHQwLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Y3R4LVx1MDAzZWFyZWFfcHRyID0gbW1hcChOVUxMLFxuJiM0MztcdFx0XHRcdCAgICAgQVJFQV9TSVpFLFxuJiM0MztcdFx0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbiYjNDM7XHRcdFx0XHQgICAgIDAsXG4mIzQzO1x0XHRcdFx0ICAgICAwKTtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcbiBcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDttbWFwKCk6IHplcm8gY29weSBhcmVhXCYjMzQ7KTtcbiBcdH1cbiBcbi1cdHJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuLVx0cmluZ19wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0cmluZ19zaXplLFxuLVx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuLVx0XHRcdDAsXG4tXHRcdFx0MCk7XG4mIzQzO1x0Y3R4LVx1MDAzZXJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuJiM0MztcdGN0eC1cdTAwM2VyaW5nX3B0ciA9IG1tYXAoTlVMTCxcbiYjNDM7XHRcdFx0ICAgICBjdHgtXHUwMDNlcmluZ19zaXplLFxuJiM0MztcdFx0XHQgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuJiM0MztcdFx0XHQgICAgIDAsXG4mIzQzO1x0XHRcdCAgICAgMCk7XG4gXG4gXHRzdHJ1Y3QgaW9fdXJpbmdfcmVnaW9uX2Rlc2MgcmVnaW9uX3JlZyA9IHtcbi1cdFx0LnNpemUgPSByaW5nX3NpemUsXG4tXHRcdC51c2VyX2FkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcmluZ19wdHIsXG4mIzQzO1x0XHQuc2l6ZSA9IGN0eC1cdTAwM2VyaW5nX3NpemUsXG4mIzQzO1x0XHQudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VyaW5nX3B0cixcbiBcdFx0LmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2FyZWFfcmVnIGFyZWFfcmVnID0ge1xuLVx0XHQuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylhcmVhX3B0cixcbiYjNDM7XHRcdC5hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VhcmVhX3B0cixcbiBcdFx0LmxlbiA9IEFSRUFfU0laRSxcbiBcdFx0LmZsYWdzID0gMCxcbiBcdH07XG4gXG4gXHRzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0ge1xuIFx0XHQuaWZfaWR4ID0gaWZpbmRleCxcbi1cdFx0LmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCxcbiYjNDM7XHRcdC5pZl9yeHEgPSBjdHgtXHUwMDNlcXVldWVfaWQsXG4gXHRcdC5ycV9lbnRyaWVzID0gcnFfZW50cmllcyxcbiBcdFx0LmFyZWFfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKVx1MDAyNmFyZWFfcmVnLFxuIFx0XHQucmVnaW9uX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylcdTAwMjZyZWdpb25fcmVnLFxuIFx0XHQucnhfYnVmX2xlbiA9IGNmZ19yeF9idWZfbGVuLFxuIFx0fTtcbiBcbi1cdHJldCA9IGlvX3VyaW5nX3JlZ2lzdGVyX2lmcShyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4mIzQzO1x0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4gXHRpZiAoY2ZnX3J4X2J1Zl9sZW4gXHUwMDI2XHUwMDI2IChyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVPUE5PVFNVUFAgfHxcbiBcdFx0XHQgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7XG4gXHRcdHByaW50ZihcJiMzNDtMYXJnZSBjaHVua3MgYXJlIG5vdCBzdXBwb3J0ZWQgJWlcXG5cJiMzNDssIHJldCk7XG5AQCAtMjA5LDc0ICYjNDM7MjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcJiMzNDtpb191cmluZ19yZWdpc3Rlcl9pZnEoKTogJWRcJiMzNDssIHJldCk7XG4gXHR9XG4gXG4tXHRycV9yaW5nLmtoZWFkID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLmhlYWQpO1xuLVx0cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy50YWlsKTtcbi1cdHJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTtcbi1cdHJxX3JpbmcucnFfdGFpbCA9IDA7XG4tXHRycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xuLVxuLVx0YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XG4tfVxuLVxuLXN0YXRpYyB2b2lkIGFkZF9hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxuLXtcbi1cdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbi1cbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0Y3R4LVx1MDAzZXJxX3Jpbmcua2hlYWQgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLmhlYWQpO1xuJiM0MztcdGN0eC1cdTAwM2VycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKWN0eC1cdTAwM2VyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy50YWlsKTtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKWN0eC1cdTAwM2VyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsID0gMDtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllcztcbiBcbi1cdGlvX3VyaW5nX3ByZXBfYWNjZXB0KHNxZSwgc29ja2ZkLCBOVUxMLCBOVUxMLCAwKTtcbi1cdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSAxO1xuJiM0MztcdGN0eC1cdTAwM2VhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpXG4mIzQzO3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgMCwgMCk7XG4mIzQzO1x0aW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBjdHgtXHUwMDNlY29ubmZkc1tjb25uX2lkeF0sXG4mIzQzO1x0XHRcdCBOVUxMLCAwLCAwKTtcbiBcdHNxZS1cdTAwM2Vpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDI7XG4mIzQzO1x0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IGNvbm5faWR4O1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBhZGRfcmVjdnpjX29uZXNob3Qoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkLCBzaXplX3QgbGVuKVxuJiM0MztzdGF0aWMgdm9pZCBhZGRfcmVjdnpjX29uZXNob3Qoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4LCBzaXplX3QgbGVuKVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgbGVuLCAwKTtcbiYjNDM7XHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC1cdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcbiYjNDM7XHRcdFx0IE5VTEwsIGxlbiwgMCk7XG4gXHRzcWUtXHUwMDNlaW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDtcbi1cdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSAyO1xuJiM0MztcdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4mIzQzO3N0YXRpYyB2b2lkIHByb2Nlc3NfcmVjdnpjKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSxcbiYjNDM7XHRcdFx0ICAgaW50IGNvbm5faWR4KVxuIHtcbi1cdGlmIChjcWUtXHUwMDNlcmVzIFx1MDAzYyAwKVxuLVx0XHRlcnJvcigxLCAwLCBcJiMzNDthY2NlcHQoKVwmIzM0Oyk7XG4tXHRpZiAoY29ubmZkKVxuLVx0XHRlcnJvcigxLCAwLCBcJiMzNDtVbmV4cGVjdGVkIHNlY29uZCBjb25uZWN0aW9uXCYjMzQ7KTtcbi1cbi1cdGNvbm5mZCA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpZiAoY2ZnX29uZXNob3QpXG4tXHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRlbHNlXG4tXHRcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4te1xuLVx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcnFfbWFzayA9IGN0eC1cdTAwM2VycV9yaW5nLnJpbmdfZW50cmllcyAtIDE7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKnJjcWU7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKnJxZTtcbi1cdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcdHVpbnQ2NF90IG1hc2s7XG4gXHRjaGFyICpkYXRhO1xuIFx0c3NpemVfdCBuO1xuIFx0aW50IGk7XG4gXG4tXHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjYgY2ZnX29uZXNob3RfcmVjdnMgPT0gMCkge1xuLVx0XHRzdG9wID0gdHJ1ZTtcbiYjNDM7XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3R4LVx1MDAzZW9uZXNob3RfcmVjdnNbY29ubl9pZHhdID09IDApIHtcbiYjNDM7XHRcdGN0eC1cdTAwM2Vucl9jb25ucy0tO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG5AQCAtMjg0LDU5ICYjNDM7Mjc5LDE3MCBAQCBzdGF0aWMgdm9pZCBwcm9jZXNzX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSlcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7cmVjdnpjKCk6ICVkXCYjMzQ7LCBjcWUtXHUwMDNlcmVzKTtcbiBcbiBcdGlmIChjZmdfb25lc2hvdCkge1xuLVx0XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjYgY2ZnX29uZXNob3RfcmVjdnMpIHtcbi1cdFx0XHRhZGRfcmVjdnpjX29uZXNob3QocmluZywgY29ubmZkLCBwYWdlX3NpemUpO1xuLVx0XHRcdGNmZ19vbmVzaG90X3JlY3ZzLS07XG4mIzQzO1x0XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0pIHtcbiYjNDM7XHRcdFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgY29ubl9pZHgsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XS0tO1xuJiM0MztcdFx0XHRyZXR1cm47XG4gXHRcdH1cbiBcdH0gZWxzZSBpZiAoIShjcWUtXHUwMDNlZmxhZ3MgXHUwMDI2IElPUklOR19DUUVfRl9NT1JFKSkge1xuLVx0XHRhZGRfcmVjdnpjKHJpbmcsIGNvbm5mZCk7XG4mIzQzO1x0XHRhZGRfcmVjdnpjKGN0eCwgY29ubl9pZHgpO1xuIFx0fVxuIFxuIFx0cmNxZSA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKikoY3FlICYjNDM7IDEpO1xuIFxuIFx0biA9IGNxZS1cdTAwM2VyZXM7XG4gXHRtYXNrID0gKDFVTEwgXHUwMDNjXHUwMDNjIElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTtcbi1cdGRhdGEgPSAoY2hhciAqKWFyZWFfcHRyICYjNDM7IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4mIzQzO1x0ZGF0YSA9IChjaGFyICopY3R4LVx1MDAzZWFyZWFfcHRyICYjNDM7IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoKihkYXRhICYjNDM7IGkpICE9IHBheWxvYWRbKHJlY2VpdmVkICYjNDM7IGkpXSlcbiYjNDM7XHRcdGlmICgqKGRhdGEgJiM0MzsgaSkgIT0gcGF5bG9hZFsoY3R4LVx1MDAzZXJlY2VpdmVkW2Nvbm5faWR4XSAmIzQzOyBpKV0pXG4gXHRcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7cGF5bG9hZCBtaXNtYXRjaCBhdCAlZFwmIzM0OywgaSk7XG4gXHR9XG4tXHRyZWNlaXZlZCAmIzQzOz0gbjtcbiYjNDM7XHRjdHgtXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7PSBuO1xuIFxuLVx0cnFlID0gXHUwMDI2cnFfcmluZy5ycWVzWyhycV9yaW5nLnJxX3RhaWwgXHUwMDI2IHJxX21hc2spXTtcbi1cdHJxZS1cdTAwM2VvZmYgPSAocmNxZS1cdTAwM2VvZmYgXHUwMDI2IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjtcbiYjNDM7XHRycWUgPSBcdTAwMjZjdHgtXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4mIzQzO1x0cnFlLVx1MDAzZW9mZiA9IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtXHUwMDNlYXJlYV90b2tlbjtcbiBcdHJxZS1cdTAwM2VsZW4gPSBjcWUtXHUwMDNlcmVzO1xuLVx0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UocnFfcmluZy5rdGFpbCwgJiM0MzsmIzQzO3JxX3JpbmcucnFfdGFpbCk7XG4mIzQzO1x0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LVx1MDAzZXJxX3Jpbmcua3RhaWwsICYjNDM7JiM0MztjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuJiM0MztzdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19jcWUgKmNxZTtcbiBcdHVuc2lnbmVkIGludCBjb3VudCA9IDA7XG4gXHR1bnNpZ25lZCBpbnQgaGVhZDtcbi1cdGludCBpLCByZXQ7XG4gXG4tXHRpb191cmluZ19zdWJtaXRfYW5kX3dhaXQocmluZywgMSk7XG4mIzQzO1x0aW9fdXJpbmdfc3VibWl0X2FuZF93YWl0KFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAxKTtcbiBcbi1cdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShyaW5nLCBoZWFkLCBjcWUpIHtcbi1cdFx0aWYgKGNxZS1cdTAwM2V1c2VyX2RhdGEgPT0gMSlcbi1cdFx0XHRwcm9jZXNzX2FjY2VwdChyaW5nLCBjcWUpO1xuLVx0XHRlbHNlIGlmIChjcWUtXHUwMDNldXNlcl9kYXRhID09IDIpXG4tXHRcdFx0cHJvY2Vzc19yZWN2emMocmluZywgY3FlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGVycm9yKDEsIDAsIFwmIzM0O3Vua25vd24gY3FlXCYjMzQ7KTtcbiYjNDM7XHRpb191cmluZ19mb3JfZWFjaF9jcWUoXHUwMDI2Y3R4LVx1MDAzZXJpbmcsIGhlYWQsIGNxZSkge1xuJiM0MztcdFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cdTAwM2V1c2VyX2RhdGEpO1xuIFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4gXHR9XG4tXHRpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTtcbiYjNDM7XHRpb191cmluZ19jcV9hZHZhbmNlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBjb3VudCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKVxuIHtcbi1cdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XG4tXHRzdHJ1Y3QgaW9fdXJpbmcgcmluZztcbi1cdGludCBmZCwgZW5hYmxlLCByZXQ7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwYXJhbXMgPSB7IH07XG4mIzQzO1x0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcbiBcdHVpbnQ2NF90IHRzdG9wO1xuJiM0MztcdGludCBucl9jb25ucztcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSO1xuJiM0MztcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjtcbiYjNDM7XHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjtcbiYjNDM7XHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTtcbiYjNDM7XHRwYXJhbXMuY3FfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcdTAwMjZjdHgtXHUwMDNlcmluZywgXHUwMDI2cGFyYW1zKTtcbiYjNDM7XHRzZXR1cF96Y3J4KGN0eCk7XG4mIzQzO1xuJiM0MztcdGlmIChjZmdfZHJ5X3J1bilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlc2V0dXBfZG9uZSk7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LVx1MDAzZWRpc3BhdGNoX2RvbmUpO1xuJiM0MztcbiYjNDM7XHRucl9jb25ucyA9IGN0eC1cdTAwM2Vucl9jb25ucztcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY3R4LVx1MDAzZW5yX2Nvbm5zOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGNmZ19vbmVzaG90KSB7XG4mIzQzO1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2ldID0gY2ZnX29uZXNob3RfcmVjdnM7XG4mIzQzO1x0XHRcdGFkZF9yZWN2emNfb25lc2hvdChjdHgsIGksIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRhZGRfcmVjdnpjKGN0eCwgaSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7XG4mIzQzO1x0d2hpbGUgKGN0eC1cdTAwM2Vucl9jb25ucyBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXHUwMDNjIHRzdG9wKVxuJiM0MztcdFx0c2VydmVyX2xvb3AoY3R4KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGN0eC1cdTAwM2Vucl9jb25ucyAhPSAwKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7dGVzdCBmYWlsZWQ6ICVkIGNvbm5lY3Rpb25zIGluY29tcGxldGVcJiMzNDssXG4mIzQzO1x0XHQgICAgICBjdHgtXHUwMDNlbnJfY29ubnMpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jb25uczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChjZmdfb25lc2hvdCkge1xuJiM0MztcdFx0XHRpZiAoIWN0eC1cdTAwM2VyZWNlaXZlZFtpXSlcbiYjNDM7XHRcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGFcJiMzNDssIGkpO1xuJiM0MztcdFx0fSBlbHNlIGlmIChjdHgtXHUwMDNlcmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7XG4mIzQzO1x0XHRcdGVycm9yKDEsIDAsIFwmIzM0O2Nvbm5lY3Rpb24gJWQgcmVjZWl2ZWQgJXp1IG9mICVkIGJ5dGVzXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICBpLCBjdHgtXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcXVlcnlfbmFwaV9pZCh1bnNpZ25lZCBpbnQgaWZpbmRleCwgaW50IHF1ZXVlX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcmVxICpyZXE7XG4mIzQzO1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcnNwICpyc3A7XG4mIzQzO1x0c3RydWN0IHlubF9lcnJvciB5ZXJyO1xuJiM0MztcdHN0cnVjdCB5bmxfc29jayAqeXM7XG4mIzQzO1x0aW50IG5hcGlfaWQ7XG4mIzQzO1xuJiM0MztcdHlzID0geW5sX3NvY2tfY3JlYXRlKFx1MDAyNnlubF9uZXRkZXZfZmFtaWx5LCBcdTAwMjZ5ZXJyKTtcbiYjNDM7XHRpZiAoIXlzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7eW5sX3NvY2tfY3JlYXRlOiAlc1wmIzM0OywgeWVyci5tc2cpO1xuJiM0MztcbiYjNDM7XHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xuJiM0MztcdG5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF9pZmluZGV4KHJlcSwgaWZpbmRleCk7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X3R5cGUocmVxLCBORVRERVZfUVVFVUVfVFlQRV9SWCk7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xuJiM0MztcbiYjNDM7XHRyc3AgPSBuZXRkZXZfcXVldWVfZ2V0KHlzLCByZXEpO1xuJiM0MztcdGlmICghcnNwKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7bmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogJXNcJiMzNDssIHF1ZXVlX2lkLFxuJiM0MztcdFx0ICAgICAgeXMtXHUwMDNlZXJyLm1zZyk7XG4mIzQzO1x0aWYgKCFyc3AtXHUwMDNlX3ByZXNlbnQubmFwaV9pZClcbiYjNDM7XHRcdGVycm9yKDEsIDAsIFwmIzM0O25ldGRldl9xdWV1ZV9nZXQocT0lZCk6IG5hcGlfaWQgbm90IHByZXNlbnRcJiMzNDssXG4mIzQzO1x0XHQgICAgICBxdWV1ZV9pZCk7XG4mIzQzO1xuJiM0MztcdG5hcGlfaWQgPSByc3AtXHUwMDNlbmFwaV9pZDtcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfZnJlZShyZXEpO1xuJiM0MztcdG5ldGRldl9xdWV1ZV9nZXRfcnNwX2ZyZWUocnNwKTtcbiYjNDM7XHR5bmxfc29ja19kZXN0cm95KHlzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5hcGlfaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZmluZF90aHJlYWRfYnlfY29ubihzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4cywgaW50IGNvbm5mZClcbiYjNDM7e1xuJiM0MztcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoaW50KTtcbiYjNDM7XHRpbnQgbmFwaV9pZCwgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldHNvY2tvcHQoY29ubmZkLCBTT0xfU09DS0VULCBTT19JTkNPTUlOR19OQVBJX0lELCBcdTAwMjZuYXBpX2lkLCBcdTAwMjZsZW4pKVxuJiM0MztcdFx0ZXJyb3IoMSwgZXJybm8sIFwmIzM0O2dldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpXG4mIzQzO1x0XHRcdHJldHVybiBpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyb3IoMSwgMCwgXCYjMzQ7dW5rbm93biBOQVBJIElEOiAlZFwmIzM0OywgbmFwaV9pZCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfdCBzZXR1cF9kb25lLCBkaXNwYXRjaF9kb25lO1xuJiM0MztcdGludCB0b3RhbF9jb25ucywgYWNjZXB0ZWQgPSAwLCBjb25uZmQ7XG4mIzQzO1x0c3RydWN0IHRocmVhZF9jdHggKmN0eHM7XG4mIzQzO1x0aW50IGZkLCByZXQsIGVuYWJsZSwgaTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcbiYjNDM7XHRwdGhyZWFkX3QgKnRocmVhZHM7XG4mIzQzO1xuJiM0MztcdGN0eHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKmN0eHMpKTtcbiYjNDM7XHR0aHJlYWRzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4mIzQzO1x0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7Y2FsbG9jKClcJiMzNDspO1xuIFxuIFx0ZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTtcbiBcdGlmIChmZCA9PSAtMSlcbkBAIC0zNTEsMzIgJiM0Mzs0NTcsNzEgQEAgc3RhdGljIHZvaWQgcnVuX3NlcnZlcih2b2lkKVxuIFx0aWYgKHJldCBcdTAwM2MgMClcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7YmluZCgpXCYjMzQ7KTtcbiBcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xuLVx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX2luaXQoXHUwMDI2c2V0dXBfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICYjNDM7IDEpO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9pbml0KFx1MDAyNmRpc3BhdGNoX2RvbmUsIE5VTEwsIGNmZ19udW1fdGhyZWFkcyAmIzQzOyAxKTtcbiBcbi1cdGlvX3VyaW5nX3F1ZXVlX2luaXQoNTEyLCBcdTAwMjZyaW5nLCBmbGFncyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCAmIzQzOyBpO1xuJiM0MztcdFx0Y3R4c1tpXS5zZXR1cF9kb25lID0gXHUwMDI2c2V0dXBfZG9uZTtcbiYjNDM7XHRcdGN0eHNbaV0uZGlzcGF0Y2hfZG9uZSA9IFx1MDAyNmRpc3BhdGNoX2RvbmU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLFxuJiM0MztcdFx0XHRcdCAgICAgc2VydmVyX3dvcmtlciwgXHUwMDI2Y3R4c1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRlcnJvcigxLCByZXQsIFwmIzM0O3B0aHJlYWRfY3JlYXRlKClcJiMzNDspO1xuJiM0MztcdH1cbiBcbi1cdHNldHVwX3pjcngoXHUwMDI2cmluZyk7XG4gXHRpZiAoY2ZnX2RyeV9ydW4pXG4tXHRcdHJldHVybjtcbiYjNDM7XHRcdGdvdG8gam9pbjtcbiYjNDM7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2c2V0dXBfZG9uZSk7XG4gXG4gXHRpZiAobGlzdGVuKGZkLCAxMDI0KSBcdTAwM2MgMClcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7bGlzdGVuKClcJiMzNDspO1xuIFxuLVx0YWRkX2FjY2VwdChcdTAwMjZyaW5nLCBmZCk7XG4mIzQzO1x0aWYgKGNmZ19udW1fdGhyZWFkcyBcdTAwM2UgMSkge1xuJiM0MztcdFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xuJiM0MztcdFx0aWYgKCFpZmluZGV4KVxuJiM0MztcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCYjMzQ7LCBjZmdfaWZuYW1lKTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGN0eHNbaV0ubmFwaV9pZCA9IHF1ZXJ5X25hcGlfaWQoaWZpbmRleCxcbiYjNDM7XHRcdFx0XHRcdFx0XHRjdHhzW2ldLnF1ZXVlX2lkKTtcbiYjNDM7XHR9XG4gXG4tXHR0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7XG4tXHR3aGlsZSAoIXN0b3AgXHUwMDI2XHUwMDI2IGdldHRpbWVvZmRheV9tcygpIFx1MDAzYyB0c3RvcClcbi1cdFx0c2VydmVyX2xvb3AoXHUwMDI2cmluZyk7XG4mIzQzO1x0dG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChhY2NlcHRlZCBcdTAwM2MgdG90YWxfY29ubnMpIHtcbiYjNDM7XHRcdGludCBpZHggPSAwO1xuJiM0MztcbiYjNDM7XHRcdGNvbm5mZCA9IGFjY2VwdChmZCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoY29ubmZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRlcnJvcigxLCBlcnJubywgXCYjMzQ7YWNjZXB0KClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjZmdfbnVtX3RocmVhZHMgXHUwMDNlIDEpXG4mIzQzO1x0XHRcdGlkeCA9IGZpbmRfdGhyZWFkX2J5X2Nvbm4oY3R4cywgY29ubmZkKTtcbiBcbi1cdGlmICghc3RvcClcbi1cdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7dGVzdCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0aWYgKGN0eHNbaWR4XS5ucl9jb25ucyBcdTAwM2U9IE1BWF9DT05OU19QRVJfVEhSRUFEKVxuJiM0MztcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDt3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvd1wmIzM0OywgaWR4KTtcbiYjNDM7XHRcdGN0eHNbaWR4XS5jb25uZmRzW2N0eHNbaWR4XS5ucl9jb25ucyYjNDM7JiM0MztdID0gY29ubmZkO1xuJiM0MztcdFx0YWNjZXB0ZWQmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2ZGlzcGF0Y2hfZG9uZSk7XG4mIzQzO1xuJiM0Mztqb2luOlxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNnNldHVwX2RvbmUpO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRmcmVlKHRocmVhZHMpO1xuJiM0MztcdGZyZWUoY3R4cyk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgKmNsaWVudF93b3JrZXIodm9pZCAqYXJnKVxuIHtcbiBcdHNzaXplX3QgdG9fc2VuZCA9IGNmZ19zZW5kX3NpemU7XG4gXHRzc2l6ZV90IHNlbnQgPSAwO1xuQEAgLTQwMiwxMiAmIzQzOzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXG4gXHR9XG4gXG4gXHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCB0b3RhbF9jb25ucyA9IGNmZ19udW1fdGhyZWFkcyAqIGNmZ19udW1fdGhyZWFkcztcbiYjNDM7XHRwdGhyZWFkX3QgKnRocmVhZHM7XG4mIzQzO1x0aW50IGksIHJldDtcbiYjNDM7XG4mIzQzO1x0dGhyZWFkcyA9IGNhbGxvYyh0b3RhbF9jb25ucywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4mIzQzO1x0aWYgKCF0aHJlYWRzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7Y2FsbG9jKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0b3RhbF9jb25uczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0ZXJyb3IoMSwgcmV0LCBcJiMzNDtwdGhyZWFkX2NyZWF0ZSgpXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRvdGFsX2Nvbm5zOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0ZnJlZSh0aHJlYWRzKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZmlsZXBhdGgpXG4ge1xuIFx0ZXJyb3IoMSwgMCwgXCYjMzQ7VXNhZ2U6ICVzICgtNHwtNikgKC1zfC1jKSAtaFx1MDAzY3NlcnZlcl9pcFx1MDAzZSAtcFx1MDAzY3BvcnRcdTAwM2UgXCYjMzQ7XG4tXHRcdCAgICBcJiMzNDstbFx1MDAzY3BheWxvYWRfc2l6ZVx1MDAzZSAtaVx1MDAzY2lmbmFtZVx1MDAzZSAtcVx1MDAzY3J4cV9pZFx1MDAzZVwmIzM0OywgZmlsZXBhdGgpO1xuJiM0MztcdFx0ICAgIFwmIzM0Oy1sXHUwMDNjcGF5bG9hZF9zaXplXHUwMDNlIC1pXHUwMDNjaWZuYW1lXHUwMDNlIC1xXHUwMDNjcnhxX2lkXHUwMDNlIC10XHUwMDNjbnVtX3RocmVhZHNcdTAwM2VcJiMzNDssXG4mIzQzO1x0XHQgICAgZmlsZXBhdGgpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcbkBAIC00MjUsNyAmIzQzOzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR1c2FnZShhcmd2WzBdKTtcbiBcdGNmZ19wYXlsb2FkX2xlbiA9IG1heF9wYXlsb2FkX2xlbjtcbiBcbi1cdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDtzY2g6cDpsOmk6cTpvOno6eDpkXCYjMzQ7KSkgIT0gLTEpIHtcbiYjNDM7XHR3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZHQ6XCYjMzQ7KSkgIT0gLTEpIHtcbiBcdFx0c3dpdGNoIChjKSB7XG4gXHRcdGNhc2UgJiMzOTtzJiMzOTs6XG4gXHRcdFx0aWYgKGNmZ19jbGllbnQpXG5AQCAtNDY2LDYgJiM0Mzs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0Y2FzZSAmIzM5O2QmIzM5OzpcbiBcdFx0XHRjZmdfZHJ5X3J1biA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHRjZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuQEAgLTMwLDYgJiM0MzszMCwxMyBAQCBkZWYgY3JlYXRlX3Jzc19jdHgoY2ZnKTpcbiAgICAgcmV0dXJuIGludCh2YWx1ZXMpXG4gXG4gXG4mIzQzO2RlZiBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIHN0YXJ0LCBjb3VudCk6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtDcmVhdGUgYW4gUlNTIGNvbnRleHQgc3Bhbm5pbmcgY291bnQgcXVldWVzIGZyb20gc3RhcnQsIHJldHVybiBpdHMgSUQuXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBvdXRwdXQgPSBldGh0b29sKGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gY29udGV4dCBuZXcgc3RhcnQge3N0YXJ0fSBlcXVhbCB7Y291bnR9XCYjMzQ7KS5zdGRvdXRcbiYjNDM7ICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJiMzOTtOZXcgUlNTIGNvbnRleHQgaXMgKFxcZCYjNDM7KSYjMzk7LCBvdXRwdXQpLmdyb3VwKDEpXG4mIzQzOyAgICByZXR1cm4gaW50KHZhbHVlcylcbiYjNDM7XG4mIzQzO1xuIGRlZiBzZXRfZmxvd19ydWxlKGNmZyk6XG4gICAgIG91dHB1dCA9IGV0aHRvb2woZlwmIzM0Oy1OIHtjZmcuaWZuYW1lfSBmbG93LXR5cGUgdGNwNiBkc3QtcG9ydCB7Y2ZnLnBvcnR9IGFjdGlvbiB7Y2ZnLnRhcmdldH1cJiMzNDspLnN0ZG91dFxuICAgICB2YWx1ZXMgPSByZS5zZWFyY2gociYjMzk7SUQgKFxcZCYjNDM7KSYjMzk7LCBvdXRwdXQpLmdyb3VwKDEpXG5AQCAtMTI3LDE3ICYjNDM7MTM0LDU2IEBAIGRlZiBfcmVxdWlyZV9udHVwbGUoY2ZnKTpcbiAgICAgICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstSyB7Y2ZnLmlmbmFtZX0gbnR1cGxlLWZpbHRlcnMgb2ZmXCYjMzQ7KVxuIFxuIFxuJiM0MztkZWYgcnNzX211bHRpcXVldWUoY2ZnKTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1N0ZWVyIHRoZSB0ZXN0IGZsb3cgdG8gYSBtdWx0aS1xdWV1ZSBSU1MgY29udGV4dCBmb3IgbXVsdGktdGhyZWFkIHpjcnguXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBjaGFubmVscyA9IGNmZy5ldGhubC5jaGFubmVsc19nZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH19KVxuJiM0MzsgICAgY2hhbm5lbHMgPSBjaGFubmVsc1smIzM5O2NvbWJpbmVkLWNvdW50JiMzOTtdXG4mIzQzOyAgICBpZiBjaGFubmVscyBcdTAwM2MgMzpcbiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzk7VGVzdCByZXF1aXJlcyBORVRJRiB3aXRoIGF0IGxlYXN0IDMgY29tYmluZWQgY2hhbm5lbHMmIzM5OylcbiYjNDM7XG4mIzQzOyAgICByaW5ncyA9IGNmZy5ldGhubC5yaW5nc19nZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH19KVxuJiM0MzsgICAgcnhfcmluZ3MgPSByaW5nc1smIzM5O3J4JiMzOTtdXG4mIzQzOyAgICBoZHNfdGhyZXNoID0gcmluZ3MuZ2V0KCYjMzk7aGRzLXRocmVzaCYjMzk7LCAwKVxuJiM0MztcbiYjNDM7ICAgIGNmZy5ldGhubC5yaW5nc19zZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3RjcC1kYXRhLXNwbGl0JiMzOTs6ICYjMzk7ZW5hYmxlZCYjMzk7LFxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IDAsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IDY0fSlcbiYjNDM7ICAgIGRlZmVyKGNmZy5ldGhubC5yaW5nc19zZXQsIHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9LFxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7dGNwLWRhdGEtc3BsaXQmIzM5OzogJiMzOTt1bmtub3duJiMzOTssXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IGhkc190aHJlc2gsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtyeCYjMzk7OiByeF9yaW5nc30pXG4mIzQzOyAgICBkZWZlcihtcF9jbGVhcl93YWl0LCBjZmcpXG4mIzQzO1xuJiM0MzsgICAgY2ZnLm51bV90aHJlYWRzID0gMlxuJiM0MzsgICAgY2ZnLnRhcmdldCA9IGNoYW5uZWxzIC0gY2ZnLm51bV90aHJlYWRzXG4mIzQzOyAgICBldGh0b29sKGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZXF1YWwge2NmZy50YXJnZXR9XCYjMzQ7KVxuJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZlwmIzM0Oy1YIHtjZmcuaWZuYW1lfSBkZWZhdWx0XCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIHJzc19jdHhfaWQgPSBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIGNmZy50YXJnZXQsIGNmZy5udW1fdGhyZWFkcylcbiYjNDM7ICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZGVsZXRlIGNvbnRleHQge3Jzc19jdHhfaWR9XCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIGZsb3dfcnVsZV9pZCA9IHNldF9mbG93X3J1bGVfcnNzKGNmZywgcnNzX2N0eF9pZClcbiYjNDM7ICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XCYjMzQ7KVxuJiM0MztcbiYjNDM7XG4gQGtzZnRfdmFyaWFudHMoW1xuICAgICBLc2Z0TmFtZWRWYXJpYW50KFwmIzM0O3NpbmdsZVwmIzM0Oywgc2luZ2xlKSxcbiAgICAgS3NmdE5hbWVkVmFyaWFudChcJiMzNDtyc3NcJiMzNDssIHJzcyksXG4mIzQzOyAgICBLc2Z0TmFtZWRWYXJpYW50KFwmIzM0O3Jzc19tdWx0aXF1ZXVlXCYjMzQ7LCByc3NfbXVsdGlxdWV1ZSksXG4gXSlcbiBkZWYgdGVzdF96Y3J4KGNmZywgc2V0dXApIC1cdTAwM2UgTm9uZTpcbiAgICAgY2ZnLnJlcXVpcmVfaXB2ZXIoJiMzOTs2JiMzOTspXG4gICAgIF9yZXF1aXJlX250dXBsZShjZmcpXG4gXG4mIzQzOyAgICBjZmcubnVtX3RocmVhZHMgPSAxXG4mIzQzO1xuICAgICBzZXR1cChjZmcpXG4tICAgIHJ4X2NtZCA9IGZcJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9XCYjMzQ7XG4tICAgIHR4X2NtZCA9IGZcJiMzNDt7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92WyYjMzk7NiYjMzk7XX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MFwmIzM0O1xuJiM0MztcbiYjNDM7ICAgIHJ4X2NtZCA9IChmXCYjMzQ7e2NmZy5iaW5fbG9jYWx9IC1zIC1wIHtjZmcucG9ydH0gLWkge2NmZy5pZm5hbWV9IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgIGZcJiMzNDstcSB7Y2ZnLnRhcmdldH0gLXQge2NmZy5udW1fdGhyZWFkc31cJiMzNDspXG4mIzQzOyAgICB0eF9jbWQgPSAoZlwmIzM0O3tjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJiMzOTs2JiMzOTtdfSAtcCB7Y2ZnLnBvcnR9IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgIGZcJiMzNDstbCAxMjg0MCAtdCB7Y2ZnLm51bV90aHJlYWRzfVwmIzM0OylcbiAgICAgd2l0aCBia2cocnhfY21kLCBleGl0X3dhaXQ9VHJ1ZSk6XG4gICAgICAgICB3YWl0X3BvcnRfbGlzdGVuKGNmZy5wb3J0LCBwcm90bz1cJiMzNDt0Y3BcJiMzNDspXG4gICAgICAgICBjbWQodHhfY21kLCBob3N0PWNmZy5yZW1vdGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhNwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgU2VwIDkgMjA6NTc6MjUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCmluZGV4IGJkM2I4ZDJmYTQ3ZTAuLjhhZWJkYzZmZWIxNzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCkBAIC0xOCwxMCAmIzQzOzE4LDYgQEAgZWxzZQogJCh3YXJuaW5nIGV4Y2x1ZGluZyBpb3VyaW5nIHRlc3RzLCBsaWJ1cmluZyBub3QgaW5zdGFsbGVkIG9yIHRvbyBvbGQpCiBlbmRpZgogCi1URVNUX0dFTl9GSUxFUyA6PSBcCi0JJChDT05EX0dFTl9GSUxFUykgXAotIyBlbmQgb2YgVEVTVF9HRU5fRklMRVMKLQogVEVTVF9QUk9HUyA9IFwKIAljc3VtLnB5IFwKIAlkZXZsaW5rX3JhdGVfY3Jvc3NfZXN3LnB5IFwKQEAgLTgwLDYgJiM0Mzs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXAogWU5MX0dFTl9GSUxFUyA6PSBcCiAJbmNkZXZtZW0gXAogCXRvZXBsaXR6IFwKJiM0MzsJJChDT05EX0dFTl9GSUxFUykgXAogIyBlbmQgb2YgWU5MX0dFTl9GSUxFUwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9ICQoWU5MX0dFTl9GSUxFUykKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSAkKHBhdHN1YnN0ICUuYywlLm8sJCh3aWxkY2FyZCAqLmJwZi5jKSkKQEAgLTk3LDUgJiM0Mzs5NCw1IEBAIGluY2x1ZGUgLi4vLi4vLi4vbmV0L3lubC5tawogaW5jbHVkZSAuLi8uLi8uLi9uZXQvYnBmLm1rCiAKIGlmZXEgKCQoSEFTX0lPVVJJTkdfWkNSWCkseSkKLSQoT1VUUFVUKS9pb3UtemNyeDogTERMSUJTICYjNDM7PSAtbHVyaW5nCiYjNDM7JChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmcgLWxwdGhyZWFkCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmMKaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jCkBAIC00LDYgJiM0Mzs0LDcgQEAKICNpbmNsdWRlICZsdDtlcnJvci5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKICNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW50LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKQEAgLTM3LDYgJiM0MzszOCw4IEBACiAjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKIAogI2luY2x1ZGUgJmx0O2xpYnVyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3lubC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7bmV0ZGV2LXVzZXIuaCYjMzQ7CiAKICNkZWZpbmUgU0tJUF9DT0RFCTQyCiAKQEAgLTg1LDE2ICYjNDM7ODgsMjkgQEAgc3RhdGljIGludCBjZmdfc2VuZF9zaXplID0gU0VORF9TSVpFOwogc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbjYgY2ZnX2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuOwogc3RhdGljIGJvb2wgY2ZnX2RyeV9ydW47CiYjNDM7c3RhdGljIGludCBjZmdfbnVtX3RocmVhZHMgPSAxOwogCiBzdGF0aWMgY2hhciAqcGF5bG9hZDsKLXN0YXRpYyB2b2lkICphcmVhX3B0cjsKLXN0YXRpYyB2b2lkICpyaW5nX3B0cjsKLXN0YXRpYyBzaXplX3QgcmluZ19zaXplOwotc3RhdGljIHN0cnVjdCBpb191cmluZ196Y3J4X3JxIHJxX3Jpbmc7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhcmVhX3Rva2VuOwotc3RhdGljIGludCBjb25uZmQ7Ci1zdGF0aWMgYm9vbCBzdG9wOwotc3RhdGljIHNpemVfdCByZWNlaXZlZDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9DT05OU19QRVJfVEhSRUFECTY0CiYjNDM7CiYjNDM7c3RydWN0IHRocmVhZF9jdHggewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmcJCXJpbmc7CiYjNDM7CXZvaWQJCQkqYXJlYV9wdHI7CiYjNDM7CXZvaWQJCQkqcmluZ19wdHI7CiYjNDM7CXNpemVfdAkJCXJpbmdfc2l6ZTsKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3pjcnhfcnEJcnFfcmluZzsKJiM0MzsJdW5zaWduZWQgbG9uZwkJYXJlYV90b2tlbjsKJiM0MzsJaW50CQkJcXVldWVfaWQ7CiYjNDM7CWludAkJCW5hcGlfaWQ7CiYjNDM7CXB0aHJlYWRfYmFycmllcl90CSpzZXR1cF9kb25lOwomIzQzOwlwdGhyZWFkX2JhcnJpZXJfdAkqZGlzcGF0Y2hfZG9uZTsKJiM0MzsKJiM0MzsJaW50CQkJY29ubmZkc1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07CiYjNDM7CXNpemVfdAkJCXJlY2VpdmVkW01BWF9DT05OU19QRVJfVEhSRUFEXTsKJiM0MzsJaW50CQkJb25lc2hvdF9yZWN2c1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07CiYjNDM7CWludAkJCW5yX2Nvbm5zOwomIzQzO307CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldHRpbWVvZmRheV9tcyh2b2lkKQogewpAQCAtMTMyLDE2ICYjNDM7MTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKQogewogCXNpemVfdCBzaXplOwogCi0JcmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpOwomIzQzOwlzaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpOwogCS8qIGFkZCBzcGFjZSBmb3IgdGhlIGhlYWRlciAoaGVhZC90YWlsL2V0Yy4pICovCi0JcmluZ19zaXplICYjNDM7PSBwYWdlX3NpemU7Ci0JcmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTsKJiM0MzsJc2l6ZSAmIzQzOz0gcGFnZV9zaXplOwomIzQzOwlyZXR1cm4gQUxJR05fVVAoc2l6ZSwgcGFnZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiYjNDM7c3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KQogewomIzQzOwl1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaWZpbmRleDsKLQl1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IDQwOTY7CiAJaW50IHJldDsKIAogCWlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTsKQEAgLTE0OSw1OCAmIzQzOzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZykKIAkJZXJyb3IoMSwgMCwgJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzJiMzNDssIGNmZ19pZm5hbWUpOwogCiAJaWYgKGNmZ19yeF9idWZfbGVuICZhbXA7JmFtcDsgY2ZnX3J4X2J1Zl9sZW4gIT0gcGFnZV9zaXplKSB7Ci0JCWFyZWFfcHRyID0gbW1hcChOVUxMLAotCQkJCUFSRUFfU0laRSwKLQkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCU1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8Ci0JCQkJTUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsCi0JCQkJLTEsCi0JCQkJMCk7Ci0JCWlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7CiYjNDM7CQljdHgtJmd0O2FyZWFfcHRyID0gbW1hcChOVUxMLAomIzQzOwkJCQkgICAgIEFSRUFfU0laRSwKJiM0MzsJCQkJICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJCQkgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8CiYjNDM7CQkJCSAgICAgTUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsCiYjNDM7CQkJCSAgICAgLTEsCiYjNDM7CQkJCSAgICAgMCk7CiYjNDM7CQlpZiAoY3R4LSZndDthcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7CiAJCQlwcmludGYoJiMzNDtDYW4mIzM5O3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xuJiMzNDspOwogCQkJZXhpdChTS0lQX0NPREUpOwogCQl9CiAJfSBlbHNlIHsKLQkJYXJlYV9wdHIgPSBtbWFwKE5VTEwsCi0JCQkJQVJFQV9TSVpFLAotCQkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAotCQkJCTAsCi0JCQkJMCk7Ci0JCWlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKQomIzQzOwkJY3R4LSZndDthcmVhX3B0ciA9IG1tYXAoTlVMTCwKJiM0MzsJCQkJICAgICBBUkVBX1NJWkUsCiYjNDM7CQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsCiYjNDM7CQkJCSAgICAgMCwKJiM0MzsJCQkJICAgICAwKTsKJiM0MzsJCWlmIChjdHgtJmd0O2FyZWFfcHRyID09IE1BUF9GQUlMRUQpCiAJCQllcnJvcigxLCAwLCAmIzM0O21tYXAoKTogemVybyBjb3B5IGFyZWEmIzM0Oyk7CiAJfQogCi0JcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7Ci0JcmluZ19wdHIgPSBtbWFwKE5VTEwsCi0JCQlyaW5nX3NpemUsCi0JCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAotCQkJMCwKLQkJCTApOwomIzQzOwljdHgtJmd0O3Jpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpOwomIzQzOwljdHgtJmd0O3JpbmdfcHRyID0gbW1hcChOVUxMLAomIzQzOwkJCSAgICAgY3R4LSZndDtyaW5nX3NpemUsCiYjNDM7CQkJICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJCSAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAomIzQzOwkJCSAgICAgMCwKJiM0MzsJCQkgICAgIDApOwogCiAJc3RydWN0IGlvX3VyaW5nX3JlZ2lvbl9kZXNjIHJlZ2lvbl9yZWcgPSB7Ci0JCS5zaXplID0gcmluZ19zaXplLAotCQkudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXJpbmdfcHRyLAomIzQzOwkJLnNpemUgPSBjdHgtJmd0O3Jpbmdfc2l6ZSwKJiM0MzsJCS51c2VyX2FkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpY3R4LSZndDtyaW5nX3B0ciwKIAkJLmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLAogCX07CiAKIAlzdHJ1Y3QgaW9fdXJpbmdfemNyeF9hcmVhX3JlZyBhcmVhX3JlZyA9IHsKLQkJLmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpYXJlYV9wdHIsCiYjNDM7CQkuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZyljdHgtJmd0O2FyZWFfcHRyLAogCQkubGVuID0gQVJFQV9TSVpFLAogCQkuZmxhZ3MgPSAwLAogCX07CiAKIAlzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0gewogCQkuaWZfaWR4ID0gaWZpbmRleCwKLQkJLmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCwKJiM0MzsJCS5pZl9yeHEgPSBjdHgtJmd0O3F1ZXVlX2lkLAogCQkucnFfZW50cmllcyA9IHJxX2VudHJpZXMsCiAJCS5hcmVhX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZykmYW1wO2FyZWFfcmVnLAogCQkucmVnaW9uX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZykmYW1wO3JlZ2lvbl9yZWcsCiAJCS5yeF9idWZfbGVuID0gY2ZnX3J4X2J1Zl9sZW4sCiAJfTsKIAotCXJldCA9IGlvX3VyaW5nX3JlZ2lzdGVyX2lmcShyaW5nLCAodm9pZCAqKSZhbXA7cmVnKTsKJiM0MzsJcmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCZhbXA7Y3R4LSZndDtyaW5nLCAodm9pZCAqKSZhbXA7cmVnKTsKIAlpZiAoY2ZnX3J4X2J1Zl9sZW4gJmFtcDsmYW1wOyAocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FT1BOT1RTVVBQIHx8CiAJCQkgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7CiAJCXByaW50ZigmIzM0O0xhcmdlIGNodW5rcyBhcmUgbm90IHN1cHBvcnRlZCAlaVxuJiMzNDssIHJldCk7CkBAIC0yMDksNzQgJiM0MzsyMjUsNTMgQEAgc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiAJCWVycm9yKDEsIDAsICYjMzQ7aW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCk6ICVkJiMzNDssIHJldCk7CiAJfQogCi0JcnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5oZWFkKTsKLQlycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnRhaWwpOwotCXJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTsKLQlycV9yaW5nLnJxX3RhaWwgPSAwOwotCXJxX3JpbmcucmluZ19lbnRyaWVzID0gcmVnLnJxX2VudHJpZXM7Ci0KLQlhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjsKLX0KLQotc3RhdGljIHZvaWQgYWRkX2FjY2VwdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpCi17Ci0Jc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlOwotCi0Jc3FlID0gaW9fdXJpbmdfZ2V0X3NxZShyaW5nKTsKJiM0MzsJY3R4LSZndDtycV9yaW5nLmtoZWFkID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKWN0eC0mZ3Q7cmluZ19wdHIgJiM0MzsgcmVnLm9mZnNldHMuaGVhZCk7CiYjNDM7CWN0eC0mZ3Q7cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtJmd0O3JpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnRhaWwpOwomIzQzOwljdHgtJmd0O3JxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKiljdHgtJmd0O3JpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnJxZXMpOwomIzQzOwljdHgtJmd0O3JxX3JpbmcucnFfdGFpbCA9IDA7CiYjNDM7CWN0eC0mZ3Q7cnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllczsKIAotCWlvX3VyaW5nX3ByZXBfYWNjZXB0KHNxZSwgc29ja2ZkLCBOVUxMLCBOVUxMLCAwKTsKLQlzcWUtJmd0O3VzZXJfZGF0YSA9IDE7CiYjNDM7CWN0eC0mZ3Q7YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47CiB9CiAKLXN0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKQomIzQzO3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KQogewogCXN0cnVjdCBpb191cmluZ19zcWUgKnNxZTsKIAotCXNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7CiYjNDM7CXNxZSA9IGlvX3VyaW5nX2dldF9zcWUoJmFtcDtjdHgtJmd0O3JpbmcpOwogCi0JaW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBzb2NrZmQsIE5VTEwsIDAsIDApOwomIzQzOwlpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC0mZ3Q7Y29ubmZkc1tjb25uX2lkeF0sCiYjNDM7CQkJIE5VTEwsIDAsIDApOwogCXNxZS0mZ3Q7aW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDsKLQlzcWUtJmd0O3VzZXJfZGF0YSA9IDI7CiYjNDM7CXNxZS0mZ3Q7dXNlcl9kYXRhID0gY29ubl9pZHg7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZF9yZWN2emNfb25lc2hvdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQsIHNpemVfdCBsZW4pCiYjNDM7c3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7CiAKLQlzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpOwomIzQzOwlzcWUgPSBpb191cmluZ19nZXRfc3FlKCZhbXA7Y3R4LSZndDtyaW5nKTsKIAotCWlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgc29ja2ZkLCBOVUxMLCBsZW4sIDApOwomIzQzOwlpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC0mZ3Q7Y29ubmZkc1tjb25uX2lkeF0sCiYjNDM7CQkJIE5VTEwsIGxlbiwgMCk7CiAJc3FlLSZndDtpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UOwotCXNxZS0mZ3Q7dXNlcl9kYXRhID0gMjsKJiM0MzsJc3FlLSZndDt1c2VyX2RhdGEgPSBjb25uX2lkeDsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpCiYjNDM7c3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLAomIzQzOwkJCSAgIGludCBjb25uX2lkeCkKIHsKLQlpZiAoY3FlLSZndDtyZXMgJmx0OyAwKQotCQllcnJvcigxLCAwLCAmIzM0O2FjY2VwdCgpJiMzNDspOwotCWlmIChjb25uZmQpCi0JCWVycm9yKDEsIDAsICYjMzQ7VW5leHBlY3RlZCBzZWNvbmQgY29ubmVjdGlvbiYjMzQ7KTsKLQotCWNvbm5mZCA9IGNxZS0mZ3Q7cmVzOwotCWlmIChjZmdfb25lc2hvdCkKLQkJYWRkX3JlY3Z6Y19vbmVzaG90KHJpbmcsIGNvbm5mZCwgcGFnZV9zaXplKTsKLQllbHNlCi0JCWFkZF9yZWN2emMocmluZywgY29ubmZkKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpCi17Ci0JdW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTsKJiM0MzsJdW5zaWduZWQgaW50IHJxX21hc2sgPSBjdHgtJmd0O3JxX3JpbmcucmluZ19lbnRyaWVzIC0gMTsKIAlzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKnJjcWU7CiAJc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlICpycWU7Ci0Jc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlOwogCXVpbnQ2NF90IG1hc2s7CiAJY2hhciAqZGF0YTsKIAlzc2l6ZV90IG47CiAJaW50IGk7CiAKLQlpZiAoY3FlLSZndDtyZXMgPT0gMCAmYW1wOyZhbXA7IGNxZS0mZ3Q7ZmxhZ3MgPT0gMCAmYW1wOyZhbXA7IGNmZ19vbmVzaG90X3JlY3ZzID09IDApIHsKLQkJc3RvcCA9IHRydWU7CiYjNDM7CWlmIChjcWUtJmd0O3JlcyA9PSAwICZhbXA7JmFtcDsgY3FlLSZndDtmbGFncyA9PSAwICZhbXA7JmFtcDsKJiM0MzsJICAgIGN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tjb25uX2lkeF0gPT0gMCkgewomIzQzOwkJY3R4LSZndDtucl9jb25ucy0tOwogCQlyZXR1cm47CiAJfQogCkBAIC0yODQsNTkgJiM0MzsyNzksMTcwIEBAIHN0YXRpYyB2b2lkIHByb2Nlc3NfcmVjdnpjKHN0cnVjdCBpb191cmluZyAqcmluZywgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlKQogCQllcnJvcigxLCAwLCAmIzM0O3JlY3Z6YygpOiAlZCYjMzQ7LCBjcWUtJmd0O3Jlcyk7CiAKIAlpZiAoY2ZnX29uZXNob3QpIHsKLQkJaWYgKGNxZS0mZ3Q7cmVzID09IDAgJmFtcDsmYW1wOyBjcWUtJmd0O2ZsYWdzID09IDAgJmFtcDsmYW1wOyBjZmdfb25lc2hvdF9yZWN2cykgewotCQkJYWRkX3JlY3Z6Y19vbmVzaG90KHJpbmcsIGNvbm5mZCwgcGFnZV9zaXplKTsKLQkJCWNmZ19vbmVzaG90X3JlY3ZzLS07CiYjNDM7CQlpZiAoY3FlLSZndDtyZXMgPT0gMCAmYW1wOyZhbXA7IGNxZS0mZ3Q7ZmxhZ3MgPT0gMCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgY3R4LSZndDtvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSkgewomIzQzOwkJCWFkZF9yZWN2emNfb25lc2hvdChjdHgsIGNvbm5faWR4LCBwYWdlX3NpemUpOwomIzQzOwkJCWN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tjb25uX2lkeF0tLTsKJiM0MzsJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgaWYgKCEoY3FlLSZndDtmbGFncyAmYW1wOyBJT1JJTkdfQ1FFX0ZfTU9SRSkpIHsKLQkJYWRkX3JlY3Z6YyhyaW5nLCBjb25uZmQpOwomIzQzOwkJYWRkX3JlY3Z6YyhjdHgsIGNvbm5faWR4KTsKIAl9CiAKIAlyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgJiM0MzsgMSk7CiAKIAluID0gY3FlLSZndDtyZXM7CiAJbWFzayA9ICgxVUxMICZsdDsmbHQ7IElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTsKLQlkYXRhID0gKGNoYXIgKilhcmVhX3B0ciAmIzQzOyAocmNxZS0mZ3Q7b2ZmICZhbXA7IG1hc2spOwomIzQzOwlkYXRhID0gKGNoYXIgKiljdHgtJmd0O2FyZWFfcHRyICYjNDM7IChyY3FlLSZndDtvZmYgJmFtcDsgbWFzayk7CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKCooZGF0YSAmIzQzOyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCAmIzQzOyBpKV0pCiYjNDM7CQlpZiAoKihkYXRhICYjNDM7IGkpICE9IHBheWxvYWRbKGN0eC0mZ3Q7cmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7IGkpXSkKIAkJCWVycm9yKDEsIDAsICYjMzQ7cGF5bG9hZCBtaXNtYXRjaCBhdCAlZCYjMzQ7LCBpKTsKIAl9Ci0JcmVjZWl2ZWQgJiM0Mzs9IG47CiYjNDM7CWN0eC0mZ3Q7cmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7PSBuOwogCi0JcnFlID0gJmFtcDtycV9yaW5nLnJxZXNbKHJxX3JpbmcucnFfdGFpbCAmYW1wOyBycV9tYXNrKV07Ci0JcnFlLSZndDtvZmYgPSAocmNxZS0mZ3Q7b2ZmICZhbXA7IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjsKJiM0MzsJcnFlID0gJmFtcDtjdHgtJmd0O3JxX3JpbmcucnFlc1soY3R4LSZndDtycV9yaW5nLnJxX3RhaWwgJmFtcDsgcnFfbWFzayldOwomIzQzOwlycWUtJmd0O29mZiA9IChyY3FlLSZndDtvZmYgJmFtcDsgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtJmd0O2FyZWFfdG9rZW47CiAJcnFlLSZndDtsZW4gPSBjcWUtJmd0O3JlczsKLQlpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShycV9yaW5nLmt0YWlsLCAmIzQzOyYjNDM7cnFfcmluZy5ycV90YWlsKTsKJiM0MzsJaW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LSZndDtycV9yaW5nLmt0YWlsLCAmIzQzOyYjNDM7Y3R4LSZndDtycV9yaW5nLnJxX3RhaWwpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiYjNDM7c3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IHRocmVhZF9jdHggKmN0eCkKIHsKIAlzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWU7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgaGVhZDsKLQlpbnQgaSwgcmV0OwogCi0JaW9fdXJpbmdfc3VibWl0X2FuZF93YWl0KHJpbmcsIDEpOwomIzQzOwlpb191cmluZ19zdWJtaXRfYW5kX3dhaXQoJmFtcDtjdHgtJmd0O3JpbmcsIDEpOwogCi0JaW9fdXJpbmdfZm9yX2VhY2hfY3FlKHJpbmcsIGhlYWQsIGNxZSkgewotCQlpZiAoY3FlLSZndDt1c2VyX2RhdGEgPT0gMSkKLQkJCXByb2Nlc3NfYWNjZXB0KHJpbmcsIGNxZSk7Ci0JCWVsc2UgaWYgKGNxZS0mZ3Q7dXNlcl9kYXRhID09IDIpCi0JCQlwcm9jZXNzX3JlY3Z6YyhyaW5nLCBjcWUpOwotCQllbHNlCi0JCQllcnJvcigxLCAwLCAmIzM0O3Vua25vd24gY3FlJiMzNDspOwomIzQzOwlpb191cmluZ19mb3JfZWFjaF9jcWUoJmFtcDtjdHgtJmd0O3JpbmcsIGhlYWQsIGNxZSkgewomIzQzOwkJcHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS0mZ3Q7dXNlcl9kYXRhKTsKIAkJY291bnQmIzQzOyYjNDM7OwogCX0KLQlpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTsKJiM0MzsJaW9fdXJpbmdfY3FfYWR2YW5jZSgmYW1wO2N0eC0mZ3Q7cmluZywgY291bnQpOwogfQogCi1zdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKQogewotCXVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0Jc3RydWN0IGlvX3VyaW5nIHJpbmc7Ci0JaW50IGZkLCBlbmFibGUsIHJldDsKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwYXJhbXMgPSB7IH07CiYjNDM7CXN0cnVjdCB0aHJlYWRfY3R4ICpjdHggPSBhcmc7CiAJdWludDY0X3QgdHN0b3A7CiYjNDM7CWludCBucl9jb25uczsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfQ09PUF9UQVNLUlVOOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NJTkdMRV9JU1NVRVI7CiYjNDM7CXBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjsKJiM0MzsJcGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TVUJNSVRfQUxMOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRRTMyOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTsKJiM0MzsJcGFyYW1zLmNxX2VudHJpZXMgPSBBUkVBX1NJWkUgLyBwYWdlX3NpemU7CiYjNDM7CiYjNDM7CWlvX3VyaW5nX3F1ZXVlX2luaXRfcGFyYW1zKDUxMiwgJmFtcDtjdHgtJmd0O3JpbmcsICZhbXA7cGFyYW1zKTsKJiM0MzsJc2V0dXBfemNyeChjdHgpOwomIzQzOwomIzQzOwlpZiAoY2ZnX2RyeV9ydW4pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LSZndDtzZXR1cF9kb25lKTsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LSZndDtkaXNwYXRjaF9kb25lKTsKJiM0MzsKJiM0MzsJbnJfY29ubnMgPSBjdHgtJmd0O25yX2Nvbm5zOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY3R4LSZndDtucl9jb25uczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChjZmdfb25lc2hvdCkgewomIzQzOwkJCWN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tpXSA9IGNmZ19vbmVzaG90X3JlY3ZzOwomIzQzOwkJCWFkZF9yZWN2emNfb25lc2hvdChjdHgsIGksIHBhZ2Vfc2l6ZSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWFkZF9yZWN2emMoY3R4LCBpKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwl0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7CiYjNDM7CXdoaWxlIChjdHgtJmd0O25yX2Nvbm5zICZndDsgMCAmYW1wOyZhbXA7IGdldHRpbWVvZmRheV9tcygpICZsdDsgdHN0b3ApCiYjNDM7CQlzZXJ2ZXJfbG9vcChjdHgpOwomIzQzOwomIzQzOwlpZiAoY3R4LSZndDtucl9jb25ucyAhPSAwKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDt0ZXN0IGZhaWxlZDogJWQgY29ubmVjdGlvbnMgaW5jb21wbGV0ZSYjMzQ7LAomIzQzOwkJICAgICAgY3R4LSZndDtucl9jb25ucyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9jb25uczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChjZmdfb25lc2hvdCkgewomIzQzOwkJCWlmICghY3R4LSZndDtyZWNlaXZlZFtpXSkKJiM0MzsJCQkJZXJyb3IoMSwgMCwgJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGEmIzM0OywgaSk7CiYjNDM7CQl9IGVsc2UgaWYgKGN0eC0mZ3Q7cmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7CiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkICV6dSBvZiAlZCBieXRlcyYjMzQ7LAomIzQzOwkJCSAgICAgIGksIGN0eC0mZ3Q7cmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHF1ZXJ5X25hcGlfaWQodW5zaWduZWQgaW50IGlmaW5kZXgsIGludCBxdWV1ZV9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRkZXZfcXVldWVfZ2V0X3JlcSAqcmVxOwomIzQzOwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yc3AgKnJzcDsKJiM0MzsJc3RydWN0IHlubF9lcnJvciB5ZXJyOwomIzQzOwlzdHJ1Y3QgeW5sX3NvY2sgKnlzOwomIzQzOwlpbnQgbmFwaV9pZDsKJiM0MzsKJiM0MzsJeXMgPSB5bmxfc29ja19jcmVhdGUoJmFtcDt5bmxfbmV0ZGV2X2ZhbWlseSwgJmFtcDt5ZXJyKTsKJiM0MzsJaWYgKCF5cykKJiM0MzsJCWVycm9yKDEsIDAsICYjMzQ7eW5sX3NvY2tfY3JlYXRlOiAlcyYjMzQ7LCB5ZXJyLm1zZyk7CiYjNDM7CiYjNDM7CXJlcSA9IG5ldGRldl9xdWV1ZV9nZXRfcmVxX2FsbG9jKCk7CiYjNDM7CW5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF9pZmluZGV4KHJlcSwgaWZpbmRleCk7CiYjNDM7CW5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF90eXBlKHJlcSwgTkVUREVWX1FVRVVFX1RZUEVfUlgpOwomIzQzOwluZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfaWQocmVxLCBxdWV1ZV9pZCk7CiYjNDM7CiYjNDM7CXJzcCA9IG5ldGRldl9xdWV1ZV9nZXQoeXMsIHJlcSk7CiYjNDM7CWlmICghcnNwKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDtuZXRkZXZfcXVldWVfZ2V0KHE9JWQpOiAlcyYjMzQ7LCBxdWV1ZV9pZCwKJiM0MzsJCSAgICAgIHlzLSZndDtlcnIubXNnKTsKJiM0MzsJaWYgKCFyc3AtJmd0O19wcmVzZW50Lm5hcGlfaWQpCiYjNDM7CQllcnJvcigxLCAwLCAmIzM0O25ldGRldl9xdWV1ZV9nZXQocT0lZCk6IG5hcGlfaWQgbm90IHByZXNlbnQmIzM0OywKJiM0MzsJCSAgICAgIHF1ZXVlX2lkKTsKJiM0MzsKJiM0MzsJbmFwaV9pZCA9IHJzcC0mZ3Q7bmFwaV9pZDsKJiM0MzsKJiM0MzsJbmV0ZGV2X3F1ZXVlX2dldF9yZXFfZnJlZShyZXEpOwomIzQzOwluZXRkZXZfcXVldWVfZ2V0X3JzcF9mcmVlKHJzcCk7CiYjNDM7CXlubF9zb2NrX2Rlc3Ryb3koeXMpOwomIzQzOwomIzQzOwlyZXR1cm4gbmFwaV9pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBmaW5kX3RocmVhZF9ieV9jb25uKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzLCBpbnQgY29ubmZkKQomIzQzO3sKJiM0MzsJc29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpOwomIzQzOwlpbnQgbmFwaV9pZCwgaTsKJiM0MzsKJiM0MzsJaWYgKGdldHNvY2tvcHQoY29ubmZkLCBTT0xfU09DS0VULCBTT19JTkNPTUlOR19OQVBJX0lELCAmYW1wO25hcGlfaWQsICZhbXA7bGVuKSkKJiM0MzsJCWVycm9yKDEsIGVycm5vLCAmIzM0O2dldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpCiYjNDM7CQkJcmV0dXJuIGk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyb3IoMSwgMCwgJiMzNDt1bmtub3duIE5BUEkgSUQ6ICVkJiMzNDssIG5hcGlfaWQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXB0aHJlYWRfYmFycmllcl90IHNldHVwX2RvbmUsIGRpc3BhdGNoX2RvbmU7CiYjNDM7CWludCB0b3RhbF9jb25ucywgYWNjZXB0ZWQgPSAwLCBjb25uZmQ7CiYjNDM7CXN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzOwomIzQzOwlpbnQgZmQsIHJldCwgZW5hYmxlLCBpOwomIzQzOwl1bnNpZ25lZCBpbnQgaWZpbmRleDsKJiM0MzsJcHRocmVhZF90ICp0aHJlYWRzOwomIzQzOwomIzQzOwljdHhzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCpjdHhzKSk7CiYjNDM7CXRocmVhZHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKnRocmVhZHMpKTsKJiM0MzsJaWYgKCFjdHhzIHx8ICF0aHJlYWRzKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDtjYWxsb2MoKSYjMzQ7KTsKIAogCWZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7CiAJaWYgKGZkID09IC0xKQpAQCAtMzUxLDMyICYjNDM7NDU3LDcxIEBAIHN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZCkKIAlpZiAocmV0ICZsdDsgMCkKIAkJZXJyb3IoMSwgMCwgJiMzNDtiaW5kKCkmIzM0Oyk7CiAKLQlmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ09PUF9UQVNLUlVOOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9TVUJNSVRfQUxMOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2luaXQoJmFtcDtzZXR1cF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgJiM0MzsgMSk7CiYjNDM7CXB0aHJlYWRfYmFycmllcl9pbml0KCZhbXA7ZGlzcGF0Y2hfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICYjNDM7IDEpOwogCi0JaW9fdXJpbmdfcXVldWVfaW5pdCg1MTIsICZhbXA7cmluZywgZmxhZ3MpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCAmIzQzOyBpOwomIzQzOwkJY3R4c1tpXS5zZXR1cF9kb25lID0gJmFtcDtzZXR1cF9kb25lOwomIzQzOwkJY3R4c1tpXS5kaXNwYXRjaF9kb25lID0gJmFtcDtkaXNwYXRjaF9kb25lOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsCiYjNDM7CQkJCSAgICAgc2VydmVyX3dvcmtlciwgJmFtcDtjdHhzW2ldKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJZXJyb3IoMSwgcmV0LCAmIzM0O3B0aHJlYWRfY3JlYXRlKCkmIzM0Oyk7CiYjNDM7CX0KIAotCXNldHVwX3pjcngoJmFtcDtyaW5nKTsKIAlpZiAoY2ZnX2RyeV9ydW4pCi0JCXJldHVybjsKJiM0MzsJCWdvdG8gam9pbjsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoJmFtcDtzZXR1cF9kb25lKTsKIAogCWlmIChsaXN0ZW4oZmQsIDEwMjQpICZsdDsgMCkKIAkJZXJyb3IoMSwgMCwgJiMzNDtsaXN0ZW4oKSYjMzQ7KTsKIAotCWFkZF9hY2NlcHQoJmFtcDtyaW5nLCBmZCk7CiYjNDM7CWlmIChjZmdfbnVtX3RocmVhZHMgJmd0OyAxKSB7CiYjNDM7CQlpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoY2ZnX2lmbmFtZSk7CiYjNDM7CQlpZiAoIWlmaW5kZXgpCiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzJiMzNDssIGNmZ19pZm5hbWUpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY3R4c1tpXS5uYXBpX2lkID0gcXVlcnlfbmFwaV9pZChpZmluZGV4LAomIzQzOwkJCQkJCQljdHhzW2ldLnF1ZXVlX2lkKTsKJiM0MzsJfQogCi0JdHN0b3AgPSBnZXR0aW1lb2ZkYXlfbXMoKSAmIzQzOyA1MDAwOwotCXdoaWxlICghc3RvcCAmYW1wOyZhbXA7IGdldHRpbWVvZmRheV9tcygpICZsdDsgdHN0b3ApCi0JCXNlcnZlcl9sb29wKCZhbXA7cmluZyk7CiYjNDM7CXRvdGFsX2Nvbm5zID0gY2ZnX251bV90aHJlYWRzICogY2ZnX251bV90aHJlYWRzOwomIzQzOwomIzQzOwl3aGlsZSAoYWNjZXB0ZWQgJmx0OyB0b3RhbF9jb25ucykgewomIzQzOwkJaW50IGlkeCA9IDA7CiYjNDM7CiYjNDM7CQljb25uZmQgPSBhY2NlcHQoZmQsIE5VTEwsIE5VTEwpOwomIzQzOwkJaWYgKGNvbm5mZCAmbHQ7IDApCiYjNDM7CQkJZXJyb3IoMSwgZXJybm8sICYjMzQ7YWNjZXB0KCkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlpZiAoY2ZnX251bV90aHJlYWRzICZndDsgMSkKJiM0MzsJCQlpZHggPSBmaW5kX3RocmVhZF9ieV9jb25uKGN0eHMsIGNvbm5mZCk7CiAKLQlpZiAoIXN0b3ApCi0JCWVycm9yKDEsIDAsICYjMzQ7dGVzdCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCWlmIChjdHhzW2lkeF0ubnJfY29ubnMgJmd0Oz0gTUFYX0NPTk5TX1BFUl9USFJFQUQpCiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDt3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvdyYjMzQ7LCBpZHgpOwomIzQzOwkJY3R4c1tpZHhdLmNvbm5mZHNbY3R4c1tpZHhdLm5yX2Nvbm5zJiM0MzsmIzQzO10gPSBjb25uZmQ7CiYjNDM7CQlhY2NlcHRlZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoJmFtcDtkaXNwYXRjaF9kb25lKTsKJiM0MzsKJiM0Mztqb2luOgomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykKJiM0MzsJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2Rlc3Ryb3koJmFtcDtzZXR1cF9kb25lKTsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2Rlc3Ryb3koJmFtcDtkaXNwYXRjaF9kb25lKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlmcmVlKHRocmVhZHMpOwomIzQzOwlmcmVlKGN0eHMpOwogfQogCi1zdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgKmNsaWVudF93b3JrZXIodm9pZCAqYXJnKQogewogCXNzaXplX3QgdG9fc2VuZCA9IGNmZ19zZW5kX3NpemU7CiAJc3NpemVfdCBzZW50ID0gMDsKQEAgLTQwMiwxMiAmIzQzOzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpCiAJfQogCiAJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnVuX2NsaWVudCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHRvdGFsX2Nvbm5zID0gY2ZnX251bV90aHJlYWRzICogY2ZnX251bV90aHJlYWRzOwomIzQzOwlwdGhyZWFkX3QgKnRocmVhZHM7CiYjNDM7CWludCBpLCByZXQ7CiYjNDM7CiYjNDM7CXRocmVhZHMgPSBjYWxsb2ModG90YWxfY29ubnMsIHNpemVvZigqdGhyZWFkcykpOwomIzQzOwlpZiAoIXRocmVhZHMpCiYjNDM7CQllcnJvcigxLCAwLCAmIzM0O2NhbGxvYygpJiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdG90YWxfY29ubnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQllcnJvcigxLCByZXQsICYjMzQ7cHRocmVhZF9jcmVhdGUoKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdG90YWxfY29ubnM7IGkmIzQzOyYjNDM7KQomIzQzOwkJcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwomIzQzOwomIzQzOwlmcmVlKHRocmVhZHMpOwogfQogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpmaWxlcGF0aCkKIHsKIAllcnJvcigxLCAwLCAmIzM0O1VzYWdlOiAlcyAoLTR8LTYpICgtc3wtYykgLWgmbHQ7c2VydmVyX2lwJmd0OyAtcCZsdDtwb3J0Jmd0OyAmIzM0OwotCQkgICAgJiMzNDstbCZsdDtwYXlsb2FkX3NpemUmZ3Q7IC1pJmx0O2lmbmFtZSZndDsgLXEmbHQ7cnhxX2lkJmd0OyYjMzQ7LCBmaWxlcGF0aCk7CiYjNDM7CQkgICAgJiMzNDstbCZsdDtwYXlsb2FkX3NpemUmZ3Q7IC1pJmx0O2lmbmFtZSZndDsgLXEmbHQ7cnhxX2lkJmd0OyAtdCZsdDtudW1fdGhyZWFkcyZndDsmIzM0OywKJiM0MzsJCSAgICBmaWxlcGF0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQpAQCAtNDI1LDcgJiM0Mzs1OTQsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJdXNhZ2UoYXJndlswXSk7CiAJY2ZnX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZCYjMzQ7KSkgIT0gLTEpIHsKJiM0MzsJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZHQ6JiMzNDspKSAhPSAtMSkgewogCQlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAmIzM5O3MmIzM5OzoKIAkJCWlmIChjZmdfY2xpZW50KQpAQCAtNDY2LDYgJiM0Mzs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJY2FzZSAmIzM5O2QmIzM5OzoKIAkJCWNmZ19kcnlfcnVuID0gdHJ1ZTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQljZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CiYjNDM7CQkJYnJlYWs7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKQEAgLTMwLDYgJiM0MzszMCwxMyBAQCBkZWYgY3JlYXRlX3Jzc19jdHgoY2ZnKToKICAgICByZXR1cm4gaW50KHZhbHVlcykKIAogCiYjNDM7ZGVmIGNyZWF0ZV9yc3NfY3R4X211bHRpKGNmZywgc3RhcnQsIGNvdW50KToKJiM0MzsgICAgJiMzNDsmIzM0OyYjMzQ7Q3JlYXRlIGFuIFJTUyBjb250ZXh0IHNwYW5uaW5nIGNvdW50IHF1ZXVlcyBmcm9tIHN0YXJ0LCByZXR1cm4gaXRzIElELiYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICBvdXRwdXQgPSBldGh0b29sKGYmIzM0Oy1YIHtjZmcuaWZuYW1lfSBjb250ZXh0IG5ldyBzdGFydCB7c3RhcnR9IGVxdWFsIHtjb3VudH0mIzM0Oykuc3Rkb3V0CiYjNDM7ICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJiMzOTtOZXcgUlNTIGNvbnRleHQgaXMgKFxkJiM0MzspJiMzOTssIG91dHB1dCkuZ3JvdXAoMSkKJiM0MzsgICAgcmV0dXJuIGludCh2YWx1ZXMpCiYjNDM7CiYjNDM7CiBkZWYgc2V0X2Zsb3dfcnVsZShjZmcpOgogICAgIG91dHB1dCA9IGV0aHRvb2woZiYjMzQ7LU4ge2NmZy5pZm5hbWV9IGZsb3ctdHlwZSB0Y3A2IGRzdC1wb3J0IHtjZmcucG9ydH0gYWN0aW9uIHtjZmcudGFyZ2V0fSYjMzQ7KS5zdGRvdXQKICAgICB2YWx1ZXMgPSByZS5zZWFyY2gociYjMzk7SUQgKFxkJiM0MzspJiMzOTssIG91dHB1dCkuZ3JvdXAoMSkKQEAgLTEyNywxNyAmIzQzOzEzNCw1NiBAQCBkZWYgX3JlcXVpcmVfbnR1cGxlKGNmZyk6CiAgICAgICAgIGRlZmVyKGV0aHRvb2wsIGYmIzM0Oy1LIHtjZmcuaWZuYW1lfSBudHVwbGUtZmlsdGVycyBvZmYmIzM0OykKIAogCiYjNDM7ZGVmIHJzc19tdWx0aXF1ZXVlKGNmZyk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1N0ZWVyIHRoZSB0ZXN0IGZsb3cgdG8gYSBtdWx0aS1xdWV1ZSBSU1MgY29udGV4dCBmb3IgbXVsdGktdGhyZWFkIHpjcnguJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIGNoYW5uZWxzID0gY2ZnLmV0aG5sLmNoYW5uZWxzX2dldCh7JiMzOTtoZWFkZXImIzM5OzogeyYjMzk7ZGV2LWluZGV4JiMzOTs6IGNmZy5pZmluZGV4fX0pCiYjNDM7ICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJiMzOTtjb21iaW5lZC1jb3VudCYjMzk7XQomIzQzOyAgICBpZiBjaGFubmVscyAmbHQ7IDM6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzk7VGVzdCByZXF1aXJlcyBORVRJRiB3aXRoIGF0IGxlYXN0IDMgY29tYmluZWQgY2hhbm5lbHMmIzM5OykKJiM0MzsKJiM0MzsgICAgcmluZ3MgPSBjZmcuZXRobmwucmluZ3NfZ2V0KHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fSkKJiM0MzsgICAgcnhfcmluZ3MgPSByaW5nc1smIzM5O3J4JiMzOTtdCiYjNDM7ICAgIGhkc190aHJlc2ggPSByaW5ncy5nZXQoJiMzOTtoZHMtdGhyZXNoJiMzOTssIDApCiYjNDM7CiYjNDM7ICAgIGNmZy5ldGhubC5yaW5nc19zZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7dGNwLWRhdGEtc3BsaXQmIzM5OzogJiMzOTtlbmFibGVkJiMzOTssCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7aGRzLXRocmVzaCYjMzk7OiAwLAomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IDY0fSkKJiM0MzsgICAgZGVmZXIoY2ZnLmV0aG5sLnJpbmdzX3NldCwgeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3RjcC1kYXRhLXNwbGl0JiMzOTs6ICYjMzk7dW5rbm93biYjMzk7LAomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IGhkc190aHJlc2gsCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IHJ4X3JpbmdzfSkKJiM0MzsgICAgZGVmZXIobXBfY2xlYXJfd2FpdCwgY2ZnKQomIzQzOwomIzQzOyAgICBjZmcubnVtX3RocmVhZHMgPSAyCiYjNDM7ICAgIGNmZy50YXJnZXQgPSBjaGFubmVscyAtIGNmZy5udW1fdGhyZWFkcwomIzQzOyAgICBldGh0b29sKGYmIzM0Oy1YIHtjZmcuaWZuYW1lfSBlcXVhbCB7Y2ZnLnRhcmdldH0mIzM0OykKJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZiYjMzQ7LVgge2NmZy5pZm5hbWV9IGRlZmF1bHQmIzM0OykKJiM0MzsKJiM0MzsgICAgcnNzX2N0eF9pZCA9IGNyZWF0ZV9yc3NfY3R4X211bHRpKGNmZywgY2ZnLnRhcmdldCwgY2ZnLm51bV90aHJlYWRzKQomIzQzOyAgICBkZWZlcihldGh0b29sLCBmJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZGVsZXRlIGNvbnRleHQge3Jzc19jdHhfaWR9JiMzNDspCiYjNDM7CiYjNDM7ICAgIGZsb3dfcnVsZV9pZCA9IHNldF9mbG93X3J1bGVfcnNzKGNmZywgcnNzX2N0eF9pZCkKJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZiYjMzQ7LU4ge2NmZy5pZm5hbWV9IGRlbGV0ZSB7Zmxvd19ydWxlX2lkfSYjMzQ7KQomIzQzOwomIzQzOwogQGtzZnRfdmFyaWFudHMoWwogICAgIEtzZnROYW1lZFZhcmlhbnQoJiMzNDtzaW5nbGUmIzM0Oywgc2luZ2xlKSwKICAgICBLc2Z0TmFtZWRWYXJpYW50KCYjMzQ7cnNzJiMzNDssIHJzcyksCiYjNDM7ICAgIEtzZnROYW1lZFZhcmlhbnQoJiMzNDtyc3NfbXVsdGlxdWV1ZSYjMzQ7LCByc3NfbXVsdGlxdWV1ZSksCiBdKQogZGVmIHRlc3RfemNyeChjZmcsIHNldHVwKSAtJmd0OyBOb25lOgogICAgIGNmZy5yZXF1aXJlX2lwdmVyKCYjMzk7NiYjMzk7KQogICAgIF9yZXF1aXJlX250dXBsZShjZmcpCiAKJiM0MzsgICAgY2ZnLm51bV90aHJlYWRzID0gMQomIzQzOwogICAgIHNldHVwKGNmZykKLSAgICByeF9jbWQgPSBmJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9JiMzNDsKLSAgICB0eF9jbWQgPSBmJiMzNDt7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92WyYjMzk7NiYjMzk7XX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MCYjMzQ7CiYjNDM7CiYjNDM7ICAgIHJ4X2NtZCA9IChmJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gJiMzNDsKJiM0MzsgICAgICAgICAgICAgIGYmIzM0Oy1xIHtjZmcudGFyZ2V0fSAtdCB7Y2ZnLm51bV90aHJlYWRzfSYjMzQ7KQomIzQzOyAgICB0eF9jbWQgPSAoZiYjMzQ7e2NmZy5iaW5fcmVtb3RlfSAtYyAtaCB7Y2ZnLmFkZHJfdlsmIzM5OzYmIzM5O119IC1wIHtjZmcucG9ydH0gJiMzNDsKJiM0MzsgICAgICAgICAgICAgIGYmIzM0Oy1sIDEyODQwIC10IHtjZmcubnVtX3RocmVhZHN9JiMzNDspCiAgICAgd2l0aCBia2cocnhfY21kLCBleGl0X3dhaXQ9VHJ1ZSk6CiAgICAgICAgIHdhaXRfcG9ydF9saXN0ZW4oY2ZnLnBvcnQsIHByb3RvPSYjMzQ7dGNwJiMzNDspCiAgICAgICAgIGNtZCh0eF9jbWQsIGhvc3Q9Y2ZnLnJlbW90ZSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE3NTMKCQkJCQkJCW91dHB1dDogNzMKCQkJCQkJCXRob3VnaHRzOiA0NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBEZWNpc2lvbjogTm8gRnV6emluZyBOZWVkZWQqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kIGRlY2lkZSBpZiBpdCYjMzk7cyB3b3J0aCB0aGUgZnV6emluZyBlZmZvcnQuIE15IGluaXRpYWwgc2NhbiBpbmRpY2F0ZXMgdGhlIGZpbGVzIG1vZGlmaWVkIGFyZTogYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlYCwgYGlvdS16Y3J4LmNgLCBhbmQgYGlvdS16Y3J4LnB5YC4gQmFzZWQgb24gU2VjdGlvbiAyIG9mIHRoZSBjcml0ZXJpYSwgaXQgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBuby1nbywgYnV0IGxldCYjMzk7cyBiZSB0aG9yb3VnaC4KClRoZSBjcnVjaWFsIHBhcnQgaGVyZSBpcyB0aGUgJiMzNDtXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UmIzM0OyBzZWN0aW9uLiBJdCYjMzk7cyBwcmV0dHkgY2xlYXI6IHdlIG9ubHkgc2tpcCBmdXp6aW5nIGlmIGFsbCBjaGFuZ2VzIGZhbGwgaW50byBzcGVjaWZpYyBjYXRlZ29yaWVzLiBUaGUga2V5IHBvaW50IGhlcmUgaXMgdGhhdCB3ZSBoYXZlIG1vZGlmaWNhdGlvbnMgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9gIGRpcmVjdG9yeS4gVGhhdCYjMzk7cyBhIHN0cm9uZyBpbmRpY2F0b3IsIGFzIGB0b29scy9gIGlzIGRlc2lnbmF0ZWQgZm9yIHVzZXItc3BhY2Ugc3R1ZmYuIFdlIG5lZWQgdG8gY29uZmlybSBpdCBkb2VzbiYjMzk7dCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBhbnkga2VybmVsIG1vZHVsZXMuCgpJIG5lZWQgdG8gY29uZmlybSB0aGUgZmlsZXMgdGhlbXNlbHZlcyBhcmUgbm9uLWtlcm5lbC4gQSBxdWljayBzYW5pdHkgY2hlY2sgb2YgdGhlIGZpbGVzIGludm9sdmVkIGNvbmZpcm1zIHRoYXQgdGhleSByZXNpZGUgZW50aXJlbHkgd2l0aGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBObyBjb3JlIGtlcm5lbCBjb2RlIGlzIHRvdWNoZWQsIGZyb20gd2hhdCBJJiMzOTttIHNlZWluZy4KClNvLCBzdW1taW5nIGl0IHVwLCBteSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkLiBUaGUgcGF0Y2ggKm9ubHkqIG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIHVuZGVyIGB0b29scy9gLCBhbmQgaXQgZGVmaW5pdGVseSBkb2VzbiYjMzk7dCB0b3VjaCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUmIzM5O3Mgbm8gbmVlZCB0byBkZWZpbmUgYEZvY3VzU3ltYm9sc2Agb3IgYEVuYWJsZUNvbmZpZ3NgIHNpbmNlIHdlIGFyZW4mIzM5O3QgZnV6emluZyB0aGlzLgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI2LjQ3Njg3NzI0NVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MDA5NzY4MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI2LjQ3Njg4MjYzNloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI2MDc5Nzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhN1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIFNlcCA5IDIwOjU3OjI1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGVcXG5pbmRleCBiZDNiOGQyZmE0N2UwLi44YWViZGM2ZmViMTc3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGVcXG5AQCAtMTgsMTAgKzE4LDYgQEAgZWxzZVxcbiAkKHdhcm5pbmcgZXhjbHVkaW5nIGlvdXJpbmcgdGVzdHMsIGxpYnVyaW5nIG5vdCBpbnN0YWxsZWQgb3IgdG9vIG9sZClcXG4gZW5kaWZcXG4gXFxuLVRFU1RfR0VOX0ZJTEVTIDo9IFxcXFxcXG4tXFx0JChDT05EX0dFTl9GSUxFUykgXFxcXFxcbi0jIGVuZCBvZiBURVNUX0dFTl9GSUxFU1xcbi1cXG4gVEVTVF9QUk9HUyA9IFxcXFxcXG4gXFx0Y3N1bS5weSBcXFxcXFxuIFxcdGRldmxpbmtfcmF0ZV9jcm9zc19lc3cucHkgXFxcXFxcbkBAIC04MCw2ICs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXFxcXFxcbiBZTkxfR0VOX0ZJTEVTIDo9IFxcXFxcXG4gXFx0bmNkZXZtZW0gXFxcXFxcbiBcXHR0b2VwbGl0eiBcXFxcXFxuK1xcdCQoQ09ORF9HRU5fRklMRVMpIFxcXFxcXG4gIyBlbmQgb2YgWU5MX0dFTl9GSUxFU1xcbiBURVNUX0dFTl9GSUxFUyArPSAkKFlOTF9HRU5fRklMRVMpXFxuIFRFU1RfR0VOX0ZJTEVTICs9ICQocGF0c3Vic3QgJS5jLCUubywkKHdpbGRjYXJkICouYnBmLmMpKVxcbkBAIC05Nyw1ICs5NCw1IEBAIGluY2x1ZGUgLi4vLi4vLi4vbmV0L3lubC5ta1xcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcXG4gXFxuIGlmZXEgKCQoSEFTX0lPVVJJTkdfWkNSWCkseSlcXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgKz0gLWx1cmluZ1xcbiskKE9VVFBVVCkvaW91LXpjcng6IExETElCUyArPSAtbHVyaW5nIC1scHRocmVhZFxcbiBlbmRpZlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xcbmluZGV4IGY2YThmYzVmYWMyNDEuLjkxYjAyNWE4NzcxZTEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcXG5AQCAtNCw2ICs0LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2Vycm9yLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGltaXRzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpbnQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuQEAgLTM3LDYgKzM4LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGlidXJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3lubC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwibmV0ZGV2LXVzZXIuaFxcXCJcXG4gXFxuICNkZWZpbmUgU0tJUF9DT0RFXFx0NDJcXG4gXFxuQEAgLTg1LDE2ICs4OCwyOSBAQCBzdGF0aWMgaW50IGNmZ19zZW5kX3NpemUgPSBTRU5EX1NJWkU7XFxuIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW42IGNmZ19hZGRyO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuO1xcbiBzdGF0aWMgYm9vbCBjZmdfZHJ5X3J1bjtcXG4rc3RhdGljIGludCBjZmdfbnVtX3RocmVhZHMgPSAxO1xcbiBcXG4gc3RhdGljIGNoYXIgKnBheWxvYWQ7XFxuLXN0YXRpYyB2b2lkICphcmVhX3B0cjtcXG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xcbi1zdGF0aWMgc2l6ZV90IHJpbmdfc2l6ZTtcXG4tc3RhdGljIHN0cnVjdCBpb191cmluZ196Y3J4X3JxIHJxX3Jpbmc7XFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XFxuLXN0YXRpYyBpbnQgY29ubmZkO1xcbi1zdGF0aWMgYm9vbCBzdG9wO1xcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xcbitcXG4rI2RlZmluZSBNQVhfQ09OTlNfUEVSX1RIUkVBRFxcdDY0XFxuK1xcbitzdHJ1Y3QgdGhyZWFkX2N0eCB7XFxuK1xcdHN0cnVjdCBpb191cmluZ1xcdFxcdHJpbmc7XFxuK1xcdHZvaWRcXHRcXHRcXHQqYXJlYV9wdHI7XFxuK1xcdHZvaWRcXHRcXHRcXHQqcmluZ19wdHI7XFxuK1xcdHNpemVfdFxcdFxcdFxcdHJpbmdfc2l6ZTtcXG4rXFx0c3RydWN0IGlvX3VyaW5nX3pjcnhfcnFcXHRycV9yaW5nO1xcbitcXHR1bnNpZ25lZCBsb25nXFx0XFx0YXJlYV90b2tlbjtcXG4rXFx0aW50XFx0XFx0XFx0cXVldWVfaWQ7XFxuK1xcdGludFxcdFxcdFxcdG5hcGlfaWQ7XFxuK1xcdHB0aHJlYWRfYmFycmllcl90XFx0KnNldHVwX2RvbmU7XFxuK1xcdHB0aHJlYWRfYmFycmllcl90XFx0KmRpc3BhdGNoX2RvbmU7XFxuK1xcbitcXHRpbnRcXHRcXHRcXHRjb25uZmRzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcXG4rXFx0c2l6ZV90XFx0XFx0XFx0cmVjZWl2ZWRbTUFYX0NPTk5TX1BFUl9USFJFQURdO1xcbitcXHRpbnRcXHRcXHRcXHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcXG4rXFx0aW50XFx0XFx0XFx0bnJfY29ubnM7XFxuK307XFxuIFxcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2ZkYXlfbXModm9pZClcXG4ge1xcbkBAIC0xMzIsMTYgKzE0OCwxNiBAQCBzdGF0aWMgaW5saW5lIHNpemVfdCBnZXRfcmVmaWxsX3Jpbmdfc2l6ZSh1bnNpZ25lZCBpbnQgcnFfZW50cmllcylcXG4ge1xcbiBcXHRzaXplX3Qgc2l6ZTtcXG4gXFxuLVxcdHJpbmdfc2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcXG4rXFx0c2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcXG4gXFx0LyogYWRkIHNwYWNlIGZvciB0aGUgaGVhZGVyIChoZWFkL3RhaWwvZXRjLikgKi9cXG4tXFx0cmluZ19zaXplICs9IHBhZ2Vfc2l6ZTtcXG4tXFx0cmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTtcXG4rXFx0c2l6ZSArPSBwYWdlX3NpemU7XFxuK1xcdHJldHVybiBBTElHTl9VUChzaXplLCBwYWdlX3NpemUpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcXG4rc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxcbiB7XFxuK1xcdHVuc2lnbmVkIGludCBycV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xcbiBcXHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcXG4tXFx0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSA0MDk2O1xcbiBcXHRpbnQgcmV0O1xcbiBcXG4gXFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xcbkBAIC0xNDksNTggKzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImJhZCBpbnRlcmZhY2UgbmFtZTogJXNcXFwiLCBjZmdfaWZuYW1lKTtcXG4gXFxuIFxcdGlmIChjZmdfcnhfYnVmX2xlbiBcXHUwMDI2XFx1MDAyNiBjZmdfcnhfYnVmX2xlbiAhPSBwYWdlX3NpemUpIHtcXG4tXFx0XFx0YXJlYV9wdHIgPSBtbWFwKE5VTEwsXFxuLVxcdFxcdFxcdFxcdEFSRUFfU0laRSxcXG4tXFx0XFx0XFx0XFx0UFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4tXFx0XFx0XFx0XFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcXG4tXFx0XFx0XFx0XFx0TUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsXFxuLVxcdFxcdFxcdFxcdC0xLFxcbi1cXHRcXHRcXHRcXHQwKTtcXG4tXFx0XFx0aWYgKGFyZWFfcHRyID09IE1BUF9GQUlMRUQpIHtcXG4rXFx0XFx0Y3R4LVxcdTAwM2VhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBBUkVBX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfFxcbitcXHRcXHRcXHRcXHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxcbitcXHRcXHRcXHRcXHQgICAgIC0xLFxcbitcXHRcXHRcXHRcXHQgICAgIDApO1xcbitcXHRcXHRpZiAoY3R4LVxcdTAwM2VhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7XFxuIFxcdFxcdFxcdHByaW50ZihcXFwiQ2FuJ3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xcXFxuXFxcIik7XFxuIFxcdFxcdFxcdGV4aXQoU0tJUF9DT0RFKTtcXG4gXFx0XFx0fVxcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4tXFx0XFx0XFx0XFx0QVJFQV9TSVpFLFxcbi1cXHRcXHRcXHRcXHRQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbi1cXHRcXHRcXHRcXHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuLVxcdFxcdFxcdFxcdDAsXFxuLVxcdFxcdFxcdFxcdDApO1xcbi1cXHRcXHRpZiAoYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Y3R4LVxcdTAwM2VhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBBUkVBX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdFxcdFxcdCAgICAgMCxcXG4rXFx0XFx0XFx0XFx0ICAgICAwKTtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcXG4gXFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcIm1tYXAoKTogemVybyBjb3B5IGFyZWFcXFwiKTtcXG4gXFx0fVxcbiBcXG4tXFx0cmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XFxuLVxcdHJpbmdfcHRyID0gbW1hcChOVUxMLFxcbi1cXHRcXHRcXHRyaW5nX3NpemUsXFxuLVxcdFxcdFxcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuLVxcdFxcdFxcdE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcXG4tXFx0XFx0XFx0MCxcXG4tXFx0XFx0XFx0MCk7XFxuK1xcdGN0eC1cXHUwMDNlcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XFxuK1xcdGN0eC1cXHUwMDNlcmluZ19wdHIgPSBtbWFwKE5VTEwsXFxuK1xcdFxcdFxcdCAgICAgY3R4LVxcdTAwM2VyaW5nX3NpemUsXFxuK1xcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdFxcdCAgICAgMCxcXG4rXFx0XFx0XFx0ICAgICAwKTtcXG4gXFxuIFxcdHN0cnVjdCBpb191cmluZ19yZWdpb25fZGVzYyByZWdpb25fcmVnID0ge1xcbi1cXHRcXHQuc2l6ZSA9IHJpbmdfc2l6ZSxcXG4tXFx0XFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylyaW5nX3B0cixcXG4rXFx0XFx0LnNpemUgPSBjdHgtXFx1MDAzZXJpbmdfc2l6ZSxcXG4rXFx0XFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZyljdHgtXFx1MDAzZXJpbmdfcHRyLFxcbiBcXHRcXHQuZmxhZ3MgPSBJT1JJTkdfTUVNX1JFR0lPTl9UWVBFX1VTRVIsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9hcmVhX3JlZyBhcmVhX3JlZyA9IHtcXG4tXFx0XFx0LmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpYXJlYV9wdHIsXFxuK1xcdFxcdC5hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cXHUwMDNlYXJlYV9wdHIsXFxuIFxcdFxcdC5sZW4gPSBBUkVBX1NJWkUsXFxuIFxcdFxcdC5mbGFncyA9IDAsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0ge1xcbiBcXHRcXHQuaWZfaWR4ID0gaWZpbmRleCxcXG4tXFx0XFx0LmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCxcXG4rXFx0XFx0LmlmX3J4cSA9IGN0eC1cXHUwMDNlcXVldWVfaWQsXFxuIFxcdFxcdC5ycV9lbnRyaWVzID0gcnFfZW50cmllcyxcXG4gXFx0XFx0LmFyZWFfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKVxcdTAwMjZhcmVhX3JlZyxcXG4gXFx0XFx0LnJlZ2lvbl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpXFx1MDAyNnJlZ2lvbl9yZWcsXFxuIFxcdFxcdC5yeF9idWZfbGVuID0gY2ZnX3J4X2J1Zl9sZW4sXFxuIFxcdH07XFxuIFxcbi1cXHRyZXQgPSBpb191cmluZ19yZWdpc3Rlcl9pZnEocmluZywgKHZvaWQgKilcXHUwMDI2cmVnKTtcXG4rXFx0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFxcdTAwMjZjdHgtXFx1MDAzZXJpbmcsICh2b2lkICopXFx1MDAyNnJlZyk7XFxuIFxcdGlmIChjZmdfcnhfYnVmX2xlbiBcXHUwMDI2XFx1MDAyNiAocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FT1BOT1RTVVBQIHx8XFxuIFxcdFxcdFxcdCAgICAgICByZXQgPT0gLUVSQU5HRSkpIHtcXG4gXFx0XFx0cHJpbnRmKFxcXCJMYXJnZSBjaHVua3MgYXJlIG5vdCBzdXBwb3J0ZWQgJWlcXFxcblxcXCIsIHJldCk7XFxuQEAgLTIwOSw3NCArMjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxcbiBcXHRcXHRlcnJvcigxLCAwLCBcXFwiaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCk6ICVkXFxcIiwgcmV0KTtcXG4gXFx0fVxcbiBcXG4tXFx0cnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLmhlYWQpO1xcbi1cXHRycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICsgcmVnLm9mZnNldHMudGFpbCk7XFxuLVxcdHJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLnJxZXMpO1xcbi1cXHRycV9yaW5nLnJxX3RhaWwgPSAwO1xcbi1cXHRycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xcbi1cXG4tXFx0YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIGFkZF9hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxcbi17XFxuLVxcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcXG4tXFxuLVxcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXFx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMuaGVhZCk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXFx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMudGFpbCk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKWN0eC1cXHUwMDNlcmluZ19wdHIgKyByZWcub2Zmc2V0cy5ycWVzKTtcXG4rXFx0Y3R4LVxcdTAwM2VycV9yaW5nLnJxX3RhaWwgPSAwO1xcbitcXHRjdHgtXFx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzID0gcmVnLnJxX2VudHJpZXM7XFxuIFxcbi1cXHRpb191cmluZ19wcmVwX2FjY2VwdChzcWUsIHNvY2tmZCwgTlVMTCwgTlVMTCwgMCk7XFxuLVxcdHNxZS1cXHUwMDNldXNlcl9kYXRhID0gMTtcXG4rXFx0Y3R4LVxcdTAwM2VhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpXFxuK3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxcbiB7XFxuIFxcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcXG4gXFxuLVxcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XFxuK1xcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUoXFx1MDAyNmN0eC1cXHUwMDNlcmluZyk7XFxuIFxcbi1cXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgMCwgMCk7XFxuK1xcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVxcdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcXG4rXFx0XFx0XFx0IE5VTEwsIDAsIDApO1xcbiBcXHRzcWUtXFx1MDAzZWlvcHJpbyB8PSBJT1JJTkdfUkVDVl9NVUxUSVNIT1Q7XFxuLVxcdHNxZS1cXHUwMDNldXNlcl9kYXRhID0gMjtcXG4rXFx0c3FlLVxcdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCBpb191cmluZyAqcmluZywgaW50IHNvY2tmZCwgc2l6ZV90IGxlbilcXG4rc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbilcXG4ge1xcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XFxuIFxcbi1cXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xcbitcXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKFxcdTAwMjZjdHgtXFx1MDAzZXJpbmcpO1xcbiBcXG4tXFx0aW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBzb2NrZmQsIE5VTEwsIGxlbiwgMCk7XFxuK1xcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVxcdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcXG4rXFx0XFx0XFx0IE5VTEwsIGxlbiwgMCk7XFxuIFxcdHNxZS1cXHUwMDNlaW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDtcXG4tXFx0c3FlLVxcdTAwM2V1c2VyX2RhdGEgPSAyO1xcbitcXHRzcWUtXFx1MDAzZXVzZXJfZGF0YSA9IGNvbm5faWR4O1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBwcm9jZXNzX2FjY2VwdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSlcXG4rc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLFxcbitcXHRcXHRcXHQgICBpbnQgY29ubl9pZHgpXFxuIHtcXG4tXFx0aWYgKGNxZS1cXHUwMDNlcmVzIFxcdTAwM2MgMClcXG4tXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImFjY2VwdCgpXFxcIik7XFxuLVxcdGlmIChjb25uZmQpXFxuLVxcdFxcdGVycm9yKDEsIDAsIFxcXCJVbmV4cGVjdGVkIHNlY29uZCBjb25uZWN0aW9uXFxcIik7XFxuLVxcbi1cXHRjb25uZmQgPSBjcWUtXFx1MDAzZXJlcztcXG4tXFx0aWYgKGNmZ19vbmVzaG90KVxcbi1cXHRcXHRhZGRfcmVjdnpjX29uZXNob3QocmluZywgY29ubmZkLCBwYWdlX3NpemUpO1xcbi1cXHRlbHNlXFxuLVxcdFxcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXFxuLXtcXG4tXFx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcXG4rXFx0dW5zaWduZWQgaW50IHJxX21hc2sgPSBjdHgtXFx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcXG4gXFx0c3RydWN0IGlvX3VyaW5nX3pjcnhfY3FlICpyY3FlO1xcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKnJxZTtcXG4tXFx0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlO1xcbiBcXHR1aW50NjRfdCBtYXNrO1xcbiBcXHRjaGFyICpkYXRhO1xcbiBcXHRzc2l6ZV90IG47XFxuIFxcdGludCBpO1xcbiBcXG4tXFx0aWYgKGNxZS1cXHUwMDNlcmVzID09IDAgXFx1MDAyNlxcdTAwMjYgY3FlLVxcdTAwM2VmbGFncyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNmZ19vbmVzaG90X3JlY3ZzID09IDApIHtcXG4tXFx0XFx0c3RvcCA9IHRydWU7XFxuK1xcdGlmIChjcWUtXFx1MDAzZXJlcyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNxZS1cXHUwMDNlZmxhZ3MgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSA9PSAwKSB7XFxuK1xcdFxcdGN0eC1cXHUwMDNlbnJfY29ubnMtLTtcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcbkBAIC0yODQsNTkgKzI3OSwxNzAgQEAgc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXFxuIFxcdFxcdGVycm9yKDEsIDAsIFxcXCJyZWN2emMoKTogJWRcXFwiLCBjcWUtXFx1MDAzZXJlcyk7XFxuIFxcbiBcXHRpZiAoY2ZnX29uZXNob3QpIHtcXG4tXFx0XFx0aWYgKGNxZS1cXHUwMDNlcmVzID09IDAgXFx1MDAyNlxcdTAwMjYgY3FlLVxcdTAwM2VmbGFncyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNmZ19vbmVzaG90X3JlY3ZzKSB7XFxuLVxcdFxcdFxcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XFxuLVxcdFxcdFxcdGNmZ19vbmVzaG90X3JlY3ZzLS07XFxuK1xcdFxcdGlmIChjcWUtXFx1MDAzZXJlcyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNxZS1cXHUwMDNlZmxhZ3MgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSkge1xcbitcXHRcXHRcXHRhZGRfcmVjdnpjX29uZXNob3QoY3R4LCBjb25uX2lkeCwgcGFnZV9zaXplKTtcXG4rXFx0XFx0XFx0Y3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XS0tO1xcbitcXHRcXHRcXHRyZXR1cm47XFxuIFxcdFxcdH1cXG4gXFx0fSBlbHNlIGlmICghKGNxZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfQ1FFX0ZfTU9SRSkpIHtcXG4tXFx0XFx0YWRkX3JlY3Z6YyhyaW5nLCBjb25uZmQpO1xcbitcXHRcXHRhZGRfcmVjdnpjKGN0eCwgY29ubl9pZHgpO1xcbiBcXHR9XFxuIFxcbiBcXHRyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgKyAxKTtcXG4gXFxuIFxcdG4gPSBjcWUtXFx1MDAzZXJlcztcXG4gXFx0bWFzayA9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTtcXG4tXFx0ZGF0YSA9IChjaGFyICopYXJlYV9wdHIgKyAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgbWFzayk7XFxuK1xcdGRhdGEgPSAoY2hhciAqKWN0eC1cXHUwMDNlYXJlYV9wdHIgKyAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgbWFzayk7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKSB7XFxuLVxcdFxcdGlmICgqKGRhdGEgKyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCArIGkpXSlcXG4rXFx0XFx0aWYgKCooZGF0YSArIGkpICE9IHBheWxvYWRbKGN0eC1cXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICsgaSldKVxcbiBcXHRcXHRcXHRlcnJvcigxLCAwLCBcXFwicGF5bG9hZCBtaXNtYXRjaCBhdCAlZFxcXCIsIGkpO1xcbiBcXHR9XFxuLVxcdHJlY2VpdmVkICs9IG47XFxuK1xcdGN0eC1cXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICs9IG47XFxuIFxcbi1cXHRycWUgPSBcXHUwMDI2cnFfcmluZy5ycWVzWyhycV9yaW5nLnJxX3RhaWwgXFx1MDAyNiBycV9tYXNrKV07XFxuLVxcdHJxZS1cXHUwMDNlb2ZmID0gKHJjcWUtXFx1MDAzZW9mZiBcXHUwMDI2IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjtcXG4rXFx0cnFlID0gXFx1MDAyNmN0eC1cXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXFx1MDAzZXJxX3JpbmcucnFfdGFpbCBcXHUwMDI2IHJxX21hc2spXTtcXG4rXFx0cnFlLVxcdTAwM2VvZmYgPSAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtXFx1MDAzZWFyZWFfdG9rZW47XFxuIFxcdHJxZS1cXHUwMDNlbGVuID0gY3FlLVxcdTAwM2VyZXM7XFxuLVxcdGlvX3VyaW5nX3NtcF9zdG9yZV9yZWxlYXNlKHJxX3Jpbmcua3RhaWwsICsrcnFfcmluZy5ycV90YWlsKTtcXG4rXFx0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LVxcdTAwM2VycV9yaW5nLmt0YWlsLCArK2N0eC1cXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxcbitzdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHN0cnVjdCBpb191cmluZ19jcWUgKmNxZTtcXG4gXFx0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcXG4gXFx0dW5zaWduZWQgaW50IGhlYWQ7XFxuLVxcdGludCBpLCByZXQ7XFxuIFxcbi1cXHRpb191cmluZ19zdWJtaXRfYW5kX3dhaXQocmluZywgMSk7XFxuK1xcdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCAxKTtcXG4gXFxuLVxcdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShyaW5nLCBoZWFkLCBjcWUpIHtcXG4tXFx0XFx0aWYgKGNxZS1cXHUwMDNldXNlcl9kYXRhID09IDEpXFxuLVxcdFxcdFxcdHByb2Nlc3NfYWNjZXB0KHJpbmcsIGNxZSk7XFxuLVxcdFxcdGVsc2UgaWYgKGNxZS1cXHUwMDNldXNlcl9kYXRhID09IDIpXFxuLVxcdFxcdFxcdHByb2Nlc3NfcmVjdnpjKHJpbmcsIGNxZSk7XFxuLVxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcInVua25vd24gY3FlXFxcIik7XFxuK1xcdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBoZWFkLCBjcWUpIHtcXG4rXFx0XFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cXHUwMDNldXNlcl9kYXRhKTtcXG4gXFx0XFx0Y291bnQrKztcXG4gXFx0fVxcbi1cXHRpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTtcXG4rXFx0aW9fdXJpbmdfY3FfYWR2YW5jZShcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBjb3VudCk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcXG4rc3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKVxcbiB7XFxuLVxcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XFxuLVxcdHN0cnVjdCBpb191cmluZyByaW5nO1xcbi1cXHRpbnQgZmQsIGVuYWJsZSwgcmV0O1xcbitcXHRzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHBhcmFtcyA9IHsgfTtcXG4rXFx0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcXG4gXFx0dWludDY0X3QgdHN0b3A7XFxuK1xcdGludCBucl9jb25ucztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSO1xcbitcXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0RFRkVSX1RBU0tSVU47XFxuK1xcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUVNJWkU7XFxuK1xcdHBhcmFtcy5jcV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xcbitcXG4rXFx0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBcXHUwMDI2cGFyYW1zKTtcXG4rXFx0c2V0dXBfemNyeChjdHgpO1xcbitcXG4rXFx0aWYgKGNmZ19kcnlfcnVuKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KGN0eC1cXHUwMDNlc2V0dXBfZG9uZSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KGN0eC1cXHUwMDNlZGlzcGF0Y2hfZG9uZSk7XFxuK1xcbitcXHRucl9jb25ucyA9IGN0eC1cXHUwMDNlbnJfY29ubnM7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY3R4LVxcdTAwM2Vucl9jb25uczsgaSsrKSB7XFxuK1xcdFxcdGlmIChjZmdfb25lc2hvdCkge1xcbitcXHRcXHRcXHRjdHgtXFx1MDAzZW9uZXNob3RfcmVjdnNbaV0gPSBjZmdfb25lc2hvdF9yZWN2cztcXG4rXFx0XFx0XFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgaSwgcGFnZV9zaXplKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YWRkX3JlY3Z6YyhjdHgsIGkpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xcbitcXHR3aGlsZSAoY3R4LVxcdTAwM2Vucl9jb25ucyBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXFx1MDAzYyB0c3RvcClcXG4rXFx0XFx0c2VydmVyX2xvb3AoY3R4KTtcXG4rXFxuK1xcdGlmIChjdHgtXFx1MDAzZW5yX2Nvbm5zICE9IDApXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJ0ZXN0IGZhaWxlZDogJWQgY29ubmVjdGlvbnMgaW5jb21wbGV0ZVxcXCIsXFxuK1xcdFxcdCAgICAgIGN0eC1cXHUwMDNlbnJfY29ubnMpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2Nvbm5zOyBpKyspIHtcXG4rXFx0XFx0aWYgKGNmZ19vbmVzaG90KSB7XFxuK1xcdFxcdFxcdGlmICghY3R4LVxcdTAwM2VyZWNlaXZlZFtpXSlcXG4rXFx0XFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcImNvbm5lY3Rpb24gJWQgcmVjZWl2ZWQgbm8gZGF0YVxcXCIsIGkpO1xcbitcXHRcXHR9IGVsc2UgaWYgKGN0eC1cXHUwMDNlcmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7XFxuK1xcdFxcdFxcdGVycm9yKDEsIDAsIFxcXCJjb25uZWN0aW9uICVkIHJlY2VpdmVkICV6dSBvZiAlZCBieXRlc1xcXCIsXFxuK1xcdFxcdFxcdCAgICAgIGksIGN0eC1cXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHF1ZXJ5X25hcGlfaWQodW5zaWduZWQgaW50IGlmaW5kZXgsIGludCBxdWV1ZV9pZClcXG4re1xcbitcXHRzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yZXEgKnJlcTtcXG4rXFx0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcnNwICpyc3A7XFxuK1xcdHN0cnVjdCB5bmxfZXJyb3IgeWVycjtcXG4rXFx0c3RydWN0IHlubF9zb2NrICp5cztcXG4rXFx0aW50IG5hcGlfaWQ7XFxuK1xcbitcXHR5cyA9IHlubF9zb2NrX2NyZWF0ZShcXHUwMDI2eW5sX25ldGRldl9mYW1pbHksIFxcdTAwMjZ5ZXJyKTtcXG4rXFx0aWYgKCF5cylcXG4rXFx0XFx0ZXJyb3IoMSwgMCwgXFxcInlubF9zb2NrX2NyZWF0ZTogJXNcXFwiLCB5ZXJyLm1zZyk7XFxuK1xcbitcXHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfaWZpbmRleChyZXEsIGlmaW5kZXgpO1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfdHlwZShyZXEsIE5FVERFVl9RVUVVRV9UWVBFX1JYKTtcXG4rXFx0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xcbitcXG4rXFx0cnNwID0gbmV0ZGV2X3F1ZXVlX2dldCh5cywgcmVxKTtcXG4rXFx0aWYgKCFyc3ApXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJuZXRkZXZfcXVldWVfZ2V0KHE9JWQpOiAlc1xcXCIsIHF1ZXVlX2lkLFxcbitcXHRcXHQgICAgICB5cy1cXHUwMDNlZXJyLm1zZyk7XFxuK1xcdGlmICghcnNwLVxcdTAwM2VfcHJlc2VudC5uYXBpX2lkKVxcbitcXHRcXHRlcnJvcigxLCAwLCBcXFwibmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogbmFwaV9pZCBub3QgcHJlc2VudFxcXCIsXFxuK1xcdFxcdCAgICAgIHF1ZXVlX2lkKTtcXG4rXFxuK1xcdG5hcGlfaWQgPSByc3AtXFx1MDAzZW5hcGlfaWQ7XFxuK1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9mcmVlKHJlcSk7XFxuK1xcdG5ldGRldl9xdWV1ZV9nZXRfcnNwX2ZyZWUocnNwKTtcXG4rXFx0eW5sX3NvY2tfZGVzdHJveSh5cyk7XFxuK1xcbitcXHRyZXR1cm4gbmFwaV9pZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX3RocmVhZF9ieV9jb25uKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzLCBpbnQgY29ubmZkKVxcbit7XFxuK1xcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoaW50KTtcXG4rXFx0aW50IG5hcGlfaWQsIGk7XFxuK1xcbitcXHRpZiAoZ2V0c29ja29wdChjb25uZmQsIFNPTF9TT0NLRVQsIFNPX0lOQ09NSU5HX05BUElfSUQsIFxcdTAwMjZuYXBpX2lkLCBcXHUwMDI2bGVuKSlcXG4rXFx0XFx0ZXJyb3IoMSwgZXJybm8sIFxcXCJnZXRzb2Nrb3B0KFNPX0lOQ09NSU5HX05BUElfSUQpXFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0aWYgKGN0eHNbaV0ubmFwaV9pZCA9PSBuYXBpX2lkKVxcbitcXHRcXHRcXHRyZXR1cm4gaTtcXG4rXFx0fVxcbitcXG4rXFx0ZXJyb3IoMSwgMCwgXFxcInVua25vd24gTkFQSSBJRDogJWRcXFwiLCBuYXBpX2lkKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXFxuK3tcXG4rXFx0cHRocmVhZF9iYXJyaWVyX3Qgc2V0dXBfZG9uZSwgZGlzcGF0Y2hfZG9uZTtcXG4rXFx0aW50IHRvdGFsX2Nvbm5zLCBhY2NlcHRlZCA9IDAsIGNvbm5mZDtcXG4rXFx0c3RydWN0IHRocmVhZF9jdHggKmN0eHM7XFxuK1xcdGludCBmZCwgcmV0LCBlbmFibGUsIGk7XFxuK1xcdHVuc2lnbmVkIGludCBpZmluZGV4O1xcbitcXHRwdGhyZWFkX3QgKnRocmVhZHM7XFxuK1xcbitcXHRjdHhzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCpjdHhzKSk7XFxuK1xcdHRocmVhZHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKnRocmVhZHMpKTtcXG4rXFx0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxcbitcXHRcXHRlcnJvcigxLCAwLCBcXFwiY2FsbG9jKClcXFwiKTtcXG4gXFxuIFxcdGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XFxuIFxcdGlmIChmZCA9PSAtMSlcXG5AQCAtMzUxLDMyICs0NTcsNzEgQEAgc3RhdGljIHZvaWQgcnVuX3NlcnZlcih2b2lkKVxcbiBcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImJpbmQoKVxcXCIpO1xcbiBcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NJTkdMRV9JU1NVRVI7XFxuLVxcdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xcbi1cXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRRTMyO1xcbitcXHRwdGhyZWFkX2JhcnJpZXJfaW5pdChcXHUwMDI2c2V0dXBfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICsgMSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl9pbml0KFxcdTAwMjZkaXNwYXRjaF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgKyAxKTtcXG4gXFxuLVxcdGlvX3VyaW5nX3F1ZXVlX2luaXQoNTEyLCBcXHUwMDI2cmluZywgZmxhZ3MpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0Y3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCArIGk7XFxuK1xcdFxcdGN0eHNbaV0uc2V0dXBfZG9uZSA9IFxcdTAwMjZzZXR1cF9kb25lO1xcbitcXHRcXHRjdHhzW2ldLmRpc3BhdGNoX2RvbmUgPSBcXHUwMDI2ZGlzcGF0Y2hfZG9uZTtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLFxcbitcXHRcXHRcXHRcXHQgICAgIHNlcnZlcl93b3JrZXIsIFxcdTAwMjZjdHhzW2ldKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0ZXJyb3IoMSwgcmV0LCBcXFwicHRocmVhZF9jcmVhdGUoKVxcXCIpO1xcbitcXHR9XFxuIFxcbi1cXHRzZXR1cF96Y3J4KFxcdTAwMjZyaW5nKTtcXG4gXFx0aWYgKGNmZ19kcnlfcnVuKVxcbi1cXHRcXHRyZXR1cm47XFxuK1xcdFxcdGdvdG8gam9pbjtcXG4rXFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KFxcdTAwMjZzZXR1cF9kb25lKTtcXG4gXFxuIFxcdGlmIChsaXN0ZW4oZmQsIDEwMjQpIFxcdTAwM2MgMClcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImxpc3RlbigpXFxcIik7XFxuIFxcbi1cXHRhZGRfYWNjZXB0KFxcdTAwMjZyaW5nLCBmZCk7XFxuK1xcdGlmIChjZmdfbnVtX3RocmVhZHMgXFx1MDAzZSAxKSB7XFxuK1xcdFxcdGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTtcXG4rXFx0XFx0aWYgKCFpZmluZGV4KVxcbitcXHRcXHRcXHRlcnJvcigxLCAwLCBcXFwiYmFkIGludGVyZmFjZSBuYW1lOiAlc1xcXCIsIGNmZ19pZm5hbWUpO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspXFxuK1xcdFxcdFxcdGN0eHNbaV0ubmFwaV9pZCA9IHF1ZXJ5X25hcGlfaWQoaWZpbmRleCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0Y3R4c1tpXS5xdWV1ZV9pZCk7XFxuK1xcdH1cXG4gXFxuLVxcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xcbi1cXHR3aGlsZSAoIXN0b3AgXFx1MDAyNlxcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXFx1MDAzYyB0c3RvcClcXG4tXFx0XFx0c2VydmVyX2xvb3AoXFx1MDAyNnJpbmcpO1xcbitcXHR0b3RhbF9jb25ucyA9IGNmZ19udW1fdGhyZWFkcyAqIGNmZ19udW1fdGhyZWFkcztcXG4rXFxuK1xcdHdoaWxlIChhY2NlcHRlZCBcXHUwMDNjIHRvdGFsX2Nvbm5zKSB7XFxuK1xcdFxcdGludCBpZHggPSAwO1xcbitcXG4rXFx0XFx0Y29ubmZkID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTtcXG4rXFx0XFx0aWYgKGNvbm5mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGVycm9yKDEsIGVycm5vLCBcXFwiYWNjZXB0KClcXFwiKTtcXG4rXFxuK1xcdFxcdGlmIChjZmdfbnVtX3RocmVhZHMgXFx1MDAzZSAxKVxcbitcXHRcXHRcXHRpZHggPSBmaW5kX3RocmVhZF9ieV9jb25uKGN0eHMsIGNvbm5mZCk7XFxuIFxcbi1cXHRpZiAoIXN0b3ApXFxuLVxcdFxcdGVycm9yKDEsIDAsIFxcXCJ0ZXN0IGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdGlmIChjdHhzW2lkeF0ubnJfY29ubnMgXFx1MDAzZT0gTUFYX0NPTk5TX1BFUl9USFJFQUQpXFxuK1xcdFxcdFxcdGVycm9yKDEsIDAsIFxcXCJ3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvd1xcXCIsIGlkeCk7XFxuK1xcdFxcdGN0eHNbaWR4XS5jb25uZmRzW2N0eHNbaWR4XS5ucl9jb25ucysrXSA9IGNvbm5mZDtcXG4rXFx0XFx0YWNjZXB0ZWQrKztcXG4rXFx0fVxcbitcXG4rXFx0cHRocmVhZF9iYXJyaWVyX3dhaXQoXFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xcbitcXG4ram9pbjpcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKVxcbitcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcbitcXHRwdGhyZWFkX2JhcnJpZXJfZGVzdHJveShcXHUwMDI2c2V0dXBfZG9uZSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFxcdTAwMjZkaXNwYXRjaF9kb25lKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRmcmVlKHRocmVhZHMpO1xcbitcXHRmcmVlKGN0eHMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXFxuK3N0YXRpYyB2b2lkICpjbGllbnRfd29ya2VyKHZvaWQgKmFyZylcXG4ge1xcbiBcXHRzc2l6ZV90IHRvX3NlbmQgPSBjZmdfc2VuZF9zaXplO1xcbiBcXHRzc2l6ZV90IHNlbnQgPSAwO1xcbkBAIC00MDIsMTIgKzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXFxuIFxcdH1cXG4gXFxuIFxcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcXG4re1xcbitcXHRpbnQgdG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XFxuK1xcdHB0aHJlYWRfdCAqdGhyZWFkcztcXG4rXFx0aW50IGksIHJldDtcXG4rXFxuK1xcdHRocmVhZHMgPSBjYWxsb2ModG90YWxfY29ubnMsIHNpemVvZigqdGhyZWFkcykpO1xcbitcXHRpZiAoIXRocmVhZHMpXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJjYWxsb2MoKVxcXCIpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRvdGFsX2Nvbm5zOyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gcHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRlcnJvcigxLCByZXQsIFxcXCJwdGhyZWFkX2NyZWF0ZSgpXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0b3RhbF9jb25uczsgaSsrKVxcbitcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcbitcXHRmcmVlKHRocmVhZHMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpmaWxlcGF0aClcXG4ge1xcbiBcXHRlcnJvcigxLCAwLCBcXFwiVXNhZ2U6ICVzICgtNHwtNikgKC1zfC1jKSAtaFxcdTAwM2NzZXJ2ZXJfaXBcXHUwMDNlIC1wXFx1MDAzY3BvcnRcXHUwMDNlIFxcXCJcXG4tXFx0XFx0ICAgIFxcXCItbFxcdTAwM2NwYXlsb2FkX3NpemVcXHUwMDNlIC1pXFx1MDAzY2lmbmFtZVxcdTAwM2UgLXFcXHUwMDNjcnhxX2lkXFx1MDAzZVxcXCIsIGZpbGVwYXRoKTtcXG4rXFx0XFx0ICAgIFxcXCItbFxcdTAwM2NwYXlsb2FkX3NpemVcXHUwMDNlIC1pXFx1MDAzY2lmbmFtZVxcdTAwM2UgLXFcXHUwMDNjcnhxX2lkXFx1MDAzZSAtdFxcdTAwM2NudW1fdGhyZWFkc1xcdTAwM2VcXFwiLFxcbitcXHRcXHQgICAgZmlsZXBhdGgpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcXG5AQCAtNDI1LDcgKzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR1c2FnZShhcmd2WzBdKTtcXG4gXFx0Y2ZnX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuO1xcbiBcXG4tXFx0d2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJzY2g6cDpsOmk6cTpvOno6eDpkXFxcIikpICE9IC0xKSB7XFxuK1xcdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcXFwic2NoOnA6bDppOnE6bzp6Ong6ZHQ6XFxcIikpICE9IC0xKSB7XFxuIFxcdFxcdHN3aXRjaCAoYykge1xcbiBcXHRcXHRjYXNlICdzJzpcXG4gXFx0XFx0XFx0aWYgKGNmZ19jbGllbnQpXFxuQEAgLTQ2Niw2ICs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0Y2FzZSAnZCc6XFxuIFxcdFxcdFxcdGNmZ19kcnlfcnVuID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHRjZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHlcXG5pbmRleCBiN2EyMjVmZTRiZWFlLi5jODMzNTM1ZDhhMDNjIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHlcXG5AQCAtMzAsNiArMzAsMTMgQEAgZGVmIGNyZWF0ZV9yc3NfY3R4KGNmZyk6XFxuICAgICByZXR1cm4gaW50KHZhbHVlcylcXG4gXFxuIFxcbitkZWYgY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBzdGFydCwgY291bnQpOlxcbisgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIFJTUyBjb250ZXh0IHNwYW5uaW5nIGNvdW50IHF1ZXVlcyBmcm9tIHN0YXJ0LCByZXR1cm4gaXRzIElELlxcXCJcXFwiXFxcIlxcbisgICAgb3V0cHV0ID0gZXRodG9vbChmXFxcIi1YIHtjZmcuaWZuYW1lfSBjb250ZXh0IG5ldyBzdGFydCB7c3RhcnR9IGVxdWFsIHtjb3VudH1cXFwiKS5zdGRvdXRcXG4rICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJ05ldyBSU1MgY29udGV4dCBpcyAoXFxcXGQrKScsIG91dHB1dCkuZ3JvdXAoMSlcXG4rICAgIHJldHVybiBpbnQodmFsdWVzKVxcbitcXG4rXFxuIGRlZiBzZXRfZmxvd19ydWxlKGNmZyk6XFxuICAgICBvdXRwdXQgPSBldGh0b29sKGZcXFwiLU4ge2NmZy5pZm5hbWV9IGZsb3ctdHlwZSB0Y3A2IGRzdC1wb3J0IHtjZmcucG9ydH0gYWN0aW9uIHtjZmcudGFyZ2V0fVxcXCIpLnN0ZG91dFxcbiAgICAgdmFsdWVzID0gcmUuc2VhcmNoKHInSUQgKFxcXFxkKyknLCBvdXRwdXQpLmdyb3VwKDEpXFxuQEAgLTEyNywxNyArMTM0LDU2IEBAIGRlZiBfcmVxdWlyZV9udHVwbGUoY2ZnKTpcXG4gICAgICAgICBkZWZlcihldGh0b29sLCBmXFxcIi1LIHtjZmcuaWZuYW1lfSBudHVwbGUtZmlsdGVycyBvZmZcXFwiKVxcbiBcXG4gXFxuK2RlZiByc3NfbXVsdGlxdWV1ZShjZmcpOlxcbisgICAgXFxcIlxcXCJcXFwiU3RlZXIgdGhlIHRlc3QgZmxvdyB0byBhIG11bHRpLXF1ZXVlIFJTUyBjb250ZXh0IGZvciBtdWx0aS10aHJlYWQgemNyeC5cXFwiXFxcIlxcXCJcXG4rICAgIGNoYW5uZWxzID0gY2ZnLmV0aG5sLmNoYW5uZWxzX2dldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9fSlcXG4rICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJ2NvbWJpbmVkLWNvdW50J11cXG4rICAgIGlmIGNoYW5uZWxzIFxcdTAwM2MgMzpcXG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCdUZXN0IHJlcXVpcmVzIE5FVElGIHdpdGggYXQgbGVhc3QgMyBjb21iaW5lZCBjaGFubmVscycpXFxuK1xcbisgICAgcmluZ3MgPSBjZmcuZXRobmwucmluZ3NfZ2V0KHsnaGVhZGVyJzogeydkZXYtaW5kZXgnOiBjZmcuaWZpbmRleH19KVxcbisgICAgcnhfcmluZ3MgPSByaW5nc1sncngnXVxcbisgICAgaGRzX3RocmVzaCA9IHJpbmdzLmdldCgnaGRzLXRocmVzaCcsIDApXFxuK1xcbisgICAgY2ZnLmV0aG5sLnJpbmdzX3NldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjcC1kYXRhLXNwbGl0JzogJ2VuYWJsZWQnLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiAwLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogNjR9KVxcbisgICAgZGVmZXIoY2ZnLmV0aG5sLnJpbmdzX3NldCwgeydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fSxcXG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGNwLWRhdGEtc3BsaXQnOiAndW5rbm93bicsXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiBoZHNfdGhyZXNoLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyeCc6IHJ4X3JpbmdzfSlcXG4rICAgIGRlZmVyKG1wX2NsZWFyX3dhaXQsIGNmZylcXG4rXFxuKyAgICBjZmcubnVtX3RocmVhZHMgPSAyXFxuKyAgICBjZmcudGFyZ2V0ID0gY2hhbm5lbHMgLSBjZmcubnVtX3RocmVhZHNcXG4rICAgIGV0aHRvb2woZlxcXCItWCB7Y2ZnLmlmbmFtZX0gZXF1YWwge2NmZy50YXJnZXR9XFxcIilcXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcXFwiLVgge2NmZy5pZm5hbWV9IGRlZmF1bHRcXFwiKVxcbitcXG4rICAgIHJzc19jdHhfaWQgPSBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIGNmZy50YXJnZXQsIGNmZy5udW1fdGhyZWFkcylcXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcXFwiLVgge2NmZy5pZm5hbWV9IGRlbGV0ZSBjb250ZXh0IHtyc3NfY3R4X2lkfVxcXCIpXFxuK1xcbisgICAgZmxvd19ydWxlX2lkID0gc2V0X2Zsb3dfcnVsZV9yc3MoY2ZnLCByc3NfY3R4X2lkKVxcbisgICAgZGVmZXIoZXRodG9vbCwgZlxcXCItTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XFxcIilcXG4rXFxuK1xcbiBAa3NmdF92YXJpYW50cyhbXFxuICAgICBLc2Z0TmFtZWRWYXJpYW50KFxcXCJzaW5nbGVcXFwiLCBzaW5nbGUpLFxcbiAgICAgS3NmdE5hbWVkVmFyaWFudChcXFwicnNzXFxcIiwgcnNzKSxcXG4rICAgIEtzZnROYW1lZFZhcmlhbnQoXFxcInJzc19tdWx0aXF1ZXVlXFxcIiwgcnNzX211bHRpcXVldWUpLFxcbiBdKVxcbiBkZWYgdGVzdF96Y3J4KGNmZywgc2V0dXApIC1cXHUwMDNlIE5vbmU6XFxuICAgICBjZmcucmVxdWlyZV9pcHZlcignNicpXFxuICAgICBfcmVxdWlyZV9udHVwbGUoY2ZnKVxcbiBcXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDFcXG4rXFxuICAgICBzZXR1cChjZmcpXFxuLSAgICByeF9jbWQgPSBmXFxcIntjZmcuYmluX2xvY2FsfSAtcyAtcCB7Y2ZnLnBvcnR9IC1pIHtjZmcuaWZuYW1lfSAtcSB7Y2ZnLnRhcmdldH1cXFwiXFxuLSAgICB0eF9jbWQgPSBmXFxcIntjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJzYnXX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MFxcXCJcXG4rXFxuKyAgICByeF9jbWQgPSAoZlxcXCJ7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gXFxcIlxcbisgICAgICAgICAgICAgIGZcXFwiLXEge2NmZy50YXJnZXR9IC10IHtjZmcubnVtX3RocmVhZHN9XFxcIilcXG4rICAgIHR4X2NtZCA9IChmXFxcIntjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJzYnXX0gLXAge2NmZy5wb3J0fSBcXFwiXFxuKyAgICAgICAgICAgICAgZlxcXCItbCAxMjg0MCAtdCB7Y2ZnLm51bV90aHJlYWRzfVxcXCIpXFxuICAgICB3aXRoIGJrZyhyeF9jbWQsIGV4aXRfd2FpdD1UcnVlKTpcXG4gICAgICAgICB3YWl0X3BvcnRfbGlzdGVuKGNmZy5wb3J0LCBwcm90bz1cXFwidGNwXFxcIilcXG4gICAgICAgICBjbWQodHhfY21kLCBob3N0PWNmZy5yZW1vdGUpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI3LjAwMzczMTMxNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6Mzg3NDEwOTYwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM5ZDQ2YzgxZjEyNTcwN2UzOTAxNWRkYmM1ZDU2MTdiNjlmNGJhYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDIwOjU3OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuaW5kZXggYmQzYjhkMmZhNDdlMC4uOGFlYmRjNmZlYjE3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuQEAgLTE4LDEwICsxOCw2IEBAIGVsc2VcbiAkKHdhcm5pbmcgZXhjbHVkaW5nIGlvdXJpbmcgdGVzdHMsIGxpYnVyaW5nIG5vdCBpbnN0YWxsZWQgb3IgdG9vIG9sZClcbiBlbmRpZlxuIFxuLVRFU1RfR0VOX0ZJTEVTIDo9IFxcXG4tXHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuLSMgZW5kIG9mIFRFU1RfR0VOX0ZJTEVTXG4tXG4gVEVTVF9QUk9HUyA9IFxcXG4gXHRjc3VtLnB5IFxcXG4gXHRkZXZsaW5rX3JhdGVfY3Jvc3NfZXN3LnB5IFxcXG5AQCAtODAsNiArNzYsNyBAQCBURVNUX0lOQ0xVREVTIDo9IFxcXG4gWU5MX0dFTl9GSUxFUyA6PSBcXFxuIFx0bmNkZXZtZW0gXFxcbiBcdHRvZXBsaXR6IFxcXG4rXHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuICMgZW5kIG9mIFlOTF9HRU5fRklMRVNcbiBURVNUX0dFTl9GSUxFUyArPSAkKFlOTF9HRU5fRklMRVMpXG4gVEVTVF9HRU5fRklMRVMgKz0gJChwYXRzdWJzdCAlLmMsJS5vLCQod2lsZGNhcmQgKi5icGYuYykpXG5AQCAtOTcsNSArOTQsNSBAQCBpbmNsdWRlIC4uLy4uLy4uL25ldC95bmwubWtcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcbiBcbiBpZmVxICgkKEhBU19JT1VSSU5HX1pDUlgpLHkpXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgKz0gLWx1cmluZ1xuKyQoT1VUUFVUKS9pb3UtemNyeDogTERMSUJTICs9IC1sdXJpbmcgLWxwdGhyZWFkXG4gZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xuaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbkBAIC00LDYgKzQsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2Vycm9yLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0zNyw2ICszOCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY2xpYnVyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N5bmwuaFx1MDAzZVxuKyNpbmNsdWRlIFwibmV0ZGV2LXVzZXIuaFwiXG4gXG4gI2RlZmluZSBTS0lQX0NPREVcdDQyXG4gXG5AQCAtODUsMTYgKzg4LDI5IEBAIHN0YXRpYyBpbnQgY2ZnX3NlbmRfc2l6ZSA9IFNFTkRfU0laRTtcbiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luNiBjZmdfYWRkcjtcbiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuO1xuIHN0YXRpYyBib29sIGNmZ19kcnlfcnVuO1xuK3N0YXRpYyBpbnQgY2ZnX251bV90aHJlYWRzID0gMTtcbiBcbiBzdGF0aWMgY2hhciAqcGF5bG9hZDtcbi1zdGF0aWMgdm9pZCAqYXJlYV9wdHI7XG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xuLXN0YXRpYyBzaXplX3QgcmluZ19zaXplO1xuLXN0YXRpYyBzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycSBycV9yaW5nO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XG4tc3RhdGljIGludCBjb25uZmQ7XG4tc3RhdGljIGJvb2wgc3RvcDtcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xuK1xuKyNkZWZpbmUgTUFYX0NPTk5TX1BFUl9USFJFQURcdDY0XG4rXG4rc3RydWN0IHRocmVhZF9jdHgge1xuK1x0c3RydWN0IGlvX3VyaW5nXHRcdHJpbmc7XG4rXHR2b2lkXHRcdFx0KmFyZWFfcHRyO1xuK1x0dm9pZFx0XHRcdCpyaW5nX3B0cjtcbitcdHNpemVfdFx0XHRcdHJpbmdfc2l6ZTtcbitcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxXHRycV9yaW5nO1xuK1x0dW5zaWduZWQgbG9uZ1x0XHRhcmVhX3Rva2VuO1xuK1x0aW50XHRcdFx0cXVldWVfaWQ7XG4rXHRpbnRcdFx0XHRuYXBpX2lkO1xuK1x0cHRocmVhZF9iYXJyaWVyX3RcdCpzZXR1cF9kb25lO1xuK1x0cHRocmVhZF9iYXJyaWVyX3RcdCpkaXNwYXRjaF9kb25lO1xuK1xuK1x0aW50XHRcdFx0Y29ubmZkc1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07XG4rXHRzaXplX3RcdFx0XHRyZWNlaXZlZFtNQVhfQ09OTlNfUEVSX1RIUkVBRF07XG4rXHRpbnRcdFx0XHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbitcdGludFx0XHRcdG5yX2Nvbm5zO1xuK307XG4gXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dGltZW9mZGF5X21zKHZvaWQpXG4ge1xuQEAgLTEzMiwxNiArMTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKVxuIHtcbiBcdHNpemVfdCBzaXplO1xuIFxuLVx0cmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpO1xuK1x0c2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcbiBcdC8qIGFkZCBzcGFjZSBmb3IgdGhlIGhlYWRlciAoaGVhZC90YWlsL2V0Yy4pICovXG4tXHRyaW5nX3NpemUgKz0gcGFnZV9zaXplO1xuLVx0cmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTtcbitcdHNpemUgKz0gcGFnZV9zaXplO1xuK1x0cmV0dXJuIEFMSUdOX1VQKHNpemUsIHBhZ2Vfc2l6ZSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuK3N0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IHRocmVhZF9jdHggKmN0eClcbiB7XG4rXHR1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTtcbiBcdHVuc2lnbmVkIGludCBpZmluZGV4O1xuLVx0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSA0MDk2O1xuIFx0aW50IHJldDtcbiBcbiBcdGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTtcbkBAIC0xNDksNTggKzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcbiBcdFx0ZXJyb3IoMSwgMCwgXCJiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCIsIGNmZ19pZm5hbWUpO1xuIFxuIFx0aWYgKGNmZ19yeF9idWZfbGVuIFx1MDAyNlx1MDAyNiBjZmdfcnhfYnVmX2xlbiAhPSBwYWdlX3NpemUpIHtcbi1cdFx0YXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0XHRBUkVBX1NJWkUsXG4tXHRcdFx0XHRQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuLVx0XHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcbi1cdFx0XHRcdE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuLVx0XHRcdFx0LTEsXG4tXHRcdFx0XHQwKTtcbi1cdFx0aWYgKGFyZWFfcHRyID09IE1BUF9GQUlMRUQpIHtcbitcdFx0Y3R4LVx1MDAzZWFyZWFfcHRyID0gbW1hcChOVUxMLFxuK1x0XHRcdFx0ICAgICBBUkVBX1NJWkUsXG4rXHRcdFx0XHQgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8XG4rXHRcdFx0XHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuK1x0XHRcdFx0ICAgICAtMSxcbitcdFx0XHRcdCAgICAgMCk7XG4rXHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRCkge1xuIFx0XHRcdHByaW50ZihcIkNhbid0IGFsbG9jYXRlIGh1Z2UgcGFnZXNcXG5cIik7XG4gXHRcdFx0ZXhpdChTS0lQX0NPREUpO1xuIFx0XHR9XG4gXHR9IGVsc2Uge1xuLVx0XHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcbi1cdFx0XHRcdEFSRUFfU0laRSxcbi1cdFx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0XHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXG4tXHRcdFx0XHQwLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuK1x0XHRjdHgtXHUwMDNlYXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4rXHRcdFx0XHQgICAgIEFSRUFfU0laRSxcbitcdFx0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuK1x0XHRcdFx0ICAgICAwLFxuK1x0XHRcdFx0ICAgICAwKTtcbitcdFx0aWYgKGN0eC1cdTAwM2VhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuIFx0XHRcdGVycm9yKDEsIDAsIFwibW1hcCgpOiB6ZXJvIGNvcHkgYXJlYVwiKTtcbiBcdH1cbiBcbi1cdHJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuLVx0cmluZ19wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0cmluZ19zaXplLFxuLVx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuLVx0XHRcdDAsXG4tXHRcdFx0MCk7XG4rXHRjdHgtXHUwMDNlcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XG4rXHRjdHgtXHUwMDNlcmluZ19wdHIgPSBtbWFwKE5VTEwsXG4rXHRcdFx0ICAgICBjdHgtXHUwMDNlcmluZ19zaXplLFxuK1x0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbitcdFx0XHQgICAgIDAsXG4rXHRcdFx0ICAgICAwKTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ19yZWdpb25fZGVzYyByZWdpb25fcmVnID0ge1xuLVx0XHQuc2l6ZSA9IHJpbmdfc2l6ZSxcbi1cdFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylyaW5nX3B0cixcbitcdFx0LnNpemUgPSBjdHgtXHUwMDNlcmluZ19zaXplLFxuK1x0XHQudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VyaW5nX3B0cixcbiBcdFx0LmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2FyZWFfcmVnIGFyZWFfcmVnID0ge1xuLVx0XHQuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylhcmVhX3B0cixcbitcdFx0LmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpY3R4LVx1MDAzZWFyZWFfcHRyLFxuIFx0XHQubGVuID0gQVJFQV9TSVpFLFxuIFx0XHQuZmxhZ3MgPSAwLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCB0X2lvX3VyaW5nX3pjcnhfaWZxX3JlZyByZWcgPSB7XG4gXHRcdC5pZl9pZHggPSBpZmluZGV4LFxuLVx0XHQuaWZfcnhxID0gY2ZnX3F1ZXVlX2lkLFxuK1x0XHQuaWZfcnhxID0gY3R4LVx1MDAzZXF1ZXVlX2lkLFxuIFx0XHQucnFfZW50cmllcyA9IHJxX2VudHJpZXMsXG4gXHRcdC5hcmVhX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylcdTAwMjZhcmVhX3JlZyxcbiBcdFx0LnJlZ2lvbl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpXHUwMDI2cmVnaW9uX3JlZyxcbiBcdFx0LnJ4X2J1Zl9sZW4gPSBjZmdfcnhfYnVmX2xlbixcbiBcdH07XG4gXG4tXHRyZXQgPSBpb191cmluZ19yZWdpc3Rlcl9pZnEocmluZywgKHZvaWQgKilcdTAwMjZyZWcpO1xuK1x0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4gXHRpZiAoY2ZnX3J4X2J1Zl9sZW4gXHUwMDI2XHUwMDI2IChyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVPUE5PVFNVUFAgfHxcbiBcdFx0XHQgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7XG4gXHRcdHByaW50ZihcIkxhcmdlIGNodW5rcyBhcmUgbm90IHN1cHBvcnRlZCAlaVxcblwiLCByZXQpO1xuQEAgLTIwOSw3NCArMjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcImlvX3VyaW5nX3JlZ2lzdGVyX2lmcSgpOiAlZFwiLCByZXQpO1xuIFx0fVxuIFxuLVx0cnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLmhlYWQpO1xuLVx0cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLnRhaWwpO1xuLVx0cnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKXJpbmdfcHRyICsgcmVnLm9mZnNldHMucnFlcyk7XG4tXHRycV9yaW5nLnJxX3RhaWwgPSAwO1xuLVx0cnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllcztcbi1cbi1cdGFyZWFfdG9rZW4gPSBhcmVhX3JlZy5ycV9hcmVhX3Rva2VuO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBhZGRfYWNjZXB0KHN0cnVjdCBpb191cmluZyAqcmluZywgaW50IHNvY2tmZClcbi17XG4tXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XG4tXG4tXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xuK1x0Y3R4LVx1MDAzZXJxX3Jpbmcua2hlYWQgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMuaGVhZCk7XG4rXHRjdHgtXHUwMDNlcnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXHUwMDNlcmluZ19wdHIgKyByZWcub2Zmc2V0cy50YWlsKTtcbitcdGN0eC1cdTAwM2VycV9yaW5nLnJxZXMgPSAoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMucnFlcyk7XG4rXHRjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsID0gMDtcbitcdGN0eC1cdTAwM2VycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xuIFxuLVx0aW9fdXJpbmdfcHJlcF9hY2NlcHQoc3FlLCBzb2NrZmQsIE5VTEwsIE5VTEwsIDApO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDE7XG4rXHRjdHgtXHUwMDNlYXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxuK3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4rXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKFx1MDAyNmN0eC1cdTAwM2VyaW5nKTtcbiBcbi1cdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgc29ja2ZkLCBOVUxMLCAwLCAwKTtcbitcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVx1MDAzZWNvbm5mZHNbY29ubl9pZHhdLFxuK1x0XHRcdCBOVUxMLCAwLCAwKTtcbiBcdHNxZS1cdTAwM2Vpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDI7XG4rXHRzcWUtXHUwMDNldXNlcl9kYXRhID0gY29ubl9pZHg7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGFkZF9yZWN2emNfb25lc2hvdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQsIHNpemVfdCBsZW4pXG4rc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbilcbiB7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XG4gXG4tXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xuK1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgbGVuLCAwKTtcbitcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVx1MDAzZWNvbm5mZHNbY29ubl9pZHhdLFxuK1x0XHRcdCBOVUxMLCBsZW4sIDApO1xuIFx0c3FlLVx1MDAzZWlvcHJpbyB8PSBJT1JJTkdfUkVDVl9NVUxUSVNIT1Q7XG4tXHRzcWUtXHUwMDNldXNlcl9kYXRhID0gMjtcbitcdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4rc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLFxuK1x0XHRcdCAgIGludCBjb25uX2lkeClcbiB7XG4tXHRpZiAoY3FlLVx1MDAzZXJlcyBcdTAwM2MgMClcbi1cdFx0ZXJyb3IoMSwgMCwgXCJhY2NlcHQoKVwiKTtcbi1cdGlmIChjb25uZmQpXG4tXHRcdGVycm9yKDEsIDAsIFwiVW5leHBlY3RlZCBzZWNvbmQgY29ubmVjdGlvblwiKTtcbi1cbi1cdGNvbm5mZCA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpZiAoY2ZnX29uZXNob3QpXG4tXHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRlbHNlXG4tXHRcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4te1xuLVx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbitcdHVuc2lnbmVkIGludCBycV9tYXNrID0gY3R4LVx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqcmNxZTtcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqcnFlO1xuLVx0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlO1xuIFx0dWludDY0X3QgbWFzaztcbiBcdGNoYXIgKmRhdGE7XG4gXHRzc2l6ZV90IG47XG4gXHRpbnQgaTtcbiBcbi1cdGlmIChjcWUtXHUwMDNlcmVzID09IDAgXHUwMDI2XHUwMDI2IGNxZS1cdTAwM2VmbGFncyA9PSAwIFx1MDAyNlx1MDAyNiBjZmdfb25lc2hvdF9yZWN2cyA9PSAwKSB7XG4tXHRcdHN0b3AgPSB0cnVlO1xuK1x0aWYgKGNxZS1cdTAwM2VyZXMgPT0gMCBcdTAwMjZcdTAwMjYgY3FlLVx1MDAzZWZsYWdzID09IDAgXHUwMDI2XHUwMDI2XG4rXHQgICAgY3R4LVx1MDAzZW9uZXNob3RfcmVjdnNbY29ubl9pZHhdID09IDApIHtcbitcdFx0Y3R4LVx1MDAzZW5yX2Nvbm5zLS07XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbkBAIC0yODQsNTkgKzI3OSwxNzAgQEAgc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4gXHRcdGVycm9yKDEsIDAsIFwicmVjdnpjKCk6ICVkXCIsIGNxZS1cdTAwM2VyZXMpO1xuIFxuIFx0aWYgKGNmZ19vbmVzaG90KSB7XG4tXHRcdGlmIChjcWUtXHUwMDNlcmVzID09IDAgXHUwMDI2XHUwMDI2IGNxZS1cdTAwM2VmbGFncyA9PSAwIFx1MDAyNlx1MDAyNiBjZmdfb25lc2hvdF9yZWN2cykge1xuLVx0XHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRcdFx0Y2ZnX29uZXNob3RfcmVjdnMtLTtcbitcdFx0aWYgKGNxZS1cdTAwM2VyZXMgPT0gMCBcdTAwMjZcdTAwMjYgY3FlLVx1MDAzZWZsYWdzID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0pIHtcbitcdFx0XHRhZGRfcmVjdnpjX29uZXNob3QoY3R4LCBjb25uX2lkeCwgcGFnZV9zaXplKTtcbitcdFx0XHRjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0tLTtcbitcdFx0XHRyZXR1cm47XG4gXHRcdH1cbiBcdH0gZWxzZSBpZiAoIShjcWUtXHUwMDNlZmxhZ3MgXHUwMDI2IElPUklOR19DUUVfRl9NT1JFKSkge1xuLVx0XHRhZGRfcmVjdnpjKHJpbmcsIGNvbm5mZCk7XG4rXHRcdGFkZF9yZWN2emMoY3R4LCBjb25uX2lkeCk7XG4gXHR9XG4gXG4gXHRyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgKyAxKTtcbiBcbiBcdG4gPSBjcWUtXHUwMDNlcmVzO1xuIFx0bWFzayA9ICgxVUxMIFx1MDAzY1x1MDAzYyBJT1JJTkdfWkNSWF9BUkVBX1NISUZUKSAtIDE7XG4tXHRkYXRhID0gKGNoYXIgKilhcmVhX3B0ciArIChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4rXHRkYXRhID0gKGNoYXIgKiljdHgtXHUwMDNlYXJlYV9wdHIgKyAocmNxZS1cdTAwM2VvZmYgXHUwMDI2IG1hc2spO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4tXHRcdGlmICgqKGRhdGEgKyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCArIGkpXSlcbitcdFx0aWYgKCooZGF0YSArIGkpICE9IHBheWxvYWRbKGN0eC1cdTAwM2VyZWNlaXZlZFtjb25uX2lkeF0gKyBpKV0pXG4gXHRcdFx0ZXJyb3IoMSwgMCwgXCJwYXlsb2FkIG1pc21hdGNoIGF0ICVkXCIsIGkpO1xuIFx0fVxuLVx0cmVjZWl2ZWQgKz0gbjtcbitcdGN0eC1cdTAwM2VyZWNlaXZlZFtjb25uX2lkeF0gKz0gbjtcbiBcbi1cdHJxZSA9IFx1MDAyNnJxX3JpbmcucnFlc1socnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4tXHRycWUtXHUwMDNlb2ZmID0gKHJjcWUtXHUwMDNlb2ZmIFx1MDAyNiB+SU9SSU5HX1pDUlhfQVJFQV9NQVNLKSB8IGFyZWFfdG9rZW47XG4rXHRycWUgPSBcdTAwMjZjdHgtXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4rXHRycWUtXHUwMDNlb2ZmID0gKHJjcWUtXHUwMDNlb2ZmIFx1MDAyNiB+SU9SSU5HX1pDUlhfQVJFQV9NQVNLKSB8IGN0eC1cdTAwM2VhcmVhX3Rva2VuO1xuIFx0cnFlLVx1MDAzZWxlbiA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShycV9yaW5nLmt0YWlsLCArK3JxX3JpbmcucnFfdGFpbCk7XG4rXHRpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShjdHgtXHUwMDNlcnFfcmluZy5rdGFpbCwgKytjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuK3N0YXRpYyB2b2lkIHNlcnZlcl9sb29wKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgpXG4ge1xuIFx0c3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlO1xuIFx0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdHVuc2lnbmVkIGludCBoZWFkO1xuLVx0aW50IGksIHJldDtcbiBcbi1cdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChyaW5nLCAxKTtcbitcdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChcdTAwMjZjdHgtXHUwMDNlcmluZywgMSk7XG4gXG4tXHRpb191cmluZ19mb3JfZWFjaF9jcWUocmluZywgaGVhZCwgY3FlKSB7XG4tXHRcdGlmIChjcWUtXHUwMDNldXNlcl9kYXRhID09IDEpXG4tXHRcdFx0cHJvY2Vzc19hY2NlcHQocmluZywgY3FlKTtcbi1cdFx0ZWxzZSBpZiAoY3FlLVx1MDAzZXVzZXJfZGF0YSA9PSAyKVxuLVx0XHRcdHByb2Nlc3NfcmVjdnpjKHJpbmcsIGNxZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRlcnJvcigxLCAwLCBcInVua25vd24gY3FlXCIpO1xuK1x0aW9fdXJpbmdfZm9yX2VhY2hfY3FlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBoZWFkLCBjcWUpIHtcbitcdFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cdTAwM2V1c2VyX2RhdGEpO1xuIFx0XHRjb3VudCsrO1xuIFx0fVxuLVx0aW9fdXJpbmdfY3FfYWR2YW5jZShyaW5nLCBjb3VudCk7XG4rXHRpb191cmluZ19jcV9hZHZhbmNlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBjb3VudCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbitzdGF0aWMgdm9pZCAqc2VydmVyX3dvcmtlcih2b2lkICphcmcpXG4ge1xuLVx0dW5zaWduZWQgaW50IGZsYWdzID0gMDtcbi1cdHN0cnVjdCBpb191cmluZyByaW5nO1xuLVx0aW50IGZkLCBlbmFibGUsIHJldDtcbitcdHN0cnVjdCBpb191cmluZ19wYXJhbXMgcGFyYW1zID0geyB9O1xuK1x0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcbiBcdHVpbnQ2NF90IHRzdG9wO1xuK1x0aW50IG5yX2Nvbm5zO1xuK1x0aW50IGk7XG4rXG4rXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4rXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTtcbitcdHBhcmFtcy5jcV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xuK1xuK1x0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcdTAwMjZjdHgtXHUwMDNlcmluZywgXHUwMDI2cGFyYW1zKTtcbitcdHNldHVwX3pjcngoY3R4KTtcbitcbitcdGlmIChjZmdfZHJ5X3J1bilcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlc2V0dXBfZG9uZSk7XG4rXHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlZGlzcGF0Y2hfZG9uZSk7XG4rXG4rXHRucl9jb25ucyA9IGN0eC1cdTAwM2Vucl9jb25ucztcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGN0eC1cdTAwM2Vucl9jb25uczsgaSsrKSB7XG4rXHRcdGlmIChjZmdfb25lc2hvdCkge1xuK1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2ldID0gY2ZnX29uZXNob3RfcmVjdnM7XG4rXHRcdFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgaSwgcGFnZV9zaXplKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRhZGRfcmVjdnpjKGN0eCwgaSk7XG4rXHRcdH1cbitcdH1cbitcbitcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xuK1x0d2hpbGUgKGN0eC1cdTAwM2Vucl9jb25ucyBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXHUwMDNjIHRzdG9wKVxuK1x0XHRzZXJ2ZXJfbG9vcChjdHgpO1xuK1xuK1x0aWYgKGN0eC1cdTAwM2Vucl9jb25ucyAhPSAwKVxuK1x0XHRlcnJvcigxLCAwLCBcInRlc3QgZmFpbGVkOiAlZCBjb25uZWN0aW9ucyBpbmNvbXBsZXRlXCIsXG4rXHRcdCAgICAgIGN0eC1cdTAwM2Vucl9jb25ucyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jb25uczsgaSsrKSB7XG4rXHRcdGlmIChjZmdfb25lc2hvdCkge1xuK1x0XHRcdGlmICghY3R4LVx1MDAzZXJlY2VpdmVkW2ldKVxuK1x0XHRcdFx0ZXJyb3IoMSwgMCwgXCJjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGFcIiwgaSk7XG4rXHRcdH0gZWxzZSBpZiAoY3R4LVx1MDAzZXJlY2VpdmVkW2ldICE9IChzaXplX3QpY2ZnX3NlbmRfc2l6ZSkge1xuK1x0XHRcdGVycm9yKDEsIDAsIFwiY29ubmVjdGlvbiAlZCByZWNlaXZlZCAlenUgb2YgJWQgYnl0ZXNcIixcbitcdFx0XHQgICAgICBpLCBjdHgtXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBxdWVyeV9uYXBpX2lkKHVuc2lnbmVkIGludCBpZmluZGV4LCBpbnQgcXVldWVfaWQpXG4re1xuK1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcmVxICpyZXE7XG4rXHRzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yc3AgKnJzcDtcbitcdHN0cnVjdCB5bmxfZXJyb3IgeWVycjtcbitcdHN0cnVjdCB5bmxfc29jayAqeXM7XG4rXHRpbnQgbmFwaV9pZDtcbitcbitcdHlzID0geW5sX3NvY2tfY3JlYXRlKFx1MDAyNnlubF9uZXRkZXZfZmFtaWx5LCBcdTAwMjZ5ZXJyKTtcbitcdGlmICgheXMpXG4rXHRcdGVycm9yKDEsIDAsIFwieW5sX3NvY2tfY3JlYXRlOiAlc1wiLCB5ZXJyLm1zZyk7XG4rXG4rXHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xuK1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lmaW5kZXgocmVxLCBpZmluZGV4KTtcbitcdG5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF90eXBlKHJlcSwgTkVUREVWX1FVRVVFX1RZUEVfUlgpO1xuK1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xuK1xuK1x0cnNwID0gbmV0ZGV2X3F1ZXVlX2dldCh5cywgcmVxKTtcbitcdGlmICghcnNwKVxuK1x0XHRlcnJvcigxLCAwLCBcIm5ldGRldl9xdWV1ZV9nZXQocT0lZCk6ICVzXCIsIHF1ZXVlX2lkLFxuK1x0XHQgICAgICB5cy1cdTAwM2VlcnIubXNnKTtcbitcdGlmICghcnNwLVx1MDAzZV9wcmVzZW50Lm5hcGlfaWQpXG4rXHRcdGVycm9yKDEsIDAsIFwibmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogbmFwaV9pZCBub3QgcHJlc2VudFwiLFxuK1x0XHQgICAgICBxdWV1ZV9pZCk7XG4rXG4rXHRuYXBpX2lkID0gcnNwLVx1MDAzZW5hcGlfaWQ7XG4rXG4rXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9mcmVlKHJlcSk7XG4rXHRuZXRkZXZfcXVldWVfZ2V0X3JzcF9mcmVlKHJzcCk7XG4rXHR5bmxfc29ja19kZXN0cm95KHlzKTtcbitcbitcdHJldHVybiBuYXBpX2lkO1xuK31cbitcbitzdGF0aWMgaW50IGZpbmRfdGhyZWFkX2J5X2Nvbm4oc3RydWN0IHRocmVhZF9jdHggKmN0eHMsIGludCBjb25uZmQpXG4re1xuK1x0c29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpO1xuK1x0aW50IG5hcGlfaWQsIGk7XG4rXG4rXHRpZiAoZ2V0c29ja29wdChjb25uZmQsIFNPTF9TT0NLRVQsIFNPX0lOQ09NSU5HX05BUElfSUQsIFx1MDAyNm5hcGlfaWQsIFx1MDAyNmxlbikpXG4rXHRcdGVycm9yKDEsIGVycm5vLCBcImdldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRClcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkrKykge1xuK1x0XHRpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpXG4rXHRcdFx0cmV0dXJuIGk7XG4rXHR9XG4rXG4rXHRlcnJvcigxLCAwLCBcInVua25vd24gTkFQSSBJRDogJWRcIiwgbmFwaV9pZCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbit7XG4rXHRwdGhyZWFkX2JhcnJpZXJfdCBzZXR1cF9kb25lLCBkaXNwYXRjaF9kb25lO1xuK1x0aW50IHRvdGFsX2Nvbm5zLCBhY2NlcHRlZCA9IDAsIGNvbm5mZDtcbitcdHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzO1xuK1x0aW50IGZkLCByZXQsIGVuYWJsZSwgaTtcbitcdHVuc2lnbmVkIGludCBpZmluZGV4O1xuK1x0cHRocmVhZF90ICp0aHJlYWRzO1xuK1xuK1x0Y3R4cyA9IGNhbGxvYyhjZmdfbnVtX3RocmVhZHMsIHNpemVvZigqY3R4cykpO1xuK1x0dGhyZWFkcyA9IGNhbGxvYyhjZmdfbnVtX3RocmVhZHMsIHNpemVvZigqdGhyZWFkcykpO1xuK1x0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxuK1x0XHRlcnJvcigxLCAwLCBcImNhbGxvYygpXCIpO1xuIFxuIFx0ZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTtcbiBcdGlmIChmZCA9PSAtMSlcbkBAIC0zNTEsMzIgKzQ1Nyw3MSBAQCBzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXG4gXHRpZiAocmV0IFx1MDAzYyAwKVxuIFx0XHRlcnJvcigxLCAwLCBcImJpbmQoKVwiKTtcbiBcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xuLVx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4rXHRwdGhyZWFkX2JhcnJpZXJfaW5pdChcdTAwMjZzZXR1cF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgKyAxKTtcbitcdHB0aHJlYWRfYmFycmllcl9pbml0KFx1MDAyNmRpc3BhdGNoX2RvbmUsIE5VTEwsIGNmZ19udW1fdGhyZWFkcyArIDEpO1xuIFxuLVx0aW9fdXJpbmdfcXVldWVfaW5pdCg1MTIsIFx1MDAyNnJpbmcsIGZsYWdzKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKSB7XG4rXHRcdGN0eHNbaV0ucXVldWVfaWQgPSBjZmdfcXVldWVfaWQgKyBpO1xuK1x0XHRjdHhzW2ldLnNldHVwX2RvbmUgPSBcdTAwMjZzZXR1cF9kb25lO1xuK1x0XHRjdHhzW2ldLmRpc3BhdGNoX2RvbmUgPSBcdTAwMjZkaXNwYXRjaF9kb25lO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcbitcdFx0cmV0ID0gcHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCxcbitcdFx0XHRcdCAgICAgc2VydmVyX3dvcmtlciwgXHUwMDI2Y3R4c1tpXSk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0ZXJyb3IoMSwgcmV0LCBcInB0aHJlYWRfY3JlYXRlKClcIik7XG4rXHR9XG4gXG4tXHRzZXR1cF96Y3J4KFx1MDAyNnJpbmcpO1xuIFx0aWYgKGNmZ19kcnlfcnVuKVxuLVx0XHRyZXR1cm47XG4rXHRcdGdvdG8gam9pbjtcbitcbitcdHB0aHJlYWRfYmFycmllcl93YWl0KFx1MDAyNnNldHVwX2RvbmUpO1xuIFxuIFx0aWYgKGxpc3RlbihmZCwgMTAyNCkgXHUwMDNjIDApXG4gXHRcdGVycm9yKDEsIDAsIFwibGlzdGVuKClcIik7XG4gXG4tXHRhZGRfYWNjZXB0KFx1MDAyNnJpbmcsIGZkKTtcbitcdGlmIChjZmdfbnVtX3RocmVhZHMgXHUwMDNlIDEpIHtcbitcdFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xuK1x0XHRpZiAoIWlmaW5kZXgpXG4rXHRcdFx0ZXJyb3IoMSwgMCwgXCJiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCIsIGNmZ19pZm5hbWUpO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkrKylcbitcdFx0XHRjdHhzW2ldLm5hcGlfaWQgPSBxdWVyeV9uYXBpX2lkKGlmaW5kZXgsXG4rXHRcdFx0XHRcdFx0XHRjdHhzW2ldLnF1ZXVlX2lkKTtcbitcdH1cbiBcbi1cdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xuLVx0d2hpbGUgKCFzdG9wIFx1MDAyNlx1MDAyNiBnZXR0aW1lb2ZkYXlfbXMoKSBcdTAwM2MgdHN0b3ApXG4tXHRcdHNlcnZlcl9sb29wKFx1MDAyNnJpbmcpO1xuK1x0dG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4rXG4rXHR3aGlsZSAoYWNjZXB0ZWQgXHUwMDNjIHRvdGFsX2Nvbm5zKSB7XG4rXHRcdGludCBpZHggPSAwO1xuK1xuK1x0XHRjb25uZmQgPSBhY2NlcHQoZmQsIE5VTEwsIE5VTEwpO1xuK1x0XHRpZiAoY29ubmZkIFx1MDAzYyAwKVxuK1x0XHRcdGVycm9yKDEsIGVycm5vLCBcImFjY2VwdCgpXCIpO1xuK1xuK1x0XHRpZiAoY2ZnX251bV90aHJlYWRzIFx1MDAzZSAxKVxuK1x0XHRcdGlkeCA9IGZpbmRfdGhyZWFkX2J5X2Nvbm4oY3R4cywgY29ubmZkKTtcbiBcbi1cdGlmICghc3RvcClcbi1cdFx0ZXJyb3IoMSwgMCwgXCJ0ZXN0IGZhaWxlZFxcblwiKTtcbitcdFx0aWYgKGN0eHNbaWR4XS5ucl9jb25ucyBcdTAwM2U9IE1BWF9DT05OU19QRVJfVEhSRUFEKVxuK1x0XHRcdGVycm9yKDEsIDAsIFwid29ya2VyICVkIGNvbm5lY3Rpb24gb3ZlcmZsb3dcIiwgaWR4KTtcbitcdFx0Y3R4c1tpZHhdLmNvbm5mZHNbY3R4c1tpZHhdLm5yX2Nvbm5zKytdID0gY29ubmZkO1xuK1x0XHRhY2NlcHRlZCsrO1xuK1x0fVxuK1xuK1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2ZGlzcGF0Y2hfZG9uZSk7XG4rXG4ram9pbjpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKVxuK1x0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4rXG4rXHRwdGhyZWFkX2JhcnJpZXJfZGVzdHJveShcdTAwMjZzZXR1cF9kb25lKTtcbitcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0ZnJlZSh0aHJlYWRzKTtcbitcdGZyZWUoY3R4cyk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbitzdGF0aWMgdm9pZCAqY2xpZW50X3dvcmtlcih2b2lkICphcmcpXG4ge1xuIFx0c3NpemVfdCB0b19zZW5kID0gY2ZnX3NlbmRfc2l6ZTtcbiBcdHNzaXplX3Qgc2VudCA9IDA7XG5AQCAtNDAyLDEyICs1NDcsMzYgQEAgc3RhdGljIHZvaWQgcnVuX2NsaWVudCh2b2lkKVxuIFx0fVxuIFxuIFx0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbit7XG4rXHRpbnQgdG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4rXHRwdGhyZWFkX3QgKnRocmVhZHM7XG4rXHRpbnQgaSwgcmV0O1xuK1xuK1x0dGhyZWFkcyA9IGNhbGxvYyh0b3RhbF9jb25ucywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4rXHRpZiAoIXRocmVhZHMpXG4rXHRcdGVycm9yKDEsIDAsIFwiY2FsbG9jKClcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0b3RhbF9jb25uczsgaSsrKSB7XG4rXHRcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGVycm9yKDEsIHJldCwgXCJwdGhyZWFkX2NyZWF0ZSgpXCIpO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdG90YWxfY29ubnM7IGkrKylcbitcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1xuK1x0ZnJlZSh0aHJlYWRzKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZmlsZXBhdGgpXG4ge1xuIFx0ZXJyb3IoMSwgMCwgXCJVc2FnZTogJXMgKC00fC02KSAoLXN8LWMpIC1oXHUwMDNjc2VydmVyX2lwXHUwMDNlIC1wXHUwMDNjcG9ydFx1MDAzZSBcIlxuLVx0XHQgICAgXCItbFx1MDAzY3BheWxvYWRfc2l6ZVx1MDAzZSAtaVx1MDAzY2lmbmFtZVx1MDAzZSAtcVx1MDAzY3J4cV9pZFx1MDAzZVwiLCBmaWxlcGF0aCk7XG4rXHRcdCAgICBcIi1sXHUwMDNjcGF5bG9hZF9zaXplXHUwMDNlIC1pXHUwMDNjaWZuYW1lXHUwMDNlIC1xXHUwMDNjcnhxX2lkXHUwMDNlIC10XHUwMDNjbnVtX3RocmVhZHNcdTAwM2VcIixcbitcdFx0ICAgIGZpbGVwYXRoKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2Vfb3B0cyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG5AQCAtNDI1LDcgKzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR1c2FnZShhcmd2WzBdKTtcbiBcdGNmZ19wYXlsb2FkX2xlbiA9IG1heF9wYXlsb2FkX2xlbjtcbiBcbi1cdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcInNjaDpwOmw6aTpxOm86ejp4OmRcIikpICE9IC0xKSB7XG4rXHR3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJzY2g6cDpsOmk6cTpvOno6eDpkdDpcIikpICE9IC0xKSB7XG4gXHRcdHN3aXRjaCAoYykge1xuIFx0XHRjYXNlICdzJzpcbiBcdFx0XHRpZiAoY2ZnX2NsaWVudClcbkBAIC00NjYsNiArNjM1LDkgQEAgc3RhdGljIHZvaWQgcGFyc2Vfb3B0cyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGNhc2UgJ2QnOlxuIFx0XHRcdGNmZ19kcnlfcnVuID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAndCc6XG4rXHRcdFx0Y2ZnX251bV90aHJlYWRzID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuQEAgLTMwLDYgKzMwLDEzIEBAIGRlZiBjcmVhdGVfcnNzX2N0eChjZmcpOlxuICAgICByZXR1cm4gaW50KHZhbHVlcylcbiBcbiBcbitkZWYgY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBzdGFydCwgY291bnQpOlxuKyAgICBcIlwiXCJDcmVhdGUgYW4gUlNTIGNvbnRleHQgc3Bhbm5pbmcgY291bnQgcXVldWVzIGZyb20gc3RhcnQsIHJldHVybiBpdHMgSUQuXCJcIlwiXG4rICAgIG91dHB1dCA9IGV0aHRvb2woZlwiLVgge2NmZy5pZm5hbWV9IGNvbnRleHQgbmV3IHN0YXJ0IHtzdGFydH0gZXF1YWwge2NvdW50fVwiKS5zdGRvdXRcbisgICAgdmFsdWVzID0gcmUuc2VhcmNoKHInTmV3IFJTUyBjb250ZXh0IGlzIChcXGQrKScsIG91dHB1dCkuZ3JvdXAoMSlcbisgICAgcmV0dXJuIGludCh2YWx1ZXMpXG4rXG4rXG4gZGVmIHNldF9mbG93X3J1bGUoY2ZnKTpcbiAgICAgb3V0cHV0ID0gZXRodG9vbChmXCItTiB7Y2ZnLmlmbmFtZX0gZmxvdy10eXBlIHRjcDYgZHN0LXBvcnQge2NmZy5wb3J0fSBhY3Rpb24ge2NmZy50YXJnZXR9XCIpLnN0ZG91dFxuICAgICB2YWx1ZXMgPSByZS5zZWFyY2gocidJRCAoXFxkKyknLCBvdXRwdXQpLmdyb3VwKDEpXG5AQCAtMTI3LDE3ICsxMzQsNTYgQEAgZGVmIF9yZXF1aXJlX250dXBsZShjZmcpOlxuICAgICAgICAgZGVmZXIoZXRodG9vbCwgZlwiLUsge2NmZy5pZm5hbWV9IG50dXBsZS1maWx0ZXJzIG9mZlwiKVxuIFxuIFxuK2RlZiByc3NfbXVsdGlxdWV1ZShjZmcpOlxuKyAgICBcIlwiXCJTdGVlciB0aGUgdGVzdCBmbG93IHRvIGEgbXVsdGktcXVldWUgUlNTIGNvbnRleHQgZm9yIG11bHRpLXRocmVhZCB6Y3J4LlwiXCJcIlxuKyAgICBjaGFubmVscyA9IGNmZy5ldGhubC5jaGFubmVsc19nZXQoeydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fX0pXG4rICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJ2NvbWJpbmVkLWNvdW50J11cbisgICAgaWYgY2hhbm5lbHMgXHUwMDNjIDM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCdUZXN0IHJlcXVpcmVzIE5FVElGIHdpdGggYXQgbGVhc3QgMyBjb21iaW5lZCBjaGFubmVscycpXG4rXG4rICAgIHJpbmdzID0gY2ZnLmV0aG5sLnJpbmdzX2dldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9fSlcbisgICAgcnhfcmluZ3MgPSByaW5nc1sncngnXVxuKyAgICBoZHNfdGhyZXNoID0gcmluZ3MuZ2V0KCdoZHMtdGhyZXNoJywgMClcbitcbisgICAgY2ZnLmV0aG5sLnJpbmdzX3NldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAndGNwLWRhdGEtc3BsaXQnOiAnZW5hYmxlZCcsXG4rICAgICAgICAgICAgICAgICAgICAgICAgICdoZHMtdGhyZXNoJzogMCxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogNjR9KVxuKyAgICBkZWZlcihjZmcuZXRobmwucmluZ3Nfc2V0LCB7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjcC1kYXRhLXNwbGl0JzogJ3Vua25vd24nLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiBoZHNfdGhyZXNoLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogcnhfcmluZ3N9KVxuKyAgICBkZWZlcihtcF9jbGVhcl93YWl0LCBjZmcpXG4rXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDJcbisgICAgY2ZnLnRhcmdldCA9IGNoYW5uZWxzIC0gY2ZnLm51bV90aHJlYWRzXG4rICAgIGV0aHRvb2woZlwiLVgge2NmZy5pZm5hbWV9IGVxdWFsIHtjZmcudGFyZ2V0fVwiKVxuKyAgICBkZWZlcihldGh0b29sLCBmXCItWCB7Y2ZnLmlmbmFtZX0gZGVmYXVsdFwiKVxuK1xuKyAgICByc3NfY3R4X2lkID0gY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBjZmcudGFyZ2V0LCBjZmcubnVtX3RocmVhZHMpXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcIi1YIHtjZmcuaWZuYW1lfSBkZWxldGUgY29udGV4dCB7cnNzX2N0eF9pZH1cIilcbitcbisgICAgZmxvd19ydWxlX2lkID0gc2V0X2Zsb3dfcnVsZV9yc3MoY2ZnLCByc3NfY3R4X2lkKVxuKyAgICBkZWZlcihldGh0b29sLCBmXCItTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XCIpXG4rXG4rXG4gQGtzZnRfdmFyaWFudHMoW1xuICAgICBLc2Z0TmFtZWRWYXJpYW50KFwic2luZ2xlXCIsIHNpbmdsZSksXG4gICAgIEtzZnROYW1lZFZhcmlhbnQoXCJyc3NcIiwgcnNzKSxcbisgICAgS3NmdE5hbWVkVmFyaWFudChcInJzc19tdWx0aXF1ZXVlXCIsIHJzc19tdWx0aXF1ZXVlKSxcbiBdKVxuIGRlZiB0ZXN0X3pjcngoY2ZnLCBzZXR1cCkgLVx1MDAzZSBOb25lOlxuICAgICBjZmcucmVxdWlyZV9pcHZlcignNicpXG4gICAgIF9yZXF1aXJlX250dXBsZShjZmcpXG4gXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDFcbitcbiAgICAgc2V0dXAoY2ZnKVxuLSAgICByeF9jbWQgPSBmXCJ7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9XCJcbi0gICAgdHhfY21kID0gZlwie2NmZy5iaW5fcmVtb3RlfSAtYyAtaCB7Y2ZnLmFkZHJfdlsnNiddfSAtcCB7Y2ZnLnBvcnR9IC1sIDEyODQwXCJcbitcbisgICAgcnhfY21kID0gKGZcIntjZmcuYmluX2xvY2FsfSAtcyAtcCB7Y2ZnLnBvcnR9IC1pIHtjZmcuaWZuYW1lfSBcIlxuKyAgICAgICAgICAgICAgZlwiLXEge2NmZy50YXJnZXR9IC10IHtjZmcubnVtX3RocmVhZHN9XCIpXG4rICAgIHR4X2NtZCA9IChmXCJ7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92Wyc2J119IC1wIHtjZmcucG9ydH0gXCJcbisgICAgICAgICAgICAgIGZcIi1sIDEyODQwIC10IHtjZmcubnVtX3RocmVhZHN9XCIpXG4gICAgIHdpdGggYmtnKHJ4X2NtZCwgZXhpdF93YWl0PVRydWUpOlxuICAgICAgICAgd2FpdF9wb3J0X2xpc3RlbihjZmcucG9ydCwgcHJvdG89XCJ0Y3BcIilcbiAgICAgICAgIGNtZCh0eF9jbWQsIGhvc3Q9Y2ZnLnJlbW90ZSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI3LjAwMzczMjYxNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM4NzQwODE0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBEZWNpc2lvbjogTm8gRnV6emluZyBOZWVkZWQqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIGFuZCBkZWNpZGUgaWYgaXQncyB3b3J0aCB0aGUgZnV6emluZyBlZmZvcnQuIE15IGluaXRpYWwgc2NhbiBpbmRpY2F0ZXMgdGhlIGZpbGVzIG1vZGlmaWVkIGFyZTogYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlYCwgYGlvdS16Y3J4LmNgLCBhbmQgYGlvdS16Y3J4LnB5YC4gQmFzZWQgb24gU2VjdGlvbiAyIG9mIHRoZSBjcml0ZXJpYSwgaXQgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBuby1nbywgYnV0IGxldCdzIGJlIHRob3JvdWdoLlxuXG5UaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgdGhlIFwiV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlXCIgc2VjdGlvbi4gSXQncyBwcmV0dHkgY2xlYXI6IHdlIG9ubHkgc2tpcCBmdXp6aW5nIGlmIGFsbCBjaGFuZ2VzIGZhbGwgaW50byBzcGVjaWZpYyBjYXRlZ29yaWVzLiBUaGUga2V5IHBvaW50IGhlcmUgaXMgdGhhdCB3ZSBoYXZlIG1vZGlmaWNhdGlvbnMgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9gIGRpcmVjdG9yeS4gVGhhdCdzIGEgc3Ryb25nIGluZGljYXRvciwgYXMgYHRvb2xzL2AgaXMgZGVzaWduYXRlZCBmb3IgdXNlci1zcGFjZSBzdHVmZi4gV2UgbmVlZCB0byBjb25maXJtIGl0IGRvZXNuJ3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLlxuXG5JIG5lZWQgdG8gY29uZmlybSB0aGUgZmlsZXMgdGhlbXNlbHZlcyBhcmUgbm9uLWtlcm5lbC4gQSBxdWljayBzYW5pdHkgY2hlY2sgb2YgdGhlIGZpbGVzIGludm9sdmVkIGNvbmZpcm1zIHRoYXQgdGhleSByZXNpZGUgZW50aXJlbHkgd2l0aGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBObyBjb3JlIGtlcm5lbCBjb2RlIGlzIHRvdWNoZWQsIGZyb20gd2hhdCBJJ20gc2VlaW5nLlxuXG5Tbywgc3VtbWluZyBpdCB1cCwgbXkgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIHBhdGNoICpvbmx5KiBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciBgdG9vbHMvYCwgYW5kIGl0IGRlZmluaXRlbHkgZG9lc24ndCB0b3VjaCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUncyBubyBuZWVkIHRvIGRlZmluZSBgRm9jdXNTeW1ib2xzYCBvciBgRW5hYmxlQ29uZmlnc2Agc2luY2Ugd2UgYXJlbid0IGZ1enppbmcgdGhpcy5cblxuVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGluZm9ybWF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTc1MywiT3V0cHV0VG9rZW5zIjo3MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjMwLjg3NzgxODE4M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjMwLjg3Nzg0MjY2M1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7xrs[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-09 20:55:19 +0000 UTC FinishedAt: 2026-09-09 20:57:33 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMjA6NTc6MjUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuaW5kZXggYmQzYjhkMmZhNDdlMC4uOGFlYmRjNmZlYjE3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuQEAgLTE4LDEwICYjNDM7MTgsNiBAQCBlbHNlXG4gJCh3YXJuaW5nIGV4Y2x1ZGluZyBpb3VyaW5nIHRlc3RzLCBsaWJ1cmluZyBub3QgaW5zdGFsbGVkIG9yIHRvbyBvbGQpXG4gZW5kaWZcbiBcbi1URVNUX0dFTl9GSUxFUyA6PSBcXFxuLVx0JChDT05EX0dFTl9GSUxFUykgXFxcbi0jIGVuZCBvZiBURVNUX0dFTl9GSUxFU1xuLVxuIFRFU1RfUFJPR1MgPSBcXFxuIFx0Y3N1bS5weSBcXFxuIFx0ZGV2bGlua19yYXRlX2Nyb3NzX2Vzdy5weSBcXFxuQEAgLTgwLDYgJiM0Mzs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXFxcbiBZTkxfR0VOX0ZJTEVTIDo9IFxcXG4gXHRuY2Rldm1lbSBcXFxuIFx0dG9lcGxpdHogXFxcbiYjNDM7XHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuICMgZW5kIG9mIFlOTF9HRU5fRklMRVNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gJChZTkxfR0VOX0ZJTEVTKVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSAkKHBhdHN1YnN0ICUuYywlLm8sJCh3aWxkY2FyZCAqLmJwZi5jKSlcbkBAIC05Nyw1ICYjNDM7OTQsNSBAQCBpbmNsdWRlIC4uLy4uLy4uL25ldC95bmwubWtcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcbiBcbiBpZmVxICgkKEhBU19JT1VSSU5HX1pDUlgpLHkpXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmdcbiYjNDM7JChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmcgLWxwdGhyZWFkXG4gZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xuaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbkBAIC00LDYgJiM0Mzs0LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NlcnJvci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGludC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuQEAgLTM3LDYgJiM0MzszOCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY2xpYnVyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjeW5sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bmV0ZGV2LXVzZXIuaFwmIzM0O1xuIFxuICNkZWZpbmUgU0tJUF9DT0RFXHQ0MlxuIFxuQEAgLTg1LDE2ICYjNDM7ODgsMjkgQEAgc3RhdGljIGludCBjZmdfc2VuZF9zaXplID0gU0VORF9TSVpFO1xuIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW42IGNmZ19hZGRyO1xuIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2ZnX3J4X2J1Zl9sZW47XG4gc3RhdGljIGJvb2wgY2ZnX2RyeV9ydW47XG4mIzQzO3N0YXRpYyBpbnQgY2ZnX251bV90aHJlYWRzID0gMTtcbiBcbiBzdGF0aWMgY2hhciAqcGF5bG9hZDtcbi1zdGF0aWMgdm9pZCAqYXJlYV9wdHI7XG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xuLXN0YXRpYyBzaXplX3QgcmluZ19zaXplO1xuLXN0YXRpYyBzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycSBycV9yaW5nO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XG4tc3RhdGljIGludCBjb25uZmQ7XG4tc3RhdGljIGJvb2wgc3RvcDtcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xuJiM0MztcbiYjNDM7I2RlZmluZSBNQVhfQ09OTlNfUEVSX1RIUkVBRFx0NjRcbiYjNDM7XG4mIzQzO3N0cnVjdCB0aHJlYWRfY3R4IHtcbiYjNDM7XHRzdHJ1Y3QgaW9fdXJpbmdcdFx0cmluZztcbiYjNDM7XHR2b2lkXHRcdFx0KmFyZWFfcHRyO1xuJiM0MztcdHZvaWRcdFx0XHQqcmluZ19wdHI7XG4mIzQzO1x0c2l6ZV90XHRcdFx0cmluZ19zaXplO1xuJiM0MztcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxXHRycV9yaW5nO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0YXJlYV90b2tlbjtcbiYjNDM7XHRpbnRcdFx0XHRxdWV1ZV9pZDtcbiYjNDM7XHRpbnRcdFx0XHRuYXBpX2lkO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl90XHQqc2V0dXBfZG9uZTtcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfdFx0KmRpc3BhdGNoX2RvbmU7XG4mIzQzO1xuJiM0MztcdGludFx0XHRcdGNvbm5mZHNbTUFYX0NPTk5TX1BFUl9USFJFQURdO1xuJiM0MztcdHNpemVfdFx0XHRcdHJlY2VpdmVkW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbiYjNDM7XHRpbnRcdFx0XHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbiYjNDM7XHRpbnRcdFx0XHRucl9jb25ucztcbiYjNDM7fTtcbiBcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2ZkYXlfbXModm9pZClcbiB7XG5AQCAtMTMyLDE2ICYjNDM7MTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKVxuIHtcbiBcdHNpemVfdCBzaXplO1xuIFxuLVx0cmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpO1xuJiM0MztcdHNpemUgPSBycV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSk7XG4gXHQvKiBhZGQgc3BhY2UgZm9yIHRoZSBoZWFkZXIgKGhlYWQvdGFpbC9ldGMuKSAqL1xuLVx0cmluZ19zaXplICYjNDM7PSBwYWdlX3NpemU7XG4tXHRyZXR1cm4gQUxJR05fVVAocmluZ19zaXplLCBwYWdlX3NpemUpO1xuJiM0MztcdHNpemUgJiM0Mzs9IHBhZ2Vfc2l6ZTtcbiYjNDM7XHRyZXR1cm4gQUxJR05fVVAoc2l6ZSwgcGFnZV9zaXplKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpXG4mIzQzO3N0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IHRocmVhZF9jdHggKmN0eClcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSBBUkVBX1NJWkUgLyBwYWdlX3NpemU7XG4gXHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcbi1cdHVuc2lnbmVkIGludCBycV9lbnRyaWVzID0gNDA5NjtcbiBcdGludCByZXQ7XG4gXG4gXHRpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoY2ZnX2lmbmFtZSk7XG5AQCAtMTQ5LDU4ICYjNDM7MTY1LDU4IEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCYjMzQ7LCBjZmdfaWZuYW1lKTtcbiBcbiBcdGlmIChjZmdfcnhfYnVmX2xlbiBcdTAwMjZcdTAwMjYgY2ZnX3J4X2J1Zl9sZW4gIT0gcGFnZV9zaXplKSB7XG4tXHRcdGFyZWFfcHRyID0gbW1hcChOVUxMLFxuLVx0XHRcdFx0QVJFQV9TSVpFLFxuLVx0XHRcdFx0UFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbi1cdFx0XHRcdE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8XG4tXHRcdFx0XHRNQVBfSFVHRVRMQiB8IE1BUF9IVUdFXzJNQixcbi1cdFx0XHRcdC0xLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7XG4mIzQzO1x0XHRjdHgtXHUwMDNlYXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4mIzQzO1x0XHRcdFx0ICAgICBBUkVBX1NJWkUsXG4mIzQzO1x0XHRcdFx0ICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcbiYjNDM7XHRcdFx0XHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuJiM0MztcdFx0XHRcdCAgICAgLTEsXG4mIzQzO1x0XHRcdFx0ICAgICAwKTtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRCkge1xuIFx0XHRcdHByaW50ZihcJiMzNDtDYW4mIzM5O3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xcblwmIzM0Oyk7XG4gXHRcdFx0ZXhpdChTS0lQX0NPREUpO1xuIFx0XHR9XG4gXHR9IGVsc2Uge1xuLVx0XHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcbi1cdFx0XHRcdEFSRUFfU0laRSxcbi1cdFx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0XHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXG4tXHRcdFx0XHQwLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Y3R4LVx1MDAzZWFyZWFfcHRyID0gbW1hcChOVUxMLFxuJiM0MztcdFx0XHRcdCAgICAgQVJFQV9TSVpFLFxuJiM0MztcdFx0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbiYjNDM7XHRcdFx0XHQgICAgIDAsXG4mIzQzO1x0XHRcdFx0ICAgICAwKTtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcbiBcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDttbWFwKCk6IHplcm8gY29weSBhcmVhXCYjMzQ7KTtcbiBcdH1cbiBcbi1cdHJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuLVx0cmluZ19wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0cmluZ19zaXplLFxuLVx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuLVx0XHRcdDAsXG4tXHRcdFx0MCk7XG4mIzQzO1x0Y3R4LVx1MDAzZXJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuJiM0MztcdGN0eC1cdTAwM2VyaW5nX3B0ciA9IG1tYXAoTlVMTCxcbiYjNDM7XHRcdFx0ICAgICBjdHgtXHUwMDNlcmluZ19zaXplLFxuJiM0MztcdFx0XHQgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuJiM0MztcdFx0XHQgICAgIDAsXG4mIzQzO1x0XHRcdCAgICAgMCk7XG4gXG4gXHRzdHJ1Y3QgaW9fdXJpbmdfcmVnaW9uX2Rlc2MgcmVnaW9uX3JlZyA9IHtcbi1cdFx0LnNpemUgPSByaW5nX3NpemUsXG4tXHRcdC51c2VyX2FkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcmluZ19wdHIsXG4mIzQzO1x0XHQuc2l6ZSA9IGN0eC1cdTAwM2VyaW5nX3NpemUsXG4mIzQzO1x0XHQudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VyaW5nX3B0cixcbiBcdFx0LmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2FyZWFfcmVnIGFyZWFfcmVnID0ge1xuLVx0XHQuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylhcmVhX3B0cixcbiYjNDM7XHRcdC5hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VhcmVhX3B0cixcbiBcdFx0LmxlbiA9IEFSRUFfU0laRSxcbiBcdFx0LmZsYWdzID0gMCxcbiBcdH07XG4gXG4gXHRzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0ge1xuIFx0XHQuaWZfaWR4ID0gaWZpbmRleCxcbi1cdFx0LmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCxcbiYjNDM7XHRcdC5pZl9yeHEgPSBjdHgtXHUwMDNlcXVldWVfaWQsXG4gXHRcdC5ycV9lbnRyaWVzID0gcnFfZW50cmllcyxcbiBcdFx0LmFyZWFfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKVx1MDAyNmFyZWFfcmVnLFxuIFx0XHQucmVnaW9uX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylcdTAwMjZyZWdpb25fcmVnLFxuIFx0XHQucnhfYnVmX2xlbiA9IGNmZ19yeF9idWZfbGVuLFxuIFx0fTtcbiBcbi1cdHJldCA9IGlvX3VyaW5nX3JlZ2lzdGVyX2lmcShyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4mIzQzO1x0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4gXHRpZiAoY2ZnX3J4X2J1Zl9sZW4gXHUwMDI2XHUwMDI2IChyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVPUE5PVFNVUFAgfHxcbiBcdFx0XHQgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7XG4gXHRcdHByaW50ZihcJiMzNDtMYXJnZSBjaHVua3MgYXJlIG5vdCBzdXBwb3J0ZWQgJWlcXG5cJiMzNDssIHJldCk7XG5AQCAtMjA5LDc0ICYjNDM7MjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcJiMzNDtpb191cmluZ19yZWdpc3Rlcl9pZnEoKTogJWRcJiMzNDssIHJldCk7XG4gXHR9XG4gXG4tXHRycV9yaW5nLmtoZWFkID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLmhlYWQpO1xuLVx0cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy50YWlsKTtcbi1cdHJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTtcbi1cdHJxX3JpbmcucnFfdGFpbCA9IDA7XG4tXHRycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xuLVxuLVx0YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XG4tfVxuLVxuLXN0YXRpYyB2b2lkIGFkZF9hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxuLXtcbi1cdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbi1cbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0Y3R4LVx1MDAzZXJxX3Jpbmcua2hlYWQgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLmhlYWQpO1xuJiM0MztcdGN0eC1cdTAwM2VycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKWN0eC1cdTAwM2VyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy50YWlsKTtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKWN0eC1cdTAwM2VyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsID0gMDtcbiYjNDM7XHRjdHgtXHUwMDNlcnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllcztcbiBcbi1cdGlvX3VyaW5nX3ByZXBfYWNjZXB0KHNxZSwgc29ja2ZkLCBOVUxMLCBOVUxMLCAwKTtcbi1cdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSAxO1xuJiM0MztcdGN0eC1cdTAwM2VhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpXG4mIzQzO3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgMCwgMCk7XG4mIzQzO1x0aW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBjdHgtXHUwMDNlY29ubmZkc1tjb25uX2lkeF0sXG4mIzQzO1x0XHRcdCBOVUxMLCAwLCAwKTtcbiBcdHNxZS1cdTAwM2Vpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDI7XG4mIzQzO1x0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IGNvbm5faWR4O1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBhZGRfcmVjdnpjX29uZXNob3Qoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkLCBzaXplX3QgbGVuKVxuJiM0MztzdGF0aWMgdm9pZCBhZGRfcmVjdnpjX29uZXNob3Qoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4LCBzaXplX3QgbGVuKVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4mIzQzO1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgbGVuLCAwKTtcbiYjNDM7XHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC1cdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcbiYjNDM7XHRcdFx0IE5VTEwsIGxlbiwgMCk7XG4gXHRzcWUtXHUwMDNlaW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDtcbi1cdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSAyO1xuJiM0MztcdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4mIzQzO3N0YXRpYyB2b2lkIHByb2Nlc3NfcmVjdnpjKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSxcbiYjNDM7XHRcdFx0ICAgaW50IGNvbm5faWR4KVxuIHtcbi1cdGlmIChjcWUtXHUwMDNlcmVzIFx1MDAzYyAwKVxuLVx0XHRlcnJvcigxLCAwLCBcJiMzNDthY2NlcHQoKVwmIzM0Oyk7XG4tXHRpZiAoY29ubmZkKVxuLVx0XHRlcnJvcigxLCAwLCBcJiMzNDtVbmV4cGVjdGVkIHNlY29uZCBjb25uZWN0aW9uXCYjMzQ7KTtcbi1cbi1cdGNvbm5mZCA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpZiAoY2ZnX29uZXNob3QpXG4tXHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRlbHNlXG4tXHRcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4te1xuLVx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcnFfbWFzayA9IGN0eC1cdTAwM2VycV9yaW5nLnJpbmdfZW50cmllcyAtIDE7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKnJjcWU7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKnJxZTtcbi1cdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcdHVpbnQ2NF90IG1hc2s7XG4gXHRjaGFyICpkYXRhO1xuIFx0c3NpemVfdCBuO1xuIFx0aW50IGk7XG4gXG4tXHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjYgY2ZnX29uZXNob3RfcmVjdnMgPT0gMCkge1xuLVx0XHRzdG9wID0gdHJ1ZTtcbiYjNDM7XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3R4LVx1MDAzZW9uZXNob3RfcmVjdnNbY29ubl9pZHhdID09IDApIHtcbiYjNDM7XHRcdGN0eC1cdTAwM2Vucl9jb25ucy0tO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG5AQCAtMjg0LDU5ICYjNDM7Mjc5LDE3MCBAQCBzdGF0aWMgdm9pZCBwcm9jZXNzX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSlcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7cmVjdnpjKCk6ICVkXCYjMzQ7LCBjcWUtXHUwMDNlcmVzKTtcbiBcbiBcdGlmIChjZmdfb25lc2hvdCkge1xuLVx0XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjYgY2ZnX29uZXNob3RfcmVjdnMpIHtcbi1cdFx0XHRhZGRfcmVjdnpjX29uZXNob3QocmluZywgY29ubmZkLCBwYWdlX3NpemUpO1xuLVx0XHRcdGNmZ19vbmVzaG90X3JlY3ZzLS07XG4mIzQzO1x0XHRpZiAoY3FlLVx1MDAzZXJlcyA9PSAwIFx1MDAyNlx1MDAyNiBjcWUtXHUwMDNlZmxhZ3MgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0pIHtcbiYjNDM7XHRcdFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgY29ubl9pZHgsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XS0tO1xuJiM0MztcdFx0XHRyZXR1cm47XG4gXHRcdH1cbiBcdH0gZWxzZSBpZiAoIShjcWUtXHUwMDNlZmxhZ3MgXHUwMDI2IElPUklOR19DUUVfRl9NT1JFKSkge1xuLVx0XHRhZGRfcmVjdnpjKHJpbmcsIGNvbm5mZCk7XG4mIzQzO1x0XHRhZGRfcmVjdnpjKGN0eCwgY29ubl9pZHgpO1xuIFx0fVxuIFxuIFx0cmNxZSA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKikoY3FlICYjNDM7IDEpO1xuIFxuIFx0biA9IGNxZS1cdTAwM2VyZXM7XG4gXHRtYXNrID0gKDFVTEwgXHUwMDNjXHUwMDNjIElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTtcbi1cdGRhdGEgPSAoY2hhciAqKWFyZWFfcHRyICYjNDM7IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4mIzQzO1x0ZGF0YSA9IChjaGFyICopY3R4LVx1MDAzZWFyZWFfcHRyICYjNDM7IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoKihkYXRhICYjNDM7IGkpICE9IHBheWxvYWRbKHJlY2VpdmVkICYjNDM7IGkpXSlcbiYjNDM7XHRcdGlmICgqKGRhdGEgJiM0MzsgaSkgIT0gcGF5bG9hZFsoY3R4LVx1MDAzZXJlY2VpdmVkW2Nvbm5faWR4XSAmIzQzOyBpKV0pXG4gXHRcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7cGF5bG9hZCBtaXNtYXRjaCBhdCAlZFwmIzM0OywgaSk7XG4gXHR9XG4tXHRyZWNlaXZlZCAmIzQzOz0gbjtcbiYjNDM7XHRjdHgtXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7PSBuO1xuIFxuLVx0cnFlID0gXHUwMDI2cnFfcmluZy5ycWVzWyhycV9yaW5nLnJxX3RhaWwgXHUwMDI2IHJxX21hc2spXTtcbi1cdHJxZS1cdTAwM2VvZmYgPSAocmNxZS1cdTAwM2VvZmYgXHUwMDI2IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjtcbiYjNDM7XHRycWUgPSBcdTAwMjZjdHgtXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4mIzQzO1x0cnFlLVx1MDAzZW9mZiA9IChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtXHUwMDNlYXJlYV90b2tlbjtcbiBcdHJxZS1cdTAwM2VsZW4gPSBjcWUtXHUwMDNlcmVzO1xuLVx0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UocnFfcmluZy5rdGFpbCwgJiM0MzsmIzQzO3JxX3JpbmcucnFfdGFpbCk7XG4mIzQzO1x0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LVx1MDAzZXJxX3Jpbmcua3RhaWwsICYjNDM7JiM0MztjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuJiM0MztzdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19jcWUgKmNxZTtcbiBcdHVuc2lnbmVkIGludCBjb3VudCA9IDA7XG4gXHR1bnNpZ25lZCBpbnQgaGVhZDtcbi1cdGludCBpLCByZXQ7XG4gXG4tXHRpb191cmluZ19zdWJtaXRfYW5kX3dhaXQocmluZywgMSk7XG4mIzQzO1x0aW9fdXJpbmdfc3VibWl0X2FuZF93YWl0KFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAxKTtcbiBcbi1cdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShyaW5nLCBoZWFkLCBjcWUpIHtcbi1cdFx0aWYgKGNxZS1cdTAwM2V1c2VyX2RhdGEgPT0gMSlcbi1cdFx0XHRwcm9jZXNzX2FjY2VwdChyaW5nLCBjcWUpO1xuLVx0XHRlbHNlIGlmIChjcWUtXHUwMDNldXNlcl9kYXRhID09IDIpXG4tXHRcdFx0cHJvY2Vzc19yZWN2emMocmluZywgY3FlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGVycm9yKDEsIDAsIFwmIzM0O3Vua25vd24gY3FlXCYjMzQ7KTtcbiYjNDM7XHRpb191cmluZ19mb3JfZWFjaF9jcWUoXHUwMDI2Y3R4LVx1MDAzZXJpbmcsIGhlYWQsIGNxZSkge1xuJiM0MztcdFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cdTAwM2V1c2VyX2RhdGEpO1xuIFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4gXHR9XG4tXHRpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTtcbiYjNDM7XHRpb191cmluZ19jcV9hZHZhbmNlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBjb3VudCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKVxuIHtcbi1cdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XG4tXHRzdHJ1Y3QgaW9fdXJpbmcgcmluZztcbi1cdGludCBmZCwgZW5hYmxlLCByZXQ7XG4mIzQzO1x0c3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwYXJhbXMgPSB7IH07XG4mIzQzO1x0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcbiBcdHVpbnQ2NF90IHRzdG9wO1xuJiM0MztcdGludCBucl9jb25ucztcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSO1xuJiM0MztcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjtcbiYjNDM7XHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4mIzQzO1x0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjtcbiYjNDM7XHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTtcbiYjNDM7XHRwYXJhbXMuY3FfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcdTAwMjZjdHgtXHUwMDNlcmluZywgXHUwMDI2cGFyYW1zKTtcbiYjNDM7XHRzZXR1cF96Y3J4KGN0eCk7XG4mIzQzO1xuJiM0MztcdGlmIChjZmdfZHJ5X3J1bilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlc2V0dXBfZG9uZSk7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LVx1MDAzZWRpc3BhdGNoX2RvbmUpO1xuJiM0MztcbiYjNDM7XHRucl9jb25ucyA9IGN0eC1cdTAwM2Vucl9jb25ucztcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY3R4LVx1MDAzZW5yX2Nvbm5zOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGNmZ19vbmVzaG90KSB7XG4mIzQzO1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2ldID0gY2ZnX29uZXNob3RfcmVjdnM7XG4mIzQzO1x0XHRcdGFkZF9yZWN2emNfb25lc2hvdChjdHgsIGksIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRhZGRfcmVjdnpjKGN0eCwgaSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7XG4mIzQzO1x0d2hpbGUgKGN0eC1cdTAwM2Vucl9jb25ucyBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXHUwMDNjIHRzdG9wKVxuJiM0MztcdFx0c2VydmVyX2xvb3AoY3R4KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGN0eC1cdTAwM2Vucl9jb25ucyAhPSAwKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7dGVzdCBmYWlsZWQ6ICVkIGNvbm5lY3Rpb25zIGluY29tcGxldGVcJiMzNDssXG4mIzQzO1x0XHQgICAgICBjdHgtXHUwMDNlbnJfY29ubnMpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jb25uczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChjZmdfb25lc2hvdCkge1xuJiM0MztcdFx0XHRpZiAoIWN0eC1cdTAwM2VyZWNlaXZlZFtpXSlcbiYjNDM7XHRcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGFcJiMzNDssIGkpO1xuJiM0MztcdFx0fSBlbHNlIGlmIChjdHgtXHUwMDNlcmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7XG4mIzQzO1x0XHRcdGVycm9yKDEsIDAsIFwmIzM0O2Nvbm5lY3Rpb24gJWQgcmVjZWl2ZWQgJXp1IG9mICVkIGJ5dGVzXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICBpLCBjdHgtXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcXVlcnlfbmFwaV9pZCh1bnNpZ25lZCBpbnQgaWZpbmRleCwgaW50IHF1ZXVlX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcmVxICpyZXE7XG4mIzQzO1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcnNwICpyc3A7XG4mIzQzO1x0c3RydWN0IHlubF9lcnJvciB5ZXJyO1xuJiM0MztcdHN0cnVjdCB5bmxfc29jayAqeXM7XG4mIzQzO1x0aW50IG5hcGlfaWQ7XG4mIzQzO1xuJiM0MztcdHlzID0geW5sX3NvY2tfY3JlYXRlKFx1MDAyNnlubF9uZXRkZXZfZmFtaWx5LCBcdTAwMjZ5ZXJyKTtcbiYjNDM7XHRpZiAoIXlzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7eW5sX3NvY2tfY3JlYXRlOiAlc1wmIzM0OywgeWVyci5tc2cpO1xuJiM0MztcbiYjNDM7XHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xuJiM0MztcdG5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF9pZmluZGV4KHJlcSwgaWZpbmRleCk7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X3R5cGUocmVxLCBORVRERVZfUVVFVUVfVFlQRV9SWCk7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xuJiM0MztcbiYjNDM7XHRyc3AgPSBuZXRkZXZfcXVldWVfZ2V0KHlzLCByZXEpO1xuJiM0MztcdGlmICghcnNwKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7bmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogJXNcJiMzNDssIHF1ZXVlX2lkLFxuJiM0MztcdFx0ICAgICAgeXMtXHUwMDNlZXJyLm1zZyk7XG4mIzQzO1x0aWYgKCFyc3AtXHUwMDNlX3ByZXNlbnQubmFwaV9pZClcbiYjNDM7XHRcdGVycm9yKDEsIDAsIFwmIzM0O25ldGRldl9xdWV1ZV9nZXQocT0lZCk6IG5hcGlfaWQgbm90IHByZXNlbnRcJiMzNDssXG4mIzQzO1x0XHQgICAgICBxdWV1ZV9pZCk7XG4mIzQzO1xuJiM0MztcdG5hcGlfaWQgPSByc3AtXHUwMDNlbmFwaV9pZDtcbiYjNDM7XG4mIzQzO1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfZnJlZShyZXEpO1xuJiM0MztcdG5ldGRldl9xdWV1ZV9nZXRfcnNwX2ZyZWUocnNwKTtcbiYjNDM7XHR5bmxfc29ja19kZXN0cm95KHlzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5hcGlfaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZmluZF90aHJlYWRfYnlfY29ubihzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4cywgaW50IGNvbm5mZClcbiYjNDM7e1xuJiM0MztcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoaW50KTtcbiYjNDM7XHRpbnQgbmFwaV9pZCwgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldHNvY2tvcHQoY29ubmZkLCBTT0xfU09DS0VULCBTT19JTkNPTUlOR19OQVBJX0lELCBcdTAwMjZuYXBpX2lkLCBcdTAwMjZsZW4pKVxuJiM0MztcdFx0ZXJyb3IoMSwgZXJybm8sIFwmIzM0O2dldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpXG4mIzQzO1x0XHRcdHJldHVybiBpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyb3IoMSwgMCwgXCYjMzQ7dW5rbm93biBOQVBJIElEOiAlZFwmIzM0OywgbmFwaV9pZCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRwdGhyZWFkX2JhcnJpZXJfdCBzZXR1cF9kb25lLCBkaXNwYXRjaF9kb25lO1xuJiM0MztcdGludCB0b3RhbF9jb25ucywgYWNjZXB0ZWQgPSAwLCBjb25uZmQ7XG4mIzQzO1x0c3RydWN0IHRocmVhZF9jdHggKmN0eHM7XG4mIzQzO1x0aW50IGZkLCByZXQsIGVuYWJsZSwgaTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcbiYjNDM7XHRwdGhyZWFkX3QgKnRocmVhZHM7XG4mIzQzO1xuJiM0MztcdGN0eHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKmN0eHMpKTtcbiYjNDM7XHR0aHJlYWRzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4mIzQzO1x0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7Y2FsbG9jKClcJiMzNDspO1xuIFxuIFx0ZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTtcbiBcdGlmIChmZCA9PSAtMSlcbkBAIC0zNTEsMzIgJiM0Mzs0NTcsNzEgQEAgc3RhdGljIHZvaWQgcnVuX3NlcnZlcih2b2lkKVxuIFx0aWYgKHJldCBcdTAwM2MgMClcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7YmluZCgpXCYjMzQ7KTtcbiBcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xuLVx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX2luaXQoXHUwMDI2c2V0dXBfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICYjNDM7IDEpO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9pbml0KFx1MDAyNmRpc3BhdGNoX2RvbmUsIE5VTEwsIGNmZ19udW1fdGhyZWFkcyAmIzQzOyAxKTtcbiBcbi1cdGlvX3VyaW5nX3F1ZXVlX2luaXQoNTEyLCBcdTAwMjZyaW5nLCBmbGFncyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCAmIzQzOyBpO1xuJiM0MztcdFx0Y3R4c1tpXS5zZXR1cF9kb25lID0gXHUwMDI2c2V0dXBfZG9uZTtcbiYjNDM7XHRcdGN0eHNbaV0uZGlzcGF0Y2hfZG9uZSA9IFx1MDAyNmRpc3BhdGNoX2RvbmU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLFxuJiM0MztcdFx0XHRcdCAgICAgc2VydmVyX3dvcmtlciwgXHUwMDI2Y3R4c1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRlcnJvcigxLCByZXQsIFwmIzM0O3B0aHJlYWRfY3JlYXRlKClcJiMzNDspO1xuJiM0MztcdH1cbiBcbi1cdHNldHVwX3pjcngoXHUwMDI2cmluZyk7XG4gXHRpZiAoY2ZnX2RyeV9ydW4pXG4tXHRcdHJldHVybjtcbiYjNDM7XHRcdGdvdG8gam9pbjtcbiYjNDM7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2c2V0dXBfZG9uZSk7XG4gXG4gXHRpZiAobGlzdGVuKGZkLCAxMDI0KSBcdTAwM2MgMClcbiBcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7bGlzdGVuKClcJiMzNDspO1xuIFxuLVx0YWRkX2FjY2VwdChcdTAwMjZyaW5nLCBmZCk7XG4mIzQzO1x0aWYgKGNmZ19udW1fdGhyZWFkcyBcdTAwM2UgMSkge1xuJiM0MztcdFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xuJiM0MztcdFx0aWYgKCFpZmluZGV4KVxuJiM0MztcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCYjMzQ7LCBjZmdfaWZuYW1lKTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGN0eHNbaV0ubmFwaV9pZCA9IHF1ZXJ5X25hcGlfaWQoaWZpbmRleCxcbiYjNDM7XHRcdFx0XHRcdFx0XHRjdHhzW2ldLnF1ZXVlX2lkKTtcbiYjNDM7XHR9XG4gXG4tXHR0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7XG4tXHR3aGlsZSAoIXN0b3AgXHUwMDI2XHUwMDI2IGdldHRpbWVvZmRheV9tcygpIFx1MDAzYyB0c3RvcClcbi1cdFx0c2VydmVyX2xvb3AoXHUwMDI2cmluZyk7XG4mIzQzO1x0dG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChhY2NlcHRlZCBcdTAwM2MgdG90YWxfY29ubnMpIHtcbiYjNDM7XHRcdGludCBpZHggPSAwO1xuJiM0MztcbiYjNDM7XHRcdGNvbm5mZCA9IGFjY2VwdChmZCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoY29ubmZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRlcnJvcigxLCBlcnJubywgXCYjMzQ7YWNjZXB0KClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjZmdfbnVtX3RocmVhZHMgXHUwMDNlIDEpXG4mIzQzO1x0XHRcdGlkeCA9IGZpbmRfdGhyZWFkX2J5X2Nvbm4oY3R4cywgY29ubmZkKTtcbiBcbi1cdGlmICghc3RvcClcbi1cdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7dGVzdCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0aWYgKGN0eHNbaWR4XS5ucl9jb25ucyBcdTAwM2U9IE1BWF9DT05OU19QRVJfVEhSRUFEKVxuJiM0MztcdFx0XHRlcnJvcigxLCAwLCBcJiMzNDt3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvd1wmIzM0OywgaWR4KTtcbiYjNDM7XHRcdGN0eHNbaWR4XS5jb25uZmRzW2N0eHNbaWR4XS5ucl9jb25ucyYjNDM7JiM0MztdID0gY29ubmZkO1xuJiM0MztcdFx0YWNjZXB0ZWQmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2ZGlzcGF0Y2hfZG9uZSk7XG4mIzQzO1xuJiM0Mztqb2luOlxuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNnNldHVwX2RvbmUpO1xuJiM0MztcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRmcmVlKHRocmVhZHMpO1xuJiM0MztcdGZyZWUoY3R4cyk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgKmNsaWVudF93b3JrZXIodm9pZCAqYXJnKVxuIHtcbiBcdHNzaXplX3QgdG9fc2VuZCA9IGNmZ19zZW5kX3NpemU7XG4gXHRzc2l6ZV90IHNlbnQgPSAwO1xuQEAgLTQwMiwxMiAmIzQzOzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXG4gXHR9XG4gXG4gXHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCB0b3RhbF9jb25ucyA9IGNmZ19udW1fdGhyZWFkcyAqIGNmZ19udW1fdGhyZWFkcztcbiYjNDM7XHRwdGhyZWFkX3QgKnRocmVhZHM7XG4mIzQzO1x0aW50IGksIHJldDtcbiYjNDM7XG4mIzQzO1x0dGhyZWFkcyA9IGNhbGxvYyh0b3RhbF9jb25ucywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4mIzQzO1x0aWYgKCF0aHJlYWRzKVxuJiM0MztcdFx0ZXJyb3IoMSwgMCwgXCYjMzQ7Y2FsbG9jKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0b3RhbF9jb25uczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0ZXJyb3IoMSwgcmV0LCBcJiMzNDtwdGhyZWFkX2NyZWF0ZSgpXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRvdGFsX2Nvbm5zOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0ZnJlZSh0aHJlYWRzKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZmlsZXBhdGgpXG4ge1xuIFx0ZXJyb3IoMSwgMCwgXCYjMzQ7VXNhZ2U6ICVzICgtNHwtNikgKC1zfC1jKSAtaFx1MDAzY3NlcnZlcl9pcFx1MDAzZSAtcFx1MDAzY3BvcnRcdTAwM2UgXCYjMzQ7XG4tXHRcdCAgICBcJiMzNDstbFx1MDAzY3BheWxvYWRfc2l6ZVx1MDAzZSAtaVx1MDAzY2lmbmFtZVx1MDAzZSAtcVx1MDAzY3J4cV9pZFx1MDAzZVwmIzM0OywgZmlsZXBhdGgpO1xuJiM0MztcdFx0ICAgIFwmIzM0Oy1sXHUwMDNjcGF5bG9hZF9zaXplXHUwMDNlIC1pXHUwMDNjaWZuYW1lXHUwMDNlIC1xXHUwMDNjcnhxX2lkXHUwMDNlIC10XHUwMDNjbnVtX3RocmVhZHNcdTAwM2VcJiMzNDssXG4mIzQzO1x0XHQgICAgZmlsZXBhdGgpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcbkBAIC00MjUsNyAmIzQzOzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR1c2FnZShhcmd2WzBdKTtcbiBcdGNmZ19wYXlsb2FkX2xlbiA9IG1heF9wYXlsb2FkX2xlbjtcbiBcbi1cdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDtzY2g6cDpsOmk6cTpvOno6eDpkXCYjMzQ7KSkgIT0gLTEpIHtcbiYjNDM7XHR3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZHQ6XCYjMzQ7KSkgIT0gLTEpIHtcbiBcdFx0c3dpdGNoIChjKSB7XG4gXHRcdGNhc2UgJiMzOTtzJiMzOTs6XG4gXHRcdFx0aWYgKGNmZ19jbGllbnQpXG5AQCAtNDY2LDYgJiM0Mzs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0Y2FzZSAmIzM5O2QmIzM5OzpcbiBcdFx0XHRjZmdfZHJ5X3J1biA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHRjZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuQEAgLTMwLDYgJiM0MzszMCwxMyBAQCBkZWYgY3JlYXRlX3Jzc19jdHgoY2ZnKTpcbiAgICAgcmV0dXJuIGludCh2YWx1ZXMpXG4gXG4gXG4mIzQzO2RlZiBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIHN0YXJ0LCBjb3VudCk6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtDcmVhdGUgYW4gUlNTIGNvbnRleHQgc3Bhbm5pbmcgY291bnQgcXVldWVzIGZyb20gc3RhcnQsIHJldHVybiBpdHMgSUQuXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBvdXRwdXQgPSBldGh0b29sKGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gY29udGV4dCBuZXcgc3RhcnQge3N0YXJ0fSBlcXVhbCB7Y291bnR9XCYjMzQ7KS5zdGRvdXRcbiYjNDM7ICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJiMzOTtOZXcgUlNTIGNvbnRleHQgaXMgKFxcZCYjNDM7KSYjMzk7LCBvdXRwdXQpLmdyb3VwKDEpXG4mIzQzOyAgICByZXR1cm4gaW50KHZhbHVlcylcbiYjNDM7XG4mIzQzO1xuIGRlZiBzZXRfZmxvd19ydWxlKGNmZyk6XG4gICAgIG91dHB1dCA9IGV0aHRvb2woZlwmIzM0Oy1OIHtjZmcuaWZuYW1lfSBmbG93LXR5cGUgdGNwNiBkc3QtcG9ydCB7Y2ZnLnBvcnR9IGFjdGlvbiB7Y2ZnLnRhcmdldH1cJiMzNDspLnN0ZG91dFxuICAgICB2YWx1ZXMgPSByZS5zZWFyY2gociYjMzk7SUQgKFxcZCYjNDM7KSYjMzk7LCBvdXRwdXQpLmdyb3VwKDEpXG5AQCAtMTI3LDE3ICYjNDM7MTM0LDU2IEBAIGRlZiBfcmVxdWlyZV9udHVwbGUoY2ZnKTpcbiAgICAgICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstSyB7Y2ZnLmlmbmFtZX0gbnR1cGxlLWZpbHRlcnMgb2ZmXCYjMzQ7KVxuIFxuIFxuJiM0MztkZWYgcnNzX211bHRpcXVldWUoY2ZnKTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1N0ZWVyIHRoZSB0ZXN0IGZsb3cgdG8gYSBtdWx0aS1xdWV1ZSBSU1MgY29udGV4dCBmb3IgbXVsdGktdGhyZWFkIHpjcnguXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBjaGFubmVscyA9IGNmZy5ldGhubC5jaGFubmVsc19nZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH19KVxuJiM0MzsgICAgY2hhbm5lbHMgPSBjaGFubmVsc1smIzM5O2NvbWJpbmVkLWNvdW50JiMzOTtdXG4mIzQzOyAgICBpZiBjaGFubmVscyBcdTAwM2MgMzpcbiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzk7VGVzdCByZXF1aXJlcyBORVRJRiB3aXRoIGF0IGxlYXN0IDMgY29tYmluZWQgY2hhbm5lbHMmIzM5OylcbiYjNDM7XG4mIzQzOyAgICByaW5ncyA9IGNmZy5ldGhubC5yaW5nc19nZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH19KVxuJiM0MzsgICAgcnhfcmluZ3MgPSByaW5nc1smIzM5O3J4JiMzOTtdXG4mIzQzOyAgICBoZHNfdGhyZXNoID0gcmluZ3MuZ2V0KCYjMzk7aGRzLXRocmVzaCYjMzk7LCAwKVxuJiM0MztcbiYjNDM7ICAgIGNmZy5ldGhubC5yaW5nc19zZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3RjcC1kYXRhLXNwbGl0JiMzOTs6ICYjMzk7ZW5hYmxlZCYjMzk7LFxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IDAsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IDY0fSlcbiYjNDM7ICAgIGRlZmVyKGNmZy5ldGhubC5yaW5nc19zZXQsIHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9LFxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7dGNwLWRhdGEtc3BsaXQmIzM5OzogJiMzOTt1bmtub3duJiMzOTssXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IGhkc190aHJlc2gsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtyeCYjMzk7OiByeF9yaW5nc30pXG4mIzQzOyAgICBkZWZlcihtcF9jbGVhcl93YWl0LCBjZmcpXG4mIzQzO1xuJiM0MzsgICAgY2ZnLm51bV90aHJlYWRzID0gMlxuJiM0MzsgICAgY2ZnLnRhcmdldCA9IGNoYW5uZWxzIC0gY2ZnLm51bV90aHJlYWRzXG4mIzQzOyAgICBldGh0b29sKGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZXF1YWwge2NmZy50YXJnZXR9XCYjMzQ7KVxuJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZlwmIzM0Oy1YIHtjZmcuaWZuYW1lfSBkZWZhdWx0XCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIHJzc19jdHhfaWQgPSBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIGNmZy50YXJnZXQsIGNmZy5udW1fdGhyZWFkcylcbiYjNDM7ICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZGVsZXRlIGNvbnRleHQge3Jzc19jdHhfaWR9XCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIGZsb3dfcnVsZV9pZCA9IHNldF9mbG93X3J1bGVfcnNzKGNmZywgcnNzX2N0eF9pZClcbiYjNDM7ICAgIGRlZmVyKGV0aHRvb2wsIGZcJiMzNDstTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XCYjMzQ7KVxuJiM0MztcbiYjNDM7XG4gQGtzZnRfdmFyaWFudHMoW1xuICAgICBLc2Z0TmFtZWRWYXJpYW50KFwmIzM0O3NpbmdsZVwmIzM0Oywgc2luZ2xlKSxcbiAgICAgS3NmdE5hbWVkVmFyaWFudChcJiMzNDtyc3NcJiMzNDssIHJzcyksXG4mIzQzOyAgICBLc2Z0TmFtZWRWYXJpYW50KFwmIzM0O3Jzc19tdWx0aXF1ZXVlXCYjMzQ7LCByc3NfbXVsdGlxdWV1ZSksXG4gXSlcbiBkZWYgdGVzdF96Y3J4KGNmZywgc2V0dXApIC1cdTAwM2UgTm9uZTpcbiAgICAgY2ZnLnJlcXVpcmVfaXB2ZXIoJiMzOTs2JiMzOTspXG4gICAgIF9yZXF1aXJlX250dXBsZShjZmcpXG4gXG4mIzQzOyAgICBjZmcubnVtX3RocmVhZHMgPSAxXG4mIzQzO1xuICAgICBzZXR1cChjZmcpXG4tICAgIHJ4X2NtZCA9IGZcJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9XCYjMzQ7XG4tICAgIHR4X2NtZCA9IGZcJiMzNDt7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92WyYjMzk7NiYjMzk7XX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MFwmIzM0O1xuJiM0MztcbiYjNDM7ICAgIHJ4X2NtZCA9IChmXCYjMzQ7e2NmZy5iaW5fbG9jYWx9IC1zIC1wIHtjZmcucG9ydH0gLWkge2NmZy5pZm5hbWV9IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgIGZcJiMzNDstcSB7Y2ZnLnRhcmdldH0gLXQge2NmZy5udW1fdGhyZWFkc31cJiMzNDspXG4mIzQzOyAgICB0eF9jbWQgPSAoZlwmIzM0O3tjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJiMzOTs2JiMzOTtdfSAtcCB7Y2ZnLnBvcnR9IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgIGZcJiMzNDstbCAxMjg0MCAtdCB7Y2ZnLm51bV90aHJlYWRzfVwmIzM0OylcbiAgICAgd2l0aCBia2cocnhfY21kLCBleGl0X3dhaXQ9VHJ1ZSk6XG4gICAgICAgICB3YWl0X3BvcnRfbGlzdGVuKGNmZy5wb3J0LCBwcm90bz1cJiMzNDt0Y3BcJiMzNDspXG4gICAgICAgICBjbWQodHhfY21kLCBob3N0PWNmZy5yZW1vdGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhNwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgU2VwIDkgMjA6NTc6MjUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCmluZGV4IGJkM2I4ZDJmYTQ3ZTAuLjhhZWJkYzZmZWIxNzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlCkBAIC0xOCwxMCAmIzQzOzE4LDYgQEAgZWxzZQogJCh3YXJuaW5nIGV4Y2x1ZGluZyBpb3VyaW5nIHRlc3RzLCBsaWJ1cmluZyBub3QgaW5zdGFsbGVkIG9yIHRvbyBvbGQpCiBlbmRpZgogCi1URVNUX0dFTl9GSUxFUyA6PSBcCi0JJChDT05EX0dFTl9GSUxFUykgXAotIyBlbmQgb2YgVEVTVF9HRU5fRklMRVMKLQogVEVTVF9QUk9HUyA9IFwKIAljc3VtLnB5IFwKIAlkZXZsaW5rX3JhdGVfY3Jvc3NfZXN3LnB5IFwKQEAgLTgwLDYgJiM0Mzs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXAogWU5MX0dFTl9GSUxFUyA6PSBcCiAJbmNkZXZtZW0gXAogCXRvZXBsaXR6IFwKJiM0MzsJJChDT05EX0dFTl9GSUxFUykgXAogIyBlbmQgb2YgWU5MX0dFTl9GSUxFUwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9ICQoWU5MX0dFTl9GSUxFUykKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSAkKHBhdHN1YnN0ICUuYywlLm8sJCh3aWxkY2FyZCAqLmJwZi5jKSkKQEAgLTk3LDUgJiM0Mzs5NCw1IEBAIGluY2x1ZGUgLi4vLi4vLi4vbmV0L3lubC5tawogaW5jbHVkZSAuLi8uLi8uLi9uZXQvYnBmLm1rCiAKIGlmZXEgKCQoSEFTX0lPVVJJTkdfWkNSWCkseSkKLSQoT1VUUFVUKS9pb3UtemNyeDogTERMSUJTICYjNDM7PSAtbHVyaW5nCiYjNDM7JChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgJiM0Mzs9IC1sdXJpbmcgLWxwdGhyZWFkCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmMKaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jCkBAIC00LDYgJiM0Mzs0LDcgQEAKICNpbmNsdWRlICZsdDtlcnJvci5oJmd0OwogI2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKICNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW50LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKQEAgLTM3LDYgJiM0MzszOCw4IEBACiAjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKIAogI2luY2x1ZGUgJmx0O2xpYnVyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3lubC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7bmV0ZGV2LXVzZXIuaCYjMzQ7CiAKICNkZWZpbmUgU0tJUF9DT0RFCTQyCiAKQEAgLTg1LDE2ICYjNDM7ODgsMjkgQEAgc3RhdGljIGludCBjZmdfc2VuZF9zaXplID0gU0VORF9TSVpFOwogc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbjYgY2ZnX2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuOwogc3RhdGljIGJvb2wgY2ZnX2RyeV9ydW47CiYjNDM7c3RhdGljIGludCBjZmdfbnVtX3RocmVhZHMgPSAxOwogCiBzdGF0aWMgY2hhciAqcGF5bG9hZDsKLXN0YXRpYyB2b2lkICphcmVhX3B0cjsKLXN0YXRpYyB2b2lkICpyaW5nX3B0cjsKLXN0YXRpYyBzaXplX3QgcmluZ19zaXplOwotc3RhdGljIHN0cnVjdCBpb191cmluZ196Y3J4X3JxIHJxX3Jpbmc7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhcmVhX3Rva2VuOwotc3RhdGljIGludCBjb25uZmQ7Ci1zdGF0aWMgYm9vbCBzdG9wOwotc3RhdGljIHNpemVfdCByZWNlaXZlZDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9DT05OU19QRVJfVEhSRUFECTY0CiYjNDM7CiYjNDM7c3RydWN0IHRocmVhZF9jdHggewomIzQzOwlzdHJ1Y3QgaW9fdXJpbmcJCXJpbmc7CiYjNDM7CXZvaWQJCQkqYXJlYV9wdHI7CiYjNDM7CXZvaWQJCQkqcmluZ19wdHI7CiYjNDM7CXNpemVfdAkJCXJpbmdfc2l6ZTsKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3pjcnhfcnEJcnFfcmluZzsKJiM0MzsJdW5zaWduZWQgbG9uZwkJYXJlYV90b2tlbjsKJiM0MzsJaW50CQkJcXVldWVfaWQ7CiYjNDM7CWludAkJCW5hcGlfaWQ7CiYjNDM7CXB0aHJlYWRfYmFycmllcl90CSpzZXR1cF9kb25lOwomIzQzOwlwdGhyZWFkX2JhcnJpZXJfdAkqZGlzcGF0Y2hfZG9uZTsKJiM0MzsKJiM0MzsJaW50CQkJY29ubmZkc1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07CiYjNDM7CXNpemVfdAkJCXJlY2VpdmVkW01BWF9DT05OU19QRVJfVEhSRUFEXTsKJiM0MzsJaW50CQkJb25lc2hvdF9yZWN2c1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07CiYjNDM7CWludAkJCW5yX2Nvbm5zOwomIzQzO307CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldHRpbWVvZmRheV9tcyh2b2lkKQogewpAQCAtMTMyLDE2ICYjNDM7MTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKQogewogCXNpemVfdCBzaXplOwogCi0JcmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpOwomIzQzOwlzaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpOwogCS8qIGFkZCBzcGFjZSBmb3IgdGhlIGhlYWRlciAoaGVhZC90YWlsL2V0Yy4pICovCi0JcmluZ19zaXplICYjNDM7PSBwYWdlX3NpemU7Ci0JcmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTsKJiM0MzsJc2l6ZSAmIzQzOz0gcGFnZV9zaXplOwomIzQzOwlyZXR1cm4gQUxJR05fVVAoc2l6ZSwgcGFnZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiYjNDM7c3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KQogewomIzQzOwl1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaWZpbmRleDsKLQl1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IDQwOTY7CiAJaW50IHJldDsKIAogCWlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTsKQEAgLTE0OSw1OCAmIzQzOzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZykKIAkJZXJyb3IoMSwgMCwgJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzJiMzNDssIGNmZ19pZm5hbWUpOwogCiAJaWYgKGNmZ19yeF9idWZfbGVuICZhbXA7JmFtcDsgY2ZnX3J4X2J1Zl9sZW4gIT0gcGFnZV9zaXplKSB7Ci0JCWFyZWFfcHRyID0gbW1hcChOVUxMLAotCQkJCUFSRUFfU0laRSwKLQkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCU1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8Ci0JCQkJTUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsCi0JCQkJLTEsCi0JCQkJMCk7Ci0JCWlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7CiYjNDM7CQljdHgtJmd0O2FyZWFfcHRyID0gbW1hcChOVUxMLAomIzQzOwkJCQkgICAgIEFSRUFfU0laRSwKJiM0MzsJCQkJICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJCQkgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8CiYjNDM7CQkJCSAgICAgTUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsCiYjNDM7CQkJCSAgICAgLTEsCiYjNDM7CQkJCSAgICAgMCk7CiYjNDM7CQlpZiAoY3R4LSZndDthcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7CiAJCQlwcmludGYoJiMzNDtDYW4mIzM5O3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xuJiMzNDspOwogCQkJZXhpdChTS0lQX0NPREUpOwogCQl9CiAJfSBlbHNlIHsKLQkJYXJlYV9wdHIgPSBtbWFwKE5VTEwsCi0JCQkJQVJFQV9TSVpFLAotCQkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAotCQkJCTAsCi0JCQkJMCk7Ci0JCWlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKQomIzQzOwkJY3R4LSZndDthcmVhX3B0ciA9IG1tYXAoTlVMTCwKJiM0MzsJCQkJICAgICBBUkVBX1NJWkUsCiYjNDM7CQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsCiYjNDM7CQkJCSAgICAgMCwKJiM0MzsJCQkJICAgICAwKTsKJiM0MzsJCWlmIChjdHgtJmd0O2FyZWFfcHRyID09IE1BUF9GQUlMRUQpCiAJCQllcnJvcigxLCAwLCAmIzM0O21tYXAoKTogemVybyBjb3B5IGFyZWEmIzM0Oyk7CiAJfQogCi0JcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7Ci0JcmluZ19wdHIgPSBtbWFwKE5VTEwsCi0JCQlyaW5nX3NpemUsCi0JCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAotCQkJMCwKLQkJCTApOwomIzQzOwljdHgtJmd0O3Jpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpOwomIzQzOwljdHgtJmd0O3JpbmdfcHRyID0gbW1hcChOVUxMLAomIzQzOwkJCSAgICAgY3R4LSZndDtyaW5nX3NpemUsCiYjNDM7CQkJICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAomIzQzOwkJCSAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLAomIzQzOwkJCSAgICAgMCwKJiM0MzsJCQkgICAgIDApOwogCiAJc3RydWN0IGlvX3VyaW5nX3JlZ2lvbl9kZXNjIHJlZ2lvbl9yZWcgPSB7Ci0JCS5zaXplID0gcmluZ19zaXplLAotCQkudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXJpbmdfcHRyLAomIzQzOwkJLnNpemUgPSBjdHgtJmd0O3Jpbmdfc2l6ZSwKJiM0MzsJCS51c2VyX2FkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpY3R4LSZndDtyaW5nX3B0ciwKIAkJLmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLAogCX07CiAKIAlzdHJ1Y3QgaW9fdXJpbmdfemNyeF9hcmVhX3JlZyBhcmVhX3JlZyA9IHsKLQkJLmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpYXJlYV9wdHIsCiYjNDM7CQkuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZyljdHgtJmd0O2FyZWFfcHRyLAogCQkubGVuID0gQVJFQV9TSVpFLAogCQkuZmxhZ3MgPSAwLAogCX07CiAKIAlzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0gewogCQkuaWZfaWR4ID0gaWZpbmRleCwKLQkJLmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCwKJiM0MzsJCS5pZl9yeHEgPSBjdHgtJmd0O3F1ZXVlX2lkLAogCQkucnFfZW50cmllcyA9IHJxX2VudHJpZXMsCiAJCS5hcmVhX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZykmYW1wO2FyZWFfcmVnLAogCQkucmVnaW9uX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZykmYW1wO3JlZ2lvbl9yZWcsCiAJCS5yeF9idWZfbGVuID0gY2ZnX3J4X2J1Zl9sZW4sCiAJfTsKIAotCXJldCA9IGlvX3VyaW5nX3JlZ2lzdGVyX2lmcShyaW5nLCAodm9pZCAqKSZhbXA7cmVnKTsKJiM0MzsJcmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCZhbXA7Y3R4LSZndDtyaW5nLCAodm9pZCAqKSZhbXA7cmVnKTsKIAlpZiAoY2ZnX3J4X2J1Zl9sZW4gJmFtcDsmYW1wOyAocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FT1BOT1RTVVBQIHx8CiAJCQkgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7CiAJCXByaW50ZigmIzM0O0xhcmdlIGNodW5rcyBhcmUgbm90IHN1cHBvcnRlZCAlaVxuJiMzNDssIHJldCk7CkBAIC0yMDksNzQgJiM0MzsyMjUsNTMgQEAgc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiAJCWVycm9yKDEsIDAsICYjMzQ7aW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCk6ICVkJiMzNDssIHJldCk7CiAJfQogCi0JcnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5oZWFkKTsKLQlycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnRhaWwpOwotCXJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciAmIzQzOyByZWcub2Zmc2V0cy5ycWVzKTsKLQlycV9yaW5nLnJxX3RhaWwgPSAwOwotCXJxX3JpbmcucmluZ19lbnRyaWVzID0gcmVnLnJxX2VudHJpZXM7Ci0KLQlhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjsKLX0KLQotc3RhdGljIHZvaWQgYWRkX2FjY2VwdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpCi17Ci0Jc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlOwotCi0Jc3FlID0gaW9fdXJpbmdfZ2V0X3NxZShyaW5nKTsKJiM0MzsJY3R4LSZndDtycV9yaW5nLmtoZWFkID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKWN0eC0mZ3Q7cmluZ19wdHIgJiM0MzsgcmVnLm9mZnNldHMuaGVhZCk7CiYjNDM7CWN0eC0mZ3Q7cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtJmd0O3JpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnRhaWwpOwomIzQzOwljdHgtJmd0O3JxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKiljdHgtJmd0O3JpbmdfcHRyICYjNDM7IHJlZy5vZmZzZXRzLnJxZXMpOwomIzQzOwljdHgtJmd0O3JxX3JpbmcucnFfdGFpbCA9IDA7CiYjNDM7CWN0eC0mZ3Q7cnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllczsKIAotCWlvX3VyaW5nX3ByZXBfYWNjZXB0KHNxZSwgc29ja2ZkLCBOVUxMLCBOVUxMLCAwKTsKLQlzcWUtJmd0O3VzZXJfZGF0YSA9IDE7CiYjNDM7CWN0eC0mZ3Q7YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47CiB9CiAKLXN0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKQomIzQzO3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KQogewogCXN0cnVjdCBpb191cmluZ19zcWUgKnNxZTsKIAotCXNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7CiYjNDM7CXNxZSA9IGlvX3VyaW5nX2dldF9zcWUoJmFtcDtjdHgtJmd0O3JpbmcpOwogCi0JaW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBzb2NrZmQsIE5VTEwsIDAsIDApOwomIzQzOwlpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC0mZ3Q7Y29ubmZkc1tjb25uX2lkeF0sCiYjNDM7CQkJIE5VTEwsIDAsIDApOwogCXNxZS0mZ3Q7aW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDsKLQlzcWUtJmd0O3VzZXJfZGF0YSA9IDI7CiYjNDM7CXNxZS0mZ3Q7dXNlcl9kYXRhID0gY29ubl9pZHg7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZF9yZWN2emNfb25lc2hvdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQsIHNpemVfdCBsZW4pCiYjNDM7c3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7CiAKLQlzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpOwomIzQzOwlzcWUgPSBpb191cmluZ19nZXRfc3FlKCZhbXA7Y3R4LSZndDtyaW5nKTsKIAotCWlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgc29ja2ZkLCBOVUxMLCBsZW4sIDApOwomIzQzOwlpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIGN0eC0mZ3Q7Y29ubmZkc1tjb25uX2lkeF0sCiYjNDM7CQkJIE5VTEwsIGxlbiwgMCk7CiAJc3FlLSZndDtpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UOwotCXNxZS0mZ3Q7dXNlcl9kYXRhID0gMjsKJiM0MzsJc3FlLSZndDt1c2VyX2RhdGEgPSBjb25uX2lkeDsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpCiYjNDM7c3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLAomIzQzOwkJCSAgIGludCBjb25uX2lkeCkKIHsKLQlpZiAoY3FlLSZndDtyZXMgJmx0OyAwKQotCQllcnJvcigxLCAwLCAmIzM0O2FjY2VwdCgpJiMzNDspOwotCWlmIChjb25uZmQpCi0JCWVycm9yKDEsIDAsICYjMzQ7VW5leHBlY3RlZCBzZWNvbmQgY29ubmVjdGlvbiYjMzQ7KTsKLQotCWNvbm5mZCA9IGNxZS0mZ3Q7cmVzOwotCWlmIChjZmdfb25lc2hvdCkKLQkJYWRkX3JlY3Z6Y19vbmVzaG90KHJpbmcsIGNvbm5mZCwgcGFnZV9zaXplKTsKLQllbHNlCi0JCWFkZF9yZWN2emMocmluZywgY29ubmZkKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpCi17Ci0JdW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTsKJiM0MzsJdW5zaWduZWQgaW50IHJxX21hc2sgPSBjdHgtJmd0O3JxX3JpbmcucmluZ19lbnRyaWVzIC0gMTsKIAlzdHJ1Y3QgaW9fdXJpbmdfemNyeF9jcWUgKnJjcWU7CiAJc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlICpycWU7Ci0Jc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlOwogCXVpbnQ2NF90IG1hc2s7CiAJY2hhciAqZGF0YTsKIAlzc2l6ZV90IG47CiAJaW50IGk7CiAKLQlpZiAoY3FlLSZndDtyZXMgPT0gMCAmYW1wOyZhbXA7IGNxZS0mZ3Q7ZmxhZ3MgPT0gMCAmYW1wOyZhbXA7IGNmZ19vbmVzaG90X3JlY3ZzID09IDApIHsKLQkJc3RvcCA9IHRydWU7CiYjNDM7CWlmIChjcWUtJmd0O3JlcyA9PSAwICZhbXA7JmFtcDsgY3FlLSZndDtmbGFncyA9PSAwICZhbXA7JmFtcDsKJiM0MzsJICAgIGN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tjb25uX2lkeF0gPT0gMCkgewomIzQzOwkJY3R4LSZndDtucl9jb25ucy0tOwogCQlyZXR1cm47CiAJfQogCkBAIC0yODQsNTkgJiM0MzsyNzksMTcwIEBAIHN0YXRpYyB2b2lkIHByb2Nlc3NfcmVjdnpjKHN0cnVjdCBpb191cmluZyAqcmluZywgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlKQogCQllcnJvcigxLCAwLCAmIzM0O3JlY3Z6YygpOiAlZCYjMzQ7LCBjcWUtJmd0O3Jlcyk7CiAKIAlpZiAoY2ZnX29uZXNob3QpIHsKLQkJaWYgKGNxZS0mZ3Q7cmVzID09IDAgJmFtcDsmYW1wOyBjcWUtJmd0O2ZsYWdzID09IDAgJmFtcDsmYW1wOyBjZmdfb25lc2hvdF9yZWN2cykgewotCQkJYWRkX3JlY3Z6Y19vbmVzaG90KHJpbmcsIGNvbm5mZCwgcGFnZV9zaXplKTsKLQkJCWNmZ19vbmVzaG90X3JlY3ZzLS07CiYjNDM7CQlpZiAoY3FlLSZndDtyZXMgPT0gMCAmYW1wOyZhbXA7IGNxZS0mZ3Q7ZmxhZ3MgPT0gMCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgY3R4LSZndDtvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSkgewomIzQzOwkJCWFkZF9yZWN2emNfb25lc2hvdChjdHgsIGNvbm5faWR4LCBwYWdlX3NpemUpOwomIzQzOwkJCWN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tjb25uX2lkeF0tLTsKJiM0MzsJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgaWYgKCEoY3FlLSZndDtmbGFncyAmYW1wOyBJT1JJTkdfQ1FFX0ZfTU9SRSkpIHsKLQkJYWRkX3JlY3Z6YyhyaW5nLCBjb25uZmQpOwomIzQzOwkJYWRkX3JlY3Z6YyhjdHgsIGNvbm5faWR4KTsKIAl9CiAKIAlyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgJiM0MzsgMSk7CiAKIAluID0gY3FlLSZndDtyZXM7CiAJbWFzayA9ICgxVUxMICZsdDsmbHQ7IElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTsKLQlkYXRhID0gKGNoYXIgKilhcmVhX3B0ciAmIzQzOyAocmNxZS0mZ3Q7b2ZmICZhbXA7IG1hc2spOwomIzQzOwlkYXRhID0gKGNoYXIgKiljdHgtJmd0O2FyZWFfcHRyICYjNDM7IChyY3FlLSZndDtvZmYgJmFtcDsgbWFzayk7CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKCooZGF0YSAmIzQzOyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCAmIzQzOyBpKV0pCiYjNDM7CQlpZiAoKihkYXRhICYjNDM7IGkpICE9IHBheWxvYWRbKGN0eC0mZ3Q7cmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7IGkpXSkKIAkJCWVycm9yKDEsIDAsICYjMzQ7cGF5bG9hZCBtaXNtYXRjaCBhdCAlZCYjMzQ7LCBpKTsKIAl9Ci0JcmVjZWl2ZWQgJiM0Mzs9IG47CiYjNDM7CWN0eC0mZ3Q7cmVjZWl2ZWRbY29ubl9pZHhdICYjNDM7PSBuOwogCi0JcnFlID0gJmFtcDtycV9yaW5nLnJxZXNbKHJxX3JpbmcucnFfdGFpbCAmYW1wOyBycV9tYXNrKV07Ci0JcnFlLSZndDtvZmYgPSAocmNxZS0mZ3Q7b2ZmICZhbXA7IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjsKJiM0MzsJcnFlID0gJmFtcDtjdHgtJmd0O3JxX3JpbmcucnFlc1soY3R4LSZndDtycV9yaW5nLnJxX3RhaWwgJmFtcDsgcnFfbWFzayldOwomIzQzOwlycWUtJmd0O29mZiA9IChyY3FlLSZndDtvZmYgJmFtcDsgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtJmd0O2FyZWFfdG9rZW47CiAJcnFlLSZndDtsZW4gPSBjcWUtJmd0O3JlczsKLQlpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShycV9yaW5nLmt0YWlsLCAmIzQzOyYjNDM7cnFfcmluZy5ycV90YWlsKTsKJiM0MzsJaW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LSZndDtycV9yaW5nLmt0YWlsLCAmIzQzOyYjNDM7Y3R4LSZndDtycV9yaW5nLnJxX3RhaWwpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcpCiYjNDM7c3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IHRocmVhZF9jdHggKmN0eCkKIHsKIAlzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWU7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgaGVhZDsKLQlpbnQgaSwgcmV0OwogCi0JaW9fdXJpbmdfc3VibWl0X2FuZF93YWl0KHJpbmcsIDEpOwomIzQzOwlpb191cmluZ19zdWJtaXRfYW5kX3dhaXQoJmFtcDtjdHgtJmd0O3JpbmcsIDEpOwogCi0JaW9fdXJpbmdfZm9yX2VhY2hfY3FlKHJpbmcsIGhlYWQsIGNxZSkgewotCQlpZiAoY3FlLSZndDt1c2VyX2RhdGEgPT0gMSkKLQkJCXByb2Nlc3NfYWNjZXB0KHJpbmcsIGNxZSk7Ci0JCWVsc2UgaWYgKGNxZS0mZ3Q7dXNlcl9kYXRhID09IDIpCi0JCQlwcm9jZXNzX3JlY3Z6YyhyaW5nLCBjcWUpOwotCQllbHNlCi0JCQllcnJvcigxLCAwLCAmIzM0O3Vua25vd24gY3FlJiMzNDspOwomIzQzOwlpb191cmluZ19mb3JfZWFjaF9jcWUoJmFtcDtjdHgtJmd0O3JpbmcsIGhlYWQsIGNxZSkgewomIzQzOwkJcHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS0mZ3Q7dXNlcl9kYXRhKTsKIAkJY291bnQmIzQzOyYjNDM7OwogCX0KLQlpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTsKJiM0MzsJaW9fdXJpbmdfY3FfYWR2YW5jZSgmYW1wO2N0eC0mZ3Q7cmluZywgY291bnQpOwogfQogCi1zdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKQogewotCXVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0Jc3RydWN0IGlvX3VyaW5nIHJpbmc7Ci0JaW50IGZkLCBlbmFibGUsIHJldDsKJiM0MzsJc3RydWN0IGlvX3VyaW5nX3BhcmFtcyBwYXJhbXMgPSB7IH07CiYjNDM7CXN0cnVjdCB0aHJlYWRfY3R4ICpjdHggPSBhcmc7CiAJdWludDY0X3QgdHN0b3A7CiYjNDM7CWludCBucl9jb25uczsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfQ09PUF9UQVNLUlVOOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NJTkdMRV9JU1NVRVI7CiYjNDM7CXBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjsKJiM0MzsJcGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TVUJNSVRfQUxMOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRRTMyOwomIzQzOwlwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTsKJiM0MzsJcGFyYW1zLmNxX2VudHJpZXMgPSBBUkVBX1NJWkUgLyBwYWdlX3NpemU7CiYjNDM7CiYjNDM7CWlvX3VyaW5nX3F1ZXVlX2luaXRfcGFyYW1zKDUxMiwgJmFtcDtjdHgtJmd0O3JpbmcsICZhbXA7cGFyYW1zKTsKJiM0MzsJc2V0dXBfemNyeChjdHgpOwomIzQzOwomIzQzOwlpZiAoY2ZnX2RyeV9ydW4pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LSZndDtzZXR1cF9kb25lKTsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoY3R4LSZndDtkaXNwYXRjaF9kb25lKTsKJiM0MzsKJiM0MzsJbnJfY29ubnMgPSBjdHgtJmd0O25yX2Nvbm5zOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY3R4LSZndDtucl9jb25uczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChjZmdfb25lc2hvdCkgewomIzQzOwkJCWN0eC0mZ3Q7b25lc2hvdF9yZWN2c1tpXSA9IGNmZ19vbmVzaG90X3JlY3ZzOwomIzQzOwkJCWFkZF9yZWN2emNfb25lc2hvdChjdHgsIGksIHBhZ2Vfc2l6ZSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWFkZF9yZWN2emMoY3R4LCBpKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwl0c3RvcCA9IGdldHRpbWVvZmRheV9tcygpICYjNDM7IDUwMDA7CiYjNDM7CXdoaWxlIChjdHgtJmd0O25yX2Nvbm5zICZndDsgMCAmYW1wOyZhbXA7IGdldHRpbWVvZmRheV9tcygpICZsdDsgdHN0b3ApCiYjNDM7CQlzZXJ2ZXJfbG9vcChjdHgpOwomIzQzOwomIzQzOwlpZiAoY3R4LSZndDtucl9jb25ucyAhPSAwKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDt0ZXN0IGZhaWxlZDogJWQgY29ubmVjdGlvbnMgaW5jb21wbGV0ZSYjMzQ7LAomIzQzOwkJICAgICAgY3R4LSZndDtucl9jb25ucyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9jb25uczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChjZmdfb25lc2hvdCkgewomIzQzOwkJCWlmICghY3R4LSZndDtyZWNlaXZlZFtpXSkKJiM0MzsJCQkJZXJyb3IoMSwgMCwgJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGEmIzM0OywgaSk7CiYjNDM7CQl9IGVsc2UgaWYgKGN0eC0mZ3Q7cmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7CiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDtjb25uZWN0aW9uICVkIHJlY2VpdmVkICV6dSBvZiAlZCBieXRlcyYjMzQ7LAomIzQzOwkJCSAgICAgIGksIGN0eC0mZ3Q7cmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHF1ZXJ5X25hcGlfaWQodW5zaWduZWQgaW50IGlmaW5kZXgsIGludCBxdWV1ZV9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXRkZXZfcXVldWVfZ2V0X3JlcSAqcmVxOwomIzQzOwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yc3AgKnJzcDsKJiM0MzsJc3RydWN0IHlubF9lcnJvciB5ZXJyOwomIzQzOwlzdHJ1Y3QgeW5sX3NvY2sgKnlzOwomIzQzOwlpbnQgbmFwaV9pZDsKJiM0MzsKJiM0MzsJeXMgPSB5bmxfc29ja19jcmVhdGUoJmFtcDt5bmxfbmV0ZGV2X2ZhbWlseSwgJmFtcDt5ZXJyKTsKJiM0MzsJaWYgKCF5cykKJiM0MzsJCWVycm9yKDEsIDAsICYjMzQ7eW5sX3NvY2tfY3JlYXRlOiAlcyYjMzQ7LCB5ZXJyLm1zZyk7CiYjNDM7CiYjNDM7CXJlcSA9IG5ldGRldl9xdWV1ZV9nZXRfcmVxX2FsbG9jKCk7CiYjNDM7CW5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF9pZmluZGV4KHJlcSwgaWZpbmRleCk7CiYjNDM7CW5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF90eXBlKHJlcSwgTkVUREVWX1FVRVVFX1RZUEVfUlgpOwomIzQzOwluZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfaWQocmVxLCBxdWV1ZV9pZCk7CiYjNDM7CiYjNDM7CXJzcCA9IG5ldGRldl9xdWV1ZV9nZXQoeXMsIHJlcSk7CiYjNDM7CWlmICghcnNwKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDtuZXRkZXZfcXVldWVfZ2V0KHE9JWQpOiAlcyYjMzQ7LCBxdWV1ZV9pZCwKJiM0MzsJCSAgICAgIHlzLSZndDtlcnIubXNnKTsKJiM0MzsJaWYgKCFyc3AtJmd0O19wcmVzZW50Lm5hcGlfaWQpCiYjNDM7CQllcnJvcigxLCAwLCAmIzM0O25ldGRldl9xdWV1ZV9nZXQocT0lZCk6IG5hcGlfaWQgbm90IHByZXNlbnQmIzM0OywKJiM0MzsJCSAgICAgIHF1ZXVlX2lkKTsKJiM0MzsKJiM0MzsJbmFwaV9pZCA9IHJzcC0mZ3Q7bmFwaV9pZDsKJiM0MzsKJiM0MzsJbmV0ZGV2X3F1ZXVlX2dldF9yZXFfZnJlZShyZXEpOwomIzQzOwluZXRkZXZfcXVldWVfZ2V0X3JzcF9mcmVlKHJzcCk7CiYjNDM7CXlubF9zb2NrX2Rlc3Ryb3koeXMpOwomIzQzOwomIzQzOwlyZXR1cm4gbmFwaV9pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBmaW5kX3RocmVhZF9ieV9jb25uKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzLCBpbnQgY29ubmZkKQomIzQzO3sKJiM0MzsJc29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpOwomIzQzOwlpbnQgbmFwaV9pZCwgaTsKJiM0MzsKJiM0MzsJaWYgKGdldHNvY2tvcHQoY29ubmZkLCBTT0xfU09DS0VULCBTT19JTkNPTUlOR19OQVBJX0lELCAmYW1wO25hcGlfaWQsICZhbXA7bGVuKSkKJiM0MzsJCWVycm9yKDEsIGVycm5vLCAmIzM0O2dldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpCiYjNDM7CQkJcmV0dXJuIGk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyb3IoMSwgMCwgJiMzNDt1bmtub3duIE5BUEkgSUQ6ICVkJiMzNDssIG5hcGlfaWQpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXB0aHJlYWRfYmFycmllcl90IHNldHVwX2RvbmUsIGRpc3BhdGNoX2RvbmU7CiYjNDM7CWludCB0b3RhbF9jb25ucywgYWNjZXB0ZWQgPSAwLCBjb25uZmQ7CiYjNDM7CXN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzOwomIzQzOwlpbnQgZmQsIHJldCwgZW5hYmxlLCBpOwomIzQzOwl1bnNpZ25lZCBpbnQgaWZpbmRleDsKJiM0MzsJcHRocmVhZF90ICp0aHJlYWRzOwomIzQzOwomIzQzOwljdHhzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCpjdHhzKSk7CiYjNDM7CXRocmVhZHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKnRocmVhZHMpKTsKJiM0MzsJaWYgKCFjdHhzIHx8ICF0aHJlYWRzKQomIzQzOwkJZXJyb3IoMSwgMCwgJiMzNDtjYWxsb2MoKSYjMzQ7KTsKIAogCWZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7CiAJaWYgKGZkID09IC0xKQpAQCAtMzUxLDMyICYjNDM7NDU3LDcxIEBAIHN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZCkKIAlpZiAocmV0ICZsdDsgMCkKIAkJZXJyb3IoMSwgMCwgJiMzNDtiaW5kKCkmIzM0Oyk7CiAKLQlmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ09PUF9UQVNLUlVOOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9TVUJNSVRfQUxMOwotCWZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2luaXQoJmFtcDtzZXR1cF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgJiM0MzsgMSk7CiYjNDM7CXB0aHJlYWRfYmFycmllcl9pbml0KCZhbXA7ZGlzcGF0Y2hfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICYjNDM7IDEpOwogCi0JaW9fdXJpbmdfcXVldWVfaW5pdCg1MTIsICZhbXA7cmluZywgZmxhZ3MpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCAmIzQzOyBpOwomIzQzOwkJY3R4c1tpXS5zZXR1cF9kb25lID0gJmFtcDtzZXR1cF9kb25lOwomIzQzOwkJY3R4c1tpXS5kaXNwYXRjaF9kb25lID0gJmFtcDtkaXNwYXRjaF9kb25lOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjZmdfbnVtX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsCiYjNDM7CQkJCSAgICAgc2VydmVyX3dvcmtlciwgJmFtcDtjdHhzW2ldKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJZXJyb3IoMSwgcmV0LCAmIzM0O3B0aHJlYWRfY3JlYXRlKCkmIzM0Oyk7CiYjNDM7CX0KIAotCXNldHVwX3pjcngoJmFtcDtyaW5nKTsKIAlpZiAoY2ZnX2RyeV9ydW4pCi0JCXJldHVybjsKJiM0MzsJCWdvdG8gam9pbjsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoJmFtcDtzZXR1cF9kb25lKTsKIAogCWlmIChsaXN0ZW4oZmQsIDEwMjQpICZsdDsgMCkKIAkJZXJyb3IoMSwgMCwgJiMzNDtsaXN0ZW4oKSYjMzQ7KTsKIAotCWFkZF9hY2NlcHQoJmFtcDtyaW5nLCBmZCk7CiYjNDM7CWlmIChjZmdfbnVtX3RocmVhZHMgJmd0OyAxKSB7CiYjNDM7CQlpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoY2ZnX2lmbmFtZSk7CiYjNDM7CQlpZiAoIWlmaW5kZXgpCiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDtiYWQgaW50ZXJmYWNlIG5hbWU6ICVzJiMzNDssIGNmZ19pZm5hbWUpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNmZ19udW1fdGhyZWFkczsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY3R4c1tpXS5uYXBpX2lkID0gcXVlcnlfbmFwaV9pZChpZmluZGV4LAomIzQzOwkJCQkJCQljdHhzW2ldLnF1ZXVlX2lkKTsKJiM0MzsJfQogCi0JdHN0b3AgPSBnZXR0aW1lb2ZkYXlfbXMoKSAmIzQzOyA1MDAwOwotCXdoaWxlICghc3RvcCAmYW1wOyZhbXA7IGdldHRpbWVvZmRheV9tcygpICZsdDsgdHN0b3ApCi0JCXNlcnZlcl9sb29wKCZhbXA7cmluZyk7CiYjNDM7CXRvdGFsX2Nvbm5zID0gY2ZnX251bV90aHJlYWRzICogY2ZnX251bV90aHJlYWRzOwomIzQzOwomIzQzOwl3aGlsZSAoYWNjZXB0ZWQgJmx0OyB0b3RhbF9jb25ucykgewomIzQzOwkJaW50IGlkeCA9IDA7CiYjNDM7CiYjNDM7CQljb25uZmQgPSBhY2NlcHQoZmQsIE5VTEwsIE5VTEwpOwomIzQzOwkJaWYgKGNvbm5mZCAmbHQ7IDApCiYjNDM7CQkJZXJyb3IoMSwgZXJybm8sICYjMzQ7YWNjZXB0KCkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlpZiAoY2ZnX251bV90aHJlYWRzICZndDsgMSkKJiM0MzsJCQlpZHggPSBmaW5kX3RocmVhZF9ieV9jb25uKGN0eHMsIGNvbm5mZCk7CiAKLQlpZiAoIXN0b3ApCi0JCWVycm9yKDEsIDAsICYjMzQ7dGVzdCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCWlmIChjdHhzW2lkeF0ubnJfY29ubnMgJmd0Oz0gTUFYX0NPTk5TX1BFUl9USFJFQUQpCiYjNDM7CQkJZXJyb3IoMSwgMCwgJiMzNDt3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvdyYjMzQ7LCBpZHgpOwomIzQzOwkJY3R4c1tpZHhdLmNvbm5mZHNbY3R4c1tpZHhdLm5yX2Nvbm5zJiM0MzsmIzQzO10gPSBjb25uZmQ7CiYjNDM7CQlhY2NlcHRlZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX3dhaXQoJmFtcDtkaXNwYXRjaF9kb25lKTsKJiM0MzsKJiM0Mztqb2luOgomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgY2ZnX251bV90aHJlYWRzOyBpJiM0MzsmIzQzOykKJiM0MzsJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2Rlc3Ryb3koJmFtcDtzZXR1cF9kb25lKTsKJiM0MzsJcHRocmVhZF9iYXJyaWVyX2Rlc3Ryb3koJmFtcDtkaXNwYXRjaF9kb25lKTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlmcmVlKHRocmVhZHMpOwomIzQzOwlmcmVlKGN0eHMpOwogfQogCi1zdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgKmNsaWVudF93b3JrZXIodm9pZCAqYXJnKQogewogCXNzaXplX3QgdG9fc2VuZCA9IGNmZ19zZW5kX3NpemU7CiAJc3NpemVfdCBzZW50ID0gMDsKQEAgLTQwMiwxMiAmIzQzOzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpCiAJfQogCiAJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnVuX2NsaWVudCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHRvdGFsX2Nvbm5zID0gY2ZnX251bV90aHJlYWRzICogY2ZnX251bV90aHJlYWRzOwomIzQzOwlwdGhyZWFkX3QgKnRocmVhZHM7CiYjNDM7CWludCBpLCByZXQ7CiYjNDM7CiYjNDM7CXRocmVhZHMgPSBjYWxsb2ModG90YWxfY29ubnMsIHNpemVvZigqdGhyZWFkcykpOwomIzQzOwlpZiAoIXRocmVhZHMpCiYjNDM7CQllcnJvcigxLCAwLCAmIzM0O2NhbGxvYygpJiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdG90YWxfY29ubnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQllcnJvcigxLCByZXQsICYjMzQ7cHRocmVhZF9jcmVhdGUoKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdG90YWxfY29ubnM7IGkmIzQzOyYjNDM7KQomIzQzOwkJcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwomIzQzOwomIzQzOwlmcmVlKHRocmVhZHMpOwogfQogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpmaWxlcGF0aCkKIHsKIAllcnJvcigxLCAwLCAmIzM0O1VzYWdlOiAlcyAoLTR8LTYpICgtc3wtYykgLWgmbHQ7c2VydmVyX2lwJmd0OyAtcCZsdDtwb3J0Jmd0OyAmIzM0OwotCQkgICAgJiMzNDstbCZsdDtwYXlsb2FkX3NpemUmZ3Q7IC1pJmx0O2lmbmFtZSZndDsgLXEmbHQ7cnhxX2lkJmd0OyYjMzQ7LCBmaWxlcGF0aCk7CiYjNDM7CQkgICAgJiMzNDstbCZsdDtwYXlsb2FkX3NpemUmZ3Q7IC1pJmx0O2lmbmFtZSZndDsgLXEmbHQ7cnhxX2lkJmd0OyAtdCZsdDtudW1fdGhyZWFkcyZndDsmIzM0OywKJiM0MzsJCSAgICBmaWxlcGF0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQpAQCAtNDI1LDcgJiM0Mzs1OTQsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJdXNhZ2UoYXJndlswXSk7CiAJY2ZnX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZCYjMzQ7KSkgIT0gLTEpIHsKJiM0MzsJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7c2NoOnA6bDppOnE6bzp6Ong6ZHQ6JiMzNDspKSAhPSAtMSkgewogCQlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAmIzM5O3MmIzM5OzoKIAkJCWlmIChjZmdfY2xpZW50KQpAQCAtNDY2LDYgJiM0Mzs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJY2FzZSAmIzM5O2QmIzM5OzoKIAkJCWNmZ19kcnlfcnVuID0gdHJ1ZTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQljZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CiYjNDM7CQkJYnJlYWs7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkKQEAgLTMwLDYgJiM0MzszMCwxMyBAQCBkZWYgY3JlYXRlX3Jzc19jdHgoY2ZnKToKICAgICByZXR1cm4gaW50KHZhbHVlcykKIAogCiYjNDM7ZGVmIGNyZWF0ZV9yc3NfY3R4X211bHRpKGNmZywgc3RhcnQsIGNvdW50KToKJiM0MzsgICAgJiMzNDsmIzM0OyYjMzQ7Q3JlYXRlIGFuIFJTUyBjb250ZXh0IHNwYW5uaW5nIGNvdW50IHF1ZXVlcyBmcm9tIHN0YXJ0LCByZXR1cm4gaXRzIElELiYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICBvdXRwdXQgPSBldGh0b29sKGYmIzM0Oy1YIHtjZmcuaWZuYW1lfSBjb250ZXh0IG5ldyBzdGFydCB7c3RhcnR9IGVxdWFsIHtjb3VudH0mIzM0Oykuc3Rkb3V0CiYjNDM7ICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJiMzOTtOZXcgUlNTIGNvbnRleHQgaXMgKFxkJiM0MzspJiMzOTssIG91dHB1dCkuZ3JvdXAoMSkKJiM0MzsgICAgcmV0dXJuIGludCh2YWx1ZXMpCiYjNDM7CiYjNDM7CiBkZWYgc2V0X2Zsb3dfcnVsZShjZmcpOgogICAgIG91dHB1dCA9IGV0aHRvb2woZiYjMzQ7LU4ge2NmZy5pZm5hbWV9IGZsb3ctdHlwZSB0Y3A2IGRzdC1wb3J0IHtjZmcucG9ydH0gYWN0aW9uIHtjZmcudGFyZ2V0fSYjMzQ7KS5zdGRvdXQKICAgICB2YWx1ZXMgPSByZS5zZWFyY2gociYjMzk7SUQgKFxkJiM0MzspJiMzOTssIG91dHB1dCkuZ3JvdXAoMSkKQEAgLTEyNywxNyAmIzQzOzEzNCw1NiBAQCBkZWYgX3JlcXVpcmVfbnR1cGxlKGNmZyk6CiAgICAgICAgIGRlZmVyKGV0aHRvb2wsIGYmIzM0Oy1LIHtjZmcuaWZuYW1lfSBudHVwbGUtZmlsdGVycyBvZmYmIzM0OykKIAogCiYjNDM7ZGVmIHJzc19tdWx0aXF1ZXVlKGNmZyk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1N0ZWVyIHRoZSB0ZXN0IGZsb3cgdG8gYSBtdWx0aS1xdWV1ZSBSU1MgY29udGV4dCBmb3IgbXVsdGktdGhyZWFkIHpjcnguJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIGNoYW5uZWxzID0gY2ZnLmV0aG5sLmNoYW5uZWxzX2dldCh7JiMzOTtoZWFkZXImIzM5OzogeyYjMzk7ZGV2LWluZGV4JiMzOTs6IGNmZy5pZmluZGV4fX0pCiYjNDM7ICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJiMzOTtjb21iaW5lZC1jb3VudCYjMzk7XQomIzQzOyAgICBpZiBjaGFubmVscyAmbHQ7IDM6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzk7VGVzdCByZXF1aXJlcyBORVRJRiB3aXRoIGF0IGxlYXN0IDMgY29tYmluZWQgY2hhbm5lbHMmIzM5OykKJiM0MzsKJiM0MzsgICAgcmluZ3MgPSBjZmcuZXRobmwucmluZ3NfZ2V0KHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fSkKJiM0MzsgICAgcnhfcmluZ3MgPSByaW5nc1smIzM5O3J4JiMzOTtdCiYjNDM7ICAgIGhkc190aHJlc2ggPSByaW5ncy5nZXQoJiMzOTtoZHMtdGhyZXNoJiMzOTssIDApCiYjNDM7CiYjNDM7ICAgIGNmZy5ldGhubC5yaW5nc19zZXQoeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7dGNwLWRhdGEtc3BsaXQmIzM5OzogJiMzOTtlbmFibGVkJiMzOTssCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzk7aGRzLXRocmVzaCYjMzk7OiAwLAomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IDY0fSkKJiM0MzsgICAgZGVmZXIoY2ZnLmV0aG5sLnJpbmdzX3NldCwgeyYjMzk7aGVhZGVyJiMzOTs6IHsmIzM5O2Rldi1pbmRleCYjMzk7OiBjZmcuaWZpbmRleH0sCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3RjcC1kYXRhLXNwbGl0JiMzOTs6ICYjMzk7dW5rbm93biYjMzk7LAomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiMzOTtoZHMtdGhyZXNoJiMzOTs6IGhkc190aHJlc2gsCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIzM5O3J4JiMzOTs6IHJ4X3JpbmdzfSkKJiM0MzsgICAgZGVmZXIobXBfY2xlYXJfd2FpdCwgY2ZnKQomIzQzOwomIzQzOyAgICBjZmcubnVtX3RocmVhZHMgPSAyCiYjNDM7ICAgIGNmZy50YXJnZXQgPSBjaGFubmVscyAtIGNmZy5udW1fdGhyZWFkcwomIzQzOyAgICBldGh0b29sKGYmIzM0Oy1YIHtjZmcuaWZuYW1lfSBlcXVhbCB7Y2ZnLnRhcmdldH0mIzM0OykKJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZiYjMzQ7LVgge2NmZy5pZm5hbWV9IGRlZmF1bHQmIzM0OykKJiM0MzsKJiM0MzsgICAgcnNzX2N0eF9pZCA9IGNyZWF0ZV9yc3NfY3R4X211bHRpKGNmZywgY2ZnLnRhcmdldCwgY2ZnLm51bV90aHJlYWRzKQomIzQzOyAgICBkZWZlcihldGh0b29sLCBmJiMzNDstWCB7Y2ZnLmlmbmFtZX0gZGVsZXRlIGNvbnRleHQge3Jzc19jdHhfaWR9JiMzNDspCiYjNDM7CiYjNDM7ICAgIGZsb3dfcnVsZV9pZCA9IHNldF9mbG93X3J1bGVfcnNzKGNmZywgcnNzX2N0eF9pZCkKJiM0MzsgICAgZGVmZXIoZXRodG9vbCwgZiYjMzQ7LU4ge2NmZy5pZm5hbWV9IGRlbGV0ZSB7Zmxvd19ydWxlX2lkfSYjMzQ7KQomIzQzOwomIzQzOwogQGtzZnRfdmFyaWFudHMoWwogICAgIEtzZnROYW1lZFZhcmlhbnQoJiMzNDtzaW5nbGUmIzM0Oywgc2luZ2xlKSwKICAgICBLc2Z0TmFtZWRWYXJpYW50KCYjMzQ7cnNzJiMzNDssIHJzcyksCiYjNDM7ICAgIEtzZnROYW1lZFZhcmlhbnQoJiMzNDtyc3NfbXVsdGlxdWV1ZSYjMzQ7LCByc3NfbXVsdGlxdWV1ZSksCiBdKQogZGVmIHRlc3RfemNyeChjZmcsIHNldHVwKSAtJmd0OyBOb25lOgogICAgIGNmZy5yZXF1aXJlX2lwdmVyKCYjMzk7NiYjMzk7KQogICAgIF9yZXF1aXJlX250dXBsZShjZmcpCiAKJiM0MzsgICAgY2ZnLm51bV90aHJlYWRzID0gMQomIzQzOwogICAgIHNldHVwKGNmZykKLSAgICByeF9jbWQgPSBmJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9JiMzNDsKLSAgICB0eF9jbWQgPSBmJiMzNDt7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92WyYjMzk7NiYjMzk7XX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MCYjMzQ7CiYjNDM7CiYjNDM7ICAgIHJ4X2NtZCA9IChmJiMzNDt7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gJiMzNDsKJiM0MzsgICAgICAgICAgICAgIGYmIzM0Oy1xIHtjZmcudGFyZ2V0fSAtdCB7Y2ZnLm51bV90aHJlYWRzfSYjMzQ7KQomIzQzOyAgICB0eF9jbWQgPSAoZiYjMzQ7e2NmZy5iaW5fcmVtb3RlfSAtYyAtaCB7Y2ZnLmFkZHJfdlsmIzM5OzYmIzM5O119IC1wIHtjZmcucG9ydH0gJiMzNDsKJiM0MzsgICAgICAgICAgICAgIGYmIzM0Oy1sIDEyODQwIC10IHtjZmcubnVtX3RocmVhZHN9JiMzNDspCiAgICAgd2l0aCBia2cocnhfY21kLCBleGl0X3dhaXQ9VHJ1ZSk6CiAgICAgICAgIHdhaXRfcG9ydF9saXN0ZW4oY2ZnLnBvcnQsIHByb3RvPSYjMzQ7dGNwJiMzNDspCiAgICAgICAgIGNtZCh0eF9jbWQsIGhvc3Q9Y2ZnLnJlbW90ZSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE3NTMKCQkJCQkJCW91dHB1dDogNzMKCQkJCQkJCXRob3VnaHRzOiA0NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBEZWNpc2lvbjogTm8gRnV6emluZyBOZWVkZWQqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kIGRlY2lkZSBpZiBpdCYjMzk7cyB3b3J0aCB0aGUgZnV6emluZyBlZmZvcnQuIE15IGluaXRpYWwgc2NhbiBpbmRpY2F0ZXMgdGhlIGZpbGVzIG1vZGlmaWVkIGFyZTogYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlYCwgYGlvdS16Y3J4LmNgLCBhbmQgYGlvdS16Y3J4LnB5YC4gQmFzZWQgb24gU2VjdGlvbiAyIG9mIHRoZSBjcml0ZXJpYSwgaXQgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBuby1nbywgYnV0IGxldCYjMzk7cyBiZSB0aG9yb3VnaC4KClRoZSBjcnVjaWFsIHBhcnQgaGVyZSBpcyB0aGUgJiMzNDtXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UmIzM0OyBzZWN0aW9uLiBJdCYjMzk7cyBwcmV0dHkgY2xlYXI6IHdlIG9ubHkgc2tpcCBmdXp6aW5nIGlmIGFsbCBjaGFuZ2VzIGZhbGwgaW50byBzcGVjaWZpYyBjYXRlZ29yaWVzLiBUaGUga2V5IHBvaW50IGhlcmUgaXMgdGhhdCB3ZSBoYXZlIG1vZGlmaWNhdGlvbnMgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9gIGRpcmVjdG9yeS4gVGhhdCYjMzk7cyBhIHN0cm9uZyBpbmRpY2F0b3IsIGFzIGB0b29scy9gIGlzIGRlc2lnbmF0ZWQgZm9yIHVzZXItc3BhY2Ugc3R1ZmYuIFdlIG5lZWQgdG8gY29uZmlybSBpdCBkb2VzbiYjMzk7dCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBhbnkga2VybmVsIG1vZHVsZXMuCgpJIG5lZWQgdG8gY29uZmlybSB0aGUgZmlsZXMgdGhlbXNlbHZlcyBhcmUgbm9uLWtlcm5lbC4gQSBxdWljayBzYW5pdHkgY2hlY2sgb2YgdGhlIGZpbGVzIGludm9sdmVkIGNvbmZpcm1zIHRoYXQgdGhleSByZXNpZGUgZW50aXJlbHkgd2l0aGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBObyBjb3JlIGtlcm5lbCBjb2RlIGlzIHRvdWNoZWQsIGZyb20gd2hhdCBJJiMzOTttIHNlZWluZy4KClNvLCBzdW1taW5nIGl0IHVwLCBteSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkLiBUaGUgcGF0Y2ggKm9ubHkqIG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIHVuZGVyIGB0b29scy9gLCBhbmQgaXQgZGVmaW5pdGVseSBkb2VzbiYjMzk7dCB0b3VjaCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUmIzM5O3Mgbm8gbmVlZCB0byBkZWZpbmUgYEZvY3VzU3ltYm9sc2Agb3IgYEVuYWJsZUNvbmZpZ3NgIHNpbmNlIHdlIGFyZW4mIzM5O3QgZnV6emluZyB0aGlzLgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDIwOjU3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMjA6NTc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI2LjQ3Njg3NzI0NVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MDA5NzY4MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI2LjQ3Njg4MjYzNloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI2MDc5Nzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMzlkNDZjODFmMTI1NzA3ZTM5MDE1ZGRiYzVkNTYxN2I2OWY0YmFhN1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIFNlcCA5IDIwOjU3OjI1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGVcXG5pbmRleCBiZDNiOGQyZmE0N2UwLi44YWViZGM2ZmViMTc3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGVcXG5AQCAtMTgsMTAgKzE4LDYgQEAgZWxzZVxcbiAkKHdhcm5pbmcgZXhjbHVkaW5nIGlvdXJpbmcgdGVzdHMsIGxpYnVyaW5nIG5vdCBpbnN0YWxsZWQgb3IgdG9vIG9sZClcXG4gZW5kaWZcXG4gXFxuLVRFU1RfR0VOX0ZJTEVTIDo9IFxcXFxcXG4tXFx0JChDT05EX0dFTl9GSUxFUykgXFxcXFxcbi0jIGVuZCBvZiBURVNUX0dFTl9GSUxFU1xcbi1cXG4gVEVTVF9QUk9HUyA9IFxcXFxcXG4gXFx0Y3N1bS5weSBcXFxcXFxuIFxcdGRldmxpbmtfcmF0ZV9jcm9zc19lc3cucHkgXFxcXFxcbkBAIC04MCw2ICs3Niw3IEBAIFRFU1RfSU5DTFVERVMgOj0gXFxcXFxcbiBZTkxfR0VOX0ZJTEVTIDo9IFxcXFxcXG4gXFx0bmNkZXZtZW0gXFxcXFxcbiBcXHR0b2VwbGl0eiBcXFxcXFxuK1xcdCQoQ09ORF9HRU5fRklMRVMpIFxcXFxcXG4gIyBlbmQgb2YgWU5MX0dFTl9GSUxFU1xcbiBURVNUX0dFTl9GSUxFUyArPSAkKFlOTF9HRU5fRklMRVMpXFxuIFRFU1RfR0VOX0ZJTEVTICs9ICQocGF0c3Vic3QgJS5jLCUubywkKHdpbGRjYXJkICouYnBmLmMpKVxcbkBAIC05Nyw1ICs5NCw1IEBAIGluY2x1ZGUgLi4vLi4vLi4vbmV0L3lubC5ta1xcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcXG4gXFxuIGlmZXEgKCQoSEFTX0lPVVJJTkdfWkNSWCkseSlcXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgKz0gLWx1cmluZ1xcbiskKE9VVFBVVCkvaW91LXpjcng6IExETElCUyArPSAtbHVyaW5nIC1scHRocmVhZFxcbiBlbmRpZlxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xcbmluZGV4IGY2YThmYzVmYWMyNDEuLjkxYjAyNWE4NzcxZTEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcXG5AQCAtNCw2ICs0LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2Vycm9yLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGltaXRzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpbnQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuQEAgLTM3LDYgKzM4LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGlidXJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3lubC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwibmV0ZGV2LXVzZXIuaFxcXCJcXG4gXFxuICNkZWZpbmUgU0tJUF9DT0RFXFx0NDJcXG4gXFxuQEAgLTg1LDE2ICs4OCwyOSBAQCBzdGF0aWMgaW50IGNmZ19zZW5kX3NpemUgPSBTRU5EX1NJWkU7XFxuIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW42IGNmZ19hZGRyO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuO1xcbiBzdGF0aWMgYm9vbCBjZmdfZHJ5X3J1bjtcXG4rc3RhdGljIGludCBjZmdfbnVtX3RocmVhZHMgPSAxO1xcbiBcXG4gc3RhdGljIGNoYXIgKnBheWxvYWQ7XFxuLXN0YXRpYyB2b2lkICphcmVhX3B0cjtcXG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xcbi1zdGF0aWMgc2l6ZV90IHJpbmdfc2l6ZTtcXG4tc3RhdGljIHN0cnVjdCBpb191cmluZ196Y3J4X3JxIHJxX3Jpbmc7XFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XFxuLXN0YXRpYyBpbnQgY29ubmZkO1xcbi1zdGF0aWMgYm9vbCBzdG9wO1xcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xcbitcXG4rI2RlZmluZSBNQVhfQ09OTlNfUEVSX1RIUkVBRFxcdDY0XFxuK1xcbitzdHJ1Y3QgdGhyZWFkX2N0eCB7XFxuK1xcdHN0cnVjdCBpb191cmluZ1xcdFxcdHJpbmc7XFxuK1xcdHZvaWRcXHRcXHRcXHQqYXJlYV9wdHI7XFxuK1xcdHZvaWRcXHRcXHRcXHQqcmluZ19wdHI7XFxuK1xcdHNpemVfdFxcdFxcdFxcdHJpbmdfc2l6ZTtcXG4rXFx0c3RydWN0IGlvX3VyaW5nX3pjcnhfcnFcXHRycV9yaW5nO1xcbitcXHR1bnNpZ25lZCBsb25nXFx0XFx0YXJlYV90b2tlbjtcXG4rXFx0aW50XFx0XFx0XFx0cXVldWVfaWQ7XFxuK1xcdGludFxcdFxcdFxcdG5hcGlfaWQ7XFxuK1xcdHB0aHJlYWRfYmFycmllcl90XFx0KnNldHVwX2RvbmU7XFxuK1xcdHB0aHJlYWRfYmFycmllcl90XFx0KmRpc3BhdGNoX2RvbmU7XFxuK1xcbitcXHRpbnRcXHRcXHRcXHRjb25uZmRzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcXG4rXFx0c2l6ZV90XFx0XFx0XFx0cmVjZWl2ZWRbTUFYX0NPTk5TX1BFUl9USFJFQURdO1xcbitcXHRpbnRcXHRcXHRcXHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcXG4rXFx0aW50XFx0XFx0XFx0bnJfY29ubnM7XFxuK307XFxuIFxcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2ZkYXlfbXModm9pZClcXG4ge1xcbkBAIC0xMzIsMTYgKzE0OCwxNiBAQCBzdGF0aWMgaW5saW5lIHNpemVfdCBnZXRfcmVmaWxsX3Jpbmdfc2l6ZSh1bnNpZ25lZCBpbnQgcnFfZW50cmllcylcXG4ge1xcbiBcXHRzaXplX3Qgc2l6ZTtcXG4gXFxuLVxcdHJpbmdfc2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcXG4rXFx0c2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcXG4gXFx0LyogYWRkIHNwYWNlIGZvciB0aGUgaGVhZGVyIChoZWFkL3RhaWwvZXRjLikgKi9cXG4tXFx0cmluZ19zaXplICs9IHBhZ2Vfc2l6ZTtcXG4tXFx0cmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTtcXG4rXFx0c2l6ZSArPSBwYWdlX3NpemU7XFxuK1xcdHJldHVybiBBTElHTl9VUChzaXplLCBwYWdlX3NpemUpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcXG4rc3RhdGljIHZvaWQgc2V0dXBfemNyeChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxcbiB7XFxuK1xcdHVuc2lnbmVkIGludCBycV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xcbiBcXHR1bnNpZ25lZCBpbnQgaWZpbmRleDtcXG4tXFx0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSA0MDk2O1xcbiBcXHRpbnQgcmV0O1xcbiBcXG4gXFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xcbkBAIC0xNDksNTggKzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImJhZCBpbnRlcmZhY2UgbmFtZTogJXNcXFwiLCBjZmdfaWZuYW1lKTtcXG4gXFxuIFxcdGlmIChjZmdfcnhfYnVmX2xlbiBcXHUwMDI2XFx1MDAyNiBjZmdfcnhfYnVmX2xlbiAhPSBwYWdlX3NpemUpIHtcXG4tXFx0XFx0YXJlYV9wdHIgPSBtbWFwKE5VTEwsXFxuLVxcdFxcdFxcdFxcdEFSRUFfU0laRSxcXG4tXFx0XFx0XFx0XFx0UFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4tXFx0XFx0XFx0XFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcXG4tXFx0XFx0XFx0XFx0TUFQX0hVR0VUTEIgfCBNQVBfSFVHRV8yTUIsXFxuLVxcdFxcdFxcdFxcdC0xLFxcbi1cXHRcXHRcXHRcXHQwKTtcXG4tXFx0XFx0aWYgKGFyZWFfcHRyID09IE1BUF9GQUlMRUQpIHtcXG4rXFx0XFx0Y3R4LVxcdTAwM2VhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBBUkVBX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfFxcbitcXHRcXHRcXHRcXHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxcbitcXHRcXHRcXHRcXHQgICAgIC0xLFxcbitcXHRcXHRcXHRcXHQgICAgIDApO1xcbitcXHRcXHRpZiAoY3R4LVxcdTAwM2VhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKSB7XFxuIFxcdFxcdFxcdHByaW50ZihcXFwiQ2FuJ3QgYWxsb2NhdGUgaHVnZSBwYWdlc1xcXFxuXFxcIik7XFxuIFxcdFxcdFxcdGV4aXQoU0tJUF9DT0RFKTtcXG4gXFx0XFx0fVxcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4tXFx0XFx0XFx0XFx0QVJFQV9TSVpFLFxcbi1cXHRcXHRcXHRcXHRQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbi1cXHRcXHRcXHRcXHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuLVxcdFxcdFxcdFxcdDAsXFxuLVxcdFxcdFxcdFxcdDApO1xcbi1cXHRcXHRpZiAoYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Y3R4LVxcdTAwM2VhcmVhX3B0ciA9IG1tYXAoTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBBUkVBX1NJWkUsXFxuK1xcdFxcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdFxcdFxcdCAgICAgMCxcXG4rXFx0XFx0XFx0XFx0ICAgICAwKTtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRClcXG4gXFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcIm1tYXAoKTogemVybyBjb3B5IGFyZWFcXFwiKTtcXG4gXFx0fVxcbiBcXG4tXFx0cmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XFxuLVxcdHJpbmdfcHRyID0gbW1hcChOVUxMLFxcbi1cXHRcXHRcXHRyaW5nX3NpemUsXFxuLVxcdFxcdFxcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuLVxcdFxcdFxcdE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcXG4tXFx0XFx0XFx0MCxcXG4tXFx0XFx0XFx0MCk7XFxuK1xcdGN0eC1cXHUwMDNlcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XFxuK1xcdGN0eC1cXHUwMDNlcmluZ19wdHIgPSBtbWFwKE5VTEwsXFxuK1xcdFxcdFxcdCAgICAgY3R4LVxcdTAwM2VyaW5nX3NpemUsXFxuK1xcdFxcdFxcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0XFx0ICAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXFxuK1xcdFxcdFxcdCAgICAgMCxcXG4rXFx0XFx0XFx0ICAgICAwKTtcXG4gXFxuIFxcdHN0cnVjdCBpb191cmluZ19yZWdpb25fZGVzYyByZWdpb25fcmVnID0ge1xcbi1cXHRcXHQuc2l6ZSA9IHJpbmdfc2l6ZSxcXG4tXFx0XFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylyaW5nX3B0cixcXG4rXFx0XFx0LnNpemUgPSBjdHgtXFx1MDAzZXJpbmdfc2l6ZSxcXG4rXFx0XFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZyljdHgtXFx1MDAzZXJpbmdfcHRyLFxcbiBcXHRcXHQuZmxhZ3MgPSBJT1JJTkdfTUVNX1JFR0lPTl9UWVBFX1VTRVIsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9hcmVhX3JlZyBhcmVhX3JlZyA9IHtcXG4tXFx0XFx0LmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpYXJlYV9wdHIsXFxuK1xcdFxcdC5hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cXHUwMDNlYXJlYV9wdHIsXFxuIFxcdFxcdC5sZW4gPSBBUkVBX1NJWkUsXFxuIFxcdFxcdC5mbGFncyA9IDAsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3QgdF9pb191cmluZ196Y3J4X2lmcV9yZWcgcmVnID0ge1xcbiBcXHRcXHQuaWZfaWR4ID0gaWZpbmRleCxcXG4tXFx0XFx0LmlmX3J4cSA9IGNmZ19xdWV1ZV9pZCxcXG4rXFx0XFx0LmlmX3J4cSA9IGN0eC1cXHUwMDNlcXVldWVfaWQsXFxuIFxcdFxcdC5ycV9lbnRyaWVzID0gcnFfZW50cmllcyxcXG4gXFx0XFx0LmFyZWFfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKVxcdTAwMjZhcmVhX3JlZyxcXG4gXFx0XFx0LnJlZ2lvbl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpXFx1MDAyNnJlZ2lvbl9yZWcsXFxuIFxcdFxcdC5yeF9idWZfbGVuID0gY2ZnX3J4X2J1Zl9sZW4sXFxuIFxcdH07XFxuIFxcbi1cXHRyZXQgPSBpb191cmluZ19yZWdpc3Rlcl9pZnEocmluZywgKHZvaWQgKilcXHUwMDI2cmVnKTtcXG4rXFx0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFxcdTAwMjZjdHgtXFx1MDAzZXJpbmcsICh2b2lkICopXFx1MDAyNnJlZyk7XFxuIFxcdGlmIChjZmdfcnhfYnVmX2xlbiBcXHUwMDI2XFx1MDAyNiAocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FT1BOT1RTVVBQIHx8XFxuIFxcdFxcdFxcdCAgICAgICByZXQgPT0gLUVSQU5HRSkpIHtcXG4gXFx0XFx0cHJpbnRmKFxcXCJMYXJnZSBjaHVua3MgYXJlIG5vdCBzdXBwb3J0ZWQgJWlcXFxcblxcXCIsIHJldCk7XFxuQEAgLTIwOSw3NCArMjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxcbiBcXHRcXHRlcnJvcigxLCAwLCBcXFwiaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKCk6ICVkXFxcIiwgcmV0KTtcXG4gXFx0fVxcbiBcXG4tXFx0cnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLmhlYWQpO1xcbi1cXHRycV9yaW5nLmt0YWlsID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXJpbmdfcHRyICsgcmVnLm9mZnNldHMudGFpbCk7XFxuLVxcdHJxX3JpbmcucnFlcyA9IChzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLnJxZXMpO1xcbi1cXHRycV9yaW5nLnJxX3RhaWwgPSAwO1xcbi1cXHRycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xcbi1cXG4tXFx0YXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIGFkZF9hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxcbi17XFxuLVxcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcXG4tXFxuLVxcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXFx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMuaGVhZCk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXFx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMudGFpbCk7XFxuK1xcdGN0eC1cXHUwMDNlcnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKWN0eC1cXHUwMDNlcmluZ19wdHIgKyByZWcub2Zmc2V0cy5ycWVzKTtcXG4rXFx0Y3R4LVxcdTAwM2VycV9yaW5nLnJxX3RhaWwgPSAwO1xcbitcXHRjdHgtXFx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzID0gcmVnLnJxX2VudHJpZXM7XFxuIFxcbi1cXHRpb191cmluZ19wcmVwX2FjY2VwdChzcWUsIHNvY2tmZCwgTlVMTCwgTlVMTCwgMCk7XFxuLVxcdHNxZS1cXHUwMDNldXNlcl9kYXRhID0gMTtcXG4rXFx0Y3R4LVxcdTAwM2VhcmVhX3Rva2VuID0gYXJlYV9yZWcucnFfYXJlYV90b2tlbjtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6YyhzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQpXFxuK3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxcbiB7XFxuIFxcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcXG4gXFxuLVxcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XFxuK1xcdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUoXFx1MDAyNmN0eC1cXHUwMDNlcmluZyk7XFxuIFxcbi1cXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgMCwgMCk7XFxuK1xcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVxcdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcXG4rXFx0XFx0XFx0IE5VTEwsIDAsIDApO1xcbiBcXHRzcWUtXFx1MDAzZWlvcHJpbyB8PSBJT1JJTkdfUkVDVl9NVUxUSVNIT1Q7XFxuLVxcdHNxZS1cXHUwMDNldXNlcl9kYXRhID0gMjtcXG4rXFx0c3FlLVxcdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCBpb191cmluZyAqcmluZywgaW50IHNvY2tmZCwgc2l6ZV90IGxlbilcXG4rc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbilcXG4ge1xcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XFxuIFxcbi1cXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xcbitcXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKFxcdTAwMjZjdHgtXFx1MDAzZXJpbmcpO1xcbiBcXG4tXFx0aW9fdXJpbmdfcHJlcF9ydyhJT1JJTkdfT1BfUkVDVl9aQywgc3FlLCBzb2NrZmQsIE5VTEwsIGxlbiwgMCk7XFxuK1xcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVxcdTAwM2Vjb25uZmRzW2Nvbm5faWR4XSxcXG4rXFx0XFx0XFx0IE5VTEwsIGxlbiwgMCk7XFxuIFxcdHNxZS1cXHUwMDNlaW9wcmlvIHw9IElPUklOR19SRUNWX01VTFRJU0hPVDtcXG4tXFx0c3FlLVxcdTAwM2V1c2VyX2RhdGEgPSAyO1xcbitcXHRzcWUtXFx1MDAzZXVzZXJfZGF0YSA9IGNvbm5faWR4O1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBwcm9jZXNzX2FjY2VwdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIHN0cnVjdCBpb191cmluZ19jcWUgKmNxZSlcXG4rc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLFxcbitcXHRcXHRcXHQgICBpbnQgY29ubl9pZHgpXFxuIHtcXG4tXFx0aWYgKGNxZS1cXHUwMDNlcmVzIFxcdTAwM2MgMClcXG4tXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImFjY2VwdCgpXFxcIik7XFxuLVxcdGlmIChjb25uZmQpXFxuLVxcdFxcdGVycm9yKDEsIDAsIFxcXCJVbmV4cGVjdGVkIHNlY29uZCBjb25uZWN0aW9uXFxcIik7XFxuLVxcbi1cXHRjb25uZmQgPSBjcWUtXFx1MDAzZXJlcztcXG4tXFx0aWYgKGNmZ19vbmVzaG90KVxcbi1cXHRcXHRhZGRfcmVjdnpjX29uZXNob3QocmluZywgY29ubmZkLCBwYWdlX3NpemUpO1xcbi1cXHRlbHNlXFxuLVxcdFxcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXFxuLXtcXG4tXFx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcXG4rXFx0dW5zaWduZWQgaW50IHJxX21hc2sgPSBjdHgtXFx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcXG4gXFx0c3RydWN0IGlvX3VyaW5nX3pjcnhfY3FlICpyY3FlO1xcbiBcXHRzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUgKnJxZTtcXG4tXFx0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlO1xcbiBcXHR1aW50NjRfdCBtYXNrO1xcbiBcXHRjaGFyICpkYXRhO1xcbiBcXHRzc2l6ZV90IG47XFxuIFxcdGludCBpO1xcbiBcXG4tXFx0aWYgKGNxZS1cXHUwMDNlcmVzID09IDAgXFx1MDAyNlxcdTAwMjYgY3FlLVxcdTAwM2VmbGFncyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNmZ19vbmVzaG90X3JlY3ZzID09IDApIHtcXG4tXFx0XFx0c3RvcCA9IHRydWU7XFxuK1xcdGlmIChjcWUtXFx1MDAzZXJlcyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNxZS1cXHUwMDNlZmxhZ3MgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSA9PSAwKSB7XFxuK1xcdFxcdGN0eC1cXHUwMDNlbnJfY29ubnMtLTtcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcbkBAIC0yODQsNTkgKzI3OSwxNzAgQEAgc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXFxuIFxcdFxcdGVycm9yKDEsIDAsIFxcXCJyZWN2emMoKTogJWRcXFwiLCBjcWUtXFx1MDAzZXJlcyk7XFxuIFxcbiBcXHRpZiAoY2ZnX29uZXNob3QpIHtcXG4tXFx0XFx0aWYgKGNxZS1cXHUwMDNlcmVzID09IDAgXFx1MDAyNlxcdTAwMjYgY3FlLVxcdTAwM2VmbGFncyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNmZ19vbmVzaG90X3JlY3ZzKSB7XFxuLVxcdFxcdFxcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XFxuLVxcdFxcdFxcdGNmZ19vbmVzaG90X3JlY3ZzLS07XFxuK1xcdFxcdGlmIChjcWUtXFx1MDAzZXJlcyA9PSAwIFxcdTAwMjZcXHUwMDI2IGNxZS1cXHUwMDNlZmxhZ3MgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XSkge1xcbitcXHRcXHRcXHRhZGRfcmVjdnpjX29uZXNob3QoY3R4LCBjb25uX2lkeCwgcGFnZV9zaXplKTtcXG4rXFx0XFx0XFx0Y3R4LVxcdTAwM2VvbmVzaG90X3JlY3ZzW2Nvbm5faWR4XS0tO1xcbitcXHRcXHRcXHRyZXR1cm47XFxuIFxcdFxcdH1cXG4gXFx0fSBlbHNlIGlmICghKGNxZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfQ1FFX0ZfTU9SRSkpIHtcXG4tXFx0XFx0YWRkX3JlY3Z6YyhyaW5nLCBjb25uZmQpO1xcbitcXHRcXHRhZGRfcmVjdnpjKGN0eCwgY29ubl9pZHgpO1xcbiBcXHR9XFxuIFxcbiBcXHRyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgKyAxKTtcXG4gXFxuIFxcdG4gPSBjcWUtXFx1MDAzZXJlcztcXG4gXFx0bWFzayA9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIElPUklOR19aQ1JYX0FSRUFfU0hJRlQpIC0gMTtcXG4tXFx0ZGF0YSA9IChjaGFyICopYXJlYV9wdHIgKyAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgbWFzayk7XFxuK1xcdGRhdGEgPSAoY2hhciAqKWN0eC1cXHUwMDNlYXJlYV9wdHIgKyAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgbWFzayk7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKSB7XFxuLVxcdFxcdGlmICgqKGRhdGEgKyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCArIGkpXSlcXG4rXFx0XFx0aWYgKCooZGF0YSArIGkpICE9IHBheWxvYWRbKGN0eC1cXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICsgaSldKVxcbiBcXHRcXHRcXHRlcnJvcigxLCAwLCBcXFwicGF5bG9hZCBtaXNtYXRjaCBhdCAlZFxcXCIsIGkpO1xcbiBcXHR9XFxuLVxcdHJlY2VpdmVkICs9IG47XFxuK1xcdGN0eC1cXHUwMDNlcmVjZWl2ZWRbY29ubl9pZHhdICs9IG47XFxuIFxcbi1cXHRycWUgPSBcXHUwMDI2cnFfcmluZy5ycWVzWyhycV9yaW5nLnJxX3RhaWwgXFx1MDAyNiBycV9tYXNrKV07XFxuLVxcdHJxZS1cXHUwMDNlb2ZmID0gKHJjcWUtXFx1MDAzZW9mZiBcXHUwMDI2IH5JT1JJTkdfWkNSWF9BUkVBX01BU0spIHwgYXJlYV90b2tlbjtcXG4rXFx0cnFlID0gXFx1MDAyNmN0eC1cXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXFx1MDAzZXJxX3JpbmcucnFfdGFpbCBcXHUwMDI2IHJxX21hc2spXTtcXG4rXFx0cnFlLVxcdTAwM2VvZmYgPSAocmNxZS1cXHUwMDNlb2ZmIFxcdTAwMjYgfklPUklOR19aQ1JYX0FSRUFfTUFTSykgfCBjdHgtXFx1MDAzZWFyZWFfdG9rZW47XFxuIFxcdHJxZS1cXHUwMDNlbGVuID0gY3FlLVxcdTAwM2VyZXM7XFxuLVxcdGlvX3VyaW5nX3NtcF9zdG9yZV9yZWxlYXNlKHJxX3Jpbmcua3RhaWwsICsrcnFfcmluZy5ycV90YWlsKTtcXG4rXFx0aW9fdXJpbmdfc21wX3N0b3JlX3JlbGVhc2UoY3R4LVxcdTAwM2VycV9yaW5nLmt0YWlsLCArK2N0eC1cXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxcbitzdGF0aWMgdm9pZCBzZXJ2ZXJfbG9vcChzdHJ1Y3QgdGhyZWFkX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHN0cnVjdCBpb191cmluZ19jcWUgKmNxZTtcXG4gXFx0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcXG4gXFx0dW5zaWduZWQgaW50IGhlYWQ7XFxuLVxcdGludCBpLCByZXQ7XFxuIFxcbi1cXHRpb191cmluZ19zdWJtaXRfYW5kX3dhaXQocmluZywgMSk7XFxuK1xcdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCAxKTtcXG4gXFxuLVxcdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShyaW5nLCBoZWFkLCBjcWUpIHtcXG4tXFx0XFx0aWYgKGNxZS1cXHUwMDNldXNlcl9kYXRhID09IDEpXFxuLVxcdFxcdFxcdHByb2Nlc3NfYWNjZXB0KHJpbmcsIGNxZSk7XFxuLVxcdFxcdGVsc2UgaWYgKGNxZS1cXHUwMDNldXNlcl9kYXRhID09IDIpXFxuLVxcdFxcdFxcdHByb2Nlc3NfcmVjdnpjKHJpbmcsIGNxZSk7XFxuLVxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcInVua25vd24gY3FlXFxcIik7XFxuK1xcdGlvX3VyaW5nX2Zvcl9lYWNoX2NxZShcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBoZWFkLCBjcWUpIHtcXG4rXFx0XFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cXHUwMDNldXNlcl9kYXRhKTtcXG4gXFx0XFx0Y291bnQrKztcXG4gXFx0fVxcbi1cXHRpb191cmluZ19jcV9hZHZhbmNlKHJpbmcsIGNvdW50KTtcXG4rXFx0aW9fdXJpbmdfY3FfYWR2YW5jZShcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBjb3VudCk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcXG4rc3RhdGljIHZvaWQgKnNlcnZlcl93b3JrZXIodm9pZCAqYXJnKVxcbiB7XFxuLVxcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XFxuLVxcdHN0cnVjdCBpb191cmluZyByaW5nO1xcbi1cXHRpbnQgZmQsIGVuYWJsZSwgcmV0O1xcbitcXHRzdHJ1Y3QgaW9fdXJpbmdfcGFyYW1zIHBhcmFtcyA9IHsgfTtcXG4rXFx0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcXG4gXFx0dWludDY0X3QgdHN0b3A7XFxuK1xcdGludCBucl9jb25ucztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9TSU5HTEVfSVNTVUVSO1xcbitcXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0RFRkVSX1RBU0tSVU47XFxuK1xcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUUUzMjtcXG4rXFx0cGFyYW1zLmZsYWdzIHw9IElPUklOR19TRVRVUF9DUVNJWkU7XFxuK1xcdHBhcmFtcy5jcV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xcbitcXG4rXFx0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcXHUwMDI2Y3R4LVxcdTAwM2VyaW5nLCBcXHUwMDI2cGFyYW1zKTtcXG4rXFx0c2V0dXBfemNyeChjdHgpO1xcbitcXG4rXFx0aWYgKGNmZ19kcnlfcnVuKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KGN0eC1cXHUwMDNlc2V0dXBfZG9uZSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KGN0eC1cXHUwMDNlZGlzcGF0Y2hfZG9uZSk7XFxuK1xcbitcXHRucl9jb25ucyA9IGN0eC1cXHUwMDNlbnJfY29ubnM7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY3R4LVxcdTAwM2Vucl9jb25uczsgaSsrKSB7XFxuK1xcdFxcdGlmIChjZmdfb25lc2hvdCkge1xcbitcXHRcXHRcXHRjdHgtXFx1MDAzZW9uZXNob3RfcmVjdnNbaV0gPSBjZmdfb25lc2hvdF9yZWN2cztcXG4rXFx0XFx0XFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgaSwgcGFnZV9zaXplKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YWRkX3JlY3Z6YyhjdHgsIGkpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xcbitcXHR3aGlsZSAoY3R4LVxcdTAwM2Vucl9jb25ucyBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXFx1MDAzYyB0c3RvcClcXG4rXFx0XFx0c2VydmVyX2xvb3AoY3R4KTtcXG4rXFxuK1xcdGlmIChjdHgtXFx1MDAzZW5yX2Nvbm5zICE9IDApXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJ0ZXN0IGZhaWxlZDogJWQgY29ubmVjdGlvbnMgaW5jb21wbGV0ZVxcXCIsXFxuK1xcdFxcdCAgICAgIGN0eC1cXHUwMDNlbnJfY29ubnMpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2Nvbm5zOyBpKyspIHtcXG4rXFx0XFx0aWYgKGNmZ19vbmVzaG90KSB7XFxuK1xcdFxcdFxcdGlmICghY3R4LVxcdTAwM2VyZWNlaXZlZFtpXSlcXG4rXFx0XFx0XFx0XFx0ZXJyb3IoMSwgMCwgXFxcImNvbm5lY3Rpb24gJWQgcmVjZWl2ZWQgbm8gZGF0YVxcXCIsIGkpO1xcbitcXHRcXHR9IGVsc2UgaWYgKGN0eC1cXHUwMDNlcmVjZWl2ZWRbaV0gIT0gKHNpemVfdCljZmdfc2VuZF9zaXplKSB7XFxuK1xcdFxcdFxcdGVycm9yKDEsIDAsIFxcXCJjb25uZWN0aW9uICVkIHJlY2VpdmVkICV6dSBvZiAlZCBieXRlc1xcXCIsXFxuK1xcdFxcdFxcdCAgICAgIGksIGN0eC1cXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHF1ZXJ5X25hcGlfaWQodW5zaWduZWQgaW50IGlmaW5kZXgsIGludCBxdWV1ZV9pZClcXG4re1xcbitcXHRzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yZXEgKnJlcTtcXG4rXFx0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcnNwICpyc3A7XFxuK1xcdHN0cnVjdCB5bmxfZXJyb3IgeWVycjtcXG4rXFx0c3RydWN0IHlubF9zb2NrICp5cztcXG4rXFx0aW50IG5hcGlfaWQ7XFxuK1xcbitcXHR5cyA9IHlubF9zb2NrX2NyZWF0ZShcXHUwMDI2eW5sX25ldGRldl9mYW1pbHksIFxcdTAwMjZ5ZXJyKTtcXG4rXFx0aWYgKCF5cylcXG4rXFx0XFx0ZXJyb3IoMSwgMCwgXFxcInlubF9zb2NrX2NyZWF0ZTogJXNcXFwiLCB5ZXJyLm1zZyk7XFxuK1xcbitcXHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfaWZpbmRleChyZXEsIGlmaW5kZXgpO1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9zZXRfdHlwZShyZXEsIE5FVERFVl9RVUVVRV9UWVBFX1JYKTtcXG4rXFx0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xcbitcXG4rXFx0cnNwID0gbmV0ZGV2X3F1ZXVlX2dldCh5cywgcmVxKTtcXG4rXFx0aWYgKCFyc3ApXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJuZXRkZXZfcXVldWVfZ2V0KHE9JWQpOiAlc1xcXCIsIHF1ZXVlX2lkLFxcbitcXHRcXHQgICAgICB5cy1cXHUwMDNlZXJyLm1zZyk7XFxuK1xcdGlmICghcnNwLVxcdTAwM2VfcHJlc2VudC5uYXBpX2lkKVxcbitcXHRcXHRlcnJvcigxLCAwLCBcXFwibmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogbmFwaV9pZCBub3QgcHJlc2VudFxcXCIsXFxuK1xcdFxcdCAgICAgIHF1ZXVlX2lkKTtcXG4rXFxuK1xcdG5hcGlfaWQgPSByc3AtXFx1MDAzZW5hcGlfaWQ7XFxuK1xcbitcXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9mcmVlKHJlcSk7XFxuK1xcdG5ldGRldl9xdWV1ZV9nZXRfcnNwX2ZyZWUocnNwKTtcXG4rXFx0eW5sX3NvY2tfZGVzdHJveSh5cyk7XFxuK1xcbitcXHRyZXR1cm4gbmFwaV9pZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmaW5kX3RocmVhZF9ieV9jb25uKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzLCBpbnQgY29ubmZkKVxcbit7XFxuK1xcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoaW50KTtcXG4rXFx0aW50IG5hcGlfaWQsIGk7XFxuK1xcbitcXHRpZiAoZ2V0c29ja29wdChjb25uZmQsIFNPTF9TT0NLRVQsIFNPX0lOQ09NSU5HX05BUElfSUQsIFxcdTAwMjZuYXBpX2lkLCBcXHUwMDI2bGVuKSlcXG4rXFx0XFx0ZXJyb3IoMSwgZXJybm8sIFxcXCJnZXRzb2Nrb3B0KFNPX0lOQ09NSU5HX05BUElfSUQpXFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0aWYgKGN0eHNbaV0ubmFwaV9pZCA9PSBuYXBpX2lkKVxcbitcXHRcXHRcXHRyZXR1cm4gaTtcXG4rXFx0fVxcbitcXG4rXFx0ZXJyb3IoMSwgMCwgXFxcInVua25vd24gTkFQSSBJRDogJWRcXFwiLCBuYXBpX2lkKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXFxuK3tcXG4rXFx0cHRocmVhZF9iYXJyaWVyX3Qgc2V0dXBfZG9uZSwgZGlzcGF0Y2hfZG9uZTtcXG4rXFx0aW50IHRvdGFsX2Nvbm5zLCBhY2NlcHRlZCA9IDAsIGNvbm5mZDtcXG4rXFx0c3RydWN0IHRocmVhZF9jdHggKmN0eHM7XFxuK1xcdGludCBmZCwgcmV0LCBlbmFibGUsIGk7XFxuK1xcdHVuc2lnbmVkIGludCBpZmluZGV4O1xcbitcXHRwdGhyZWFkX3QgKnRocmVhZHM7XFxuK1xcbitcXHRjdHhzID0gY2FsbG9jKGNmZ19udW1fdGhyZWFkcywgc2l6ZW9mKCpjdHhzKSk7XFxuK1xcdHRocmVhZHMgPSBjYWxsb2MoY2ZnX251bV90aHJlYWRzLCBzaXplb2YoKnRocmVhZHMpKTtcXG4rXFx0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxcbitcXHRcXHRlcnJvcigxLCAwLCBcXFwiY2FsbG9jKClcXFwiKTtcXG4gXFxuIFxcdGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XFxuIFxcdGlmIChmZCA9PSAtMSlcXG5AQCAtMzUxLDMyICs0NTcsNzEgQEAgc3RhdGljIHZvaWQgcnVuX3NlcnZlcih2b2lkKVxcbiBcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImJpbmQoKVxcXCIpO1xcbiBcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NJTkdMRV9JU1NVRVI7XFxuLVxcdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xcbi1cXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcXG4tXFx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRRTMyO1xcbitcXHRwdGhyZWFkX2JhcnJpZXJfaW5pdChcXHUwMDI2c2V0dXBfZG9uZSwgTlVMTCwgY2ZnX251bV90aHJlYWRzICsgMSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl9pbml0KFxcdTAwMjZkaXNwYXRjaF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgKyAxKTtcXG4gXFxuLVxcdGlvX3VyaW5nX3F1ZXVlX2luaXQoNTEyLCBcXHUwMDI2cmluZywgZmxhZ3MpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0Y3R4c1tpXS5xdWV1ZV9pZCA9IGNmZ19xdWV1ZV9pZCArIGk7XFxuK1xcdFxcdGN0eHNbaV0uc2V0dXBfZG9uZSA9IFxcdTAwMjZzZXR1cF9kb25lO1xcbitcXHRcXHRjdHhzW2ldLmRpc3BhdGNoX2RvbmUgPSBcXHUwMDI2ZGlzcGF0Y2hfZG9uZTtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLFxcbitcXHRcXHRcXHRcXHQgICAgIHNlcnZlcl93b3JrZXIsIFxcdTAwMjZjdHhzW2ldKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0ZXJyb3IoMSwgcmV0LCBcXFwicHRocmVhZF9jcmVhdGUoKVxcXCIpO1xcbitcXHR9XFxuIFxcbi1cXHRzZXR1cF96Y3J4KFxcdTAwMjZyaW5nKTtcXG4gXFx0aWYgKGNmZ19kcnlfcnVuKVxcbi1cXHRcXHRyZXR1cm47XFxuK1xcdFxcdGdvdG8gam9pbjtcXG4rXFxuK1xcdHB0aHJlYWRfYmFycmllcl93YWl0KFxcdTAwMjZzZXR1cF9kb25lKTtcXG4gXFxuIFxcdGlmIChsaXN0ZW4oZmQsIDEwMjQpIFxcdTAwM2MgMClcXG4gXFx0XFx0ZXJyb3IoMSwgMCwgXFxcImxpc3RlbigpXFxcIik7XFxuIFxcbi1cXHRhZGRfYWNjZXB0KFxcdTAwMjZyaW5nLCBmZCk7XFxuK1xcdGlmIChjZmdfbnVtX3RocmVhZHMgXFx1MDAzZSAxKSB7XFxuK1xcdFxcdGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTtcXG4rXFx0XFx0aWYgKCFpZmluZGV4KVxcbitcXHRcXHRcXHRlcnJvcigxLCAwLCBcXFwiYmFkIGludGVyZmFjZSBuYW1lOiAlc1xcXCIsIGNmZ19pZm5hbWUpO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspXFxuK1xcdFxcdFxcdGN0eHNbaV0ubmFwaV9pZCA9IHF1ZXJ5X25hcGlfaWQoaWZpbmRleCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0Y3R4c1tpXS5xdWV1ZV9pZCk7XFxuK1xcdH1cXG4gXFxuLVxcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xcbi1cXHR3aGlsZSAoIXN0b3AgXFx1MDAyNlxcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXFx1MDAzYyB0c3RvcClcXG4tXFx0XFx0c2VydmVyX2xvb3AoXFx1MDAyNnJpbmcpO1xcbitcXHR0b3RhbF9jb25ucyA9IGNmZ19udW1fdGhyZWFkcyAqIGNmZ19udW1fdGhyZWFkcztcXG4rXFxuK1xcdHdoaWxlIChhY2NlcHRlZCBcXHUwMDNjIHRvdGFsX2Nvbm5zKSB7XFxuK1xcdFxcdGludCBpZHggPSAwO1xcbitcXG4rXFx0XFx0Y29ubmZkID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKTtcXG4rXFx0XFx0aWYgKGNvbm5mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGVycm9yKDEsIGVycm5vLCBcXFwiYWNjZXB0KClcXFwiKTtcXG4rXFxuK1xcdFxcdGlmIChjZmdfbnVtX3RocmVhZHMgXFx1MDAzZSAxKVxcbitcXHRcXHRcXHRpZHggPSBmaW5kX3RocmVhZF9ieV9jb25uKGN0eHMsIGNvbm5mZCk7XFxuIFxcbi1cXHRpZiAoIXN0b3ApXFxuLVxcdFxcdGVycm9yKDEsIDAsIFxcXCJ0ZXN0IGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdGlmIChjdHhzW2lkeF0ubnJfY29ubnMgXFx1MDAzZT0gTUFYX0NPTk5TX1BFUl9USFJFQUQpXFxuK1xcdFxcdFxcdGVycm9yKDEsIDAsIFxcXCJ3b3JrZXIgJWQgY29ubmVjdGlvbiBvdmVyZmxvd1xcXCIsIGlkeCk7XFxuK1xcdFxcdGN0eHNbaWR4XS5jb25uZmRzW2N0eHNbaWR4XS5ucl9jb25ucysrXSA9IGNvbm5mZDtcXG4rXFx0XFx0YWNjZXB0ZWQrKztcXG4rXFx0fVxcbitcXG4rXFx0cHRocmVhZF9iYXJyaWVyX3dhaXQoXFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xcbitcXG4ram9pbjpcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKVxcbitcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcbitcXHRwdGhyZWFkX2JhcnJpZXJfZGVzdHJveShcXHUwMDI2c2V0dXBfZG9uZSk7XFxuK1xcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFxcdTAwMjZkaXNwYXRjaF9kb25lKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRmcmVlKHRocmVhZHMpO1xcbitcXHRmcmVlKGN0eHMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXFxuK3N0YXRpYyB2b2lkICpjbGllbnRfd29ya2VyKHZvaWQgKmFyZylcXG4ge1xcbiBcXHRzc2l6ZV90IHRvX3NlbmQgPSBjZmdfc2VuZF9zaXplO1xcbiBcXHRzc2l6ZV90IHNlbnQgPSAwO1xcbkBAIC00MDIsMTIgKzU0NywzNiBAQCBzdGF0aWMgdm9pZCBydW5fY2xpZW50KHZvaWQpXFxuIFxcdH1cXG4gXFxuIFxcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcXG4re1xcbitcXHRpbnQgdG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XFxuK1xcdHB0aHJlYWRfdCAqdGhyZWFkcztcXG4rXFx0aW50IGksIHJldDtcXG4rXFxuK1xcdHRocmVhZHMgPSBjYWxsb2ModG90YWxfY29ubnMsIHNpemVvZigqdGhyZWFkcykpO1xcbitcXHRpZiAoIXRocmVhZHMpXFxuK1xcdFxcdGVycm9yKDEsIDAsIFxcXCJjYWxsb2MoKVxcXCIpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRvdGFsX2Nvbm5zOyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gcHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRlcnJvcigxLCByZXQsIFxcXCJwdGhyZWFkX2NyZWF0ZSgpXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0b3RhbF9jb25uczsgaSsrKVxcbitcXHRcXHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XFxuK1xcbitcXHRmcmVlKHRocmVhZHMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpmaWxlcGF0aClcXG4ge1xcbiBcXHRlcnJvcigxLCAwLCBcXFwiVXNhZ2U6ICVzICgtNHwtNikgKC1zfC1jKSAtaFxcdTAwM2NzZXJ2ZXJfaXBcXHUwMDNlIC1wXFx1MDAzY3BvcnRcXHUwMDNlIFxcXCJcXG4tXFx0XFx0ICAgIFxcXCItbFxcdTAwM2NwYXlsb2FkX3NpemVcXHUwMDNlIC1pXFx1MDAzY2lmbmFtZVxcdTAwM2UgLXFcXHUwMDNjcnhxX2lkXFx1MDAzZVxcXCIsIGZpbGVwYXRoKTtcXG4rXFx0XFx0ICAgIFxcXCItbFxcdTAwM2NwYXlsb2FkX3NpemVcXHUwMDNlIC1pXFx1MDAzY2lmbmFtZVxcdTAwM2UgLXFcXHUwMDNjcnhxX2lkXFx1MDAzZSAtdFxcdTAwM2NudW1fdGhyZWFkc1xcdTAwM2VcXFwiLFxcbitcXHRcXHQgICAgZmlsZXBhdGgpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcXG5AQCAtNDI1LDcgKzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR1c2FnZShhcmd2WzBdKTtcXG4gXFx0Y2ZnX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuO1xcbiBcXG4tXFx0d2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJzY2g6cDpsOmk6cTpvOno6eDpkXFxcIikpICE9IC0xKSB7XFxuK1xcdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcXFwic2NoOnA6bDppOnE6bzp6Ong6ZHQ6XFxcIikpICE9IC0xKSB7XFxuIFxcdFxcdHN3aXRjaCAoYykge1xcbiBcXHRcXHRjYXNlICdzJzpcXG4gXFx0XFx0XFx0aWYgKGNmZ19jbGllbnQpXFxuQEAgLTQ2Niw2ICs2MzUsOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0Y2FzZSAnZCc6XFxuIFxcdFxcdFxcdGNmZ19kcnlfcnVuID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHRjZmdfbnVtX3RocmVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHlcXG5pbmRleCBiN2EyMjVmZTRiZWFlLi5jODMzNTM1ZDhhMDNjIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHlcXG5AQCAtMzAsNiArMzAsMTMgQEAgZGVmIGNyZWF0ZV9yc3NfY3R4KGNmZyk6XFxuICAgICByZXR1cm4gaW50KHZhbHVlcylcXG4gXFxuIFxcbitkZWYgY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBzdGFydCwgY291bnQpOlxcbisgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIFJTUyBjb250ZXh0IHNwYW5uaW5nIGNvdW50IHF1ZXVlcyBmcm9tIHN0YXJ0LCByZXR1cm4gaXRzIElELlxcXCJcXFwiXFxcIlxcbisgICAgb3V0cHV0ID0gZXRodG9vbChmXFxcIi1YIHtjZmcuaWZuYW1lfSBjb250ZXh0IG5ldyBzdGFydCB7c3RhcnR9IGVxdWFsIHtjb3VudH1cXFwiKS5zdGRvdXRcXG4rICAgIHZhbHVlcyA9IHJlLnNlYXJjaChyJ05ldyBSU1MgY29udGV4dCBpcyAoXFxcXGQrKScsIG91dHB1dCkuZ3JvdXAoMSlcXG4rICAgIHJldHVybiBpbnQodmFsdWVzKVxcbitcXG4rXFxuIGRlZiBzZXRfZmxvd19ydWxlKGNmZyk6XFxuICAgICBvdXRwdXQgPSBldGh0b29sKGZcXFwiLU4ge2NmZy5pZm5hbWV9IGZsb3ctdHlwZSB0Y3A2IGRzdC1wb3J0IHtjZmcucG9ydH0gYWN0aW9uIHtjZmcudGFyZ2V0fVxcXCIpLnN0ZG91dFxcbiAgICAgdmFsdWVzID0gcmUuc2VhcmNoKHInSUQgKFxcXFxkKyknLCBvdXRwdXQpLmdyb3VwKDEpXFxuQEAgLTEyNywxNyArMTM0LDU2IEBAIGRlZiBfcmVxdWlyZV9udHVwbGUoY2ZnKTpcXG4gICAgICAgICBkZWZlcihldGh0b29sLCBmXFxcIi1LIHtjZmcuaWZuYW1lfSBudHVwbGUtZmlsdGVycyBvZmZcXFwiKVxcbiBcXG4gXFxuK2RlZiByc3NfbXVsdGlxdWV1ZShjZmcpOlxcbisgICAgXFxcIlxcXCJcXFwiU3RlZXIgdGhlIHRlc3QgZmxvdyB0byBhIG11bHRpLXF1ZXVlIFJTUyBjb250ZXh0IGZvciBtdWx0aS10aHJlYWQgemNyeC5cXFwiXFxcIlxcXCJcXG4rICAgIGNoYW5uZWxzID0gY2ZnLmV0aG5sLmNoYW5uZWxzX2dldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9fSlcXG4rICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJ2NvbWJpbmVkLWNvdW50J11cXG4rICAgIGlmIGNoYW5uZWxzIFxcdTAwM2MgMzpcXG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCdUZXN0IHJlcXVpcmVzIE5FVElGIHdpdGggYXQgbGVhc3QgMyBjb21iaW5lZCBjaGFubmVscycpXFxuK1xcbisgICAgcmluZ3MgPSBjZmcuZXRobmwucmluZ3NfZ2V0KHsnaGVhZGVyJzogeydkZXYtaW5kZXgnOiBjZmcuaWZpbmRleH19KVxcbisgICAgcnhfcmluZ3MgPSByaW5nc1sncngnXVxcbisgICAgaGRzX3RocmVzaCA9IHJpbmdzLmdldCgnaGRzLXRocmVzaCcsIDApXFxuK1xcbisgICAgY2ZnLmV0aG5sLnJpbmdzX3NldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjcC1kYXRhLXNwbGl0JzogJ2VuYWJsZWQnLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiAwLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogNjR9KVxcbisgICAgZGVmZXIoY2ZnLmV0aG5sLnJpbmdzX3NldCwgeydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fSxcXG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGNwLWRhdGEtc3BsaXQnOiAndW5rbm93bicsXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiBoZHNfdGhyZXNoLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyeCc6IHJ4X3JpbmdzfSlcXG4rICAgIGRlZmVyKG1wX2NsZWFyX3dhaXQsIGNmZylcXG4rXFxuKyAgICBjZmcubnVtX3RocmVhZHMgPSAyXFxuKyAgICBjZmcudGFyZ2V0ID0gY2hhbm5lbHMgLSBjZmcubnVtX3RocmVhZHNcXG4rICAgIGV0aHRvb2woZlxcXCItWCB7Y2ZnLmlmbmFtZX0gZXF1YWwge2NmZy50YXJnZXR9XFxcIilcXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcXFwiLVgge2NmZy5pZm5hbWV9IGRlZmF1bHRcXFwiKVxcbitcXG4rICAgIHJzc19jdHhfaWQgPSBjcmVhdGVfcnNzX2N0eF9tdWx0aShjZmcsIGNmZy50YXJnZXQsIGNmZy5udW1fdGhyZWFkcylcXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcXFwiLVgge2NmZy5pZm5hbWV9IGRlbGV0ZSBjb250ZXh0IHtyc3NfY3R4X2lkfVxcXCIpXFxuK1xcbisgICAgZmxvd19ydWxlX2lkID0gc2V0X2Zsb3dfcnVsZV9yc3MoY2ZnLCByc3NfY3R4X2lkKVxcbisgICAgZGVmZXIoZXRodG9vbCwgZlxcXCItTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XFxcIilcXG4rXFxuK1xcbiBAa3NmdF92YXJpYW50cyhbXFxuICAgICBLc2Z0TmFtZWRWYXJpYW50KFxcXCJzaW5nbGVcXFwiLCBzaW5nbGUpLFxcbiAgICAgS3NmdE5hbWVkVmFyaWFudChcXFwicnNzXFxcIiwgcnNzKSxcXG4rICAgIEtzZnROYW1lZFZhcmlhbnQoXFxcInJzc19tdWx0aXF1ZXVlXFxcIiwgcnNzX211bHRpcXVldWUpLFxcbiBdKVxcbiBkZWYgdGVzdF96Y3J4KGNmZywgc2V0dXApIC1cXHUwMDNlIE5vbmU6XFxuICAgICBjZmcucmVxdWlyZV9pcHZlcignNicpXFxuICAgICBfcmVxdWlyZV9udHVwbGUoY2ZnKVxcbiBcXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDFcXG4rXFxuICAgICBzZXR1cChjZmcpXFxuLSAgICByeF9jbWQgPSBmXFxcIntjZmcuYmluX2xvY2FsfSAtcyAtcCB7Y2ZnLnBvcnR9IC1pIHtjZmcuaWZuYW1lfSAtcSB7Y2ZnLnRhcmdldH1cXFwiXFxuLSAgICB0eF9jbWQgPSBmXFxcIntjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJzYnXX0gLXAge2NmZy5wb3J0fSAtbCAxMjg0MFxcXCJcXG4rXFxuKyAgICByeF9jbWQgPSAoZlxcXCJ7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gXFxcIlxcbisgICAgICAgICAgICAgIGZcXFwiLXEge2NmZy50YXJnZXR9IC10IHtjZmcubnVtX3RocmVhZHN9XFxcIilcXG4rICAgIHR4X2NtZCA9IChmXFxcIntjZmcuYmluX3JlbW90ZX0gLWMgLWgge2NmZy5hZGRyX3ZbJzYnXX0gLXAge2NmZy5wb3J0fSBcXFwiXFxuKyAgICAgICAgICAgICAgZlxcXCItbCAxMjg0MCAtdCB7Y2ZnLm51bV90aHJlYWRzfVxcXCIpXFxuICAgICB3aXRoIGJrZyhyeF9jbWQsIGV4aXRfd2FpdD1UcnVlKTpcXG4gICAgICAgICB3YWl0X3BvcnRfbGlzdGVuKGNmZy5wb3J0LCBwcm90bz1cXFwidGNwXFxcIilcXG4gICAgICAgICBjbWQodHhfY21kLCBob3N0PWNmZy5yZW1vdGUpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI3LjAwMzczMTMxNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6Mzg3NDEwOTYwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM5ZDQ2YzgxZjEyNTcwN2UzOTAxNWRkYmM1ZDU2MTdiNjlmNGJhYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDIwOjU3OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuaW5kZXggYmQzYjhkMmZhNDdlMC4uOGFlYmRjNmZlYjE3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9NYWtlZmlsZVxuQEAgLTE4LDEwICsxOCw2IEBAIGVsc2VcbiAkKHdhcm5pbmcgZXhjbHVkaW5nIGlvdXJpbmcgdGVzdHMsIGxpYnVyaW5nIG5vdCBpbnN0YWxsZWQgb3IgdG9vIG9sZClcbiBlbmRpZlxuIFxuLVRFU1RfR0VOX0ZJTEVTIDo9IFxcXG4tXHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuLSMgZW5kIG9mIFRFU1RfR0VOX0ZJTEVTXG4tXG4gVEVTVF9QUk9HUyA9IFxcXG4gXHRjc3VtLnB5IFxcXG4gXHRkZXZsaW5rX3JhdGVfY3Jvc3NfZXN3LnB5IFxcXG5AQCAtODAsNiArNzYsNyBAQCBURVNUX0lOQ0xVREVTIDo9IFxcXG4gWU5MX0dFTl9GSUxFUyA6PSBcXFxuIFx0bmNkZXZtZW0gXFxcbiBcdHRvZXBsaXR6IFxcXG4rXHQkKENPTkRfR0VOX0ZJTEVTKSBcXFxuICMgZW5kIG9mIFlOTF9HRU5fRklMRVNcbiBURVNUX0dFTl9GSUxFUyArPSAkKFlOTF9HRU5fRklMRVMpXG4gVEVTVF9HRU5fRklMRVMgKz0gJChwYXRzdWJzdCAlLmMsJS5vLCQod2lsZGNhcmQgKi5icGYuYykpXG5AQCAtOTcsNSArOTQsNSBAQCBpbmNsdWRlIC4uLy4uLy4uL25ldC95bmwubWtcbiBpbmNsdWRlIC4uLy4uLy4uL25ldC9icGYubWtcbiBcbiBpZmVxICgkKEhBU19JT1VSSU5HX1pDUlgpLHkpXG4tJChPVVRQVVQpL2lvdS16Y3J4OiBMRExJQlMgKz0gLWx1cmluZ1xuKyQoT1VUUFVUKS9pb3UtemNyeDogTERMSUJTICs9IC1sdXJpbmcgLWxwdGhyZWFkXG4gZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcnguY1xuaW5kZXggZjZhOGZjNWZhYzI0MS4uOTFiMDI1YTg3NzFlMSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LmNcbkBAIC00LDYgKzQsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2Vycm9yLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbkBAIC0zNyw2ICszOCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY2xpYnVyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N5bmwuaFx1MDAzZVxuKyNpbmNsdWRlIFwibmV0ZGV2LXVzZXIuaFwiXG4gXG4gI2RlZmluZSBTS0lQX0NPREVcdDQyXG4gXG5AQCAtODUsMTYgKzg4LDI5IEBAIHN0YXRpYyBpbnQgY2ZnX3NlbmRfc2l6ZSA9IFNFTkRfU0laRTtcbiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luNiBjZmdfYWRkcjtcbiBzdGF0aWMgdW5zaWduZWQgaW50IGNmZ19yeF9idWZfbGVuO1xuIHN0YXRpYyBib29sIGNmZ19kcnlfcnVuO1xuK3N0YXRpYyBpbnQgY2ZnX251bV90aHJlYWRzID0gMTtcbiBcbiBzdGF0aWMgY2hhciAqcGF5bG9hZDtcbi1zdGF0aWMgdm9pZCAqYXJlYV9wdHI7XG4tc3RhdGljIHZvaWQgKnJpbmdfcHRyO1xuLXN0YXRpYyBzaXplX3QgcmluZ19zaXplO1xuLXN0YXRpYyBzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycSBycV9yaW5nO1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFyZWFfdG9rZW47XG4tc3RhdGljIGludCBjb25uZmQ7XG4tc3RhdGljIGJvb2wgc3RvcDtcbi1zdGF0aWMgc2l6ZV90IHJlY2VpdmVkO1xuK1xuKyNkZWZpbmUgTUFYX0NPTk5TX1BFUl9USFJFQURcdDY0XG4rXG4rc3RydWN0IHRocmVhZF9jdHgge1xuK1x0c3RydWN0IGlvX3VyaW5nXHRcdHJpbmc7XG4rXHR2b2lkXHRcdFx0KmFyZWFfcHRyO1xuK1x0dm9pZFx0XHRcdCpyaW5nX3B0cjtcbitcdHNpemVfdFx0XHRcdHJpbmdfc2l6ZTtcbitcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxXHRycV9yaW5nO1xuK1x0dW5zaWduZWQgbG9uZ1x0XHRhcmVhX3Rva2VuO1xuK1x0aW50XHRcdFx0cXVldWVfaWQ7XG4rXHRpbnRcdFx0XHRuYXBpX2lkO1xuK1x0cHRocmVhZF9iYXJyaWVyX3RcdCpzZXR1cF9kb25lO1xuK1x0cHRocmVhZF9iYXJyaWVyX3RcdCpkaXNwYXRjaF9kb25lO1xuK1xuK1x0aW50XHRcdFx0Y29ubmZkc1tNQVhfQ09OTlNfUEVSX1RIUkVBRF07XG4rXHRzaXplX3RcdFx0XHRyZWNlaXZlZFtNQVhfQ09OTlNfUEVSX1RIUkVBRF07XG4rXHRpbnRcdFx0XHRvbmVzaG90X3JlY3ZzW01BWF9DT05OU19QRVJfVEhSRUFEXTtcbitcdGludFx0XHRcdG5yX2Nvbm5zO1xuK307XG4gXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dGltZW9mZGF5X21zKHZvaWQpXG4ge1xuQEAgLTEzMiwxNiArMTQ4LDE2IEBAIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGdldF9yZWZpbGxfcmluZ19zaXplKHVuc2lnbmVkIGludCBycV9lbnRyaWVzKVxuIHtcbiBcdHNpemVfdCBzaXplO1xuIFxuLVx0cmluZ19zaXplID0gcnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaW9fdXJpbmdfemNyeF9ycWUpO1xuK1x0c2l6ZSA9IHJxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlKTtcbiBcdC8qIGFkZCBzcGFjZSBmb3IgdGhlIGhlYWRlciAoaGVhZC90YWlsL2V0Yy4pICovXG4tXHRyaW5nX3NpemUgKz0gcGFnZV9zaXplO1xuLVx0cmV0dXJuIEFMSUdOX1VQKHJpbmdfc2l6ZSwgcGFnZV9zaXplKTtcbitcdHNpemUgKz0gcGFnZV9zaXplO1xuK1x0cmV0dXJuIEFMSUdOX1VQKHNpemUsIHBhZ2Vfc2l6ZSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuK3N0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IHRocmVhZF9jdHggKmN0eClcbiB7XG4rXHR1bnNpZ25lZCBpbnQgcnFfZW50cmllcyA9IEFSRUFfU0laRSAvIHBhZ2Vfc2l6ZTtcbiBcdHVuc2lnbmVkIGludCBpZmluZGV4O1xuLVx0dW5zaWduZWQgaW50IHJxX2VudHJpZXMgPSA0MDk2O1xuIFx0aW50IHJldDtcbiBcbiBcdGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChjZmdfaWZuYW1lKTtcbkBAIC0xNDksNTggKzE2NSw1OCBAQCBzdGF0aWMgdm9pZCBzZXR1cF96Y3J4KHN0cnVjdCBpb191cmluZyAqcmluZylcbiBcdFx0ZXJyb3IoMSwgMCwgXCJiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCIsIGNmZ19pZm5hbWUpO1xuIFxuIFx0aWYgKGNmZ19yeF9idWZfbGVuIFx1MDAyNlx1MDAyNiBjZmdfcnhfYnVmX2xlbiAhPSBwYWdlX3NpemUpIHtcbi1cdFx0YXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0XHRBUkVBX1NJWkUsXG4tXHRcdFx0XHRQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuLVx0XHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHxcbi1cdFx0XHRcdE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuLVx0XHRcdFx0LTEsXG4tXHRcdFx0XHQwKTtcbi1cdFx0aWYgKGFyZWFfcHRyID09IE1BUF9GQUlMRUQpIHtcbitcdFx0Y3R4LVx1MDAzZWFyZWFfcHRyID0gbW1hcChOVUxMLFxuK1x0XHRcdFx0ICAgICBBUkVBX1NJWkUsXG4rXHRcdFx0XHQgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8XG4rXHRcdFx0XHQgICAgIE1BUF9IVUdFVExCIHwgTUFQX0hVR0VfMk1CLFxuK1x0XHRcdFx0ICAgICAtMSxcbitcdFx0XHRcdCAgICAgMCk7XG4rXHRcdGlmIChjdHgtXHUwMDNlYXJlYV9wdHIgPT0gTUFQX0ZBSUxFRCkge1xuIFx0XHRcdHByaW50ZihcIkNhbid0IGFsbG9jYXRlIGh1Z2UgcGFnZXNcXG5cIik7XG4gXHRcdFx0ZXhpdChTS0lQX0NPREUpO1xuIFx0XHR9XG4gXHR9IGVsc2Uge1xuLVx0XHRhcmVhX3B0ciA9IG1tYXAoTlVMTCxcbi1cdFx0XHRcdEFSRUFfU0laRSxcbi1cdFx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0XHRNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsXG4tXHRcdFx0XHQwLFxuLVx0XHRcdFx0MCk7XG4tXHRcdGlmIChhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuK1x0XHRjdHgtXHUwMDNlYXJlYV9wdHIgPSBtbWFwKE5VTEwsXG4rXHRcdFx0XHQgICAgIEFSRUFfU0laRSxcbitcdFx0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdCAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuK1x0XHRcdFx0ICAgICAwLFxuK1x0XHRcdFx0ICAgICAwKTtcbitcdFx0aWYgKGN0eC1cdTAwM2VhcmVhX3B0ciA9PSBNQVBfRkFJTEVEKVxuIFx0XHRcdGVycm9yKDEsIDAsIFwibW1hcCgpOiB6ZXJvIGNvcHkgYXJlYVwiKTtcbiBcdH1cbiBcbi1cdHJpbmdfc2l6ZSA9IGdldF9yZWZpbGxfcmluZ19zaXplKHJxX2VudHJpZXMpO1xuLVx0cmluZ19wdHIgPSBtbWFwKE5VTEwsXG4tXHRcdFx0cmluZ19zaXplLFxuLVx0XHRcdFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4tXHRcdFx0TUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLFxuLVx0XHRcdDAsXG4tXHRcdFx0MCk7XG4rXHRjdHgtXHUwMDNlcmluZ19zaXplID0gZ2V0X3JlZmlsbF9yaW5nX3NpemUocnFfZW50cmllcyk7XG4rXHRjdHgtXHUwMDNlcmluZ19wdHIgPSBtbWFwKE5VTEwsXG4rXHRcdFx0ICAgICBjdHgtXHUwMDNlcmluZ19zaXplLFxuK1x0XHRcdCAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHQgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSxcbitcdFx0XHQgICAgIDAsXG4rXHRcdFx0ICAgICAwKTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ19yZWdpb25fZGVzYyByZWdpb25fcmVnID0ge1xuLVx0XHQuc2l6ZSA9IHJpbmdfc2l6ZSxcbi1cdFx0LnVzZXJfYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylyaW5nX3B0cixcbitcdFx0LnNpemUgPSBjdHgtXHUwMDNlcmluZ19zaXplLFxuK1x0XHQudXNlcl9hZGRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKWN0eC1cdTAwM2VyaW5nX3B0cixcbiBcdFx0LmZsYWdzID0gSU9SSU5HX01FTV9SRUdJT05fVFlQRV9VU0VSLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2FyZWFfcmVnIGFyZWFfcmVnID0ge1xuLVx0XHQuYWRkciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylhcmVhX3B0cixcbitcdFx0LmFkZHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpY3R4LVx1MDAzZWFyZWFfcHRyLFxuIFx0XHQubGVuID0gQVJFQV9TSVpFLFxuIFx0XHQuZmxhZ3MgPSAwLFxuIFx0fTtcbiBcbiBcdHN0cnVjdCB0X2lvX3VyaW5nX3pjcnhfaWZxX3JlZyByZWcgPSB7XG4gXHRcdC5pZl9pZHggPSBpZmluZGV4LFxuLVx0XHQuaWZfcnhxID0gY2ZnX3F1ZXVlX2lkLFxuK1x0XHQuaWZfcnhxID0gY3R4LVx1MDAzZXF1ZXVlX2lkLFxuIFx0XHQucnFfZW50cmllcyA9IHJxX2VudHJpZXMsXG4gXHRcdC5hcmVhX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZylcdTAwMjZhcmVhX3JlZyxcbiBcdFx0LnJlZ2lvbl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpXHUwMDI2cmVnaW9uX3JlZyxcbiBcdFx0LnJ4X2J1Zl9sZW4gPSBjZmdfcnhfYnVmX2xlbixcbiBcdH07XG4gXG4tXHRyZXQgPSBpb191cmluZ19yZWdpc3Rlcl9pZnEocmluZywgKHZvaWQgKilcdTAwMjZyZWcpO1xuK1x0cmV0ID0gaW9fdXJpbmdfcmVnaXN0ZXJfaWZxKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCAodm9pZCAqKVx1MDAyNnJlZyk7XG4gXHRpZiAoY2ZnX3J4X2J1Zl9sZW4gXHUwMDI2XHUwMDI2IChyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVPUE5PVFNVUFAgfHxcbiBcdFx0XHQgICAgICAgcmV0ID09IC1FUkFOR0UpKSB7XG4gXHRcdHByaW50ZihcIkxhcmdlIGNodW5rcyBhcmUgbm90IHN1cHBvcnRlZCAlaVxcblwiLCByZXQpO1xuQEAgLTIwOSw3NCArMjI1LDUzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3pjcngoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuIFx0XHRlcnJvcigxLCAwLCBcImlvX3VyaW5nX3JlZ2lzdGVyX2lmcSgpOiAlZFwiLCByZXQpO1xuIFx0fVxuIFxuLVx0cnFfcmluZy5raGVhZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLmhlYWQpO1xuLVx0cnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilyaW5nX3B0ciArIHJlZy5vZmZzZXRzLnRhaWwpO1xuLVx0cnFfcmluZy5ycWVzID0gKHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqKSgoY2hhciAqKXJpbmdfcHRyICsgcmVnLm9mZnNldHMucnFlcyk7XG4tXHRycV9yaW5nLnJxX3RhaWwgPSAwO1xuLVx0cnFfcmluZy5yaW5nX2VudHJpZXMgPSByZWcucnFfZW50cmllcztcbi1cbi1cdGFyZWFfdG9rZW4gPSBhcmVhX3JlZy5ycV9hcmVhX3Rva2VuO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBhZGRfYWNjZXB0KHN0cnVjdCBpb191cmluZyAqcmluZywgaW50IHNvY2tmZClcbi17XG4tXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XG4tXG4tXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xuK1x0Y3R4LVx1MDAzZXJxX3Jpbmcua2hlYWQgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMuaGVhZCk7XG4rXHRjdHgtXHUwMDNlcnFfcmluZy5rdGFpbCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKiljdHgtXHUwMDNlcmluZ19wdHIgKyByZWcub2Zmc2V0cy50YWlsKTtcbitcdGN0eC1cdTAwM2VycV9yaW5nLnJxZXMgPSAoc3RydWN0IGlvX3VyaW5nX3pjcnhfcnFlICopKChjaGFyICopY3R4LVx1MDAzZXJpbmdfcHRyICsgcmVnLm9mZnNldHMucnFlcyk7XG4rXHRjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsID0gMDtcbitcdGN0eC1cdTAwM2VycV9yaW5nLnJpbmdfZW50cmllcyA9IHJlZy5ycV9lbnRyaWVzO1xuIFxuLVx0aW9fdXJpbmdfcHJlcF9hY2NlcHQoc3FlLCBzb2NrZmQsIE5VTEwsIE5VTEwsIDApO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDE7XG4rXHRjdHgtXHUwMDNlYXJlYV90b2tlbiA9IGFyZWFfcmVnLnJxX2FyZWFfdG9rZW47XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBpbnQgc29ja2ZkKVxuK3N0YXRpYyB2b2lkIGFkZF9yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgaW50IGNvbm5faWR4KVxuIHtcbiBcdHN0cnVjdCBpb191cmluZ19zcWUgKnNxZTtcbiBcbi1cdHNxZSA9IGlvX3VyaW5nX2dldF9zcWUocmluZyk7XG4rXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKFx1MDAyNmN0eC1cdTAwM2VyaW5nKTtcbiBcbi1cdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgc29ja2ZkLCBOVUxMLCAwLCAwKTtcbitcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVx1MDAzZWNvbm5mZHNbY29ubl9pZHhdLFxuK1x0XHRcdCBOVUxMLCAwLCAwKTtcbiBcdHNxZS1cdTAwM2Vpb3ByaW8gfD0gSU9SSU5HX1JFQ1ZfTVVMVElTSE9UO1xuLVx0c3FlLVx1MDAzZXVzZXJfZGF0YSA9IDI7XG4rXHRzcWUtXHUwMDNldXNlcl9kYXRhID0gY29ubl9pZHg7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGFkZF9yZWN2emNfb25lc2hvdChzdHJ1Y3QgaW9fdXJpbmcgKnJpbmcsIGludCBzb2NrZmQsIHNpemVfdCBsZW4pXG4rc3RhdGljIHZvaWQgYWRkX3JlY3Z6Y19vbmVzaG90KHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgsIGludCBjb25uX2lkeCwgc2l6ZV90IGxlbilcbiB7XG4gXHRzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWU7XG4gXG4tXHRzcWUgPSBpb191cmluZ19nZXRfc3FlKHJpbmcpO1xuK1x0c3FlID0gaW9fdXJpbmdfZ2V0X3NxZShcdTAwMjZjdHgtXHUwMDNlcmluZyk7XG4gXG4tXHRpb191cmluZ19wcmVwX3J3KElPUklOR19PUF9SRUNWX1pDLCBzcWUsIHNvY2tmZCwgTlVMTCwgbGVuLCAwKTtcbitcdGlvX3VyaW5nX3ByZXBfcncoSU9SSU5HX09QX1JFQ1ZfWkMsIHNxZSwgY3R4LVx1MDAzZWNvbm5mZHNbY29ubl9pZHhdLFxuK1x0XHRcdCBOVUxMLCBsZW4sIDApO1xuIFx0c3FlLVx1MDAzZWlvcHJpbyB8PSBJT1JJTkdfUkVDVl9NVUxUSVNIT1Q7XG4tXHRzcWUtXHUwMDNldXNlcl9kYXRhID0gMjtcbitcdHNxZS1cdTAwM2V1c2VyX2RhdGEgPSBjb25uX2lkeDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19hY2NlcHQoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4rc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IHRocmVhZF9jdHggKmN0eCwgc3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlLFxuK1x0XHRcdCAgIGludCBjb25uX2lkeClcbiB7XG4tXHRpZiAoY3FlLVx1MDAzZXJlcyBcdTAwM2MgMClcbi1cdFx0ZXJyb3IoMSwgMCwgXCJhY2NlcHQoKVwiKTtcbi1cdGlmIChjb25uZmQpXG4tXHRcdGVycm9yKDEsIDAsIFwiVW5leHBlY3RlZCBzZWNvbmQgY29ubmVjdGlvblwiKTtcbi1cbi1cdGNvbm5mZCA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpZiAoY2ZnX29uZXNob3QpXG4tXHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRlbHNlXG4tXHRcdGFkZF9yZWN2emMocmluZywgY29ubmZkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4te1xuLVx0dW5zaWduZWQgcnFfbWFzayA9IHJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbitcdHVuc2lnbmVkIGludCBycV9tYXNrID0gY3R4LVx1MDAzZXJxX3JpbmcucmluZ19lbnRyaWVzIC0gMTtcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqcmNxZTtcbiBcdHN0cnVjdCBpb191cmluZ196Y3J4X3JxZSAqcnFlO1xuLVx0c3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlO1xuIFx0dWludDY0X3QgbWFzaztcbiBcdGNoYXIgKmRhdGE7XG4gXHRzc2l6ZV90IG47XG4gXHRpbnQgaTtcbiBcbi1cdGlmIChjcWUtXHUwMDNlcmVzID09IDAgXHUwMDI2XHUwMDI2IGNxZS1cdTAwM2VmbGFncyA9PSAwIFx1MDAyNlx1MDAyNiBjZmdfb25lc2hvdF9yZWN2cyA9PSAwKSB7XG4tXHRcdHN0b3AgPSB0cnVlO1xuK1x0aWYgKGNxZS1cdTAwM2VyZXMgPT0gMCBcdTAwMjZcdTAwMjYgY3FlLVx1MDAzZWZsYWdzID09IDAgXHUwMDI2XHUwMDI2XG4rXHQgICAgY3R4LVx1MDAzZW9uZXNob3RfcmVjdnNbY29ubl9pZHhdID09IDApIHtcbitcdFx0Y3R4LVx1MDAzZW5yX2Nvbm5zLS07XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbkBAIC0yODQsNTkgKzI3OSwxNzAgQEAgc3RhdGljIHZvaWQgcHJvY2Vzc19yZWN2emMoc3RydWN0IGlvX3VyaW5nICpyaW5nLCBzdHJ1Y3QgaW9fdXJpbmdfY3FlICpjcWUpXG4gXHRcdGVycm9yKDEsIDAsIFwicmVjdnpjKCk6ICVkXCIsIGNxZS1cdTAwM2VyZXMpO1xuIFxuIFx0aWYgKGNmZ19vbmVzaG90KSB7XG4tXHRcdGlmIChjcWUtXHUwMDNlcmVzID09IDAgXHUwMDI2XHUwMDI2IGNxZS1cdTAwM2VmbGFncyA9PSAwIFx1MDAyNlx1MDAyNiBjZmdfb25lc2hvdF9yZWN2cykge1xuLVx0XHRcdGFkZF9yZWN2emNfb25lc2hvdChyaW5nLCBjb25uZmQsIHBhZ2Vfc2l6ZSk7XG4tXHRcdFx0Y2ZnX29uZXNob3RfcmVjdnMtLTtcbitcdFx0aWYgKGNxZS1cdTAwM2VyZXMgPT0gMCBcdTAwMjZcdTAwMjYgY3FlLVx1MDAzZWZsYWdzID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0pIHtcbitcdFx0XHRhZGRfcmVjdnpjX29uZXNob3QoY3R4LCBjb25uX2lkeCwgcGFnZV9zaXplKTtcbitcdFx0XHRjdHgtXHUwMDNlb25lc2hvdF9yZWN2c1tjb25uX2lkeF0tLTtcbitcdFx0XHRyZXR1cm47XG4gXHRcdH1cbiBcdH0gZWxzZSBpZiAoIShjcWUtXHUwMDNlZmxhZ3MgXHUwMDI2IElPUklOR19DUUVfRl9NT1JFKSkge1xuLVx0XHRhZGRfcmVjdnpjKHJpbmcsIGNvbm5mZCk7XG4rXHRcdGFkZF9yZWN2emMoY3R4LCBjb25uX2lkeCk7XG4gXHR9XG4gXG4gXHRyY3FlID0gKHN0cnVjdCBpb191cmluZ196Y3J4X2NxZSAqKShjcWUgKyAxKTtcbiBcbiBcdG4gPSBjcWUtXHUwMDNlcmVzO1xuIFx0bWFzayA9ICgxVUxMIFx1MDAzY1x1MDAzYyBJT1JJTkdfWkNSWF9BUkVBX1NISUZUKSAtIDE7XG4tXHRkYXRhID0gKGNoYXIgKilhcmVhX3B0ciArIChyY3FlLVx1MDAzZW9mZiBcdTAwMjYgbWFzayk7XG4rXHRkYXRhID0gKGNoYXIgKiljdHgtXHUwMDNlYXJlYV9wdHIgKyAocmNxZS1cdTAwM2VvZmYgXHUwMDI2IG1hc2spO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4tXHRcdGlmICgqKGRhdGEgKyBpKSAhPSBwYXlsb2FkWyhyZWNlaXZlZCArIGkpXSlcbitcdFx0aWYgKCooZGF0YSArIGkpICE9IHBheWxvYWRbKGN0eC1cdTAwM2VyZWNlaXZlZFtjb25uX2lkeF0gKyBpKV0pXG4gXHRcdFx0ZXJyb3IoMSwgMCwgXCJwYXlsb2FkIG1pc21hdGNoIGF0ICVkXCIsIGkpO1xuIFx0fVxuLVx0cmVjZWl2ZWQgKz0gbjtcbitcdGN0eC1cdTAwM2VyZWNlaXZlZFtjb25uX2lkeF0gKz0gbjtcbiBcbi1cdHJxZSA9IFx1MDAyNnJxX3JpbmcucnFlc1socnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4tXHRycWUtXHUwMDNlb2ZmID0gKHJjcWUtXHUwMDNlb2ZmIFx1MDAyNiB+SU9SSU5HX1pDUlhfQVJFQV9NQVNLKSB8IGFyZWFfdG9rZW47XG4rXHRycWUgPSBcdTAwMjZjdHgtXHUwMDNlcnFfcmluZy5ycWVzWyhjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsIFx1MDAyNiBycV9tYXNrKV07XG4rXHRycWUtXHUwMDNlb2ZmID0gKHJjcWUtXHUwMDNlb2ZmIFx1MDAyNiB+SU9SSU5HX1pDUlhfQVJFQV9NQVNLKSB8IGN0eC1cdTAwM2VhcmVhX3Rva2VuO1xuIFx0cnFlLVx1MDAzZWxlbiA9IGNxZS1cdTAwM2VyZXM7XG4tXHRpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShycV9yaW5nLmt0YWlsLCArK3JxX3JpbmcucnFfdGFpbCk7XG4rXHRpb191cmluZ19zbXBfc3RvcmVfcmVsZWFzZShjdHgtXHUwMDNlcnFfcmluZy5rdGFpbCwgKytjdHgtXHUwMDNlcnFfcmluZy5ycV90YWlsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IGlvX3VyaW5nICpyaW5nKVxuK3N0YXRpYyB2b2lkIHNlcnZlcl9sb29wKHN0cnVjdCB0aHJlYWRfY3R4ICpjdHgpXG4ge1xuIFx0c3RydWN0IGlvX3VyaW5nX2NxZSAqY3FlO1xuIFx0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdHVuc2lnbmVkIGludCBoZWFkO1xuLVx0aW50IGksIHJldDtcbiBcbi1cdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChyaW5nLCAxKTtcbitcdGlvX3VyaW5nX3N1Ym1pdF9hbmRfd2FpdChcdTAwMjZjdHgtXHUwMDNlcmluZywgMSk7XG4gXG4tXHRpb191cmluZ19mb3JfZWFjaF9jcWUocmluZywgaGVhZCwgY3FlKSB7XG4tXHRcdGlmIChjcWUtXHUwMDNldXNlcl9kYXRhID09IDEpXG4tXHRcdFx0cHJvY2Vzc19hY2NlcHQocmluZywgY3FlKTtcbi1cdFx0ZWxzZSBpZiAoY3FlLVx1MDAzZXVzZXJfZGF0YSA9PSAyKVxuLVx0XHRcdHByb2Nlc3NfcmVjdnpjKHJpbmcsIGNxZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRlcnJvcigxLCAwLCBcInVua25vd24gY3FlXCIpO1xuK1x0aW9fdXJpbmdfZm9yX2VhY2hfY3FlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBoZWFkLCBjcWUpIHtcbitcdFx0cHJvY2Vzc19yZWN2emMoY3R4LCBjcWUsIGNxZS1cdTAwM2V1c2VyX2RhdGEpO1xuIFx0XHRjb3VudCsrO1xuIFx0fVxuLVx0aW9fdXJpbmdfY3FfYWR2YW5jZShyaW5nLCBjb3VudCk7XG4rXHRpb191cmluZ19jcV9hZHZhbmNlKFx1MDAyNmN0eC1cdTAwM2VyaW5nLCBjb3VudCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbitzdGF0aWMgdm9pZCAqc2VydmVyX3dvcmtlcih2b2lkICphcmcpXG4ge1xuLVx0dW5zaWduZWQgaW50IGZsYWdzID0gMDtcbi1cdHN0cnVjdCBpb191cmluZyByaW5nO1xuLVx0aW50IGZkLCBlbmFibGUsIHJldDtcbitcdHN0cnVjdCBpb191cmluZ19wYXJhbXMgcGFyYW1zID0geyB9O1xuK1x0c3RydWN0IHRocmVhZF9jdHggKmN0eCA9IGFyZztcbiBcdHVpbnQ2NF90IHRzdG9wO1xuK1x0aW50IG5yX2Nvbm5zO1xuK1x0aW50IGk7XG4rXG4rXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NPT1BfVEFTS1JVTjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfREVGRVJfVEFTS1JVTjtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfU1VCTUlUX0FMTDtcbitcdHBhcmFtcy5mbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4rXHRwYXJhbXMuZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX0NRU0laRTtcbitcdHBhcmFtcy5jcV9lbnRyaWVzID0gQVJFQV9TSVpFIC8gcGFnZV9zaXplO1xuK1xuK1x0aW9fdXJpbmdfcXVldWVfaW5pdF9wYXJhbXMoNTEyLCBcdTAwMjZjdHgtXHUwMDNlcmluZywgXHUwMDI2cGFyYW1zKTtcbitcdHNldHVwX3pjcngoY3R4KTtcbitcbitcdGlmIChjZmdfZHJ5X3J1bilcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlc2V0dXBfZG9uZSk7XG4rXHRwdGhyZWFkX2JhcnJpZXJfd2FpdChjdHgtXHUwMDNlZGlzcGF0Y2hfZG9uZSk7XG4rXG4rXHRucl9jb25ucyA9IGN0eC1cdTAwM2Vucl9jb25ucztcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGN0eC1cdTAwM2Vucl9jb25uczsgaSsrKSB7XG4rXHRcdGlmIChjZmdfb25lc2hvdCkge1xuK1x0XHRcdGN0eC1cdTAwM2VvbmVzaG90X3JlY3ZzW2ldID0gY2ZnX29uZXNob3RfcmVjdnM7XG4rXHRcdFx0YWRkX3JlY3Z6Y19vbmVzaG90KGN0eCwgaSwgcGFnZV9zaXplKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRhZGRfcmVjdnpjKGN0eCwgaSk7XG4rXHRcdH1cbitcdH1cbitcbitcdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xuK1x0d2hpbGUgKGN0eC1cdTAwM2Vucl9jb25ucyBcdTAwM2UgMCBcdTAwMjZcdTAwMjYgZ2V0dGltZW9mZGF5X21zKCkgXHUwMDNjIHRzdG9wKVxuK1x0XHRzZXJ2ZXJfbG9vcChjdHgpO1xuK1xuK1x0aWYgKGN0eC1cdTAwM2Vucl9jb25ucyAhPSAwKVxuK1x0XHRlcnJvcigxLCAwLCBcInRlc3QgZmFpbGVkOiAlZCBjb25uZWN0aW9ucyBpbmNvbXBsZXRlXCIsXG4rXHRcdCAgICAgIGN0eC1cdTAwM2Vucl9jb25ucyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jb25uczsgaSsrKSB7XG4rXHRcdGlmIChjZmdfb25lc2hvdCkge1xuK1x0XHRcdGlmICghY3R4LVx1MDAzZXJlY2VpdmVkW2ldKVxuK1x0XHRcdFx0ZXJyb3IoMSwgMCwgXCJjb25uZWN0aW9uICVkIHJlY2VpdmVkIG5vIGRhdGFcIiwgaSk7XG4rXHRcdH0gZWxzZSBpZiAoY3R4LVx1MDAzZXJlY2VpdmVkW2ldICE9IChzaXplX3QpY2ZnX3NlbmRfc2l6ZSkge1xuK1x0XHRcdGVycm9yKDEsIDAsIFwiY29ubmVjdGlvbiAlZCByZWNlaXZlZCAlenUgb2YgJWQgYnl0ZXNcIixcbitcdFx0XHQgICAgICBpLCBjdHgtXHUwMDNlcmVjZWl2ZWRbaV0sIGNmZ19zZW5kX3NpemUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBxdWVyeV9uYXBpX2lkKHVuc2lnbmVkIGludCBpZmluZGV4LCBpbnQgcXVldWVfaWQpXG4re1xuK1x0c3RydWN0IG5ldGRldl9xdWV1ZV9nZXRfcmVxICpyZXE7XG4rXHRzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2dldF9yc3AgKnJzcDtcbitcdHN0cnVjdCB5bmxfZXJyb3IgeWVycjtcbitcdHN0cnVjdCB5bmxfc29jayAqeXM7XG4rXHRpbnQgbmFwaV9pZDtcbitcbitcdHlzID0geW5sX3NvY2tfY3JlYXRlKFx1MDAyNnlubF9uZXRkZXZfZmFtaWx5LCBcdTAwMjZ5ZXJyKTtcbitcdGlmICgheXMpXG4rXHRcdGVycm9yKDEsIDAsIFwieW5sX3NvY2tfY3JlYXRlOiAlc1wiLCB5ZXJyLm1zZyk7XG4rXG4rXHRyZXEgPSBuZXRkZXZfcXVldWVfZ2V0X3JlcV9hbGxvYygpO1xuK1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lmaW5kZXgocmVxLCBpZmluZGV4KTtcbitcdG5ldGRldl9xdWV1ZV9nZXRfcmVxX3NldF90eXBlKHJlcSwgTkVUREVWX1FVRVVFX1RZUEVfUlgpO1xuK1x0bmV0ZGV2X3F1ZXVlX2dldF9yZXFfc2V0X2lkKHJlcSwgcXVldWVfaWQpO1xuK1xuK1x0cnNwID0gbmV0ZGV2X3F1ZXVlX2dldCh5cywgcmVxKTtcbitcdGlmICghcnNwKVxuK1x0XHRlcnJvcigxLCAwLCBcIm5ldGRldl9xdWV1ZV9nZXQocT0lZCk6ICVzXCIsIHF1ZXVlX2lkLFxuK1x0XHQgICAgICB5cy1cdTAwM2VlcnIubXNnKTtcbitcdGlmICghcnNwLVx1MDAzZV9wcmVzZW50Lm5hcGlfaWQpXG4rXHRcdGVycm9yKDEsIDAsIFwibmV0ZGV2X3F1ZXVlX2dldChxPSVkKTogbmFwaV9pZCBub3QgcHJlc2VudFwiLFxuK1x0XHQgICAgICBxdWV1ZV9pZCk7XG4rXG4rXHRuYXBpX2lkID0gcnNwLVx1MDAzZW5hcGlfaWQ7XG4rXG4rXHRuZXRkZXZfcXVldWVfZ2V0X3JlcV9mcmVlKHJlcSk7XG4rXHRuZXRkZXZfcXVldWVfZ2V0X3JzcF9mcmVlKHJzcCk7XG4rXHR5bmxfc29ja19kZXN0cm95KHlzKTtcbitcbitcdHJldHVybiBuYXBpX2lkO1xuK31cbitcbitzdGF0aWMgaW50IGZpbmRfdGhyZWFkX2J5X2Nvbm4oc3RydWN0IHRocmVhZF9jdHggKmN0eHMsIGludCBjb25uZmQpXG4re1xuK1x0c29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpO1xuK1x0aW50IG5hcGlfaWQsIGk7XG4rXG4rXHRpZiAoZ2V0c29ja29wdChjb25uZmQsIFNPTF9TT0NLRVQsIFNPX0lOQ09NSU5HX05BUElfSUQsIFx1MDAyNm5hcGlfaWQsIFx1MDAyNmxlbikpXG4rXHRcdGVycm9yKDEsIGVycm5vLCBcImdldHNvY2tvcHQoU09fSU5DT01JTkdfTkFQSV9JRClcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkrKykge1xuK1x0XHRpZiAoY3R4c1tpXS5uYXBpX2lkID09IG5hcGlfaWQpXG4rXHRcdFx0cmV0dXJuIGk7XG4rXHR9XG4rXG4rXHRlcnJvcigxLCAwLCBcInVua25vd24gTkFQSSBJRDogJWRcIiwgbmFwaV9pZCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9zZXJ2ZXIodm9pZClcbit7XG4rXHRwdGhyZWFkX2JhcnJpZXJfdCBzZXR1cF9kb25lLCBkaXNwYXRjaF9kb25lO1xuK1x0aW50IHRvdGFsX2Nvbm5zLCBhY2NlcHRlZCA9IDAsIGNvbm5mZDtcbitcdHN0cnVjdCB0aHJlYWRfY3R4ICpjdHhzO1xuK1x0aW50IGZkLCByZXQsIGVuYWJsZSwgaTtcbitcdHVuc2lnbmVkIGludCBpZmluZGV4O1xuK1x0cHRocmVhZF90ICp0aHJlYWRzO1xuK1xuK1x0Y3R4cyA9IGNhbGxvYyhjZmdfbnVtX3RocmVhZHMsIHNpemVvZigqY3R4cykpO1xuK1x0dGhyZWFkcyA9IGNhbGxvYyhjZmdfbnVtX3RocmVhZHMsIHNpemVvZigqdGhyZWFkcykpO1xuK1x0aWYgKCFjdHhzIHx8ICF0aHJlYWRzKVxuK1x0XHRlcnJvcigxLCAwLCBcImNhbGxvYygpXCIpO1xuIFxuIFx0ZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTtcbiBcdGlmIChmZCA9PSAtMSlcbkBAIC0zNTEsMzIgKzQ1Nyw3MSBAQCBzdGF0aWMgdm9pZCBydW5fc2VydmVyKHZvaWQpXG4gXHRpZiAocmV0IFx1MDAzYyAwKVxuIFx0XHRlcnJvcigxLCAwLCBcImJpbmQoKVwiKTtcbiBcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9DT09QX1RBU0tSVU47XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfU0lOR0xFX0lTU1VFUjtcbi1cdGZsYWdzIHw9IElPUklOR19TRVRVUF9ERUZFUl9UQVNLUlVOO1xuLVx0ZmxhZ3MgfD0gSU9SSU5HX1NFVFVQX1NVQk1JVF9BTEw7XG4tXHRmbGFncyB8PSBJT1JJTkdfU0VUVVBfQ1FFMzI7XG4rXHRwdGhyZWFkX2JhcnJpZXJfaW5pdChcdTAwMjZzZXR1cF9kb25lLCBOVUxMLCBjZmdfbnVtX3RocmVhZHMgKyAxKTtcbitcdHB0aHJlYWRfYmFycmllcl9pbml0KFx1MDAyNmRpc3BhdGNoX2RvbmUsIE5VTEwsIGNmZ19udW1fdGhyZWFkcyArIDEpO1xuIFxuLVx0aW9fdXJpbmdfcXVldWVfaW5pdCg1MTIsIFx1MDAyNnJpbmcsIGZsYWdzKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKSB7XG4rXHRcdGN0eHNbaV0ucXVldWVfaWQgPSBjZmdfcXVldWVfaWQgKyBpO1xuK1x0XHRjdHhzW2ldLnNldHVwX2RvbmUgPSBcdTAwMjZzZXR1cF9kb25lO1xuK1x0XHRjdHhzW2ldLmRpc3BhdGNoX2RvbmUgPSBcdTAwMjZkaXNwYXRjaF9kb25lO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY2ZnX251bV90aHJlYWRzOyBpKyspIHtcbitcdFx0cmV0ID0gcHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCxcbitcdFx0XHRcdCAgICAgc2VydmVyX3dvcmtlciwgXHUwMDI2Y3R4c1tpXSk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0ZXJyb3IoMSwgcmV0LCBcInB0aHJlYWRfY3JlYXRlKClcIik7XG4rXHR9XG4gXG4tXHRzZXR1cF96Y3J4KFx1MDAyNnJpbmcpO1xuIFx0aWYgKGNmZ19kcnlfcnVuKVxuLVx0XHRyZXR1cm47XG4rXHRcdGdvdG8gam9pbjtcbitcbitcdHB0aHJlYWRfYmFycmllcl93YWl0KFx1MDAyNnNldHVwX2RvbmUpO1xuIFxuIFx0aWYgKGxpc3RlbihmZCwgMTAyNCkgXHUwMDNjIDApXG4gXHRcdGVycm9yKDEsIDAsIFwibGlzdGVuKClcIik7XG4gXG4tXHRhZGRfYWNjZXB0KFx1MDAyNnJpbmcsIGZkKTtcbitcdGlmIChjZmdfbnVtX3RocmVhZHMgXHUwMDNlIDEpIHtcbitcdFx0aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGNmZ19pZm5hbWUpO1xuK1x0XHRpZiAoIWlmaW5kZXgpXG4rXHRcdFx0ZXJyb3IoMSwgMCwgXCJiYWQgaW50ZXJmYWNlIG5hbWU6ICVzXCIsIGNmZ19pZm5hbWUpO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjZmdfbnVtX3RocmVhZHM7IGkrKylcbitcdFx0XHRjdHhzW2ldLm5hcGlfaWQgPSBxdWVyeV9uYXBpX2lkKGlmaW5kZXgsXG4rXHRcdFx0XHRcdFx0XHRjdHhzW2ldLnF1ZXVlX2lkKTtcbitcdH1cbiBcbi1cdHRzdG9wID0gZ2V0dGltZW9mZGF5X21zKCkgKyA1MDAwO1xuLVx0d2hpbGUgKCFzdG9wIFx1MDAyNlx1MDAyNiBnZXR0aW1lb2ZkYXlfbXMoKSBcdTAwM2MgdHN0b3ApXG4tXHRcdHNlcnZlcl9sb29wKFx1MDAyNnJpbmcpO1xuK1x0dG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4rXG4rXHR3aGlsZSAoYWNjZXB0ZWQgXHUwMDNjIHRvdGFsX2Nvbm5zKSB7XG4rXHRcdGludCBpZHggPSAwO1xuK1xuK1x0XHRjb25uZmQgPSBhY2NlcHQoZmQsIE5VTEwsIE5VTEwpO1xuK1x0XHRpZiAoY29ubmZkIFx1MDAzYyAwKVxuK1x0XHRcdGVycm9yKDEsIGVycm5vLCBcImFjY2VwdCgpXCIpO1xuK1xuK1x0XHRpZiAoY2ZnX251bV90aHJlYWRzIFx1MDAzZSAxKVxuK1x0XHRcdGlkeCA9IGZpbmRfdGhyZWFkX2J5X2Nvbm4oY3R4cywgY29ubmZkKTtcbiBcbi1cdGlmICghc3RvcClcbi1cdFx0ZXJyb3IoMSwgMCwgXCJ0ZXN0IGZhaWxlZFxcblwiKTtcbitcdFx0aWYgKGN0eHNbaWR4XS5ucl9jb25ucyBcdTAwM2U9IE1BWF9DT05OU19QRVJfVEhSRUFEKVxuK1x0XHRcdGVycm9yKDEsIDAsIFwid29ya2VyICVkIGNvbm5lY3Rpb24gb3ZlcmZsb3dcIiwgaWR4KTtcbitcdFx0Y3R4c1tpZHhdLmNvbm5mZHNbY3R4c1tpZHhdLm5yX2Nvbm5zKytdID0gY29ubmZkO1xuK1x0XHRhY2NlcHRlZCsrO1xuK1x0fVxuK1xuK1x0cHRocmVhZF9iYXJyaWVyX3dhaXQoXHUwMDI2ZGlzcGF0Y2hfZG9uZSk7XG4rXG4ram9pbjpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNmZ19udW1fdGhyZWFkczsgaSsrKVxuK1x0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4rXG4rXHRwdGhyZWFkX2JhcnJpZXJfZGVzdHJveShcdTAwMjZzZXR1cF9kb25lKTtcbitcdHB0aHJlYWRfYmFycmllcl9kZXN0cm95KFx1MDAyNmRpc3BhdGNoX2RvbmUpO1xuK1x0Y2xvc2UoZmQpO1xuK1x0ZnJlZSh0aHJlYWRzKTtcbitcdGZyZWUoY3R4cyk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbitzdGF0aWMgdm9pZCAqY2xpZW50X3dvcmtlcih2b2lkICphcmcpXG4ge1xuIFx0c3NpemVfdCB0b19zZW5kID0gY2ZnX3NlbmRfc2l6ZTtcbiBcdHNzaXplX3Qgc2VudCA9IDA7XG5AQCAtNDAyLDEyICs1NDcsMzYgQEAgc3RhdGljIHZvaWQgcnVuX2NsaWVudCh2b2lkKVxuIFx0fVxuIFxuIFx0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9jbGllbnQodm9pZClcbit7XG4rXHRpbnQgdG90YWxfY29ubnMgPSBjZmdfbnVtX3RocmVhZHMgKiBjZmdfbnVtX3RocmVhZHM7XG4rXHRwdGhyZWFkX3QgKnRocmVhZHM7XG4rXHRpbnQgaSwgcmV0O1xuK1xuK1x0dGhyZWFkcyA9IGNhbGxvYyh0b3RhbF9jb25ucywgc2l6ZW9mKCp0aHJlYWRzKSk7XG4rXHRpZiAoIXRocmVhZHMpXG4rXHRcdGVycm9yKDEsIDAsIFwiY2FsbG9jKClcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0b3RhbF9jb25uczsgaSsrKSB7XG4rXHRcdHJldCA9IHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIGNsaWVudF93b3JrZXIsIE5VTEwpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGVycm9yKDEsIHJldCwgXCJwdGhyZWFkX2NyZWF0ZSgpXCIpO1xuK1x0fVxuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdG90YWxfY29ubnM7IGkrKylcbitcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1xuK1x0ZnJlZSh0aHJlYWRzKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZmlsZXBhdGgpXG4ge1xuIFx0ZXJyb3IoMSwgMCwgXCJVc2FnZTogJXMgKC00fC02KSAoLXN8LWMpIC1oXHUwMDNjc2VydmVyX2lwXHUwMDNlIC1wXHUwMDNjcG9ydFx1MDAzZSBcIlxuLVx0XHQgICAgXCItbFx1MDAzY3BheWxvYWRfc2l6ZVx1MDAzZSAtaVx1MDAzY2lmbmFtZVx1MDAzZSAtcVx1MDAzY3J4cV9pZFx1MDAzZVwiLCBmaWxlcGF0aCk7XG4rXHRcdCAgICBcIi1sXHUwMDNjcGF5bG9hZF9zaXplXHUwMDNlIC1pXHUwMDNjaWZuYW1lXHUwMDNlIC1xXHUwMDNjcnhxX2lkXHUwMDNlIC10XHUwMDNjbnVtX3RocmVhZHNcdTAwM2VcIixcbitcdFx0ICAgIGZpbGVwYXRoKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2Vfb3B0cyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG5AQCAtNDI1LDcgKzU5NCw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR1c2FnZShhcmd2WzBdKTtcbiBcdGNmZ19wYXlsb2FkX2xlbiA9IG1heF9wYXlsb2FkX2xlbjtcbiBcbi1cdHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBcInNjaDpwOmw6aTpxOm86ejp4OmRcIikpICE9IC0xKSB7XG4rXHR3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgXCJzY2g6cDpsOmk6cTpvOno6eDpkdDpcIikpICE9IC0xKSB7XG4gXHRcdHN3aXRjaCAoYykge1xuIFx0XHRjYXNlICdzJzpcbiBcdFx0XHRpZiAoY2ZnX2NsaWVudClcbkBAIC00NjYsNiArNjM1LDkgQEAgc3RhdGljIHZvaWQgcGFyc2Vfb3B0cyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGNhc2UgJ2QnOlxuIFx0XHRcdGNmZ19kcnlfcnVuID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAndCc6XG4rXHRcdFx0Y2ZnX251bV90aHJlYWRzID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvaW91LXpjcngucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuaW5kZXggYjdhMjI1ZmU0YmVhZS4uYzgzMzUzNWQ4YTAzYyAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L2lvdS16Y3J4LnB5XG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9pb3UtemNyeC5weVxuQEAgLTMwLDYgKzMwLDEzIEBAIGRlZiBjcmVhdGVfcnNzX2N0eChjZmcpOlxuICAgICByZXR1cm4gaW50KHZhbHVlcylcbiBcbiBcbitkZWYgY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBzdGFydCwgY291bnQpOlxuKyAgICBcIlwiXCJDcmVhdGUgYW4gUlNTIGNvbnRleHQgc3Bhbm5pbmcgY291bnQgcXVldWVzIGZyb20gc3RhcnQsIHJldHVybiBpdHMgSUQuXCJcIlwiXG4rICAgIG91dHB1dCA9IGV0aHRvb2woZlwiLVgge2NmZy5pZm5hbWV9IGNvbnRleHQgbmV3IHN0YXJ0IHtzdGFydH0gZXF1YWwge2NvdW50fVwiKS5zdGRvdXRcbisgICAgdmFsdWVzID0gcmUuc2VhcmNoKHInTmV3IFJTUyBjb250ZXh0IGlzIChcXGQrKScsIG91dHB1dCkuZ3JvdXAoMSlcbisgICAgcmV0dXJuIGludCh2YWx1ZXMpXG4rXG4rXG4gZGVmIHNldF9mbG93X3J1bGUoY2ZnKTpcbiAgICAgb3V0cHV0ID0gZXRodG9vbChmXCItTiB7Y2ZnLmlmbmFtZX0gZmxvdy10eXBlIHRjcDYgZHN0LXBvcnQge2NmZy5wb3J0fSBhY3Rpb24ge2NmZy50YXJnZXR9XCIpLnN0ZG91dFxuICAgICB2YWx1ZXMgPSByZS5zZWFyY2gocidJRCAoXFxkKyknLCBvdXRwdXQpLmdyb3VwKDEpXG5AQCAtMTI3LDE3ICsxMzQsNTYgQEAgZGVmIF9yZXF1aXJlX250dXBsZShjZmcpOlxuICAgICAgICAgZGVmZXIoZXRodG9vbCwgZlwiLUsge2NmZy5pZm5hbWV9IG50dXBsZS1maWx0ZXJzIG9mZlwiKVxuIFxuIFxuK2RlZiByc3NfbXVsdGlxdWV1ZShjZmcpOlxuKyAgICBcIlwiXCJTdGVlciB0aGUgdGVzdCBmbG93IHRvIGEgbXVsdGktcXVldWUgUlNTIGNvbnRleHQgZm9yIG11bHRpLXRocmVhZCB6Y3J4LlwiXCJcIlxuKyAgICBjaGFubmVscyA9IGNmZy5ldGhubC5jaGFubmVsc19nZXQoeydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fX0pXG4rICAgIGNoYW5uZWxzID0gY2hhbm5lbHNbJ2NvbWJpbmVkLWNvdW50J11cbisgICAgaWYgY2hhbm5lbHMgXHUwMDNjIDM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCdUZXN0IHJlcXVpcmVzIE5FVElGIHdpdGggYXQgbGVhc3QgMyBjb21iaW5lZCBjaGFubmVscycpXG4rXG4rICAgIHJpbmdzID0gY2ZnLmV0aG5sLnJpbmdzX2dldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9fSlcbisgICAgcnhfcmluZ3MgPSByaW5nc1sncngnXVxuKyAgICBoZHNfdGhyZXNoID0gcmluZ3MuZ2V0KCdoZHMtdGhyZXNoJywgMClcbitcbisgICAgY2ZnLmV0aG5sLnJpbmdzX3NldCh7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAndGNwLWRhdGEtc3BsaXQnOiAnZW5hYmxlZCcsXG4rICAgICAgICAgICAgICAgICAgICAgICAgICdoZHMtdGhyZXNoJzogMCxcbisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogNjR9KVxuKyAgICBkZWZlcihjZmcuZXRobmwucmluZ3Nfc2V0LCB7J2hlYWRlcic6IHsnZGV2LWluZGV4JzogY2ZnLmlmaW5kZXh9LFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjcC1kYXRhLXNwbGl0JzogJ3Vua25vd24nLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcy10aHJlc2gnOiBoZHNfdGhyZXNoLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J4JzogcnhfcmluZ3N9KVxuKyAgICBkZWZlcihtcF9jbGVhcl93YWl0LCBjZmcpXG4rXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDJcbisgICAgY2ZnLnRhcmdldCA9IGNoYW5uZWxzIC0gY2ZnLm51bV90aHJlYWRzXG4rICAgIGV0aHRvb2woZlwiLVgge2NmZy5pZm5hbWV9IGVxdWFsIHtjZmcudGFyZ2V0fVwiKVxuKyAgICBkZWZlcihldGh0b29sLCBmXCItWCB7Y2ZnLmlmbmFtZX0gZGVmYXVsdFwiKVxuK1xuKyAgICByc3NfY3R4X2lkID0gY3JlYXRlX3Jzc19jdHhfbXVsdGkoY2ZnLCBjZmcudGFyZ2V0LCBjZmcubnVtX3RocmVhZHMpXG4rICAgIGRlZmVyKGV0aHRvb2wsIGZcIi1YIHtjZmcuaWZuYW1lfSBkZWxldGUgY29udGV4dCB7cnNzX2N0eF9pZH1cIilcbitcbisgICAgZmxvd19ydWxlX2lkID0gc2V0X2Zsb3dfcnVsZV9yc3MoY2ZnLCByc3NfY3R4X2lkKVxuKyAgICBkZWZlcihldGh0b29sLCBmXCItTiB7Y2ZnLmlmbmFtZX0gZGVsZXRlIHtmbG93X3J1bGVfaWR9XCIpXG4rXG4rXG4gQGtzZnRfdmFyaWFudHMoW1xuICAgICBLc2Z0TmFtZWRWYXJpYW50KFwic2luZ2xlXCIsIHNpbmdsZSksXG4gICAgIEtzZnROYW1lZFZhcmlhbnQoXCJyc3NcIiwgcnNzKSxcbisgICAgS3NmdE5hbWVkVmFyaWFudChcInJzc19tdWx0aXF1ZXVlXCIsIHJzc19tdWx0aXF1ZXVlKSxcbiBdKVxuIGRlZiB0ZXN0X3pjcngoY2ZnLCBzZXR1cCkgLVx1MDAzZSBOb25lOlxuICAgICBjZmcucmVxdWlyZV9pcHZlcignNicpXG4gICAgIF9yZXF1aXJlX250dXBsZShjZmcpXG4gXG4rICAgIGNmZy5udW1fdGhyZWFkcyA9IDFcbitcbiAgICAgc2V0dXAoY2ZnKVxuLSAgICByeF9jbWQgPSBmXCJ7Y2ZnLmJpbl9sb2NhbH0gLXMgLXAge2NmZy5wb3J0fSAtaSB7Y2ZnLmlmbmFtZX0gLXEge2NmZy50YXJnZXR9XCJcbi0gICAgdHhfY21kID0gZlwie2NmZy5iaW5fcmVtb3RlfSAtYyAtaCB7Y2ZnLmFkZHJfdlsnNiddfSAtcCB7Y2ZnLnBvcnR9IC1sIDEyODQwXCJcbitcbisgICAgcnhfY21kID0gKGZcIntjZmcuYmluX2xvY2FsfSAtcyAtcCB7Y2ZnLnBvcnR9IC1pIHtjZmcuaWZuYW1lfSBcIlxuKyAgICAgICAgICAgICAgZlwiLXEge2NmZy50YXJnZXR9IC10IHtjZmcubnVtX3RocmVhZHN9XCIpXG4rICAgIHR4X2NtZCA9IChmXCJ7Y2ZnLmJpbl9yZW1vdGV9IC1jIC1oIHtjZmcuYWRkcl92Wyc2J119IC1wIHtjZmcucG9ydH0gXCJcbisgICAgICAgICAgICAgIGZcIi1sIDEyODQwIC10IHtjZmcubnVtX3RocmVhZHN9XCIpXG4gICAgIHdpdGggYmtnKHJ4X2NtZCwgZXhpdF93YWl0PVRydWUpOlxuICAgICAgICAgd2FpdF9wb3J0X2xpc3RlbihjZmcucG9ydCwgcHJvdG89XCJ0Y3BcIilcbiAgICAgICAgIGNtZCh0eF9jbWQsIGhvc3Q9Y2ZnLnJlbW90ZSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjI3LjAwMzczMjYxNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM4NzQwODE0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBEZWNpc2lvbjogTm8gRnV6emluZyBOZWVkZWQqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIGFuZCBkZWNpZGUgaWYgaXQncyB3b3J0aCB0aGUgZnV6emluZyBlZmZvcnQuIE15IGluaXRpYWwgc2NhbiBpbmRpY2F0ZXMgdGhlIGZpbGVzIG1vZGlmaWVkIGFyZTogYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2h3L01ha2VmaWxlYCwgYGlvdS16Y3J4LmNgLCBhbmQgYGlvdS16Y3J4LnB5YC4gQmFzZWQgb24gU2VjdGlvbiAyIG9mIHRoZSBjcml0ZXJpYSwgaXQgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBuby1nbywgYnV0IGxldCdzIGJlIHRob3JvdWdoLlxuXG5UaGUgY3J1Y2lhbCBwYXJ0IGhlcmUgaXMgdGhlIFwiV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlXCIgc2VjdGlvbi4gSXQncyBwcmV0dHkgY2xlYXI6IHdlIG9ubHkgc2tpcCBmdXp6aW5nIGlmIGFsbCBjaGFuZ2VzIGZhbGwgaW50byBzcGVjaWZpYyBjYXRlZ29yaWVzLiBUaGUga2V5IHBvaW50IGhlcmUgaXMgdGhhdCB3ZSBoYXZlIG1vZGlmaWNhdGlvbnMgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody9gIGRpcmVjdG9yeS4gVGhhdCdzIGEgc3Ryb25nIGluZGljYXRvciwgYXMgYHRvb2xzL2AgaXMgZGVzaWduYXRlZCBmb3IgdXNlci1zcGFjZSBzdHVmZi4gV2UgbmVlZCB0byBjb25maXJtIGl0IGRvZXNuJ3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGtlcm5lbCBtb2R1bGVzLlxuXG5JIG5lZWQgdG8gY29uZmlybSB0aGUgZmlsZXMgdGhlbXNlbHZlcyBhcmUgbm9uLWtlcm5lbC4gQSBxdWljayBzYW5pdHkgY2hlY2sgb2YgdGhlIGZpbGVzIGludm9sdmVkIGNvbmZpcm1zIHRoYXQgdGhleSByZXNpZGUgZW50aXJlbHkgd2l0aGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBObyBjb3JlIGtlcm5lbCBjb2RlIGlzIHRvdWNoZWQsIGZyb20gd2hhdCBJJ20gc2VlaW5nLlxuXG5Tbywgc3VtbWluZyBpdCB1cCwgbXkgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIHBhdGNoICpvbmx5KiBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciBgdG9vbHMvYCwgYW5kIGl0IGRlZmluaXRlbHkgZG9lc24ndCB0b3VjaCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgYGZhbHNlYC4gVGhlcmUncyBubyBuZWVkIHRvIGRlZmluZSBgRm9jdXNTeW1ib2xzYCBvciBgRW5hYmxlQ29uZmlnc2Agc2luY2Ugd2UgYXJlbid0IGZ1enppbmcgdGhpcy5cblxuVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGluZm9ybWF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTc1MywiT3V0cHV0VG9rZW5zIjo3MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjMwLjg3NzgxODE4M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyBhbmQgYnVpbGQgZmlsZXMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvaHcvIGFuZCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2Ugc2VsZnRlc3RzIGFuZCBidWlsZCBmaWxlcyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9ody8gYW5kIGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDIwOjU3OjMwLjg3Nzg0MjY2M1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7xrs[1] Phase: Running StartedAt: 2026-09-09 20:57:43 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7xrs[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-09 20:57:43 +0000 UTC FinishedAt: 2026-09-09 20:57:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}