Name: series-workflow6bvx5 Phase: Failed StartedAt: 2026-09-07 05:48:39 +0000 UTC FinishedAt: 2026-09-07 06:42:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6bvx5[0] Phase: Succeeded StartedAt: 2026-09-07 05:48:39 +0000 UTC FinishedAt: 2026-09-07 06:41:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6bvx5[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 05:48:39 +0000 UTC FinishedAt: 2026-09-07 06:41:58 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWEyNmVmNzY0NTUwZTMxMWE1Zjc3ZmY3NTk2OTUzMWY1MTBjODM3NlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzQ0ZTZmNzk3ZTU3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICYjNDM7MTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXG4gICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4mIzQzOyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yXG4mIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9SSU5HQlVGKiogbWFwLlxuIFxuICAgICBJbnN0YWxsIHBlcmYgcmluZ3MgaW50byBhIHBlcmYgZXZlbnQgYXJyYXkgbWFwIGFuZCBkdW1wIG91dHB1dCBvZiBhbnlcbiAgICAgKipicGZfcGVyZl9ldmVudF9vdXRwdXQqKlxcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZVxuQEAgLTEzNCw2ICYjNDM7MTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbiYjNDM7ICAgIEZvciBhIHJpbmcgYnVmZmVyIG1hcCwgY29uc3VtZSByZWNvcmRzIHN1Ym1pdHRlZCBieSBCUEYgcHJvZ3JhbXMsIGluY2x1ZGluZ1xuJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KipcbiYjNDM7ICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkXG4mIzQzOyAgICB6ZXJvIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbiYjNDM7ICAgIGJ5dGVzOyBKU09OIG91dHB1dCBjb250YWlucyAqKnNpemUqKiBhbmQgKipkYXRhKiogZmllbGRzLCB3aXRoICoqZGF0YSoqIGFuXG4mIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuXG4mIzQzO1xuJiM0MzsgICAgUmluZyBidWZmZXJzIHN1cHBvcnQgYSBzaW5nbGUgY29uc3VtZXIuIFRoaXMgY29tbWFuZCBhZHZhbmNlcyB0aGUgc2hhcmVkXG4mIzQzOyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lXG4mIzQzOyAgICBtYXA7IGl0IGRvZXMgbm90IHByb3ZpZGUgYSBwYXNzaXZlIHZpZXcgb2YgZXZlbnRzLiAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKlxuJiM0MzsgICAgbWFwcyBhcmUgbm90IHN1cHBvcnRlZC5cbiYjNDM7XG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtODc4LDExICYjNDM7ODc4LDExIEBAIF9icGZ0b29sKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICYjMzk7XCYjMzQ7dHlwZVwmIzM0OzogXCYjMzQ7XFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcJiMzNDsmIzM5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuQEAgLTI3LDcgJiM0MzsyNyw3IEBAXG4gXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXHQxNlxuIFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcbiBcbiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcbkBAIC00NCw3ICYjNDM7NDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcbiBcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXG4ge1xuLVx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdHN0b3AgPSB0cnVlO1xuIH1cbiBcbkBAIC0xMDcsNiAmIzQzOzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbiBcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGpzb25fb3V0cHV0KSB7XG4mIzQzO1x0XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xuJiM0MztcdFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7c2l6ZVwmIzM0Oywgc2l6ZSk7XG4mIzQzO1x0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDtkYXRhXCYjMzQ7KTtcbiYjNDM7XHRcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcbiYjNDM7XHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7PT0gc2l6ZTogJXp1ID09PT09XFxuXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcJiMzNDsgXCYjMzQ7KTtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZmbHVzaChzdGRvdXQpKVxuJiM0MztcdFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcbiYjNDM7XG4mIzQzO1x0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXG4mIzQzO1x0cmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwO1xuJiM0Mzt9XG4mIzQzO1xuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcbkBAIC0xMjMsMTggJiM0MzsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHQuY3B1ID0gLTEsXG4gXHRcdC5pZHggPSAtMSxcbiBcdH07XG4tXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xuJiM0MztcdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xuIFx0X191MzIgbWFwX2luZm9fbGVuO1xuIFx0aW50IGVyciwgbWFwX2ZkO1xuIFxuJiM0MztcdHN0b3AgPSBmYWxzZTtcbiBcdG1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7XG4gXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXHUwMDI2YXJnYywgXHUwMDI2YXJndiwgXHUwMDI2bWFwX2luZm8sIFx1MDAyNm1hcF9pbmZvX2xlbixcbiBcdFx0XHRcdCAgICAgICAwKTtcbiBcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtMTtcbiBcbi1cdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XG4tXHRcdHBfZXJyKFwmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5XCYjMzQ7KTtcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDspO1xuJiM0MztcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXHUwMDI2XHUwMDI2IGFyZ2MpIHtcbiYjNDM7XHRcdHBfZXJyKFwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wmIzM0Oyk7XG4gXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiBcdH1cbiBcbkBAIC0xODQsMTUgJiM0MzsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRjdHguaWR4ID0gMDtcbiBcdH1cbiBcbi1cdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuLVx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbi1cdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuLVx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbi1cdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbi1cdGlmICghcGIpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0Oyxcbi1cdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuJiM0MztcdFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFyYikge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbiYjNDM7XHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbiYjNDM7XHRcdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4mIzQzO1x0XHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbiYjNDM7XHRcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4mIzQzO1x0XHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoIXBiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4gXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XG5AQCAtMjAyLDI1ICYjNDM7MjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xuIFxuJiM0MztcdGVyciA9IDA7XG4gXHR3aGlsZSAoIXN0b3ApIHtcbi1cdFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4mIzQzO1x0XHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcbi1cdFx0XHRwX2VycihcJiMzNDtwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVwmIzM0Oyxcbi1cdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0XHRnb3RvIGVycl9jbG9zZV9wYjtcbiYjNDM7XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0Vycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0cmIgPyBcJiMzNDtyaW5nXCYjMzQ7IDogXCYjMzQ7cGVyZlwmIzM0Oywgc3RyZXJyb3IoLWVyciksIC1lcnIpO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuJiM0MztcdFx0ZXJyID0gMDtcbiBcdH1cbiBcbiYjNDM7XHRpZiAoc3RvcClcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtTdG9wcGluZy4uLlxcblwmIzM0Oyk7XG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG4mIzQzO1x0aWYgKGZmbHVzaChzdGRvdXQpKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXFxuXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0ZXJyID0gLTE7XG4mIzQzO1x0fVxuIFxuJiM0MztcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcbiBcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbiYjNDM7XHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcbi1cdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBlcnIgXHUwMDNjIDAgPyAtMSA6IDA7XG4gXG4tZXJyX2Nsb3NlX3BiOlxuLVx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuIGVycl9jbG9zZV9tYXA6XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0cmV0dXJuIC0xO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCAmIzQzOzEsNDI1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZ0b29sX3JpbmdidWYuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFdBSVRfU1RFUFMgNTAwXG4mIzQzOyNkZWZpbmUgV0FJVF9VUyAxMDAwMFxuJiM0MztcbiYjNDM7c3RydWN0IGNvbnN1bWVyIHtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1x0aW50IGZkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgY2hhciAqcGF0aCA9IGdldGVudihcJiMzNDtCUEZUT09MXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhdGgpXG4mIzQzO1x0XHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDssIFhfT0spKVxuJiM0MztcdFx0cmV0dXJuIFwmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7O1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7O1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoY2hpbGQtXHUwMDNlcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKGNoaWxkLVx1MDAzZXBpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHR3aGlsZSAod2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIE5VTEwsIDApIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5UUilcbiYjNDM7XHRcdFx0O1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VmZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGNsb3NlKGNoaWxkLVx1MDAzZWZkKTtcbiYjNDM7XHRcdGNoaWxkLVx1MDAzZWZkID0gLTE7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXG4mIzQzO1x0XHRcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXG4mIzQzO1x0XHRcdCAgIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XG4mIzQzO1x0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcbiYjNDM7XHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXCYjMzQ7YnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcCBpbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXCYjMzQ7JXVcJiMzNDssIGluZm8uaWQpO1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilwYXRoO1xuJiM0MztcdGlmIChmb3JtYXQpXG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopZm9ybWF0O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7bWFwXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7ZXZlbnRfcGlwZVwmIzM0OztcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gXCYjMzQ7cGlubmVkXCYjMzQ7IDogXCYjMzQ7aWRcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBwaW5fcGF0aCA/IChjaGFyICopcGluX3BhdGggOiBpZDtcbiYjNDM7XHRpZiAob3B0aW9uKSB7XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uO1xuJiM0MztcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0aWYgKHBhaXIpIHtcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtpbmRleFwmIzM0OztcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRhcmd2W25dID0gTlVMTDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFwmIzM0O291dHB1dCBwaXBlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCYjMzQ7ZXhlYyBwaXBlXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkLVx1MDAzZXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fV1JPTkxZKTtcbiYjNDM7XHRcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXHUwMDNjIDAgfHxcbiYjNDM7XHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuJiM0MztcdFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcbiYjNDM7XHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRleGVjdihwYXRoLCBhcmd2KTtcbiYjNDM7ZXhlY19mYWlsOlxuJiM0MztcdFx0ZXJyID0gZXJybm87XG4mIzQzO1x0XHR3cml0ZShyZWFkeVsxXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XG4mIzQzO1x0XHRfZXhpdCgxMjcpO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShvdXRbMV0pO1xuJiM0MztcdGNsb3NlKHJlYWR5WzFdKTtcbiYjNDM7XHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbiYjNDM7XHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGNoaWxkLVx1MDAzZXBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFwmIzM0O2V4ZWMgdGltZW91dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKSwgMCwgXCYjMzQ7ZXhlY1wmIzM0OykpIHtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShyZWFkeVswXSk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbiYjNDM7XHRcdFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdHVzID0gMCwgaTtcbiYjNDM7XHRwaWRfdCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XHRzaXplX3QgdXNlZCA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCYjMzQ7c2lnbmFsIGNvbnN1bWVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuJiM0MztcdFx0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4mIzQzO1x0XHRpZiAocmV0ID09IGNoaWxkLVx1MDAzZXBpZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXHUwMDNlcGlkLCBcJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuJiM0MztcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdG91dHB1dFt1c2VkXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtub3JtYWwgZXhpdFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsIFwmIzM0O2V4aXQgc3RhdHVzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4mIzQzO1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuJiM0MztcdGludCBpO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7L3Byb2MvJWQvc3RhdHVzXCYjMzQ7LCBjaGlsZC1cdTAwM2VwaWQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRmID0gZm9wZW4ocGF0aCwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIWYpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDtTaWdDZ3Q6ICVsbHhcJiMzNDssIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHSU5UIC0gMSkpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbiYjNDM7XHRcdFx0XHRmY2xvc2UoZik7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzLFxuJiM0MztcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuJiM0MztcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbiYjNDM7XHQpO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnByb2R1Y2UpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwmIzM0O3Byb2R1Y2UgcmVjb3JkXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwmIzM0O3JpbmdidWYgb3V0cHV0XCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcJiMzNDtjb25zdW1lciBwb3NpdGlvblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcbiYjNDM7XHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xuJiM0MztcdHdoaWxlICgqc3JjKSB7XG4mIzQzO1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0XHRpZiAoIWVzY2FwZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcJiMzNDsmIzM5OylcbiYjNDM7XHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbiYjNDM7XHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICYjMzk7XFxcXCYjMzk7O1xuJiM0MztcdFx0c3JjJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O0pTT04gcmVjb3Jkc1wmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgKnBvc2l0aW9uID0gTUFQX0ZBSUxFRDtcbiYjNDM7XHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4mIzQzO1x0Y2hhciBwaW5fZGlyW10gPSBcJiMzNDsvc3lzL2ZzL2JwZi9icGZ0b29sX3JpbmdidWZfWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICYjNDM7IHNpemVvZihcJiMzNDsvbWFwXCYjMzQ7KV07XG4mIzQzO1x0Ym9vbCBkaXJfY3JlYXRlZCA9IGZhbHNlLCBtYXBfcGlubmVkID0gZmFsc2U7XG4mIzQzO1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4mIzQzO1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmKTtcbiYjNDM7XHRpZiAocGlubmVkKSB7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgXCYjMzQ7Y3JlYXRlIHBpbiBkaXJlY3RvcnlcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcbiYjNDM7XHRcdHNucHJpbnRmKHBpbl9wYXRoLCBzaXplb2YocGluX3BhdGgpLCBcJiMzNDslcy9tYXBcJiMzNDssIHBpbl9kaXIpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX29ial9waW4oZmQsIHBpbl9wYXRoKSwgXCYjMzQ7cGluIHJpbmdidWZcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG1hcF9waW5uZWQgPSB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFwmIzM0O2NvbnN1bWVyIG1tYXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFpZGxlIFx1MDAyNlx1MDAyNiAoIWVtaXRfcmVjb3JkKHNrZWwsIDApIHx8ICFlbWl0X3JlY29yZChza2VsLCAxKSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXG4mIzQzO1x0XHRcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUpIHtcbiYjNDM7XHRcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xuJiM0MztcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKGZvcm1hdCBcdTAwMjZcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFwmIzM0Oy1wXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcJiMzNDtbXVxcblwmIzM0OyA6XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiAyLFxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtkYXRhXFxcJiMzNDs6IFswLDI1NVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICB9LHtcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiA1LFxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtkYXRhXFxcJiMzNDs6IFsxLDIsMyw0LDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIF1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgfSx7XFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O3NpemVcXFwmIzM0OzogMTcsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgIH1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtdXFxuXCYjMzQ7LCBcJiMzNDtwcmV0dHkgSlNPTiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChmb3JtYXQpXG4mIzQzO1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7W3tcXFwmIzM0O3NpemVcXFwmIzM0OzoyLFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlswLDI1NV19LFwmIzM0O1xuJiM0MztcdFx0XHQgICBcJiMzNDt7XFxcJiMzNDtzaXplXFxcJiMzNDs6NSxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMSwyLDMsNCw1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0OzoxNyxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0OzI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCYjMzQ7XCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAyID09PT09XFxuMDAgZmZcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiA1ID09PT09XFxuMDEgMDIgMDMgMDQgMDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAxNyA9PT09PVxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcbjIwXFxuXCYjMzQ7LCBcJiMzNDtwbGFpbiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChtYXBfcGlubmVkKVxuJiM0MztcdFx0QVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksIFwmIzM0O3VucGluIHJpbmdidWZcJiMzNDspO1xuJiM0MztcdGlmIChkaXJfY3JlYXRlZClcbiYjNDM7XHRcdEFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgXCYjMzQ7cmVtb3ZlIHBpbiBkaXJlY3RvcnlcJiMzNDspO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4mIzQzO1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbiYjNDM7XHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbiYjNDM7XHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwmIzM0O3Bvc3NpYmxlIGNwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXG4mIzQzO1x0XHRcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkgfHxcbiYjNDM7XHQgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi9cbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BlcmYgcmVjb3JkIG91dHB1dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFx1MDAyNiBQT0xMSU4sIFwmIzM0O3BlcmYgb3V0cHV0IHJlYWRhYmxlXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCYjMzQ7PT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcbiVuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFwmIzM0O3BlcmYgaGVhZGVyXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXCYjMzQ7cGVyZiBwYXlsb2FkIG9mZnNldFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgJiM0MzsgbmFub3NlY29uZHMsIDAsIFwmIzM0O3BlcmYgdGltZXN0YW1wXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwmIzM0O3BlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfR0UoY3B1LCAwLCBcJiMzNDtwZXJmIGNwdVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCYjMzQ7cGVyZiBjcHUgcmFuZ2VcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcJiMzNDtwZXJmIGluZGV4XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCYjMzQ7XCYjMzQ7IDogIShpICUgMTYpID8gXCYjMzQ7XFxuXCYjMzQ7IDpcbiYjNDM7XHRcdFx0XHRcdCEoaSAlIDgpID8gXCYjMzQ7ICBcJiMzNDsgOiBcJiMzNDsgXCYjMzQ7O1xuJiM0MztcbiYjNDM7XHRcdHVzZWQgJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLFxuJiM0MztcdFx0XHRcdCBcJiMzNDslcyUwMnhcJiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsIFwmIzM0O3BlcmYgcGF5bG9hZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbiYjNDM7XHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHRib29sIHJpbmcgPSB0eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIHx8IHR5cGUgPT0gQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRjtcbiYjNDM7XHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XG4mIzQzO1x0XHRcJiMzNDt7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlxcXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcJiMzNDt9XCYjMzQ7IDpcbiYjNDM7XHRcdFwmIzM0O3tcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XFxcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclxcXCYjMzQ7fVwmIzM0OztcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdGZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsXG4mIzQzO1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtjcmVhdGUgbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAoY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uID8gXCYjMzQ7LWpcJiMzNDsgOiBOVUxMLCBOVUxMLCBvcHRpb24sIHBhaXIsIHRydWUpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xuJiM0MztcdFx0aWYgKGpzb24pXG4mIzQzO1x0XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXCYjMzQ7ZXJyb3IgZGlhZ25vc3RpY1wmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwbGFpblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtqc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LWpcJiMzNDssIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9wbGFpblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwaW5uZWRfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1qXCYjMzQ7LCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwaW5uZWRfcHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lnaW50XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWd0ZXJtX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstalwmIzM0OywgdHJ1ZSwgU0lHVEVSTSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lnaW50X3ByZXR0eV9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LXBcJiMzNDssIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9hcnJheVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZlwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9jcHVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2luZGV4XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9jcHVfaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF91c2VyX3JpbmdidWZfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleF9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcJiMzNDtjcHVcJiMzNDssIHRydWUsIHRydWUpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSw0NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuJiM0Mzt9IHJpbmdidWYgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0Mzt9IHBlcmZidWYgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJiMzOTtzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cbiYjNDM7ICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXG4mIzQzOyAqL1xuJiM0Mztjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcbiYjNDM7aW50IHJlY29yZDtcbiYjNDM7aW50IG91dHB1dF9lcnI7XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c29ja2V0XCYjMzQ7KVxuJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XG4mIzQzO1x0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xuJiM0MztcdFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcbiYjNDM7XHRcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlY29yZCA9PSAwKVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDEpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xuJiM0MztcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxuJiM0MztcdFx0XHRcdFx0XHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6NDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWEyNmVmNzY0NTUwZTMxMWE1Zjc3ZmY3NTk2OTUzMWY1MTBjODM3NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKgogICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi4KIAogYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuCiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3IKJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC4KIAogICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueQogICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZQpAQCAtMTM0LDYgJiM0MzsxMzUsMTggQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdAogICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci4KIAomIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmcKJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KioKJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgYXMgcmF3IGJ5dGVzLCBpbmNsdWRpbmcgZW1iZWRkZWQKJiM0MzsgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsCiYjNDM7ICAgIGJ5dGVzOyBKU09OIG91dHB1dCBjb250YWlucyAqKnNpemUqKiBhbmQgKipkYXRhKiogZmllbGRzLCB3aXRoICoqZGF0YSoqIGFuCiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC4KJiM0MzsKJiM0MzsgICAgUmluZyBidWZmZXJzIHN1cHBvcnQgYSBzaW5nbGUgY29uc3VtZXIuIFRoaXMgY29tbWFuZCBhZHZhbmNlcyB0aGUgc2hhcmVkCiYjNDM7ICAgIGNvbnN1bWVyIHBvc2l0aW9uIGFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWUKJiM0MzsgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKioKJiM0MzsgICAgbWFwcyBhcmUgbm90IHN1cHBvcnRlZC4KJiM0MzsKIGJwZnRvb2wgbWFwIHBlZWsgICpNQVAqCiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay4KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtODc4LDExICYjNDM7ODc4LDExIEBAIF9icGZ0b29sKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICYjMzk7JiMzNDt0eXBlJiMzNDs6ICYjMzQ7XChwZXJmX2V2ZW50X2FycmF5XHxyaW5nYnVmXCkmIzM0OyYjMzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAmIzM5OyYjMzQ7dHlwZSYjMzQ7OiAmIzM0O1wocGVyZl9ldmVudF9hcnJheVx8cmluZ2J1ZlwpJiMzNDsmIzM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwppbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCkBAIC0yNyw3ICYjNDM7MjcsNyBAQAogCiAjZGVmaW5lIE1NQVBfUEFHRV9DTlQJMTYKIAotc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDsKJiM0MztzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHN0b3A7CiAKIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7CiAJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3QgewogCiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pCiB7Ci0JZnByaW50ZihzdGRlcnIsICYjMzQ7U3RvcHBpbmcuLi5cbiYjMzQ7KTsKIAlzdG9wID0gdHJ1ZTsKIH0KIApAQCAtMTA3LDYgJiM0MzsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpCiAJcmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlpZiAoanNvbl9vdXRwdXQpIHsKJiM0MzsJCWpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7CiYjNDM7CQlqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCAmIzM0O3NpemUmIzM0Oywgc2l6ZSk7CiYjNDM7CQlqc29ud19uYW1lKGpzb25fd3RyLCAmIzM0O2RhdGEmIzM0Oyk7CiYjNDM7CQlwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7CiYjNDM7CQlqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXByaW50ZigmIzM0Oz09IHNpemU6ICV6dSA9PT09PVxuJiMzNDssIHNpemUpOwomIzQzOwkJZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsICYjMzQ7ICYjMzQ7KTsKJiM0MzsJCXByaW50ZigmIzM0O1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmZmx1c2goc3Rkb3V0KSkKJiM0MzsJCXJldHVybiBlcnJubyA/IC1lcnJubyA6IC1FSU87CiYjNDM7CiYjNDM7CS8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqLwomIzQzOwlyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7CiYjNDM7fQomIzQzOwogaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0gewpAQCAtMTIzLDE4ICYjNDM7MTQzLDI2IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJLmNwdSA9IC0xLAogCQkuaWR4ID0gLTEsCiAJfTsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiOwomIzQzOwlzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDsKJiM0MzsJc3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7CiAJX191MzIgbWFwX2luZm9fbGVuOwogCWludCBlcnIsIG1hcF9mZDsKIAomIzQzOwlzdG9wID0gZmFsc2U7CiAJbWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTsKIAltYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oJmFtcDthcmdjLCAmYW1wO2FyZ3YsICZhbXA7bWFwX2luZm8sICZhbXA7bWFwX2luZm9fbGVuLAogCQkJCSAgICAgICAwKTsKIAlpZiAobWFwX2ZkICZsdDsgMCkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHsKLQkJcF9lcnIoJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSYjMzQ7KTsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgJmFtcDsmYW1wOwomIzQzOwkgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikgewomIzQzOwkJcF9lcnIoJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlciYjMzQ7KTsKJiM0MzsJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiAmYW1wOyZhbXA7IGFyZ2MpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzJiMzNDspOwogCQlnb3RvIGVycl9jbG9zZV9tYXA7CiAJfQogCkBAIC0xODQsMTUgJiM0MzsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQljdHguaWR4ID0gMDsKIAl9CiAKLQlvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTsKLQlvcHRzLmNwdXMgPSAmYW1wO2N0eC5jcHU7Ci0Jb3B0cy5tYXBfa2V5cyA9ICZhbXA7Y3R4LmlkeDsKLQlwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgJmFtcDtwZXJmX2F0dHIsCi0JCQkJICBwcmludF9icGZfb3V0cHV0LCAmYW1wO2N0eCwgJmFtcDtvcHRzKTsKLQlpZiAoIXBiKSB7Ci0JCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAotCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikgewomIzQzOwkJcmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpOwomIzQzOwkJaWYgKCFyYikgewomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAomIzQzOwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwomIzQzOwkJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJCX0KJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxOwomIzQzOwkJb3B0cy5jcHVzID0gJmFtcDtjdHguY3B1OwomIzQzOwkJb3B0cy5tYXBfa2V5cyA9ICZhbXA7Y3R4LmlkeDsKJiM0MzsJCXBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCAmYW1wO3BlcmZfYXR0ciwKJiM0MzsJCQkJCSAgcHJpbnRfYnBmX291dHB1dCwgJmFtcDtjdHgsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIXBiKSB7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpJiMzNDssCiYjNDM7CQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiYjNDM7CQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwkJfQogCX0KIAogCXNpZ25hbChTSUdJTlQsIGludF9leGl0KTsKQEAgLTIwMiwyNSAmIzQzOzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKGpzb25fb3V0cHV0KQogCQlqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7CiAKJiM0MzsJZXJyID0gMDsKIAl3aGlsZSAoIXN0b3ApIHsKLQkJZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7CiYjNDM7CQllcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7CiAJCWlmIChlcnIgJmx0OyAwICZhbXA7JmFtcDsgZXJyICE9IC1FSU5UUikgewotCQkJcF9lcnIoJiMzNDtwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKSYjMzQ7LAotCQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0JCQlnb3RvIGVycl9jbG9zZV9wYjsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogJXMgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXG4mIzM0OywKJiM0MzsJCQkJcmIgPyAmIzM0O3JpbmcmIzM0OyA6ICYjMzQ7cGVyZiYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7CiYjNDM7CQkJYnJlYWs7CiAJCX0KJiM0MzsJCWVyciA9IDA7CiAJfQogCiYjNDM7CWlmIChzdG9wKQomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7U3RvcHBpbmcuLi5cbiYjMzQ7KTsKIAlpZiAoanNvbl9vdXRwdXQpCiAJCWpzb253X2VuZF9hcnJheShqc29uX3d0cik7CiYjNDM7CWlmIChmZmx1c2goc3Rkb3V0KSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCWVyciA9IC0xOwomIzQzOwl9CiAKJiM0MzsJcmluZ19idWZmZXJfX2ZyZWUocmIpOwogCXBlcmZfYnVmZmVyX19mcmVlKHBiKTsKJiM0MzsJLyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi8KIAljbG9zZShtYXBfZmQpOwogCi0JcmV0dXJuIDA7CiYjNDM7CXJldHVybiBlcnIgJmx0OyAwID8gLTEgOiAwOwogCi1lcnJfY2xvc2VfcGI6Ci0JcGVyZl9idWZmZXJfX2ZyZWUocGIpOwogZXJyX2Nsb3NlX21hcDoKIAljbG9zZShtYXBfZmQpOwogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMWE0YWU4OGMwNWEwNwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jCkBAIC0wLDAgJiM0MzsxLDQyNSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2N0eXBlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDAKJiM0MzsjZGVmaW5lIFdBSVRfVVMgMTAwMDAKJiM0MzsKJiM0MztzdHJ1Y3QgY29uc3VtZXIgewomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CWludCBmZDsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoJiMzNDtCUEZUT09MJiMzNDspOwomIzQzOwomIzQzOwlpZiAocGF0aCkKJiM0MzsJCXJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDsKJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7LCBYX09LKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDs7CiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDssIFhfT0spKQomIzQzOwkJcmV0dXJuICYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDs7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpCiYjNDM7ewomIzQzOwlpZiAoY2hpbGQtJmd0O3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoY2hpbGQtJmd0O3BpZCwgU0lHS0lMTCk7CiYjNDM7CQl3aGlsZSAod2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCBOVUxMLCAwKSAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5UUikKJiM0MzsJCQk7CiYjNDM7CQljaGlsZC0mZ3Q7cGlkID0gLTE7CiYjNDM7CX0KJiM0MzsJaWYgKGNoaWxkLSZndDtmZCAmZ3Q7PSAwKSB7CiYjNDM7CQljbG9zZShjaGlsZC0mZ3Q7ZmQpOwomIzQzOwkJY2hpbGQtJmd0O2ZkID0gLTE7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfc3RhcnQoc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IG1hcF9mZCwgY29uc3QgY2hhciAqZm9ybWF0LAomIzQzOwkJCSAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sCiYjNDM7CQkJICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJY29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpOwomIzQzOwljaGFyICphcmd2WzEyXSwgaWRbMTZdOwomIzQzOwlpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsICYjMzQ7YnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSkmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcCBpbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgJiMzNDsldSYjMzQ7LCBpbmZvLmlkKTsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSAoY2hhciAqKXBhdGg7CiYjNDM7CWlmIChmb3JtYXQpCiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopZm9ybWF0OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7bWFwJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtldmVudF9waXBlJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyAmIzM0O3Bpbm5lZCYjMzQ7IDogJiMzNDtpZCYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkOwomIzQzOwlpZiAob3B0aW9uKSB7CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uOwomIzQzOwkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCWlmIChwYWlyKSB7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2luZGV4JiMzNDs7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlhcmd2W25dID0gTlVMTDsKJiM0MzsJaWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCAmIzM0O291dHB1dCBwaXBlJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgJiMzNDtleGVjIHBpcGUmIzM0OykpIHsKJiM0MzsJCWNsb3NlKG91dFswXSk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNoaWxkLSZndDtwaWQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQtJmd0O3BpZCkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKHJlYWR5WzBdKTsKJiM0MzsJCWVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbigmIzM0Oy9kZXYvbnVsbCYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CQlpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pICZsdDsgMCB8fAomIzQzOwkJICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSAmbHQ7IDApCiYjNDM7CQkJZ290byBleGVjX2ZhaWw7CiYjNDM7CQlpZiAoIWNhcHR1cmVfZXJyb3JzKQomIzQzOwkJCWNsb3NlKGVycl9mZCk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJZXhlY3YocGF0aCwgYXJndik7CiYjNDM7ZXhlY19mYWlsOgomIzQzOwkJZXJyID0gZXJybm87CiYjNDM7CQl3cml0ZShyZWFkeVsxXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKTsKJiM0MzsJCV9leGl0KDEyNyk7CiYjNDM7CX0KJiM0MzsJY2xvc2Uob3V0WzFdKTsKJiM0MzsJY2xvc2UocmVhZHlbMV0pOwomIzQzOwljaGlsZC0mZ3Q7ZmQgPSBvdXRbMF07CiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CS8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi8KJiM0MzsJZXJyID0gY2hpbGQtJmd0O3BpZCAmZ3Q7IDAgPyBwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNoaWxkLSZndDtwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChlcnIsIDAsICYjMzQ7ZXhlYyB0aW1lb3V0JiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sICZhbXA7ZXJyLCBzaXplb2YoZXJyKSksIDAsICYjMzQ7ZXhlYyYjMzQ7KSkgewomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJY29uc3VtZXJfY2xlYW51cChjaGlsZCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2xvc2UocmVhZHlbMF0pOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLAomIzQzOwkJCSAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaW50IHN0YXR1cyA9IDAsIGk7CiYjNDM7CXBpZF90IHJldCA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJc2l6ZV90IHVzZWQgPSAwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC0mZ3Q7ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCAmIzM0O25vbmJsb2NraW5nIG91dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJaWYgKHNpZ25vICZhbXA7JmFtcDsgIUFTU0VSVF9PSyhraWxsKGNoaWxkLSZndDtwaWQsIHNpZ25vKSwgJiMzNDtzaWduYWwgY29uc3VtZXImIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCQl1c2VkICYjNDM7PSBuOwomIzQzOwkJcmV0ID0gd2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCAmYW1wO3N0YXR1cywgV05PSEFORyk7CiYjNDM7CQlpZiAocmV0ID09IGNoaWxkLSZndDtwaWQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vICE9IEVJTlRSKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtJmd0O3BpZCwgJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXQmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7IChuID0gcmVhZChjaGlsZC0mZ3Q7ZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSAmZ3Q7IDApCiYjNDM7CQl1c2VkICYjNDM7PSBuOwomIzQzOwlvdXRwdXRbdXNlZF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtub3JtYWwgZXhpdCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCAmIzM0O2V4aXQgc3RhdHVzJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDsKJiM0MzsJY2hhciBwYXRoWzY0XSwgbGluZVsyNTZdOwomIzQzOwlpbnQgaTsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0Oy9wcm9jLyVkL3N0YXR1cyYjMzQ7LCBjaGlsZC0mZ3Q7cGlkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlmID0gZm9wZW4ocGF0aCwgJiMzNDtyJiMzNDspOwomIzQzOwkJaWYgKCFmKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKJiM0MzsJCQlpZiAoc3NjYW5mKGxpbmUsICYjMzQ7U2lnQ2d0OiAlbGx4JiMzNDssICZhbXA7Y2F1Z2h0KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHSU5UIC0gMSkpKSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIChjYXVnaHQgJmFtcDsgKDFVTEwgJmx0OyZsdDsgKFNJR1RFUk0gLSAxKSkpKSB7CiYjNDM7CQkJCWZjbG9zZShmKTsKJiM0MzsJCQkJcmV0dXJuIHRydWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZmNsb3NlKGYpOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHkmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpCiYjNDM7ewomIzQzOwljaGFyIHBhY2tldFs2NF0gPSB7fTsKJiM0MzsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsCiYjNDM7CQkgICAgLmRhdGFfaW4gPSBwYWNrZXQsCiYjNDM7CQkgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLAomIzQzOwkpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3JlY29yZCA9IHJlY29yZDsKJiM0MzsJcmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5wcm9kdWNlKSwKJiM0MzsJCQkJCSAgICAgICZhbXA7b3B0cyksICYjMzQ7cHJvZHVjZSByZWNvcmQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgQVNTRVJUX09LKHNrZWwtJmd0O2Jzcy0mZ3Q7b3V0cHV0X2VyciwgJiMzNDtyaW5nYnVmIG91dHB1dCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZCkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcChXQUlUX1VTKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsICYjMzQ7Y29uc3VtZXIgcG9zaXRpb24mIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDsKJiM0MzsJYm9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwomIzQzOwomIzQzOwkvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi8KJiM0MzsJd2hpbGUgKCpzcmMpIHsKJiM0MzsJCWlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkJaWYgKCFlc2NhcGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5OyYjMzQ7JiMzOTspCiYjNDM7CQkJcXVvdGVkID0gIXF1b3RlZDsKJiM0MzsJCWVzY2FwZWQgPSAhZXNjYXBlZCAmYW1wOyZhbXA7IHF1b3RlZCAmYW1wOyZhbXA7ICpzcmMgPT0gJiMzOTtcXCYjMzk7OwomIzQzOwkJc3JjJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJdW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEOwomIzQzOwlpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7CiYjNDM7CWNoYXIgcGluX2RpcltdID0gJiMzNDsvc3lzL2ZzL2JwZi9icGZ0b29sX3JpbmdidWZfWFhYWFhYJiMzNDs7CiYjNDM7CWNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICYjNDM7IHNpemVvZigmIzM0Oy9tYXAmIzM0OyldOwomIzQzOwlib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgJiMzNDtsb2FkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkID0gYnBmX21hcF9fZmQoc2tlbC0mZ3Q7bWFwcy5yaW5nYnVmKTsKJiM0MzsJaWYgKHBpbm5lZCkgewomIzQzOwkJaWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksICYjMzQ7Y3JlYXRlIHBpbiBkaXJlY3RvcnkmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlkaXJfY3JlYXRlZCA9IHRydWU7CiYjNDM7CQlzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgJiMzNDslcy9tYXAmIzM0OywgcGluX2Rpcik7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCAmIzM0O3BpbiByaW5nYnVmJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbWFwX3Bpbm5lZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsJcG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgJiMzNDtjb25zdW1lciBtbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSAmYW1wOyZhbXA7ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCwKJiM0MzsJCQkgICAgTlVMTCwgZmFsc2UsIGZhbHNlKSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3JlYWR5KCZhbXA7Y2hpbGQpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSkgewomIzQzOwkJLyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovCiYjNDM7CQlpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9OwomIzQzOwkJaWYgKCFBU1NFUlRfR1QocG9sbCgmYW1wO3BmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWNvcmRzIGZsdXNoZWQgYmVmb3JlIGV4aXQmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgJmFtcDsgUE9MTElOLCAmIzM0O3JlY29yZCBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJCSAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJaWYgKCFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmIChmb3JtYXQgJmFtcDsmYW1wOyAhc3RyY21wKGZvcm1hdCwgJiMzNDstcCYjMzQ7KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0O1tdXG4mIzM0OyA6CiYjNDM7CQkJICAgICAmIzM0O1t7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDIsXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O2RhdGFcJiMzNDs6IFswLDI1NVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBdXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgfSx7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDUsXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O2RhdGFcJiMzNDs6IFsxLDIsMyw0LDVcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgIH0se1xuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBcJiMzNDtzaXplXCYjMzQ7OiAxNyxcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIF1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICB9XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDtdXG4mIzM0OywgJiMzNDtwcmV0dHkgSlNPTiByZWNvcmRzJiMzNDspOwomIzQzOwllbHNlIGlmIChmb3JtYXQpCiYjNDM7CQljaGVja19qc29uKG91dHB1dCwgaWRsZSA/ICYjMzQ7W10mIzM0OyA6CiYjNDM7CQkJICAgJiMzNDtbe1wmIzM0O3NpemVcJiMzNDs6MixcJiMzNDtkYXRhXCYjMzQ7OlswLDI1NV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0Ozo1LFwmIzM0O2RhdGFcJiMzNDs6WzEsMiwzLDQsNV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0OzoxNyxcJiMzNDtkYXRhXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywmIzM0OwomIzQzOwkJCSAgICYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV0mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0OyYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogMiA9PT09PVxuMDAgZmZcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDUgPT09PT1cbjAxIDAyIDAzIDA0IDA1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAxNyA9PT09PVxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgICYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXG4yMFxuJiMzNDssICYjMzQ7cGxhaW4gcmVjb3JkcyYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKQomIzQzOwkJbXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpOwomIzQzOwlpZiAobWFwX3Bpbm5lZCkKJiM0MzsJCUFTU0VSVF9PSyh1bmxpbmsocGluX3BhdGgpLCAmIzM0O3VucGluIHJpbmdidWYmIzM0Oyk7CiYjNDM7CWlmIChkaXJfY3JlYXRlZCkKJiM0MzsJCUFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgJiMzNDtyZW1vdmUgcGluIGRpcmVjdG9yeSYjMzQ7KTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7CiYjNDM7CXN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7CiYjNDM7CWNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdOwomIzQzOwlpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkczsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CW5yX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgJiMzNDtwb3NzaWJsZSBjcHVzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpOwomIzQzOwlicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC0mZ3Q7bWFwcy5wZXJmYnVmLCBucl9jcHVzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCAmIzM0O2xvYWQmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBicGZfbWFwX19mZChza2VsLSZndDttYXBzLnBlcmZidWYpLCBOVUxMLAomIzQzOwkJCSAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeSgmYW1wO2NoaWxkKSB8fAomIzQzOwkgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovCiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CWlmICghQVNTRVJUX0dUKHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsCiYjNDM7CQkgICAgICAgJiMzNDtwZXJmIHJlY29yZCBvdXRwdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCAmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cbiVuJiMzNDssCiYjNDM7CQkJJmFtcDtzZWNvbmRzLCAmYW1wO25hbm9zZWNvbmRzLCAmYW1wO2NwdSwgJmFtcDtpbmRleCwgJmFtcDtvZmZzZXQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsICYjMzQ7cGVyZiBoZWFkZXImIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCAmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCAmIzM0O3BlcmYgdGltZXN0YW1wJiMzNDspOwomIzQzOwlBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsICYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9HRShjcHUsIDAsICYjMzQ7cGVyZiBjcHUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChjcHUsIG5yX2NwdXMsICYjMzQ7cGVyZiBjcHUgcmFuZ2UmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShpbmRleCwgY3B1LCAmIzM0O3BlcmYgaW5kZXgmIzM0Oyk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplb2Yoc2tlbC0mZ3Q7cm9kYXRhLSZndDtwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyAmIzM0OyYjMzQ7IDogIShpICUgMTYpID8gJiMzNDtcbiYjMzQ7IDoKJiM0MzsJCQkJCSEoaSAlIDgpID8gJiMzNDsgICYjMzQ7IDogJiMzNDsgJiMzNDs7CiYjNDM7CiYjNDM7CQl1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwKJiM0MzsJCQkJICYjMzQ7JXMlMDJ4JiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCAmIzM0O1xuJiMzNDspOwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsICYjMzQ7cGVyZiBwYXlsb2FkJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CWJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGOwomIzQzOwljb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcJiMzNDt9JiMzNDsgOgomIzQzOwkJJiMzNDt7XCYjMzQ7ZXJyb3JcJiMzNDs6XCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDt9JiMzNDs7CiYjNDM7CWNoYXIgb3V0cHV0WzQwOTZdOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsCiYjNDM7CQkJICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O2NyZWF0ZSBtYXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBmZCwganNvbiA/ICYjMzQ7LWomIzM0OyA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgJmFtcDsmYW1wOwomIzQzOwkgICAgY29uc3VtZXJfZmluaXNoKCZhbXA7Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkgewomIzQzOwkJaWYgKGpzb24pCiYjNDM7CQkJY2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsICYjMzQ7ZXJyb3IgZGlhZ25vc3RpYyYjMzQ7KTsKJiM0MzsJfQomIzQzOwljb25zdW1lcl9jbGVhbnVwKCZhbXA7Y2hpbGQpOwomIzQzOwljbG9zZShmZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyZl9ldmVudF9hcnJheSYjMzQ7KSkKJiM0MzsJCXRlc3RfcGVyZl9jb25zdW1lcigpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3BsYWluJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7anNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3ByZXR0eV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1wJiMzNDssIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCBmYWxzZSwgU0lHSU5ULCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfcHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgZmFsc2UsIFNJR1RFUk0sIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lnaW50JiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtpZGxlX3NpZ3Rlcm1fanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnRfcHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF91c2VyX3JpbmdidWYmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHUmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfaW5kZXgmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtpbmRleCYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXgmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgdHJ1ZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF91c2VyX3JpbmdidWZfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgdHJ1ZSwgdHJ1ZSk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKQEAgLTAsMCAmIzQzOzEsNDcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTsKJiM0Mzt9IHJpbmdidWYgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTsKJiM0MzsJX191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTsKJiM0MzsJX191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQobWF4X2VudHJpZXMsIDEpOwomIzQzO30gcGVyZmJ1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJiMzOTtzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy4KJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy4KJiM0MzsgKi8KJiM0Mztjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9OwomIzQzOwomIzQzO2ludCByZWNvcmQ7CiYjNDM7aW50IG91dHB1dF9lcnI7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c29ja2V0JiMzNDspCiYjNDM7aW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTsKJiM0MzsJdW5zaWduZWQgY2hhciB0aGlyZFtdID0gewomIzQzOwkJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKJiM0MzsJCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsCiYjNDM7CX07CiYjNDM7CiYjNDM7CWlmIChyZWNvcmQgPT0gMCkKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoJmFtcDtyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAxKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApOwomIzQzOwllbHNlIGlmIChyZWNvcmQgPT0gMikKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoJmFtcDtyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7CiYjNDM7CWVsc2UKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCAmYW1wO3BlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLAomIzQzOwkJCQkJCSAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE5MjQKCQkJCQkJCW91dHB1dDogMTAxCgkJCQkJCQl0aG91Z2h0czogNTkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRXZhbHVhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGZpbGVzIHJlbGF0ZWQgdG8gYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2AgYW5kIGFkZGluZyBzZWxmdGVzdHMgdW5kZXIgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjaGVjayBpZiB0aGVzZSBjaGFuZ2VzIHdhcnJhbnQgZnV6emluZy4gVGhlIGtleSBpcyB3aGV0aGVyIHRoZXkgaW1wYWN0IHRoZSBrZXJuZWwgaXRzZWxmLgoKRmlyc3QsIGxldCYjMzk7cyBjb25maXJtIHRoZSBmaWxlcyBpbnZvbHZlZDogYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YCwgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYCwgYHRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY2AsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY2AsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jYC4KCk5vdywgYWNjb3JkaW5nIHRvIFNlY3Rpb24gMiBvZiB0aGUgaW5zdHJ1Y3Rpb25zLCBJIHNob3VsZCBvbmx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYCBpZiAqYWxsKiBtb2RpZmllZCBjb2RlIGZhbGxzIHVuZGVyIHNwZWNpZmljIG5lZ2F0aXZlIGNyaXRlcmlhOiBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgdXNlci1zcGFjZSB0b29scywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0IGRvICpub3QqIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzLgoKTG9va2luZyBhdCB0aGUgZmlsZSBwYXRocywgdGhleSYjMzk7cmUgYWxsIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSDigJMgYGJwZnRvb2xgIGFuZCBgYnBmYCBzZWxmdGVzdHMuIFRoZXJlJiMzOTtzIG5vdGhpbmcgaW4gYGtlcm5lbC9gLCBgbW0vYCwgYG5ldC9gLCBgZnMvYCwgYGRyaXZlcnMvYCwgYGFyY2gvYCwgb3IgdG91Y2hpbmcgYW55IGBpbmNsdWRlL2xpbnV4L2AgaGVhZGVycy4gVGhpcyBpcyBhIGNsZWFyIGluZGljYXRvci4KCkxldCYjMzk7cyBkb3VibGUtY2hlY2sgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZTogYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YCwgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYCwgYHRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY2AsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY2AsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jYC4gWWVwLCBhbGwgdW5kZXIgdGhlIGB0b29scy9gIHVtYnJlbGxhLgoKU28sIHRoaXMgcGF0Y2ggaXMgc29sZWx5IG1vZGlmeWluZyB1c2VyLXNwYWNlIHRvb2xzIChgYnBmdG9vbGApIGFuZCBpdHMgYXNzb2NpYXRlZCBzZWxmdGVzdHMuIE5vIGltcGFjdCBvbiB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgdGhpcyBpcyBub3QgYSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuCgpNeSBjb25jbHVzaW9uIGlzOiBgV29ydGhGdXp6aW5nPWZhbHNlYC4KCk5vdywgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIHNldHRpbmcgdGhlIGBzZXQtcmVzdWx0c2AgcGFyYW1ldGVycyBjb3JyZWN0bHk6Ci0gYFdvcnRoRnV6emluZ2A6IGZhbHNlCi0gYFJlYXNvbmluZ2A6IFRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHRvb2xzIGFuZCBicGYgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLywgd2l0aCBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4KLSBgRm9jdXNTeW1ib2xzYDogW10KLSBgRW5hYmxlQ29uZmlnc2A6IFtdCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGUgY29kZSBpcyB0b3VjaGVkLCBzbyBpdCBpcyBub3QgcmVsZXZhbnQgZm9yIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjo0MTo0MC42OTgzNzgyOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4NTM1MjQ1MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIGFuZCBCUEYgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlIGNvZGUgaXMgdG91Y2hlZCwgc28gaXQgaXMgbm90IHJlbGV2YW50IGZvciBrZXJuZWwgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQwLjY5ODM5MTlaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MDk4MDc1MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhYTI2ZWY3NjQ1NTBlMzExYTVmNzdmZjc1OTY5NTMxZjUxMGM4Mzc2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxcbisgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsXFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxcbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxcbitcXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxcbisgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKipcXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXFxuK1xcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1xcXCJ0eXBlXFxcIjogXFxcIlxcXFwocGVyZl9ldmVudF9hcnJheVxcXFx8cmluZ2J1ZlxcXFwpXFxcIidcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbkBAIC0yNyw3ICsyNyw3IEBAXFxuIFxcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcXHQxNlxcbiBcXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xcbiBcXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcXG4gXFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcXG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcXG4gXFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcXG4ge1xcbi1cXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0c3RvcCA9IHRydWU7XFxuIH1cXG4gXFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXFxuIFxcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuK1xcdFxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxuK1xcdFxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJzaXplXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJkYXRhXFxcIik7XFxuK1xcdFxcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcXG4rXFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHByaW50ZihcXFwiPT0gc2l6ZTogJXp1ID09PT09XFxcXG5cXFwiLCBzaXplKTtcXG4rXFx0XFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFxcXCIgXFxcIik7XFxuK1xcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZmbHVzaChzdGRvdXQpKVxcbitcXHRcXHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xcbitcXG4rXFx0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXFxuK1xcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcXG4rfVxcbitcXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdC5jcHUgPSAtMSxcXG4gXFx0XFx0LmlkeCA9IC0xLFxcbiBcXHR9O1xcbi1cXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xcbitcXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcXG4rXFx0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XFxuIFxcdF9fdTMyIG1hcF9pbmZvX2xlbjtcXG4gXFx0aW50IGVyciwgbWFwX2ZkO1xcbiBcXG4rXFx0c3RvcCA9IGZhbHNlO1xcbiBcXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xcbiBcXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXFx1MDAyNmFyZ2MsIFxcdTAwMjZhcmd2LCBcXHUwMDI2bWFwX2luZm8sIFxcdTAwMjZtYXBfaW5mb19sZW4sXFxuIFxcdFxcdFxcdFxcdCAgICAgICAwKTtcXG4gXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybiAtMTtcXG4gXFxuLVxcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVxcXCIpO1xcbitcXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbitcXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwiKTtcXG4rXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcXHUwMDI2XFx1MDAyNiBhcmdjKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwiKTtcXG4gXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdGN0eC5pZHggPSAwO1xcbiBcXHR9XFxuIFxcbi1cXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4tXFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuLVxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4tXFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuLVxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbi1cXHRpZiAoIXBiKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4rXFx0XFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuK1xcdFxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4rXFx0XFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIXBiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XFxuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxuIFxcbitcXHRlcnIgPSAwO1xcbiBcXHR3aGlsZSAoIXN0b3ApIHtcXG4tXFx0XFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuK1xcdFxcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcXG4gXFx0XFx0aWYgKGVyciBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FSU5UUikge1xcbi1cXHRcXHRcXHRwX2VycihcXFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFwiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcXG4tXFx0XFx0XFx0Z290byBlcnJfY2xvc2VfcGI7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0cmIgPyBcXFwicmluZ1xcXCIgOiBcXFwicGVyZlxcXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4rXFx0XFx0ZXJyID0gMDtcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKHN0b3ApXFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU3RvcHBpbmcuLi5cXFxcblxcXCIpO1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0ZXJyID0gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcXG4gXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbitcXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBlcnIgXFx1MDAzYyAwID8gLTEgOiAwO1xcbiBcXG4tZXJyX2Nsb3NlX3BiOlxcbi1cXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XFxuIGVycl9jbG9zZV9tYXA6XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdHJldHVybiAtMTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMWE0YWU4OGMwNWEwN1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsNDI1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcXG4rXFxuK3N0cnVjdCBjb25zdW1lciB7XFxuK1xcdHBpZF90IHBpZDtcXG4rXFx0aW50IGZkO1xcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXFxcIkJQRlRPT0xcXFwiKTtcXG4rXFxuK1xcdGlmIChwYXRoKVxcbitcXHRcXHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXFxcIjtcXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVxcdTAwM2VwaWQsIE5VTEwsIDApIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5UUilcXG4rXFx0XFx0XFx0O1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlcGlkID0gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VmZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGNsb3NlKGNoaWxkLVxcdTAwM2VmZCk7XFxuK1xcdFxcdGNoaWxkLVxcdTAwM2VmZCA9IC0xO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCxcXG4rXFx0XFx0XFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcXG4rXFx0XFx0XFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcXG4rXFx0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcXG4rXFx0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXFxcImJwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSwgXFxcIm1hcCBpbmZvXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0c25wcmludGYoaWQsIHNpemVvZihpZCksIFxcXCIldVxcXCIsIGluZm8uaWQpO1xcbitcXHRhcmd2W24rK10gPSAoY2hhciAqKXBhdGg7XFxuK1xcdGlmIChmb3JtYXQpXFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopZm9ybWF0O1xcbitcXHRhcmd2W24rK10gPSBcXFwibWFwXFxcIjtcXG4rXFx0YXJndltuKytdID0gXFxcImV2ZW50X3BpcGVcXFwiO1xcbitcXHRhcmd2W24rK10gPSBwaW5fcGF0aCA/IFxcXCJwaW5uZWRcXFwiIDogXFxcImlkXFxcIjtcXG4rXFx0YXJndltuKytdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7XFxuK1xcdGlmIChvcHRpb24pIHtcXG4rXFx0XFx0YXJndltuKytdID0gKGNoYXIgKilvcHRpb247XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0aWYgKHBhaXIpIHtcXG4rXFx0XFx0XFx0YXJndltuKytdID0gXFxcImluZGV4XFxcIjtcXG4rXFx0XFx0XFx0YXJndltuKytdID0gXFxcIjBcXFwiO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0YXJndltuXSA9IE5VTEw7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXFxcIm91dHB1dCBwaXBlXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFxcXCJleGVjIHBpcGVcXFwiKSkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShvdXRbMV0pO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0Y2hpbGQtXFx1MDAzZXBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFjaGlsZC1cXHUwMDNlcGlkKSB7XFxuK1xcdFxcdGNsb3NlKG91dFswXSk7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFxcXCIvZGV2L251bGxcXFwiLCBPX1dST05MWSk7XFxuK1xcdFxcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXFx1MDAzYyAwIHx8XFxuK1xcdFxcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRnb3RvIGV4ZWNfZmFpbDtcXG4rXFx0XFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcXG4rXFx0XFx0XFx0Y2xvc2UoZXJyX2ZkKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0ZXhlY3YocGF0aCwgYXJndik7XFxuK2V4ZWNfZmFpbDpcXG4rXFx0XFx0ZXJyID0gZXJybm87XFxuK1xcdFxcdHdyaXRlKHJlYWR5WzFdLCBcXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XFxuK1xcdFxcdF9leGl0KDEyNyk7XFxuK1xcdH1cXG4rXFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0Y2xvc2UocmVhZHlbMV0pO1xcbitcXHRjaGlsZC1cXHUwMDNlZmQgPSBvdXRbMF07XFxuK1xcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XFxuK1xcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cXG4rXFx0ZXJyID0gY2hpbGQtXFx1MDAzZXBpZCBcXHUwMDNlIDAgPyBwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCkgOiAtMTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXFx1MDAzZXBpZCwgMCwgXFxcImZvcmtcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFxcXCJleGVjIHRpbWVvdXRcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSksIDAsIFxcXCJleGVjXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2UocmVhZHlbMF0pO1xcbitcXHRcXHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcXG4rXFx0XFx0XFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aW50IHN0YXR1cyA9IDAsIGk7XFxuK1xcdHBpZF90IHJldCA9IDA7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFx0c2l6ZV90IHVzZWQgPSAwO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soZmNudGwoY2hpbGQtXFx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXFxcIm5vbmJsb2NraW5nIG91dHB1dFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmIChzaWdubyBcXHUwMDI2XFx1MDAyNiAhQVNTRVJUX09LKGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgc2lnbm8pLCBcXFwic2lnbmFsIGNvbnN1bWVyXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xcbitcXHRcXHR3aGlsZSAodXNlZCBcXHUwMDNjIHNpemUgLSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdFxcdHVzZWQgKz0gbjtcXG4rXFx0XFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cXHUwMDNlcGlkLCBcXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcXG4rXFx0XFx0aWYgKHJldCA9PSBjaGlsZC1cXHUwMDNlcGlkKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gIT0gRUlOVFIpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cXHUwMDNlcGlkLCBcXFwiYm91bmRlZCBjb25zdW1lciBleGl0XFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0Y2hpbGQtXFx1MDAzZXBpZCA9IC0xO1xcbitcXHR3aGlsZSAodXNlZCBcXHUwMDNjIHNpemUgLSAxIFxcdTAwMjZcXHUwMDI2IChuID0gcmVhZChjaGlsZC1cXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFxcdTAwM2UgMClcXG4rXFx0XFx0dXNlZCArPSBuO1xcbitcXHRvdXRwdXRbdXNlZF0gPSAnXFxcXDAnO1xcbitcXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJub3JtYWwgZXhpdFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCBcXFwiZXhpdCBzdGF0dXNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xcbitcXHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XFxuK1xcdGludCBpO1xcbitcXHRGSUxFICpmO1xcbitcXG4rXFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcXFwiL3Byb2MvJWQvc3RhdHVzXFxcIiwgY2hpbGQtXFx1MDAzZXBpZCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0ZiA9IGZvcGVuKHBhdGgsIFxcXCJyXFxcIik7XFxuK1xcdFxcdGlmICghZilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7XFxuK1xcdFxcdFxcdGlmIChzc2NhbmYobGluZSwgXFxcIlNpZ0NndDogJWxseFxcXCIsIFxcdTAwMjZjYXVnaHQpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHSU5UIC0gMSkpKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHQgICAgKGNhdWdodCBcXHUwMDI2ICgxVUxMIFxcdTAwM2NcXHUwMDNjIChTSUdURVJNIC0gMSkpKSkge1xcbitcXHRcXHRcXHRcXHRmY2xvc2UoZik7XFxuK1xcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcXFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXFxuK3tcXG4rXFx0Y2hhciBwYWNrZXRbNjRdID0ge307XFxuK1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxcbitcXHRcXHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxcbitcXHQpO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNvcmQgPSByZWNvcmQ7XFxuK1xcdHJldHVybiBBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MucHJvZHVjZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZvcHRzKSwgXFxcInByb2R1Y2UgcmVjb3JkXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIEFTU0VSVF9PSyhza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW91dHB1dF9lcnIsIFxcXCJyaW5nYnVmIG91dHB1dFxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0aWYgKF9fYXRvbWljX2xvYWRfbihwb3NpdGlvbiwgX19BVE9NSUNfQUNRVUlSRSkgPT0gZXhwZWN0ZWQpXFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcXFwiY29uc3VtZXIgcG9zaXRpb25cXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKVxcbit7XFxuK1xcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcXG4rXFx0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xcbitcXG4rXFx0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXFxuK1xcdHdoaWxlICgqc3JjKSB7XFxuK1xcdFxcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXFxuK1xcdFxcdFxcdCpkc3QrKyA9ICpzcmM7XFxuK1xcdFxcdGlmICghZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiAqc3JjID09ICdcXFwiJylcXG4rXFx0XFx0XFx0cXVvdGVkID0gIXF1b3RlZDtcXG4rXFx0XFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFxcdTAwMjZcXHUwMDI2IHF1b3RlZCBcXHUwMDI2XFx1MDAyNiAqc3JjID09ICdcXFxcXFxcXCc7XFxuK1xcdFxcdHNyYysrO1xcbitcXHR9XFxuK1xcdCpkc3QgPSAnXFxcXDAnO1xcbitcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIkpTT04gcmVjb3Jkc1xcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN1bWVyKGNvbnN0IGNoYXIgKmZvcm1hdCwgYm9vbCBpZGxlLCBpbnQgc2lnbm8sIGJvb2wgcGlubmVkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XFxuK1xcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcXG4rXFx0Y2hhciBwaW5fZGlyW10gPSBcXFwiL3N5cy9mcy9icGYvYnBmdG9vbF9yaW5nYnVmX1hYWFhYWFxcXCI7XFxuK1xcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICsgc2l6ZW9mKFxcXCIvbWFwXFxcIildO1xcbitcXHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcXG4rXFx0Y2hhciBvdXRwdXRbNDA5Nl07XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1Zik7XFxuK1xcdGlmIChwaW5uZWQpIHtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksIFxcXCJjcmVhdGUgcGluIGRpcmVjdG9yeVxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xcbitcXHRcXHRzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgXFxcIiVzL21hcFxcXCIsIHBpbl9kaXIpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcXFwicGluIHJpbmdidWZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG1hcF9waW5uZWQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFxcXCJjb25zdW1lciBtbWFwXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIWlkbGUgXFx1MDAyNlxcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCxcXG4rXFx0XFx0XFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFpZGxlKSB7XFxuK1xcdFxcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xcbitcXHRcXHRpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInJlY29yZCBvdXRwdXQgcmVhZGFibGVcXFwiKSB8fFxcbitcXHRcXHQgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDIpIHx8ICFjb25zdW1lZChwb3NpdGlvbiwgNjQpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIHNpZ25vLCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmIChmb3JtYXQgXFx1MDAyNlxcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFxcXCItcFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXFxcIltdXFxcXG5cXFwiIDpcXG4rXFx0XFx0XFx0ICAgICBcXFwiW3tcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcInNpemVcXFxcXFxcIjogMixcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjogWzAsMjU1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgfSx7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDUsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFsxLDIsMyw0LDVcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBdXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICB9LHtcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcInNpemVcXFxcXFxcIjogMTcsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMlxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIF1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgIH1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXVxcXFxuXFxcIiwgXFxcInByZXR0eSBKU09OIHJlY29yZHNcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoZm9ybWF0KVxcbitcXHRcXHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFxcXCJbXVxcXCIgOlxcbitcXHRcXHRcXHQgICBcXFwiW3tcXFxcXFxcInNpemVcXFxcXFxcIjoyLFxcXFxcXFwiZGF0YVxcXFxcXFwiOlswLDI1NV19LFxcXCJcXG4rXFx0XFx0XFx0ICAgXFxcIntcXFxcXFxcInNpemVcXFxcXFxcIjo1LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxLDIsMyw0LDVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6MTcsXFxcXFxcXCJkYXRhXFxcXFxcXCI6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLFxcXCJcXG4rXFx0XFx0XFx0ICAgXFxcIjI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFxcXCJcXFwiIDpcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogMiA9PT09PVxcXFxuMDAgZmZcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogNSA9PT09PVxcXFxuMDEgMDIgMDMgMDQgMDVcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogMTcgPT09PT1cXFxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIjE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxcXG4yMFxcXFxuXFxcIiwgXFxcInBsYWluIHJlY29yZHNcXFwiKTtcXG4rb3V0OlxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxcbitcXHRcXHRtdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmIChtYXBfcGlubmVkKVxcbitcXHRcXHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXFxcInVucGluIHJpbmdidWZcXFwiKTtcXG4rXFx0aWYgKGRpcl9jcmVhdGVkKVxcbitcXHRcXHRBU1NFUlRfT0socm1kaXIocGluX2RpciksIFxcXCJyZW1vdmUgcGluIGRpcmVjdG9yeVxcXCIpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XFxuK1xcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XFxuK1xcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xcbitcXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFxcXCJwb3NzaWJsZSBjcHVzXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXFxcImxvYWRcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cXHUwMDNlbWFwcy5wZXJmYnVmKSwgTlVMTCxcXG4rXFx0XFx0XFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFxcdTAwMjZjaGlsZCkgfHxcXG4rXFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdC8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovXFxuK1xcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XFxuK1xcdGlmICghQVNTRVJUX0dUKHBvbGwoXFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJwZXJmIHJlY29yZCBvdXRwdXRcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFxcdTAwMjYgUE9MTElOLCBcXFwicGVyZiBvdXRwdXQgcmVhZGFibGVcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCBcXFwiPT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcXFxuJW5cXFwiLFxcbitcXHRcXHRcXHRcXHUwMDI2c2Vjb25kcywgXFx1MDAyNm5hbm9zZWNvbmRzLCBcXHUwMDI2Y3B1LCBcXHUwMDI2aW5kZXgsIFxcdTAwMjZvZmZzZXQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFxcXCJwZXJmIGhlYWRlclxcXCIpIHx8XFxuK1xcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXFxcInBlcmYgcGF5bG9hZCBvZmZzZXRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCArIG5hbm9zZWNvbmRzLCAwLCBcXFwicGVyZiB0aW1lc3RhbXBcXFwiKTtcXG4rXFx0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcXFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcXFwiKTtcXG4rXFx0QVNTRVJUX0dFKGNwdSwgMCwgXFxcInBlcmYgY3B1XFxcIik7XFxuK1xcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFxcXCJwZXJmIGNwdSByYW5nZVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXFxcInBlcmYgaW5kZXhcXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemVvZihza2VsLVxcdTAwM2Vyb2RhdGEtXFx1MDAzZXBlcmZfcGF5bG9hZCk7IGkrKykge1xcbitcXHRcXHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFxcXCJcXFwiIDogIShpICUgMTYpID8gXFxcIlxcXFxuXFxcIiA6XFxuK1xcdFxcdFxcdFxcdFxcdCEoaSAlIDgpID8gXFxcIiAgXFxcIiA6IFxcXCIgXFxcIjtcXG4rXFxuK1xcdFxcdHVzZWQgKz0gc25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCxcXG4rXFx0XFx0XFx0XFx0IFxcXCIlcyUwMnhcXFwiLCBzZXBhcmF0b3IsIGkgPT0gMSA/IDB4ZmYgOiAwKTtcXG4rXFx0fVxcbitcXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcXFwiXFxcXG5cXFwiKTtcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCArIG9mZnNldCwgZXhwZWN0ZWQsIFxcXCJwZXJmIHBheWxvYWRcXFwiKTtcXG4rb3V0OlxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0Ym9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7XFxuK1xcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cXG4rXFx0XFx0XFxcIntcXFxcXFxcImVycm9yXFxcXFxcXCI6XFxcXFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFxcXFxcIn1cXFwiIDpcXG4rXFx0XFx0XFxcIntcXFxcXFxcImVycm9yXFxcXFxcXCI6XFxcXFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclxcXFxcXFwifVxcXCI7XFxuK1xcdGNoYXIgb3V0cHV0WzQwOTZdO1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxcbitcXHRcXHRcXHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJjcmVhdGUgbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKGNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcXFwiLWpcXFwiIDogTlVMTCwgTlVMTCwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY29uc3VtZXJfZmluaXNoKFxcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XFxuK1xcdFxcdGlmIChqc29uKVxcbitcXHRcXHRcXHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXFxcImVycm9yIGRpYWdub3N0aWNcXFwiKTtcXG4rXFx0fVxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGNsb3NlKGZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxcbit7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcIikpXFxuK1xcdFxcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGxhaW5cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJqc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1qXFxcIiwgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInByZXR0eV9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1wXFxcIiwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGlubmVkX3BsYWluXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGlubmVkX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLWpcXFwiLCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9wcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImlkbGVfc2lnaW50XFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ3Rlcm1fanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItalxcXCIsIHRydWUsIFNJR1RFUk0sIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImlkbGVfc2lnaW50X3ByZXR0eV9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1wXFxcIiwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfYXJyYXlcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X3VzZXJfcmluZ2J1ZlxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdVxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfaW5kZXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJpbmRleFxcXCIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1X2luZGV4XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgdHJ1ZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVfaW5kZXhfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIHRydWUsIHRydWUpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcXG5AQCAtMCwwICsxLDQ3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTtcXG4rfSByaW5nYnVmIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSk7XFxuK1xcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XFxuK1xcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rfSBwZXJmYnVmIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJ3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxcbisgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cXG4rICovXFxuK2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XFxuK1xcbitpbnQgcmVjb3JkO1xcbitpbnQgb3V0cHV0X2VycjtcXG4rXFxuK1NFQyhcXFwic29ja2V0XFxcIilcXG4raW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKVxcbit7XFxuK1xcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xcbitcXHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XFxuK1xcdHVuc2lnbmVkIGNoYXIgdGhpcmRbXSA9IHtcXG4rXFx0XFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcXG4rXFx0XFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcXG4rXFx0fTtcXG4rXFxuK1xcdGlmIChyZWNvcmQgPT0gMClcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1ZiwgZmlyc3QsIHNpemVvZihmaXJzdCksIDApO1xcbitcXHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XFxuK1xcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFxcdTAwMjZwZXJmYnVmLCBCUEZfRl9DVVJSRU5UX0NQVSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQyLjEwODk0Njc2M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NTQ0Mjk0NTg1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFhMjZlZjc2NDU1MGUzMTFhNWY3N2ZmNzU5Njk1MzFmNTEwYzgzNzZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDA2OjQxOjM5IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzQ0ZTZmNzk3ZTU3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgnLicpLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbisgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiArMTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbisgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4rICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkXG4rICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxuKyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuXG4rXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxuKyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lXG4rICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4rXG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICdcInR5cGVcIjogXCJcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcInR5cGVcIjogXCJcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuQEAgLTI3LDcgKzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHN0b3A7XG4gXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7XG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcbiBcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXG4ge1xuLVx0ZnByaW50ZihzdGRlcnIsIFwiU3RvcHBpbmcuLi5cXG5cIik7XG4gXHRzdG9wID0gdHJ1ZTtcbiB9XG4gXG5AQCAtMTA3LDYgKzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbiBcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xuIH1cbiBcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4re1xuK1x0aWYgKGpzb25fb3V0cHV0KSB7XG4rXHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4rXHRcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFwic2l6ZVwiLCBzaXplKTtcbitcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCJkYXRhXCIpO1xuK1x0XHRwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7XG4rXHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xuK1x0fSBlbHNlIHtcbitcdFx0cHJpbnRmKFwiPT0gc2l6ZTogJXp1ID09PT09XFxuXCIsIHNpemUpO1xuK1x0XHRmcHJpbnRfaGV4KHN0ZG91dCwgZGF0YSwgc2l6ZSwgXCIgXCIpO1xuK1x0XHRwcmludGYoXCJcXG5cIik7XG4rXHR9XG4rXG4rXHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4rXHRcdHJldHVybiBlcnJubyA/IC1lcnJubyA6IC1FSU87XG4rXG4rXHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbitcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcbit9XG4rXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCArMTQzLDI2IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0LmNwdSA9IC0xLFxuIFx0XHQuaWR4ID0gLTEsXG4gXHR9O1xuLVx0c3RydWN0IHBlcmZfYnVmZmVyICpwYjtcbitcdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMO1xuK1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4rXHRzdG9wID0gZmFsc2U7XG4gXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xuIFx0bWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKFx1MDAyNmFyZ2MsIFx1MDAyNmFyZ3YsIFx1MDAyNm1hcF9pbmZvLCBcdTAwMjZtYXBfaW5mb19sZW4sXG4gXHRcdFx0XHQgICAgICAgMCk7XG4gXHRpZiAobWFwX2ZkIFx1MDAzYyAwKVxuIFx0XHRyZXR1cm4gLTE7XG4gXG4tXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkge1xuLVx0XHRwX2VycihcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5XCIpO1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuK1x0XHRwX2VycihcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXCIpO1xuK1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHR9XG4rXG4rXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuK1x0XHRwX2VycihcInJpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wiKTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSArMjEyLDI0IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0Y3R4LmlkeCA9IDA7XG4gXHR9XG4gXG4tXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbi1cdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4tXHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbi1cdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4tXHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4tXHRpZiAoIXBiKSB7XG4tXHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwiLFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbitcdFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xuK1x0XHRpZiAoIXJiKSB7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXCIsXG4rXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4rXHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbitcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbitcdFx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4rXHRcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4rXHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKCFwYikge1xuK1x0XHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwiLFxuK1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuK1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdFx0fVxuIFx0fVxuIFxuIFx0c2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpO1xuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xuIFxuK1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbitcdFx0ZXJyID0gcmIgPyByaW5nX2J1ZmZlcl9fcG9sbChyYiwgMjAwKSA6IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVJTlRSKSB7XG4tXHRcdFx0cF9lcnIoXCJwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVwiLFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXG5cIixcbitcdFx0XHRcdHJiID8gXCJyaW5nXCIgOiBcInBlcmZcIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4rXHRcdGVyciA9IDA7XG4gXHR9XG4gXG4rXHRpZiAoc3RvcClcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiU3RvcHBpbmcuLi5cXG5cIik7XG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG4rXHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXFxuXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGVyciA9IC0xO1xuK1x0fVxuIFxuK1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuK1x0LyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi9cbiBcdGNsb3NlKG1hcF9mZCk7XG4gXG4tXHRyZXR1cm4gMDtcbitcdHJldHVybiBlcnIgXHUwMDNjIDAgPyAtMSA6IDA7XG4gXG4tZXJyX2Nsb3NlX3BiOlxuLVx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuIGVycl9jbG9zZV9tYXA6XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0cmV0dXJuIC0xO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCArMSw0MjUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcG9sbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmdG9vbF9yaW5nYnVmLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxuKyNkZWZpbmUgV0FJVF9VUyAxMDAwMFxuK1xuK3N0cnVjdCBjb25zdW1lciB7XG4rXHRwaWRfdCBwaWQ7XG4rXHRpbnQgZmQ7XG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4re1xuK1x0Y29uc3QgY2hhciAqcGF0aCA9IGdldGVudihcIkJQRlRPT0xcIik7XG4rXG4rXHRpZiAocGF0aClcbitcdFx0cmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoO1xuK1x0aWYgKCFhY2Nlc3MoXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFwiLCBYX09LKSlcbitcdFx0cmV0dXJuIFwiLi90b29scy9zYmluL2JwZnRvb2xcIjtcbitcdGlmICghYWNjZXNzKFwiLi4vdG9vbHMvc2Jpbi9icGZ0b29sXCIsIFhfT0spKVxuK1x0XHRyZXR1cm4gXCIuLi90b29scy9zYmluL2JwZnRvb2xcIjtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXG4re1xuK1x0aWYgKGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCkge1xuK1x0XHRraWxsKGNoaWxkLVx1MDAzZXBpZCwgU0lHS0lMTCk7XG4rXHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuK1x0XHRcdDtcbitcdFx0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4rXHR9XG4rXHRpZiAoY2hpbGQtXHUwMDNlZmQgXHUwMDNlPSAwKSB7XG4rXHRcdGNsb3NlKGNoaWxkLVx1MDAzZWZkKTtcbitcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfc3RhcnQoc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IG1hcF9mZCwgY29uc3QgY2hhciAqZm9ybWF0LFxuK1x0XHRcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXG4rXHRcdFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xuK1x0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcbitcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcImJwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXCIpIHx8XG4rXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXAgaW5mb1wiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0c25wcmludGYoaWQsIHNpemVvZihpZCksIFwiJXVcIiwgaW5mby5pZCk7XG4rXHRhcmd2W24rK10gPSAoY2hhciAqKXBhdGg7XG4rXHRpZiAoZm9ybWF0KVxuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKWZvcm1hdDtcbitcdGFyZ3ZbbisrXSA9IFwibWFwXCI7XG4rXHRhcmd2W24rK10gPSBcImV2ZW50X3BpcGVcIjtcbitcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gXCJwaW5uZWRcIiA6IFwiaWRcIjtcbitcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xuK1x0aWYgKG9wdGlvbikge1xuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKW9wdGlvbjtcbitcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdGlmIChwYWlyKSB7XG4rXHRcdFx0YXJndltuKytdID0gXCJpbmRleFwiO1xuK1x0XHRcdGFyZ3ZbbisrXSA9IFwiMFwiO1xuK1x0XHR9XG4rXHR9XG4rXHRhcmd2W25dID0gTlVMTDtcbitcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCJvdXRwdXQgcGlwZVwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFwiZXhlYyBwaXBlXCIpKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKHJlYWR5WzBdKTtcbitcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwiL2Rldi9udWxsXCIsIE9fV1JPTkxZKTtcbitcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuK1x0XHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuK1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuK1x0XHRcdGNsb3NlKGVycl9mZCk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuK2V4ZWNfZmFpbDpcbitcdFx0ZXJyID0gZXJybm87XG4rXHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbitcdFx0X2V4aXQoMTI3KTtcbitcdH1cbitcdGNsb3NlKG91dFsxXSk7XG4rXHRjbG9zZShyZWFkeVsxXSk7XG4rXHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXG4rXHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcImZvcmtcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCJleGVjIHRpbWVvdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcImV4ZWNcIikpIHtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2xvc2UocmVhZHlbMF0pO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbitcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpbnQgc3RhdHVzID0gMCwgaTtcbitcdHBpZF90IHJldCA9IDA7XG4rXHRzc2l6ZV90IG47XG4rXHRzaXplX3QgdXNlZCA9IDA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC1cdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFwibm9uYmxvY2tpbmcgb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCJzaWduYWwgY29uc3VtZXJcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHRcdHVzZWQgKz0gbjtcbitcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4rXHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwiYm91bmRlZCBjb25zdW1lciBleGl0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbitcdFx0dXNlZCArPSBuO1xuK1x0b3V0cHV0W3VzZWRdID0gJ1xcMCc7XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibm9ybWFsIGV4aXRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCJleGl0IHN0YXR1c1wiKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xuK1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuK1x0aW50IGk7XG4rXHRGSUxFICpmO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL3N0YXR1c1wiLCBjaGlsZC1cdTAwM2VwaWQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGYgPSBmb3BlbihwYXRoLCBcInJcIik7XG4rXHRcdGlmICghZilcbitcdFx0XHRicmVhaztcbitcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwiU2lnQ2d0OiAlbGx4XCIsIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR1RFUk0gLSAxKSkpKSB7XG4rXHRcdFx0XHRmY2xvc2UoZik7XG4rXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZmNsb3NlKGYpO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuK3tcbitcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4rXHRcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcbitcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbitcdCk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4rXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4rXHRcdFx0XHRcdCAgICAgIFx1MDAyNm9wdHMpLCBcInByb2R1Y2UgcmVjb3JkXCIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIEFTU0VSVF9PSyhza2VsLVx1MDAzZWJzcy1cdTAwM2VvdXRwdXRfZXJyLCBcInJpbmdidWYgb3V0cHV0XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHRpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcImNvbnN1bWVyIHBvc2l0aW9uXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19qc29uKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpXG4re1xuK1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuK1x0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xuK1xuK1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4rXHR3aGlsZSAoKnNyYykge1xuK1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAnXCInKVxuK1x0XHRcdHF1b3RlZCA9ICFxdW90ZWQ7XG4rXHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcXFxcJztcbitcdFx0c3JjKys7XG4rXHR9XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJKU09OIHJlY29yZHNcIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuK1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuK1x0aW50IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCksIGZkO1xuK1x0Y2hhciBwaW5fZGlyW10gPSBcIi9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcIjtcbitcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICsgc2l6ZW9mKFwiL21hcFwiKV07XG4rXHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcbitcdGNoYXIgb3V0cHV0WzQwOTZdO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFwibG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmKTtcbitcdGlmIChwaW5uZWQpIHtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksIFwiY3JlYXRlIHBpbiBkaXJlY3RvcnlcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcbitcdFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFwiJXMvbWFwXCIsIHBpbl9kaXIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcInBpbiByaW5nYnVmXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRtYXBfcGlubmVkID0gdHJ1ZTtcbitcdH1cbitcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuK1x0aWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCBcImNvbnN1bWVyIG1tYXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFpZGxlIFx1MDAyNlx1MDAyNiAoIWVtaXRfcmVjb3JkKHNrZWwsIDApIHx8ICFlbWl0X3JlY29yZChza2VsLCAxKSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGZvcm1hdCwgcGlubmVkID8gcGluX3BhdGggOiBOVUxMLFxuK1x0XHRcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUpIHtcbitcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4rXHRcdGlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdFx0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4rXHRcdFx0ICAgICAgIFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCIpIHx8XG4rXHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmIChmb3JtYXQgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZm9ybWF0LCBcIi1wXCIpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCJbXVxcblwiIDpcbitcdFx0XHQgICAgIFwiW3tcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJzaXplXFxcIjogMixcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJkYXRhXFxcIjogWzAsMjU1XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH0se1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiA1LFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMSwyLDMsNCw1XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH0se1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiAxNyxcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJkYXRhXFxcIjogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH1cXG5cIlxuK1x0XHRcdCAgICAgXCJdXFxuXCIsIFwicHJldHR5IEpTT04gcmVjb3Jkc1wiKTtcbitcdGVsc2UgaWYgKGZvcm1hdClcbitcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcIltdXCIgOlxuK1x0XHRcdCAgIFwiW3tcXFwic2l6ZVxcXCI6MixcXFwiZGF0YVxcXCI6WzAsMjU1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6NSxcXFwiZGF0YVxcXCI6WzEsMiwzLDQsNV19LFwiXG4rXHRcdFx0ICAgXCJ7XFxcInNpemVcXFwiOjE3LFxcXCJkYXRhXFxcIjpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCJcbitcdFx0XHQgICBcIjI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCIpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCJcIiA6XG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDIgPT09PT1cXG4wMCBmZlxcblwiXG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDUgPT09PT1cXG4wMSAwMiAwMyAwNCAwNVxcblwiXG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDE3ID09PT09XFxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgIFwiXG4rXHRcdFx0ICAgICBcIjE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxuMjBcXG5cIiwgXCJwbGFpbiByZWNvcmRzXCIpO1xuK291dDpcbitcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuK1x0aWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpXG4rXHRcdG11bm1hcChwb3NpdGlvbiwgcGFnZV9zaXplKTtcbitcdGlmIChtYXBfcGlubmVkKVxuK1x0XHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXCJ1bnBpbiByaW5nYnVmXCIpO1xuK1x0aWYgKGRpcl9jcmVhdGVkKVxuK1x0XHRBU1NFUlRfT0socm1kaXIocGluX2RpciksIFwicmVtb3ZlIHBpbiBkaXJlY3RvcnlcIik7XG4rXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxuK3tcbitcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuK1x0dW5zaWduZWQgbG9uZyBsb25nIHNlY29uZHMsIG5hbm9zZWNvbmRzO1xuK1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbitcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xuK1x0aW50IG5yX2NwdXMsIGNwdSwgaW5kZXgsIG9mZnNldCA9IDAsIGksIHVzZWQgPSAwLCBmaWVsZHM7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdG5yX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbitcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwicG9zc2libGUgY3B1c1wiKSlcbitcdFx0cmV0dXJuO1xuK1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwib3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFwibG9hZFwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYpLCBOVUxMLFxuK1x0XHRcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkgfHxcbitcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi9cbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbitcdFx0ICAgICAgIFwicGVyZiByZWNvcmQgb3V0cHV0XCIpIHx8XG4rXHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFx1MDAyNiBQT0xMSU4sIFwicGVyZiBvdXRwdXQgcmVhZGFibGVcIikgfHxcbitcdCAgICAhY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZpZWxkcyA9IHNzY2FuZihvdXRwdXQsIFwiPT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcbiVuXCIsXG4rXHRcdFx0XHUwMDI2c2Vjb25kcywgXHUwMDI2bmFub3NlY29uZHMsIFx1MDAyNmNwdSwgXHUwMDI2aW5kZXgsIFx1MDAyNm9mZnNldCk7XG4rXHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFwicGVyZiBoZWFkZXJcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXCJwZXJmIHBheWxvYWQgb2Zmc2V0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCArIG5hbm9zZWNvbmRzLCAwLCBcInBlcmYgdGltZXN0YW1wXCIpO1xuK1x0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXCIpO1xuK1x0QVNTRVJUX0dFKGNwdSwgMCwgXCJwZXJmIGNwdVwiKTtcbitcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFwicGVyZiBjcHUgcmFuZ2VcIik7XG4rXHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXCJwZXJmIGluZGV4XCIpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZW9mKHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZXBlcmZfcGF5bG9hZCk7IGkrKykge1xuK1x0XHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFwiXCIgOiAhKGkgJSAxNikgPyBcIlxcblwiIDpcbitcdFx0XHRcdFx0IShpICUgOCkgPyBcIiAgXCIgOiBcIiBcIjtcbitcbitcdFx0dXNlZCArPSBzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLFxuK1x0XHRcdFx0IFwiJXMlMDJ4XCIsIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApO1xuK1x0fVxuK1x0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXCJcXG5cIik7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0ICsgb2Zmc2V0LCBleHBlY3RlZCwgXCJwZXJmIHBheWxvYWRcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHRib29sIHJpbmcgPSB0eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIHx8IHR5cGUgPT0gQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRjtcbitcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcIn1cIiA6XG4rXHRcdFwie1xcXCJlcnJvclxcXCI6XFxcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcIn1cIjtcbitcdGNoYXIgb3V0cHV0WzQwOTZdO1xuK1x0aW50IGZkO1xuK1xuK1x0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcbitcdFx0XHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcImNyZWF0ZSBtYXBcIikpXG4rXHRcdHJldHVybjtcbitcdGlmIChjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcIi1qXCIgOiBOVUxMLCBOVUxMLCBvcHRpb24sIHBhaXIsIHRydWUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XG4rXHRcdGlmIChqc29uKVxuK1x0XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFwiZXJyb3IgZGlhZ25vc3RpY1wiKTtcbitcdH1cbitcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuK1x0Y2xvc2UoZmQpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwZXJmX2V2ZW50X2FycmF5XCIpKVxuK1x0XHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGxhaW5cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJqc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicHJldHR5X2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItcFwiLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9wbGFpblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgZmFsc2UsIFNJR0lOVCwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9wcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaWRsZV9zaWdpbnRcIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lndGVybV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgdHJ1ZSwgU0lHVEVSTSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ2ludF9wcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfYXJyYXlcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X3VzZXJfcmluZ2J1ZlwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdVwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9pbmRleFwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiaW5kZXhcIiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdV9pbmRleFwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIHRydWUsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVfaW5kZXhfanNvblwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIHRydWUsIHRydWUpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgKzEsNDcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTtcbit9IHJpbmdidWYgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSk7XG4rXHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xuK1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbit9IHBlcmZidWYgU0VDKFwiLm1hcHNcIik7XG4rXG4rLypcbisgKiBJbmNsdWRlIHRoZSB1MzIgcmF3IHNpemUgaW4gcGVyZidzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cbisgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbisgKi9cbitjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xuK1xuK2ludCByZWNvcmQ7XG4raW50IG91dHB1dF9lcnI7XG4rXG4rU0VDKFwic29ja2V0XCIpXG4raW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuK1x0dW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9O1xuK1x0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xuK1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuK1x0XHQweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLFxuK1x0fTtcbitcbitcdGlmIChyZWNvcmQgPT0gMClcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XG4rXHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBzZWNvbmQsIHNpemVvZihzZWNvbmQpLCAwKTtcbitcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbitcdGVsc2VcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxuK1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjo0MTo0Mi4xMDg5NDgxMTNaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1NDQyOTIwNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRXZhbHVhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyB0b3VjaGluZyBmaWxlcyByZWxhdGVkIHRvIGBicGZ0b29sYCB3aXRoaW4gYHRvb2xzL2JwZi9gIGFuZCBhZGRpbmcgc2VsZnRlc3RzIHVuZGVyIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgaWYgdGhlc2UgY2hhbmdlcyB3YXJyYW50IGZ1enppbmcuIFRoZSBrZXkgaXMgd2hldGhlciB0aGV5IGltcGFjdCB0aGUga2VybmVsIGl0c2VsZi5cblxuRmlyc3QsIGxldCdzIGNvbmZpcm0gdGhlIGZpbGVzIGludm9sdmVkOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLlxuXG5Ob3csIGFjY29yZGluZyB0byBTZWN0aW9uIDIgb2YgdGhlIGluc3RydWN0aW9ucywgSSBzaG91bGQgb25seSByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAgaWYgKmFsbCogbW9kaWZpZWQgY29kZSBmYWxscyB1bmRlciBzcGVjaWZpYyBuZWdhdGl2ZSBjcml0ZXJpYTogZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHVzZXItc3BhY2UgdG9vbHMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgdGhhdCBkbyAqbm90KiBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBrZXJuZWwgbW9kdWxlcy5cblxuTG9va2luZyBhdCB0aGUgZmlsZSBwYXRocywgdGhleSdyZSBhbGwgZmlybWx5IHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IOKAkyBgYnBmdG9vbGAgYW5kIGBicGZgIHNlbGZ0ZXN0cy4gVGhlcmUncyBub3RoaW5nIGluIGBrZXJuZWwvYCwgYG1tL2AsIGBuZXQvYCwgYGZzL2AsIGBkcml2ZXJzL2AsIGBhcmNoL2AsIG9yIHRvdWNoaW5nIGFueSBgaW5jbHVkZS9saW51eC9gIGhlYWRlcnMuIFRoaXMgaXMgYSBjbGVhciBpbmRpY2F0b3IuXG5cbkxldCdzIGRvdWJsZS1jaGVjayBhZ2FpbiwganVzdCB0byBiZSBzdXJlOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLiBZZXAsIGFsbCB1bmRlciB0aGUgYHRvb2xzL2AgdW1icmVsbGEuXG5cblNvLCB0aGlzIHBhdGNoIGlzIHNvbGVseSBtb2RpZnlpbmcgdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgaXRzIGFzc29jaWF0ZWQgc2VsZnRlc3RzLiBObyBpbXBhY3Qgb24gdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLiBUaGVyZWZvcmUsIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBmdXp6aW5nLlxuXG5NeSBjb25jbHVzaW9uIGlzOiBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuTm93LCBJIG5lZWQgdG8gbWFrZSBzdXJlIEknbSBzZXR0aW5nIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnMgY29ycmVjdGx5OlxuLSBgV29ydGhGdXp6aW5nYDogZmFsc2Vcbi0gYFJlYXNvbmluZ2A6IFRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHRvb2xzIGFuZCBicGYgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLywgd2l0aCBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy5cbi0gYEZvY3VzU3ltYm9sc2A6IFtdXG4tIGBFbmFibGVDb25maWdzYDogW11cblxuVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTI0LCJPdXRwdXRUb2tlbnMiOjEwMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQ3LjU1MTg3NDQ5N1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIGFuZCBCUEYgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlIGNvZGUgaXMgdG91Y2hlZCwgc28gaXQgaXMgbm90IHJlbGV2YW50IGZvciBrZXJuZWwgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQ3LjU1MTg5NDQ1N1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow6bvx5[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 05:48:39 +0000 UTC FinishedAt: 2026-09-07 06:41:48 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWEyNmVmNzY0NTUwZTMxMWE1Zjc3ZmY3NTk2OTUzMWY1MTBjODM3NlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzQ0ZTZmNzk3ZTU3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICYjNDM7MTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXG4gICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4mIzQzOyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yXG4mIzQzOyAgICAqKkJQRl9NQVBfVFlQRV9SSU5HQlVGKiogbWFwLlxuIFxuICAgICBJbnN0YWxsIHBlcmYgcmluZ3MgaW50byBhIHBlcmYgZXZlbnQgYXJyYXkgbWFwIGFuZCBkdW1wIG91dHB1dCBvZiBhbnlcbiAgICAgKipicGZfcGVyZl9ldmVudF9vdXRwdXQqKlxcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZVxuQEAgLTEzNCw2ICYjNDM7MTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbiYjNDM7ICAgIEZvciBhIHJpbmcgYnVmZmVyIG1hcCwgY29uc3VtZSByZWNvcmRzIHN1Ym1pdHRlZCBieSBCUEYgcHJvZ3JhbXMsIGluY2x1ZGluZ1xuJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KipcbiYjNDM7ICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkXG4mIzQzOyAgICB6ZXJvIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbiYjNDM7ICAgIGJ5dGVzOyBKU09OIG91dHB1dCBjb250YWlucyAqKnNpemUqKiBhbmQgKipkYXRhKiogZmllbGRzLCB3aXRoICoqZGF0YSoqIGFuXG4mIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuXG4mIzQzO1xuJiM0MzsgICAgUmluZyBidWZmZXJzIHN1cHBvcnQgYSBzaW5nbGUgY29uc3VtZXIuIFRoaXMgY29tbWFuZCBhZHZhbmNlcyB0aGUgc2hhcmVkXG4mIzQzOyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lXG4mIzQzOyAgICBtYXA7IGl0IGRvZXMgbm90IHByb3ZpZGUgYSBwYXNzaXZlIHZpZXcgb2YgZXZlbnRzLiAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKlxuJiM0MzsgICAgbWFwcyBhcmUgbm90IHN1cHBvcnRlZC5cbiYjNDM7XG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtODc4LDExICYjNDM7ODc4LDExIEBAIF9icGZ0b29sKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSlcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICYjMzk7XCYjMzQ7dHlwZVwmIzM0OzogXCYjMzQ7XFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcJiMzNDsmIzM5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuQEAgLTI3LDcgJiM0MzsyNyw3IEBAXG4gXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXHQxNlxuIFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcDtcbiBcbiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUge1xuIFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcbkBAIC00NCw3ICYjNDM7NDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcbiBcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXG4ge1xuLVx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdHN0b3AgPSB0cnVlO1xuIH1cbiBcbkBAIC0xMDcsNiAmIzQzOzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbiBcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGpzb25fb3V0cHV0KSB7XG4mIzQzO1x0XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xuJiM0MztcdFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7c2l6ZVwmIzM0Oywgc2l6ZSk7XG4mIzQzO1x0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDtkYXRhXCYjMzQ7KTtcbiYjNDM7XHRcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcbiYjNDM7XHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7PT0gc2l6ZTogJXp1ID09PT09XFxuXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCBcJiMzNDsgXCYjMzQ7KTtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZmbHVzaChzdGRvdXQpKVxuJiM0MztcdFx0cmV0dXJuIGVycm5vID8gLWVycm5vIDogLUVJTztcbiYjNDM7XG4mIzQzO1x0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXG4mIzQzO1x0cmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwO1xuJiM0Mzt9XG4mIzQzO1xuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcbkBAIC0xMjMsMTggJiM0MzsxNDMsMjYgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHQuY3B1ID0gLTEsXG4gXHRcdC5pZHggPSAtMSxcbiBcdH07XG4tXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xuJiM0MztcdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xuIFx0X191MzIgbWFwX2luZm9fbGVuO1xuIFx0aW50IGVyciwgbWFwX2ZkO1xuIFxuJiM0MztcdHN0b3AgPSBmYWxzZTtcbiBcdG1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7XG4gXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXHUwMDI2YXJnYywgXHUwMDI2YXJndiwgXHUwMDI2bWFwX2luZm8sIFx1MDAyNm1hcF9pbmZvX2xlbixcbiBcdFx0XHRcdCAgICAgICAwKTtcbiBcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtMTtcbiBcbi1cdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XG4tXHRcdHBfZXJyKFwmIzM0O21hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5XCYjMzQ7KTtcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDspO1xuJiM0MztcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXHUwMDI2XHUwMDI2IGFyZ2MpIHtcbiYjNDM7XHRcdHBfZXJyKFwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wmIzM0Oyk7XG4gXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiBcdH1cbiBcbkBAIC0xODQsMTUgJiM0MzsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRjdHguaWR4ID0gMDtcbiBcdH1cbiBcbi1cdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuLVx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbi1cdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuLVx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbi1cdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbi1cdGlmICghcGIpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0Oyxcbi1cdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuJiM0MztcdFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFyYikge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbiYjNDM7XHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbiYjNDM7XHRcdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4mIzQzO1x0XHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbiYjNDM7XHRcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4mIzQzO1x0XHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoIXBiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4gXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XG5AQCAtMjAyLDI1ICYjNDM7MjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xuIFxuJiM0MztcdGVyciA9IDA7XG4gXHR3aGlsZSAoIXN0b3ApIHtcbi1cdFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4mIzQzO1x0XHRlcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVyciAhPSAtRUlOVFIpIHtcbi1cdFx0XHRwX2VycihcJiMzNDtwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVwmIzM0Oyxcbi1cdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0XHRnb3RvIGVycl9jbG9zZV9wYjtcbiYjNDM7XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0Vycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0cmIgPyBcJiMzNDtyaW5nXCYjMzQ7IDogXCYjMzQ7cGVyZlwmIzM0Oywgc3RyZXJyb3IoLWVyciksIC1lcnIpO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuJiM0MztcdFx0ZXJyID0gMDtcbiBcdH1cbiBcbiYjNDM7XHRpZiAoc3RvcClcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtTdG9wcGluZy4uLlxcblwmIzM0Oyk7XG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG4mIzQzO1x0aWYgKGZmbHVzaChzdGRvdXQpKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXFxuXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0ZXJyID0gLTE7XG4mIzQzO1x0fVxuIFxuJiM0MztcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcbiBcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbiYjNDM7XHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcbi1cdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBlcnIgXHUwMDNjIDAgPyAtMSA6IDA7XG4gXG4tZXJyX2Nsb3NlX3BiOlxuLVx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuIGVycl9jbG9zZV9tYXA6XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0cmV0dXJuIC0xO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCAmIzQzOzEsNDI1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZ0b29sX3JpbmdidWYuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFdBSVRfU1RFUFMgNTAwXG4mIzQzOyNkZWZpbmUgV0FJVF9VUyAxMDAwMFxuJiM0MztcbiYjNDM7c3RydWN0IGNvbnN1bWVyIHtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1x0aW50IGZkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgY2hhciAqcGF0aCA9IGdldGVudihcJiMzNDtCUEZUT09MXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhdGgpXG4mIzQzO1x0XHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDssIFhfT0spKVxuJiM0MztcdFx0cmV0dXJuIFwmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7O1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7O1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoY2hpbGQtXHUwMDNlcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKGNoaWxkLVx1MDAzZXBpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHR3aGlsZSAod2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIE5VTEwsIDApIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5UUilcbiYjNDM7XHRcdFx0O1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VmZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGNsb3NlKGNoaWxkLVx1MDAzZWZkKTtcbiYjNDM7XHRcdGNoaWxkLVx1MDAzZWZkID0gLTE7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9zdGFydChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgbWFwX2ZkLCBjb25zdCBjaGFyICpmb3JtYXQsXG4mIzQzO1x0XHRcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXG4mIzQzO1x0XHRcdCAgIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gYnBmdG9vbF9wYXRoKCk7XG4mIzQzO1x0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcbiYjNDM7XHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXCYjMzQ7YnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcCBpbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXCYjMzQ7JXVcJiMzNDssIGluZm8uaWQpO1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilwYXRoO1xuJiM0MztcdGlmIChmb3JtYXQpXG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopZm9ybWF0O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7bWFwXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7ZXZlbnRfcGlwZVwmIzM0OztcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gXCYjMzQ7cGlubmVkXCYjMzQ7IDogXCYjMzQ7aWRcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBwaW5fcGF0aCA/IChjaGFyICopcGluX3BhdGggOiBpZDtcbiYjNDM7XHRpZiAob3B0aW9uKSB7XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uO1xuJiM0MztcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0aWYgKHBhaXIpIHtcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtpbmRleFwmIzM0OztcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRhcmd2W25dID0gTlVMTDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFwmIzM0O291dHB1dCBwaXBlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCYjMzQ7ZXhlYyBwaXBlXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkLVx1MDAzZXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fV1JPTkxZKTtcbiYjNDM7XHRcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXHUwMDNjIDAgfHxcbiYjNDM7XHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuJiM0MztcdFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcbiYjNDM7XHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRleGVjdihwYXRoLCBhcmd2KTtcbiYjNDM7ZXhlY19mYWlsOlxuJiM0MztcdFx0ZXJyID0gZXJybm87XG4mIzQzO1x0XHR3cml0ZShyZWFkeVsxXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XG4mIzQzO1x0XHRfZXhpdCgxMjcpO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShvdXRbMV0pO1xuJiM0MztcdGNsb3NlKHJlYWR5WzFdKTtcbiYjNDM7XHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbiYjNDM7XHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGNoaWxkLVx1MDAzZXBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFwmIzM0O2V4ZWMgdGltZW91dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKSwgMCwgXCYjMzQ7ZXhlY1wmIzM0OykpIHtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShyZWFkeVswXSk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbiYjNDM7XHRcdFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdHVzID0gMCwgaTtcbiYjNDM7XHRwaWRfdCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XHRzaXplX3QgdXNlZCA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCYjMzQ7c2lnbmFsIGNvbnN1bWVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuJiM0MztcdFx0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4mIzQzO1x0XHRpZiAocmV0ID09IGNoaWxkLVx1MDAzZXBpZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXHUwMDNlcGlkLCBcJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuJiM0MztcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdG91dHB1dFt1c2VkXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtub3JtYWwgZXhpdFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsIFwmIzM0O2V4aXQgc3RhdHVzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4mIzQzO1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuJiM0MztcdGludCBpO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7L3Byb2MvJWQvc3RhdHVzXCYjMzQ7LCBjaGlsZC1cdTAwM2VwaWQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRmID0gZm9wZW4ocGF0aCwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIWYpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDtTaWdDZ3Q6ICVsbHhcJiMzNDssIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHSU5UIC0gMSkpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbiYjNDM7XHRcdFx0XHRmY2xvc2UoZik7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzLFxuJiM0MztcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuJiM0MztcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbiYjNDM7XHQpO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnByb2R1Y2UpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwmIzM0O3Byb2R1Y2UgcmVjb3JkXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwmIzM0O3JpbmdidWYgb3V0cHV0XCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcJiMzNDtjb25zdW1lciBwb3NpdGlvblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcbiYjNDM7XHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xuJiM0MztcdHdoaWxlICgqc3JjKSB7XG4mIzQzO1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0XHRpZiAoIWVzY2FwZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcJiMzNDsmIzM5OylcbiYjNDM7XHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbiYjNDM7XHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICYjMzk7XFxcXCYjMzk7O1xuJiM0MztcdFx0c3JjJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O0pTT04gcmVjb3Jkc1wmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgKnBvc2l0aW9uID0gTUFQX0ZBSUxFRDtcbiYjNDM7XHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4mIzQzO1x0Y2hhciBwaW5fZGlyW10gPSBcJiMzNDsvc3lzL2ZzL2JwZi9icGZ0b29sX3JpbmdidWZfWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICYjNDM7IHNpemVvZihcJiMzNDsvbWFwXCYjMzQ7KV07XG4mIzQzO1x0Ym9vbCBkaXJfY3JlYXRlZCA9IGZhbHNlLCBtYXBfcGlubmVkID0gZmFsc2U7XG4mIzQzO1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4mIzQzO1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmKTtcbiYjNDM7XHRpZiAocGlubmVkKSB7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIobWtkdGVtcChwaW5fZGlyKSwgXCYjMzQ7Y3JlYXRlIHBpbiBkaXJlY3RvcnlcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcbiYjNDM7XHRcdHNucHJpbnRmKHBpbl9wYXRoLCBzaXplb2YocGluX3BhdGgpLCBcJiMzNDslcy9tYXBcJiMzNDssIHBpbl9kaXIpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX29ial9waW4oZmQsIHBpbl9wYXRoKSwgXCYjMzQ7cGluIHJpbmdidWZcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG1hcF9waW5uZWQgPSB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFwmIzM0O2NvbnN1bWVyIG1tYXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFpZGxlIFx1MDAyNlx1MDAyNiAoIWVtaXRfcmVjb3JkKHNrZWwsIDApIHx8ICFlbWl0X3JlY29yZChza2VsLCAxKSkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwgZm9ybWF0LCBwaW5uZWQgPyBwaW5fcGF0aCA6IE5VTEwsXG4mIzQzO1x0XHRcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUpIHtcbiYjNDM7XHRcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xuJiM0MztcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKGZvcm1hdCBcdTAwMjZcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFwmIzM0Oy1wXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcJiMzNDtbXVxcblwmIzM0OyA6XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiAyLFxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtkYXRhXFxcJiMzNDs6IFswLDI1NVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXVxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICB9LHtcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIFxcXCYjMzQ7c2l6ZVxcXCYjMzQ7OiA1LFxcblwmIzM0O1xuJiM0MztcdFx0XHQgICAgIFwmIzM0OyAgICAgICAgXFxcJiMzNDtkYXRhXFxcJiMzNDs6IFsxLDIsMyw0LDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgICAgIF1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsgICAgfSx7XFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O3NpemVcXFwmIzM0OzogMTcsXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBcXFwmIzM0O2RhdGFcXFwmIzM0OzogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgICAgICBdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7ICAgIH1cXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtdXFxuXCYjMzQ7LCBcJiMzNDtwcmV0dHkgSlNPTiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChmb3JtYXQpXG4mIzQzO1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7W3tcXFwmIzM0O3NpemVcXFwmIzM0OzoyLFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlswLDI1NV19LFwmIzM0O1xuJiM0MztcdFx0XHQgICBcJiMzNDt7XFxcJiMzNDtzaXplXFxcJiMzNDs6NSxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMSwyLDMsNCw1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0OzoxNyxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0OzI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCYjMzQ7XCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAyID09PT09XFxuMDAgZmZcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiA1ID09PT09XFxuMDEgMDIgMDMgMDQgMDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAxNyA9PT09PVxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcbjIwXFxuXCYjMzQ7LCBcJiMzNDtwbGFpbiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChtYXBfcGlubmVkKVxuJiM0MztcdFx0QVNTRVJUX09LKHVubGluayhwaW5fcGF0aCksIFwmIzM0O3VucGluIHJpbmdidWZcJiMzNDspO1xuJiM0MztcdGlmIChkaXJfY3JlYXRlZClcbiYjNDM7XHRcdEFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgXCYjMzQ7cmVtb3ZlIHBpbiBkaXJlY3RvcnlcJiMzNDspO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4mIzQzO1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbiYjNDM7XHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbiYjNDM7XHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwmIzM0O3Bvc3NpYmxlIGNwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIE5VTEwsXG4mIzQzO1x0XHRcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkgfHxcbiYjNDM7XHQgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi9cbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BlcmYgcmVjb3JkIG91dHB1dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFx1MDAyNiBQT0xMSU4sIFwmIzM0O3BlcmYgb3V0cHV0IHJlYWRhYmxlXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCYjMzQ7PT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcbiVuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFwmIzM0O3BlcmYgaGVhZGVyXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXCYjMzQ7cGVyZiBwYXlsb2FkIG9mZnNldFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgJiM0MzsgbmFub3NlY29uZHMsIDAsIFwmIzM0O3BlcmYgdGltZXN0YW1wXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwmIzM0O3BlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfR0UoY3B1LCAwLCBcJiMzNDtwZXJmIGNwdVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCYjMzQ7cGVyZiBjcHUgcmFuZ2VcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcJiMzNDtwZXJmIGluZGV4XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCYjMzQ7XCYjMzQ7IDogIShpICUgMTYpID8gXCYjMzQ7XFxuXCYjMzQ7IDpcbiYjNDM7XHRcdFx0XHRcdCEoaSAlIDgpID8gXCYjMzQ7ICBcJiMzNDsgOiBcJiMzNDsgXCYjMzQ7O1xuJiM0MztcbiYjNDM7XHRcdHVzZWQgJiM0Mzs9IHNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLFxuJiM0MztcdFx0XHRcdCBcJiMzNDslcyUwMnhcJiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsIFwmIzM0O3BlcmYgcGF5bG9hZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbiYjNDM7XHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHRib29sIHJpbmcgPSB0eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIHx8IHR5cGUgPT0gQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRjtcbiYjNDM7XHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XG4mIzQzO1x0XHRcJiMzNDt7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlxcXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcJiMzNDt9XCYjMzQ7IDpcbiYjNDM7XHRcdFwmIzM0O3tcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XFxcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclxcXCYjMzQ7fVwmIzM0OztcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdGZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsXG4mIzQzO1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtjcmVhdGUgbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAoY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uID8gXCYjMzQ7LWpcJiMzNDsgOiBOVUxMLCBOVUxMLCBvcHRpb24sIHBhaXIsIHRydWUpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xuJiM0MztcdFx0aWYgKGpzb24pXG4mIzQzO1x0XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXCYjMzQ7ZXJyb3IgZGlhZ25vc3RpY1wmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwbGFpblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtqc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LWpcJiMzNDssIGZhbHNlLCBTSUdURVJNLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3Bpbm5lZF9wbGFpblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwaW5uZWRfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKFwmIzM0Oy1qXCYjMzQ7LCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtwaW5uZWRfcHJldHR5X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstcFwmIzM0OywgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lnaW50XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aWRsZV9zaWd0ZXJtX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihcJiMzNDstalwmIzM0OywgdHJ1ZSwgU0lHVEVSTSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lnaW50X3ByZXR0eV9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIoXCYjMzQ7LXBcJiMzNDssIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9hcnJheVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZlwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9jcHVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2luZGV4XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9jcHVfaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF91c2VyX3JpbmdidWZfanNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleF9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcJiMzNDtjcHVcJiMzNDssIHRydWUsIHRydWUpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSw0NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuJiM0Mzt9IHJpbmdidWYgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0Mzt9IHBlcmZidWYgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJiMzOTtzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cbiYjNDM7ICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXG4mIzQzOyAqL1xuJiM0Mztjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcbiYjNDM7aW50IHJlY29yZDtcbiYjNDM7aW50IG91dHB1dF9lcnI7XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c29ja2V0XCYjMzQ7KVxuJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XG4mIzQzO1x0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xuJiM0MztcdFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcbiYjNDM7XHRcdDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlY29yZCA9PSAwKVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDEpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApO1xuJiM0MztcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxuJiM0MztcdFx0XHRcdFx0XHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6NDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWEyNmVmNzY0NTUwZTMxMWE1Zjc3ZmY3NTk2OTUzMWY1MTBjODM3NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xMjAsNyAmIzQzOzEyMCw4IEBAIGJwZnRvb2wgbWFwIHBpbiAgICAgKk1BUCogICpGSUxFKgogICAgIGNoYXJhY3RlciAoJiMzOTsuJiMzOTspLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi4KIAogYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuCiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3IKJiM0MzsgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC4KIAogICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueQogICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcICgpIGNhbGwgaW4gdGhlIGtlcm5lbC4gQnkgZGVmYXVsdCByZWFkIHRoZQpAQCAtMTM0LDYgJiM0MzsxMzUsMTggQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdCiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdAogICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci4KIAomIzQzOyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmcKJiM0MzsgICAgcmVjb3JkcyBhbHJlYWR5IHF1ZXVlZCBiZWZvcmUgdGhlIGNvbW1hbmQgc3RhcnRzLiAqKmNwdSoqIGFuZCAqKmluZGV4KioKJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgYXMgcmF3IGJ5dGVzLCBpbmNsdWRpbmcgZW1iZWRkZWQKJiM0MzsgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsCiYjNDM7ICAgIGJ5dGVzOyBKU09OIG91dHB1dCBjb250YWlucyAqKnNpemUqKiBhbmQgKipkYXRhKiogZmllbGRzLCB3aXRoICoqZGF0YSoqIGFuCiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC4KJiM0MzsKJiM0MzsgICAgUmluZyBidWZmZXJzIHN1cHBvcnQgYSBzaW5nbGUgY29uc3VtZXIuIFRoaXMgY29tbWFuZCBhZHZhbmNlcyB0aGUgc2hhcmVkCiYjNDM7ICAgIGNvbnN1bWVyIHBvc2l0aW9uIGFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWUKJiM0MzsgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKioKJiM0MzsgICAgbWFwcyBhcmUgbm90IHN1cHBvcnRlZC4KJiM0MzsKIGJwZnRvb2wgbWFwIHBlZWsgICpNQVAqCiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay4KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtODc4LDExICYjNDM7ODc4LDExIEBAIF9icGZ0b29sKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICYjMzk7JiMzNDt0eXBlJiMzNDs6ICYjMzQ7XChwZXJmX2V2ZW50X2FycmF5XHxyaW5nYnVmXCkmIzM0OyYjMzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAmIzM5OyYjMzQ7dHlwZSYjMzQ7OiAmIzM0O1wocGVyZl9ldmVudF9hcnJheVx8cmluZ2J1ZlwpJiMzNDsmIzM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwppbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCkBAIC0yNyw3ICYjNDM7MjcsNyBAQAogCiAjZGVmaW5lIE1NQVBfUEFHRV9DTlQJMTYKIAotc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDsKJiM0MztzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHN0b3A7CiAKIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7CiAJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3QgewogCiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pCiB7Ci0JZnByaW50ZihzdGRlcnIsICYjMzQ7U3RvcHBpbmcuLi5cbiYjMzQ7KTsKIAlzdG9wID0gdHJ1ZTsKIH0KIApAQCAtMTA3LDYgJiM0MzsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpCiAJcmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlpZiAoanNvbl9vdXRwdXQpIHsKJiM0MzsJCWpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7CiYjNDM7CQlqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCAmIzM0O3NpemUmIzM0Oywgc2l6ZSk7CiYjNDM7CQlqc29ud19uYW1lKGpzb25fd3RyLCAmIzM0O2RhdGEmIzM0Oyk7CiYjNDM7CQlwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7CiYjNDM7CQlqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXByaW50ZigmIzM0Oz09IHNpemU6ICV6dSA9PT09PVxuJiMzNDssIHNpemUpOwomIzQzOwkJZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsICYjMzQ7ICYjMzQ7KTsKJiM0MzsJCXByaW50ZigmIzM0O1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmZmx1c2goc3Rkb3V0KSkKJiM0MzsJCXJldHVybiBlcnJubyA/IC1lcnJubyA6IC1FSU87CiYjNDM7CiYjNDM7CS8qIEEgcHJvZHVjZXIgY2FuIGtlZXAgcG9sbCgpIGJ1c3kgZXZlbiBhZnRlciBhIHNpZ25hbCBhcnJpdmVzLiAqLwomIzQzOwlyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7CiYjNDM7fQomIzQzOwogaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0gewpAQCAtMTIzLDE4ICYjNDM7MTQzLDI2IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJLmNwdSA9IC0xLAogCQkuaWR4ID0gLTEsCiAJfTsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiOwomIzQzOwlzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDsKJiM0MzsJc3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7CiAJX191MzIgbWFwX2luZm9fbGVuOwogCWludCBlcnIsIG1hcF9mZDsKIAomIzQzOwlzdG9wID0gZmFsc2U7CiAJbWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTsKIAltYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oJmFtcDthcmdjLCAmYW1wO2FyZ3YsICZhbXA7bWFwX2luZm8sICZhbXA7bWFwX2luZm9fbGVuLAogCQkJCSAgICAgICAwKTsKIAlpZiAobWFwX2ZkICZsdDsgMCkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHsKLQkJcF9lcnIoJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSYjMzQ7KTsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgJmFtcDsmYW1wOwomIzQzOwkgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikgewomIzQzOwkJcF9lcnIoJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlciYjMzQ7KTsKJiM0MzsJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiAmYW1wOyZhbXA7IGFyZ2MpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzJiMzNDspOwogCQlnb3RvIGVycl9jbG9zZV9tYXA7CiAJfQogCkBAIC0xODQsMTUgJiM0MzsyMTIsMjQgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQljdHguaWR4ID0gMDsKIAl9CiAKLQlvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTsKLQlvcHRzLmNwdXMgPSAmYW1wO2N0eC5jcHU7Ci0Jb3B0cy5tYXBfa2V5cyA9ICZhbXA7Y3R4LmlkeDsKLQlwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgJmFtcDtwZXJmX2F0dHIsCi0JCQkJICBwcmludF9icGZfb3V0cHV0LCAmYW1wO2N0eCwgJmFtcDtvcHRzKTsKLQlpZiAoIXBiKSB7Ci0JCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAotCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwlpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRikgewomIzQzOwkJcmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpOwomIzQzOwkJaWYgKCFyYikgewomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAomIzQzOwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwomIzQzOwkJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJCX0KJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxOwomIzQzOwkJb3B0cy5jcHVzID0gJmFtcDtjdHguY3B1OwomIzQzOwkJb3B0cy5tYXBfa2V5cyA9ICZhbXA7Y3R4LmlkeDsKJiM0MzsJCXBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCAmYW1wO3BlcmZfYXR0ciwKJiM0MzsJCQkJCSAgcHJpbnRfYnBmX291dHB1dCwgJmFtcDtjdHgsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIXBiKSB7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpJiMzNDssCiYjNDM7CQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiYjNDM7CQkJZ290byBlcnJfY2xvc2VfbWFwOwomIzQzOwkJfQogCX0KIAogCXNpZ25hbChTSUdJTlQsIGludF9leGl0KTsKQEAgLTIwMiwyNSAmIzQzOzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKGpzb25fb3V0cHV0KQogCQlqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7CiAKJiM0MzsJZXJyID0gMDsKIAl3aGlsZSAoIXN0b3ApIHsKLQkJZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7CiYjNDM7CQllcnIgPSByYiA/IHJpbmdfYnVmZmVyX19wb2xsKHJiLCAyMDApIDogcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7CiAJCWlmIChlcnIgJmx0OyAwICZhbXA7JmFtcDsgZXJyICE9IC1FSU5UUikgewotCQkJcF9lcnIoJiMzNDtwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKSYjMzQ7LAotCQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0JCQlnb3RvIGVycl9jbG9zZV9wYjsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogJXMgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXG4mIzM0OywKJiM0MzsJCQkJcmIgPyAmIzM0O3JpbmcmIzM0OyA6ICYjMzQ7cGVyZiYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7CiYjNDM7CQkJYnJlYWs7CiAJCX0KJiM0MzsJCWVyciA9IDA7CiAJfQogCiYjNDM7CWlmIChzdG9wKQomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7U3RvcHBpbmcuLi5cbiYjMzQ7KTsKIAlpZiAoanNvbl9vdXRwdXQpCiAJCWpzb253X2VuZF9hcnJheShqc29uX3d0cik7CiYjNDM7CWlmIChmZmx1c2goc3Rkb3V0KSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCWVyciA9IC0xOwomIzQzOwl9CiAKJiM0MzsJcmluZ19idWZmZXJfX2ZyZWUocmIpOwogCXBlcmZfYnVmZmVyX19mcmVlKHBiKTsKJiM0MzsJLyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi8KIAljbG9zZShtYXBfZmQpOwogCi0JcmV0dXJuIDA7CiYjNDM7CXJldHVybiBlcnIgJmx0OyAwID8gLTEgOiAwOwogCi1lcnJfY2xvc2VfcGI6Ci0JcGVyZl9idWZmZXJfX2ZyZWUocGIpOwogZXJyX2Nsb3NlX21hcDoKIAljbG9zZShtYXBfZmQpOwogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMWE0YWU4OGMwNWEwNwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jCkBAIC0wLDAgJiM0MzsxLDQyNSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2N0eXBlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDAKJiM0MzsjZGVmaW5lIFdBSVRfVVMgMTAwMDAKJiM0MzsKJiM0MztzdHJ1Y3QgY29uc3VtZXIgewomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CWludCBmZDsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpicGZ0b29sX3BhdGgodm9pZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoJiMzNDtCUEZUT09MJiMzNDspOwomIzQzOwomIzQzOwlpZiAocGF0aCkKJiM0MzsJCXJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDsKJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7LCBYX09LKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDs7CiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDssIFhfT0spKQomIzQzOwkJcmV0dXJuICYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sJiMzNDs7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpCiYjNDM7ewomIzQzOwlpZiAoY2hpbGQtJmd0O3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoY2hpbGQtJmd0O3BpZCwgU0lHS0lMTCk7CiYjNDM7CQl3aGlsZSAod2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCBOVUxMLCAwKSAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5UUikKJiM0MzsJCQk7CiYjNDM7CQljaGlsZC0mZ3Q7cGlkID0gLTE7CiYjNDM7CX0KJiM0MzsJaWYgKGNoaWxkLSZndDtmZCAmZ3Q7PSAwKSB7CiYjNDM7CQljbG9zZShjaGlsZC0mZ3Q7ZmQpOwomIzQzOwkJY2hpbGQtJmd0O2ZkID0gLTE7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfc3RhcnQoc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IG1hcF9mZCwgY29uc3QgY2hhciAqZm9ybWF0LAomIzQzOwkJCSAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sCiYjNDM7CQkJICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJY29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpOwomIzQzOwljaGFyICphcmd2WzEyXSwgaWRbMTZdOwomIzQzOwlpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsICYjMzQ7YnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSkmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcCBpbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgJiMzNDsldSYjMzQ7LCBpbmZvLmlkKTsKJiM0MzsJYXJndltuJiM0MzsmIzQzO10gPSAoY2hhciAqKXBhdGg7CiYjNDM7CWlmIChmb3JtYXQpCiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopZm9ybWF0OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7bWFwJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtldmVudF9waXBlJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gcGluX3BhdGggPyAmIzM0O3Bpbm5lZCYjMzQ7IDogJiMzNDtpZCYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkOwomIzQzOwlpZiAob3B0aW9uKSB7CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uOwomIzQzOwkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCWlmIChwYWlyKSB7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2luZGV4JiMzNDs7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlhcmd2W25dID0gTlVMTDsKJiM0MzsJaWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCAmIzM0O291dHB1dCBwaXBlJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgJiMzNDtleGVjIHBpcGUmIzM0OykpIHsKJiM0MzsJCWNsb3NlKG91dFswXSk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNoaWxkLSZndDtwaWQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQtJmd0O3BpZCkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKHJlYWR5WzBdKTsKJiM0MzsJCWVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbigmIzM0Oy9kZXYvbnVsbCYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CQlpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pICZsdDsgMCB8fAomIzQzOwkJICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSAmbHQ7IDApCiYjNDM7CQkJZ290byBleGVjX2ZhaWw7CiYjNDM7CQlpZiAoIWNhcHR1cmVfZXJyb3JzKQomIzQzOwkJCWNsb3NlKGVycl9mZCk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJZXhlY3YocGF0aCwgYXJndik7CiYjNDM7ZXhlY19mYWlsOgomIzQzOwkJZXJyID0gZXJybm87CiYjNDM7CQl3cml0ZShyZWFkeVsxXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKTsKJiM0MzsJCV9leGl0KDEyNyk7CiYjNDM7CX0KJiM0MzsJY2xvc2Uob3V0WzFdKTsKJiM0MzsJY2xvc2UocmVhZHlbMV0pOwomIzQzOwljaGlsZC0mZ3Q7ZmQgPSBvdXRbMF07CiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CS8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi8KJiM0MzsJZXJyID0gY2hpbGQtJmd0O3BpZCAmZ3Q7IDAgPyBwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNoaWxkLSZndDtwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChlcnIsIDAsICYjMzQ7ZXhlYyB0aW1lb3V0JiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sICZhbXA7ZXJyLCBzaXplb2YoZXJyKSksIDAsICYjMzQ7ZXhlYyYjMzQ7KSkgewomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJY29uc3VtZXJfY2xlYW51cChjaGlsZCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2xvc2UocmVhZHlbMF0pOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLAomIzQzOwkJCSAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaW50IHN0YXR1cyA9IDAsIGk7CiYjNDM7CXBpZF90IHJldCA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJc2l6ZV90IHVzZWQgPSAwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC0mZ3Q7ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCAmIzM0O25vbmJsb2NraW5nIG91dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJaWYgKHNpZ25vICZhbXA7JmFtcDsgIUFTU0VSVF9PSyhraWxsKGNoaWxkLSZndDtwaWQsIHNpZ25vKSwgJiMzNDtzaWduYWwgY29uc3VtZXImIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCQl1c2VkICYjNDM7PSBuOwomIzQzOwkJcmV0ID0gd2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCAmYW1wO3N0YXR1cywgV05PSEFORyk7CiYjNDM7CQlpZiAocmV0ID09IGNoaWxkLSZndDtwaWQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vICE9IEVJTlRSKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtJmd0O3BpZCwgJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXQmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7IChuID0gcmVhZChjaGlsZC0mZ3Q7ZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSAmZ3Q7IDApCiYjNDM7CQl1c2VkICYjNDM7PSBuOwomIzQzOwlvdXRwdXRbdXNlZF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtub3JtYWwgZXhpdCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCAmIzM0O2V4aXQgc3RhdHVzJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDsKJiM0MzsJY2hhciBwYXRoWzY0XSwgbGluZVsyNTZdOwomIzQzOwlpbnQgaTsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0Oy9wcm9jLyVkL3N0YXR1cyYjMzQ7LCBjaGlsZC0mZ3Q7cGlkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlmID0gZm9wZW4ocGF0aCwgJiMzNDtyJiMzNDspOwomIzQzOwkJaWYgKCFmKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKJiM0MzsJCQlpZiAoc3NjYW5mKGxpbmUsICYjMzQ7U2lnQ2d0OiAlbGx4JiMzNDssICZhbXA7Y2F1Z2h0KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHSU5UIC0gMSkpKSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIChjYXVnaHQgJmFtcDsgKDFVTEwgJmx0OyZsdDsgKFNJR1RFUk0gLSAxKSkpKSB7CiYjNDM7CQkJCWZjbG9zZShmKTsKJiM0MzsJCQkJcmV0dXJuIHRydWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZmNsb3NlKGYpOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHkmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpCiYjNDM7ewomIzQzOwljaGFyIHBhY2tldFs2NF0gPSB7fTsKJiM0MzsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsCiYjNDM7CQkgICAgLmRhdGFfaW4gPSBwYWNrZXQsCiYjNDM7CQkgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLAomIzQzOwkpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3JlY29yZCA9IHJlY29yZDsKJiM0MzsJcmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5wcm9kdWNlKSwKJiM0MzsJCQkJCSAgICAgICZhbXA7b3B0cyksICYjMzQ7cHJvZHVjZSByZWNvcmQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgQVNTRVJUX09LKHNrZWwtJmd0O2Jzcy0mZ3Q7b3V0cHV0X2VyciwgJiMzNDtyaW5nYnVmIG91dHB1dCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZCkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcChXQUlUX1VTKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsICYjMzQ7Y29uc3VtZXIgcG9zaXRpb24mIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDsKJiM0MzsJYm9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwomIzQzOwomIzQzOwkvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi8KJiM0MzsJd2hpbGUgKCpzcmMpIHsKJiM0MzsJCWlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkJaWYgKCFlc2NhcGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5OyYjMzQ7JiMzOTspCiYjNDM7CQkJcXVvdGVkID0gIXF1b3RlZDsKJiM0MzsJCWVzY2FwZWQgPSAhZXNjYXBlZCAmYW1wOyZhbXA7IHF1b3RlZCAmYW1wOyZhbXA7ICpzcmMgPT0gJiMzOTtcXCYjMzk7OwomIzQzOwkJc3JjJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJdW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEOwomIzQzOwlpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7CiYjNDM7CWNoYXIgcGluX2RpcltdID0gJiMzNDsvc3lzL2ZzL2JwZi9icGZ0b29sX3JpbmdidWZfWFhYWFhYJiMzNDs7CiYjNDM7CWNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICYjNDM7IHNpemVvZigmIzM0Oy9tYXAmIzM0OyldOwomIzQzOwlib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgJiMzNDtsb2FkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkID0gYnBmX21hcF9fZmQoc2tlbC0mZ3Q7bWFwcy5yaW5nYnVmKTsKJiM0MzsJaWYgKHBpbm5lZCkgewomIzQzOwkJaWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksICYjMzQ7Y3JlYXRlIHBpbiBkaXJlY3RvcnkmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlkaXJfY3JlYXRlZCA9IHRydWU7CiYjNDM7CQlzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgJiMzNDslcy9tYXAmIzM0OywgcGluX2Rpcik7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCAmIzM0O3BpbiByaW5nYnVmJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbWFwX3Bpbm5lZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsJcG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgJiMzNDtjb25zdW1lciBtbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSAmYW1wOyZhbXA7ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCwKJiM0MzsJCQkgICAgTlVMTCwgZmFsc2UsIGZhbHNlKSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3JlYWR5KCZhbXA7Y2hpbGQpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSkgewomIzQzOwkJLyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovCiYjNDM7CQlpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9OwomIzQzOwkJaWYgKCFBU1NFUlRfR1QocG9sbCgmYW1wO3BmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWNvcmRzIGZsdXNoZWQgYmVmb3JlIGV4aXQmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgJmFtcDsgUE9MTElOLCAmIzM0O3JlY29yZCBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJCSAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJaWYgKCFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmIChmb3JtYXQgJmFtcDsmYW1wOyAhc3RyY21wKGZvcm1hdCwgJiMzNDstcCYjMzQ7KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0O1tdXG4mIzM0OyA6CiYjNDM7CQkJICAgICAmIzM0O1t7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDIsXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O2RhdGFcJiMzNDs6IFswLDI1NVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBdXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgfSx7XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O3NpemVcJiMzNDs6IDUsXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIFwmIzM0O2RhdGFcJiMzNDs6IFsxLDIsMyw0LDVcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXVxuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgIH0se1xuJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7ICAgICAgICBcJiMzNDtzaXplXCYjMzQ7OiAxNyxcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICAgICAgXCYjMzQ7ZGF0YVwmIzM0OzogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDsgICAgICAgIF1cbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OyAgICB9XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDtdXG4mIzM0OywgJiMzNDtwcmV0dHkgSlNPTiByZWNvcmRzJiMzNDspOwomIzQzOwllbHNlIGlmIChmb3JtYXQpCiYjNDM7CQljaGVja19qc29uKG91dHB1dCwgaWRsZSA/ICYjMzQ7W10mIzM0OyA6CiYjNDM7CQkJICAgJiMzNDtbe1wmIzM0O3NpemVcJiMzNDs6MixcJiMzNDtkYXRhXCYjMzQ7OlswLDI1NV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0Ozo1LFwmIzM0O2RhdGFcJiMzNDs6WzEsMiwzLDQsNV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0OzoxNyxcJiMzNDtkYXRhXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywmIzM0OwomIzQzOwkJCSAgICYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV0mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0OyYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogMiA9PT09PVxuMDAgZmZcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDUgPT09PT1cbjAxIDAyIDAzIDA0IDA1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAxNyA9PT09PVxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgICYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXG4yMFxuJiMzNDssICYjMzQ7cGxhaW4gcmVjb3JkcyYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKQomIzQzOwkJbXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpOwomIzQzOwlpZiAobWFwX3Bpbm5lZCkKJiM0MzsJCUFTU0VSVF9PSyh1bmxpbmsocGluX3BhdGgpLCAmIzM0O3VucGluIHJpbmdidWYmIzM0Oyk7CiYjNDM7CWlmIChkaXJfY3JlYXRlZCkKJiM0MzsJCUFTU0VSVF9PSyhybWRpcihwaW5fZGlyKSwgJiMzNDtyZW1vdmUgcGluIGRpcmVjdG9yeSYjMzQ7KTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7CiYjNDM7CXN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7CiYjNDM7CWNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdOwomIzQzOwlpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkczsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CW5yX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QobnJfY3B1cywgMCwgJiMzNDtwb3NzaWJsZSBjcHVzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIGdldHBhZ2VzaXplKCkpOwomIzQzOwlicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC0mZ3Q7bWFwcy5wZXJmYnVmLCBucl9jcHVzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCAmIzM0O2xvYWQmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBicGZfbWFwX19mZChza2VsLSZndDttYXBzLnBlcmZidWYpLCBOVUxMLAomIzQzOwkJCSAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeSgmYW1wO2NoaWxkKSB8fAomIzQzOwkgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovCiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CWlmICghQVNTRVJUX0dUKHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsCiYjNDM7CQkgICAgICAgJiMzNDtwZXJmIHJlY29yZCBvdXRwdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCAmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cbiVuJiMzNDssCiYjNDM7CQkJJmFtcDtzZWNvbmRzLCAmYW1wO25hbm9zZWNvbmRzLCAmYW1wO2NwdSwgJmFtcDtpbmRleCwgJmFtcDtvZmZzZXQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsICYjMzQ7cGVyZiBoZWFkZXImIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCAmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCAmIzM0O3BlcmYgdGltZXN0YW1wJiMzNDspOwomIzQzOwlBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsICYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9HRShjcHUsIDAsICYjMzQ7cGVyZiBjcHUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChjcHUsIG5yX2NwdXMsICYjMzQ7cGVyZiBjcHUgcmFuZ2UmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShpbmRleCwgY3B1LCAmIzM0O3BlcmYgaW5kZXgmIzM0Oyk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplb2Yoc2tlbC0mZ3Q7cm9kYXRhLSZndDtwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyAmIzM0OyYjMzQ7IDogIShpICUgMTYpID8gJiMzNDtcbiYjMzQ7IDoKJiM0MzsJCQkJCSEoaSAlIDgpID8gJiMzNDsgICYjMzQ7IDogJiMzNDsgJiMzNDs7CiYjNDM7CiYjNDM7CQl1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwKJiM0MzsJCQkJICYjMzQ7JXMlMDJ4JiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCAmIzM0O1xuJiMzNDspOwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsICYjMzQ7cGVyZiBwYXlsb2FkJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CWJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGOwomIzQzOwljb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcJiMzNDt9JiMzNDsgOgomIzQzOwkJJiMzNDt7XCYjMzQ7ZXJyb3JcJiMzNDs6XCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDt9JiMzNDs7CiYjNDM7CWNoYXIgb3V0cHV0WzQwOTZdOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsCiYjNDM7CQkJICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O2NyZWF0ZSBtYXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBmZCwganNvbiA/ICYjMzQ7LWomIzM0OyA6IE5VTEwsIE5VTEwsIG9wdGlvbiwgcGFpciwgdHJ1ZSkgJmFtcDsmYW1wOwomIzQzOwkgICAgY29uc3VtZXJfZmluaXNoKCZhbXA7Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkgewomIzQzOwkJaWYgKGpzb24pCiYjNDM7CQkJY2hlY2tfanNvbihvdXRwdXQsIGV4cGVjdGVkKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsICYjMzQ7ZXJyb3IgZGlhZ25vc3RpYyYjMzQ7KTsKJiM0MzsJfQomIzQzOwljb25zdW1lcl9jbGVhbnVwKCZhbXA7Y2hpbGQpOwomIzQzOwljbG9zZShmZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyZl9ldmVudF9hcnJheSYjMzQ7KSkKJiM0MzsJCXRlc3RfcGVyZl9jb25zdW1lcigpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3BsYWluJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7anNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCBmYWxzZSwgU0lHVEVSTSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3ByZXR0eV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcigmIzM0Oy1wJiMzNDssIGZhbHNlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKE5VTEwsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCBmYWxzZSwgU0lHSU5ULCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwaW5uZWRfcHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgZmFsc2UsIFNJR1RFUk0sIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lnaW50JiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcihOVUxMLCB0cnVlLCBTSUdJTlQsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtpZGxlX3NpZ3Rlcm1fanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfY29uc3VtZXIoJiMzNDstaiYjMzQ7LCB0cnVlLCBTSUdURVJNLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnRfcHJldHR5X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKCYjMzQ7LXAmIzM0OywgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF91c2VyX3JpbmdidWYmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHUmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgZmFsc2UsIGZhbHNlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfaW5kZXgmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtpbmRleCYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXgmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgdHJ1ZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF91c2VyX3JpbmdidWZfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgJiMzNDtjcHUmIzM0OywgdHJ1ZSwgdHJ1ZSk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmJiYmM5M2MzMGE4MzMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKQEAgLTAsMCAmIzQzOzEsNDcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTsKJiM0Mzt9IHJpbmdidWYgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTsKJiM0MzsJX191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTsKJiM0MzsJX191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQobWF4X2VudHJpZXMsIDEpOwomIzQzO30gcGVyZmJ1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJiMzOTtzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy4KJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy4KJiM0MzsgKi8KJiM0Mztjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9OwomIzQzOwomIzQzO2ludCByZWNvcmQ7CiYjNDM7aW50IG91dHB1dF9lcnI7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c29ja2V0JiMzNDspCiYjNDM7aW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTsKJiM0MzsJdW5zaWduZWQgY2hhciB0aGlyZFtdID0gewomIzQzOwkJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKJiM0MzsJCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsCiYjNDM7CX07CiYjNDM7CiYjNDM7CWlmIChyZWNvcmQgPT0gMCkKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoJmFtcDtyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAxKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHNlY29uZCwgc2l6ZW9mKHNlY29uZCksIDApOwomIzQzOwllbHNlIGlmIChyZWNvcmQgPT0gMikKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoJmFtcDtyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7CiYjNDM7CWVsc2UKJiM0MzsJCW91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCAmYW1wO3BlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLAomIzQzOwkJCQkJCSAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE5MjQKCQkJCQkJCW91dHB1dDogMTAxCgkJCQkJCQl0aG91Z2h0czogNTkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRXZhbHVhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGZpbGVzIHJlbGF0ZWQgdG8gYGJwZnRvb2xgIHdpdGhpbiBgdG9vbHMvYnBmL2AgYW5kIGFkZGluZyBzZWxmdGVzdHMgdW5kZXIgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjaGVjayBpZiB0aGVzZSBjaGFuZ2VzIHdhcnJhbnQgZnV6emluZy4gVGhlIGtleSBpcyB3aGV0aGVyIHRoZXkgaW1wYWN0IHRoZSBrZXJuZWwgaXRzZWxmLgoKRmlyc3QsIGxldCYjMzk7cyBjb25maXJtIHRoZSBmaWxlcyBpbnZvbHZlZDogYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YCwgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYCwgYHRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY2AsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY2AsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jYC4KCk5vdywgYWNjb3JkaW5nIHRvIFNlY3Rpb24gMiBvZiB0aGUgaW5zdHJ1Y3Rpb25zLCBJIHNob3VsZCBvbmx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYCBpZiAqYWxsKiBtb2RpZmllZCBjb2RlIGZhbGxzIHVuZGVyIHNwZWNpZmljIG5lZ2F0aXZlIGNyaXRlcmlhOiBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgdXNlci1zcGFjZSB0b29scywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0IGRvICpub3QqIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzLgoKTG9va2luZyBhdCB0aGUgZmlsZSBwYXRocywgdGhleSYjMzk7cmUgYWxsIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSDigJMgYGJwZnRvb2xgIGFuZCBgYnBmYCBzZWxmdGVzdHMuIFRoZXJlJiMzOTtzIG5vdGhpbmcgaW4gYGtlcm5lbC9gLCBgbW0vYCwgYG5ldC9gLCBgZnMvYCwgYGRyaXZlcnMvYCwgYGFyY2gvYCwgb3IgdG91Y2hpbmcgYW55IGBpbmNsdWRlL2xpbnV4L2AgaGVhZGVycy4gVGhpcyBpcyBhIGNsZWFyIGluZGljYXRvci4KCkxldCYjMzk7cyBkb3VibGUtY2hlY2sgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZTogYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YCwgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYCwgYHRvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY2AsIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY2AsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jYC4gWWVwLCBhbGwgdW5kZXIgdGhlIGB0b29scy9gIHVtYnJlbGxhLgoKU28sIHRoaXMgcGF0Y2ggaXMgc29sZWx5IG1vZGlmeWluZyB1c2VyLXNwYWNlIHRvb2xzIChgYnBmdG9vbGApIGFuZCBpdHMgYXNzb2NpYXRlZCBzZWxmdGVzdHMuIE5vIGltcGFjdCBvbiB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIFRoZXJlZm9yZSwgdGhpcyBpcyBub3QgYSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuCgpNeSBjb25jbHVzaW9uIGlzOiBgV29ydGhGdXp6aW5nPWZhbHNlYC4KCk5vdywgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIHNldHRpbmcgdGhlIGBzZXQtcmVzdWx0c2AgcGFyYW1ldGVycyBjb3JyZWN0bHk6Ci0gYFdvcnRoRnV6emluZ2A6IGZhbHNlCi0gYFJlYXNvbmluZ2A6IFRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHRvb2xzIGFuZCBicGYgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLywgd2l0aCBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4KLSBgRm9jdXNTeW1ib2xzYDogW10KLSBgRW5hYmxlQ29uZmlnc2A6IFtdCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGUgY29kZSBpcyB0b3VjaGVkLCBzbyBpdCBpcyBub3QgcmVsZXZhbnQgZm9yIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjo0MTo0MC42OTgzNzgyOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4NTM1MjQ1MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIGFuZCBCUEYgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlIGNvZGUgaXMgdG91Y2hlZCwgc28gaXQgaXMgbm90IHJlbGV2YW50IGZvciBrZXJuZWwgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQwLjY5ODM5MTlaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MDk4MDc1MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhYTI2ZWY3NjQ1NTBlMzExYTVmNzdmZjc1OTY5NTMxZjUxMGM4Mzc2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDY6NDE6MzkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxcbisgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsXFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxcbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxcbitcXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxcbisgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKipcXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXFxuK1xcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1xcXCJ0eXBlXFxcIjogXFxcIlxcXFwocGVyZl9ldmVudF9hcnJheVxcXFx8cmluZ2J1ZlxcXFwpXFxcIidcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbkBAIC0yNyw3ICsyNyw3IEBAXFxuIFxcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcXHQxNlxcbiBcXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xcbiBcXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcXG4gXFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcXG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcXG4gXFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcXG4ge1xcbi1cXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0c3RvcCA9IHRydWU7XFxuIH1cXG4gXFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXFxuIFxcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuK1xcdFxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxuK1xcdFxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJzaXplXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJkYXRhXFxcIik7XFxuK1xcdFxcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcXG4rXFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHByaW50ZihcXFwiPT0gc2l6ZTogJXp1ID09PT09XFxcXG5cXFwiLCBzaXplKTtcXG4rXFx0XFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFxcXCIgXFxcIik7XFxuK1xcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZmbHVzaChzdGRvdXQpKVxcbitcXHRcXHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xcbitcXG4rXFx0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXFxuK1xcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcXG4rfVxcbitcXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdC5jcHUgPSAtMSxcXG4gXFx0XFx0LmlkeCA9IC0xLFxcbiBcXHR9O1xcbi1cXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xcbitcXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcXG4rXFx0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XFxuIFxcdF9fdTMyIG1hcF9pbmZvX2xlbjtcXG4gXFx0aW50IGVyciwgbWFwX2ZkO1xcbiBcXG4rXFx0c3RvcCA9IGZhbHNlO1xcbiBcXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xcbiBcXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXFx1MDAyNmFyZ2MsIFxcdTAwMjZhcmd2LCBcXHUwMDI2bWFwX2luZm8sIFxcdTAwMjZtYXBfaW5mb19sZW4sXFxuIFxcdFxcdFxcdFxcdCAgICAgICAwKTtcXG4gXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybiAtMTtcXG4gXFxuLVxcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVxcXCIpO1xcbitcXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbitcXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwiKTtcXG4rXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcXHUwMDI2XFx1MDAyNiBhcmdjKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwiKTtcXG4gXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdGN0eC5pZHggPSAwO1xcbiBcXHR9XFxuIFxcbi1cXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4tXFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuLVxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4tXFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuLVxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbi1cXHRpZiAoIXBiKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4rXFx0XFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuK1xcdFxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4rXFx0XFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIXBiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XFxuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxuIFxcbitcXHRlcnIgPSAwO1xcbiBcXHR3aGlsZSAoIXN0b3ApIHtcXG4tXFx0XFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuK1xcdFxcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcXG4gXFx0XFx0aWYgKGVyciBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FSU5UUikge1xcbi1cXHRcXHRcXHRwX2VycihcXFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFwiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcXG4tXFx0XFx0XFx0Z290byBlcnJfY2xvc2VfcGI7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0cmIgPyBcXFwicmluZ1xcXCIgOiBcXFwicGVyZlxcXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4rXFx0XFx0ZXJyID0gMDtcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKHN0b3ApXFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU3RvcHBpbmcuLi5cXFxcblxcXCIpO1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0ZXJyID0gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcXG4gXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbitcXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBlcnIgXFx1MDAzYyAwID8gLTEgOiAwO1xcbiBcXG4tZXJyX2Nsb3NlX3BiOlxcbi1cXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XFxuIGVycl9jbG9zZV9tYXA6XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdHJldHVybiAtMTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMWE0YWU4OGMwNWEwN1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsNDI1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcXG4rXFxuK3N0cnVjdCBjb25zdW1lciB7XFxuK1xcdHBpZF90IHBpZDtcXG4rXFx0aW50IGZkO1xcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXFxcIkJQRlRPT0xcXFwiKTtcXG4rXFxuK1xcdGlmIChwYXRoKVxcbitcXHRcXHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXFxcIjtcXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVxcdTAwM2VwaWQsIE5VTEwsIDApIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5UUilcXG4rXFx0XFx0XFx0O1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlcGlkID0gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VmZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGNsb3NlKGNoaWxkLVxcdTAwM2VmZCk7XFxuK1xcdFxcdGNoaWxkLVxcdTAwM2VmZCA9IC0xO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCxcXG4rXFx0XFx0XFx0ICAgY29uc3QgY2hhciAqcGluX3BhdGgsIGNvbnN0IGNoYXIgKm9wdGlvbixcXG4rXFx0XFx0XFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcXG4rXFx0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcXG4rXFx0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXFxcImJwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSwgXFxcIm1hcCBpbmZvXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0c25wcmludGYoaWQsIHNpemVvZihpZCksIFxcXCIldVxcXCIsIGluZm8uaWQpO1xcbitcXHRhcmd2W24rK10gPSAoY2hhciAqKXBhdGg7XFxuK1xcdGlmIChmb3JtYXQpXFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopZm9ybWF0O1xcbitcXHRhcmd2W24rK10gPSBcXFwibWFwXFxcIjtcXG4rXFx0YXJndltuKytdID0gXFxcImV2ZW50X3BpcGVcXFwiO1xcbitcXHRhcmd2W24rK10gPSBwaW5fcGF0aCA/IFxcXCJwaW5uZWRcXFwiIDogXFxcImlkXFxcIjtcXG4rXFx0YXJndltuKytdID0gcGluX3BhdGggPyAoY2hhciAqKXBpbl9wYXRoIDogaWQ7XFxuK1xcdGlmIChvcHRpb24pIHtcXG4rXFx0XFx0YXJndltuKytdID0gKGNoYXIgKilvcHRpb247XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0aWYgKHBhaXIpIHtcXG4rXFx0XFx0XFx0YXJndltuKytdID0gXFxcImluZGV4XFxcIjtcXG4rXFx0XFx0XFx0YXJndltuKytdID0gXFxcIjBcXFwiO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0YXJndltuXSA9IE5VTEw7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXFxcIm91dHB1dCBwaXBlXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFxcXCJleGVjIHBpcGVcXFwiKSkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShvdXRbMV0pO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0Y2hpbGQtXFx1MDAzZXBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFjaGlsZC1cXHUwMDNlcGlkKSB7XFxuK1xcdFxcdGNsb3NlKG91dFswXSk7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFxcXCIvZGV2L251bGxcXFwiLCBPX1dST05MWSk7XFxuK1xcdFxcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXFx1MDAzYyAwIHx8XFxuK1xcdFxcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRnb3RvIGV4ZWNfZmFpbDtcXG4rXFx0XFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcXG4rXFx0XFx0XFx0Y2xvc2UoZXJyX2ZkKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0ZXhlY3YocGF0aCwgYXJndik7XFxuK2V4ZWNfZmFpbDpcXG4rXFx0XFx0ZXJyID0gZXJybm87XFxuK1xcdFxcdHdyaXRlKHJlYWR5WzFdLCBcXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XFxuK1xcdFxcdF9leGl0KDEyNyk7XFxuK1xcdH1cXG4rXFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0Y2xvc2UocmVhZHlbMV0pO1xcbitcXHRjaGlsZC1cXHUwMDNlZmQgPSBvdXRbMF07XFxuK1xcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XFxuK1xcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cXG4rXFx0ZXJyID0gY2hpbGQtXFx1MDAzZXBpZCBcXHUwMDNlIDAgPyBwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCkgOiAtMTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXFx1MDAzZXBpZCwgMCwgXFxcImZvcmtcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFxcXCJleGVjIHRpbWVvdXRcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSksIDAsIFxcXCJleGVjXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2UocmVhZHlbMF0pO1xcbitcXHRcXHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcXG4rXFx0XFx0XFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aW50IHN0YXR1cyA9IDAsIGk7XFxuK1xcdHBpZF90IHJldCA9IDA7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFx0c2l6ZV90IHVzZWQgPSAwO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soZmNudGwoY2hpbGQtXFx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXFxcIm5vbmJsb2NraW5nIG91dHB1dFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmIChzaWdubyBcXHUwMDI2XFx1MDAyNiAhQVNTRVJUX09LKGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgc2lnbm8pLCBcXFwic2lnbmFsIGNvbnN1bWVyXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xcbitcXHRcXHR3aGlsZSAodXNlZCBcXHUwMDNjIHNpemUgLSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdFxcdHVzZWQgKz0gbjtcXG4rXFx0XFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cXHUwMDNlcGlkLCBcXHUwMDI2c3RhdHVzLCBXTk9IQU5HKTtcXG4rXFx0XFx0aWYgKHJldCA9PSBjaGlsZC1cXHUwMDNlcGlkKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gIT0gRUlOVFIpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cXHUwMDNlcGlkLCBcXFwiYm91bmRlZCBjb25zdW1lciBleGl0XFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0Y2hpbGQtXFx1MDAzZXBpZCA9IC0xO1xcbitcXHR3aGlsZSAodXNlZCBcXHUwMDNjIHNpemUgLSAxIFxcdTAwMjZcXHUwMDI2IChuID0gcmVhZChjaGlsZC1cXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFxcdTAwM2UgMClcXG4rXFx0XFx0dXNlZCArPSBuO1xcbitcXHRvdXRwdXRbdXNlZF0gPSAnXFxcXDAnO1xcbitcXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJub3JtYWwgZXhpdFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCBcXFwiZXhpdCBzdGF0dXNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xcbitcXHRjaGFyIHBhdGhbNjRdLCBsaW5lWzI1Nl07XFxuK1xcdGludCBpO1xcbitcXHRGSUxFICpmO1xcbitcXG4rXFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcXFwiL3Byb2MvJWQvc3RhdHVzXFxcIiwgY2hpbGQtXFx1MDAzZXBpZCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0ZiA9IGZvcGVuKHBhdGgsIFxcXCJyXFxcIik7XFxuK1xcdFxcdGlmICghZilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7XFxuK1xcdFxcdFxcdGlmIChzc2NhbmYobGluZSwgXFxcIlNpZ0NndDogJWxseFxcXCIsIFxcdTAwMjZjYXVnaHQpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHSU5UIC0gMSkpKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHQgICAgKGNhdWdodCBcXHUwMDI2ICgxVUxMIFxcdTAwM2NcXHUwMDNjIChTSUdURVJNIC0gMSkpKSkge1xcbitcXHRcXHRcXHRcXHRmY2xvc2UoZik7XFxuK1xcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcXFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpXFxuK3tcXG4rXFx0Y2hhciBwYWNrZXRbNjRdID0ge307XFxuK1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxcbitcXHRcXHQgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLFxcbitcXHQpO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNvcmQgPSByZWNvcmQ7XFxuK1xcdHJldHVybiBBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MucHJvZHVjZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZvcHRzKSwgXFxcInByb2R1Y2UgcmVjb3JkXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIEFTU0VSVF9PSyhza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW91dHB1dF9lcnIsIFxcXCJyaW5nYnVmIG91dHB1dFxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0aWYgKF9fYXRvbWljX2xvYWRfbihwb3NpdGlvbiwgX19BVE9NSUNfQUNRVUlSRSkgPT0gZXhwZWN0ZWQpXFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHR1c2xlZXAoV0FJVF9VUyk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcXFwiY29uc3VtZXIgcG9zaXRpb25cXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfanNvbihjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKVxcbit7XFxuK1xcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcXG4rXFx0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xcbitcXG4rXFx0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXFxuK1xcdHdoaWxlICgqc3JjKSB7XFxuK1xcdFxcdGlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXFxuK1xcdFxcdFxcdCpkc3QrKyA9ICpzcmM7XFxuK1xcdFxcdGlmICghZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiAqc3JjID09ICdcXFwiJylcXG4rXFx0XFx0XFx0cXVvdGVkID0gIXF1b3RlZDtcXG4rXFx0XFx0ZXNjYXBlZCA9ICFlc2NhcGVkIFxcdTAwMjZcXHUwMDI2IHF1b3RlZCBcXHUwMDI2XFx1MDAyNiAqc3JjID09ICdcXFxcXFxcXCc7XFxuK1xcdFxcdHNyYysrO1xcbitcXHR9XFxuK1xcdCpkc3QgPSAnXFxcXDAnO1xcbitcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIkpTT04gcmVjb3Jkc1xcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN1bWVyKGNvbnN0IGNoYXIgKmZvcm1hdCwgYm9vbCBpZGxlLCBpbnQgc2lnbm8sIGJvb2wgcGlubmVkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XFxuK1xcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcXG4rXFx0Y2hhciBwaW5fZGlyW10gPSBcXFwiL3N5cy9mcy9icGYvYnBmdG9vbF9yaW5nYnVmX1hYWFhYWFxcXCI7XFxuK1xcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICsgc2l6ZW9mKFxcXCIvbWFwXFxcIildO1xcbitcXHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcXG4rXFx0Y2hhciBvdXRwdXRbNDA5Nl07XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1Zik7XFxuK1xcdGlmIChwaW5uZWQpIHtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksIFxcXCJjcmVhdGUgcGluIGRpcmVjdG9yeVxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0ZGlyX2NyZWF0ZWQgPSB0cnVlO1xcbitcXHRcXHRzbnByaW50ZihwaW5fcGF0aCwgc2l6ZW9mKHBpbl9wYXRoKSwgXFxcIiVzL21hcFxcXCIsIHBpbl9kaXIpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcXFwicGluIHJpbmdidWZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG1hcF9waW5uZWQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFxcXCJjb25zdW1lciBtbWFwXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIWlkbGUgXFx1MDAyNlxcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBmb3JtYXQsIHBpbm5lZCA/IHBpbl9wYXRoIDogTlVMTCxcXG4rXFx0XFx0XFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFpZGxlKSB7XFxuK1xcdFxcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xcbitcXHRcXHRpZiAoIWNvbnN1bWVkKHBvc2l0aW9uLCAzMikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInJlY29yZCBvdXRwdXQgcmVhZGFibGVcXFwiKSB8fFxcbitcXHRcXHQgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDIpIHx8ICFjb25zdW1lZChwb3NpdGlvbiwgNjQpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIHNpZ25vLCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmIChmb3JtYXQgXFx1MDAyNlxcdTAwMjYgIXN0cmNtcChmb3JtYXQsIFxcXCItcFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXFxcIltdXFxcXG5cXFwiIDpcXG4rXFx0XFx0XFx0ICAgICBcXFwiW3tcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcInNpemVcXFxcXFxcIjogMixcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjogWzAsMjU1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXVxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgfSx7XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJzaXplXFxcXFxcXCI6IDUsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFsxLDIsMyw0LDVcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBdXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICB9LHtcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgICAgICBcXFxcXFxcInNpemVcXFxcXFxcIjogMTcsXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIiAgICAgICAgXFxcXFxcXCJkYXRhXFxcXFxcXCI6IFsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMlxcXFxuXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIgICAgICAgIF1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiICAgIH1cXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXVxcXFxuXFxcIiwgXFxcInByZXR0eSBKU09OIHJlY29yZHNcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoZm9ybWF0KVxcbitcXHRcXHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFxcXCJbXVxcXCIgOlxcbitcXHRcXHRcXHQgICBcXFwiW3tcXFxcXFxcInNpemVcXFxcXFxcIjoyLFxcXFxcXFwiZGF0YVxcXFxcXFwiOlswLDI1NV19LFxcXCJcXG4rXFx0XFx0XFx0ICAgXFxcIntcXFxcXFxcInNpemVcXFxcXFxcIjo1LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxLDIsMyw0LDVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6MTcsXFxcXFxcXCJkYXRhXFxcXFxcXCI6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLFxcXCJcXG4rXFx0XFx0XFx0ICAgXFxcIjI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgaWRsZSA/IFxcXCJcXFwiIDpcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogMiA9PT09PVxcXFxuMDAgZmZcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogNSA9PT09PVxcXFxuMDEgMDIgMDMgMDQgMDVcXFxcblxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiPT0gc2l6ZTogMTcgPT09PT1cXFxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIjE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxcXG4yMFxcXFxuXFxcIiwgXFxcInBsYWluIHJlY29yZHNcXFwiKTtcXG4rb3V0OlxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxcbitcXHRcXHRtdW5tYXAocG9zaXRpb24sIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmIChtYXBfcGlubmVkKVxcbitcXHRcXHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXFxcInVucGluIHJpbmdidWZcXFwiKTtcXG4rXFx0aWYgKGRpcl9jcmVhdGVkKVxcbitcXHRcXHRBU1NFUlRfT0socm1kaXIocGluX2RpciksIFxcXCJyZW1vdmUgcGluIGRpcmVjdG9yeVxcXCIpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XFxuK1xcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XFxuK1xcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xcbitcXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFxcXCJwb3NzaWJsZSBjcHVzXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXFxcImxvYWRcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cXHUwMDNlbWFwcy5wZXJmYnVmKSwgTlVMTCxcXG4rXFx0XFx0XFx0ICAgIE5VTEwsIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFxcdTAwMjZjaGlsZCkgfHxcXG4rXFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdC8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovXFxuK1xcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XFxuK1xcdGlmICghQVNTRVJUX0dUKHBvbGwoXFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJwZXJmIHJlY29yZCBvdXRwdXRcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFxcdTAwMjYgUE9MTElOLCBcXFwicGVyZiBvdXRwdXQgcmVhZGFibGVcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX2ZpbmlzaChcXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCBcXFwiPT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcXFxuJW5cXFwiLFxcbitcXHRcXHRcXHRcXHUwMDI2c2Vjb25kcywgXFx1MDAyNm5hbm9zZWNvbmRzLCBcXHUwMDI2Y3B1LCBcXHUwMDI2aW5kZXgsIFxcdTAwMjZvZmZzZXQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFxcXCJwZXJmIGhlYWRlclxcXCIpIHx8XFxuK1xcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXFxcInBlcmYgcGF5bG9hZCBvZmZzZXRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCArIG5hbm9zZWNvbmRzLCAwLCBcXFwicGVyZiB0aW1lc3RhbXBcXFwiKTtcXG4rXFx0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcXFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcXFwiKTtcXG4rXFx0QVNTRVJUX0dFKGNwdSwgMCwgXFxcInBlcmYgY3B1XFxcIik7XFxuK1xcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFxcXCJwZXJmIGNwdSByYW5nZVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXFxcInBlcmYgaW5kZXhcXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemVvZihza2VsLVxcdTAwM2Vyb2RhdGEtXFx1MDAzZXBlcmZfcGF5bG9hZCk7IGkrKykge1xcbitcXHRcXHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFxcXCJcXFwiIDogIShpICUgMTYpID8gXFxcIlxcXFxuXFxcIiA6XFxuK1xcdFxcdFxcdFxcdFxcdCEoaSAlIDgpID8gXFxcIiAgXFxcIiA6IFxcXCIgXFxcIjtcXG4rXFxuK1xcdFxcdHVzZWQgKz0gc25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCxcXG4rXFx0XFx0XFx0XFx0IFxcXCIlcyUwMnhcXFwiLCBzZXBhcmF0b3IsIGkgPT0gMSA/IDB4ZmYgOiAwKTtcXG4rXFx0fVxcbitcXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcXFwiXFxcXG5cXFwiKTtcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCArIG9mZnNldCwgZXhwZWN0ZWQsIFxcXCJwZXJmIHBheWxvYWRcXFwiKTtcXG4rb3V0OlxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcXG4re1xcbitcXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcXG4rXFx0Ym9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7XFxuK1xcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cXG4rXFx0XFx0XFxcIntcXFxcXFxcImVycm9yXFxcXFxcXCI6XFxcXFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFxcXFxcIn1cXFwiIDpcXG4rXFx0XFx0XFxcIntcXFxcXFxcImVycm9yXFxcXFxcXCI6XFxcXFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclxcXFxcXFwifVxcXCI7XFxuK1xcdGNoYXIgb3V0cHV0WzQwOTZdO1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxcbitcXHRcXHRcXHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJjcmVhdGUgbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKGNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcXFwiLWpcXFwiIDogTlVMTCwgTlVMTCwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY29uc3VtZXJfZmluaXNoKFxcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XFxuK1xcdFxcdGlmIChqc29uKVxcbitcXHRcXHRcXHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdEFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgXFxcImVycm9yIGRpYWdub3N0aWNcXFwiKTtcXG4rXFx0fVxcbitcXHRjb25zdW1lcl9jbGVhbnVwKFxcdTAwMjZjaGlsZCk7XFxuK1xcdGNsb3NlKGZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxcbit7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcIikpXFxuK1xcdFxcdHRlc3RfcGVyZl9jb25zdW1lcigpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGxhaW5cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJqc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1qXFxcIiwgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInByZXR0eV9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1wXFxcIiwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGlubmVkX3BsYWluXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR1RFUk0sIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicGlubmVkX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcihcXFwiLWpcXFwiLCBmYWxzZSwgU0lHSU5ULCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBpbm5lZF9wcmV0dHlfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItcFxcXCIsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImlkbGVfc2lnaW50XFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ3Rlcm1fanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKFxcXCItalxcXCIsIHRydWUsIFNJR1RFUk0sIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImlkbGVfc2lnaW50X3ByZXR0eV9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfY29uc3VtZXIoXFxcIi1wXFxcIiwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfYXJyYXlcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX0FSUkFZLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X3VzZXJfcmluZ2J1ZlxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdVxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfaW5kZXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJpbmRleFxcXCIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1X2luZGV4XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgdHJ1ZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVfaW5kZXhfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImNwdVxcXCIsIHRydWUsIHRydWUpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcXG5AQCAtMCwwICsxLDQ3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTtcXG4rfSByaW5nYnVmIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSk7XFxuK1xcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XFxuK1xcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rfSBwZXJmYnVmIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIEluY2x1ZGUgdGhlIHUzMiByYXcgc2l6ZSBpbiBwZXJmJ3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxcbisgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cXG4rICovXFxuK2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XFxuK1xcbitpbnQgcmVjb3JkO1xcbitpbnQgb3V0cHV0X2VycjtcXG4rXFxuK1NFQyhcXFwic29ja2V0XFxcIilcXG4raW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKVxcbit7XFxuK1xcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xcbitcXHR1bnNpZ25lZCBjaGFyIHNlY29uZFtdID0geyAxLCAyLCAzLCA0LCA1IH07XFxuK1xcdHVuc2lnbmVkIGNoYXIgdGhpcmRbXSA9IHtcXG4rXFx0XFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcXG4rXFx0XFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcXG4rXFx0fTtcXG4rXFxuK1xcdGlmIChyZWNvcmQgPT0gMClcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1ZiwgZmlyc3QsIHNpemVvZihmaXJzdCksIDApO1xcbitcXHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XFxuK1xcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFxcdTAwMjZwZXJmYnVmLCBCUEZfRl9DVVJSRU5UX0NQVSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQyLjEwODk0Njc2M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NTQ0Mjk0NTg1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFhMjZlZjc2NDU1MGUzMTFhNWY3N2ZmNzU5Njk1MzFmNTEwYzgzNzZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDA2OjQxOjM5IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzQ0ZTZmNzk3ZTU3NyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTEyMCw3ICsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgnLicpLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgb2YgKmJwZmZzKi5cbiBcbiBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbi0gICAgUmVhZCBldmVudHMgZnJvbSBhICoqQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkqKiBtYXAuXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbisgICAgKipCUEZfTUFQX1RZUEVfUklOR0JVRioqIG1hcC5cbiBcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XG4gICAgICoqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KipcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcbkBAIC0xMzQsNiArMTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuICAgICBleGlzdGluZyByaW5nLiAgQW55IG90aGVyIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGlmIGl0XG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cbiBcbisgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXG4rICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkXG4rICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxuKyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuXG4rXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxuKyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lXG4rICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4rXG4gYnBmdG9vbCBtYXAgcGVlayAgKk1BUCpcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfaWRzX2Zvcl90eXBlICdcInR5cGVcIjogXCJcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpXG4tICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcInR5cGVcIjogXCJcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSlcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbmluZGV4IGJjYjc2N2UyZDY3MzMuLjdkNTU1MzMxZjQ0M2EgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuQEAgLTI3LDcgKzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHN0b3A7XG4gXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7XG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcbiBcbiBzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnbm8pXG4ge1xuLVx0ZnByaW50ZihzdGRlcnIsIFwiU3RvcHBpbmcuLi5cXG5cIik7XG4gXHRzdG9wID0gdHJ1ZTtcbiB9XG4gXG5AQCAtMTA3LDYgKzEwNiwyNyBAQCBwcmludF9icGZfb3V0cHV0KHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGNwdSwgc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpldmVudClcbiBcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xuIH1cbiBcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4re1xuK1x0aWYgKGpzb25fb3V0cHV0KSB7XG4rXHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4rXHRcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFwic2l6ZVwiLCBzaXplKTtcbitcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCJkYXRhXCIpO1xuK1x0XHRwcmludF9kYXRhX2pzb24oZGF0YSwgc2l6ZSk7XG4rXHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xuK1x0fSBlbHNlIHtcbitcdFx0cHJpbnRmKFwiPT0gc2l6ZTogJXp1ID09PT09XFxuXCIsIHNpemUpO1xuK1x0XHRmcHJpbnRfaGV4KHN0ZG91dCwgZGF0YSwgc2l6ZSwgXCIgXCIpO1xuK1x0XHRwcmludGYoXCJcXG5cIik7XG4rXHR9XG4rXG4rXHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4rXHRcdHJldHVybiBlcnJubyA/IC1lcnJubyA6IC1FSU87XG4rXG4rXHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbitcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcbit9XG4rXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCArMTQzLDI2IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0LmNwdSA9IC0xLFxuIFx0XHQuaWR4ID0gLTEsXG4gXHR9O1xuLVx0c3RydWN0IHBlcmZfYnVmZmVyICpwYjtcbitcdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGIgPSBOVUxMO1xuK1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4rXHRzdG9wID0gZmFsc2U7XG4gXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xuIFx0bWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKFx1MDAyNmFyZ2MsIFx1MDAyNmFyZ3YsIFx1MDAyNm1hcF9pbmZvLCBcdTAwMjZtYXBfaW5mb19sZW4sXG4gXHRcdFx0XHQgICAgICAgMCk7XG4gXHRpZiAobWFwX2ZkIFx1MDAzYyAwKVxuIFx0XHRyZXR1cm4gLTE7XG4gXG4tXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSkge1xuLVx0XHRwX2VycihcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5XCIpO1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkgXHUwMDI2XHUwMDI2XG4rXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xuK1x0XHRwX2VycihcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXCIpO1xuK1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHR9XG4rXG4rXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuK1x0XHRwX2VycihcInJpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1wiKTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSArMjEyLDI0IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0Y3R4LmlkeCA9IDA7XG4gXHR9XG4gXG4tXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbi1cdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4tXHRvcHRzLm1hcF9rZXlzID0gXHUwMDI2Y3R4LmlkeDtcbi1cdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4tXHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4tXHRpZiAoIXBiKSB7XG4tXHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwiLFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbitcdFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xuK1x0XHRpZiAoIXJiKSB7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXCIsXG4rXHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4rXHRcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcbitcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbitcdFx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4rXHRcdHBiID0gcGVyZl9idWZmZXJfX25ld19yYXcobWFwX2ZkLCBNTUFQX1BBR0VfQ05ULCBcdTAwMjZwZXJmX2F0dHIsXG4rXHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKCFwYikge1xuK1x0XHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwiLFxuK1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuK1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdFx0fVxuIFx0fVxuIFxuIFx0c2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpO1xuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpO1xuIFxuK1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbitcdFx0ZXJyID0gcmIgPyByaW5nX2J1ZmZlcl9fcG9sbChyYiwgMjAwKSA6IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVJTlRSKSB7XG4tXHRcdFx0cF9lcnIoXCJwZXJmIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVwiLFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiAlcyBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXG5cIixcbitcdFx0XHRcdHJiID8gXCJyaW5nXCIgOiBcInBlcmZcIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4rXHRcdGVyciA9IDA7XG4gXHR9XG4gXG4rXHRpZiAoc3RvcClcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiU3RvcHBpbmcuLi5cXG5cIik7XG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG4rXHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6IGZhaWxlZCB0byB3cml0ZSBldmVudHM6ICVzXFxuXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdGVyciA9IC0xO1xuK1x0fVxuIFxuK1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuK1x0LyogQm90aCBidWZmZXIgbWFuYWdlcnMgYm9ycm93IG1hcF9mZC4gKi9cbiBcdGNsb3NlKG1hcF9mZCk7XG4gXG4tXHRyZXR1cm4gMDtcbitcdHJldHVybiBlcnIgXHUwMDNjIDAgPyAtMSA6IDA7XG4gXG4tZXJyX2Nsb3NlX3BiOlxuLVx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuIGVycl9jbG9zZV9tYXA6XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0cmV0dXJuIC0xO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYTRhZTg4YzA1YTA3XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xuQEAgLTAsMCArMSw0MjUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcG9sbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmdG9vbF9yaW5nYnVmLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxuKyNkZWZpbmUgV0FJVF9VUyAxMDAwMFxuK1xuK3N0cnVjdCBjb25zdW1lciB7XG4rXHRwaWRfdCBwaWQ7XG4rXHRpbnQgZmQ7XG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4re1xuK1x0Y29uc3QgY2hhciAqcGF0aCA9IGdldGVudihcIkJQRlRPT0xcIik7XG4rXG4rXHRpZiAocGF0aClcbitcdFx0cmV0dXJuIGFjY2VzcyhwYXRoLCBYX09LKSA/IE5VTEwgOiBwYXRoO1xuK1x0aWYgKCFhY2Nlc3MoXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFwiLCBYX09LKSlcbitcdFx0cmV0dXJuIFwiLi90b29scy9zYmluL2JwZnRvb2xcIjtcbitcdGlmICghYWNjZXNzKFwiLi4vdG9vbHMvc2Jpbi9icGZ0b29sXCIsIFhfT0spKVxuK1x0XHRyZXR1cm4gXCIuLi90b29scy9zYmluL2JwZnRvb2xcIjtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXG4re1xuK1x0aWYgKGNoaWxkLVx1MDAzZXBpZCBcdTAwM2UgMCkge1xuK1x0XHRraWxsKGNoaWxkLVx1MDAzZXBpZCwgU0lHS0lMTCk7XG4rXHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuK1x0XHRcdDtcbitcdFx0Y2hpbGQtXHUwMDNlcGlkID0gLTE7XG4rXHR9XG4rXHRpZiAoY2hpbGQtXHUwMDNlZmQgXHUwMDNlPSAwKSB7XG4rXHRcdGNsb3NlKGNoaWxkLVx1MDAzZWZkKTtcbitcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfc3RhcnQoc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IG1hcF9mZCwgY29uc3QgY2hhciAqZm9ybWF0LFxuK1x0XHRcdCAgIGNvbnN0IGNoYXIgKnBpbl9wYXRoLCBjb25zdCBjaGFyICpvcHRpb24sXG4rXHRcdFx0ICAgYm9vbCBwYWlyLCBib29sIGNhcHR1cmVfZXJyb3JzKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xuK1x0Y2hhciAqYXJndlsxMl0sIGlkWzE2XTtcbitcdGludCBvdXRbMl0sIHJlYWR5WzJdLCBuID0gMCwgZXJyLCBlcnJfZmQ7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcImJwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXCIpIHx8XG4rXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXAgaW5mb1wiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0c25wcmludGYoaWQsIHNpemVvZihpZCksIFwiJXVcIiwgaW5mby5pZCk7XG4rXHRhcmd2W24rK10gPSAoY2hhciAqKXBhdGg7XG4rXHRpZiAoZm9ybWF0KVxuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKWZvcm1hdDtcbitcdGFyZ3ZbbisrXSA9IFwibWFwXCI7XG4rXHRhcmd2W24rK10gPSBcImV2ZW50X3BpcGVcIjtcbitcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gXCJwaW5uZWRcIiA6IFwiaWRcIjtcbitcdGFyZ3ZbbisrXSA9IHBpbl9wYXRoID8gKGNoYXIgKilwaW5fcGF0aCA6IGlkO1xuK1x0aWYgKG9wdGlvbikge1xuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKW9wdGlvbjtcbitcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdGlmIChwYWlyKSB7XG4rXHRcdFx0YXJndltuKytdID0gXCJpbmRleFwiO1xuK1x0XHRcdGFyZ3ZbbisrXSA9IFwiMFwiO1xuK1x0XHR9XG4rXHR9XG4rXHRhcmd2W25dID0gTlVMTDtcbitcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCJvdXRwdXQgcGlwZVwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFwiZXhlYyBwaXBlXCIpKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKHJlYWR5WzBdKTtcbitcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwiL2Rldi9udWxsXCIsIE9fV1JPTkxZKTtcbitcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuK1x0XHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuK1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuK1x0XHRcdGNsb3NlKGVycl9mZCk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuK2V4ZWNfZmFpbDpcbitcdFx0ZXJyID0gZXJybm87XG4rXHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbitcdFx0X2V4aXQoMTI3KTtcbitcdH1cbitcdGNsb3NlKG91dFsxXSk7XG4rXHRjbG9zZShyZWFkeVsxXSk7XG4rXHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXG4rXHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcImZvcmtcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCJleGVjIHRpbWVvdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcImV4ZWNcIikpIHtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2xvc2UocmVhZHlbMF0pO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbitcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpbnQgc3RhdHVzID0gMCwgaTtcbitcdHBpZF90IHJldCA9IDA7XG4rXHRzc2l6ZV90IG47XG4rXHRzaXplX3QgdXNlZCA9IDA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC1cdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFwibm9uYmxvY2tpbmcgb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCJzaWduYWwgY29uc3VtZXJcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHRcdHVzZWQgKz0gbjtcbitcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4rXHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwiYm91bmRlZCBjb25zdW1lciBleGl0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbitcdFx0dXNlZCArPSBuO1xuK1x0b3V0cHV0W3VzZWRdID0gJ1xcMCc7XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibm9ybWFsIGV4aXRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCJleGl0IHN0YXR1c1wiKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xuK1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuK1x0aW50IGk7XG4rXHRGSUxFICpmO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL3N0YXR1c1wiLCBjaGlsZC1cdTAwM2VwaWQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGYgPSBmb3BlbihwYXRoLCBcInJcIik7XG4rXHRcdGlmICghZilcbitcdFx0XHRicmVhaztcbitcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwiU2lnQ2d0OiAlbGx4XCIsIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR1RFUk0gLSAxKSkpKSB7XG4rXHRcdFx0XHRmY2xvc2UoZik7XG4rXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZmNsb3NlKGYpO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuK3tcbitcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4rXHRcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcbitcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbitcdCk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4rXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4rXHRcdFx0XHRcdCAgICAgIFx1MDAyNm9wdHMpLCBcInByb2R1Y2UgcmVjb3JkXCIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIEFTU0VSVF9PSyhza2VsLVx1MDAzZWJzcy1cdTAwM2VvdXRwdXRfZXJyLCBcInJpbmdidWYgb3V0cHV0XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHRpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcImNvbnN1bWVyIHBvc2l0aW9uXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19qc29uKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpXG4re1xuK1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuK1x0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xuK1xuK1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4rXHR3aGlsZSAoKnNyYykge1xuK1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAnXCInKVxuK1x0XHRcdHF1b3RlZCA9ICFxdW90ZWQ7XG4rXHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcXFxcJztcbitcdFx0c3JjKys7XG4rXHR9XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJKU09OIHJlY29yZHNcIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoY29uc3QgY2hhciAqZm9ybWF0LCBib29sIGlkbGUsIGludCBzaWdubywgYm9vbCBwaW5uZWQpXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xuK1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuK1x0aW50IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCksIGZkO1xuK1x0Y2hhciBwaW5fZGlyW10gPSBcIi9zeXMvZnMvYnBmL2JwZnRvb2xfcmluZ2J1Zl9YWFhYWFhcIjtcbitcdGNoYXIgcGluX3BhdGhbc2l6ZW9mKHBpbl9kaXIpICsgc2l6ZW9mKFwiL21hcFwiKV07XG4rXHRib29sIGRpcl9jcmVhdGVkID0gZmFsc2UsIG1hcF9waW5uZWQgPSBmYWxzZTtcbitcdGNoYXIgb3V0cHV0WzQwOTZdO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFwibG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmKTtcbitcdGlmIChwaW5uZWQpIHtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKG1rZHRlbXAocGluX2RpciksIFwiY3JlYXRlIHBpbiBkaXJlY3RvcnlcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGRpcl9jcmVhdGVkID0gdHJ1ZTtcbitcdFx0c25wcmludGYocGluX3BhdGgsIHNpemVvZihwaW5fcGF0aCksIFwiJXMvbWFwXCIsIHBpbl9kaXIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqX3BpbihmZCwgcGluX3BhdGgpLCBcInBpbiByaW5nYnVmXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRtYXBfcGlubmVkID0gdHJ1ZTtcbitcdH1cbitcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuK1x0aWYgKCFBU1NFUlRfTkVRKHBvc2l0aW9uLCBNQVBfRkFJTEVELCBcImNvbnN1bWVyIG1tYXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFpZGxlIFx1MDAyNlx1MDAyNiAoIWVtaXRfcmVjb3JkKHNrZWwsIDApIHx8ICFlbWl0X3JlY29yZChza2VsLCAxKSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGZvcm1hdCwgcGlubmVkID8gcGluX3BhdGggOiBOVUxMLFxuK1x0XHRcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUpIHtcbitcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4rXHRcdGlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdFx0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4rXHRcdFx0ICAgICAgIFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCIpIHx8XG4rXHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmIChmb3JtYXQgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZm9ybWF0LCBcIi1wXCIpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCJbXVxcblwiIDpcbitcdFx0XHQgICAgIFwiW3tcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJzaXplXFxcIjogMixcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJkYXRhXFxcIjogWzAsMjU1XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH0se1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiA1LFxcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcImRhdGFcXFwiOiBbMSwyLDMsNCw1XFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH0se1xcblwiXG4rXHRcdFx0ICAgICBcIiAgICAgICAgXFxcInNpemVcXFwiOiAxNyxcXG5cIlxuK1x0XHRcdCAgICAgXCIgICAgICAgIFxcXCJkYXRhXFxcIjogWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXFxuXCJcbitcdFx0XHQgICAgIFwiICAgICAgICBdXFxuXCJcbitcdFx0XHQgICAgIFwiICAgIH1cXG5cIlxuK1x0XHRcdCAgICAgXCJdXFxuXCIsIFwicHJldHR5IEpTT04gcmVjb3Jkc1wiKTtcbitcdGVsc2UgaWYgKGZvcm1hdClcbitcdFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcIltdXCIgOlxuK1x0XHRcdCAgIFwiW3tcXFwic2l6ZVxcXCI6MixcXFwiZGF0YVxcXCI6WzAsMjU1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6NSxcXFwiZGF0YVxcXCI6WzEsMiwzLDQsNV19LFwiXG4rXHRcdFx0ICAgXCJ7XFxcInNpemVcXFwiOjE3LFxcXCJkYXRhXFxcIjpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCJcbitcdFx0XHQgICBcIjI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCIpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCJcIiA6XG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDIgPT09PT1cXG4wMCBmZlxcblwiXG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDUgPT09PT1cXG4wMSAwMiAwMyAwNCAwNVxcblwiXG4rXHRcdFx0ICAgICBcIj09IHNpemU6IDE3ID09PT09XFxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgIFwiXG4rXHRcdFx0ICAgICBcIjE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXFxuMjBcXG5cIiwgXCJwbGFpbiByZWNvcmRzXCIpO1xuK291dDpcbitcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuK1x0aWYgKHBvc2l0aW9uICE9IE1BUF9GQUlMRUQpXG4rXHRcdG11bm1hcChwb3NpdGlvbiwgcGFnZV9zaXplKTtcbitcdGlmIChtYXBfcGlubmVkKVxuK1x0XHRBU1NFUlRfT0sodW5saW5rKHBpbl9wYXRoKSwgXCJ1bnBpbiByaW5nYnVmXCIpO1xuK1x0aWYgKGRpcl9jcmVhdGVkKVxuK1x0XHRBU1NFUlRfT0socm1kaXIocGluX2RpciksIFwicmVtb3ZlIHBpbiBkaXJlY3RvcnlcIik7XG4rXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxuK3tcbitcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuK1x0dW5zaWduZWQgbG9uZyBsb25nIHNlY29uZHMsIG5hbm9zZWNvbmRzO1xuK1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbitcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xuK1x0aW50IG5yX2NwdXMsIGNwdSwgaW5kZXgsIG9mZnNldCA9IDAsIGksIHVzZWQgPSAwLCBmaWVsZHM7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbitcbitcdG5yX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbitcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwicG9zc2libGUgY3B1c1wiKSlcbitcdFx0cmV0dXJuO1xuK1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwib3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFwibG9hZFwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYpLCBOVUxMLFxuK1x0XHRcdCAgICBOVUxMLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkgfHxcbitcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LyogT25lIGxhcmdlIHJlY29yZCBmbHVzaGVzIHRoZSBleGlzdGluZyBidWZmZXJlZCBwZXJmIG91dHB1dCBjYWxsYmFjay4gKi9cbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbitcdFx0ICAgICAgIFwicGVyZiByZWNvcmQgb3V0cHV0XCIpIHx8XG4rXHQgICAgIUFTU0VSVF9UUlVFKHBmZC5yZXZlbnRzIFx1MDAyNiBQT0xMSU4sIFwicGVyZiBvdXRwdXQgcmVhZGFibGVcIikgfHxcbitcdCAgICAhY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZpZWxkcyA9IHNzY2FuZihvdXRwdXQsIFwiPT0gQCVsbHUuJWxsdSBDUFU6ICVkIGluZGV4OiAlZCA9PT09PVxcbiVuXCIsXG4rXHRcdFx0XHUwMDI2c2Vjb25kcywgXHUwMDI2bmFub3NlY29uZHMsIFx1MDAyNmNwdSwgXHUwMDI2aW5kZXgsIFx1MDAyNm9mZnNldCk7XG4rXHRpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsIFwicGVyZiBoZWFkZXJcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKG9mZnNldCwgMCwgXCJwZXJmIHBheWxvYWQgb2Zmc2V0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9HVChzZWNvbmRzICogMTAwMDAwMDAwMFVMTCArIG5hbm9zZWNvbmRzLCAwLCBcInBlcmYgdGltZXN0YW1wXCIpO1xuK1x0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXCIpO1xuK1x0QVNTRVJUX0dFKGNwdSwgMCwgXCJwZXJmIGNwdVwiKTtcbitcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFwicGVyZiBjcHUgcmFuZ2VcIik7XG4rXHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXCJwZXJmIGluZGV4XCIpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZW9mKHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZXBlcmZfcGF5bG9hZCk7IGkrKykge1xuK1x0XHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFwiXCIgOiAhKGkgJSAxNikgPyBcIlxcblwiIDpcbitcdFx0XHRcdFx0IShpICUgOCkgPyBcIiAgXCIgOiBcIiBcIjtcbitcbitcdFx0dXNlZCArPSBzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLFxuK1x0XHRcdFx0IFwiJXMlMDJ4XCIsIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApO1xuK1x0fVxuK1x0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXCJcXG5cIik7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0ICsgb2Zmc2V0LCBleHBlY3RlZCwgXCJwZXJmIHBheWxvYWRcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXG4re1xuK1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4rXHRib29sIHJpbmcgPSB0eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGIHx8IHR5cGUgPT0gQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRjtcbitcdGNvbnN0IGNoYXIgKmV4cGVjdGVkID0gb3B0aW9uID9cbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcIn1cIiA6XG4rXHRcdFwie1xcXCJlcnJvclxcXCI6XFxcIm1hcCBpcyBub3QgYSBwZXJmIGV2ZW50IGFycmF5IG9yIHJpbmcgYnVmZmVyXFxcIn1cIjtcbitcdGNoYXIgb3V0cHV0WzQwOTZdO1xuK1x0aW50IGZkO1xuK1xuK1x0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcbitcdFx0XHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcImNyZWF0ZSBtYXBcIikpXG4rXHRcdHJldHVybjtcbitcdGlmIChjb25zdW1lcl9zdGFydChcdTAwMjZjaGlsZCwgZmQsIGpzb24gPyBcIi1qXCIgOiBOVUxMLCBOVUxMLCBvcHRpb24sIHBhaXIsIHRydWUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7XG4rXHRcdGlmIChqc29uKVxuK1x0XHRcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XG4rXHRcdGVsc2VcbitcdFx0XHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFwiZXJyb3IgZGlhZ25vc3RpY1wiKTtcbitcdH1cbitcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuK1x0Y2xvc2UoZmQpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJwZXJmX2V2ZW50X2FycmF5XCIpKVxuK1x0XHR0ZXN0X3BlcmZfY29uc3VtZXIoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGxhaW5cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgZmFsc2UsIFNJR0lOVCwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJqc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgZmFsc2UsIFNJR1RFUk0sIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicHJldHR5X2pzb25cIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoXCItcFwiLCBmYWxzZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9wbGFpblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihOVUxMLCBmYWxzZSwgU0lHVEVSTSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgZmFsc2UsIFNJR0lOVCwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBpbm5lZF9wcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIGZhbHNlLCBTSUdURVJNLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaWRsZV9zaWdpbnRcIikpXG4rXHRcdHRlc3RfY29uc3VtZXIoTlVMTCwgdHJ1ZSwgU0lHSU5ULCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lndGVybV9qc29uXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKFwiLWpcIiwgdHJ1ZSwgU0lHVEVSTSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ2ludF9wcmV0dHlfanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcihcIi1wXCIsIHRydWUsIFNJR0lOVCwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfYXJyYXlcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X3VzZXJfcmluZ2J1ZlwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdVwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9pbmRleFwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiaW5kZXhcIiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2NwdV9pbmRleFwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIHRydWUsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGLCBOVUxMLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVfaW5kZXhfanNvblwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwiY3B1XCIsIHRydWUsIHRydWUpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgKzEsNDcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTtcbit9IHJpbmdidWYgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSk7XG4rXHRfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpO1xuK1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbit9IHBlcmZidWYgU0VDKFwiLm1hcHNcIik7XG4rXG4rLypcbisgKiBJbmNsdWRlIHRoZSB1MzIgcmF3IHNpemUgaW4gcGVyZidzIDgtYnl0ZSBhbGlnbm1lbnQgdG8gYXZvaWQgcGFkZGluZy5cbisgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbisgKi9cbitjb25zdCB1bnNpZ25lZCBjaGFyIHBlcmZfcGF5bG9hZFs0MDkyXSA9IHsgMHgwMCwgMHhmZiB9O1xuK1xuK2ludCByZWNvcmQ7XG4raW50IG91dHB1dF9lcnI7XG4rXG4rU0VDKFwic29ja2V0XCIpXG4raW50IHByb2R1Y2Uoc3RydWN0IF9fc2tfYnVmZiAqc2tiKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuK1x0dW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9O1xuK1x0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xuK1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuK1x0XHQweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLFxuK1x0fTtcbitcbitcdGlmIChyZWNvcmQgPT0gMClcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XG4rXHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCBzZWNvbmQsIHNpemVvZihzZWNvbmQpLCAwKTtcbitcdGVsc2UgaWYgKHJlY29yZCA9PSAyKVxuK1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbitcdGVsc2VcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsIFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxuK1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjo0MTo0Mi4xMDg5NDgxMTNaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1NDQyOTIwNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRXZhbHVhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyB0b3VjaGluZyBmaWxlcyByZWxhdGVkIHRvIGBicGZ0b29sYCB3aXRoaW4gYHRvb2xzL2JwZi9gIGFuZCBhZGRpbmcgc2VsZnRlc3RzIHVuZGVyIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY2hlY2sgaWYgdGhlc2UgY2hhbmdlcyB3YXJyYW50IGZ1enppbmcuIFRoZSBrZXkgaXMgd2hldGhlciB0aGV5IGltcGFjdCB0aGUga2VybmVsIGl0c2VsZi5cblxuRmlyc3QsIGxldCdzIGNvbmZpcm0gdGhlIGZpbGVzIGludm9sdmVkOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLlxuXG5Ob3csIGFjY29yZGluZyB0byBTZWN0aW9uIDIgb2YgdGhlIGluc3RydWN0aW9ucywgSSBzaG91bGQgb25seSByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAgaWYgKmFsbCogbW9kaWZpZWQgY29kZSBmYWxscyB1bmRlciBzcGVjaWZpYyBuZWdhdGl2ZSBjcml0ZXJpYTogZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHVzZXItc3BhY2UgdG9vbHMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgdGhhdCBkbyAqbm90KiBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAoYHZtbGludXhgKSBvciBrZXJuZWwgbW9kdWxlcy5cblxuTG9va2luZyBhdCB0aGUgZmlsZSBwYXRocywgdGhleSdyZSBhbGwgZmlybWx5IHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IOKAkyBgYnBmdG9vbGAgYW5kIGBicGZgIHNlbGZ0ZXN0cy4gVGhlcmUncyBub3RoaW5nIGluIGBrZXJuZWwvYCwgYG1tL2AsIGBuZXQvYCwgYGZzL2AsIGBkcml2ZXJzL2AsIGBhcmNoL2AsIG9yIHRvdWNoaW5nIGFueSBgaW5jbHVkZS9saW51eC9gIGhlYWRlcnMuIFRoaXMgaXMgYSBjbGVhciBpbmRpY2F0b3IuXG5cbkxldCdzIGRvdWJsZS1jaGVjayBhZ2FpbiwganVzdCB0byBiZSBzdXJlOiBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCBgdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xgLCBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNgLiBZZXAsIGFsbCB1bmRlciB0aGUgYHRvb2xzL2AgdW1icmVsbGEuXG5cblNvLCB0aGlzIHBhdGNoIGlzIHNvbGVseSBtb2RpZnlpbmcgdXNlci1zcGFjZSB0b29scyAoYGJwZnRvb2xgKSBhbmQgaXRzIGFzc29jaWF0ZWQgc2VsZnRlc3RzLiBObyBpbXBhY3Qgb24gdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLiBUaGVyZWZvcmUsIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBmdXp6aW5nLlxuXG5NeSBjb25jbHVzaW9uIGlzOiBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuTm93LCBJIG5lZWQgdG8gbWFrZSBzdXJlIEknbSBzZXR0aW5nIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnMgY29ycmVjdGx5OlxuLSBgV29ydGhGdXp6aW5nYDogZmFsc2Vcbi0gYFJlYXNvbmluZ2A6IFRoZSBjaGFuZ2VzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHRvb2xzIGFuZCBicGYgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLywgd2l0aCBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy5cbi0gYEZvY3VzU3ltYm9sc2A6IFtdXG4tIGBFbmFibGVDb25maWdzYDogW11cblxuVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTI0LCJPdXRwdXRUb2tlbnMiOjEwMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQ3LjU1MTg3NDQ5N1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZSBjb2RlIGlzIHRvdWNoZWQsIHNvIGl0IGlzIG5vdCByZWxldmFudCBmb3Iga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIGFuZCBCUEYgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlIGNvZGUgaXMgdG91Y2hlZCwgc28gaXQgaXMgbm90IHJlbGV2YW50IGZvciBrZXJuZWwgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjQxOjQ3LjU1MTg5NDQ1N1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow6bvx5[1] Phase: Running StartedAt: 2026-09-07 06:41:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6bvx5[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 06:41:58 +0000 UTC FinishedAt: 2026-09-07 06:42:03 +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,}