Name: series-workflow2v2tj Phase: Failed StartedAt: 2026-09-14 13:11:23 +0000 UTC FinishedAt: 2026-09-14 13:14:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2v2tj[0] Phase: Succeeded StartedAt: 2026-09-14 13:11:23 +0000 UTC FinishedAt: 2026-09-14 13:14:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2v2tj[0].run-triage Phase: Succeeded StartedAt: 2026-09-14 13:11:23 +0000 UTC FinishedAt: 2026-09-14 13:14:24 +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+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTM6MTM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA1ZWJlNDMxZmNmMTkyYTBiOTQyMjliNTRkOWZhYjUwZWQwOTZmMzhiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0IGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG5pbmRleCA0OTg4YzMyZGY0YmY4Li5mYjdmOGJhY2E5NzBjIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcbkBAIC02NDg1LDcgJiM0Mzs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcbi06QXJjaGl0ZWN0dXJlczogbm9uZVxuJiM0Mzs6QXJjaGl0ZWN0dXJlczogeDg2LCBzMzkwLCBhcm02NFxuIDpUeXBlOiB2Y3B1IGlvY3RsXG4gOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KVxuIDpSZXR1cm5zOiAwIGlmIGF0IGxlYXN0IG9uZSBwYWdlIGlzIHByb2Nlc3NlZCwgXHUwMDNjIDAgb24gZXJyb3JcbkBAIC02NDkzLDEyICYjNDM7NjQ5MywxNCBAQCBTZWUgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuXG4gRXJyb3JzOlxuIFxuICAgPT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7ICBFQUdBSU4gICAgIEEgcmFjZSBvY2N1cnJlZCBiZWZvcmUgcHJvZ3Jlc3Mgd2FzIG1hZGUsIGJ1dCBhIHJldHJ5IG1heSBzdWNjZWVkLlxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxuICAgICAgICAgICAgICBwYWdlIGFsaWduZWQsIGNhdXNlcyBhbiBvdmVyZmxvdywgb3Igc2l6ZSBpcyB6ZXJvKSwgb3IgdGhlIFZNXG4gICAgICAgICAgICAgIGlzIFVDT05UUk9MIChzMzkwKS5cbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXG4gICBFSU5UUiAgICAgIEFuIHVubWFza2VkIHNpZ25hbCBpcyBwZW5kaW5nIGFuZCBubyBwYWdlIHdhcyBwcm9jZXNzZWQuXG4gICBFRkFVTFQgICAgIFRoZSBwYXJhbWV0ZXIgYWRkcmVzcyB3YXMgaW52YWxpZC5cbiYjNDM7ICBFSFdQT0lTT04gIEEgcG9pc29uZWQgaG9zdCBwYWdlIHdhcyBlbmNvdW50ZXJlZC5cbiAgIEVPUE5PVFNVUFAgTWFwcGluZyBtZW1vcnkgZm9yIGEgR1BBIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZVxuICAgICAgICAgICAgICBoeXBlcnZpc29yLCBhbmQvb3IgZm9yIHRoZSBjdXJyZW50IHZDUFUgc3RhdGUvbW9kZS5cbiAgIEVJTyAgICAgICAgdW5leHBlY3RlZCBlcnJvciBjb25kaXRpb25zIChhbHNvIGNhdXNlcyBhIFdBUk4pXG5AQCAtNjUxOCw3ICYjNDM7NjUyMCwxNyBAQCBFcnJvcnM6XG4gS1ZNX1BSRV9GQVVMVF9NRU1PUlkgcG9wdWxhdGVzIEtWTSYjMzk7cyBzdGFnZS0yIHBhZ2UgdGFibGVzIHVzZWQgdG8gbWFwIG1lbW9yeVxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXG4gc3RhZ2UtMiByZWFkIHBhZ2UgZmF1bHQsIGUuZy4gZmF1bHRzIGluIG1lbW9yeSBhcyBuZWVkZWQsIGJ1dCBkb2VzbiYjMzk7dCBicmVha1xuLUNvVy4gIE9uIHg4NiwgS1ZNIGRvZXMgbm90IG1hcmsgYW55IG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEUgYXMgQWNjZXNzZWQuXG4mIzQzO0NvVy4gIE9uIGFybTY0LCBLVk0gbWFya3MgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURXMgYXMgQWNjZXNzZWQsIGFzIGl0XG4mIzQzO2RvZXMgZm9yIGFueSBzdGFnZS0yIGZhdWx0LCBidXQgbGVhdmVzIHRoZSBBY2Nlc3NlZCBzdGF0ZSBvZiBleGlzdGluZyBQVEVzXG4mIzQzO3VuY2hhbmdlZC4gIE9uIHg4NiwgS1ZNIGRvZXMgbm90IG1hcmsgYW55IG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEUgYXNcbiYjNDM7QWNjZXNzZWQsIGFuZCBmb3IgczM5MCBpdCBpcyBub3QgYXBwbGljYWJsZS5cbiYjNDM7XG4mIzQzO09uIGFybTY0LCBhIEdQQSBpcyBpbnRlcnByZXRlZCBhcyBhbiBJUEEsIGFuZCBuZXZlciBpbnRlcnByZXRlZCBhcyB0aGUgSVBBXG4mIzQzO29mIGEgbmVzdGVkIGd1ZXN0LiBQcmUtZmF1bHRpbmcgb25seSBwb3B1bGF0ZXMgY2Fub25pY2FsIHN0YWdlIDIgcGFnZVxuJiM0Mzt0YWJsZXMuXG4mIzQzO1xuJiM0MztUaGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFybTY0IGlmIHRoZSBwcm90ZWN0ZWQgS1ZNIChwS1ZNKSBmZWF0dXJlXG4mIzQzO2lzIGVuYWJsZWQuXG4gXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXG4gcHJpdmF0ZSBndWVzdCBtZW1vcnkgYmVmb3JlIHRoZSBndWVzdCBpcyAmIzM5O2ZpbmFsaXplZCYjMzk7L21lYXN1cmVkLCB0aGlzIGlvY3RsXG5AQCAtNjUzMyw3ICYjNDM7NjU0NSw3IEBAIFdoZW4gdGhlIGlvY3RsIHJldHVybnMsIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFx1MDAzZSAwIG9uIHJldHVybiwgdGhlIGNhbGxlciBjYW4ganVzdCBpc3N1ZVxuIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LlxuIFxuLVNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuJiM0MztPbiB4ODYsIHNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuIGFyZSBpbmRleGVkIGJ5IHZpcnR1YWwgYWRkcmVzcyBvciBuZXN0ZWQgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcy5cbiBDYWxsaW5nIHRoaXMgaW9jdGwgd2hlbiB0aGUgZ3Vlc3QgaXMgdXNpbmcgc2hhZG93IHBhZ2UgdGFibGVzIChmb3JcbiBleGFtcGxlIGJlY2F1c2UgaXQgaXMgcnVubmluZyBhIG5lc3RlZCBndWVzdCB3aXRoIG5lc3RlZCBwYWdlIHRhYmxlcylcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuaW5kZXggZjgxNmY1ZDc3ZjFhNS4uOWMwMjA1OTgzZDlhOCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmhcbkBAIC00MzcsNiAmIzQzOzQzNyw1MCBAQFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xuICNpbmNsdWRlIFx1MDAzY2FzbS90eXBlcy5oXHUwMDNlXG4gXG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTggZXNyX2dldF9lYyh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBFU1JfRUx4X0VDKGVzcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfdHJhcF9pc19pYWJ0KHVuc2lnbmVkIGxvbmcgZXNyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9nZXRfZWMoZXNyKSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zMXB0dyh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfUzFQVFc7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cbiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX3dyaXRlKHVuc2lnbmVkIGxvbmcgZXNyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9XTlI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfZGFidF9pc19jbSh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfQ007XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZXNyX3RyYXBfaXNfaWFidChlc3IpIFx1MDAyNlx1MDAyNiAhZXNyX2FidF9pc19zMXB0dyhlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zZWEodW5zaWduZWQgbG9uZyBlc3IpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpIHtcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX1NFQV9UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUFfVFRXKDMpOlxuJiM0MztcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZXNyX2Jya19jb21tZW50KHVuc2lnbmVkIGxvbmcgZXNyKVxuIHtcbiBcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfQlJLNjRfSVNTX0NPTU1FTlRfTUFTSztcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcbmluZGV4IGEzYzE5MjhiZGY3NDMuLmEzYjI3MjI2NTU1NDMgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuQEAgLTQxMSwxOCAmIzQzOzQxMSwxMyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9kYWJ0X2dldF9yZChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3MxdHcoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1MxUFRXKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2FidF9pc19zMXB0dyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1dOUjtcbi19XG4tXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X0NNKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2RhYnRfaXNfd3JpdGUoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGt2bV92Y3B1X2RhYnRfZ2V0X2FzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00MzgsMTcgJiM0Mzs0MzMsMTIgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaWxfaXMzMmJpdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHVcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRyZXR1cm4gRVNSX0VMeF9FQyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2dldF9lYyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfaWFidChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkgXHUwMDI2XHUwMDI2ICFrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpO1xuJiM0MztcdHJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00NjgsMjYgJiM0Mzs0NTgsOSBAQCBib29sIGt2bV92Y3B1X3RyYXBfaXNfdHJhbnNsYXRpb25fZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0cmV0dXJuIGVzcl9mc2NfaXNfdHJhbnNsYXRpb25fZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmVcbi11NjQga3ZtX3ZjcHVfdHJhcF9nZXRfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbi17XG4tXHR1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7XG4tXG4tXHRCVUdfT04oIWVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChlc3IpKTtcbi1cdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChlc3IgXHUwMDI2IEVTUl9FTHhfRlNDX0xFVkVMKSk7XG4tfVxuLVxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9hYnRfaXNzZWEoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHN3aXRjaCAoa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQodmNwdSkpIHtcbi1cdGNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOlxuLVx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKTpcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHRkZWZhdWx0OlxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4mIzQzO1x0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00OTYsOSAmIzQzOzQ2OSw5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGt2bV92Y3B1X3N5c19nZXRfcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0cmV0dXJuIEVTUl9FTHhfU1lTNjRfSVNTX1JUKGVzcik7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZXNyX2FidF9pc193cml0ZV9mYXVsdCh1bnNpZ25lZCBsb25nIGVzcilcbiB7XG4tXHRpZiAoa3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KSkge1xuJiM0MztcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0LypcbiBcdFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcbiBcdFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXG5AQCAtNTExLDEzICYjNDM7NDg0LDE4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQgKiBmaXJzdCksIHRoZW4gYSBwZXJtaXNzaW9uIGZhdWx0IHRvIGFsbG93IHRoZSBmbGFnc1xuIFx0XHQgKiB0byBiZSBzZXQuXG4gXHRcdCAqL1xuLVx0XHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpO1xuJiM0MztcdFx0cmV0dXJuIGVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChlc3IpO1xuIFx0fVxuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSlcbiYjNDM7XHRpZiAoZXNyX3RyYXBfaXNfaWFidChlc3IpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4ga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKHZjcHUpO1xuJiM0MztcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga3ZtX2lzX3dyaXRlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X21waWRyX2FmZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcbkBAIC04NTksNiAmIzQzOzg1OSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXG4gICogQGFkZHI6XHRJbnB1dCBhZGRyZXNzIGZvciB0aGUgc3RhcnQgb2YgdGhlIHdhbGsuXG4gICogQHB0ZXA6XHRQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXRyaWV2ZWQgUFRFLlxuICAqIEBsZXZlbDpcdFBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGxldmVsIG9mIHRoZSByZXRyaWV2ZWQgUFRFLlxuJiM0MzsgKiBAZmxhZ3M6XHRGbGFncyB0byBjb250cm9sIHRoZSBwYWdlLXRhYmxlIHdhbGtcbiYjNDM7ICpcdFx0KHNlZSBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4KS5cbiAgKlxuICAqIFRoZSBvZmZzZXQgb2YgQGFkZHIgd2l0aGluIGEgcGFnZSBpcyBpZ25vcmVkLlxuICAqXG5AQCAtODY5LDcgJiM0Mzs4NzEsOCBAQCBpbnQga3ZtX3BndGFibGVfd2FsayhzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsIHU2NCBzaXplLFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXG4gICovXG4gaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkcixcbi1cdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpO1xuJiM0MztcdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsXG4mIzQzO1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xuIFxuIC8qKlxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG5pbmRleCBiZWVhMDBlNjkzYTBhLi40ZDZlNTc2NWU5ZTU2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmhcbkBAIC00NCw5ICYjNDM7NDQsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3Brdm1fZXh0X2FsbG93ZWQoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGV4dClcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fUFRSQVVUSF9HRU5FUklDOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fTVRFOlxuLVx0XHRyZXR1cm4gZmFsc2U7XG4gXHRjYXNlIEtWTV9DQVBfQVJNX0VBR0VSX1NQTElUX0NIVU5LX1NJWkU6XG4gXHRjYXNlIEtWTV9DQVBfQVJNX1NVUFBPUlRFRF9CTE9DS19TSVpFUzpcbiYjNDM7XHRjYXNlIEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWTpcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuICFrdm0gfHwgIWt2bV92bV9pc19wcm90ZWN0ZWQoa3ZtKTtcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZ1xuaW5kZXggNDQ5MTU0ZjlhNDg1Mi4uNzEyMzMwNjhiN2NiNiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbkBAIC0zNyw2ICYjNDM7MzcsNyBAQCBtZW51Y29uZmlnIEtWTVxuIFx0c2VsZWN0IFNDSEVEX0lORk9cbiBcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xuIFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuJiM0MztcdHNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZXG4gXHRoZWxwXG4gXHQgIFN1cHBvcnQgaG9zdGluZyB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcy5cbiBcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9hcm0uYyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jXG5pbmRleCBjY2FlODJjMTI0MmJjLi41OGFjNzBmMzFkODRlIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vYXJtLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jXG5AQCAtMzkzLDYgJiM0MzszOTMsNyBAQCBpbnQga3ZtX3ZtX2lvY3RsX2NoZWNrX2V4dGVuc2lvbihzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgZXh0KVxuIFx0Y2FzZSBLVk1fQ0FQX0NPVU5URVJfT0ZGU0VUOlxuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9XUklUQUJMRV9JTVBfSURfUkVHUzpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fU0VBX1RPX1VTRVI6XG4mIzQzO1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHIgPSAxO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcyOlxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXG5pbmRleCAzOWFhODkxMWY2MmMxLi4yM2E1NzMxMmI5ODFiIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuQEAgLTUzMiw3ICYjNDM7NTMyLDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9hZGp1c3RfcmFuZ2UodTY0IGFkZHIsIHN0cnVjdCBrdm1fbWVtX3JhbmdlICpyYW5nZSlcbiBcdGludCByZXQ7XG4gXG4gXHRoeXBfYXNzZXJ0X2xvY2tfaGVsZChcdTAwMjZob3N0X21tdS5sb2NrKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCk7XG4mIzQzO1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtOTEwLDcgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxuIFx0czggbGV2ZWw7XG4gXHRpbnQgcmV0O1xuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuJiM0MztcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXHRpZiAoZ3Vlc3RfcHRlX2lzX3BvaXNvbmVkKHB0ZSkpXG5AQCAtOTU5LDcgJiM0Mzs5NTksNyBAQCBpbnQgX19wa3ZtX3ZjcHVfaW5fcG9pc29uX2ZhdWx0KHN0cnVjdCBwa3ZtX2h5cF92Y3B1ICpoeXBfdmNwdSlcbiBcdGlwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIoXHUwMDI2aHlwX3ZjcHUtXHUwMDNldmNwdSkpO1xuIFxuIFx0Z3Vlc3RfbG9ja19jb21wb25lbnQodm0pO1xuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuJiM0MztcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gdW5sb2NrO1xuIFxuQEAgLTEzMTUsNyAmIzQzOzEzMTUsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2dldF9ndWVzdF9pbmZvKHBoeXNfYWRkcl90IHBoeXMsIHN0cnVjdCBwa3ZtX2h5cF92bSAqKnZtLFxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFx0fVxuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBwaHlzLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwsIDApO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNTQ0LDcgJiM0MzsxNTQ0LDcgQEAgc3RhdGljIGludCBfX2NoZWNrX2hvc3Rfc2hhcmVkX2d1ZXN0KHN0cnVjdCBwa3ZtX2h5cF92bSAqdm0sIHU2NCAqX19waHlzLCB1NjQgaXBcbiBcdHM4IGxldmVsO1xuIFx0aW50IHJldDtcbiBcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZ2bS1cdTAwM2VwZ3QsIGlwYSwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCwgMCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuIFx0aWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbmluZGV4IGI3NGRkNWNlMWVmZDMuLjM0N2VlYzM5NTdkNmEgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jXG5AQCAtMjk4LDEyICYjNDM7Mjk4LDEzIEBAIHN0YXRpYyBpbnQgbGVhZl93YWxrZXIoY29uc3Qgc3RydWN0IGt2bV9wZ3RhYmxlX3Zpc2l0X2N0eCAqY3R4LFxuIH1cbiBcbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxuLVx0XHRcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbClcbiYjNDM7XHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuJiM0MztcdFx0XHQgZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzKVxuIHtcbiBcdHN0cnVjdCBsZWFmX3dhbGtfZGF0YSBkYXRhO1xuIFx0c3RydWN0IGt2bV9wZ3RhYmxlX3dhbGtlciB3YWxrZXIgPSB7XG4gXHRcdC5jYlx0PSBsZWFmX3dhbGtlcixcbi1cdFx0LmZsYWdzXHQ9IEtWTV9QR1RBQkxFX1dBTEtfTEVBRixcbiYjNDM7XHRcdC5mbGFnc1x0PSBmbGFncyB8IEtWTV9QR1RBQkxFX1dBTEtfTEVBRixcbiBcdFx0LmFyZ1x0PSBcdTAwMjZkYXRhLFxuIFx0fTtcbiBcdGludCByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vbW11LmMgYi9hcmNoL2FybTY0L2t2bS9tbXUuY1xuaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL21tdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2t2bS9tbXUuY1xuQEAgLTUsNiAmIzQzOzUsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2FjcGkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbWFuLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaW8uaFx1MDAzZVxuQEAgLTg2Niw3ICYjNDM7ODY3LDcgQEAgc3RhdGljIGludCBnZXRfdXNlcl9tYXBwaW5nX3NpemUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgYWRkcilcbiBcdCAqIElQSS1pbmcgdGhyZWFkcykuXG4gXHQgKi9cbiBcdGxvY2FsX2lycV9zYXZlKGZsYWdzKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCk7XG4mIzQzO1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2cGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcbiBcbiBcdGlmIChyZXQpXG5AQCAtMTU1NCw5ICYjNDM7MTU1NSw5IEBAIHN0YXRpYyB2b2lkICpnZXRfbW11X21lbWNhY2hlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0cmV0dXJuIFx1MDAyNnZjcHUtXHUwMDNlYXJjaC5wa3ZtX21lbWNhY2hlO1xuIH1cbiBcbi1zdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKm1lbWNhY2hlKVxuJiM0MztzdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB2b2lkICptZW1jYWNoZSlcbiB7XG4tXHRpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXModmNwdS1cdTAwM2VhcmNoLmh3X21tdSk7XG4mIzQzO1x0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XG4gXG4gXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuIFx0XHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XG5AQCAtMTYwMywxNSAmIzQzOzE2MDQsNDcgQEAgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHtcbiBcdHN0cnVjdCBrdm1fczJfdHJhbnNcdCpuZXN0ZWQ7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90XHQqbWVtc2xvdDtcbiBcdHVuc2lnbmVkIGxvbmdcdFx0aHZhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0ZXNyO1xuJiM0MztcdHN0cnVjdCBrdm1fczJfbW11XHQqbW11O1xuIH07XG4gXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiYjNDM7c3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbWFwcGluZ19zaXplO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZWVzcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfd3JpdGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGxldmVsO1xuJiM0MztcbiYjNDM7XHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bGV2ZWwgPSBzMmZkLVx1MDAzZWVzciBcdTAwMjYgRVNSX0VMeF9GU0NfTEVWRUw7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4mIzQzO1x0XHQgICAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbiBcdGJvb2wgd3JpdGVfZmF1bHQsIGV4ZWNfZmF1bHQ7XG4tXHRib29sIHBlcm1fZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbiYjNDM7XHRib29sIHBlcm1fZmF1bHQgPSBrdm1fczJfZmF1bHRfaXNfcGVybShzMmZkKTtcbiBcdGVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncyA9IEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEO1xuIFx0ZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QgPSBLVk1fUEdUQUJMRV9QUk9UX1I7XG4tXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VwZ3Q7XG4mIzQzO1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHR1bnNpZ25lZCBsb25nIG1tdV9zZXE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG5AQCAtMTYyMiw3ICYjNDM7MTY1NSw3IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXG4gXHRpZiAoIXBlcm1fZmF1bHQpIHtcbiBcdFx0bWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSk7XG4tXHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUsIG1lbWNhY2hlKTtcbiYjNDM7XHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZW1tdSwgbWVtY2FjaGUpO1xuIFx0XHRpZiAocmV0KVxuIFx0XHRcdHJldHVybiByZXQ7XG4gXHR9XG5AQCAtMTYzMiw4ICYjNDM7MTY2NSw4IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRlbHNlXG4gXHRcdGdmbiA9IHMyZmQtXHUwMDNlZmF1bHRfaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuLVx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbiYjNDM7XHR3cml0ZV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKTtcbiYjNDM7XHRleGVjX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCk7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0Uod3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2IGV4ZWNfZmF1bHQpO1xuIFxuQEAgLTE2ODcsNyAmIzQzOzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGlmICgocHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcdTAwMjZcdTAwMjYgIXJldClcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdmbik7XG4gXG4tXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xuJiM0MztcdGlmIChyZXQgPT0gLUVBR0FJTilcbiYjNDM7XHRcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xuJiM0MztcbiYjNDM7XHRpZiAocmVzdWx0IFx1MDAyNlx1MDAyNiAhcmV0KVxuJiM0MztcdFx0cmVzdWx0LVx1MDAzZW1hcHBpbmdfc2l6ZSA9IFBBR0VfU0laRTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RydWN0IGt2bV9zMl9mYXVsdF92bWFfaW5mbyB7XG5AQCAtMTcwOSw3ICYjNDM7MTc0OCw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuIHtcbiBcdHVuc2lnbmVkIGludCBmbGFncyA9IEZPTExfSFdQT0lTT04gfCBGT0xMX0xPTkdURVJNIHwgRk9MTF9XUklURTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IHMyZmQtXHUwMDNldmNwdTtcbi1cdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gdmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VwZ3Q7XG4mIzQzO1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiBcdHZvaWQgKmh5cF9tZW1jYWNoZTtcbkBAIC0xNzE3LDcgJiM0MzsxNzU2LDcgQEAgc3RhdGljIGludCBwa3ZtX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRpbnQgcmV0O1xuIFxuIFx0aHlwX21lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZSh2Y3B1KTtcbi1cdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZSh2Y3B1LCBoeXBfbWVtY2FjaGUpO1xuJiM0MztcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZW1tdSwgaHlwX21lbWNhY2hlKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFxuQEAgLTE4NDAsMTEgJiM0MzsxODc5LDYgQEAgc3RhdGljIHNob3J0IGt2bV9zMl9yZXNvbHZlX3ZtYV9zaXplKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdHJldHVybiB2bWFfc2hpZnQ7XG4gfVxuIFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbi17XG4tXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSk7XG4tfVxuLVxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXG4ge1xuQEAgLTE5MTAsMTMgJiM0MzsxOTQ0LDExIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X3Bpbl9wZm4oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuIFx0czJ2aS1cdTAwM2VwZm4gPSBfX2t2bV9mYXVsdGluX3BmbihzMmZkLVx1MDAzZW1lbXNsb3QsIGdldF9jYW5vbmljYWxfZ2ZuKHMyZmQsIHMydmkpLFxuLVx0XHRcdFx0ICAgICAga3ZtX2lzX3dyaXRlX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSkgPyBGT0xMX1dSSVRFIDogMCxcbiYjNDM7XHRcdFx0XHQgICAgICBrdm1fczJfZmF1bHRfaXNfd3JpdGUoczJmZCkgPyBGT0xMX1dSSVRFIDogMCxcbiBcdFx0XHRcdCAgICAgIFx1MDAyNnMydmktXHUwMDNlbWFwX3dyaXRhYmxlLCBcdTAwMjZzMnZpLVx1MDAzZXBhZ2UpO1xuIFx0aWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS1cdTAwM2VwZm4pKSkge1xuLVx0XHRpZiAoczJ2aS1cdTAwM2VwZm4gPT0gS1ZNX1BGTl9FUlJfSFdQT0lTT04pIHtcbi1cdFx0XHRrdm1fc2VuZF9od3BvaXNvbl9zaWduYWwoczJmZC1cdTAwM2VodmEsIF9fZmZzKHMydmktXHUwMDNldm1hX3BhZ2VzaXplKSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbiYjNDM7XHRcdGlmIChzMnZpLVx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSFdQT0lTT047XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTE5NjgsNyAmIzQzOzIwMDAsNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG4gXG4tXHRpZiAoa3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSkgXHUwMDI2XHUwMDI2IHMydmktXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXG4mIzQzO1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuIFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHQvKlxuQEAgLTE5NzcsNyAmIzQzOzIwMDksNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIFx0ICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0XG4gXHQgKiB0aGUgZmF1bHQgYmFjayB0byB0aGUgZ3Vlc3QuXG4gXHQgKi9cbi1cdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC1cdTAwM2V2Y3B1KSkpIHtcbiYjNDM7XHRpZiAoZXNyX2ZzY19pc19leGNsX2F0b21pY19mYXVsdChzMmZkLVx1MDAzZWVzcikpIHtcbiBcdFx0a3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtXHUwMDNldmNwdSwga3ZtX3ZjcHVfZ2V0X2hmYXIoczJmZC1cdTAwM2V2Y3B1KSk7XG4gXHRcdHJldHVybiAxO1xuIFx0fVxuQEAgLTE5ODYsMTMgJiM0MzsyMDE4LDEzIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfd3JpdGFibGUgXHUwMDI2XHUwMDI2IChzMnZpLVx1MDAzZWRldmljZSB8fFxuIFx0XHRcdFx0ICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4tXHRcdFx0XHQgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSkpXG4mIzQzO1x0XHRcdFx0ICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpKSlcbiBcdFx0KnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9XO1xuIFxuIFx0aWYgKHMyZmQtXHUwMDNlbmVzdGVkKVxuIFx0XHQqcHJvdCA9IGFkanVzdF9uZXN0ZWRfZmF1bHRfcGVybXMoczJmZC1cdTAwM2VuZXN0ZWQsICpwcm90KTtcbiBcbi1cdGlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSlcbiYjNDM7XHRpZiAoa3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCkpXG4gXHRcdCpwcm90IHw9IEtWTV9QR1RBQkxFX1BST1RfWDtcbiBcbiBcdGlmIChzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuQEAgLTIwMTYsNyAmIzQzOzIwNDgsOCBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksXG4gXHRcdFx0ICAgIGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90LFxuLVx0XHRcdCAgICB2b2lkICptZW1jYWNoZSlcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKm1lbWNhY2hlLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdClcbiB7XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcbiBcdGJvb2wgd3JpdGFibGUgPSBwcm90IFx1MDAyNiBLVk1fUEdUQUJMRV9QUk9UX1c7XG5AQCAtMjAyOSwxMyAmIzQzOzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdGludCByZXQ7XG4gXG4gXHRrdm1fZmF1bHRfbG9jayhrdm0pO1xuLVx0cGd0ID0gczJmZC1cdTAwM2V2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXBndDtcbiYjNDM7XHRwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRyZXQgPSAtRUFHQUlOO1xuIFx0aWYgKG1tdV9pbnZhbGlkYXRlX3JldHJ5KGt2bSwgczJ2aS1cdTAwM2VtbXVfc2VxKSlcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFxuLVx0cGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID9cbi1cdFx0XHQgICAgICBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZC1cdTAwM2V2Y3B1KSA6IDApO1xuJiM0MztcdHBlcm1fZmF1bHRfZ3JhbnVsZSA9IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZCk7XG4gXHRtYXBwaW5nX3NpemUgPSBzMnZpLVx1MDAzZXZtYV9wYWdlc2l6ZTtcbiBcdHBmbiA9IHMydmktXHUwMDNlcGZuO1xuIFx0Z2ZuID0gczJ2aS1cdTAwM2VnZm47XG5AQCAtMjA5NiwxNCAmIzQzOzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdwYV90b19nZm4oaXBhKSk7XG4gXHR9XG4gXG4tXHRpZiAocmV0ICE9IC1FQUdBSU4pXG4tXHRcdHJldHVybiByZXQ7XG4tXHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAocmV0ID09IC1FQUdBSU4pXG4mIzQzO1x0XHRyZXR1cm4gcmVzdWx0ID8gcmV0IDogMDtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlc3VsdCBcdTAwMjZcdTAwMjYgIXJldClcbiYjNDM7XHRcdHJlc3VsdC1cdTAwM2VtYXBwaW5nX3NpemUgPSBtYXBwaW5nX3NpemU7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0MztzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuJiM0MztcdGJvb2wgcGVybV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpO1xuIFx0c3RydWN0IGt2bV9zMl9mYXVsdF92bWFfaW5mbyBzMnZpID0ge307XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3Byb3QgcHJvdDtcbiBcdHZvaWQgKm1lbWNhY2hlO1xuQEAgLTIxMjEsNyAmIzQzOzIxNTgsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdG1lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUpO1xuIFx0aWYgKCFwZXJtX2ZhdWx0IHx8IG1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4gXHQgICAgaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpIHtcbi1cdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSwgbWVtY2FjaGUpO1xuJiM0MztcdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNlbW11LCBtZW1jYWNoZSk7XG4gXHRcdGlmIChyZXQpXG4gXHRcdFx0cmV0dXJuIHJldDtcbiBcdH1cbkBAIC0yMTMxLDYgJiM0MzsyMTY4LDEzIEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuIFx0ICogZ2V0IGJsb2NrIG1hcHBpbmcgZm9yIGRldmljZSBNTUlPIHJlZ2lvbi5cbiBcdCAqL1xuIFx0cmV0ID0ga3ZtX3MyX2ZhdWx0X3Bpbl9wZm4oczJmZCwgXHUwMDI2czJ2aSk7XG4mIzQzO1x0aWYgKHJldCA9PSAtRUhXUE9JU09OKSB7XG4mIzQzO1x0XHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cbiYjNDM7XHRcdGlmIChyZXN1bHQpXG4mIzQzO1x0XHRcdHJldHVybiAtRUhXUE9JU09OO1xuJiM0MztcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLnZtYV9wYWdlc2l6ZSkpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuIFx0aWYgKHJldCAhPSAxKVxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuQEAgLTIxNDAsNyAmIzQzOzIxODQsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdH1cbiBcbi1cdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlKTtcbiYjNDM7XHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcdTAwMjZzMnZpLCBwcm90LCBtZW1jYWNoZSwgcmVzdWx0KTtcbiB9XG4gXG4gLyogUmVzb2x2ZSB0aGUgYWNjZXNzIGZhdWx0IGJ5IG1ha2luZyB0aGUgcGFnZSB5b3VuZyBhZ2Fpbi4gKi9cbkBAIC0yMjUwLDcgJiM0MzsyMjk0LDggQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9zMl90cmFucyBuZXN0ZWRfdHJhbnMsICpuZXN0ZWQgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBlc3I7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuJiM0MztcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LVx1MDAzZWFyY2guaHdfbW11O1xuIFx0cGh5c19hZGRyX3QgZmF1bHRfaXBhOyAvKiBUaGUgYWRkcmVzcyB3ZSBmYXVsdGVkIG9uICovXG4gXHRwaHlzX2FkZHJfdCBpcGE7IC8qIEFsd2F5cyB0aGUgSVBBIGluIHRoZSBMMSBndWVzdCBwaHlzIHNwYWNlICovXG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90O1xuQEAgLTIyNTksMTEgJiM0MzsyMzA0LDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0Z2ZuX3QgZ2ZuO1xuIFx0aW50IHJldCwgaWR4O1xuIFxuLVx0aWYgKGt2bV92Y3B1X2FidF9pc3NlYSh2Y3B1KSlcbiYjNDM7XHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcbiBcdFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xuIFxuLVx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcbi1cbiBcdC8qXG4gXHQgKiBUaGUgZmF1bHQgSVBBIHNob3VsZCBiZSByZWxpYWJsZSBhdCB0aGlzIHBvaW50IGFzIHdlJiMzOTtyZSBub3QgZGVhbGluZ1xuIFx0ICogd2l0aCBhbiBTRUEuXG5AQCAtMjI3Miw3ICYjNDM7MjMxNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdGlmIChLVk1fQlVHX09OKGlwYSA9PSBJTlZBTElEX0dQQSwgdmNwdS1cdTAwM2Vrdm0pKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbi1cdGlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7XG4mIzQzO1x0aXNfaWFidCA9IGVzcl90cmFwX2lzX2lhYnQoZXNyKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGVzcikpIHtcbiBcdFx0LyogQmV5b25kIHNhbml0aXNlZCBQQVJhbmdlICh3aGljaCBpcyB0aGUgSVBBIGxpbWl0KSAqL1xuQEAgLTIyODIsMTQgJiM0MzsyMzI1LDE0IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0fVxuIFxuIFx0XHQvKiBGYWxscyBiZXR3ZWVuIHRoZSBJUEEgcmFuZ2UgYW5kIHRoZSBQQVJhbmdlPyAqL1xuLVx0XHRpZiAoZmF1bHRfaXBhIFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2V2dGNyKSkpIHtcbiYjNDM7XHRcdGlmIChmYXVsdF9pcGEgXHUwMDNlPSBCSVRfVUxMKFZUQ1JfRUwyX0lQQShtbXUtXHUwMDNldnRjcikpKSB7XG4gXHRcdFx0ZmF1bHRfaXBhIHw9IEZBUl9UT19GSVBBX09GRlNFVChrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7XG4gXG4gXHRcdFx0cmV0dXJuIGt2bV9pbmplY3Rfc2VhKHZjcHUsIGlzX2lhYnQsIGZhdWx0X2lwYSk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdHRyYWNlX2t2bV9ndWVzdF9mYXVsdCgqdmNwdV9wYyh2Y3B1KSwga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSxcbiYjNDM7XHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcbiBcdFx0XHQgICAgICBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwgZmF1bHRfaXBhKTtcbiBcbiBcdC8qIENoZWNrIHRoZSBzdGFnZS0yIGZhdWx0IGlzIHRyYW5zLiBmYXVsdCBvciB3cml0ZSBmYXVsdCAqL1xuQEAgLTIyOTgsOSAmIzQzOzIzNDEsOSBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHQgICAgIWVzcl9mc2NfaXNfYWNjZXNzX2ZsYWdfZmF1bHQoZXNyKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAhZXNyX2ZzY19pc19leGNsX2F0b21pY19mYXVsdChlc3IpKSB7XG4gXHRcdGt2bV9lcnIoXCYjMzQ7VW5zdXBwb3J0ZWQgRlNDOiBFQz0lI3ggeEZTQz0lI2x4IEVTUl9FTDI9JSNseFxcblwmIzM0Oyxcbi1cdFx0XHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiYjNDM7XHRcdFx0ZXNyX2dldF9lYyhlc3IpLFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZykoZXNyIFx1MDAyNiBFU1JfRUx4X0ZTQyksXG4mIzQzO1x0XHRcdCh1bnNpZ25lZCBsb25nKWVzcik7XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTIzMTksOCAmIzQzOzIzNjIsOCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHQgKiBub3RoaW5nIHRvIHdhbGsgYW5kIHdlIHRyZWF0IGl0IGFzIGEgMToxIGJlZm9yZSBnb2luZyB0aHJvdWdoIHRoZVxuIFx0ICogY2Fub25pY2FsIHRyYW5zbGF0aW9uLlxuIFx0ICovXG4tXHRpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS1cdTAwM2Vrdm0sdmNwdS1cdTAwM2VhcmNoLmh3X21tdSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgdmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiYjNDM7XHRpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS1cdTAwM2Vrdm0sIG1tdSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIG1tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiBcdFx0dTMyIGVzcjtcbiBcbiBcdFx0cmV0ID0ga3ZtX3dhbGtfbmVzdGVkX3MyKHZjcHUsIGZhdWx0X2lwYSwgXHUwMDI2bmVzdGVkX3RyYW5zKTtcbkBAIC0yMzQ5LDcgJiM0MzsyMzkyLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0Z2ZuID0gaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtXHUwMDNla3ZtLCBnZm4pO1xuIFx0aHZhID0gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3QobWVtc2xvdCwgZ2ZuLCBcdTAwMjZ3cml0YWJsZSk7XG4tXHR3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdCh2Y3B1KTtcbiYjNDM7XHR3cml0ZV9mYXVsdCA9IGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoZXNyKTtcbiBcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgfHwgKHdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNiAhd3JpdGFibGUpKSB7XG4gXHRcdC8qXG4gXHRcdCAqIFRoZSBndWVzdCBoYXMgcHV0IGVpdGhlciBpdHMgaW5zdHJ1Y3Rpb25zIG9yIGl0cyBwYWdlLXRhYmxlc1xuQEAgLTIzNjIsNyAmIzQzOzI0MDUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbiYjNDM7XHRcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0XHRyZXQgPSBrdm1faW5qZWN0X3NlYV9kYWJ0KHZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpKTtcbiBcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXHRcdH1cbkBAIC0yMzc3LDcgJiM0MzsyNDIwLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQgKiBTbyBsZXQmIzM5O3MgYXNzdW1lIHRoYXQgdGhlIGd1ZXN0IGlzIGp1c3QgYmVpbmdcbiBcdFx0ICogY2F1dGlvdXMsIGFuZCBza2lwIHRoZSBpbnN0cnVjdGlvbi5cbiBcdFx0ICovXG4tXHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcbiYjNDM7XHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGVzcl9kYWJ0X2lzX2NtKGVzcikpIHtcbiBcdFx0XHRrdm1faW5jcl9wYyh2Y3B1KTtcbiBcdFx0XHRyZXQgPSAxO1xuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbkBAIC0yMzk1LDcgJiM0MzsyNDM4LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0fVxuIFxuIFx0LyogVXNlcnNwYWNlIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWdpc3RlciBvdXQtb2YtYm91bmRzIElQQXMgKi9cbi1cdFZNX0JVR19PTihpcGEgXHUwMDNlPSBrdm1fcGh5c19zaXplKHZjcHUtXHUwMDNlYXJjaC5od19tbXUpKTtcbiYjNDM7XHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcbiBcdFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xuQEAgLTI0MDksMTkgJiM0MzsyNDUyLDIwIEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0Lm5lc3RlZFx0XHQ9IG5lc3RlZCxcbiBcdFx0Lm1lbXNsb3RcdD0gbWVtc2xvdCxcbiBcdFx0Lmh2YVx0XHQ9IGh2YSxcbiYjNDM7XHRcdC5lc3JcdFx0PSBlc3IsXG4mIzQzO1x0XHQubW11XHRcdD0gbW11LFxuIFx0fTtcbiBcbiBcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXHUwMDNla3ZtKSkge1xuIFx0XHRyZXQgPSBwa3ZtX21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbiBcdH0gZWxzZSB7XG4tXHRcdFZNX1dBUk5fT05fT05DRShrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcbiYjNDM7XHRcdFZNX1dBUk5fT05fT05DRShrdm1fczJfZmF1bHRfaXNfcGVybShcdTAwMjZzMmZkKSBcdTAwMjZcdTAwMjYgIXdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHRcdCFrdm1fczJfZmF1bHRfaXNfZXhlYyhcdTAwMjZzMmZkKSk7XG4gXG4gXHRcdGlmIChrdm1fc2xvdF9oYXNfZ21lbShtZW1zbG90KSlcbi1cdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQpO1xuJiM0MztcdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0XHRlbHNlXG4tXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCk7XG4mIzQzO1x0XHRcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0fVxuIFxuIFx0aWYgKHJldCA9PSAwKVxuQEAgLTI3OTIsMyAmIzQzOzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpXG4gXG4gXHR0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpO1xuIH1cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyeSB0byB3YWxrIHRvIHRoZSBzcGVjaWZpZWQgR1BBIGluIGNhbm9uaWNhbCBtbXUgLSBpZiB1bm1hcHBlZCByZXR1cm5zIDAsIGlmXG4mIzQzOyAqIG1hcHBlZCByZXR1cm5zIHRoZSBncmFudWxlIHNpemUsIG90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGxvbmcga3ZtX3dhbGtfczIoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsXG4mIzQzO1x0XHRcdGdwYV90IGdwYSwgczggKmxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bSAqa3ZtID0ga3ZtX3MyX21tdV90b19rdm0ocGd0LVx1MDAzZW1tdSk7XG4mIzQzO1x0a3ZtX3B0ZV90IHB0ZTtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQocmVhZF9sb2NrKShcdTAwMjZrdm0tXHUwMDNlbW11X2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihwZ3QsIGdwYSwgXHUwMDI2cHRlLCBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXG4mIzQzO1x0aWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRyZXR1cm4ga3ZtX2dyYW51bGVfc2l6ZSgqbGV2ZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBTeW50aGVzaXNlZCBkYXRhIGFib3J0IGF0IHNwZWNpZmllZCBwYWdlIHRhYmxlIGxldmVsLiAqL1xuJiM0MzsjZGVmaW5lIFBSRV9GQVVMVF9FU1IobGV2ZWwpXHRcdFx0XHRcXFxuJiM0MztcdCAoKEVTUl9FTHhfRUNfREFCVF9MT1cgXHUwMDNjXHUwMDNjIEVTUl9FTHhfRUNfU0hJRlQpIHxcdFxcXG4mIzQzO1x0ICBFU1JfRUx4X0lMIHwgRVNSX0VMeF9GU0NfRkFVTFRfTChsZXZlbCkpXG4mIzQzO1xuJiM0MzsvKiBSZXRyaWV2ZSBlaXRoZXIgYSByZWFkLW9ubHkgb3IgYSByZWFkL3dyaXRlIGh2YS4gKi9cbiYjNDM7c3RhdGljIGh2YV90IGdmbl90b19odmFfbWVtc2xvdF9yZWFkKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIGdmbl90IGdmbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChzbG90LCBnZm4sIC8qd3JpdGFibGU9Ki9OVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvbmcgX19wcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuJiM0MztcdFx0XHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgYm9vbCBpc19nbWVtID0ga3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCk7XG4mIzQzO1x0Y29uc3QgZ2ZuX3QgZ2ZuID0gZ3BhX3RvX2dmbihncGEpO1xuJiM0MztcdGNvbnN0IGh2YV90IGh2YSA9IGlzX2dtZW0gPyAwIDogZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQobWVtc2xvdCwgZ2ZuKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgczJmZCA9IHtcbiYjNDM7XHRcdC52Y3B1XHRcdD0gdmNwdSxcbiYjNDM7XHRcdC5mYXVsdF9pcGFcdD0gZ3BhLFxuJiM0MztcdFx0Lm5lc3RlZFx0XHQ9IE5VTEwsXG4mIzQzO1x0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuJiM0MztcdFx0Lmh2YVx0XHQ9IGh2YSxcbiYjNDM7XHRcdC5lc3JcdFx0PSBQUkVfRkFVTFRfRVNSKGxldmVsKSxcbiYjNDM7XHRcdC5tbXVcdFx0PSBtbXUsXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCByZXN1bHQgPSB7fTtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRpZiAoaXNfZ21lbSlcbiYjNDM7XHRcdHJldCA9IGdtZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRyZXQgPSB1c2VyX21lbV9hYm9ydChcdTAwMjZzMmZkLCBcdTAwMjZyZXN1bHQpO1xuJiM0MztcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIHJlc3VsdC5tYXBwaW5nX3NpemU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIHByZV9mYXVsdF9zMihzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG4mIzQzO1x0XHRcdCBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpXG4mIzQzO3tcbiYjNDM7XHRzOCBsZXZlbDtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IGEgd2FsayBmaXJzdC4gKi9cbiYjNDM7XHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXHUwMDNlcGd0LCBncGEsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xuJiM0MztcdHJldHVybiBfX3ByZV9mYXVsdF9zMihtbXUsIHZjcHUsIGdwYSwgbWVtc2xvdCwgbGV2ZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZ1xuJiM0MztwcmVfZmF1bHRfYnl0ZXNfY29uc3VtZWQoZ3BhX3QgZ3BhLCB1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZSxcbiYjNDM7XHRcdFx0IHVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVtYWluaW5nKVxuJiM0Mzt7XG4mIzQzO1x0LyogR3JhbnVsZXMgYXJlIGFsd2F5cyBhIHBvd2VyLW9mLTIuICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XG4mIzQzO1x0XHRncmFudWxlX3NpemUgLSAoZ3BhICUgZ3JhbnVsZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXG4mIzQzOyNkZWZpbmUgTUFYX1BSRV9GQVVMVF9SRVRSSUVTIDNcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkgLSBwcmUtZmF1bHQgc3RhZ2UtMiBwYWdlIHRhYmxlcyBmb3IgdGhlXG4mIzQzOyAqIHNwZWNpZmllZCBHUEEuXG4mIzQzOyAqIEB2Y3B1Olx0VGhlIFZDUFUgcG9pbnRlclxuJiM0MzsgKiBAcmFuZ2U6XHR7Z3BhLCBzaXplLCBmbGFnc30gdHVwbGVcbiYjNDM7ICpcbiYjNDM7ICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5XG4mIzQzOyAqIHJhY2V5LiBUaGUgcmFuZ2VzIGZhdWx0ZWQgaW4gYXJlIGNhbm9uaWNhbCwgbmVzdGVkIHBhZ2UgdGFibGVzIGFyZSBpZ25vcmVkLlxuJiM0MzsgKlxuJiM0MzsgKiBAcmFuZ2UtXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVx1MDAzZXNpemUgc3BlY2lmaWVzIGhvdyBtYW55XG4mIzQzOyAqIGJ5dGVzIHJlbWFpbiB0byBiZSBwcmUtZmF1bHRlZCBhbmQgQHJhbmdlLVx1MDAzZWZsYWdzIGlzIHJlc2VydmVkIGFuZCBtdXN0IGJlIDAuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuXG4mIzQzOyAqL1xuJiM0Mztsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiYjNDM7XHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXHUwMDNlc2l6ZTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11ID0gXHUwMDI2a3ZtLVx1MDAzZWFyY2gubW11OyAvKiBDYW5vbmljYWwuICovXG4mIzQzO1x0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDtcbiYjNDM7XHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cdTAwM2VncGE7XG4mIzQzO1x0aW50IG51bV9yZXRyaWVzID0gMDtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBwS1ZNIGlzIHVuc3VwcG9ydGVkIGFzIHRoZWlyIHZDUFVzIGFyZSBpbnN0YW50aWF0ZWQgb24gZmlyc3QgcnVuIGFuZFxuJiM0MztcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRtZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBncGFfdG9fZ2ZuKGdwYSkpO1xuJiM0MztcdGlmICghbWVtc2xvdClcbiYjNDM7XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdC8qIFNSQ1UgbXVzdCBiZSByZWxlYXNlZCBmb3IgcHJvZ3Jlc3MgYW5kIG9ubHkgdXNlcmxhbmQgY2FuIGRvIHRoYXQuICovXG4mIzQzO1x0aWYgKG1lbXNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXG4mIzQzO1x0XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0cmV0ID0gcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90KTtcbiYjNDM7XHR9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiBcdTAwMjZcdTAwMjYgbnVtX3JldHJpZXMmIzQzOyYjNDM7IFx1MDAzYyBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMpO1xuJiM0MztcbiYjNDM7XHRpZiAoSVNfRVJSX1ZBTFVFKHJldCkpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdHJldHVybiBwcmVfZmF1bHRfYnl0ZXNfY29uc3VtZWQoZ3BhLCByZXQsIGJ5dGVzX3JlbWFpbmluZyk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5pbmRleCAxNzEyM2YwYjZkYWJhLi4zNDg4ZDVhZDIyNWI2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5AQCAtNjU0LDcgJiM0Mzs2NTQsNyBAQCBzdGF0aWMgdTggZ2V0X2d1ZXN0X21hcHBpbmdfdHRsKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHU2NCBhZGRyKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiBcdHRtcCBcdTAwMjY9IH4oc3ogLSAxKTtcbi1cdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXHUwMDNlcGd0LCB0bXAsIFx1MDAyNnB0ZSwgTlVMTCkpXG4mIzQzO1x0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cdTAwM2VwZ3QsIHRtcCwgXHUwMDI2cHRlLCBOVUxMLCAwKSlcbiBcdFx0Z290byBhZ2FpbjtcbiBcdGlmICghKHB0ZSBcdTAwMjYgUFRFX1ZBTElEKSlcbiBcdFx0Z290byBhZ2FpbjtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxuaW5kZXggNWY4ZDE3ZWU1ZjY3Ny4uMWUwZWRkMGY5OWY3NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbkBAIC0xNzMsNiAmIzQzOzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9kZWJ1Zy1leGNlcHRpb25zXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L2hlbGxvX2VsMlxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9ob3N0X3N2ZVxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9oeXBlcmNhbGxzXG4mIzQzO1RFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvZXh0ZXJuYWxfYWJvcnRzXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L21taW9fc2lnbl9leHRcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvcGFnZV9mYXVsdF90ZXN0XG5AQCAtMTk5LDYgJiM0MzsyMDAsNyBAQCBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gZ3Vlc3RfbWVtZmRfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gcnNlcV90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHN0ZWFsX3RpbWVcbiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHByZV9mYXVsdF9tZW1vcnlfdGVzdFxuIFxuIFRFU1RfR0VOX1BST0dTX3MzOTAgPSAkKFRFU1RfR0VOX1BST0dTX0NPTU1PTilcbiBURVNUX0dFTl9QUk9HU19zMzkwICYjNDM7PSBzMzkwL21lbW9wXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMDljMWRiMzAzODU2NlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSwxNTggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKlxuJiM0MzsgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxuJiM0MzsgKiBsYXN0LXJ1biBjb250ZXh0IGlzIG5lc3RlZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxuJiM0MzsgKiByZWFsIEVMMSByZWdpc3RlcnMgdGhlbiBFUkVUcyB0byB2RUwxIGFuZCBleGl0cyB0byB1c2Vyc3BhY2Ugc28gaXRzIHZDUFVcbiYjNDM7ICogbGFzdC1ydW4gY29udGV4dCBpcyBuZXN0ZWQgYmFja2VkIGJ5IGEgc2hhZG93IHN0YWdlIDIgTU1VLlxuJiM0MzsgKlxuJiM0MzsgKiBBc3NlcnQgdGhhdCBwcmUtZmF1bHRpbmcgaWdub3JlcyB0aGF0IGFuZCB0YXJnZXRzIHRoZSBjYW5vbmljYWwgc3RhZ2UtMlxuJiM0MzsgKiBwYWdlIHRhYmxlcyBvbmx5LlxuJiM0MzsgKi9cbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtwcm9jZXNzb3IuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt0ZXN0X3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1Y2FsbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vc3lzcmVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBURVNUX01FTV9TTE9UXHRcdDEwXG4mIzQzOyNkZWZpbmUgVEVTVF9NRU1fU0laRVx0XHRTWl8yTVxuJiM0MzsjZGVmaW5lIFRFU1RfTUVNX0dQQVx0XHRTWl8xR1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBvZmZzZXQ7XG4mIzQzO1xuJiM0MztcdEdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAxKTtcbiYjNDM7XG4mIzQzO1x0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXG4mIzQzO1x0R1VFU1RfU1lOQygxKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3dcbiYjNDM7XHQgKiBzdGFnZS0yIGlzIGEgMToxIHZpZXcgb2YgdGhlIGNhbm9uaWNhbCBJUEEgc3BhY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXHUwMDNjIFRFU1RfTUVNX1NJWkU7IG9mZnNldCAmIzQzOz0gU1pfNEspXG4mIzQzO1x0XHRSRUFEX09OQ0UoKih1NjQgKikoVEVTVF9NRU1fR1BBICYjNDM7IG9mZnNldCkpO1xuJiM0MztcbiYjNDM7XHRHVUVTVF9ET05FKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGd1ZXN0X2NvZGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBzcDtcbiYjNDM7XG4mIzQzO1x0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDIpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE1pcnJvciB0aGUgRUwyIHRyYW5zbGF0aW9uIHJlZ2ltZSBpbnRvIHRoZSByZWFsIEVMMSByZWdpc3RlcnMgc29cbiYjNDM7XHQgKiB0aGF0IHZFTDEgcnVucyBvbiB0aGUgdGVzdCYjMzk7cyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcbiYjNDM7XHQgKiBfRUwxIGFjY2Vzc29ycyByZWFkIHRoZSBFTDIgcmVnaXN0ZXJzLCBhbmQgdGhlIF9FTDEyIGFjY2Vzc29yc1xuJiM0MztcdCAqIHdyaXRlIHRoZSByZWFsIEVMMSByZWdpc3RlcnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoc2N0bHJfZWwxKSwgU1lTX1NDVExSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHRjcl9lbDEpLCBTWVNfVENSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcbiYjNDM7XHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhtYWlyX2VsMSksIFNZU19NQUlSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKGNwYWNyX2VsMSksIFNZU19DUEFDUl9FTDEyKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIHZFTDEgb24gdGhlIHNhbWUgc3RhY2suICovXG4mIzQzO1x0YXNtIHZvbGF0aWxlKFwmIzM0O21vdiAlMCwgc3BcJiMzNDsgOiBcJiMzNDs9clwmIzM0OyhzcCkpO1xuJiM0MztcdHdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEcm9wIFRHRSBzbyB0aGF0IHZFTDEgaXMgYSBuZXN0ZWQgY29udGV4dCByYXRoZXIgdGhhbiBob3N0IEVMMC5cbiYjNDM7XHQgKiBLVk0gYmFja3MgaXQgd2l0aCBhIHNoYWRvdyBzdGFnZS0yIE1NVSBldmVuIHRob3VnaCB2c3RhZ2UtMiBpc1xuJiM0MztcdCAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLlxuJiM0MztcdCAqL1xuJiM0MztcdHdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhoY3JfZWwyKSBcdTAwMjYgfkhDUl9FTDJfVEdFLCBoY3JfZWwyKTtcbiYjNDM7XHRpc2IoKTtcbiYjNDM7XG4mIzQzO1x0d3JpdGVfc3lzcmVnKFBTUl9NT0RFX0VMMWggfCBQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBQU1JfQV9CSVQgfFxuJiM0MztcdFx0ICAgICBQU1JfRF9CSVQsIHNwc3JfZWwyKTtcbiYjNDM7XHR3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7XG4mIzQzO1x0YXNtIHZvbGF0aWxlKFwmIzM0O2VyZXRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRHVUVTVF9BU1NFUlQoZmFsc2UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwcmVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3BhLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSByYW5nZSA9IHtcbiYjNDM7XHRcdC5ncGEgPSBncGEsXG4mIzQzO1x0XHQuc2l6ZSA9IHNpemUsXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRyZXQgPSBfX3ZjcHVfaW9jdGwodmNwdSwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIFx1MDAyNnJhbmdlKTtcbiYjNDM7XHR9IHdoaWxlICgoIXJldCBcdTAwMjZcdTAwMjYgcmFuZ2Uuc2l6ZSkgfHxcbiYjNDM7XHRcdCAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkpO1xuJiM0MztcbiYjNDM7XHRURVNUX0FTU0VSVCghcmV0LCBcJiMzNDtLVk1fUFJFX0ZBVUxUX01FTU9SWSBmYWlsZWQsIHJldDogJWQgZXJybm86ICVkXCYjMzQ7LFxuJiM0MztcdFx0ICAgIHJldCwgZXJybm8pO1xuJiM0MztcdFRFU1RfQVNTRVJUX0VRKHJhbmdlLnNpemUsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7XG4mIzQzO1x0c3RydWN0IGt2bV92bSAqdm07XG4mIzQzO1x0c3RydWN0IHVjYWxsIHVjO1xuJiM0MztcdHU2NCBucGFnZXM7XG4mIzQzO1xuJiM0MztcdFRFU1RfUkVRVUlSRSh0ZXN0X3N1cHBvcnRzX2VsMigpKTtcbiYjNDM7XHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiYjNDM7XG4mIzQzO1x0dm0gPSB2bV9jcmVhdGUoMSk7XG4mIzQzO1xuJiM0MztcdGt2bV9nZXRfZGVmYXVsdF92Y3B1X3RhcmdldCh2bSwgXHUwMDI2aW5pdCk7XG4mIzQzO1x0aW5pdC5mZWF0dXJlc1swXSB8PSBCSVQoS1ZNX0FSTV9WQ1BVX0hBU19FTDIpO1xuJiM0MztcdHZjcHUgPSBhYXJjaDY0X3ZjcHVfYWRkKHZtLCAwLCBcdTAwMjZpbml0LCBndWVzdF9jb2RlKTtcbiYjNDM7XHRrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7XG4mIzQzO1xuJiM0MztcdG5wYWdlcyA9IFRFU1RfTUVNX1NJWkUgLyB2bS1cdTAwM2VwYWdlX3NpemU7XG4mIzQzO1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgVEVTVF9NRU1fR1BBLFxuJiM0MztcdFx0XHRcdCAgICBURVNUX01FTV9TTE9ULCBucGFnZXMsIDApO1xuJiM0MztcdHZpcnRfbWFwKHZtLCBURVNUX01FTV9HUEEsIFRFU1RfTUVNX0dQQSwgbnBhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIHRoZSBndWVzdCB1bnRpbCBpdCBoYXMgRVJFVCYjMzk7ZCBmcm9tIHZFTDIgdG8gdkVMMS4gKi9cbiYjNDM7XHR2Y3B1X3J1bih2Y3B1KTtcbiYjNDM7XHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcdTAwMjZ1YykpIHtcbiYjNDM7XHRjYXNlIFVDQUxMX1NZTkM6XG4mIzQzO1x0XHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgVUNBTExfQUJPUlQ6XG4mIzQzO1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRURVNUX0ZBSUwoXCYjMzQ7VW5oYW5kbGVkIHVjYWxsOiAlbGRcJiMzNDssIHVjLmNtZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB2Q1BVJiMzOTtzIGxhc3QtcnVuIGNvbnRleHQgaXMgdkVMMSwgc28gaXRzIGh3X21tdSBpcyBhIHNoYWRvd1xuJiM0MztcdCAqIHN0YWdlLTIgTU1VLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogUHJlLWZhdWx0aW5nIG11c3QgaWdub3JlIHRoYXQgYW5kIHBvcHVsYXRlIHRoZSBjYW5vbmljYWwgc3RhZ2UtMi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmVfZmF1bHQodmNwdSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVzdW1lIGF0IHZFTDEgYW5kIHRvdWNoIHRoZSBwcmVmYXVsdGVkIHJhbmdlLiAqL1xuJiM0MztcdHZjcHVfcnVuKHZjcHUpO1xuJiM0MztcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuJiM0MztcdGNhc2UgVUNBTExfRE9ORTpcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgVUNBTExfQUJPUlQ6XG4mIzQzO1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRURVNUX0ZBSUwoXCYjMzQ7VW5oYW5kbGVkIHVjYWxsOiAlbGRcJiMzNDssIHVjLmNtZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrdm1fdm1fZnJlZSh2bSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbmluZGV4IGEwZmNhZTNjYjdhOGIuLjcwMmM3MmJiZmE5NjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTEyLDE5ICYjNDM7MTIsMjkgQEBcbiAjaW5jbHVkZSBcdTAwM2Nwcm9jZXNzb3IuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3VjYWxsX2NvbW1vbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2d1ZXN0X21vZGVzLmhcdTAwM2VcbiBcbiAvKiBBcmJpdHJhcmlseSBjaG9zZW4gdmFsdWVzICovXG4tI2RlZmluZSBURVNUX1NJWkVcdFx0KFNaXzJNICYjNDM7IFBBR0VfU0laRSlcbi0jZGVmaW5lIFRFU1RfTlBBR0VTXHRcdChURVNUX1NJWkUgLyBQQUdFX1NJWkUpXG4mIzQzOyNkZWZpbmUgVEVTVF9CQVNFX1NJWkVcdFx0U1pfMk1cbiAjZGVmaW5lIFRFU1RfU0xPVFx0XHQxMFxuIFxuJiM0MzsvKiBTdG9yYWdlIG9mIHRlc3QgaW5mbyB0byBzaGFyZSB3aXRoIGd1ZXN0IGNvZGUgKi9cbiYjNDM7c3RydWN0IHRlc3RfY29uZmlnIHtcbiYjNDM7XHR1NjQgcGFnZV9zaXplO1xuJiM0MztcdHU2NCB0ZXN0X3NpemU7XG4mIzQzO1x0dTY0IHRlc3RfbnVtX3BhZ2VzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB0ZXN0X2NvbmZpZyB0ZXN0X2NvbmZpZztcbiYjNDM7XG4gc3RhdGljIHZvaWQgZ3Vlc3RfY29kZSh1NjQgYmFzZV9ndmEpXG4ge1xuIFx0dm9sYXRpbGUgdTY0IHZhbCBfX3VzZWQ7XG4mIzQzO1x0c3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSBcdTAwMjZ0ZXN0X2NvbmZpZztcbiBcdGludCBpO1xuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVEVTVF9OUEFHRVM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHU2NCAqc3JjID0gKHU2NCAqKShiYXNlX2d2YSAmIzQzOyBpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb25maWctXHUwMDNldGVzdF9udW1fcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgJiM0MzsgaSAqIGNvbmZpZy1cdTAwM2VwYWdlX3NpemUpO1xuIFxuIFx0XHR2YWwgPSAqc3JjO1xuIFx0fVxuQEAgLTM2LDYgJiM0Mzs0Niw3IEBAIHN0cnVjdCBzbG90X3dvcmtlcl9kYXRhIHtcbiBcdHN0cnVjdCBrdm1fdm0gKnZtO1xuIFx0Z3BhX3QgZ3BhO1xuIFx0dTMyIGZsYWdzO1xuJiM0MztcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuIFx0Ym9vbCB3b3JrZXJfcmVhZHk7XG4gXHRib29sIHByZWZhdWx0X3JlYWR5O1xuIFx0Ym9vbCByZWNyZWF0ZV9zbG90O1xuQEAgLTU2LDE0ICYjNDM7NjcsMTYgQEAgc3RhdGljIHZvaWQgKmRlbGV0ZV9zbG90X3dvcmtlcih2b2lkICpfX2RhdGEpXG4gXHR3aGlsZSAoIVJFQURfT05DRShkYXRhLVx1MDAzZXJlY3JlYXRlX3Nsb3QpKVxuIFx0XHRjcHVfcmVsYXgoKTtcbiBcbi1cdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGRhdGEtXHUwMDNlZ3BhLFxuLVx0XHRcdFx0ICAgIFRFU1RfU0xPVCwgVEVTVF9OUEFHRVMsIGRhdGEtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgZGF0YS1cdTAwM2VtZW1fYmFja2luZ19zcmMsIGRhdGEtXHUwMDNlZ3BhLFxuJiM0MztcdFx0XHRcdCAgICBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLCBkYXRhLVx1MDAzZWZsYWdzKTtcbiBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxuLVx0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXG4mIzQzO1x0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LFxuJiM0MztcdFx0XHQgICAgIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjLFxuJiM0MztcdFx0XHQgICAgIGJvb2wgcHJpdmF0ZSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4gXHRcdC5ncGEgPSBiYXNlX2dwYSAmIzQzOyBvZmZzZXQsXG5AQCAtNzQsNiAmIzQzOzg3LDcgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdFx0LnZtID0gdmNwdS1cdTAwM2V2bSxcbiBcdFx0LmdwYSA9IGJhc2VfZ3BhLFxuIFx0XHQuZmxhZ3MgPSBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDAsXG4mIzQzO1x0XHQubWVtX2JhY2tpbmdfc3JjID0gbWVtX2JhY2tpbmdfc3JjLFxuIFx0fTtcbiBcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcbiBcdHB0aHJlYWRfdCBzbG90X3dvcmtlcjtcbkBAIC0xNTAsOCAmIzQzOzE2NCw4IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHQvKlxuIFx0ICogQXNzZXJ0IHN1Y2Nlc3MgaWYgcHJlZmF1bHRpbmcgdGhlIGVudGlyZSByYW5nZSBzaG91bGQgc3VjY2VlZCwgaS5lLlxuIFx0ICogY29tcGxldGUgd2l0aCBubyBieXRlcyByZW1haW5pbmcuICBPdGhlcndpc2UgcHJlZmF1bHRpbmcgc2hvdWxkIGhhdmVcbi1cdCAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChkdWUgdG8gUkVUX1BGX0VNVUxBVEUgZm9yIGVtdWxhdGVkIE1NSU8gd2hlblxuLVx0ICogbm8gbWVtc2xvdCBleGlzdHMpLlxuJiM0MztcdCAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChubyBtZW1zbG90IGV4aXN0cyBmb3IgdGhlIEdQQTsgb24geDg2IHRoaXNcbiYjNDM7XHQgKiBzdXJmYWNlcyB2aWEgUkVUX1BGX0VNVUxBVEUpLlxuIFx0ICovXG4gXHRpZiAoIWV4cGVjdGVkX2xlZnQpXG4gXHRcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG5AQCAtMTYwLDM5ICYjNDM7MTc0LDgyIEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHRcdFx0XHRcdCAgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKVxuJiM0MztzdHJ1Y3QgdGVzdF9wYXJhbXMge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcbiYjNDM7XHRib29sIHByaXZhdGU7XG4mIzQzO1x0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeShlbnVtIHZtX2d1ZXN0X21vZGUgZ3Vlc3RfbW9kZSwgdm9pZCAqYXJnKVxuIHtcbi1cdGdwYV90IGdwYSwgZ3ZhLCBhbGlnbm1lbnQsIGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xuJiM0MztcdGdwYV90IGJhY2tpbmdfc3JjX3BhZ2VzeiwgbWVtX3BhZ2Vfc2l6ZTtcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9wYXJhbXMgKnAgPSBhcmc7XG4gXHRjb25zdCBzdHJ1Y3Qgdm1fc2hhcGUgc2hhcGUgPSB7XG4tXHRcdC5tb2RlID0gVk1fTU9ERV9ERUZBVUxULFxuLVx0XHQudHlwZSA9IHZtX3R5cGUsXG4mIzQzO1x0XHQubW9kZSA9IGd1ZXN0X21vZGUsXG4mIzQzO1x0XHQudHlwZSA9IHAtXHUwMDNldm1fdHlwZSxcbiBcdH07XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7XG4mIzQzO1x0c3RydWN0IGt2bV9ydW4gKnJ1bjtcbiBcdHN0cnVjdCBrdm1fdm0gKnZtO1xuIFx0c3RydWN0IHVjYWxsIHVjO1xuIFxuJiM0MztcdHByX2luZm8oXCYjMzQ7VGVzdGluZyBndWVzdCBtb2RlOiAlc1xcblwmIzM0Oywgdm1fZ3Vlc3RfbW9kZV9zdHJpbmcoZ3Vlc3RfbW9kZSkpO1xuJiM0MztcdHByX2luZm8oXCYjMzQ7VGVzdGluZyBtZW1vcnkgYmFja2luZyBzcmMgdHlwZTogJXNcXG5cJiMzNDssXG4mIzQzO1x0XHR2bV9tZW1fYmFja2luZ19zcmNfYWxpYXMocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpLVx1MDAzZW5hbWUpO1xuJiM0MztcbiBcdHZtID0gdm1fY3JlYXRlX3NoYXBlX3dpdGhfb25lX3ZjcHUoc2hhcGUsIFx1MDAyNnZjcHUsIGd1ZXN0X2NvZGUpO1xuIFxuLVx0YWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7XG4tXHRncGEgPSAodm0tXHUwMDNlbWF4X2dmbiAtIFRFU1RfTlBBR0VTKSAqIGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHRndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tndWVzdF9tb2RlXS5wYWdlX3NpemU7XG4mIzQzO1x0aG9zdF9wYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuJiM0MztcdGJhY2tpbmdfc3JjX3BhZ2VzeiA9IGdldF9iYWNraW5nX3NyY19wYWdlc3oocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpO1xuJiM0MztcdG1lbV9wYWdlX3NpemUgPSBtYXgoaG9zdF9wYWdlX3NpemUsIGJhY2tpbmdfc3JjX3BhZ2Vzeik7XG4mIzQzO1xuJiM0MztcdHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSA9IGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHR0ZXN0X2NvbmZpZy50ZXN0X3NpemUgPSBhbGlnbl91cChURVNUX0JBU0VfU0laRSAmIzQzOyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgbWVtX3BhZ2Vfc2l6ZSk7XG4mIzQzO1x0dGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS1cdTAwM2Vtb2RlLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUpO1xuJiM0MztcbiYjNDM7XHRncGEgPSAodm0tXHUwMDNlbWF4X2dmbiAtIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzKSAqIHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZTtcbiBcdGFsaWdubWVudCA9IFNaXzJNO1xuJiM0MztcdGFsaWdubWVudCA9IG1heChhbGlnbm1lbnQsIG1lbV9wYWdlX3NpemUpO1xuIFx0Z3BhID0gYWxpZ25fZG93bihncGEsIGFsaWdubWVudCk7XG4gXHRndmEgPSBncGEgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgKHZtLVx1MDAzZXZhX2JpdHMgLSAxKSkgLSAxKTtcbiBcbi1cdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGdwYSwgVEVTVF9TTE9ULFxuLVx0XHRcdFx0ICAgIFRFU1RfTlBBR0VTLCBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApO1xuLVx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCBURVNUX05QQUdFUyk7XG4mIzQzO1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyxcbiYjNDM7XHRcdFx0XHQgICAgZ3BhLCBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLFxuJiM0MztcdFx0XHRcdCAgICBwLVx1MDAzZXByaXZhdGUgPyBLVk1fTUVNX0dVRVNUX01FTUZEIDogMCk7XG4mIzQzO1x0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChwLVx1MDAzZXByaXZhdGUpXG4mIzQzO1x0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSwgMCxcbiYjNDM7XHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuJiM0MztcdC8qIFJldHJ5IHRoZSBzYW1lIHJhbmdlIGFmdGVyIHRoZSBmaXJzdCBwcmVmYXVsdCBhdHRlbXB0LiAqL1xuJiM0MztcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXG4mIzQzO1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbiYjNDM7XHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSxcbiYjNDM7XHRcdFx0IHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLFxuJiM0MztcdFx0XHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuJiM0MztcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsXG4mIzQzO1x0XHRcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXG4mIzQzO1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbiBcbi1cdGlmIChwcml2YXRlKVxuLVx0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgVEVTVF9TSVpFKTtcbiYjNDM7XHR2Y3B1X2FyZ3Nfc2V0KHZjcHUsIDEsIGd2YSk7XG4gXG4tXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgU1pfMk0sIDAsIHByaXZhdGUpO1xuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFNaXzJNLCBQQUdFX1NJWkUgKiAyLCBQQUdFX1NJWkUsIHByaXZhdGUpO1xuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFRFU1RfU0laRSwgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIHByaXZhdGUpO1xuJiM0MztcdC8qIEV4cG9ydCB0aGUgc2hhcmVkIHZhcmlhYmxlcyB0byB0aGUgZ3Vlc3QuICovXG4mIzQzO1x0c3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTtcbiBcbi1cdHZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTtcbiBcdHZjcHVfcnVuKHZjcHUpO1xuIFxuJiM0MztcdHJ1biA9IHZjcHUtXHUwMDNlcnVuO1xuJiM0MztcdFRFU1RfQVNTRVJUKHJ1bi1cdTAwM2VleGl0X3JlYXNvbiA9PSBVQ0FMTF9FWElUX1JFQVNPTixcbiYjNDM7XHRcdCAgICBcJiMzNDtXYW50ZWQgJXMsIGdvdCBleGl0IHJlYXNvbjogJXUgKCVzKVwmIzM0OyxcbiYjNDM7XHRcdCAgICBleGl0X3JlYXNvbl9zdHIoVUNBTExfRVhJVF9SRUFTT04pLFxuJiM0MztcdFx0ICAgIHJ1bi1cdTAwM2VleGl0X3JlYXNvbiwgZXhpdF9yZWFzb25fc3RyKHJ1bi1cdTAwM2VleGl0X3JlYXNvbikpO1xuJiM0MztcbiBcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuIFx0Y2FzZSBVQ0FMTF9BQk9SVDpcbiBcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG5AQCAtMjA3LDI0ICYjNDM7MjY0LDYxIEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKVxuIFx0a3ZtX3ZtX2ZyZWUodm0pO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsXG4mIzQzO1x0XHRcdFx0ICBib29sIHByaXZhdGUpXG4ge1xuJiM0MztcdHN0cnVjdCB0ZXN0X3BhcmFtcyBwID0ge1xuJiM0MztcdFx0LnZtX3R5cGUgPSB2bV90eXBlLFxuJiM0MztcdFx0LnByaXZhdGUgPSBwcml2YXRlLFxuJiM0MztcdFx0Lm1lbV9iYWNraW5nX3NyYyA9IGJhY2tpbmdfc3JjLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0aWYgKHZtX3R5cGUgXHUwMDI2XHUwMDI2ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSBcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xuIFx0XHRwcl9pbmZvKFwmIzM0O1NraXBwaW5nIHRlc3RzIGZvciB2bV90eXBlIDB4JWx4XFxuXCYjMzQ7LCB2bV90eXBlKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuIFxuLVx0X190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7XG4mIzQzO1x0Zm9yX2VhY2hfZ3Vlc3RfbW9kZShfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSwgXHUwMDI2cCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSlcbiYjNDM7e1xuJiM0MztcdHB1dHMoXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRwcmludGYoXCYjMzQ7dXNhZ2U6ICVzIFstaF0gWy1tIG1vZGVdIFstcyBtZW0tdHlwZV1cXG5cJiMzNDssIG5hbWUpO1xuJiM0MztcdHB1dHMoXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRndWVzdF9tb2Rlc19oZWxwKCk7XG4mIzQzO1x0YmFja2luZ19zcmNfaGVscChcJiMzNDstc1wmIzM0Oyk7XG4mIzQzO1x0cHV0cyhcJiMzNDtcJiMzNDspO1xuIH1cbiBcbiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuIHtcbiYjNDM7XHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7aG06czpcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdGd1ZXN0X21vZGVzX2NtZGxpbmUob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7cyYjMzk7OlxuJiM0MztcdFx0XHRiYWNraW5nID0gcGFyc2VfYmFja2luZ19zcmNfdHlwZShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHRoZWxwKGFyZ3ZbMF0pO1xuJiM0MztcdFx0XHRleGl0KDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiBcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XG4mIzQzO1x0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KDAsIGJhY2tpbmcsIGZhbHNlKTtcbiAjaWZkZWYgX194ODZfNjRfX1xuLVx0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KEtWTV9YODZfU1dfUFJPVEVDVEVEX1ZNLCBmYWxzZSk7XG4tXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIHRydWUpO1xuJiM0MztcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgZmFsc2UpO1xuJiM0MztcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgdHJ1ZSk7XG4gI2VuZGlmXG4gXHRyZXR1cm4gMDtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTM6MTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA1ZWJlNDMxZmNmMTkyYTBiOTQyMjliNTRkOWZhYjUwZWQwOTZmMzhiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QKaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0CiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdApAQCAtNjQ4NSw3ICYjNDM7NjQ4NSw3IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiA6Q2FwYWJpbGl0eTogS1ZNX0NBUF9QUkVfRkFVTFRfTUVNT1JZCi06QXJjaGl0ZWN0dXJlczogbm9uZQomIzQzOzpBcmNoaXRlY3R1cmVzOiB4ODYsIHMzOTAsIGFybTY0CiA6VHlwZTogdmNwdSBpb2N0bAogOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KQogOlJldHVybnM6IDAgaWYgYXQgbGVhc3Qgb25lIHBhZ2UgaXMgcHJvY2Vzc2VkLCAmbHQ7IDAgb24gZXJyb3IKQEAgLTY0OTMsMTIgJiM0Mzs2NDkzLDE0IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KIEVycm9yczoKIAogICA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOyAgRUFHQUlOICAgICBBIHJhY2Ugb2NjdXJyZWQgYmVmb3JlIHByb2dyZXNzIHdhcyBtYWRlLCBidXQgYSByZXRyeSBtYXkgc3VjY2VlZC4KICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdAogICAgICAgICAgICAgIHBhZ2UgYWxpZ25lZCwgY2F1c2VzIGFuIG92ZXJmbG93LCBvciBzaXplIGlzIHplcm8pLCBvciB0aGUgVk0KICAgICAgICAgICAgICBpcyBVQ09OVFJPTCAoczM5MCkuCiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuCiAgIEVJTlRSICAgICAgQW4gdW5tYXNrZWQgc2lnbmFsIGlzIHBlbmRpbmcgYW5kIG5vIHBhZ2Ugd2FzIHByb2Nlc3NlZC4KICAgRUZBVUxUICAgICBUaGUgcGFyYW1ldGVyIGFkZHJlc3Mgd2FzIGludmFsaWQuCiYjNDM7ICBFSFdQT0lTT04gIEEgcG9pc29uZWQgaG9zdCBwYWdlIHdhcyBlbmNvdW50ZXJlZC4KICAgRU9QTk9UU1VQUCBNYXBwaW5nIG1lbW9yeSBmb3IgYSBHUEEgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlCiAgICAgICAgICAgICAgaHlwZXJ2aXNvciwgYW5kL29yIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlL21vZGUuCiAgIEVJTyAgICAgICAgdW5leHBlY3RlZCBlcnJvciBjb25kaXRpb25zIChhbHNvIGNhdXNlcyBhIFdBUk4pCkBAIC02NTE4LDcgJiM0Mzs2NTIwLDE3IEBAIEVycm9yczoKIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHBvcHVsYXRlcyBLVk0mIzM5O3Mgc3RhZ2UtMiBwYWdlIHRhYmxlcyB1c2VkIHRvIG1hcCBtZW1vcnkKIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhCiBzdGFnZS0yIHJlYWQgcGFnZSBmYXVsdCwgZS5nLiBmYXVsdHMgaW4gbWVtb3J5IGFzIG5lZWRlZCwgYnV0IGRvZXNuJiMzOTt0IGJyZWFrCi1Db1cuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzIEFjY2Vzc2VkLgomIzQzO0NvVy4gIE9uIGFybTY0LCBLVk0gbWFya3MgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURXMgYXMgQWNjZXNzZWQsIGFzIGl0CiYjNDM7ZG9lcyBmb3IgYW55IHN0YWdlLTIgZmF1bHQsIGJ1dCBsZWF2ZXMgdGhlIEFjY2Vzc2VkIHN0YXRlIG9mIGV4aXN0aW5nIFBURXMKJiM0Mzt1bmNoYW5nZWQuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzCiYjNDM7QWNjZXNzZWQsIGFuZCBmb3IgczM5MCBpdCBpcyBub3QgYXBwbGljYWJsZS4KJiM0MzsKJiM0MztPbiBhcm02NCwgYSBHUEEgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gSVBBLCBhbmQgbmV2ZXIgaW50ZXJwcmV0ZWQgYXMgdGhlIElQQQomIzQzO29mIGEgbmVzdGVkIGd1ZXN0LiBQcmUtZmF1bHRpbmcgb25seSBwb3B1bGF0ZXMgY2Fub25pY2FsIHN0YWdlIDIgcGFnZQomIzQzO3RhYmxlcy4KJiM0MzsKJiM0MztUaGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFybTY0IGlmIHRoZSBwcm90ZWN0ZWQgS1ZNIChwS1ZNKSBmZWF0dXJlCiYjNDM7aXMgZW5hYmxlZC4KIAogSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mCiBwcml2YXRlIGd1ZXN0IG1lbW9yeSBiZWZvcmUgdGhlIGd1ZXN0IGlzICYjMzk7ZmluYWxpemVkJiMzOTsvbWVhc3VyZWQsIHRoaXMgaW9jdGwKQEAgLTY1MzMsNyAmIzQzOzY1NDUsNyBAQCBXaGVuIHRoZSBpb2N0bCByZXR1cm5zLCB0aGUgaW5wdXQgdmFsdWVzIGFyZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZQogcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgICZndDsgMCBvbiByZXR1cm4sIHRoZSBjYWxsZXIgY2FuIGp1c3QgaXNzdWUKIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LgogCi1TaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXkKJiM0MztPbiB4ODYsIHNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleQogYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLgogQ2FsbGluZyB0aGlzIGlvY3RsIHdoZW4gdGhlIGd1ZXN0IGlzIHVzaW5nIHNoYWRvdyBwYWdlIHRhYmxlcyAoZm9yCiBleGFtcGxlIGJlY2F1c2UgaXQgaXMgcnVubmluZyBhIG5lc3RlZCBndWVzdCB3aXRoIG5lc3RlZCBwYWdlIHRhYmxlcykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCmluZGV4IGY4MTZmNWQ3N2YxYTUuLjljMDIwNTk4M2Q5YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaApAQCAtNDM3LDYgJiM0Mzs0MzcsNTAgQEAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogI2luY2x1ZGUgJmx0O2FzbS90eXBlcy5oJmd0OwogCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBlc3JfZ2V0X2VjKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIEVTUl9FTHhfRUMoZXNyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl90cmFwX2lzX2lhYnQodW5zaWduZWQgbG9uZyBlc3IpCiYjNDM7ewomIzQzOwlyZXR1cm4gZXNyX2dldF9lYyhlc3IpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3MxcHR3KHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X1MxUFRXOwomIzQzO30KJiM0MzsKJiM0MzsvKiBBbHdheXMgY2hlY2sgZm9yIFMxUFRXICpiZWZvcmUqIHVzaW5nIHRoaXMuICovCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX3dyaXRlKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X1dOUjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX2NtKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X0NNOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19leGVjX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoZXNyKSAmYW1wOyZhbXA7ICFlc3JfYWJ0X2lzX3MxcHR3KGVzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3NlYSh1bnNpZ25lZCBsb25nIGVzcikKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoZXNyICZhbXA7IEVTUl9FTHhfRlNDKSB7CiYjNDM7CWNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOgomIzQzOwljYXNlIEVTUl9FTHhfRlNDX1NFQV9UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUFfVFRXKDMpOgomIzQzOwljYXNlIEVTUl9FTHhfRlNDX1NFQ0M6CiYjNDM7CWNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKToKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGVzcl9icmtfY29tbWVudCh1bnNpZ25lZCBsb25nIGVzcikKIHsKIAlyZXR1cm4gZXNyICZhbXA7IEVTUl9FTHhfQlJLNjRfSVNTX0NPTU1FTlRfTUFTSzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAppbmRleCBhM2MxOTI4YmRmNzQzLi5hM2IyNzIyNjU1NTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC00MTEsMTggJiM0Mzs0MTEsMTMgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfcmQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzczF0dyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuICEhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkgJmFtcDsgRVNSX0VMeF9TMVBUVyk7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX3MxcHR3KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiAvKiBBbHdheXMgY2hlY2sgZm9yIFMxUFRXICpiZWZvcmUqIHVzaW5nIHRoaXMuICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlyZXR1cm4ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSAmYW1wOyBFU1JfRUx4X1dOUjsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpICZhbXA7IEVTUl9FTHhfQ00pOwomIzQzOwlyZXR1cm4gZXNyX2RhYnRfaXNfd3JpdGUoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGt2bV92Y3B1X2RhYnRfZ2V0X2FzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQzOCwxNyAmIzQzOzQzMywxMiBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pbF9pczMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlyZXR1cm4gRVNSX0VMeF9FQyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTsKJiM0MzsJcmV0dXJuIGVzcl9nZXRfZWMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2lhYnQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXJldHVybiBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpICZhbXA7JmFtcDsgIWt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSk7CiYjNDM7CXJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ2OCwyNiAmIzQzOzQ1OCw5IEBAIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc190cmFuc2xhdGlvbl9mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJcmV0dXJuIGVzcl9mc2NfaXNfdHJhbnNsYXRpb25fZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUKLXU2NCBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVuc2lnbmVkIGxvbmcgZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTsKLQotCUJVR19PTighZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcikpOwotCXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChlc3IgJmFtcDsgRVNSX0VMeF9GU0NfTEVWRUwpKTsKLX0KLQogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3NlYShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3dpdGNoIChrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSkgewotCWNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOgotCWNhc2UgRVNSX0VMeF9GU0NfU0VBX1RUVygtMSkgLi4uIEVTUl9FTHhfRlNDX1NFQV9UVFcoMyk6Ci0JY2FzZSBFU1JfRUx4X0ZTQ19TRUNDOgotCWNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKToKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KJiM0MzsJcmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ5Niw5ICYjNDM7NDY5LDkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfc3lzX2dldF9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJcmV0dXJuIEVTUl9FTHhfU1lTNjRfSVNTX1JUKGVzcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKQogewotCWlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7CiYjNDM7CWlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHsKIAkJLyoKIAkJICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmUKIAkJICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkCkBAIC01MTEsMTMgJiM0Mzs0ODQsMTggQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCSAqIGZpcnN0KSwgdGhlbiBhIHBlcm1pc3Npb24gZmF1bHQgdG8gYWxsb3cgdGhlIGZsYWdzCiAJCSAqIHRvIGJlIHNldC4KIAkJICovCi0JCXJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSk7CiYjNDM7CQlyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcik7CiAJfQogCi0JaWYgKGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSkKJiM0MzsJaWYgKGVzcl90cmFwX2lzX2lhYnQoZXNyKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIGt2bV92Y3B1X2RhYnRfaXN3cml0ZSh2Y3B1KTsKJiM0MzsJcmV0dXJuIGVzcl9kYWJ0X2lzX3dyaXRlKGVzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdm1fdmNwdV9nZXRfbXBpZHJfYWZmKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaAppbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oCkBAIC04NTksNiAmIzQzOzg1OSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsCiAgKiBAYWRkcjoJSW5wdXQgYWRkcmVzcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSB3YWxrLgogICogQHB0ZXA6CVBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHJpZXZlZCBQVEUuCiAgKiBAbGV2ZWw6CVBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGxldmVsIG9mIHRoZSByZXRyaWV2ZWQgUFRFLgomIzQzOyAqIEBmbGFnczoJRmxhZ3MgdG8gY29udHJvbCB0aGUgcGFnZS10YWJsZSB3YWxrCiYjNDM7ICoJCShzZWUgc3RydWN0IGt2bV9wZ3RhYmxlX3Zpc2l0X2N0eCkuCiAgKgogICogVGhlIG9mZnNldCBvZiBAYWRkciB3aXRoaW4gYSBwYWdlIGlzIGlnbm9yZWQuCiAgKgpAQCAtODY5LDcgJiM0Mzs4NzEsOCBAQCBpbnQga3ZtX3BndGFibGVfd2FsayhzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsIHU2NCBzaXplLAogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwogaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwKLQkJCSBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCk7CiYjNDM7CQkJIGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLAomIzQzOwkJCSBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpOwogCiAvKioKICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmgKaW5kZXggYmVlYTAwZTY5M2EwYS4uNGQ2ZTU3NjVlOWU1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaApAQCAtNDQsOSAmIzQzOzQ0LDkgQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9wa3ZtX2V4dF9hbGxvd2VkKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpCiAJY2FzZSBLVk1fQ0FQX0FSTV9QVFJBVVRIX0dFTkVSSUM6CiAJCXJldHVybiB0cnVlOwogCWNhc2UgS1ZNX0NBUF9BUk1fTVRFOgotCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBLVk1fQ0FQX0FSTV9FQUdFUl9TUExJVF9DSFVOS19TSVpFOgogCWNhc2UgS1ZNX0NBUF9BUk1fU1VQUE9SVEVEX0JMT0NLX1NJWkVTOgomIzQzOwljYXNlIEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWToKIAkJcmV0dXJuIGZhbHNlOwogCWRlZmF1bHQ6CiAJCXJldHVybiAha3ZtIHx8ICFrdm1fdm1faXNfcHJvdGVjdGVkKGt2bSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZwppbmRleCA0NDkxNTRmOWE0ODUyLi43MTIzMzA2OGI3Y2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWcKQEAgLTM3LDYgJiM0MzszNyw3IEBAIG1lbnVjb25maWcgS1ZNCiAJc2VsZWN0IFNDSEVEX0lORk8KIAlzZWxlY3QgR1VFU1RfUEVSRl9FVkVOVFMgaWYgUEVSRl9FVkVOVFMKIAlzZWxlY3QgS1ZNX0dVRVNUX01FTUZECiYjNDM7CXNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZCiAJaGVscAogCSAgU3VwcG9ydCBob3N0aW5nIHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9hcm0uYyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jCmluZGV4IGNjYWU4MmMxMjQyYmMuLjU4YWM3MGYzMWQ4NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2FybS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jCkBAIC0zOTMsNiAmIzQzOzM5Myw3IEBAIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpCiAJY2FzZSBLVk1fQ0FQX0NPVU5URVJfT0ZGU0VUOgogCWNhc2UgS1ZNX0NBUF9BUk1fV1JJVEFCTEVfSU1QX0lEX1JFR1M6CiAJY2FzZSBLVk1fQ0FQX0FSTV9TRUFfVE9fVVNFUjoKJiM0MzsJY2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6CiAJCXIgPSAxOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfU0VUX0dVRVNUX0RFQlVHMjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jCmluZGV4IDM5YWE4OTExZjYyYzEuLjIzYTU3MzEyYjk4MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuYwpAQCAtNTMyLDcgJiM0Mzs1MzIsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2FkanVzdF9yYW5nZSh1NjQgYWRkciwgc3RydWN0IGt2bV9tZW1fcmFuZ2UgKnJhbmdlKQogCWludCByZXQ7CiAKIAloeXBfYXNzZXJ0X2xvY2tfaGVsZCgmYW1wO2hvc3RfbW11LmxvY2spOwotCXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7aG9zdF9tbXUucGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCk7CiYjNDM7CXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7aG9zdF9tbXUucGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCwgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtOTEwLDcgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLAogCXM4IGxldmVsOwogCWludCByZXQ7CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKGd1ZXN0X3B0ZV9pc19wb2lzb25lZChwdGUpKQpAQCAtOTU5LDcgJiM0Mzs5NTksNyBAQCBpbnQgX19wa3ZtX3ZjcHVfaW5fcG9pc29uX2ZhdWx0KHN0cnVjdCBwa3ZtX2h5cF92Y3B1ICpoeXBfdmNwdSkKIAlpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKCZhbXA7aHlwX3ZjcHUtJmd0O3ZjcHUpKTsKIAogCWd1ZXN0X2xvY2tfY29tcG9uZW50KHZtKTsKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC0xMzE1LDcgJiM0MzsxMzE1LDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9nZXRfZ3Vlc3RfaW5mbyhwaHlzX2FkZHJfdCBwaHlzLCBzdHJ1Y3QgcGt2bV9oeXBfdm0gKip2bSwKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO2hvc3RfbW11LnBndCwgcGh5cywgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO2hvc3RfbW11LnBndCwgcGh5cywgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE1NDQsNyAmIzQzOzE1NDQsNyBAQCBzdGF0aWMgaW50IF9fY2hlY2tfaG9zdF9zaGFyZWRfZ3Vlc3Qoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0ICpfX3BoeXMsIHU2NCBpcAogCXM4IGxldmVsOwogCWludCByZXQ7CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuYwppbmRleCBiNzRkZDVjZTFlZmQzLi4zNDdlZWMzOTU3ZDZhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmMKQEAgLTI5OCwxMiAmIzQzOzI5OCwxMyBAQCBzdGF0aWMgaW50IGxlYWZfd2Fsa2VyKGNvbnN0IHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHggKmN0eCwKIH0KIAogaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwKLQkJCSBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCkKJiM0MzsJCQkga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsCiYjNDM7CQkJIGVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgbGVhZl93YWxrX2RhdGEgZGF0YTsKIAlzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHsKIAkJLmNiCT0gbGVhZl93YWxrZXIsCi0JCS5mbGFncwk9IEtWTV9QR1RBQkxFX1dBTEtfTEVBRiwKJiM0MzsJCS5mbGFncwk9IGZsYWdzIHwgS1ZNX1BHVEFCTEVfV0FMS19MRUFGLAogCQkuYXJnCT0gJmFtcDtkYXRhLAogCX07CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9hcm02NC9rdm0vbW11LmMKaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vbW11LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vbW11LmMKQEAgLTUsNiAmIzQzOzUsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9hY3BpLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NsZWFudXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tbWFuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX2hvc3QuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9pby5oJmd0OwpAQCAtODY2LDcgJiM0Mzs4NjcsNyBAQCBzdGF0aWMgaW50IGdldF91c2VyX21hcHBpbmdfc2l6ZShzdHJ1Y3Qga3ZtICprdm0sIHU2NCBhZGRyKQogCSAqIElQSS1pbmcgdGhyZWFkcykuCiAJICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7cGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCk7CiYjNDM7CXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7cGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCwgMCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJaWYgKHJldCkKQEAgLTE1NTQsOSAmIzQzOzE1NTUsOSBAQCBzdGF0aWMgdm9pZCAqZ2V0X21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCXJldHVybiAmYW1wO3ZjcHUtJmd0O2FyY2gucGt2bV9tZW1jYWNoZTsKIH0KIAotc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICptZW1jYWNoZSkKJiM0MztzdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB2b2lkICptZW1jYWNoZSkKIHsKLQlpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXModmNwdS0mZ3Q7YXJjaC5od19tbXUpOwomIzQzOwlpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXMobW11KTsKIAogCWlmICghaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpCiAJCXJldHVybiBrdm1fbW11X3RvcHVwX21lbW9yeV9jYWNoZShtZW1jYWNoZSwgbWluX3BhZ2VzKTsKQEAgLTE2MDMsMTUgJiM0MzsxNjA0LDQ3IEBAIHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyB7CiAJc3RydWN0IGt2bV9zMl90cmFucwkqbmVzdGVkOwogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QJKm1lbXNsb3Q7CiAJdW5zaWduZWQgbG9uZwkJaHZhOwomIzQzOwl1bnNpZ25lZCBsb25nCQllc3I7CiYjNDM7CXN0cnVjdCBrdm1fczJfbW11CSptbXU7CiB9OwogCi1zdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQomIzQzO3N0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHsKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXBwaW5nX3NpemU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfcGVybShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiYjNDM7ewomIzQzOwlyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtJmd0O2Vzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC0mZ3Q7ZXNyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHMyZmQtJmd0O2Vzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1NjQga3ZtX3MyX3Blcm1fZmF1bHRfZ3JhbnVsZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiYjNDM7ewomIzQzOwl1NjQgbGV2ZWw7CiYjNDM7CiYjNDM7CWlmICgha3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJbGV2ZWwgPSBzMmZkLSZndDtlc3IgJmFtcDsgRVNSX0VMeF9GU0NfTEVWRUw7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChsZXZlbCkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAomIzQzOwkJICAgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdCkKIHsKIAlib29sIHdyaXRlX2ZhdWx0LCBleGVjX2ZhdWx0OwotCWJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLSZndDt2Y3B1KTsKJiM0MzsJYm9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7CiAJZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7CiAJZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QgPSBLVk1fUEdUQUJMRV9QUk9UX1I7Ci0Jc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLSZndDt2Y3B1LSZndDthcmNoLmh3X21tdS0mZ3Q7cGd0OwomIzQzOwlzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtJmd0O21tdS0mZ3Q7cGd0OwogCXVuc2lnbmVkIGxvbmcgbW11X3NlcTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLSZndDt2Y3B1LSZndDtrdm07CkBAIC0xNjIyLDcgJiM0MzsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIAogCWlmICghcGVybV9mYXVsdCkgewogCQltZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7dmNwdSk7Ci0JCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1LCBtZW1jYWNoZSk7CiYjNDM7CQlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBtZW1jYWNoZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE2MzIsOCAmIzQzOzE2NjUsOCBAQCBzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCWVsc2UKIAkJZ2ZuID0gczJmZC0mZ3Q7ZmF1bHRfaXBhICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAKLQl3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdChzMmZkLSZndDt2Y3B1KTsKLQlleGVjX2ZhdWx0ID0ga3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtJmd0O3ZjcHUpOwomIzQzOwl3cml0ZV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKTsKJiM0MzsJZXhlY19mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpOwogCiAJVk1fV0FSTl9PTl9PTkNFKHdyaXRlX2ZhdWx0ICZhbXA7JmFtcDsgZXhlY19mYXVsdCk7CiAKQEAgLTE2ODcsNyAmIzQzOzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIAlpZiAoKHByb3QgJmFtcDsgS1ZNX1BHVEFCTEVfUFJPVF9XKSAmYW1wOyZhbXA7ICFyZXQpCiAJCW1hcmtfcGFnZV9kaXJ0eV9pbl9zbG90KGt2bSwgczJmZC0mZ3Q7bWVtc2xvdCwgZ2ZuKTsKIAotCXJldHVybiByZXQgIT0gLUVBR0FJTiA/IHJldCA6IDA7CiYjNDM7CWlmIChyZXQgPT0gLUVBR0FJTikKJiM0MzsJCXJldHVybiByZXN1bHQgPyByZXQgOiAwOwomIzQzOwomIzQzOwlpZiAocmVzdWx0ICZhbXA7JmFtcDsgIXJldCkKJiM0MzsJCXJlc3VsdC0mZ3Q7bWFwcGluZ19zaXplID0gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHsKQEAgLTE3MDksNyAmIzQzOzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gczJmZC0mZ3Q7dmNwdTsKLQlzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHZjcHUtJmd0O2FyY2guaHdfbW11LSZndDtwZ3Q7CiYjNDM7CXN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gczJmZC0mZ3Q7bW11LSZndDtwZ3Q7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LSZndDttbTsKIAlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LSZndDtrdm07CiAJdm9pZCAqaHlwX21lbWNhY2hlOwpAQCAtMTcxNyw3ICYjNDM7MTc1Niw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCWludCByZXQ7CiAKIAloeXBfbWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHZjcHUpOwotCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZSh2Y3B1LCBoeXBfbWVtY2FjaGUpOwomIzQzOwlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBoeXBfbWVtY2FjaGUpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xODQwLDExICYjNDM7MTg3OSw2IEBAIHN0YXRpYyBzaG9ydCBrdm1fczJfcmVzb2x2ZV92bWFfc2l6ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJcmV0dXJuIHZtYV9zaGlmdDsKIH0KIAotc3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQotewotCXJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC0mZ3Q7dmNwdSk7Ci19Ci0KIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJCQkJICAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvICpzMnZpKQogewpAQCAtMTkxMCwxMyAmIzQzOzE5NDQsMTEgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfcGluX3Bmbihjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJCXJldHVybiByZXQ7CiAKIAlzMnZpLSZndDtwZm4gPSBfX2t2bV9mYXVsdGluX3BmbihzMmZkLSZndDttZW1zbG90LCBnZXRfY2Fub25pY2FsX2dmbihzMmZkLCBzMnZpKSwKLQkJCQkgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC0mZ3Q7dmNwdSkgPyBGT0xMX1dSSVRFIDogMCwKJiM0MzsJCQkJICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsCiAJCQkJICAgICAgJmFtcDtzMnZpLSZndDttYXBfd3JpdGFibGUsICZhbXA7czJ2aS0mZ3Q7cGFnZSk7CiAJaWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS0mZ3Q7cGZuKSkpIHsKLQkJaWYgKHMydmktJmd0O3BmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikgewotCQkJa3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtJmd0O2h2YSwgX19mZnMoczJ2aS0mZ3Q7dm1hX3BhZ2VzaXplKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQomIzQzOwkJaWYgKHMydmktJmd0O3BmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikKJiM0MzsJCQlyZXR1cm4gLUVIV1BPSVNPTjsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xOTY4LDcgJiM0MzsyMDAwLDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLSZndDt2Y3B1LSZndDtrdm07CiAKLQlpZiAoa3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtJmd0O3ZjcHUpICZhbXA7JmFtcDsgczJ2aS0mZ3Q7bWFwX25vbl9jYWNoZWFibGUpCiYjNDM7CWlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSAmYW1wOyZhbXA7IHMydmktJmd0O21hcF9ub25fY2FjaGVhYmxlKQogCQlyZXR1cm4gLUVOT0VYRUM7CiAKIAkvKgpAQCAtMTk3Nyw3ICYjNDM7MjAwOSw3IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0CiAJICogdGhlIGZhdWx0IGJhY2sgdG8gdGhlIGd1ZXN0LgogCSAqLwotCWlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC0mZ3Q7dmNwdSkpKSB7CiYjNDM7CWlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KHMyZmQtJmd0O2VzcikpIHsKIAkJa3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtJmd0O3ZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtJmd0O3ZjcHUpKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTk4NiwxMyAmIzQzOzIwMTgsMTMgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIAogCWlmIChzMnZpLSZndDttYXBfd3JpdGFibGUgJmFtcDsmYW1wOyAoczJ2aS0mZ3Q7ZGV2aWNlIHx8CiAJCQkJICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLSZndDttZW1zbG90KSB8fAotCQkJCSAgIGt2bV9pc193cml0ZV9mYXVsdChzMmZkLSZndDt2Y3B1KSkpCiYjNDM7CQkJCSAgIGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKSkpCiAJCSpwcm90IHw9IEtWTV9QR1RBQkxFX1BST1RfVzsKIAogCWlmIChzMmZkLSZndDtuZXN0ZWQpCiAJCSpwcm90ID0gYWRqdXN0X25lc3RlZF9mYXVsdF9wZXJtcyhzMmZkLSZndDtuZXN0ZWQsICpwcm90KTsKIAotCWlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC0mZ3Q7dmNwdSkpCiYjNDM7CWlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSkKIAkJKnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9YOwogCiAJaWYgKHMydmktJmd0O21hcF9ub25fY2FjaGVhYmxlKQpAQCAtMjAxNiw3ICYjNDM7MjA0OCw4IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9tYXAoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAogCQkJICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksCiAJCQkgICAgZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QsCi0JCQkgICAgdm9pZCAqbWVtY2FjaGUpCiYjNDM7CQkJICAgIHZvaWQgKm1lbWNhY2hlLAomIzQzOwkJCSAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KQogewogCWVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncyA9IEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEOwogCWJvb2wgd3JpdGFibGUgPSBwcm90ICZhbXA7IEtWTV9QR1RBQkxFX1BST1RfVzsKQEAgLTIwMjksMTMgJiM0MzsyMDYyLDEyIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJaW50IHJldDsKIAogCWt2bV9mYXVsdF9sb2NrKGt2bSk7Ci0JcGd0ID0gczJmZC0mZ3Q7dmNwdS0mZ3Q7YXJjaC5od19tbXUtJmd0O3BndDsKJiM0MzsJcGd0ID0gczJmZC0mZ3Q7bW11LSZndDtwZ3Q7CiAJcmV0ID0gLUVBR0FJTjsKIAlpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLSZndDttbXVfc2VxKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID8KLQkJCSAgICAgIGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShzMmZkLSZndDt2Y3B1KSA6IDApOwomIzQzOwlwZXJtX2ZhdWx0X2dyYW51bGUgPSBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQpOwogCW1hcHBpbmdfc2l6ZSA9IHMydmktJmd0O3ZtYV9wYWdlc2l6ZTsKIAlwZm4gPSBzMnZpLSZndDtwZm47CiAJZ2ZuID0gczJ2aS0mZ3Q7Z2ZuOwpAQCAtMjA5NiwxNCAmIzQzOzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIAkJbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLSZndDttZW1zbG90LCBncGFfdG9fZ2ZuKGlwYSkpOwogCX0KIAotCWlmIChyZXQgIT0gLUVBR0FJTikKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKJiM0MzsJaWYgKHJldCA9PSAtRUFHQUlOKQomIzQzOwkJcmV0dXJuIHJlc3VsdCA/IHJldCA6IDA7CiYjNDM7CiYjNDM7CWlmIChyZXN1bHQgJmFtcDsmYW1wOyAhcmV0KQomIzQzOwkJcmVzdWx0LSZndDttYXBwaW5nX3NpemUgPSBtYXBwaW5nX3NpemU7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQomIzQzO3N0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAomIzQzOwkJCSAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdCkKIHsKLQlib29sIHBlcm1fZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC0mZ3Q7dmNwdSk7CiYjNDM7CWJvb2wgcGVybV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpOwogCXN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gczJ2aSA9IHt9OwogCWVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90OwogCXZvaWQgKm1lbWNhY2hlOwpAQCAtMjEyMSw3ICYjNDM7MjE1OCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCW1lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1KTsKIAlpZiAoIXBlcm1fZmF1bHQgfHwgbWVtc2xvdF9pc19sb2dnaW5nKHMyZmQtJmd0O21lbXNsb3QpIHx8CiAJICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7Ci0JCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1LCBtZW1jYWNoZSk7CiYjNDM7CQlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBtZW1jYWNoZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTIxMzEsNiAmIzQzOzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiAJICogZ2V0IGJsb2NrIG1hcHBpbmcgZm9yIGRldmljZSBNTUlPIHJlZ2lvbi4KIAkgKi8KIAlyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCAmYW1wO3MydmkpOwomIzQzOwlpZiAocmV0ID09IC1FSFdQT0lTT04pIHsKJiM0MzsJCS8qIElmIHJlc3VsdCBpcyBzcGVjaWZpZWQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSB0aGlzLiAqLwomIzQzOwkJaWYgKHJlc3VsdCkKJiM0MzsJCQlyZXR1cm4gLUVIV1BPSVNPTjsKJiM0MzsJCWt2bV9zZW5kX2h3cG9pc29uX3NpZ25hbChzMmZkLSZndDtodmEsIF9fZmZzKHMydmkudm1hX3BhZ2VzaXplKSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQogCWlmIChyZXQgIT0gMSkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjE0MCw3ICYjNDM7MjE4NCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsICZhbXA7czJ2aSwgcHJvdCwgbWVtY2FjaGUpOwomIzQzOwlyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCAmYW1wO3MydmksIHByb3QsIG1lbWNhY2hlLCByZXN1bHQpOwogfQogCiAvKiBSZXNvbHZlIHRoZSBhY2Nlc3MgZmF1bHQgYnkgbWFraW5nIHRoZSBwYWdlIHlvdW5nIGFnYWluLiAqLwpAQCAtMjI1MCw3ICYjNDM7MjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9zMl90cmFucyBuZXN0ZWRfdHJhbnMsICpuZXN0ZWQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZXNyOwomIzQzOwl1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7CiYjNDM7CXN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LSZndDthcmNoLmh3X21tdTsKIAlwaHlzX2FkZHJfdCBmYXVsdF9pcGE7IC8qIFRoZSBhZGRyZXNzIHdlIGZhdWx0ZWQgb24gKi8KIAlwaHlzX2FkZHJfdCBpcGE7IC8qIEFsd2F5cyB0aGUgSVBBIGluIHRoZSBMMSBndWVzdCBwaHlzIHNwYWNlICovCiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKQEAgLTIyNTksMTEgJiM0MzsyMzA0LDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCWdmbl90IGdmbjsKIAlpbnQgcmV0LCBpZHg7CiAKLQlpZiAoa3ZtX3ZjcHVfYWJ0X2lzc2VhKHZjcHUpKQomIzQzOwlpZiAoZXNyX2FidF9pc19zZWEoZXNyKSkKIAkJcmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpOwogCi0JZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTsKLQogCS8qCiAJICogVGhlIGZhdWx0IElQQSBzaG91bGQgYmUgcmVsaWFibGUgYXQgdGhpcyBwb2ludCBhcyB3ZSYjMzk7cmUgbm90IGRlYWxpbmcKIAkgKiB3aXRoIGFuIFNFQS4KQEAgLTIyNzIsNyAmIzQzOzIzMTUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJaWYgKEtWTV9CVUdfT04oaXBhID09IElOVkFMSURfR1BBLCB2Y3B1LSZndDtrdm0pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7CiYjNDM7CWlzX2lhYnQgPSBlc3JfdHJhcF9pc19pYWJ0KGVzcik7CiAKIAlpZiAoZXNyX2ZzY19pc190cmFuc2xhdGlvbl9mYXVsdChlc3IpKSB7CiAJCS8qIEJleW9uZCBzYW5pdGlzZWQgUEFSYW5nZSAod2hpY2ggaXMgdGhlIElQQSBsaW1pdCkgKi8KQEAgLTIyODIsMTQgJiM0MzsyMzI1LDE0IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkJfQogCiAJCS8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovCi0JCWlmIChmYXVsdF9pcGEgJmd0Oz0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS0mZ3Q7YXJjaC5od19tbXUtJmd0O3Z0Y3IpKSkgewomIzQzOwkJaWYgKGZhdWx0X2lwYSAmZ3Q7PSBCSVRfVUxMKFZUQ1JfRUwyX0lQQShtbXUtJmd0O3Z0Y3IpKSkgewogCQkJZmF1bHRfaXBhIHw9IEZBUl9UT19GSVBBX09GRlNFVChrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7CiAKIAkJCXJldHVybiBrdm1faW5qZWN0X3NlYSh2Y3B1LCBpc19pYWJ0LCBmYXVsdF9pcGEpOwogCQl9CiAJfQogCi0JdHJhY2Vfa3ZtX2d1ZXN0X2ZhdWx0KCp2Y3B1X3BjKHZjcHUpLCBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpLAomIzQzOwl0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzciwKIAkJCSAgICAgIGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpLCBmYXVsdF9pcGEpOwogCiAJLyogQ2hlY2sgdGhlIHN0YWdlLTIgZmF1bHQgaXMgdHJhbnMuIGZhdWx0IG9yIHdyaXRlIGZhdWx0ICovCkBAIC0yMjk4LDkgJiM0MzsyMzQxLDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCSAgICAhZXNyX2ZzY19pc19hY2Nlc3NfZmxhZ19mYXVsdChlc3IpICZhbXA7JmFtcDsKIAkgICAgIWVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoZXNyKSkgewogCQlrdm1fZXJyKCYjMzQ7VW5zdXBwb3J0ZWQgRlNDOiBFQz0lI3ggeEZTQz0lI2x4IEVTUl9FTDI9JSNseFxuJiMzNDssCi0JCQlrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSwKLQkJCSh1bnNpZ25lZCBsb25nKWt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KHZjcHUpLAotCQkJKHVuc2lnbmVkIGxvbmcpa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiYjNDM7CQkJZXNyX2dldF9lYyhlc3IpLAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKShlc3IgJmFtcDsgRVNSX0VMeF9GU0MpLAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKWVzcik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMjMxOSw4ICYjNDM7MjM2Miw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkgKiBub3RoaW5nIHRvIHdhbGsgYW5kIHdlIHRyZWF0IGl0IGFzIGEgMToxIGJlZm9yZSBnb2luZyB0aHJvdWdoIHRoZQogCSAqIGNhbm9uaWNhbCB0cmFuc2xhdGlvbi4KIAkgKi8KLQlpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS0mZ3Q7a3ZtLHZjcHUtJmd0O2FyY2guaHdfbW11KSAmYW1wOyZhbXA7Ci0JICAgIHZjcHUtJmd0O2FyY2guaHdfbW11LSZndDtuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHsKJiM0MzsJaWYgKGt2bV9pc19uZXN0ZWRfczJfbW11KHZjcHUtJmd0O2t2bSwgbW11KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBtbXUtJmd0O25lc3RlZF9zdGFnZTJfZW5hYmxlZCkgewogCQl1MzIgZXNyOwogCiAJCXJldCA9IGt2bV93YWxrX25lc3RlZF9zMih2Y3B1LCBmYXVsdF9pcGEsICZhbXA7bmVzdGVkX3RyYW5zKTsKQEAgLTIzNDksNyAmIzQzOzIzOTIsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJZ2ZuID0gaXBhICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJbWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtJmd0O2t2bSwgZ2ZuKTsKIAlodmEgPSBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChtZW1zbG90LCBnZm4sICZhbXA7d3JpdGFibGUpOwotCXdyaXRlX2ZhdWx0ID0ga3ZtX2lzX3dyaXRlX2ZhdWx0KHZjcHUpOwomIzQzOwl3cml0ZV9mYXVsdCA9IGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoZXNyKTsKIAlpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIHx8ICh3cml0ZV9mYXVsdCAmYW1wOyZhbXA7ICF3cml0YWJsZSkpIHsKIAkJLyoKIAkJICogVGhlIGd1ZXN0IGhhcyBwdXQgZWl0aGVyIGl0cyBpbnN0cnVjdGlvbnMgb3IgaXRzIHBhZ2UtdGFibGVzCkBAIC0yMzYyLDcgJiM0MzsyNDA1LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoa3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KSkgewomIzQzOwkJaWYgKGVzcl9hYnRfaXNfczFwdHcoZXNyKSkgewogCQkJcmV0ID0ga3ZtX2luamVjdF9zZWFfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KQEAgLTIzNzcsNyAmIzQzOzI0MjAsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCSAqIFNvIGxldCYjMzk7cyBhc3N1bWUgdGhhdCB0aGUgZ3Vlc3QgaXMganVzdCBiZWluZwogCQkgKiBjYXV0aW91cywgYW5kIHNraXAgdGhlIGluc3RydWN0aW9uLgogCQkgKi8KLQkJaWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSAmYW1wOyZhbXA7IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHsKJiM0MzsJCWlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgJmFtcDsmYW1wOyBlc3JfZGFidF9pc19jbShlc3IpKSB7CiAJCQlrdm1faW5jcl9wYyh2Y3B1KTsKIAkJCXJldCA9IDE7CiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC0yMzk1LDcgJiM0MzsyNDM4LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCX0KIAogCS8qIFVzZXJzcGFjZSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVnaXN0ZXIgb3V0LW9mLWJvdW5kcyBJUEFzICovCi0JVk1fQlVHX09OKGlwYSAmZ3Q7PSBrdm1fcGh5c19zaXplKHZjcHUtJmd0O2FyY2guaHdfbW11KSk7CiYjNDM7CVZNX0JVR19PTihpcGEgJmd0Oz0ga3ZtX3BoeXNfc2l6ZShtbXUpKTsKIAogCWlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHsKIAkJaGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpOwpAQCAtMjQwOSwxOSAmIzQzOzI0NTIsMjAgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkubmVzdGVkCQk9IG5lc3RlZCwKIAkJLm1lbXNsb3QJPSBtZW1zbG90LAogCQkuaHZhCQk9IGh2YSwKJiM0MzsJCS5lc3IJCT0gZXNyLAomIzQzOwkJLm1tdQkJPSBtbXUsCiAJfTsKIAogCWlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtJmd0O2t2bSkpIHsKIAkJcmV0ID0gcGt2bV9tZW1fYWJvcnQoJmFtcDtzMmZkKTsKIAl9IGVsc2UgewotCQlWTV9XQVJOX09OX09OQ0Uoa3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpICZhbXA7JmFtcDsKLQkJCQkhd3JpdGVfZmF1bHQgJmFtcDsmYW1wOwotCQkJCSFrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQodmNwdSkpOwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKCZhbXA7czJmZCkgJmFtcDsmYW1wOyAhd3JpdGVfZmF1bHQgJmFtcDsmYW1wOwomIzQzOwkJCQkha3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoJmFtcDtzMmZkKSk7CiAKIAkJaWYgKGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpKQotCQkJcmV0ID0gZ21lbV9hYm9ydCgmYW1wO3MyZmQpOwomIzQzOwkJCXJldCA9IGdtZW1fYWJvcnQoJmFtcDtzMmZkLCBOVUxMKTsKIAkJZWxzZQotCQkJcmV0ID0gdXNlcl9tZW1fYWJvcnQoJmFtcDtzMmZkKTsKJiM0MzsJCQlyZXQgPSB1c2VyX21lbV9hYm9ydCgmYW1wO3MyZmQsIE5VTEwpOwogCX0KIAogCWlmIChyZXQgPT0gMCkKQEAgLTI3OTIsMyAmIzQzOzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpCiAKIAl0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpOwogfQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJ5IHRvIHdhbGsgdG8gdGhlIHNwZWNpZmllZCBHUEEgaW4gY2Fub25pY2FsIG1tdSAtIGlmIHVubWFwcGVkIHJldHVybnMgMCwgaWYKJiM0MzsgKiBtYXBwZWQgcmV0dXJucyB0aGUgZ3JhbnVsZSBzaXplLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJvci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBrdm1fd2Fsa19zMihzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwKJiM0MzsJCQlncGFfdCBncGEsIHM4ICpsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm0gKmt2bSA9IGt2bV9zMl9tbXVfdG9fa3ZtKHBndC0mZ3Q7bW11KTsKJiM0MzsJa3ZtX3B0ZV90IHB0ZTsKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CWd1YXJkKHJlYWRfbG9jaykoJmFtcDtrdm0tJmd0O21tdV9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYocGd0LCBncGEsICZhbXA7cHRlLCBsZXZlbCwKJiM0MzsJCQkJICAgS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJLyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovCiYjNDM7CWlmICgha3ZtX3B0ZV92YWxpZChwdGUpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBrdm1fZ3JhbnVsZV9zaXplKCpsZXZlbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN5bnRoZXNpc2VkIGRhdGEgYWJvcnQgYXQgc3BlY2lmaWVkIHBhZ2UgdGFibGUgbGV2ZWwuICovCiYjNDM7I2RlZmluZSBQUkVfRkFVTFRfRVNSKGxldmVsKQkJCQlcCiYjNDM7CSAoKEVTUl9FTHhfRUNfREFCVF9MT1cgJmx0OyZsdDsgRVNSX0VMeF9FQ19TSElGVCkgfAlcCiYjNDM7CSAgRVNSX0VMeF9JTCB8IEVTUl9FTHhfRlNDX0ZBVUxUX0wobGV2ZWwpKQomIzQzOwomIzQzOy8qIFJldHJpZXZlIGVpdGhlciBhIHJlYWQtb25seSBvciBhIHJlYWQvd3JpdGUgaHZhLiAqLwomIzQzO3N0YXRpYyBodmFfdCBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBnZm5fdCBnZm4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3Qoc2xvdCwgZ2ZuLCAvKndyaXRhYmxlPSovTlVMTCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb25nIF9fcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKJiM0MzsJCQkgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKQomIzQzO3sKJiM0MzsJY29uc3QgYm9vbCBpc19nbWVtID0ga3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCk7CiYjNDM7CWNvbnN0IGdmbl90IGdmbiA9IGdwYV90b19nZm4oZ3BhKTsKJiM0MzsJY29uc3QgaHZhX3QgaHZhID0gaXNfZ21lbSA/IDAgOiBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChtZW1zbG90LCBnZm4pOwomIzQzOwljb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgczJmZCA9IHsKJiM0MzsJCS52Y3B1CQk9IHZjcHUsCiYjNDM7CQkuZmF1bHRfaXBhCT0gZ3BhLAomIzQzOwkJLm5lc3RlZAkJPSBOVUxMLAomIzQzOwkJLm1lbXNsb3QJPSBtZW1zbG90LAomIzQzOwkJLmh2YQkJPSBodmEsCiYjNDM7CQkuZXNyCQk9IFBSRV9GQVVMVF9FU1IobGV2ZWwpLAomIzQzOwkJLm1tdQkJPSBtbXUsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHJlc3VsdCA9IHt9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJaWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlpZiAoaXNfZ21lbSkKJiM0MzsJCXJldCA9IGdtZW1fYWJvcnQoJmFtcDtzMmZkLCAmYW1wO3Jlc3VsdCk7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IHVzZXJfbWVtX2Fib3J0KCZhbXA7czJmZCwgJmFtcDtyZXN1bHQpOwomIzQzOwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gcmVzdWx0Lm1hcHBpbmdfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcgcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKJiM0MzsJCQkgZ3BhX3QgZ3BhLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KQomIzQzO3sKJiM0MzsJczggbGV2ZWw7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKiBUcnkgYSB3YWxrIGZpcnN0LiAqLwomIzQzOwlyZXQgPSBrdm1fd2Fsa19zMihtbXUtJmd0O3BndCwgZ3BhLCAmYW1wO2xldmVsKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CS8qIE9LLCBoYXZlIHRvIGZhdWx0IHBhZ2UgaW4uICovCiYjNDM7CXJldHVybiBfX3ByZV9mYXVsdF9zMihtbXUsIHZjcHUsIGdwYSwgbWVtc2xvdCwgbGV2ZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZwomIzQzO3ByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGFfdCBncGEsIHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplLAomIzQzOwkJCSB1bnNpZ25lZCBsb25nIGJ5dGVzX3JlbWFpbmluZykKJiM0Mzt7CiYjNDM7CS8qIEdyYW51bGVzIGFyZSBhbHdheXMgYSBwb3dlci1vZi0yLiAqLwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIGdyYW51bGVfYnl0ZXNfcmVtYWluaW5nID0KJiM0MzsJCWdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gbWluKGdyYW51bGVfYnl0ZXNfcmVtYWluaW5nLCBieXRlc19yZW1haW5pbmcpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBJZiB5b3UgbG9zZSB0aGUgcmFjZSB0aGlzIG1hbnkgdGltZXMsIHRpbWUgdG8gZ2l2ZSB1cC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9QUkVfRkFVTFRfUkVUUklFUyAzCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICoga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5IC0gcHJlLWZhdWx0IHN0YWdlLTIgcGFnZSB0YWJsZXMgZm9yIHRoZQomIzQzOyAqIHNwZWNpZmllZCBHUEEuCiYjNDM7ICogQHZjcHU6CVRoZSBWQ1BVIHBvaW50ZXIKJiM0MzsgKiBAcmFuZ2U6CXtncGEsIHNpemUsIGZsYWdzfSB0dXBsZQomIzQzOyAqCiYjNDM7ICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5CiYjNDM7ICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuCiYjNDM7ICoKJiM0MzsgKiBAcmFuZ2UtJmd0O2dwYSBzcGVjaWZpZXMgdGhlIEdQQSB0byBwcmUtZmF1bHQsIEByYW5nZS0mZ3Q7c2l6ZSBzcGVjaWZpZXMgaG93IG1hbnkKJiM0MzsgKiBieXRlcyByZW1haW4gdG8gYmUgcHJlLWZhdWx0ZWQgYW5kIEByYW5nZS0mZ3Q7ZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuCiYjNDM7ICovCiYjNDM7bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAomIzQzOwkJCQkgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtJmd0O2t2bTsKJiM0MzsJY29uc3QgdTY0IGJ5dGVzX3JlbWFpbmluZyA9IHJhbmdlLSZndDtzaXplOwomIzQzOwlzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11ID0gJmFtcDtrdm0tJmd0O2FyY2gubW11OyAvKiBDYW5vbmljYWwuICovCiYjNDM7CXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CiYjNDM7CWNvbnN0IGdwYV90IGdwYSA9IHJhbmdlLSZndDtncGE7CiYjNDM7CWludCBudW1fcmV0cmllcyA9IDA7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBwS1ZNIGlzIHVuc3VwcG9ydGVkIGFzIHRoZWlyIHZDUFVzIGFyZSBpbnN0YW50aWF0ZWQgb24gZmlyc3QgcnVuIGFuZAomIzQzOwkgKiBwcmUtZmF1bHRpbmcgb25seSBydW5uaW5nIHZDUFVzIHdvdWxkIGJlIGluY29uc2lzdGVudCBhbmQgY29uZnVzaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwltZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBncGFfdG9fZ2ZuKGdwYSkpOwomIzQzOwlpZiAoIW1lbXNsb3QpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJLyogU1JDVSBtdXN0IGJlIHJlbGVhc2VkIGZvciBwcm9ncmVzcyBhbmQgb25seSB1c2VybGFuZCBjYW4gZG8gdGhhdC4gKi8KJiM0MzsJaWYgKG1lbXNsb3QtJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1TTE9UX0lOVkFMSUQpCiYjNDM7CQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJcmV0ID0gcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90KTsKJiM0MzsJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4gJmFtcDsmYW1wOyBudW1fcmV0cmllcyYjNDM7JiM0MzsgJmx0OyBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMpOwomIzQzOwomIzQzOwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYSwgcmV0LCBieXRlc19yZW1haW5pbmcpOwomIzQzO30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jIGIvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKaW5kZXggMTcxMjNmMGI2ZGFiYS4uMzQ4OGQ1YWQyMjViNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKQEAgLTY1NCw3ICYjNDM7NjU0LDcgQEAgc3RhdGljIHU4IGdldF9ndWVzdF9tYXBwaW5nX3R0bChzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB1NjQgYWRkcikKIAkJcmV0dXJuIDA7CiAKIAl0bXAgJmFtcDs9IH4oc3ogLSAxKTsKLQlpZiAoa3ZtX3BndGFibGVfZ2V0X2xlYWYobW11LSZndDtwZ3QsIHRtcCwgJmFtcDtwdGUsIE5VTEwpKQomIzQzOwlpZiAoa3ZtX3BndGFibGVfZ2V0X2xlYWYobW11LSZndDtwZ3QsIHRtcCwgJmFtcDtwdGUsIE5VTEwsIDApKQogCQlnb3RvIGFnYWluOwogCWlmICghKHB0ZSAmYW1wOyBQVEVfVkFMSUQpKQogCQlnb3RvIGFnYWluOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm0KaW5kZXggNWY4ZDE3ZWU1ZjY3Ny4uMWUwZWRkMGY5OWY3NSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtCkBAIC0xNzMsNiAmIzQzOzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9kZWJ1Zy1leGNlcHRpb25zCiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvaGVsbG9fZWwyCiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvaG9zdF9zdmUKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9oeXBlcmNhbGxzCiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdAogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L2V4dGVybmFsX2Fib3J0cwogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L21taW9fc2lnbl9leHQKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9wYWdlX2ZhdWx0X3Rlc3QKQEAgLTE5OSw2ICYjNDM7MjAwLDcgQEAgVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGd1ZXN0X21lbWZkX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBtbXVfc3RyZXNzX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSByc2VxX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBzdGVhbF90aW1lCiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHByZV9mYXVsdF9tZW1vcnlfdGVzdAogCiBURVNUX0dFTl9QUk9HU19zMzkwID0gJChURVNUX0dFTl9QUk9HU19DT01NT04pCiBURVNUX0dFTl9QUk9HU19zMzkwICYjNDM7PSBzMzkwL21lbW9wCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMDljMWRiMzAzODU2NgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwxNTggQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CiYjNDM7LyoKJiM0MzsgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZQomIzQzOyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZQomIzQzOyAqIHJlYWwgRUwxIHJlZ2lzdGVycyB0aGVuIEVSRVRzIHRvIHZFTDEgYW5kIGV4aXRzIHRvIHVzZXJzcGFjZSBzbyBpdHMgdkNQVQomIzQzOyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkIGJhY2tlZCBieSBhIHNoYWRvdyBzdGFnZSAyIE1NVS4KJiM0MzsgKgomIzQzOyAqIEFzc2VydCB0aGF0IHByZS1mYXVsdGluZyBpZ25vcmVzIHRoYXQgYW5kIHRhcmdldHMgdGhlIGNhbm9uaWNhbCBzdGFnZS0yCiYjNDM7ICogcGFnZSB0YWJsZXMgb25seS4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O2t2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7cHJvY2Vzc29yLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dWNhbGwuaCYjMzQ7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9zeXNyZWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2l6ZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFRFU1RfTUVNX1NMT1QJCTEwCiYjNDM7I2RlZmluZSBURVNUX01FTV9TSVpFCQlTWl8yTQomIzQzOyNkZWZpbmUgVEVTVF9NRU1fR1BBCQlTWl8xRwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGd1ZXN0X2VsMV9jb2RlKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgb2Zmc2V0OwomIzQzOwomIzQzOwlHVUVTVF9BU1NFUlRfRVEoZ2V0X2N1cnJlbnRfZWwoKSwgMSk7CiYjNDM7CiYjNDM7CS8qIEV4aXQgdG8gdXNlcnNwYWNlIHdpdGggdGhlIHZFTDEgKG5lc3RlZCkgY29udGV4dCBsaXZlLiAqLwomIzQzOwlHVUVTVF9TWU5DKDEpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3cKJiM0MzsJICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLgomIzQzOwkgKi8KJiM0MzsJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBURVNUX01FTV9TSVpFOyBvZmZzZXQgJiM0Mzs9IFNaXzRLKQomIzQzOwkJUkVBRF9PTkNFKCoodTY0ICopKFRFU1RfTUVNX0dQQSAmIzQzOyBvZmZzZXQpKTsKJiM0MzsKJiM0MzsJR1VFU1RfRE9ORSgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgc3A7CiYjNDM7CiYjNDM7CUdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAyKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTWlycm9yIHRoZSBFTDIgdHJhbnNsYXRpb24gcmVnaW1lIGludG8gdGhlIHJlYWwgRUwxIHJlZ2lzdGVycyBzbwomIzQzOwkgKiB0aGF0IHZFTDEgcnVucyBvbiB0aGUgdGVzdCYjMzk7cyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGUKJiM0MzsJICogX0VMMSBhY2Nlc3NvcnMgcmVhZCB0aGUgRUwyIHJlZ2lzdGVycywgYW5kIHRoZSBfRUwxMiBhY2Nlc3NvcnMKJiM0MzsJICogd3JpdGUgdGhlIHJlYWwgRUwxIHJlZ2lzdGVycy4KJiM0MzsJICovCiYjNDM7CXdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHNjdGxyX2VsMSksIFNZU19TQ1RMUl9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcodGNyX2VsMSksIFNZU19UQ1JfRUwxMik7CiYjNDM7CXdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcobWFpcl9lbDEpLCBTWVNfTUFJUl9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoY3BhY3JfZWwxKSwgU1lTX0NQQUNSX0VMMTIpOwomIzQzOwomIzQzOwkvKiBSdW4gdkVMMSBvbiB0aGUgc2FtZSBzdGFjay4gKi8KJiM0MzsJYXNtIHZvbGF0aWxlKCYjMzQ7bW92ICUwLCBzcCYjMzQ7IDogJiMzNDs9ciYjMzQ7KHNwKSk7CiYjNDM7CXdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRHJvcCBUR0Ugc28gdGhhdCB2RUwxIGlzIGEgbmVzdGVkIGNvbnRleHQgcmF0aGVyIHRoYW4gaG9zdCBFTDAuCiYjNDM7CSAqIEtWTSBiYWNrcyBpdCB3aXRoIGEgc2hhZG93IHN0YWdlLTIgTU1VIGV2ZW4gdGhvdWdoIHZzdGFnZS0yIGlzCiYjNDM7CSAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLgomIzQzOwkgKi8KJiM0MzsJd3JpdGVfc3lzcmVnKHJlYWRfc3lzcmVnKGhjcl9lbDIpICZhbXA7IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7CiYjNDM7CWlzYigpOwomIzQzOwomIzQzOwl3cml0ZV9zeXNyZWcoUFNSX01PREVfRUwxaCB8IFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFBTUl9BX0JJVCB8CiYjNDM7CQkgICAgIFBTUl9EX0JJVCwgc3Bzcl9lbDIpOwomIzQzOwl3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7CiYjNDM7CWFzbSB2b2xhdGlsZSgmIzM0O2VyZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CUdVRVNUX0FTU0VSVChmYWxzZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHByZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBncGEsIHU2NCBzaXplKQomIzQzO3sKJiM0MzsJc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0gewomIzQzOwkJLmdwYSA9IGdwYSwKJiM0MzsJCS5zaXplID0gc2l6ZSwKJiM0MzsJfTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJcmV0ID0gX192Y3B1X2lvY3RsKHZjcHUsIEtWTV9QUkVfRkFVTFRfTUVNT1JZLCAmYW1wO3JhbmdlKTsKJiM0MzsJfSB3aGlsZSAoKCFyZXQgJmFtcDsmYW1wOyByYW5nZS5zaXplKSB8fAomIzQzOwkJIChyZXQgJmx0OyAwICZhbXA7JmFtcDsgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpKTsKJiM0MzsKJiM0MzsJVEVTVF9BU1NFUlQoIXJldCwgJiMzNDtLVk1fUFJFX0ZBVUxUX01FTU9SWSBmYWlsZWQsIHJldDogJWQgZXJybm86ICVkJiMzNDssCiYjNDM7CQkgICAgcmV0LCBlcnJubyk7CiYjNDM7CVRFU1RfQVNTRVJUX0VRKHJhbmdlLnNpemUsIDApOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDsKJiM0MzsJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwomIzQzOwlzdHJ1Y3Qga3ZtX3ZtICp2bTsKJiM0MzsJc3RydWN0IHVjYWxsIHVjOwomIzQzOwl1NjQgbnBhZ2VzOwomIzQzOwomIzQzOwlURVNUX1JFUVVJUkUodGVzdF9zdXBwb3J0c19lbDIoKSk7CiYjNDM7CVRFU1RfUkVRVUlSRShrdm1fY2hlY2tfY2FwKEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWSkpOwomIzQzOwomIzQzOwl2bSA9IHZtX2NyZWF0ZSgxKTsKJiM0MzsKJiM0MzsJa3ZtX2dldF9kZWZhdWx0X3ZjcHVfdGFyZ2V0KHZtLCAmYW1wO2luaXQpOwomIzQzOwlpbml0LmZlYXR1cmVzWzBdIHw9IEJJVChLVk1fQVJNX1ZDUFVfSEFTX0VMMik7CiYjNDM7CXZjcHUgPSBhYXJjaDY0X3ZjcHVfYWRkKHZtLCAwLCAmYW1wO2luaXQsIGd1ZXN0X2NvZGUpOwomIzQzOwlrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7CiYjNDM7CiYjNDM7CW5wYWdlcyA9IFRFU1RfTUVNX1NJWkUgLyB2bS0mZ3Q7cGFnZV9zaXplOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIFZNX01FTV9TUkNfQU5PTllNT1VTLCBURVNUX01FTV9HUEEsCiYjNDM7CQkJCSAgICBURVNUX01FTV9TTE9ULCBucGFnZXMsIDApOwomIzQzOwl2aXJ0X21hcCh2bSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9HUEEsIG5wYWdlcyk7CiYjNDM7CiYjNDM7CS8qIFJ1biB0aGUgZ3Vlc3QgdW50aWwgaXQgaGFzIEVSRVQmIzM5O2QgZnJvbSB2RUwyIHRvIHZFTDEuICovCiYjNDM7CXZjcHVfcnVuKHZjcHUpOwomIzQzOwlzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCAmYW1wO3VjKSkgewomIzQzOwljYXNlIFVDQUxMX1NZTkM6CiYjNDM7CQlURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFVDQUxMX0FCT1JUOgomIzQzOwkJUkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCVRFU1RfRkFJTCgmIzM0O1VuaGFuZGxlZCB1Y2FsbDogJWxkJiMzNDssIHVjLmNtZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHZDUFUmIzM5O3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93CiYjNDM7CSAqIHN0YWdlLTIgTU1VLgomIzQzOwkgKgomIzQzOwkgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLgomIzQzOwkgKi8KJiM0MzsJcHJlX2ZhdWx0KHZjcHUsIFRFU1RfTUVNX0dQQSwgVEVTVF9NRU1fU0laRSk7CiYjNDM7CiYjNDM7CS8qIFJlc3VtZSBhdCB2RUwxIGFuZCB0b3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gKi8KJiM0MzsJdmNwdV9ydW4odmNwdSk7CiYjNDM7CXN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsICZhbXA7dWMpKSB7CiYjNDM7CWNhc2UgVUNBTExfRE9ORToKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFVDQUxMX0FCT1JUOgomIzQzOwkJUkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCVRFU1RfRkFJTCgmIzM0O1VuaGFuZGxlZCB1Y2FsbDogJWxkJiMzNDssIHVjLmNtZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3ZtX3ZtX2ZyZWUodm0pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMKaW5kZXggYTBmY2FlM2NiN2E4Yi4uNzAyYzcyYmJmYTk2MCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYwpAQCAtMTIsMTkgJiM0MzsxMiwyOSBAQAogI2luY2x1ZGUgJmx0O3Byb2Nlc3Nvci5oJmd0OwogI2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKICNpbmNsdWRlICZsdDt1Y2FsbF9jb21tb24uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Z3Vlc3RfbW9kZXMuaCZndDsKIAogLyogQXJiaXRyYXJpbHkgY2hvc2VuIHZhbHVlcyAqLwotI2RlZmluZSBURVNUX1NJWkUJCShTWl8yTSAmIzQzOyBQQUdFX1NJWkUpCi0jZGVmaW5lIFRFU1RfTlBBR0VTCQkoVEVTVF9TSVpFIC8gUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgVEVTVF9CQVNFX1NJWkUJCVNaXzJNCiAjZGVmaW5lIFRFU1RfU0xPVAkJMTAKIAomIzQzOy8qIFN0b3JhZ2Ugb2YgdGVzdCBpbmZvIHRvIHNoYXJlIHdpdGggZ3Vlc3QgY29kZSAqLwomIzQzO3N0cnVjdCB0ZXN0X2NvbmZpZyB7CiYjNDM7CXU2NCBwYWdlX3NpemU7CiYjNDM7CXU2NCB0ZXN0X3NpemU7CiYjNDM7CXU2NCB0ZXN0X251bV9wYWdlczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgdGVzdF9jb25maWcgdGVzdF9jb25maWc7CiYjNDM7CiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSkKIHsKIAl2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDsKJiM0MzsJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmYW1wO3Rlc3RfY29uZmlnOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IFRFU1RfTlBBR0VTOyBpJiM0MzsmIzQzOykgewotCQl1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjb25maWctJmd0O3Rlc3RfbnVtX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJdTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICYjNDM7IGkgKiBjb25maWctJmd0O3BhZ2Vfc2l6ZSk7CiAKIAkJdmFsID0gKnNyYzsKIAl9CkBAIC0zNiw2ICYjNDM7NDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7CiAJc3RydWN0IGt2bV92bSAqdm07CiAJZ3BhX3QgZ3BhOwogCXUzMiBmbGFnczsKJiM0MzsJZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7CiAJYm9vbCB3b3JrZXJfcmVhZHk7CiAJYm9vbCBwcmVmYXVsdF9yZWFkeTsKIAlib29sIHJlY3JlYXRlX3Nsb3Q7CkBAIC01NiwxNCAmIzQzOzY3LDE2IEBAIHN0YXRpYyB2b2lkICpkZWxldGVfc2xvdF93b3JrZXIodm9pZCAqX19kYXRhKQogCXdoaWxlICghUkVBRF9PTkNFKGRhdGEtJmd0O3JlY3JlYXRlX3Nsb3QpKQogCQljcHVfcmVsYXgoKTsKIAotCXZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGRhdGEtJmd0O2dwYSwKLQkJCQkgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS0mZ3Q7ZmxhZ3MpOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtJmd0O21lbV9iYWNraW5nX3NyYywgZGF0YS0mZ3Q7Z3BhLAomIzQzOwkJCQkgICAgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywgZGF0YS0mZ3Q7ZmxhZ3MpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCi0JCQkgICAgIHU2NCBzaXplLCB1NjQgZXhwZWN0ZWRfbGVmdCwgYm9vbCBwcml2YXRlKQomIzQzOwkJCSAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LAomIzQzOwkJCSAgICAgZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmMsCiYjNDM7CQkJICAgICBib29sIHByaXZhdGUpCiB7CiAJc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0gewogCQkuZ3BhID0gYmFzZV9ncGEgJiM0Mzsgb2Zmc2V0LApAQCAtNzQsNiAmIzQzOzg3LDcgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCwKIAkJLnZtID0gdmNwdS0mZ3Q7dm0sCiAJCS5ncGEgPSBiYXNlX2dwYSwKIAkJLmZsYWdzID0gcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwLAomIzQzOwkJLm1lbV9iYWNraW5nX3NyYyA9IG1lbV9iYWNraW5nX3NyYywKIAl9OwogCWJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTsKIAlwdGhyZWFkX3Qgc2xvdF93b3JrZXI7CkBAIC0xNTAsOCAmIzQzOzE2NCw4IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCiAJLyoKIAkgKiBBc3NlcnQgc3VjY2VzcyBpZiBwcmVmYXVsdGluZyB0aGUgZW50aXJlIHJhbmdlIHNob3VsZCBzdWNjZWVkLCBpLmUuCiAJICogY29tcGxldGUgd2l0aCBubyBieXRlcyByZW1haW5pbmcuICBPdGhlcndpc2UgcHJlZmF1bHRpbmcgc2hvdWxkIGhhdmUKLQkgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAoZHVlIHRvIFJFVF9QRl9FTVVMQVRFIGZvciBlbXVsYXRlZCBNTUlPIHdoZW4KLQkgKiBubyBtZW1zbG90IGV4aXN0cykuCiYjNDM7CSAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChubyBtZW1zbG90IGV4aXN0cyBmb3IgdGhlIEdQQTsgb24geDg2IHRoaXMKJiM0MzsJICogc3VyZmFjZXMgdmlhIFJFVF9QRl9FTVVMQVRFKS4KIAkgKi8KIAlpZiAoIWV4cGVjdGVkX2xlZnQpCiAJCVRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS0mZ3Q7dm0pOwpAQCAtMTYwLDM5ICYjNDM7MTc0LDgyIEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCiAJCQkJCSAgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS0mZ3Q7dm0pOwogfQogCi1zdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSkKJiM0MztzdHJ1Y3QgdGVzdF9wYXJhbXMgewomIzQzOwl1bnNpZ25lZCBsb25nIHZtX3R5cGU7CiYjNDM7CWJvb2wgcHJpdmF0ZTsKJiM0MzsJZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeShlbnVtIHZtX2d1ZXN0X21vZGUgZ3Vlc3RfbW9kZSwgdm9pZCAqYXJnKQogewotCWdwYV90IGdwYSwgZ3ZhLCBhbGlnbm1lbnQsIGd1ZXN0X3BhZ2Vfc2l6ZTsKJiM0MzsJZ3BhX3QgZ3BhLCBndmEsIGFsaWdubWVudCwgZ3Vlc3RfcGFnZV9zaXplLCBob3N0X3BhZ2Vfc2l6ZTsKJiM0MzsJZ3BhX3QgYmFja2luZ19zcmNfcGFnZXN6LCBtZW1fcGFnZV9zaXplOwomIzQzOwlzdHJ1Y3QgdGVzdF9wYXJhbXMgKnAgPSBhcmc7CiAJY29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0gewotCQkubW9kZSA9IFZNX01PREVfREVGQVVMVCwKLQkJLnR5cGUgPSB2bV90eXBlLAomIzQzOwkJLm1vZGUgPSBndWVzdF9tb2RlLAomIzQzOwkJLnR5cGUgPSBwLSZndDt2bV90eXBlLAogCX07CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwomIzQzOwlzdHJ1Y3Qga3ZtX3J1biAqcnVuOwogCXN0cnVjdCBrdm1fdm0gKnZtOwogCXN0cnVjdCB1Y2FsbCB1YzsKIAomIzQzOwlwcl9pbmZvKCYjMzQ7VGVzdGluZyBndWVzdCBtb2RlOiAlc1xuJiMzNDssIHZtX2d1ZXN0X21vZGVfc3RyaW5nKGd1ZXN0X21vZGUpKTsKJiM0MzsJcHJfaW5mbygmIzM0O1Rlc3RpbmcgbWVtb3J5IGJhY2tpbmcgc3JjIHR5cGU6ICVzXG4mIzM0OywKJiM0MzsJCXZtX21lbV9iYWNraW5nX3NyY19hbGlhcyhwLSZndDttZW1fYmFja2luZ19zcmMpLSZndDtuYW1lKTsKJiM0MzsKIAl2bSA9IHZtX2NyZWF0ZV9zaGFwZV93aXRoX29uZV92Y3B1KHNoYXBlLCAmYW1wO3ZjcHUsIGd1ZXN0X2NvZGUpOwogCi0JYWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7Ci0JZ3BhID0gKHZtLSZndDttYXhfZ2ZuIC0gVEVTVF9OUEFHRVMpICogZ3Vlc3RfcGFnZV9zaXplOwomIzQzOwlndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tndWVzdF9tb2RlXS5wYWdlX3NpemU7CiYjNDM7CWhvc3RfcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKJiM0MzsJYmFja2luZ19zcmNfcGFnZXN6ID0gZ2V0X2JhY2tpbmdfc3JjX3BhZ2VzeihwLSZndDttZW1fYmFja2luZ19zcmMpOwomIzQzOwltZW1fcGFnZV9zaXplID0gbWF4KGhvc3RfcGFnZV9zaXplLCBiYWNraW5nX3NyY19wYWdlc3opOwomIzQzOwomIzQzOwl0ZXN0X2NvbmZpZy5wYWdlX3NpemUgPSBndWVzdF9wYWdlX3NpemU7CiYjNDM7CXRlc3RfY29uZmlnLnRlc3Rfc2l6ZSA9IGFsaWduX3VwKFRFU1RfQkFTRV9TSVpFICYjNDM7IHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSwKJiM0MzsJCQkJCSBtZW1fcGFnZV9zaXplKTsKJiM0MzsJdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS0mZ3Q7bW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTsKJiM0MzsKJiM0MzsJZ3BhID0gKHZtLSZndDttYXhfZ2ZuIC0gdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpICogdGVzdF9jb25maWcucGFnZV9zaXplOwogCWFsaWdubWVudCA9IFNaXzJNOwomIzQzOwlhbGlnbm1lbnQgPSBtYXgoYWxpZ25tZW50LCBtZW1fcGFnZV9zaXplKTsKIAlncGEgPSBhbGlnbl9kb3duKGdwYSwgYWxpZ25tZW50KTsKIAlndmEgPSBncGEgJmFtcDsgKCgxVUxMICZsdDsmbHQ7ICh2bS0mZ3Q7dmFfYml0cyAtIDEpKSAtIDEpOwogCi0Jdm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZ3BhLCBURVNUX1NMT1QsCi0JCQkJICAgIFRFU1RfTlBBR0VTLCBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApOwotCXZpcnRfbWFwKHZtLCBndmEsIGdwYSwgVEVTVF9OUEFHRVMpOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIHAtJmd0O21lbV9iYWNraW5nX3NyYywKJiM0MzsJCQkJICAgIGdwYSwgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywKJiM0MzsJCQkJICAgIHAtJmd0O3ByaXZhdGUgPyBLVk1fTUVNX0dVRVNUX01FTUZEIDogMCk7CiYjNDM7CXZpcnRfbWFwKHZtLCBndmEsIGdwYSwgdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpOwomIzQzOwomIzQzOwlpZiAocC0mZ3Q7cHJpdmF0ZSkKJiM0MzsJCXZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUpOwomIzQzOwomIzQzOwlwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLAomIzQzOwkJCSBwLSZndDttZW1fYmFja2luZ19zcmMsIHAtJmd0O3ByaXZhdGUpOwomIzQzOwkvKiBSZXRyeSB0aGUgc2FtZSByYW5nZSBhZnRlciB0aGUgZmlyc3QgcHJlZmF1bHQgYXR0ZW1wdC4gKi8KJiM0MzsJcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSwgMCwKJiM0MzsJCQkgcC0mZ3Q7bWVtX2JhY2tpbmdfc3JjLCBwLSZndDtwcml2YXRlKTsKJiM0MzsJcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsCiYjNDM7CQkJIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLAomIzQzOwkJCSBob3N0X3BhZ2Vfc2l6ZSAqIDIsIGhvc3RfcGFnZV9zaXplLAomIzQzOwkJCSBwLSZndDttZW1fYmFja2luZ19zcmMsIHAtJmd0O3ByaXZhdGUpOwomIzQzOwlwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplLAomIzQzOwkJCSBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsCiYjNDM7CQkJIHAtJmd0O21lbV9iYWNraW5nX3NyYywgcC0mZ3Q7cHJpdmF0ZSk7CiAKLQlpZiAocHJpdmF0ZSkKLQkJdm1fbWVtX3NldF9wcml2YXRlKHZtLCBncGEsIFRFU1RfU0laRSk7CiYjNDM7CXZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTsKIAotCXByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCBTWl8yTSwgMCwgcHJpdmF0ZSk7Ci0JcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFNaXzJNLCBQQUdFX1NJWkUgKiAyLCBQQUdFX1NJWkUsIHByaXZhdGUpOwotCXByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTsKJiM0MzsJLyogRXhwb3J0IHRoZSBzaGFyZWQgdmFyaWFibGVzIHRvIHRoZSBndWVzdC4gKi8KJiM0MzsJc3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTsKIAotCXZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTsKIAl2Y3B1X3J1bih2Y3B1KTsKIAomIzQzOwlydW4gPSB2Y3B1LSZndDtydW47CiYjNDM7CVRFU1RfQVNTRVJUKHJ1bi0mZ3Q7ZXhpdF9yZWFzb24gPT0gVUNBTExfRVhJVF9SRUFTT04sCiYjNDM7CQkgICAgJiMzNDtXYW50ZWQgJXMsIGdvdCBleGl0IHJlYXNvbjogJXUgKCVzKSYjMzQ7LAomIzQzOwkJICAgIGV4aXRfcmVhc29uX3N0cihVQ0FMTF9FWElUX1JFQVNPTiksCiYjNDM7CQkgICAgcnVuLSZndDtleGl0X3JlYXNvbiwgZXhpdF9yZWFzb25fc3RyKHJ1bi0mZ3Q7ZXhpdF9yZWFzb24pKTsKJiM0MzsKIAlzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCAmYW1wO3VjKSkgewogCWNhc2UgVUNBTExfQUJPUlQ6CiAJCVJFUE9SVF9HVUVTVF9BU1NFUlQodWMpOwpAQCAtMjA3LDI0ICYjNDM7MjY0LDYxIEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKQogCWt2bV92bV9mcmVlKHZtKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKQomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsCiYjNDM7CQkJCSAgYm9vbCBwcml2YXRlKQogewomIzQzOwlzdHJ1Y3QgdGVzdF9wYXJhbXMgcCA9IHsKJiM0MzsJCS52bV90eXBlID0gdm1fdHlwZSwKJiM0MzsJCS5wcml2YXRlID0gcHJpdmF0ZSwKJiM0MzsJCS5tZW1fYmFja2luZ19zcmMgPSBiYWNraW5nX3NyYywKJiM0MzsJfTsKJiM0MzsKIAlpZiAodm1fdHlwZSAmYW1wOyZhbXA7ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSAmYW1wOyBCSVQodm1fdHlwZSkpKSB7CiAJCXByX2luZm8oJiMzNDtTa2lwcGluZyB0ZXN0cyBmb3Igdm1fdHlwZSAweCVseFxuJiMzNDssIHZtX3R5cGUpOwogCQlyZXR1cm47CiAJfQogCi0JX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7CiYjNDM7CWZvcl9lYWNoX2d1ZXN0X21vZGUoX190ZXN0X3ByZV9mYXVsdF9tZW1vcnksICZhbXA7cCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSkKJiM0Mzt7CiYjNDM7CXB1dHMoJiMzNDsmIzM0Oyk7CiYjNDM7CXByaW50ZigmIzM0O3VzYWdlOiAlcyBbLWhdIFstbSBtb2RlXSBbLXMgbWVtLXR5cGVdXG4mIzM0OywgbmFtZSk7CiYjNDM7CXB1dHMoJiMzNDsmIzM0Oyk7CiYjNDM7CWd1ZXN0X21vZGVzX2hlbHAoKTsKJiM0MzsJYmFja2luZ19zcmNfaGVscCgmIzM0Oy1zJiMzNDspOwomIzQzOwlwdXRzKCYjMzQ7JiMzNDspOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewomIzQzOwllbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7CiYjNDM7CWludCBvcHQ7CiYjNDM7CiYjNDM7CWd1ZXN0X21vZGVzX2FwcGVuZF9kZWZhdWx0KCk7CiYjNDM7CiYjNDM7CXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7aG06czomIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O20mIzM5OzoKJiM0MzsJCQlndWVzdF9tb2Rlc19jbWRsaW5lKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7cyYjMzk7OgomIzQzOwkJCWJhY2tpbmcgPSBwYXJzZV9iYWNraW5nX3NyY190eXBlKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7aCYjMzk7OgomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQloZWxwKGFyZ3ZbMF0pOwomIzQzOwkJCWV4aXQoMCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTsKIAotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7CiYjNDM7CXRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBiYWNraW5nLCBmYWxzZSk7CiAjaWZkZWYgX194ODZfNjRfXwotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgZmFsc2UpOwotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgdHJ1ZSk7CiYjNDM7CXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgZmFsc2UpOwomIzQzOwl0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIHRydWUpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyOTk2CgkJCQkJCQlvdXRwdXQ6IDE3CgkJCQkJCQl0aG91Z2h0czogODM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZSBpZiBpdCYjMzk7cyBhIGdvb2QgY2FuZGlkYXRlIGZvciBzeXprYWxsZXIgZnV6emluZy4gVGhlIGZpcnN0IHRoaW5nIEkmIzM5O20gZ29pbmcgdG8gY2hlY2sgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEFoLCAmIzM0O2FtZDY0JiMzNDsuIE5vdCBncmVhdCwgYnV0IGxldCYjMzk7cyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBwYXRjaCBkaWZmIGl0c2VsZiB0byBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBiZWVuIHRvdWNoZWQuCgpPa2F5LCBsZXQmIzM5O3MgcmVhZCB0aHJvdWdoIHRoZSBwYXRjaCBkaWZmIGFuZCBzZWUgd2hhdCYjMzk7cyBjaGFuZ2VkLiBMb29rcyBsaWtlIHdlIGhhdmUgY2hhbmdlcyBpbiBgRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0YCwgd2hpY2ggaXMganVzdCBkb2N1bWVudGF0aW9uLCBzbyBubyBiaWcgZGVhbCB0aGVyZS4gVGhlbiB0aGVyZSBhcmUgYSBidW5jaCBvZiBmaWxlcyB1bmRlciBgYXJjaC9hcm02NGA6IGluY2x1ZGVzIGFuZCBzb3VyY2UgY29kZSByZWxhdGVkIHRvIEtWTSDigJMgYGVzci5oYCwgYGt2bV9lbXVsYXRlLmhgLCBga3ZtX3BndGFibGUuaGAsIGBrdm1fcGt2bS5oYCwgYEtjb25maWdgLCBgYXJtLmNgLCBhbmQgbW9yZS4gVGhlcmUmIzM5O3MgYWxzbyBzb21lIHN0dWZmIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYCByZWxhdGVkIHRvIHRlc3RzLCBlc3BlY2lhbGx5IGZvciBgYXJtNjRgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogaXMgdGhlcmUgKmFueXRoaW5nKiBhZmZlY3RpbmcgeDg2IG9yIGNvbW1vbiBrZXJuZWwgY29kZT8gSSBuZWVkIHRvIGJlIGFic29sdXRlbHkgc3VyZSBiZWNhdXNlIHN5emthbGxlciYjMzk7cyBtYWluIHN0cmVuZ3RoIGlzIGdlbmVyYWxseSBvbiB4ODYsIG5vdCBhcm02NCwgc28gaXQgbmVlZHMgdG8gYmUgY2FyZWZ1bGx5IGludmVzdGlnYXRlZC4gTGV0IG1lIG1ldGljdWxvdXNseSBnbyB0aHJvdWdoIGV2ZXJ5IGZpbGUgbGlzdGVkIGluIHRoZSBkaWZmOiBgRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0YCwgYWxsIHRoZSBgYXJjaC9hcm02NGAgZmlsZXMsIGFuZCB0aGUgYHRvb2xzL3Rlc3RpbmdgIGZpbGVzLgoKTm9wZS4gTm90aGluZy4gSXQmIzM5O3MgYWxsIGVpdGhlciBkb2N1bWVudGF0aW9uLCBhcm02NC1zcGVjaWZpYyBLVk0gY29kZSwgb3IgdGVzdHMgZm9yIGFybTY0LiBKdXN0IHRvIGJlIGFic29sdXRlbHksIHBvc2l0aXZlbHkgY2VydGFpbiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoaXMgd2l0aCBhIGBnaXQgZGlmZmAgb3IgYGdpdCBzaG93YCB0byBsZWF2ZSBubyBkb3VidC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxMzoxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtkaWZmIC0tZ2l0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0PTk5PUZvciBleGFtcGxlLCB0byBwcmludCBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCBmb3IgQlBGIHByb2dyYW0gaWQgNTMwNzc6XG4tLVxuRG9jdW1lbnRhdGlvbi9icGYvZHJnbi5yc3QtMTAzLSAgICAlIGdpdCBkaWZmXG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdDoxMDQ6ICAgIGRpZmYgLS1naXQgYS90b29scy9icGZfaW5zcGVjdC5weSBiL3Rvb2xzL2JwZl9pbnNwZWN0LnB5XG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdC0xMDUtICAgIGluZGV4IDY1MGUyMjguLmFlYTIzNTcgMTAwNzU1XG4tLVxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdD01ND13b24mIzM5O3QgYnJlYWsgdXNlcnNwYWNlOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTY5LSAgICAgICogIGNvbXAyX3QgaXMgMjQtYml0IHdpdGggNS1iaXQgYmFzZSAyIGV4cG9uZW50IGFuZCAyMCBiaXQgZnJhY3Rpb25cbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3Q6NzA6ICAgIGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3QtNzEtICAgIEVPRlxuLS1cbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3Q9MzEwPUNvbnNpZGVyIHRoaXMgY2hhbmdlOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxMi0gICAgY2F0IFx1MDAzY1x1MDAzYyAmIzM5O0VPRiYjMzk7IHwgcGF0Y2ggLWwgLXAxXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0OjMxMzogICAgZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvS2J1aWxkXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxNC0gICAgaW5kZXggZWJiMTgwYWFjNzRlLi5hOWM4OGIwYThiM2IgMTAwNjQ0XG4tLVxuRG9jdW1lbnRhdGlvbi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdD04ND1sb29rZWQgbGlrZSB0aGlzOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwMi1cbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q6MTAzOiAgZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMgYi9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwNC0gIGluZGV4IDU3ZjY5NDRkNjVhNi4uMDBjOWI4MGIzZDMzIDEwMDY0NFxuLS1cbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdD03Mz1jaGFuZ2U6OlxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0LTc0LVxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojc1Olx0ZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmNcbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdC03Ni1cdC0tLSBhL21tL21yZW1hcC5jXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q9MzY9Q+S7o+eggee8luivkeWZqOWPkeWHuueahOitpuWRiuW4uOW4uOS8muiiq+inhuS4uuivr+aKpe+8jOS7juiAjOWvvOiHtOWHuueOsOS6huaXqOWcqOiuqee8luivkeWZqOmXreWYtOeahOihpeS4geOAglxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg2LVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q6ODc6ICBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmNcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg4LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XG4tLVxuc2NyaXB0cy9jaGVja3BhdGNoLnBsPTI2NzE9c3ViIHByb2Nlc3Mge1xuLS1cbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yODQ0LVx0XHQgICAgKCRsaW5lID1+IC9ecmVuYW1lICg/OmZyb218dG8pIFxcUyYjNDM7XFxzKiQvIHx8XG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw6Mjg0NTpcdFx0ICAgICAkbGluZSA9fiAvXmRpZmYgLS1naXQgYVxcL1tcXHdcXC9cXC5cXF9cXC1dJiM0MzsgYlxcL1xcUyYjNDM7XFxzKiQvKSkpIHtcbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yODQ2LVx0XHRcdCRpc19wYXRjaCA9IDE7XG4tLVxuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI5MDItXHRcdCMgZXh0cmFjdCB0aGUgZmlsZW5hbWUgYXMgaXQgcGFzc2VzXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw6MjkwMzpcdFx0aWYgKCRsaW5lID1+IC9eZGlmZiAtLWdpdC4qPyhcXFMmIzQzOykkLykge1xuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI5MDQtXHRcdFx0JHJlYWxmaWxlID0gJDE7XG4tLVxuc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbD01NTI9Zm9yZWFjaCBteSAkZmlsZSAoQEFSR1YpIHtcbi0tXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMS1cdFx0cHVzaChAZmlsZXMsICRmaWxlbmFtZSk7XG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsOjYwMjpcdCAgICB9IGVsc2lmIChtL15kaWZmIC0tZ2l0IGFcXC8oXFxTJiM0MzspIGJcXC8oXFxTJiM0MzspXFxzKiQvKSB7XG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMy1cdFx0bXkgJGZpbGVuYW1lMSA9ICQxO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1MzY0CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6CgoqKkNoZWNraW5nIHRoZSBSZWNlbnQgR2l0IEFjdGl2aXR5KioKCk9rYXksIEkgbmVlZCB0byBxdWlja2x5IHNlZSB3aGF0IHRoZSBtb3N0IHJlY2VudCBjb21taXQgaW4gdGhpcyByZXBvc2l0b3J5IGFjdHVhbGx5ICpkaWQqLiBSYXRoZXIgdGhhbiBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGNvbW1pdCBoaXN0b3J5IHZpc3VhbGx5ICh3aGljaCBjYW4gYmUgdGltZS1jb25zdW1pbmcpLCBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIGBnaXRgIHRvIGdpdmUgbWUgYSBjb25jaXNlIG92ZXJ2aWV3LiBJJiMzOTttIHRoaW5raW5nIEkgc2hvdWxkIHVzZSBgZ2l0IHNob3cgLS1zdGF0IEhFQURgIGNvbW1hbmQuIGBzaG93YCB3aWxsIGRpc3BsYXkgdGhlIGFjdHVhbCBjb21taXQsIGFuZCB0aGUgYC0tc3RhdGAgb3B0aW9uIHdpbGwgZ2l2ZSBtZSB0aGUgY2hhbmdlcyBicm9rZW4gZG93biBmaWxlIGJ5IGZpbGUuIFRoaXMgd2lsbCBwcmVzZW50IGEgY2xlYXIgc3VtbWFyeSBvZiB3aGF0JiMzOTtzIGJlZW4gYWRkZWQsIGRlbGV0ZWQsIG9yIG1vZGlmaWVkIGluIHRoYXQgbGFzdCBjb21taXQuIFRoaXMgaXMgdGhlIHF1aWNrZXN0IHdheSB0byBnZXQgdGhlIGdpc3Qgb2YgaXQuIFRoaXMgd2lsbCBzaG93IG1lIHRoZSBjaGFuZ2VzLiBBbHRlcm5hdGl2ZWx5LCBgZ2l0IGRpZmYtdHJlZSAtLXN0YXQgSEVBRGAgaXMgYW4gb3B0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2t2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2FyY2gvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQva3ZtL21tdS5jPTI5MTk9cHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXG4tLVxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzMi0vKipcbmFyY2gvYXJtNjQva3ZtL21tdS5jOjI5MzM6ICoga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5IC0gcHJlLWZhdWx0IHN0YWdlLTIgcGFnZSB0YWJsZXMgZm9yIHRoZVxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzNC0gKiBzcGVjaWZpZWQgR1BBLlxuLS1cbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDUtICovXG5hcmNoL2FybTY0L2t2bS9tbXUuYzoyOTQ2Omxvbmcga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDctXHRcdFx0XHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcbi0tXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM9NTc5Nz12b2lkIGt2bV9hcmNoX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg0MC0vKipcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYzo1ODQxOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSgpIC0tIHByZS1mYXVsdCBhbmQgbGluayBnbWFwIGRhdCB0YWJsZXNcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODQyLSAqIEB2Y3B1OiB0aGUgdmNwdSB0aGF0IHNoYWxsIGFwcGVhciB0byBoYXZlIGdlbmVyYXRlZCB0aGUgZmF1bHQtaW4uXG4tLVxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jLTU4NTktICovXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM6NTg2MDpsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg2MS17XG4tLVxuYXJjaC94ODYva3ZtL21tdS9tbXUuYz00OTczPXN0YXRpYyBpbnQga3ZtX3RkcF9wYWdlX3ByZWZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLFxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxNi1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTAxNzpsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUwMTgtXHRcdFx0XHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcbi0tXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jPTE3MDE9c3RhdGljIGludCB0ZHhfc2VwdF9tYXBfbGVhZl9zcHRlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBlbnVtIHBnX2xldmVsIGxldmVsLFxuLS1cbmFyY2gveDg2L2t2bS92bXgvdGR4LmMtMTcxMy1cdC8qXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jOjE3MTQ6XHQgKiBFbnN1cmUgcHJlX2ZhdWx0X2FsbG93ZWQgaXMgcmVhZCBieSBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoKVxuYXJjaC94ODYva3ZtL3ZteC90ZHguYy0xNzE1LVx0ICogYmVmb3JlIGt2bV90ZHgtXHUwMDNlc3RhdGUuICBVc2Vyc3BhY2UgbXVzdCBub3QgYmUgYWxsb3dlZCB0byBwcmUtZmF1bHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxMzoxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQ2OQoJCQkJCQkJb3V0cHV0OiAxMjIKCQkJCQkJCXRob3VnaHRzOiAxMDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEtWTSBQYXRjaCBmb3IgV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgZmlyc3QgdGhpbmdzIGZpcnN0LCBsZXQmIzM5O3MgZXN0YWJsaXNoIHRoZSBjb250ZXh0LiBXZSYjMzk7cmUgbG9va2luZyBhdCBhIHBhdGNoIHNldCwgYW5kIHRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBBaCwgdGhlIGBnaXQgZGlmZmAgaXMgYWxyZWFkeSBwcm92aWRlZC4gRXhjZWxsZW50LiBMZXQmIzM5O3MgcmV2aWV3IGl0IGFnYWluLgoKSXQgc2VlbXMgdG8gYmUgYWxsIHRoaW5ncyBLVk0sIGJ1dCB0aGUgZGlmZiByZXZlYWxzOgoqICAgYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAKKiAgIGBhcmNoL2FybTY0Ly4uLmAgZXh0ZW5zaXZlbHkKKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vLi4uYAoKTm93LCBsZXQmIzM5O3MgY29uc3VsdCB0aGUgY3JpdGVyaWEgZm9yIGRlY2lkaW5nICphZ2FpbnN0KiBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgU0VDVElPTiAyLiBJIG5lZWQgdG8gY29uZmlybSB0aGF0IHRoaXMgcGF0Y2ggKmRvZXNuJiMzOTt0KiB3YXJyYW50IGZ1enppbmcgYmFzZWQgb24gdGhlIGRlZmluZWQgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgaGVyZSBhcmUgdGhlIHNjZW5hcmlvcyB3aGVyZSB3ZSBkZWZpbml0aXZlbHkgKmRvbiYjMzk7dCogZnV6ei4gSSBzZWUgdGhlIG1haW4gcG9pbnRzIGFzOgoqICAgRG9jdW1lbnRhdGlvbi8gYW5kIHNlbGYtdGVzdHMgKHRvb2xzLykgdGhhdCBkb24mIzM5O3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuCiogICAmIzM0O0NvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OwoKQWxyaWdodCwgbGV0JiMzOTtzIGNvbm5lY3QgdGhlIGRvdHMuIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGF0JiMzOTtzIHdoYXQmIzM5O3MgcmVsZXZhbnQgdG8gdGhpcyBmdXp6aW5nIGV4ZXJjaXNlLiBMb29raW5nIGF0IHRoZSBwYXRjaCBzZXQsIHRoZSBrZXJuZWwgY2hhbmdlcyBhcmUgKnN0cmljdGx5KiB1bmRlciBgYXJjaC9hcm02NC9gLiBJdCYjMzk7cyBhbGwgQVJNNjQgS1ZNLXJlbGF0ZWQsIGluY2x1ZGluZyBoZWFkZXJzIGFuZCBjb3JlIEtWTSBpbXBsZW1lbnRhdGlvbiBmaWxlcy4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUuIFRoZSByZXN0IGlzIGRvY3VtZW50YXRpb24gYW5kIHRob3NlIHVzZXItc3BhY2Ugc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHNgLgoKVGhlIGltcGxpY2F0aW9uIGlzIG9idmlvdXM6IHRoZSBrZXJuZWwgY29kZSBjaGFuZ2VzIHdpbGwgbm90IGJlIGNvbXBpbGVkIG9yIGV4ZWN1dGVkIG9uIGFtZDY0LgoKVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQmIzM5O3MgcGVyZm9ybSBhIHNhbml0eSBjaGVjay4gTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGNvbW1vbiBLVk0gY29kZSBjaGFuZ2VzLiBJJiMzOTtsbCBzZWFyY2ggYHZpcnQva3ZtL2AgYW5kIGBpbmNsdWRlL2xpbnV4L2t2bSpgIGZvciBhbnkgdG91Y2hlZCBmaWxlcy4gTm90aGluZy4gTm90IGEgc2luZ2xlIGZpbGUgaW4gdGhlc2UgbG9jYXRpb25zISBUaGlzIGNvbmZpcm1zIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGlzb2xhdGVkIHRvIEFSTTY0IGFuZCB0aGUgb3RoZXIgbm9uLWtlcm5lbCBlbGVtZW50cy4KClRoaXMgcGF0Y2ggaXMgZXhjbHVzaXZlbHkgZGVhbGluZyB3aXRoIEFSTTY0IEtWTSBhbmQgc2VsZi10ZXN0cy4gVGhlIEtWTSBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIHRhcmdldCBhbWQ2NCBhcmNoaXRlY3R1cmUgaXMgbm90IGludm9sdmVkLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGZhbGxzIGludG8gdGhyZWUgb2YgdGhlICYjMzQ7bmVnYXRpdmUgY3JpdGVyaWEmIzM0OzoKKiAgIERvY3VtZW50YXRpb24gY2hhbmdlcwoqICAgVXNlci1zcGFjZSBkaXJlY3RvcmllcyAvIHNlbGYtdGVzdHMKKiAgIENvZGUgZXhjbHVzaXZlIHRvIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZS4KCkJhc2VkIG9uIHRoaXMsIHRoZSBmdXp6aW5nLXdvcnRoaW5lc3MgcGFyYW1ldGVycyBhcmUgY2xlYXI6CgoqICAgYFdvcnRoRnV6emluZ2A6IGZhbHNlCiogICBgRm9jdXNTeW1ib2xzYDogXFsgXQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBcWyBdCiogICBgUmVhc29uaW5nYDogVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgYXJlIGV4Y2x1c2l2ZSB0byBhcmNoL2FybTY0IChpbXBsZW1lbnRpbmcgS1ZNX1BSRV9GQVVMVF9NRU1PUlkgc3VwcG9ydCBmb3IgYXJtNjQgS1ZNKS4gVGhlIHJlbWFpbmRlciBvZiB0aGUgY2hhbmdlcyBhcmUgZG9jdW1lbnRhdGlvbiBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC4gVGhlcmVmb3JlLCBub25lIG9mIHRoZSBtb2RpZmllZCBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIGlzIHJlYWNoYWJsZSBvciBjb21waWxlZCBvbiBhbWQ2NC4KCk5vdywgd2l0aCB0aGlzIHJhdGlvbmFsZSBhbmQgZGVmaW5pdGl2ZSBmaW5kaW5ncywgSSBjYW4gY29uZmlkZW50bHkgc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNC42MjQ2MjE3MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODk1ODcyOTg0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNC42MjQ2Mjc0MTRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMzIyNTc1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDVlYmU0MzFmY2YxOTJhMGI5NDIyOWI1NGQ5ZmFiNTBlZDA5NmYzOGJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0IGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XFxuaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcXG5AQCAtNjQ4NSw3ICs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gXFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcXG4tOkFyY2hpdGVjdHVyZXM6IG5vbmVcXG4rOkFyY2hpdGVjdHVyZXM6IHg4NiwgczM5MCwgYXJtNjRcXG4gOlR5cGU6IHZjcHUgaW9jdGxcXG4gOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KVxcbiA6UmV0dXJuczogMCBpZiBhdCBsZWFzdCBvbmUgcGFnZSBpcyBwcm9jZXNzZWQsIFxcdTAwM2MgMCBvbiBlcnJvclxcbkBAIC02NDkzLDEyICs2NDkzLDE0IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy5cXG4gRXJyb3JzOlxcbiBcXG4gICA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbisgIEVBR0FJTiAgICAgQSByYWNlIG9jY3VycmVkIGJlZm9yZSBwcm9ncmVzcyB3YXMgbWFkZSwgYnV0IGEgcmV0cnkgbWF5IHN1Y2NlZWQuXFxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxcbiAgICAgICAgICAgICAgcGFnZSBhbGlnbmVkLCBjYXVzZXMgYW4gb3ZlcmZsb3csIG9yIHNpemUgaXMgemVybyksIG9yIHRoZSBWTVxcbiAgICAgICAgICAgICAgaXMgVUNPTlRST0wgKHMzOTApLlxcbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXFxuICAgRUlOVFIgICAgICBBbiB1bm1hc2tlZCBzaWduYWwgaXMgcGVuZGluZyBhbmQgbm8gcGFnZSB3YXMgcHJvY2Vzc2VkLlxcbiAgIEVGQVVMVCAgICAgVGhlIHBhcmFtZXRlciBhZGRyZXNzIHdhcyBpbnZhbGlkLlxcbisgIEVIV1BPSVNPTiAgQSBwb2lzb25lZCBob3N0IHBhZ2Ugd2FzIGVuY291bnRlcmVkLlxcbiAgIEVPUE5PVFNVUFAgTWFwcGluZyBtZW1vcnkgZm9yIGEgR1BBIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZVxcbiAgICAgICAgICAgICAgaHlwZXJ2aXNvciwgYW5kL29yIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlL21vZGUuXFxuICAgRUlPICAgICAgICB1bmV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbnMgKGFsc28gY2F1c2VzIGEgV0FSTilcXG5AQCAtNjUxOCw3ICs2NTIwLDE3IEBAIEVycm9yczpcXG4gS1ZNX1BSRV9GQVVMVF9NRU1PUlkgcG9wdWxhdGVzIEtWTSdzIHN0YWdlLTIgcGFnZSB0YWJsZXMgdXNlZCB0byBtYXAgbWVtb3J5XFxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXFxuIHN0YWdlLTIgcmVhZCBwYWdlIGZhdWx0LCBlLmcuIGZhdWx0cyBpbiBtZW1vcnkgYXMgbmVlZGVkLCBidXQgZG9lc24ndCBicmVha1xcbi1Db1cuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzIEFjY2Vzc2VkLlxcbitDb1cuICBPbiBhcm02NCwgS1ZNIG1hcmtzIG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEVzIGFzIEFjY2Vzc2VkLCBhcyBpdFxcbitkb2VzIGZvciBhbnkgc3RhZ2UtMiBmYXVsdCwgYnV0IGxlYXZlcyB0aGUgQWNjZXNzZWQgc3RhdGUgb2YgZXhpc3RpbmcgUFRFc1xcbit1bmNoYW5nZWQuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzXFxuK0FjY2Vzc2VkLCBhbmQgZm9yIHMzOTAgaXQgaXMgbm90IGFwcGxpY2FibGUuXFxuK1xcbitPbiBhcm02NCwgYSBHUEEgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gSVBBLCBhbmQgbmV2ZXIgaW50ZXJwcmV0ZWQgYXMgdGhlIElQQVxcbitvZiBhIG5lc3RlZCBndWVzdC4gUHJlLWZhdWx0aW5nIG9ubHkgcG9wdWxhdGVzIGNhbm9uaWNhbCBzdGFnZSAyIHBhZ2VcXG4rdGFibGVzLlxcbitcXG4rVGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhcm02NCBpZiB0aGUgcHJvdGVjdGVkIEtWTSAocEtWTSkgZmVhdHVyZVxcbitpcyBlbmFibGVkLlxcbiBcXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXFxuIHByaXZhdGUgZ3Vlc3QgbWVtb3J5IGJlZm9yZSB0aGUgZ3Vlc3QgaXMgJ2ZpbmFsaXplZCcvbWVhc3VyZWQsIHRoaXMgaW9jdGxcXG5AQCAtNjUzMyw3ICs2NTQ1LDcgQEAgV2hlbiB0aGUgaW9jdGwgcmV0dXJucywgdGhlIGlucHV0IHZhbHVlcyBhcmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGVcXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFxcdTAwM2UgMCBvbiByZXR1cm4sIHRoZSBjYWxsZXIgY2FuIGp1c3QgaXNzdWVcXG4gdGhlIGlvY3RsIGFnYWluIHdpdGggdGhlIHNhbWUgYHN0cnVjdCBrdm1fbWFwX21lbW9yeWAgYXJndW1lbnQuXFxuIFxcbi1TaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXlcXG4rT24geDg2LCBzaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXlcXG4gYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLlxcbiBDYWxsaW5nIHRoaXMgaW9jdGwgd2hlbiB0aGUgZ3Vlc3QgaXMgdXNpbmcgc2hhZG93IHBhZ2UgdGFibGVzIChmb3JcXG4gZXhhbXBsZSBiZWNhdXNlIGl0IGlzIHJ1bm5pbmcgYSBuZXN0ZWQgZ3Vlc3Qgd2l0aCBuZXN0ZWQgcGFnZSB0YWJsZXMpXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXFxuaW5kZXggZjgxNmY1ZDc3ZjFhNS4uOWMwMjA1OTgzZDlhOCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxcbkBAIC00MzcsNiArNDM3LDUwIEBAXFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3R5cGVzLmhcXHUwMDNlXFxuIFxcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGVzcl9nZXRfZWModW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIEVTUl9FTHhfRUMoZXNyKTtcXG4rfVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl90cmFwX2lzX2lhYnQodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl9nZXRfZWMoZXNyKSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zMXB0dyh1bnNpZ25lZCBsb25nIGVzcilcXG4re1xcbitcXHRyZXR1cm4gZXNyIFxcdTAwMjYgRVNSX0VMeF9TMVBUVztcXG4rfVxcbitcXG4rLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfd3JpdGUodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzciBcXHUwMDI2IEVTUl9FTHhfV05SO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfY20odW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzciBcXHUwMDI2IEVTUl9FTHhfQ007XFxuK31cXG4rXFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoZXNyKSBcXHUwMDI2XFx1MDAyNiAhZXNyX2FidF9pc19zMXB0dyhlc3IpO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zZWEodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0c3dpdGNoIChlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQykge1xcbitcXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcXG4rXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcXG4rXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUNDOlxcbitcXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGVzcl9icmtfY29tbWVudCh1bnNpZ25lZCBsb25nIGVzcilcXG4ge1xcbiBcXHRyZXR1cm4gZXNyIFxcdTAwMjYgRVNSX0VMeF9CUks2NF9JU1NfQ09NTUVOVF9NQVNLO1xcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcXG5pbmRleCBhM2MxOTI4YmRmNzQzLi5hM2IyNzIyNjU1NTQzIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxcbisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxcbkBAIC00MTEsMTggKzQxMSwxMyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9kYWJ0X2dldF9yZChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzczF0dyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuICEhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkgXFx1MDAyNiBFU1JfRUx4X1MxUFRXKTtcXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfczFwdHcoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuIH1cXG4gXFxuIC8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXN3cml0ZShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuIGt2bV92Y3B1X2dldF9lc3IodmNwdSkgXFx1MDAyNiBFU1JfRUx4X1dOUjtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi17XFxuLVxcdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFxcdTAwMjYgRVNSX0VMeF9DTSk7XFxuK1xcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcXG4gfVxcbiBcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfYXMoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbkBAIC00MzgsMTcgKzQzMywxMiBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pbF9pczMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdVxcbiBcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuIEVTUl9FTHhfRUMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuK1xcdHJldHVybiBlc3JfZ2V0X2VjKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4ge1xcbi1cXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSkgPT0gRVNSX0VMeF9FQ19JQUJUX0xPVztcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuLXtcXG4tXFx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSBcXHUwMDI2XFx1MDAyNiAha3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KTtcXG4rXFx0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuIH1cXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTgga3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbkBAIC00NjgsMjYgKzQ1OCw5IEBAIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc190cmFuc2xhdGlvbl9mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdHJldHVybiBlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW5saW5lXFxuLXU2NCBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi17XFxuLVxcdHVuc2lnbmVkIGxvbmcgZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcXG4tXFxuLVxcdEJVR19PTighZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcikpO1xcbi1cXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoZXNyIFxcdTAwMjYgRVNSX0VMeF9GU0NfTEVWRUwpKTtcXG4tfVxcbi1cXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3NlYShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0c3dpdGNoIChrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSkge1xcbi1cXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcXG4tXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcXG4tXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUNDOlxcbi1cXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHRkZWZhdWx0Olxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG5AQCAtNDk2LDkgKzQ2OSw5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGt2bV92Y3B1X3N5c19nZXRfcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRyZXR1cm4gRVNSX0VMeF9TWVM2NF9JU1NfUlQoZXNyKTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKVxcbiB7XFxuLVxcdGlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7XFxuK1xcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcXG4gXFx0XFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXFxuQEAgLTUxMSwxMyArNDg0LDE4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHQgKiBmaXJzdCksIHRoZW4gYSBwZXJtaXNzaW9uIGZhdWx0IHRvIGFsbG93IHRoZSBmbGFnc1xcbiBcXHRcXHQgKiB0byBiZSBzZXQuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpO1xcbitcXHRcXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcik7XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkpXFxuK1xcdGlmIChlc3JfdHJhcF9pc19pYWJ0KGVzcikpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuLVxcdHJldHVybiBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUodmNwdSk7XFxuK1xcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShlc3IpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wga3ZtX2lzX3dyaXRlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4re1xcbitcXHRyZXR1cm4gZXNyX2FidF9pc193cml0ZV9mYXVsdChrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcXG4gfVxcbiBcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2bV92Y3B1X2dldF9tcGlkcl9hZmYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaFxcbisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaFxcbkBAIC04NTksNiArODU5LDggQEAgaW50IGt2bV9wZ3RhYmxlX3dhbGsoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLCB1NjQgc2l6ZSxcXG4gICogQGFkZHI6XFx0SW5wdXQgYWRkcmVzcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSB3YWxrLlxcbiAgKiBAcHRlcDpcXHRQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXRyaWV2ZWQgUFRFLlxcbiAgKiBAbGV2ZWw6XFx0UG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgbGV2ZWwgb2YgdGhlIHJldHJpZXZlZCBQVEUuXFxuKyAqIEBmbGFnczpcXHRGbGFncyB0byBjb250cm9sIHRoZSBwYWdlLXRhYmxlIHdhbGtcXG4rICpcXHRcXHQoc2VlIHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHgpLlxcbiAgKlxcbiAgKiBUaGUgb2Zmc2V0IG9mIEBhZGRyIHdpdGhpbiBhIHBhZ2UgaXMgaWdub3JlZC5cXG4gICpcXG5AQCAtODY5LDcgKzg3MSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXFxuICAqL1xcbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxcbi1cXHRcXHRcXHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpO1xcbitcXHRcXHRcXHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsXFxuK1xcdFxcdFxcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xcbiBcXG4gLyoqXFxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaFxcbmluZGV4IGJlZWEwMGU2OTNhMGEuLjRkNmU1NzY1ZTllNTYgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXFxuQEAgLTQ0LDkgKzQ0LDkgQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9wa3ZtX2V4dF9hbGxvd2VkKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpXFxuIFxcdGNhc2UgS1ZNX0NBUF9BUk1fUFRSQVVUSF9HRU5FUklDOlxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9NVEU6XFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9FQUdFUl9TUExJVF9DSFVOS19TSVpFOlxcbiBcXHRjYXNlIEtWTV9DQVBfQVJNX1NVUFBPUlRFRF9CTE9DS19TSVpFUzpcXG4rXFx0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuICFrdm0gfHwgIWt2bV92bV9pc19wcm90ZWN0ZWQoa3ZtKTtcXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcXG5pbmRleCA0NDkxNTRmOWE0ODUyLi43MTIzMzA2OGI3Y2I2IDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnXFxuQEAgLTM3LDYgKzM3LDcgQEAgbWVudWNvbmZpZyBLVk1cXG4gXFx0c2VsZWN0IFNDSEVEX0lORk9cXG4gXFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTIGlmIFBFUkZfRVZFTlRTXFxuIFxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkRcXG4rXFx0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcXG4gXFx0aGVscFxcbiBcXHQgIFN1cHBvcnQgaG9zdGluZyB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcy5cXG4gXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2FybS5jIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcXG5pbmRleCBjY2FlODJjMTI0MmJjLi41OGFjNzBmMzFkODRlIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL2FybS5jXFxuKysrIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcXG5AQCAtMzkzLDYgKzM5Myw3IEBAIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpXFxuIFxcdGNhc2UgS1ZNX0NBUF9DT1VOVEVSX09GRlNFVDpcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9XUklUQUJMRV9JTVBfSURfUkVHUzpcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9TRUFfVE9fVVNFUjpcXG4rXFx0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XFxuIFxcdFxcdHIgPSAxO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBLVk1fQ0FQX1NFVF9HVUVTVF9ERUJVRzI6XFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXFxuaW5kZXggMzlhYTg5MTFmNjJjMS4uMjNhNTczMTJiOTgxYiAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXFxuKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xcbkBAIC01MzIsNyArNTMyLDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9hZGp1c3RfcmFuZ2UodTY0IGFkZHIsIHN0cnVjdCBrdm1fbWVtX3JhbmdlICpyYW5nZSlcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGh5cF9hc3NlcnRfbG9ja19oZWxkKFxcdTAwMjZob3N0X21tdS5sb2NrKTtcXG4tXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsKTtcXG4rXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsLCAwKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTkxMCw3ICs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxcbiBcXHRzOCBsZXZlbDtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcdGlmIChndWVzdF9wdGVfaXNfcG9pc29uZWQocHRlKSlcXG5AQCAtOTU5LDcgKzk1OSw3IEBAIGludCBfX3Brdm1fdmNwdV9pbl9wb2lzb25fZmF1bHQoc3RydWN0IHBrdm1faHlwX3ZjcHUgKmh5cF92Y3B1KVxcbiBcXHRpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKFxcdTAwMjZoeXBfdmNwdS1cXHUwMDNldmNwdSkpO1xcbiBcXG4gXFx0Z3Vlc3RfbG9ja19jb21wb25lbnQodm0pO1xcbi1cXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcXHUwMDI2dm0tXFx1MDAzZXBndCwgaXBhLCBcXHUwMDI2cHRlLCBcXHUwMDI2bGV2ZWwpO1xcbitcXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcXHUwMDI2dm0tXFx1MDAzZXBndCwgaXBhLCBcXHUwMDI2cHRlLCBcXHUwMDI2bGV2ZWwsIDApO1xcbiBcXHRpZiAocmV0KVxcbiBcXHRcXHRnb3RvIHVubG9jaztcXG4gXFxuQEAgLTEzMTUsNyArMTMxNSw3IEBAIHN0YXRpYyBpbnQgaG9zdF9zdGFnZTJfZ2V0X2d1ZXN0X2luZm8ocGh5c19hZGRyX3QgcGh5cywgc3RydWN0IHBrdm1faHlwX3ZtICoqdm0sXFxuIFxcdFxcdHJldHVybiAtRVBFUk07XFxuIFxcdH1cXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbkBAIC0xNTQ0LDcgKzE1NDQsNyBAQCBzdGF0aWMgaW50IF9fY2hlY2tfaG9zdF9zaGFyZWRfZ3Vlc3Qoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0ICpfX3BoeXMsIHU2NCBpcFxcbiBcXHRzOCBsZXZlbDtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcdGlmICgha3ZtX3B0ZV92YWxpZChwdGUpKVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xcbmluZGV4IGI3NGRkNWNlMWVmZDMuLjM0N2VlYzM5NTdkNmEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcXG5AQCAtMjk4LDEyICsyOTgsMTMgQEAgc3RhdGljIGludCBsZWFmX3dhbGtlcihjb25zdCBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4ICpjdHgsXFxuIH1cXG4gXFxuIGludCBrdm1fcGd0YWJsZV9nZXRfbGVhZihzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsXFxuLVxcdFxcdFxcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbClcXG4rXFx0XFx0XFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxcbitcXHRcXHRcXHQgZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzKVxcbiB7XFxuIFxcdHN0cnVjdCBsZWFmX3dhbGtfZGF0YSBkYXRhO1xcbiBcXHRzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHtcXG4gXFx0XFx0LmNiXFx0PSBsZWFmX3dhbGtlcixcXG4tXFx0XFx0LmZsYWdzXFx0PSBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXFxuK1xcdFxcdC5mbGFnc1xcdD0gZmxhZ3MgfCBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXFxuIFxcdFxcdC5hcmdcXHQ9IFxcdTAwMjZkYXRhLFxcbiBcXHR9O1xcbiBcXHRpbnQgcmV0O1xcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9tbXUuYyBiL2FyY2gvYXJtNjQva3ZtL21tdS5jXFxuaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL21tdS5jXFxuQEAgLTUsNiArNSw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FjcGkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NsZWFudXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tYW4uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pby5oXFx1MDAzZVxcbkBAIC04NjYsNyArODY3LDcgQEAgc3RhdGljIGludCBnZXRfdXNlcl9tYXBwaW5nX3NpemUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgYWRkcilcXG4gXFx0ICogSVBJLWluZyB0aHJlYWRzKS5cXG4gXFx0ICovXFxuIFxcdGxvY2FsX2lycV9zYXZlKGZsYWdzKTtcXG4tXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsKTtcXG4rXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsLCAwKTtcXG4gXFx0bG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpO1xcbiBcXG4gXFx0aWYgKHJldClcXG5AQCAtMTU1NCw5ICsxNTU1LDkgQEAgc3RhdGljIHZvaWQgKmdldF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRyZXR1cm4gXFx1MDAyNnZjcHUtXFx1MDAzZWFyY2gucGt2bV9tZW1jYWNoZTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICptZW1jYWNoZSlcXG4rc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdm9pZCAqbWVtY2FjaGUpXFxuIHtcXG4tXFx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKHZjcHUtXFx1MDAzZWFyY2guaHdfbW11KTtcXG4rXFx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XFxuIFxcbiBcXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxcbiBcXHRcXHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XFxuQEAgLTE2MDMsMTUgKzE2MDQsNDcgQEAgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHtcXG4gXFx0c3RydWN0IGt2bV9zMl90cmFuc1xcdCpuZXN0ZWQ7XFxuIFxcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3RcXHQqbWVtc2xvdDtcXG4gXFx0dW5zaWduZWQgbG9uZ1xcdFxcdGh2YTtcXG4rXFx0dW5zaWduZWQgbG9uZ1xcdFxcdGVzcjtcXG4rXFx0c3RydWN0IGt2bV9zMl9tbXVcXHQqbW11O1xcbiB9O1xcbiBcXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4rc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQge1xcbitcXHR1bnNpZ25lZCBsb25nIG1hcHBpbmdfc2l6ZTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHRyZXR1cm4gZXNyX2FidF9pc19leGVjX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc193cml0ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNlZXNyKTtcXG4rfVxcbitcXG4rc3RhdGljIHU2NCBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHR1NjQgbGV2ZWw7XFxuK1xcbitcXHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0bGV2ZWwgPSBzMmZkLVxcdTAwM2Vlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQ19MRVZFTDtcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuK1xcdFxcdCAgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXFxuIHtcXG4gXFx0Ym9vbCB3cml0ZV9mYXVsdCwgZXhlY19mYXVsdDtcXG4tXFx0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpO1xcbitcXHRib29sIHBlcm1fZmF1bHQgPSBrdm1fczJfZmF1bHRfaXNfcGVybShzMmZkKTtcXG4gXFx0ZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7XFxuIFxcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90ID0gS1ZNX1BHVEFCTEVfUFJPVF9SO1xcbi1cXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWFyY2guaHdfbW11LVxcdTAwM2VwZ3Q7XFxuK1xcdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gczJmZC1cXHUwMDNlbW11LVxcdTAwM2VwZ3Q7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbW11X3NlcTtcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuIFxcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWt2bTtcXG5AQCAtMTYyMiw3ICsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4gXFxuIFxcdGlmICghcGVybV9mYXVsdCkge1xcbiBcXHRcXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cXHUwMDNldmNwdSk7XFxuLVxcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2V2Y3B1LCBtZW1jYWNoZSk7XFxuK1xcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIG1lbWNhY2hlKTtcXG4gXFx0XFx0aWYgKHJldClcXG4gXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0fVxcbkBAIC0xNjMyLDggKzE2NjUsOCBAQCBzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRlbHNlXFxuIFxcdFxcdGdmbiA9IHMyZmQtXFx1MDAzZWZhdWx0X2lwYSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXG4tXFx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNldmNwdSk7XFxuLVxcdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cXHUwMDNldmNwdSk7XFxuK1xcdHdyaXRlX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpO1xcbitcXHRleGVjX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCk7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0Uod3JpdGVfZmF1bHQgXFx1MDAyNlxcdTAwMjYgZXhlY19mYXVsdCk7XFxuIFxcbkBAIC0xNjg3LDcgKzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4gXFx0aWYgKChwcm90IFxcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbiBcXHRcXHRtYXJrX3BhZ2VfZGlydHlfaW5fc2xvdChrdm0sIHMyZmQtXFx1MDAzZW1lbXNsb3QsIGdmbik7XFxuIFxcbi1cXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xcbitcXHRpZiAocmV0ID09IC1FQUdBSU4pXFxuK1xcdFxcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xcbitcXG4rXFx0aWYgKHJlc3VsdCBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbitcXHRcXHRyZXN1bHQtXFx1MDAzZW1hcHBpbmdfc2l6ZSA9IFBBR0VfU0laRTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8ge1xcbkBAIC0xNzA5LDcgKzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7XFxuIFxcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IHMyZmQtXFx1MDAzZXZjcHU7XFxuLVxcdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gdmNwdS1cXHUwMDNlYXJjaC5od19tbXUtXFx1MDAzZXBndDtcXG4rXFx0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVxcdTAwM2VtbXUtXFx1MDAzZXBndDtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LVxcdTAwM2VtbTtcXG4gXFx0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cXHUwMDNla3ZtO1xcbiBcXHR2b2lkICpoeXBfbWVtY2FjaGU7XFxuQEAgLTE3MTcsNyArMTc1Niw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRpbnQgcmV0O1xcbiBcXG4gXFx0aHlwX21lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZSh2Y3B1KTtcXG4tXFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHZjcHUsIGh5cF9tZW1jYWNoZSk7XFxuK1xcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIGh5cF9tZW1jYWNoZSk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXG5AQCAtMTg0MCwxMSArMTg3OSw2IEBAIHN0YXRpYyBzaG9ydCBrdm1fczJfcmVzb2x2ZV92bWFfc2l6ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIFxcdHJldHVybiB2bWFfc2hpZnQ7XFxuIH1cXG4gXFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4te1xcbi1cXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9nZXRfdm1hX2luZm8oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiBcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXFxuIHtcXG5AQCAtMTkxMCwxMyArMTk0NCwxMSBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9waW5fcGZuKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuIFxcdHMydmktXFx1MDAzZXBmbiA9IF9fa3ZtX2ZhdWx0aW5fcGZuKHMyZmQtXFx1MDAzZW1lbXNsb3QsIGdldF9jYW5vbmljYWxfZ2ZuKHMyZmQsIHMydmkpLFxcbi1cXHRcXHRcXHRcXHQgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNldmNwdSkgPyBGT0xMX1dSSVRFIDogMCxcXG4rXFx0XFx0XFx0XFx0ICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsXFxuIFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZzMnZpLVxcdTAwM2VtYXBfd3JpdGFibGUsIFxcdTAwMjZzMnZpLVxcdTAwM2VwYWdlKTtcXG4gXFx0aWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS1cXHUwMDNlcGZuKSkpIHtcXG4tXFx0XFx0aWYgKHMydmktXFx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikge1xcbi1cXHRcXHRcXHRrdm1fc2VuZF9od3BvaXNvbl9zaWduYWwoczJmZC1cXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLVxcdTAwM2V2bWFfcGFnZXNpemUpKTtcXG4tXFx0XFx0XFx0cmV0dXJuIDA7XFxuLVxcdFxcdH1cXG4rXFx0XFx0aWYgKHMydmktXFx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSFdQT0lTT047XFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbkBAIC0xOTY4LDcgKzIwMDAsNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiB7XFxuIFxcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWt2bTtcXG4gXFxuLVxcdGlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cXHUwMDNldmNwdSkgXFx1MDAyNlxcdTAwMjYgczJ2aS1cXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXFxuK1xcdGlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSBcXHUwMDI2XFx1MDAyNiBzMnZpLVxcdTAwM2VtYXBfbm9uX2NhY2hlYWJsZSlcXG4gXFx0XFx0cmV0dXJuIC1FTk9FWEVDO1xcbiBcXG4gXFx0LypcXG5AQCAtMTk3Nyw3ICsyMDA5LDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0ICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0XFxuIFxcdCAqIHRoZSBmYXVsdCBiYWNrIHRvIHRoZSBndWVzdC5cXG4gXFx0ICovXFxuLVxcdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC1cXHUwMDNldmNwdSkpKSB7XFxuK1xcdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcikpIHtcXG4gXFx0XFx0a3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtXFx1MDAzZXZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtXFx1MDAzZXZjcHUpKTtcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcdH1cXG5AQCAtMTk4NiwxMyArMjAxOCwxMyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiBcXG4gXFx0aWYgKHMydmktXFx1MDAzZW1hcF93cml0YWJsZSBcXHUwMDI2XFx1MDAyNiAoczJ2aS1cXHUwMDNlZGV2aWNlIHx8XFxuIFxcdFxcdFxcdFxcdCAgICFtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cXHUwMDNlbWVtc2xvdCkgfHxcXG4tXFx0XFx0XFx0XFx0ICAga3ZtX2lzX3dyaXRlX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpKSlcXG4rXFx0XFx0XFx0XFx0ICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpKSlcXG4gXFx0XFx0KnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9XO1xcbiBcXG4gXFx0aWYgKHMyZmQtXFx1MDAzZW5lc3RlZClcXG4gXFx0XFx0KnByb3QgPSBhZGp1c3RfbmVzdGVkX2ZhdWx0X3Blcm1zKHMyZmQtXFx1MDAzZW5lc3RlZCwgKnByb3QpO1xcbiBcXG4tXFx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVxcdTAwM2V2Y3B1KSlcXG4rXFx0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpKVxcbiBcXHRcXHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1g7XFxuIFxcbiBcXHRpZiAoczJ2aS1cXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXFxuQEAgLTIwMTYsNyArMjA0OCw4IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIFxcdFxcdFxcdCAgICBjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvICpzMnZpLFxcbiBcXHRcXHRcXHQgICAgZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QsXFxuLVxcdFxcdFxcdCAgICB2b2lkICptZW1jYWNoZSlcXG4rXFx0XFx0XFx0ICAgIHZvaWQgKm1lbWNhY2hlLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdClcXG4ge1xcbiBcXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcXG4gXFx0Ym9vbCB3cml0YWJsZSA9IHByb3QgXFx1MDAyNiBLVk1fUEdUQUJMRV9QUk9UX1c7XFxuQEAgLTIwMjksMTMgKzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGt2bV9mYXVsdF9sb2NrKGt2bSk7XFxuLVxcdHBndCA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWFyY2guaHdfbW11LVxcdTAwM2VwZ3Q7XFxuK1xcdHBndCA9IHMyZmQtXFx1MDAzZW1tdS1cXHUwMDNlcGd0O1xcbiBcXHRyZXQgPSAtRUFHQUlOO1xcbiBcXHRpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLVxcdTAwM2VtbXVfc2VxKSlcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiBcXG4tXFx0cGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID9cXG4tXFx0XFx0XFx0ICAgICAga3ZtX3ZjcHVfdHJhcF9nZXRfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQtXFx1MDAzZXZjcHUpIDogMCk7XFxuK1xcdHBlcm1fZmF1bHRfZ3JhbnVsZSA9IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZCk7XFxuIFxcdG1hcHBpbmdfc2l6ZSA9IHMydmktXFx1MDAzZXZtYV9wYWdlc2l6ZTtcXG4gXFx0cGZuID0gczJ2aS1cXHUwMDNlcGZuO1xcbiBcXHRnZm4gPSBzMnZpLVxcdTAwM2VnZm47XFxuQEAgLTIwOTYsMTQgKzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0XFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVxcdTAwM2VtZW1zbG90LCBncGFfdG9fZ2ZuKGlwYSkpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocmV0ICE9IC1FQUdBSU4pXFxuLVxcdFxcdHJldHVybiByZXQ7XFxuLVxcdHJldHVybiAwO1xcbitcXHRpZiAocmV0ID09IC1FQUdBSU4pXFxuK1xcdFxcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xcbitcXG4rXFx0aWYgKHJlc3VsdCBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbitcXHRcXHRyZXN1bHQtXFx1MDAzZW1hcHBpbmdfc2l6ZSA9IG1hcHBpbmdfc2l6ZTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbitzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxcbiB7XFxuLVxcdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVxcdTAwM2V2Y3B1KTtcXG4rXFx0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XFxuIFxcdHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gczJ2aSA9IHt9O1xcbiBcXHRlbnVtIGt2bV9wZ3RhYmxlX3Byb3QgcHJvdDtcXG4gXFx0dm9pZCAqbWVtY2FjaGU7XFxuQEAgLTIxMjEsNyArMjE1OCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cXHUwMDNldmNwdSk7XFxuIFxcdGlmICghcGVybV9mYXVsdCB8fCBtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cXHUwMDNlbWVtc2xvdCkgfHxcXG4gXFx0ICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7XFxuLVxcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2V2Y3B1LCBtZW1jYWNoZSk7XFxuK1xcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIG1lbWNhY2hlKTtcXG4gXFx0XFx0aWYgKHJldClcXG4gXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0fVxcbkBAIC0yMTMxLDYgKzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXFxuIFxcdCAqIGdldCBibG9jayBtYXBwaW5nIGZvciBkZXZpY2UgTU1JTyByZWdpb24uXFxuIFxcdCAqL1xcbiBcXHRyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCBcXHUwMDI2czJ2aSk7XFxuK1xcdGlmIChyZXQgPT0gLUVIV1BPSVNPTikge1xcbitcXHRcXHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cXG4rXFx0XFx0aWYgKHJlc3VsdClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSFdQT0lTT047XFxuK1xcdFxcdGt2bV9zZW5kX2h3cG9pc29uX3NpZ25hbChzMmZkLVxcdTAwM2VodmEsIF9fZmZzKHMydmkudm1hX3BhZ2VzaXplKSk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuIFxcdGlmIChyZXQgIT0gMSlcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTIxNDAsNyArMjE4NCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcXHUwMDI2czJ2aSwgcHJvdCwgbWVtY2FjaGUpO1xcbitcXHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcXHUwMDI2czJ2aSwgcHJvdCwgbWVtY2FjaGUsIHJlc3VsdCk7XFxuIH1cXG4gXFxuIC8qIFJlc29sdmUgdGhlIGFjY2VzcyBmYXVsdCBieSBtYWtpbmcgdGhlIHBhZ2UgeW91bmcgYWdhaW4uICovXFxuQEAgLTIyNTAsNyArMjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX3MyX3RyYW5zIG5lc3RlZF90cmFucywgKm5lc3RlZCA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgZXNyO1xcbitcXHR1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7XFxuK1xcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LVxcdTAwM2VhcmNoLmh3X21tdTtcXG4gXFx0cGh5c19hZGRyX3QgZmF1bHRfaXBhOyAvKiBUaGUgYWRkcmVzcyB3ZSBmYXVsdGVkIG9uICovXFxuIFxcdHBoeXNfYWRkcl90IGlwYTsgLyogQWx3YXlzIHRoZSBJUEEgaW4gdGhlIEwxIGd1ZXN0IHBoeXMgc3BhY2UgKi9cXG4gXFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDtcXG5AQCAtMjI1OSwxMSArMjMwNCw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0Z2ZuX3QgZ2ZuO1xcbiBcXHRpbnQgcmV0LCBpZHg7XFxuIFxcbi1cXHRpZiAoa3ZtX3ZjcHVfYWJ0X2lzc2VhKHZjcHUpKVxcbitcXHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcXG4gXFx0XFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xcbiBcXG4tXFx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcXG4tXFxuIFxcdC8qXFxuIFxcdCAqIFRoZSBmYXVsdCBJUEEgc2hvdWxkIGJlIHJlbGlhYmxlIGF0IHRoaXMgcG9pbnQgYXMgd2UncmUgbm90IGRlYWxpbmdcXG4gXFx0ICogd2l0aCBhbiBTRUEuXFxuQEAgLTIyNzIsNyArMjMxNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0aWYgKEtWTV9CVUdfT04oaXBhID09IElOVkFMSURfR1BBLCB2Y3B1LVxcdTAwM2Vrdm0pKVxcbiBcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuLVxcdGlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7XFxuK1xcdGlzX2lhYnQgPSBlc3JfdHJhcF9pc19pYWJ0KGVzcik7XFxuIFxcbiBcXHRpZiAoZXNyX2ZzY19pc190cmFuc2xhdGlvbl9mYXVsdChlc3IpKSB7XFxuIFxcdFxcdC8qIEJleW9uZCBzYW5pdGlzZWQgUEFSYW5nZSAod2hpY2ggaXMgdGhlIElQQSBsaW1pdCkgKi9cXG5AQCAtMjI4MiwxNCArMjMyNSwxNCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdC8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovXFxuLVxcdFxcdGlmIChmYXVsdF9pcGEgXFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS1cXHUwMDNlYXJjaC5od19tbXUtXFx1MDAzZXZ0Y3IpKSkge1xcbitcXHRcXHRpZiAoZmF1bHRfaXBhIFxcdTAwM2U9IEJJVF9VTEwoVlRDUl9FTDJfSVBBKG1tdS1cXHUwMDNldnRjcikpKSB7XFxuIFxcdFxcdFxcdGZhdWx0X2lwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xcbiBcXG4gXFx0XFx0XFx0cmV0dXJuIGt2bV9pbmplY3Rfc2VhKHZjcHUsIGlzX2lhYnQsIGZhdWx0X2lwYSk7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4tXFx0dHJhY2Vfa3ZtX2d1ZXN0X2ZhdWx0KCp2Y3B1X3BjKHZjcHUpLCBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpLFxcbitcXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcXG4gXFx0XFx0XFx0ICAgICAga3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSksIGZhdWx0X2lwYSk7XFxuIFxcbiBcXHQvKiBDaGVjayB0aGUgc3RhZ2UtMiBmYXVsdCBpcyB0cmFucy4gZmF1bHQgb3Igd3JpdGUgZmF1bHQgKi9cXG5AQCAtMjI5OCw5ICsyMzQxLDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgICAgIWVzcl9mc2NfaXNfYWNjZXNzX2ZsYWdfZmF1bHQoZXNyKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgIWVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoZXNyKSkge1xcbiBcXHRcXHRrdm1fZXJyKFxcXCJVbnN1cHBvcnRlZCBGU0M6IEVDPSUjeCB4RlNDPSUjbHggRVNSX0VMMj0lI2x4XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcXG4tXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQodmNwdSksXFxuLVxcdFxcdFxcdCh1bnNpZ25lZCBsb25nKWt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbitcXHRcXHRcXHRlc3JfZ2V0X2VjKGVzciksXFxuK1xcdFxcdFxcdCh1bnNpZ25lZCBsb25nKShlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQyksXFxuK1xcdFxcdFxcdCh1bnNpZ25lZCBsb25nKWVzcik7XFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbkBAIC0yMzE5LDggKzIzNjIsOCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdCAqIG5vdGhpbmcgdG8gd2FsayBhbmQgd2UgdHJlYXQgaXQgYXMgYSAxOjEgYmVmb3JlIGdvaW5nIHRocm91Z2ggdGhlXFxuIFxcdCAqIGNhbm9uaWNhbCB0cmFuc2xhdGlvbi5cXG4gXFx0ICovXFxuLVxcdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVxcdTAwM2Vrdm0sdmNwdS1cXHUwMDNlYXJjaC5od19tbXUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICB2Y3B1LVxcdTAwM2VhcmNoLmh3X21tdS1cXHUwMDNlbmVzdGVkX3N0YWdlMl9lbmFibGVkKSB7XFxuK1xcdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVxcdTAwM2Vrdm0sIG1tdSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIG1tdS1cXHUwMDNlbmVzdGVkX3N0YWdlMl9lbmFibGVkKSB7XFxuIFxcdFxcdHUzMiBlc3I7XFxuIFxcbiBcXHRcXHRyZXQgPSBrdm1fd2Fsa19uZXN0ZWRfczIodmNwdSwgZmF1bHRfaXBhLCBcXHUwMDI2bmVzdGVkX3RyYW5zKTtcXG5AQCAtMjM0OSw3ICsyMzkyLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRnZm4gPSBpcGEgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gXFx0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtXFx1MDAzZWt2bSwgZ2ZuKTtcXG4gXFx0aHZhID0gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3QobWVtc2xvdCwgZ2ZuLCBcXHUwMDI2d3JpdGFibGUpO1xcbi1cXHR3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdCh2Y3B1KTtcXG4rXFx0d3JpdGVfZmF1bHQgPSBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGVzcik7XFxuIFxcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgfHwgKHdyaXRlX2ZhdWx0IFxcdTAwMjZcXHUwMDI2ICF3cml0YWJsZSkpIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVGhlIGd1ZXN0IGhhcyBwdXQgZWl0aGVyIGl0cyBpbnN0cnVjdGlvbnMgb3IgaXRzIHBhZ2UtdGFibGVzXFxuQEAgLTIzNjIsNyArMjQwNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7XFxuK1xcdFxcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcXG4gXFx0XFx0XFx0cmV0ID0ga3ZtX2luamVjdF9zZWFfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7XFxuIFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gXFx0XFx0fVxcbkBAIC0yMzc3LDcgKzI0MjAsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdFxcdCAqIFNvIGxldCdzIGFzc3VtZSB0aGF0IHRoZSBndWVzdCBpcyBqdXN0IGJlaW5nXFxuIFxcdFxcdCAqIGNhdXRpb3VzLCBhbmQgc2tpcCB0aGUgaW5zdHJ1Y3Rpb24uXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIFxcdTAwMjZcXHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcXG4rXFx0XFx0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSBcXHUwMDI2XFx1MDAyNiBlc3JfZGFidF9pc19jbShlc3IpKSB7XFxuIFxcdFxcdFxcdGt2bV9pbmNyX3BjKHZjcHUpO1xcbiBcXHRcXHRcXHRyZXQgPSAxO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuQEAgLTIzOTUsNyArMjQzOCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0fVxcbiBcXG4gXFx0LyogVXNlcnNwYWNlIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWdpc3RlciBvdXQtb2YtYm91bmRzIElQQXMgKi9cXG4tXFx0Vk1fQlVHX09OKGlwYSBcXHUwMDNlPSBrdm1fcGh5c19zaXplKHZjcHUtXFx1MDAzZWFyY2guaHdfbW11KSk7XFxuK1xcdFZNX0JVR19PTihpcGEgXFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcXG4gXFxuIFxcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcXG4gXFx0XFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xcbkBAIC0yNDA5LDE5ICsyNDUyLDIwIEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0XFx0Lm5lc3RlZFxcdFxcdD0gbmVzdGVkLFxcbiBcXHRcXHQubWVtc2xvdFxcdD0gbWVtc2xvdCxcXG4gXFx0XFx0Lmh2YVxcdFxcdD0gaHZhLFxcbitcXHRcXHQuZXNyXFx0XFx0PSBlc3IsXFxuK1xcdFxcdC5tbXVcXHRcXHQ9IG1tdSxcXG4gXFx0fTtcXG4gXFxuIFxcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXFx1MDAzZWt2bSkpIHtcXG4gXFx0XFx0cmV0ID0gcGt2bV9tZW1fYWJvcnQoXFx1MDAyNnMyZmQpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRWTV9XQVJOX09OX09OQ0Uoa3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdCF3cml0ZV9mYXVsdCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcXG4rXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKFxcdTAwMjZzMmZkKSBcXHUwMDI2XFx1MDAyNiAhd3JpdGVfZmF1bHQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0XFx0IWt2bV9zMl9mYXVsdF9pc19leGVjKFxcdTAwMjZzMmZkKSk7XFxuIFxcbiBcXHRcXHRpZiAoa3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCkpXFxuLVxcdFxcdFxcdHJldCA9IGdtZW1fYWJvcnQoXFx1MDAyNnMyZmQpO1xcbitcXHRcXHRcXHRyZXQgPSBnbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBOVUxMKTtcXG4gXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRyZXQgPSB1c2VyX21lbV9hYm9ydChcXHUwMDI2czJmZCk7XFxuK1xcdFxcdFxcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBOVUxMKTtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKHJldCA9PSAwKVxcbkBAIC0yNzkyLDMgKzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpXFxuIFxcbiBcXHR0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpO1xcbiB9XFxuK1xcbisvKlxcbisgKiBUcnkgdG8gd2FsayB0byB0aGUgc3BlY2lmaWVkIEdQQSBpbiBjYW5vbmljYWwgbW11IC0gaWYgdW5tYXBwZWQgcmV0dXJucyAwLCBpZlxcbisgKiBtYXBwZWQgcmV0dXJucyB0aGUgZ3JhbnVsZSBzaXplLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJvci5cXG4rICovXFxuK3N0YXRpYyBsb25nIGt2bV93YWxrX3MyKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LFxcbitcXHRcXHRcXHRncGFfdCBncGEsIHM4ICpsZXZlbClcXG4re1xcbitcXHRzdHJ1Y3Qga3ZtICprdm0gPSBrdm1fczJfbW11X3RvX2t2bShwZ3QtXFx1MDAzZW1tdSk7XFxuK1xcdGt2bV9wdGVfdCBwdGU7XFxuK1xcdGxvbmcgcmV0O1xcbitcXG4rXFx0Z3VhcmQocmVhZF9sb2NrKShcXHUwMDI2a3ZtLVxcdTAwM2VtbXVfbG9jayk7XFxuK1xcbitcXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihwZ3QsIGdwYSwgXFx1MDAyNnB0ZSwgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgIEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXFxuK1xcdGlmICgha3ZtX3B0ZV92YWxpZChwdGUpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGt2bV9ncmFudWxlX3NpemUoKmxldmVsKTtcXG4rfVxcbitcXG4rLyogU3ludGhlc2lzZWQgZGF0YSBhYm9ydCBhdCBzcGVjaWZpZWQgcGFnZSB0YWJsZSBsZXZlbC4gKi9cXG4rI2RlZmluZSBQUkVfRkFVTFRfRVNSKGxldmVsKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0ICgoRVNSX0VMeF9FQ19EQUJUX0xPVyBcXHUwMDNjXFx1MDAzYyBFU1JfRUx4X0VDX1NISUZUKSB8XFx0XFxcXFxcbitcXHQgIEVTUl9FTHhfSUwgfCBFU1JfRUx4X0ZTQ19GQVVMVF9MKGxldmVsKSlcXG4rXFxuKy8qIFJldHJpZXZlIGVpdGhlciBhIHJlYWQtb25seSBvciBhIHJlYWQvd3JpdGUgaHZhLiAqL1xcbitzdGF0aWMgaHZhX3QgZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgZ2ZuX3QgZ2ZuKVxcbit7XFxuK1xcdHJldHVybiBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChzbG90LCBnZm4sIC8qd3JpdGFibGU9Ki9OVUxMKTtcXG4rfVxcbitcXG4rc3RhdGljIGxvbmcgX19wcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbitcXHRcXHRcXHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgaXNfZ21lbSA9IGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpO1xcbitcXHRjb25zdCBnZm5fdCBnZm4gPSBncGFfdG9fZ2ZuKGdwYSk7XFxuK1xcdGNvbnN0IGh2YV90IGh2YSA9IGlzX2dtZW0gPyAwIDogZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQobWVtc2xvdCwgZ2ZuKTtcXG4rXFx0Y29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHMyZmQgPSB7XFxuK1xcdFxcdC52Y3B1XFx0XFx0PSB2Y3B1LFxcbitcXHRcXHQuZmF1bHRfaXBhXFx0PSBncGEsXFxuK1xcdFxcdC5uZXN0ZWRcXHRcXHQ9IE5VTEwsXFxuK1xcdFxcdC5tZW1zbG90XFx0PSBtZW1zbG90LFxcbitcXHRcXHQuaHZhXFx0XFx0PSBodmEsXFxuK1xcdFxcdC5lc3JcXHRcXHQ9IFBSRV9GQVVMVF9FU1IobGV2ZWwpLFxcbitcXHRcXHQubW11XFx0XFx0PSBtbXUsXFxuK1xcdH07XFxuK1xcdHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHJlc3VsdCA9IHt9O1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkpXFxuK1xcdFxcdHJldHVybiAtRUZBVUxUO1xcbitcXG4rXFx0aWYgKGlzX2dtZW0pXFxuK1xcdFxcdHJldCA9IGdtZW1fYWJvcnQoXFx1MDAyNnMyZmQsIFxcdTAwMjZyZXN1bHQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBcXHUwMDI2cmVzdWx0KTtcXG4rXFx0aWYgKElTX0VSUl9WQUxVRShyZXQpKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRyZXR1cm4gcmVzdWx0Lm1hcHBpbmdfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIGxvbmcgcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcXG4rXFx0XFx0XFx0IGdwYV90IGdwYSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdClcXG4re1xcbitcXHRzOCBsZXZlbDtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHQvKiBUcnkgYSB3YWxrIGZpcnN0LiAqL1xcbitcXHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXFx1MDAzZXBndCwgZ3BhLCBcXHUwMDI2bGV2ZWwpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xcbitcXHRyZXR1cm4gX19wcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QsIGxldmVsKTtcXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmdcXG4rcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGJ5dGVzX3JlbWFpbmluZylcXG4re1xcbitcXHQvKiBHcmFudWxlcyBhcmUgYWx3YXlzIGEgcG93ZXItb2YtMi4gKi9cXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpO1xcbitcXG4rXFx0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcXG4rfVxcbitcXG4rLyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXFxuKyNkZWZpbmUgTUFYX1BSRV9GQVVMVF9SRVRSSUVTIDNcXG4rXFxuKy8qKlxcbisgKiBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkgLSBwcmUtZmF1bHQgc3RhZ2UtMiBwYWdlIHRhYmxlcyBmb3IgdGhlXFxuKyAqIHNwZWNpZmllZCBHUEEuXFxuKyAqIEB2Y3B1OlxcdFRoZSBWQ1BVIHBvaW50ZXJcXG4rICogQHJhbmdlOlxcdHtncGEsIHNpemUsIGZsYWdzfSB0dXBsZVxcbisgKlxcbisgKiBUaGUgbWFwcGluZyBwZXJmb3JtZWQgaXMgYWx3YXlzIGJlc3QtZWZmb3J0IC0gZmF1bHRpbmcgaW4gaXMgbmVjZXNzYXJpbHlcXG4rICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuXFxuKyAqXFxuKyAqIEByYW5nZS1cXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVxcdTAwM2VzaXplIHNwZWNpZmllcyBob3cgbWFueVxcbisgKiBieXRlcyByZW1haW4gdG8gYmUgcHJlLWZhdWx0ZWQgYW5kIEByYW5nZS1cXHUwMDNlZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC5cXG4rICpcXG4rICogUmV0dXJuczogdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJlLWZhdWx0IGNvbnN1bWVkLCBvciBhbiBlcnJvci5cXG4rICovXFxuK2xvbmcga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcXG4rXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXFxuK3tcXG4rXFx0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cXHUwMDNla3ZtO1xcbitcXHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXFx1MDAzZXNpemU7XFxuK1xcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSBcXHUwMDI2a3ZtLVxcdTAwM2VhcmNoLm1tdTsgLyogQ2Fub25pY2FsLiAqL1xcbitcXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90O1xcbitcXHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cXHUwMDNlZ3BhO1xcbitcXHRpbnQgbnVtX3JldHJpZXMgPSAwO1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHBLVk0gaXMgdW5zdXBwb3J0ZWQgYXMgdGhlaXIgdkNQVXMgYXJlIGluc3RhbnRpYXRlZCBvbiBmaXJzdCBydW4gYW5kXFxuK1xcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdG1lbXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdwYV90b19nZm4oZ3BhKSk7XFxuK1xcdGlmICghbWVtc2xvdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdC8qIFNSQ1UgbXVzdCBiZSByZWxlYXNlZCBmb3IgcHJvZ3Jlc3MgYW5kIG9ubHkgdXNlcmxhbmQgY2FuIGRvIHRoYXQuICovXFxuK1xcdGlmIChtZW1zbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXFxuK1xcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0ZG8ge1xcbitcXHRcXHRyZXQgPSBwcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QpO1xcbitcXHR9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNiBudW1fcmV0cmllcysrIFxcdTAwM2MgTUFYX1BSRV9GQVVMVF9SRVRSSUVTKTtcXG4rXFxuK1xcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIHByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGEsIHJldCwgYnl0ZXNfcmVtYWluaW5nKTtcXG4rfVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXFxuaW5kZXggMTcxMjNmMGI2ZGFiYS4uMzQ4OGQ1YWQyMjViNiAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXFxuQEAgLTY1NCw3ICs2NTQsNyBAQCBzdGF0aWMgdTggZ2V0X2d1ZXN0X21hcHBpbmdfdHRsKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHU2NCBhZGRyKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuIFxcdHRtcCBcXHUwMDI2PSB+KHN6IC0gMSk7XFxuLVxcdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXFx1MDAzZXBndCwgdG1wLCBcXHUwMDI2cHRlLCBOVUxMKSlcXG4rXFx0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cXHUwMDNlcGd0LCB0bXAsIFxcdTAwMjZwdGUsIE5VTEwsIDApKVxcbiBcXHRcXHRnb3RvIGFnYWluO1xcbiBcXHRpZiAoIShwdGUgXFx1MDAyNiBQVEVfVkFMSUQpKVxcbiBcXHRcXHRnb3RvIGFnYWluO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxcbmluZGV4IDVmOGQxN2VlNWY2NzcuLjFlMGVkZDBmOTlmNzUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cXG5AQCAtMTczLDYgKzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2RlYnVnLWV4Y2VwdGlvbnNcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvaGVsbG9fZWwyXFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2hvc3Rfc3ZlXFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2h5cGVyY2FsbHNcXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2V4dGVybmFsX2Fib3J0c1xcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9tbWlvX3NpZ25fZXh0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L3BhZ2VfZmF1bHRfdGVzdFxcbkBAIC0xOTksNiArMjAwLDcgQEAgVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gZ3Vlc3RfbWVtZmRfdGVzdFxcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBtbXVfc3RyZXNzX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcnNlcV90ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IHN0ZWFsX3RpbWVcXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcHJlX2ZhdWx0X21lbW9yeV90ZXN0XFxuIFxcbiBURVNUX0dFTl9QUk9HU19zMzkwID0gJChURVNUX0dFTl9QUk9HU19DT01NT04pXFxuIFRFU1RfR0VOX1BST0dTX3MzOTAgKz0gczM5MC9tZW1vcFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjA5YzFkYjMwMzg1NjZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXFxuQEAgLTAsMCArMSwxNTggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKlxcbisgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxcbisgKiBsYXN0LXJ1biBjb250ZXh0IGlzIG5lc3RlZC5cXG4rICpcXG4rICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxcbisgKiByZWFsIEVMMSByZWdpc3RlcnMgdGhlbiBFUkVUcyB0byB2RUwxIGFuZCBleGl0cyB0byB1c2Vyc3BhY2Ugc28gaXRzIHZDUFVcXG4rICogbGFzdC1ydW4gY29udGV4dCBpcyBuZXN0ZWQgYmFja2VkIGJ5IGEgc2hhZG93IHN0YWdlIDIgTU1VLlxcbisgKlxcbisgKiBBc3NlcnQgdGhhdCBwcmUtZmF1bHRpbmcgaWdub3JlcyB0aGF0IGFuZCB0YXJnZXRzIHRoZSBjYW5vbmljYWwgc3RhZ2UtMlxcbisgKiBwYWdlIHRhYmxlcyBvbmx5LlxcbisgKi9cXG4rI2luY2x1ZGUgXFxcImt2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJwcm9jZXNzb3IuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInRlc3RfdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidWNhbGwuaFxcXCJcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vc3lzcmVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBURVNUX01FTV9TTE9UXFx0XFx0MTBcXG4rI2RlZmluZSBURVNUX01FTV9TSVpFXFx0XFx0U1pfMk1cXG4rI2RlZmluZSBURVNUX01FTV9HUEFcXHRcXHRTWl8xR1xcbitcXG4rc3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcXG4re1xcbitcXHR1NjQgb2Zmc2V0O1xcbitcXG4rXFx0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDEpO1xcbitcXG4rXFx0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXFxuK1xcdEdVRVNUX1NZTkMoMSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3dcXG4rXFx0ICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXFx1MDAzYyBURVNUX01FTV9TSVpFOyBvZmZzZXQgKz0gU1pfNEspXFxuK1xcdFxcdFJFQURfT05DRSgqKHU2NCAqKShURVNUX01FTV9HUEEgKyBvZmZzZXQpKTtcXG4rXFxuK1xcdEdVRVNUX0RPTkUoKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZ3Vlc3RfY29kZSh2b2lkKVxcbit7XFxuK1xcdHU2NCBzcDtcXG4rXFxuK1xcdEdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAyKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE1pcnJvciB0aGUgRUwyIHRyYW5zbGF0aW9uIHJlZ2ltZSBpbnRvIHRoZSByZWFsIEVMMSByZWdpc3RlcnMgc29cXG4rXFx0ICogdGhhdCB2RUwxIHJ1bnMgb24gdGhlIHRlc3QncyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcXG4rXFx0ICogX0VMMSBhY2Nlc3NvcnMgcmVhZCB0aGUgRUwyIHJlZ2lzdGVycywgYW5kIHRoZSBfRUwxMiBhY2Nlc3NvcnNcXG4rXFx0ICogd3JpdGUgdGhlIHJlYWwgRUwxIHJlZ2lzdGVycy5cXG4rXFx0ICovXFxuK1xcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHNjdGxyX2VsMSksIFNZU19TQ1RMUl9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcodGNyX2VsMSksIFNZU19UQ1JfRUwxMik7XFxuK1xcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcobWFpcl9lbDEpLCBTWVNfTUFJUl9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoY3BhY3JfZWwxKSwgU1lTX0NQQUNSX0VMMTIpO1xcbitcXG4rXFx0LyogUnVuIHZFTDEgb24gdGhlIHNhbWUgc3RhY2suICovXFxuK1xcdGFzbSB2b2xhdGlsZShcXFwibW92ICUwLCBzcFxcXCIgOiBcXFwiPXJcXFwiKHNwKSk7XFxuK1xcdHdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIERyb3AgVEdFIHNvIHRoYXQgdkVMMSBpcyBhIG5lc3RlZCBjb250ZXh0IHJhdGhlciB0aGFuIGhvc3QgRUwwLlxcbitcXHQgKiBLVk0gYmFja3MgaXQgd2l0aCBhIHNoYWRvdyBzdGFnZS0yIE1NVSBldmVuIHRob3VnaCB2c3RhZ2UtMiBpc1xcbitcXHQgKiBkaXNhYmxlZCAoSENSX0VMMi5WTT0wKS5cXG4rXFx0ICovXFxuK1xcdHdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhoY3JfZWwyKSBcXHUwMDI2IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7XFxuK1xcdGlzYigpO1xcbitcXG4rXFx0d3JpdGVfc3lzcmVnKFBTUl9NT0RFX0VMMWggfCBQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBQU1JfQV9CSVQgfFxcbitcXHRcXHQgICAgIFBTUl9EX0JJVCwgc3Bzcl9lbDIpO1xcbitcXHR3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7XFxuK1xcdGFzbSB2b2xhdGlsZShcXFwiZXJldFxcXCIpO1xcbitcXG4rXFx0R1VFU1RfQVNTRVJUKGZhbHNlKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHJlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGdwYSwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0ge1xcbitcXHRcXHQuZ3BhID0gZ3BhLFxcbitcXHRcXHQuc2l6ZSA9IHNpemUsXFxuK1xcdH07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdHJldCA9IF9fdmNwdV9pb2N0bCh2Y3B1LCBLVk1fUFJFX0ZBVUxUX01FTU9SWSwgXFx1MDAyNnJhbmdlKTtcXG4rXFx0fSB3aGlsZSAoKCFyZXQgXFx1MDAyNlxcdTAwMjYgcmFuZ2Uuc2l6ZSkgfHxcXG4rXFx0XFx0IChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSk7XFxuK1xcbitcXHRURVNUX0FTU0VSVCghcmV0LCBcXFwiS1ZNX1BSRV9GQVVMVF9NRU1PUlkgZmFpbGVkLCByZXQ6ICVkIGVycm5vOiAlZFxcXCIsXFxuK1xcdFxcdCAgICByZXQsIGVycm5vKTtcXG4rXFx0VEVTVF9BU1NFUlRfRVEocmFuZ2Uuc2l6ZSwgMCk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDtcXG4rXFx0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xcbitcXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcXG4rXFx0c3RydWN0IHVjYWxsIHVjO1xcbitcXHR1NjQgbnBhZ2VzO1xcbitcXG4rXFx0VEVTVF9SRVFVSVJFKHRlc3Rfc3VwcG9ydHNfZWwyKCkpO1xcbitcXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcXG4rXFxuK1xcdHZtID0gdm1fY3JlYXRlKDEpO1xcbitcXG4rXFx0a3ZtX2dldF9kZWZhdWx0X3ZjcHVfdGFyZ2V0KHZtLCBcXHUwMDI2aW5pdCk7XFxuK1xcdGluaXQuZmVhdHVyZXNbMF0gfD0gQklUKEtWTV9BUk1fVkNQVV9IQVNfRUwyKTtcXG4rXFx0dmNwdSA9IGFhcmNoNjRfdmNwdV9hZGQodm0sIDAsIFxcdTAwMjZpbml0LCBndWVzdF9jb2RlKTtcXG4rXFx0a3ZtX2FyY2hfdm1fZmluYWxpemVfdmNwdXModm0pO1xcbitcXG4rXFx0bnBhZ2VzID0gVEVTVF9NRU1fU0laRSAvIHZtLVxcdTAwM2VwYWdlX3NpemU7XFxuK1xcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIFRFU1RfTUVNX0dQQSxcXG4rXFx0XFx0XFx0XFx0ICAgIFRFU1RfTUVNX1NMT1QsIG5wYWdlcywgMCk7XFxuK1xcdHZpcnRfbWFwKHZtLCBURVNUX01FTV9HUEEsIFRFU1RfTUVNX0dQQSwgbnBhZ2VzKTtcXG4rXFxuK1xcdC8qIFJ1biB0aGUgZ3Vlc3QgdW50aWwgaXQgaGFzIEVSRVQnZCBmcm9tIHZFTDIgdG8gdkVMMS4gKi9cXG4rXFx0dmNwdV9ydW4odmNwdSk7XFxuK1xcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFxcdTAwMjZ1YykpIHtcXG4rXFx0Y2FzZSBVQ0FMTF9TWU5DOlxcbitcXHRcXHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgVUNBTExfQUJPUlQ6XFxuK1xcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0VEVTVF9GQUlMKFxcXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFxcXCIsIHVjLmNtZCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB2Q1BVJ3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93XFxuK1xcdCAqIHN0YWdlLTIgTU1VLlxcbitcXHQgKlxcbitcXHQgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLlxcbitcXHQgKi9cXG4rXFx0cHJlX2ZhdWx0KHZjcHUsIFRFU1RfTUVNX0dQQSwgVEVTVF9NRU1fU0laRSk7XFxuK1xcbitcXHQvKiBSZXN1bWUgYXQgdkVMMSBhbmQgdG91Y2ggdGhlIHByZWZhdWx0ZWQgcmFuZ2UuICovXFxuK1xcdHZjcHVfcnVuKHZjcHUpO1xcbitcXHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcXHUwMDI2dWMpKSB7XFxuK1xcdGNhc2UgVUNBTExfRE9ORTpcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgVUNBTExfQUJPUlQ6XFxuK1xcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0VEVTVF9GQUlMKFxcXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFxcXCIsIHVjLmNtZCk7XFxuK1xcdH1cXG4rXFxuK1xcdGt2bV92bV9mcmVlKHZtKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXFxuaW5kZXggYTBmY2FlM2NiN2E4Yi4uNzAyYzcyYmJmYTk2MCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG5AQCAtMTIsMTkgKzEyLDI5IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nwcm9jZXNzb3IuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3VjYWxsX2NvbW1vbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZ3Vlc3RfbW9kZXMuaFxcdTAwM2VcXG4gXFxuIC8qIEFyYml0cmFyaWx5IGNob3NlbiB2YWx1ZXMgKi9cXG4tI2RlZmluZSBURVNUX1NJWkVcXHRcXHQoU1pfMk0gKyBQQUdFX1NJWkUpXFxuLSNkZWZpbmUgVEVTVF9OUEFHRVNcXHRcXHQoVEVTVF9TSVpFIC8gUEFHRV9TSVpFKVxcbisjZGVmaW5lIFRFU1RfQkFTRV9TSVpFXFx0XFx0U1pfMk1cXG4gI2RlZmluZSBURVNUX1NMT1RcXHRcXHQxMFxcbiBcXG4rLyogU3RvcmFnZSBvZiB0ZXN0IGluZm8gdG8gc2hhcmUgd2l0aCBndWVzdCBjb2RlICovXFxuK3N0cnVjdCB0ZXN0X2NvbmZpZyB7XFxuK1xcdHU2NCBwYWdlX3NpemU7XFxuK1xcdHU2NCB0ZXN0X3NpemU7XFxuK1xcdHU2NCB0ZXN0X251bV9wYWdlcztcXG4rfTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgdGVzdF9jb25maWcgdGVzdF9jb25maWc7XFxuK1xcbiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSlcXG4ge1xcbiBcXHR2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDtcXG4rXFx0c3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSBcXHUwMDI2dGVzdF9jb25maWc7XFxuIFxcdGludCBpO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFRFU1RfTlBBR0VTOyBpKyspIHtcXG4tXFx0XFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIFBBR0VfU0laRSk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjb25maWctXFx1MDAzZXRlc3RfbnVtX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIGNvbmZpZy1cXHUwMDNlcGFnZV9zaXplKTtcXG4gXFxuIFxcdFxcdHZhbCA9ICpzcmM7XFxuIFxcdH1cXG5AQCAtMzYsNiArNDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7XFxuIFxcdHN0cnVjdCBrdm1fdm0gKnZtO1xcbiBcXHRncGFfdCBncGE7XFxuIFxcdHUzMiBmbGFncztcXG4rXFx0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7XFxuIFxcdGJvb2wgd29ya2VyX3JlYWR5O1xcbiBcXHRib29sIHByZWZhdWx0X3JlYWR5O1xcbiBcXHRib29sIHJlY3JlYXRlX3Nsb3Q7XFxuQEAgLTU2LDE0ICs2NywxNiBAQCBzdGF0aWMgdm9pZCAqZGVsZXRlX3Nsb3Rfd29ya2VyKHZvaWQgKl9fZGF0YSlcXG4gXFx0d2hpbGUgKCFSRUFEX09OQ0UoZGF0YS1cXHUwMDNlcmVjcmVhdGVfc2xvdCkpXFxuIFxcdFxcdGNwdV9yZWxheCgpO1xcbiBcXG4tXFx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZGF0YS1cXHUwMDNlZ3BhLFxcbi1cXHRcXHRcXHRcXHQgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS1cXHUwMDNlZmxhZ3MpO1xcbitcXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtXFx1MDAzZW1lbV9iYWNraW5nX3NyYywgZGF0YS1cXHUwMDNlZ3BhLFxcbitcXHRcXHRcXHRcXHQgICAgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywgZGF0YS1cXHUwMDNlZmxhZ3MpO1xcbiBcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXFxuLVxcdFxcdFxcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXFxuK1xcdFxcdFxcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LFxcbitcXHRcXHRcXHQgICAgIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjLFxcbitcXHRcXHRcXHQgICAgIGJvb2wgcHJpdmF0ZSlcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XFxuIFxcdFxcdC5ncGEgPSBiYXNlX2dwYSArIG9mZnNldCxcXG5AQCAtNzQsNiArODcsNyBAQCBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxcbiBcXHRcXHQudm0gPSB2Y3B1LVxcdTAwM2V2bSxcXG4gXFx0XFx0LmdwYSA9IGJhc2VfZ3BhLFxcbiBcXHRcXHQuZmxhZ3MgPSBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDAsXFxuK1xcdFxcdC5tZW1fYmFja2luZ19zcmMgPSBtZW1fYmFja2luZ19zcmMsXFxuIFxcdH07XFxuIFxcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcXG4gXFx0cHRocmVhZF90IHNsb3Rfd29ya2VyO1xcbkBAIC0xNTAsOCArMTY0LDggQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcXG4gXFx0LypcXG4gXFx0ICogQXNzZXJ0IHN1Y2Nlc3MgaWYgcHJlZmF1bHRpbmcgdGhlIGVudGlyZSByYW5nZSBzaG91bGQgc3VjY2VlZCwgaS5lLlxcbiBcXHQgKiBjb21wbGV0ZSB3aXRoIG5vIGJ5dGVzIHJlbWFpbmluZy4gIE90aGVyd2lzZSBwcmVmYXVsdGluZyBzaG91bGQgaGF2ZVxcbi1cXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAoZHVlIHRvIFJFVF9QRl9FTVVMQVRFIGZvciBlbXVsYXRlZCBNTUlPIHdoZW5cXG4tXFx0ICogbm8gbWVtc2xvdCBleGlzdHMpLlxcbitcXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAobm8gbWVtc2xvdCBleGlzdHMgZm9yIHRoZSBHUEE7IG9uIHg4NiB0aGlzXFxuK1xcdCAqIHN1cmZhY2VzIHZpYSBSRVRfUEZfRU1VTEFURSkuXFxuIFxcdCAqL1xcbiBcXHRpZiAoIWV4cGVjdGVkX2xlZnQpXFxuIFxcdFxcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cXHUwMDNldm0pO1xcbkBAIC0xNjAsMzkgKzE3NCw4MiBAQCBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxcbiBcXHRcXHRcXHRcXHRcXHQgIEtWTV9QUkVfRkFVTFRfTUVNT1JZLCByZXQsIHZjcHUtXFx1MDAzZXZtKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXFxuK3N0cnVjdCB0ZXN0X3BhcmFtcyB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcXG4rXFx0Ym9vbCBwcml2YXRlO1xcbitcXHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIG1lbV9iYWNraW5nX3NyYztcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KGVudW0gdm1fZ3Vlc3RfbW9kZSBndWVzdF9tb2RlLCB2b2lkICphcmcpXFxuIHtcXG4tXFx0Z3BhX3QgZ3BhLCBndmEsIGFsaWdubWVudCwgZ3Vlc3RfcGFnZV9zaXplO1xcbitcXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xcbitcXHRncGFfdCBiYWNraW5nX3NyY19wYWdlc3osIG1lbV9wYWdlX3NpemU7XFxuK1xcdHN0cnVjdCB0ZXN0X3BhcmFtcyAqcCA9IGFyZztcXG4gXFx0Y29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0ge1xcbi1cXHRcXHQubW9kZSA9IFZNX01PREVfREVGQVVMVCxcXG4tXFx0XFx0LnR5cGUgPSB2bV90eXBlLFxcbitcXHRcXHQubW9kZSA9IGd1ZXN0X21vZGUsXFxuK1xcdFxcdC50eXBlID0gcC1cXHUwMDNldm1fdHlwZSxcXG4gXFx0fTtcXG4gXFx0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xcbitcXHRzdHJ1Y3Qga3ZtX3J1biAqcnVuO1xcbiBcXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcXG4gXFx0c3RydWN0IHVjYWxsIHVjO1xcbiBcXG4rXFx0cHJfaW5mbyhcXFwiVGVzdGluZyBndWVzdCBtb2RlOiAlc1xcXFxuXFxcIiwgdm1fZ3Vlc3RfbW9kZV9zdHJpbmcoZ3Vlc3RfbW9kZSkpO1xcbitcXHRwcl9pbmZvKFxcXCJUZXN0aW5nIG1lbW9yeSBiYWNraW5nIHNyYyB0eXBlOiAlc1xcXFxuXFxcIixcXG4rXFx0XFx0dm1fbWVtX2JhY2tpbmdfc3JjX2FsaWFzKHAtXFx1MDAzZW1lbV9iYWNraW5nX3NyYyktXFx1MDAzZW5hbWUpO1xcbitcXG4gXFx0dm0gPSB2bV9jcmVhdGVfc2hhcGVfd2l0aF9vbmVfdmNwdShzaGFwZSwgXFx1MDAyNnZjcHUsIGd1ZXN0X2NvZGUpO1xcbiBcXG4tXFx0YWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7XFxuLVxcdGdwYSA9ICh2bS1cXHUwMDNlbWF4X2dmbiAtIFRFU1RfTlBBR0VTKSAqIGd1ZXN0X3BhZ2Vfc2l6ZTtcXG4rXFx0Z3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbZ3Vlc3RfbW9kZV0ucGFnZV9zaXplO1xcbitcXHRob3N0X3BhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGJhY2tpbmdfc3JjX3BhZ2VzeiA9IGdldF9iYWNraW5nX3NyY19wYWdlc3oocC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjKTtcXG4rXFx0bWVtX3BhZ2Vfc2l6ZSA9IG1heChob3N0X3BhZ2Vfc2l6ZSwgYmFja2luZ19zcmNfcGFnZXN6KTtcXG4rXFxuK1xcdHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSA9IGd1ZXN0X3BhZ2Vfc2l6ZTtcXG4rXFx0dGVzdF9jb25maWcudGVzdF9zaXplID0gYWxpZ25fdXAoVEVTVF9CQVNFX1NJWkUgKyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCBtZW1fcGFnZV9zaXplKTtcXG4rXFx0dGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS1cXHUwMDNlbW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcXG4rXFxuK1xcdGdwYSA9ICh2bS1cXHUwMDNlbWF4X2dmbiAtIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzKSAqIHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZTtcXG4gXFx0YWxpZ25tZW50ID0gU1pfMk07XFxuK1xcdGFsaWdubWVudCA9IG1heChhbGlnbm1lbnQsIG1lbV9wYWdlX3NpemUpO1xcbiBcXHRncGEgPSBhbGlnbl9kb3duKGdwYSwgYWxpZ25tZW50KTtcXG4gXFx0Z3ZhID0gZ3BhIFxcdTAwMjYgKCgxVUxMIFxcdTAwM2NcXHUwMDNjICh2bS1cXHUwMDNldmFfYml0cyAtIDEpKSAtIDEpO1xcbiBcXG4tXFx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZ3BhLCBURVNUX1NMT1QsXFxuLVxcdFxcdFxcdFxcdCAgICBURVNUX05QQUdFUywgcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcXG4tXFx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCBURVNUX05QQUdFUyk7XFxuK1xcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgcC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjLFxcbitcXHRcXHRcXHRcXHQgICAgZ3BhLCBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLFxcbitcXHRcXHRcXHRcXHQgICAgcC1cXHUwMDNlcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcXG4rXFx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XFxuK1xcbitcXHRpZiAocC1cXHUwMDNlcHJpdmF0ZSlcXG4rXFx0XFx0dm1fbWVtX3NldF9wcml2YXRlKHZtLCBncGEsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSk7XFxuK1xcbitcXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLFxcbitcXHRcXHRcXHQgcC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVxcdTAwM2Vwcml2YXRlKTtcXG4rXFx0LyogUmV0cnkgdGhlIHNhbWUgcmFuZ2UgYWZ0ZXIgdGhlIGZpcnN0IHByZWZhdWx0IGF0dGVtcHQuICovXFxuK1xcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXFxuK1xcdFxcdFxcdCBwLVxcdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXFx1MDAzZXByaXZhdGUpO1xcbitcXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSxcXG4rXFx0XFx0XFx0IHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLFxcbitcXHRcXHRcXHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcXG4rXFx0XFx0XFx0IHAtXFx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cXHUwMDNlcHJpdmF0ZSk7XFxuK1xcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsXFxuK1xcdFxcdFxcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXFxuK1xcdFxcdFxcdCBwLVxcdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXFx1MDAzZXByaXZhdGUpO1xcbiBcXG4tXFx0aWYgKHByaXZhdGUpXFxuLVxcdFxcdHZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCBURVNUX1NJWkUpO1xcbitcXHR2Y3B1X2FyZ3Nfc2V0KHZjcHUsIDEsIGd2YSk7XFxuIFxcbi1cXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgU1pfMk0sIDAsIHByaXZhdGUpO1xcbi1cXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgU1pfMk0sIFBBR0VfU0laRSAqIDIsIFBBR0VfU0laRSwgcHJpdmF0ZSk7XFxuLVxcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTtcXG4rXFx0LyogRXhwb3J0IHRoZSBzaGFyZWQgdmFyaWFibGVzIHRvIHRoZSBndWVzdC4gKi9cXG4rXFx0c3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTtcXG4gXFxuLVxcdHZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTtcXG4gXFx0dmNwdV9ydW4odmNwdSk7XFxuIFxcbitcXHRydW4gPSB2Y3B1LVxcdTAwM2VydW47XFxuK1xcdFRFU1RfQVNTRVJUKHJ1bi1cXHUwMDNlZXhpdF9yZWFzb24gPT0gVUNBTExfRVhJVF9SRUFTT04sXFxuK1xcdFxcdCAgICBcXFwiV2FudGVkICVzLCBnb3QgZXhpdCByZWFzb246ICV1ICglcylcXFwiLFxcbitcXHRcXHQgICAgZXhpdF9yZWFzb25fc3RyKFVDQUxMX0VYSVRfUkVBU09OKSxcXG4rXFx0XFx0ICAgIHJ1bi1cXHUwMDNlZXhpdF9yZWFzb24sIGV4aXRfcmVhc29uX3N0cihydW4tXFx1MDAzZWV4aXRfcmVhc29uKSk7XFxuK1xcbiBcXHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcXHUwMDI2dWMpKSB7XFxuIFxcdGNhc2UgVUNBTExfQUJPUlQ6XFxuIFxcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbkBAIC0yMDcsMjQgKzI2NCw2MSBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSlcXG4gXFx0a3ZtX3ZtX2ZyZWUodm0pO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXFxuK3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsXFxuK1xcdFxcdFxcdFxcdCAgYm9vbCBwcml2YXRlKVxcbiB7XFxuK1xcdHN0cnVjdCB0ZXN0X3BhcmFtcyBwID0ge1xcbitcXHRcXHQudm1fdHlwZSA9IHZtX3R5cGUsXFxuK1xcdFxcdC5wcml2YXRlID0gcHJpdmF0ZSxcXG4rXFx0XFx0Lm1lbV9iYWNraW5nX3NyYyA9IGJhY2tpbmdfc3JjLFxcbitcXHR9O1xcbitcXG4gXFx0aWYgKHZtX3R5cGUgXFx1MDAyNlxcdTAwMjYgIShrdm1fY2hlY2tfY2FwKEtWTV9DQVBfVk1fVFlQRVMpIFxcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xcbiBcXHRcXHRwcl9pbmZvKFxcXCJTa2lwcGluZyB0ZXN0cyBmb3Igdm1fdHlwZSAweCVseFxcXFxuXFxcIiwgdm1fdHlwZSk7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4tXFx0X190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7XFxuK1xcdGZvcl9lYWNoX2d1ZXN0X21vZGUoX190ZXN0X3ByZV9mYXVsdF9tZW1vcnksIFxcdTAwMjZwKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaGVscChjaGFyICpuYW1lKVxcbit7XFxuK1xcdHB1dHMoXFxcIlxcXCIpO1xcbitcXHRwcmludGYoXFxcInVzYWdlOiAlcyBbLWhdIFstbSBtb2RlXSBbLXMgbWVtLXR5cGVdXFxcXG5cXFwiLCBuYW1lKTtcXG4rXFx0cHV0cyhcXFwiXFxcIik7XFxuK1xcdGd1ZXN0X21vZGVzX2hlbHAoKTtcXG4rXFx0YmFja2luZ19zcmNfaGVscChcXFwiLXNcXFwiKTtcXG4rXFx0cHV0cyhcXFwiXFxcIik7XFxuIH1cXG4gXFxuIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXFxuIHtcXG4rXFx0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBiYWNraW5nID0gREVGQVVMVF9WTV9NRU1fU1JDO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcXG4rXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJobTpzOlxcXCIpKSAhPSAtMSkge1xcbitcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbitcXHRcXHRjYXNlICdtJzpcXG4rXFx0XFx0XFx0Z3Vlc3RfbW9kZXNfY21kbGluZShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncyc6XFxuK1xcdFxcdFxcdGJhY2tpbmcgPSBwYXJzZV9iYWNraW5nX3NyY190eXBlKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdoJzpcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0aGVscChhcmd2WzBdKTtcXG4rXFx0XFx0XFx0ZXhpdCgwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcXG4gXFxuLVxcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XFxuK1xcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBiYWNraW5nLCBmYWxzZSk7XFxuICNpZmRlZiBfX3g4Nl82NF9fXFxuLVxcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgZmFsc2UpO1xcbi1cXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIHRydWUpO1xcbitcXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIGZhbHNlKTtcXG4rXFx0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KEtWTV9YODZfU1dfUFJPVEVDVEVEX1ZNLCBiYWNraW5nLCB0cnVlKTtcXG4gI2VuZGlmXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjA1LjI0ODQ1MzMyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjgzMzQ4ODA2NDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDVlYmU0MzFmY2YxOTJhMGI5NDIyOWI1NGQ5ZmFiNTBlZDA5NmYzOGJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxMzoxMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdCBiL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdFxuaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG5AQCAtNjQ4NSw3ICs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcbi06QXJjaGl0ZWN0dXJlczogbm9uZVxuKzpBcmNoaXRlY3R1cmVzOiB4ODYsIHMzOTAsIGFybTY0XG4gOlR5cGU6IHZjcHUgaW9jdGxcbiA6UGFyYW1ldGVyczogc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IChpbi9vdXQpXG4gOlJldHVybnM6IDAgaWYgYXQgbGVhc3Qgb25lIHBhZ2UgaXMgcHJvY2Vzc2VkLCBcdTAwM2MgMCBvbiBlcnJvclxuQEAgLTY0OTMsMTIgKzY0OTMsMTQgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIEVycm9yczpcbiBcbiAgID09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4rICBFQUdBSU4gICAgIEEgcmFjZSBvY2N1cnJlZCBiZWZvcmUgcHJvZ3Jlc3Mgd2FzIG1hZGUsIGJ1dCBhIHJldHJ5IG1heSBzdWNjZWVkLlxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxuICAgICAgICAgICAgICBwYWdlIGFsaWduZWQsIGNhdXNlcyBhbiBvdmVyZmxvdywgb3Igc2l6ZSBpcyB6ZXJvKSwgb3IgdGhlIFZNXG4gICAgICAgICAgICAgIGlzIFVDT05UUk9MIChzMzkwKS5cbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXG4gICBFSU5UUiAgICAgIEFuIHVubWFza2VkIHNpZ25hbCBpcyBwZW5kaW5nIGFuZCBubyBwYWdlIHdhcyBwcm9jZXNzZWQuXG4gICBFRkFVTFQgICAgIFRoZSBwYXJhbWV0ZXIgYWRkcmVzcyB3YXMgaW52YWxpZC5cbisgIEVIV1BPSVNPTiAgQSBwb2lzb25lZCBob3N0IHBhZ2Ugd2FzIGVuY291bnRlcmVkLlxuICAgRU9QTk9UU1VQUCBNYXBwaW5nIG1lbW9yeSBmb3IgYSBHUEEgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlXG4gICAgICAgICAgICAgIGh5cGVydmlzb3IsIGFuZC9vciBmb3IgdGhlIGN1cnJlbnQgdkNQVSBzdGF0ZS9tb2RlLlxuICAgRUlPICAgICAgICB1bmV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbnMgKGFsc28gY2F1c2VzIGEgV0FSTilcbkBAIC02NTE4LDcgKzY1MjAsMTcgQEAgRXJyb3JzOlxuIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHBvcHVsYXRlcyBLVk0ncyBzdGFnZS0yIHBhZ2UgdGFibGVzIHVzZWQgdG8gbWFwIG1lbW9yeVxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXG4gc3RhZ2UtMiByZWFkIHBhZ2UgZmF1bHQsIGUuZy4gZmF1bHRzIGluIG1lbW9yeSBhcyBuZWVkZWQsIGJ1dCBkb2Vzbid0IGJyZWFrXG4tQ29XLiAgT24geDg2LCBLVk0gZG9lcyBub3QgbWFyayBhbnkgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURSBhcyBBY2Nlc3NlZC5cbitDb1cuICBPbiBhcm02NCwgS1ZNIG1hcmtzIG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEVzIGFzIEFjY2Vzc2VkLCBhcyBpdFxuK2RvZXMgZm9yIGFueSBzdGFnZS0yIGZhdWx0LCBidXQgbGVhdmVzIHRoZSBBY2Nlc3NlZCBzdGF0ZSBvZiBleGlzdGluZyBQVEVzXG4rdW5jaGFuZ2VkLiAgT24geDg2LCBLVk0gZG9lcyBub3QgbWFyayBhbnkgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURSBhc1xuK0FjY2Vzc2VkLCBhbmQgZm9yIHMzOTAgaXQgaXMgbm90IGFwcGxpY2FibGUuXG4rXG4rT24gYXJtNjQsIGEgR1BBIGlzIGludGVycHJldGVkIGFzIGFuIElQQSwgYW5kIG5ldmVyIGludGVycHJldGVkIGFzIHRoZSBJUEFcbitvZiBhIG5lc3RlZCBndWVzdC4gUHJlLWZhdWx0aW5nIG9ubHkgcG9wdWxhdGVzIGNhbm9uaWNhbCBzdGFnZSAyIHBhZ2Vcbit0YWJsZXMuXG4rXG4rVGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhcm02NCBpZiB0aGUgcHJvdGVjdGVkIEtWTSAocEtWTSkgZmVhdHVyZVxuK2lzIGVuYWJsZWQuXG4gXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXG4gcHJpdmF0ZSBndWVzdCBtZW1vcnkgYmVmb3JlIHRoZSBndWVzdCBpcyAnZmluYWxpemVkJy9tZWFzdXJlZCwgdGhpcyBpb2N0bFxuQEAgLTY1MzMsNyArNjU0NSw3IEBAIFdoZW4gdGhlIGlvY3RsIHJldHVybnMsIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFx1MDAzZSAwIG9uIHJldHVybiwgdGhlIGNhbGxlciBjYW4ganVzdCBpc3N1ZVxuIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LlxuIFxuLVNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuK09uIHg4Niwgc2hhZG93IHBhZ2UgdGFibGVzIGNhbm5vdCBzdXBwb3J0IHRoaXMgaW9jdGwgYmVjYXVzZSB0aGV5XG4gYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLlxuIENhbGxpbmcgdGhpcyBpb2N0bCB3aGVuIHRoZSBndWVzdCBpcyB1c2luZyBzaGFkb3cgcGFnZSB0YWJsZXMgKGZvclxuIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyBydW5uaW5nIGEgbmVzdGVkIGd1ZXN0IHdpdGggbmVzdGVkIHBhZ2UgdGFibGVzKVxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXG5pbmRleCBmODE2ZjVkNzdmMWE1Li45YzAyMDU5ODNkOWE4IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuQEAgLTQzNyw2ICs0MzcsNTAgQEBcbiAjaWZuZGVmIF9fQVNTRU1CTEVSX19cbiAjaW5jbHVkZSBcdTAwM2Nhc20vdHlwZXMuaFx1MDAzZVxuIFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTggZXNyX2dldF9lYyh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gRVNSX0VMeF9FQyhlc3IpO1xuK31cbitcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX3RyYXBfaXNfaWFidCh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gZXNyX2dldF9lYyhlc3IpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3MxcHR3KHVuc2lnbmVkIGxvbmcgZXNyKVxuK3tcbitcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfUzFQVFc7XG4rfVxuK1xuKy8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfd3JpdGUodW5zaWduZWQgbG9uZyBlc3IpXG4re1xuK1x0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9XTlI7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfZGFidF9pc19jbSh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gZXNyIFx1MDAyNiBFU1JfRUx4X0NNO1xuK31cbitcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19leGVjX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKVxuK3tcbitcdHJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGVzcikgXHUwMDI2XHUwMDI2ICFlc3JfYWJ0X2lzX3MxcHR3KGVzcik7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3NlYSh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRzd2l0Y2ggKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpIHtcbitcdGNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOlxuK1x0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcbitcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbitcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKTpcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBlc3JfYnJrX2NvbW1lbnQodW5zaWduZWQgbG9uZyBlc3IpXG4ge1xuIFx0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9CUks2NF9JU1NfQ09NTUVOVF9NQVNLO1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuaW5kZXggYTNjMTkyOGJkZjc0My4uYTNiMjcyMjY1NTU0MyAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oXG5AQCAtNDExLDE4ICs0MTEsMTMgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfcmQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9hYnRfaXNzMXR3KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRyZXR1cm4gISEoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSBcdTAwMjYgRVNSX0VMeF9TMVBUVyk7XG4rXHRyZXR1cm4gZXNyX2FidF9pc19zMXB0dyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1dOUjtcbi19XG4tXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X0NNKTtcbitcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfYXMoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuQEAgLTQzOCwxNyArNDMzLDEyIEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lsX2lzMzJiaXQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIEVTUl9FTHhfRUMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4rXHRyZXR1cm4gZXNyX2dldF9lYyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfaWFidChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkgXHUwMDI2XHUwMDI2ICFrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpO1xuK1x0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTgga3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuQEAgLTQ2OCwyNiArNDU4LDkgQEAgYm9vbCBrdm1fdmNwdV90cmFwX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdHJldHVybiBlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lXG4tdTY0IGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4te1xuLVx0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuLVxuLVx0QlVHX09OKCFlc3JfZnNjX2lzX3Blcm1pc3Npb25fZmF1bHQoZXNyKSk7XG4tXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoZXNyIFx1MDAyNiBFU1JfRUx4X0ZTQ19MRVZFTCkpO1xuLX1cbi1cbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzc2VhKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRzd2l0Y2ggKGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KHZjcHUpKSB7XG4tXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VBX1RUVygtMSkgLi4uIEVTUl9FTHhfRlNDX1NFQV9UVFcoMyk6XG4tXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0M6XG4tXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0ZGVmYXVsdDpcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuK1x0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00OTYsOSArNDY5LDkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfc3lzX2dldF9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRyZXR1cm4gRVNSX0VMeF9TWVM2NF9JU1NfUlQoZXNyKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4rc3RhdGljIGlubGluZSBib29sIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXG4ge1xuLVx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbitcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0LypcbiBcdFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcbiBcdFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXG5AQCAtNTExLDEzICs0ODQsMTggQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdCAqIGZpcnN0KSwgdGhlbiBhIHBlcm1pc3Npb24gZmF1bHQgdG8gYWxsb3cgdGhlIGZsYWdzXG4gXHRcdCAqIHRvIGJlIHNldC5cbiBcdFx0ICovXG4tXHRcdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSk7XG4rXHRcdHJldHVybiBlc3JfZnNjX2lzX3Blcm1pc3Npb25fZmF1bHQoZXNyKTtcbiBcdH1cbiBcbi1cdGlmIChrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkpXG4rXHRpZiAoZXNyX3RyYXBfaXNfaWFidChlc3IpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4ga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKHZjcHUpO1xuK1x0cmV0dXJuIGVzcl9kYWJ0X2lzX3dyaXRlKGVzcik7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X21waWRyX2FmZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcbkBAIC04NTksNiArODU5LDggQEAgaW50IGt2bV9wZ3RhYmxlX3dhbGsoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLCB1NjQgc2l6ZSxcbiAgKiBAYWRkcjpcdElucHV0IGFkZHJlc3MgZm9yIHRoZSBzdGFydCBvZiB0aGUgd2Fsay5cbiAgKiBAcHRlcDpcdFBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHJpZXZlZCBQVEUuXG4gICogQGxldmVsOlx0UG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgbGV2ZWwgb2YgdGhlIHJldHJpZXZlZCBQVEUuXG4rICogQGZsYWdzOlx0RmxhZ3MgdG8gY29udHJvbCB0aGUgcGFnZS10YWJsZSB3YWxrXG4rICpcdFx0KHNlZSBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4KS5cbiAgKlxuICAqIFRoZSBvZmZzZXQgb2YgQGFkZHIgd2l0aGluIGEgcGFnZSBpcyBpZ25vcmVkLlxuICAqXG5AQCAtODY5LDcgKzg3MSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiAgKi9cbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxuLVx0XHRcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCk7XG4rXHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuK1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xuIFxuIC8qKlxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG5pbmRleCBiZWVhMDBlNjkzYTBhLi40ZDZlNTc2NWU5ZTU2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmhcbkBAIC00NCw5ICs0NCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fcGt2bV9leHRfYWxsb3dlZChzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgZXh0KVxuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9QVFJBVVRIX0dFTkVSSUM6XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9NVEU6XG4tXHRcdHJldHVybiBmYWxzZTtcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fRUFHRVJfU1BMSVRfQ0hVTktfU0laRTpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fU1VQUE9SVEVEX0JMT0NLX1NJWkVTOlxuK1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHJldHVybiBmYWxzZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAha3ZtIHx8ICFrdm1fdm1faXNfcHJvdGVjdGVkKGt2bSk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbmluZGV4IDQ0OTE1NGY5YTQ4NTIuLjcxMjMzMDY4YjdjYjYgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnXG4rKysgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnXG5AQCAtMzcsNiArMzcsNyBAQCBtZW51Y29uZmlnIEtWTVxuIFx0c2VsZWN0IFNDSEVEX0lORk9cbiBcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xuIFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuK1x0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcbiBcdGhlbHBcbiBcdCAgU3VwcG9ydCBob3N0aW5nIHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzLlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2FybS5jIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcbmluZGV4IGNjYWU4MmMxMjQyYmMuLjU4YWM3MGYzMWQ4NGUgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9hcm0uY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcbkBAIC0zOTMsNiArMzkzLDcgQEAgaW50IGt2bV92bV9pb2N0bF9jaGVja19leHRlbnNpb24oc3RydWN0IGt2bSAqa3ZtLCBsb25nIGV4dClcbiBcdGNhc2UgS1ZNX0NBUF9DT1VOVEVSX09GRlNFVDpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fV1JJVEFCTEVfSU1QX0lEX1JFR1M6XG4gXHRjYXNlIEtWTV9DQVBfQVJNX1NFQV9UT19VU0VSOlxuK1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHIgPSAxO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcyOlxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXG5pbmRleCAzOWFhODkxMWY2MmMxLi4yM2E1NzMxMmI5ODFiIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuQEAgLTUzMiw3ICs1MzIsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2FkanVzdF9yYW5nZSh1NjQgYWRkciwgc3RydWN0IGt2bV9tZW1fcmFuZ2UgKnJhbmdlKVxuIFx0aW50IHJldDtcbiBcbiBcdGh5cF9hc3NlcnRfbG9ja19oZWxkKFx1MDAyNmhvc3RfbW11LmxvY2spO1xuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCwgMCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuQEAgLTkxMCw3ICs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxuIFx0czggbGV2ZWw7XG4gXHRpbnQgcmV0O1xuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwsIDApO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdGlmIChndWVzdF9wdGVfaXNfcG9pc29uZWQocHRlKSlcbkBAIC05NTksNyArOTU5LDcgQEAgaW50IF9fcGt2bV92Y3B1X2luX3BvaXNvbl9mYXVsdChzdHJ1Y3QgcGt2bV9oeXBfdmNwdSAqaHlwX3ZjcHUpXG4gXHRpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKFx1MDAyNmh5cF92Y3B1LVx1MDAzZXZjcHUpKTtcbiBcbiBcdGd1ZXN0X2xvY2tfY29tcG9uZW50KHZtKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gdW5sb2NrO1xuIFxuQEAgLTEzMTUsNyArMTMxNSw3IEBAIHN0YXRpYyBpbnQgaG9zdF9zdGFnZTJfZ2V0X2d1ZXN0X2luZm8ocGh5c19hZGRyX3QgcGh5cywgc3RydWN0IHBrdm1faHlwX3ZtICoqdm0sXG4gXHRcdHJldHVybiAtRVBFUk07XG4gXHR9XG4gXG4tXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBwaHlzLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtMTU0NCw3ICsxNTQ0LDcgQEAgc3RhdGljIGludCBfX2NoZWNrX2hvc3Rfc2hhcmVkX2d1ZXN0KHN0cnVjdCBwa3ZtX2h5cF92bSAqdm0sIHU2NCAqX19waHlzLCB1NjQgaXBcbiBcdHM4IGxldmVsO1xuIFx0aW50IHJldDtcbiBcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXHRpZiAoIWt2bV9wdGVfdmFsaWQocHRlKSlcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xuaW5kZXggYjc0ZGQ1Y2UxZWZkMy4uMzQ3ZWVjMzk1N2Q2YSAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbkBAIC0yOTgsMTIgKzI5OCwxMyBAQCBzdGF0aWMgaW50IGxlYWZfd2Fsa2VyKGNvbnN0IHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHggKmN0eCxcbiB9XG4gXG4gaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkcixcbi1cdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpXG4rXHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuK1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IGxlYWZfd2Fsa19kYXRhIGRhdGE7XG4gXHRzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHtcbiBcdFx0LmNiXHQ9IGxlYWZfd2Fsa2VyLFxuLVx0XHQuZmxhZ3NcdD0gS1ZNX1BHVEFCTEVfV0FMS19MRUFGLFxuK1x0XHQuZmxhZ3NcdD0gZmxhZ3MgfCBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXG4gXHRcdC5hcmdcdD0gXHUwMDI2ZGF0YSxcbiBcdH07XG4gXHRpbnQgcmV0O1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9hcm02NC9rdm0vbW11LmNcbmluZGV4IDc0ZTdlN2Y3NTY0YzguLjE3ZjFmNmQzNmYyYjggMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vbW11LmNcbkBAIC01LDYgKzUsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2FjcGkuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NsZWFudXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pby5oXHUwMDNlXG5AQCAtODY2LDcgKzg2Nyw3IEBAIHN0YXRpYyBpbnQgZ2V0X3VzZXJfbWFwcGluZ19zaXplKHN0cnVjdCBrdm0gKmt2bSwgdTY0IGFkZHIpXG4gXHQgKiBJUEktaW5nIHRocmVhZHMpLlxuIFx0ICovXG4gXHRsb2NhbF9pcnFfc2F2ZShmbGFncyk7XG4tXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZwZ3QsIGFkZHIsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2cGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcbiBcbiBcdGlmIChyZXQpXG5AQCAtMTU1NCw5ICsxNTU1LDkgQEAgc3RhdGljIHZvaWQgKmdldF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHRyZXR1cm4gXHUwMDI2dmNwdS1cdTAwM2VhcmNoLnBrdm1fbWVtY2FjaGU7XG4gfVxuIFxuLXN0YXRpYyBpbnQgdG9wdXBfbW11X21lbWNhY2hlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdm9pZCAqbWVtY2FjaGUpXG4rc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdm9pZCAqbWVtY2FjaGUpXG4ge1xuLVx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKHZjcHUtXHUwMDNlYXJjaC5od19tbXUpO1xuK1x0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XG4gXG4gXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuIFx0XHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XG5AQCAtMTYwMywxNSArMTYwNCw0NyBAQCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2Mge1xuIFx0c3RydWN0IGt2bV9zMl90cmFuc1x0Km5lc3RlZDtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3RcdCptZW1zbG90O1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRodmE7XG4rXHR1bnNpZ25lZCBsb25nXHRcdGVzcjtcbitcdHN0cnVjdCBrdm1fczJfbW11XHQqbW11O1xuIH07XG4gXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbitzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCB7XG4rXHR1bnNpZ25lZCBsb25nIG1hcHBpbmdfc2l6ZTtcbit9O1xuK1xuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbit7XG4rXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNlZXNyKTtcbit9XG4rXG4rc3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuK31cbitcbitzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfd3JpdGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHMyZmQtXHUwMDNlZXNyKTtcbit9XG4rXG4rc3RhdGljIHU2NCBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbit7XG4rXHR1NjQgbGV2ZWw7XG4rXG4rXHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGxldmVsID0gczJmZC1cdTAwM2Vlc3IgXHUwMDI2IEVTUl9FTHhfRlNDX0xFVkVMO1xuK1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4rXHRcdCAgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXG4ge1xuIFx0Ym9vbCB3cml0ZV9mYXVsdCwgZXhlY19mYXVsdDtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuK1x0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcbiBcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90ID0gS1ZNX1BHVEFCTEVfUFJPVF9SO1xuLVx0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZXZjcHUtXHUwMDNlYXJjaC5od19tbXUtXHUwMDNlcGd0O1xuK1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHR1bnNpZ25lZCBsb25nIG1tdV9zZXE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG5AQCAtMTYyMiw3ICsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcbiBcdGlmICghcGVybV9mYXVsdCkge1xuIFx0XHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSwgbWVtY2FjaGUpO1xuK1x0XHRyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2VtbXUsIG1lbWNhY2hlKTtcbiBcdFx0aWYgKHJldClcbiBcdFx0XHRyZXR1cm4gcmV0O1xuIFx0fVxuQEAgLTE2MzIsOCArMTY2NSw4IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRlbHNlXG4gXHRcdGdmbiA9IHMyZmQtXHUwMDNlZmF1bHRfaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuLVx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbitcdHdyaXRlX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpO1xuK1x0ZXhlY19mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpO1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFKHdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNiBleGVjX2ZhdWx0KTtcbiBcbkBAIC0xNjg3LDcgKzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGlmICgocHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcdTAwMjZcdTAwMjYgIXJldClcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdmbik7XG4gXG4tXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xuK1x0aWYgKHJldCA9PSAtRUFHQUlOKVxuK1x0XHRyZXR1cm4gcmVzdWx0ID8gcmV0IDogMDtcbitcbitcdGlmIChyZXN1bHQgXHUwMDI2XHUwMDI2ICFyZXQpXG4rXHRcdHJlc3VsdC1cdTAwM2VtYXBwaW5nX3NpemUgPSBQQUdFX1NJWkU7XG4rXG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHtcbkBAIC0xNzA5LDcgKzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBzMmZkLVx1MDAzZXZjcHU7XG4tXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHZjcHUtXHUwMDNlYXJjaC5od19tbXUtXHUwMDNlcGd0O1xuK1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiBcdHZvaWQgKmh5cF9tZW1jYWNoZTtcbkBAIC0xNzE3LDcgKzE3NTYsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGludCByZXQ7XG4gXG4gXHRoeXBfbWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHZjcHUpO1xuLVx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHZjcHUsIGh5cF9tZW1jYWNoZSk7XG4rXHRyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2VtbXUsIGh5cF9tZW1jYWNoZSk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcbkBAIC0xODQwLDExICsxODc5LDYgQEAgc3RhdGljIHNob3J0IGt2bV9zMl9yZXNvbHZlX3ZtYV9zaXplKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdHJldHVybiB2bWFfc2hpZnQ7XG4gfVxuIFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbi17XG4tXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSk7XG4tfVxuLVxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXG4ge1xuQEAgLTE5MTAsMTMgKzE5NDQsMTEgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfcGluX3Bmbihjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRzMnZpLVx1MDAzZXBmbiA9IF9fa3ZtX2ZhdWx0aW5fcGZuKHMyZmQtXHUwMDNlbWVtc2xvdCwgZ2V0X2Nhbm9uaWNhbF9nZm4oczJmZCwgczJ2aSksXG4tXHRcdFx0XHQgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSA/IEZPTExfV1JJVEUgOiAwLFxuK1x0XHRcdFx0ICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsXG4gXHRcdFx0XHQgICAgICBcdTAwMjZzMnZpLVx1MDAzZW1hcF93cml0YWJsZSwgXHUwMDI2czJ2aS1cdTAwM2VwYWdlKTtcbiBcdGlmICh1bmxpa2VseShpc19lcnJvcl9ub3Nsb3RfcGZuKHMydmktXHUwMDNlcGZuKSkpIHtcbi1cdFx0aWYgKHMydmktXHUwMDNlcGZuID09IEtWTV9QRk5fRVJSX0hXUE9JU09OKSB7XG4tXHRcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLVx1MDAzZXZtYV9wYWdlc2l6ZSkpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4rXHRcdGlmIChzMnZpLVx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcbitcdFx0XHRyZXR1cm4gLUVIV1BPSVNPTjtcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHR9XG4gXG5AQCAtMTk2OCw3ICsyMDAwLDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiB7XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLVx1MDAzZXZjcHUtXHUwMDNla3ZtO1xuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVx1MDAzZXZjcHUpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuK1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuIFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHQvKlxuQEAgLTE5NzcsNyArMjAwOSw3IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHQgKiBhbmQgdHJpZ2dlciB0aGUgZXhjZXB0aW9uIGhlcmUuIFNpbmNlIHRoZSBtZW1zbG90IGlzIHZhbGlkLCBpbmplY3RcbiBcdCAqIHRoZSBmYXVsdCBiYWNrIHRvIHRoZSBndWVzdC5cbiBcdCAqL1xuLVx0aWYgKGVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoa3ZtX3ZjcHVfZ2V0X2VzcihzMmZkLVx1MDAzZXZjcHUpKSkge1xuK1x0aWYgKGVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpKSB7XG4gXHRcdGt2bV9pbmplY3RfZGFidF9leGNsX2F0b21pYyhzMmZkLVx1MDAzZXZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtXHUwMDNldmNwdSkpO1xuIFx0XHRyZXR1cm4gMTtcbiBcdH1cbkBAIC0xOTg2LDEzICsyMDE4LDEzIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfd3JpdGFibGUgXHUwMDI2XHUwMDI2IChzMnZpLVx1MDAzZWRldmljZSB8fFxuIFx0XHRcdFx0ICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4tXHRcdFx0XHQgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSkpXG4rXHRcdFx0XHQgICBrdm1fczJfZmF1bHRfaXNfd3JpdGUoczJmZCkpKVxuIFx0XHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1c7XG4gXG4gXHRpZiAoczJmZC1cdTAwM2VuZXN0ZWQpXG4gXHRcdCpwcm90ID0gYWRqdXN0X25lc3RlZF9mYXVsdF9wZXJtcyhzMmZkLVx1MDAzZW5lc3RlZCwgKnByb3QpO1xuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVx1MDAzZXZjcHUpKVxuK1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpKVxuIFx0XHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1g7XG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfbm9uX2NhY2hlYWJsZSlcbkBAIC0yMDE2LDcgKzIwNDgsOCBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksXG4gXHRcdFx0ICAgIGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90LFxuLVx0XHRcdCAgICB2b2lkICptZW1jYWNoZSlcbitcdFx0XHQgICAgdm9pZCAqbWVtY2FjaGUsXG4rXHRcdFx0ICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXG4ge1xuIFx0ZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7XG4gXHRib29sIHdyaXRhYmxlID0gcHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XO1xuQEAgLTIwMjksMTMgKzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdGludCByZXQ7XG4gXG4gXHRrdm1fZmF1bHRfbG9jayhrdm0pO1xuLVx0cGd0ID0gczJmZC1cdTAwM2V2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXBndDtcbitcdHBndCA9IHMyZmQtXHUwMDNlbW11LVx1MDAzZXBndDtcbiBcdHJldCA9IC1FQUdBSU47XG4gXHRpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLVx1MDAzZW1tdV9zZXEpKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4tXHRwZXJtX2ZhdWx0X2dyYW51bGUgPSAoa3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCkgP1xuLVx0XHRcdCAgICAgIGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShzMmZkLVx1MDAzZXZjcHUpIDogMCk7XG4rXHRwZXJtX2ZhdWx0X2dyYW51bGUgPSBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQpO1xuIFx0bWFwcGluZ19zaXplID0gczJ2aS1cdTAwM2V2bWFfcGFnZXNpemU7XG4gXHRwZm4gPSBzMnZpLVx1MDAzZXBmbjtcbiBcdGdmbiA9IHMydmktXHUwMDNlZ2ZuO1xuQEAgLTIwOTYsMTQgKzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdwYV90b19nZm4oaXBhKSk7XG4gXHR9XG4gXG4tXHRpZiAocmV0ICE9IC1FQUdBSU4pXG4tXHRcdHJldHVybiByZXQ7XG4tXHRyZXR1cm4gMDtcbitcdGlmIChyZXQgPT0gLUVBR0FJTilcbitcdFx0cmV0dXJuIHJlc3VsdCA/IHJldCA6IDA7XG4rXG4rXHRpZiAocmVzdWx0IFx1MDAyNlx1MDAyNiAhcmV0KVxuK1x0XHRyZXN1bHQtXHUwMDNlbWFwcGluZ19zaXplID0gbWFwcGluZ19zaXplO1xuK1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4rc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4rXHRcdFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuK1x0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XG4gXHRzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHMydmkgPSB7fTtcbiBcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90O1xuIFx0dm9pZCAqbWVtY2FjaGU7XG5AQCAtMjEyMSw3ICsyMTU4LDcgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2V2Y3B1KTtcbiBcdGlmICghcGVybV9mYXVsdCB8fCBtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cdTAwM2VtZW1zbG90KSB8fFxuIFx0ICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7XG4tXHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUsIG1lbWNhY2hlKTtcbitcdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNlbW11LCBtZW1jYWNoZSk7XG4gXHRcdGlmIChyZXQpXG4gXHRcdFx0cmV0dXJuIHJldDtcbiBcdH1cbkBAIC0yMTMxLDYgKzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHQgKiBnZXQgYmxvY2sgbWFwcGluZyBmb3IgZGV2aWNlIE1NSU8gcmVnaW9uLlxuIFx0ICovXG4gXHRyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCBcdTAwMjZzMnZpKTtcbitcdGlmIChyZXQgPT0gLUVIV1BPSVNPTikge1xuK1x0XHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cbitcdFx0aWYgKHJlc3VsdClcbitcdFx0XHRyZXR1cm4gLUVIV1BPSVNPTjtcbitcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLnZtYV9wYWdlc2l6ZSkpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbiBcdGlmIChyZXQgIT0gMSlcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0yMTQwLDcgKzIxODQsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdH1cbiBcbi1cdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlKTtcbitcdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlLCByZXN1bHQpO1xuIH1cbiBcbiAvKiBSZXNvbHZlIHRoZSBhY2Nlc3MgZmF1bHQgYnkgbWFraW5nIHRoZSBwYWdlIHlvdW5nIGFnYWluLiAqL1xuQEAgLTIyNTAsNyArMjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fczJfdHJhbnMgbmVzdGVkX3RyYW5zLCAqbmVzdGVkID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgZXNyO1xuK1x0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuK1x0c3RydWN0IGt2bV9zMl9tbXUgKm1tdSA9IHZjcHUtXHUwMDNlYXJjaC5od19tbXU7XG4gXHRwaHlzX2FkZHJfdCBmYXVsdF9pcGE7IC8qIFRoZSBhZGRyZXNzIHdlIGZhdWx0ZWQgb24gKi9cbiBcdHBoeXNfYWRkcl90IGlwYTsgLyogQWx3YXlzIHRoZSBJUEEgaW4gdGhlIEwxIGd1ZXN0IHBoeXMgc3BhY2UgKi9cbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7XG5AQCAtMjI1OSwxMSArMjMwNCw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdGdmbl90IGdmbjtcbiBcdGludCByZXQsIGlkeDtcbiBcbi1cdGlmIChrdm1fdmNwdV9hYnRfaXNzZWEodmNwdSkpXG4rXHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcbiBcdFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xuIFxuLVx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcbi1cbiBcdC8qXG4gXHQgKiBUaGUgZmF1bHQgSVBBIHNob3VsZCBiZSByZWxpYWJsZSBhdCB0aGlzIHBvaW50IGFzIHdlJ3JlIG5vdCBkZWFsaW5nXG4gXHQgKiB3aXRoIGFuIFNFQS5cbkBAIC0yMjcyLDcgKzIzMTUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRpZiAoS1ZNX0JVR19PTihpcGEgPT0gSU5WQUxJRF9HUEEsIHZjcHUtXHUwMDNla3ZtKSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4tXHRpc19pYWJ0ID0ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpO1xuK1x0aXNfaWFidCA9IGVzcl90cmFwX2lzX2lhYnQoZXNyKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGVzcikpIHtcbiBcdFx0LyogQmV5b25kIHNhbml0aXNlZCBQQVJhbmdlICh3aGljaCBpcyB0aGUgSVBBIGxpbWl0KSAqL1xuQEAgLTIyODIsMTQgKzIzMjUsMTQgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHR9XG4gXG4gXHRcdC8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovXG4tXHRcdGlmIChmYXVsdF9pcGEgXHUwMDNlPSBCSVRfVUxMKFZUQ1JfRUwyX0lQQSh2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXZ0Y3IpKSkge1xuK1x0XHRpZiAoZmF1bHRfaXBhIFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEobW11LVx1MDAzZXZ0Y3IpKSkge1xuIFx0XHRcdGZhdWx0X2lwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xuIFxuIFx0XHRcdHJldHVybiBrdm1faW5qZWN0X3NlYSh2Y3B1LCBpc19pYWJ0LCBmYXVsdF9pcGEpO1xuIFx0XHR9XG4gXHR9XG4gXG4tXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGt2bV92Y3B1X2dldF9lc3IodmNwdSksXG4rXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcbiBcdFx0XHQgICAgICBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwgZmF1bHRfaXBhKTtcbiBcbiBcdC8qIENoZWNrIHRoZSBzdGFnZS0yIGZhdWx0IGlzIHRyYW5zLiBmYXVsdCBvciB3cml0ZSBmYXVsdCAqL1xuQEAgLTIyOTgsOSArMjM0MSw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAgICAhZXNyX2ZzY19pc19hY2Nlc3NfZmxhZ19mYXVsdChlc3IpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGVzcikpIHtcbiBcdFx0a3ZtX2VycihcIlVuc3VwcG9ydGVkIEZTQzogRUM9JSN4IHhGU0M9JSNseCBFU1JfRUwyPSUjbHhcXG5cIixcbi1cdFx0XHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbitcdFx0XHRlc3JfZ2V0X2VjKGVzciksXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKWVzcik7XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTIzMTksOCArMjM2Miw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAqIG5vdGhpbmcgdG8gd2FsayBhbmQgd2UgdHJlYXQgaXQgYXMgYSAxOjEgYmVmb3JlIGdvaW5nIHRocm91Z2ggdGhlXG4gXHQgKiBjYW5vbmljYWwgdHJhbnNsYXRpb24uXG4gXHQgKi9cbi1cdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVx1MDAzZWt2bSx2Y3B1LVx1MDAzZWFyY2guaHdfbW11KSBcdTAwMjZcdTAwMjZcbi1cdCAgICB2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZW5lc3RlZF9zdGFnZTJfZW5hYmxlZCkge1xuK1x0aWYgKGt2bV9pc19uZXN0ZWRfczJfbW11KHZjcHUtXHUwMDNla3ZtLCBtbXUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiBcdFx0dTMyIGVzcjtcbiBcbiBcdFx0cmV0ID0ga3ZtX3dhbGtfbmVzdGVkX3MyKHZjcHUsIGZhdWx0X2lwYSwgXHUwMDI2bmVzdGVkX3RyYW5zKTtcbkBAIC0yMzQ5LDcgKzIzOTIsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRnZm4gPSBpcGEgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRtZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3QodmNwdS1cdTAwM2Vrdm0sIGdmbik7XG4gXHRodmEgPSBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChtZW1zbG90LCBnZm4sIFx1MDAyNndyaXRhYmxlKTtcbi1cdHdyaXRlX2ZhdWx0ID0ga3ZtX2lzX3dyaXRlX2ZhdWx0KHZjcHUpO1xuK1x0d3JpdGVfZmF1bHQgPSBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGVzcik7XG4gXHRpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIHx8ICh3cml0ZV9mYXVsdCBcdTAwMjZcdTAwMjYgIXdyaXRhYmxlKSkge1xuIFx0XHQvKlxuIFx0XHQgKiBUaGUgZ3Vlc3QgaGFzIHB1dCBlaXRoZXIgaXRzIGluc3RydWN0aW9ucyBvciBpdHMgcGFnZS10YWJsZXNcbkBAIC0yMzYyLDcgKzI0MDUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbitcdFx0aWYgKGVzcl9hYnRfaXNfczFwdHcoZXNyKSkge1xuIFx0XHRcdHJldCA9IGt2bV9pbmplY3Rfc2VhX2RhYnQodmNwdSwga3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdFx0fVxuQEAgLTIzNzcsNyArMjQyMCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0ICogU28gbGV0J3MgYXNzdW1lIHRoYXQgdGhlIGd1ZXN0IGlzIGp1c3QgYmVpbmdcbiBcdFx0ICogY2F1dGlvdXMsIGFuZCBza2lwIHRoZSBpbnN0cnVjdGlvbi5cbiBcdFx0ICovXG4tXHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcbitcdFx0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSBcdTAwMjZcdTAwMjYgZXNyX2RhYnRfaXNfY20oZXNyKSkge1xuIFx0XHRcdGt2bV9pbmNyX3BjKHZjcHUpO1xuIFx0XHRcdHJldCA9IDE7XG4gXHRcdFx0Z290byBvdXRfdW5sb2NrO1xuQEAgLTIzOTUsNyArMjQzOCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdH1cbiBcbiBcdC8qIFVzZXJzcGFjZSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVnaXN0ZXIgb3V0LW9mLWJvdW5kcyBJUEFzICovXG4tXHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZSh2Y3B1LVx1MDAzZWFyY2guaHdfbW11KSk7XG4rXHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcbiBcdFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xuQEAgLTI0MDksMTkgKzI0NTIsMjAgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQubmVzdGVkXHRcdD0gbmVzdGVkLFxuIFx0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuIFx0XHQuaHZhXHRcdD0gaHZhLFxuK1x0XHQuZXNyXHRcdD0gZXNyLFxuK1x0XHQubW11XHRcdD0gbW11LFxuIFx0fTtcbiBcbiBcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXHUwMDNla3ZtKSkge1xuIFx0XHRyZXQgPSBwa3ZtX21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbiBcdH0gZWxzZSB7XG4tXHRcdFZNX1dBUk5fT05fT05DRShrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcbitcdFx0Vk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKFx1MDAyNnMyZmQpIFx1MDAyNlx1MDAyNiAhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQha3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoXHUwMDI2czJmZCkpO1xuIFxuIFx0XHRpZiAoa3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCkpXG4tXHRcdFx0cmV0ID0gZ21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbitcdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0XHRlbHNlXG4tXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCk7XG4rXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCwgTlVMTCk7XG4gXHR9XG4gXG4gXHRpZiAocmV0ID09IDApXG5AQCAtMjc5MiwzICsyODM2LDE0MyBAQCB2b2lkIGt2bV90b2dnbGVfY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIHdhc19lbmFibGVkKVxuIFxuIFx0dHJhY2Vfa3ZtX3RvZ2dsZV9jYWNoZSgqdmNwdV9wYyh2Y3B1KSwgd2FzX2VuYWJsZWQsIG5vd19lbmFibGVkKTtcbiB9XG4rXG4rLypcbisgKiBUcnkgdG8gd2FsayB0byB0aGUgc3BlY2lmaWVkIEdQQSBpbiBjYW5vbmljYWwgbW11IC0gaWYgdW5tYXBwZWQgcmV0dXJucyAwLCBpZlxuKyAqIG1hcHBlZCByZXR1cm5zIHRoZSBncmFudWxlIHNpemUsIG90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBsb25nIGt2bV93YWxrX3MyKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LFxuK1x0XHRcdGdwYV90IGdwYSwgczggKmxldmVsKVxuK3tcbitcdHN0cnVjdCBrdm0gKmt2bSA9IGt2bV9zMl9tbXVfdG9fa3ZtKHBndC1cdTAwM2VtbXUpO1xuK1x0a3ZtX3B0ZV90IHB0ZTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0Z3VhcmQocmVhZF9sb2NrKShcdTAwMjZrdm0tXHUwMDNlbW11X2xvY2spO1xuK1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYocGd0LCBncGEsIFx1MDAyNnB0ZSwgbGV2ZWwsXG4rXHRcdFx0XHQgICBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXG4rXHRpZiAoIWt2bV9wdGVfdmFsaWQocHRlKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4ga3ZtX2dyYW51bGVfc2l6ZSgqbGV2ZWwpO1xuK31cbitcbisvKiBTeW50aGVzaXNlZCBkYXRhIGFib3J0IGF0IHNwZWNpZmllZCBwYWdlIHRhYmxlIGxldmVsLiAqL1xuKyNkZWZpbmUgUFJFX0ZBVUxUX0VTUihsZXZlbClcdFx0XHRcdFxcXG4rXHQgKChFU1JfRUx4X0VDX0RBQlRfTE9XIFx1MDAzY1x1MDAzYyBFU1JfRUx4X0VDX1NISUZUKSB8XHRcXFxuK1x0ICBFU1JfRUx4X0lMIHwgRVNSX0VMeF9GU0NfRkFVTFRfTChsZXZlbCkpXG4rXG4rLyogUmV0cmlldmUgZWl0aGVyIGEgcmVhZC1vbmx5IG9yIGEgcmVhZC93cml0ZSBodmEuICovXG4rc3RhdGljIGh2YV90IGdmbl90b19odmFfbWVtc2xvdF9yZWFkKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIGdmbl90IGdmbilcbit7XG4rXHRyZXR1cm4gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3Qoc2xvdCwgZ2ZuLCAvKndyaXRhYmxlPSovTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBsb25nIF9fcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcbitcdFx0XHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxuK3tcbitcdGNvbnN0IGJvb2wgaXNfZ21lbSA9IGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpO1xuK1x0Y29uc3QgZ2ZuX3QgZ2ZuID0gZ3BhX3RvX2dmbihncGEpO1xuK1x0Y29uc3QgaHZhX3QgaHZhID0gaXNfZ21lbSA/IDAgOiBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChtZW1zbG90LCBnZm4pO1xuK1x0Y29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHMyZmQgPSB7XG4rXHRcdC52Y3B1XHRcdD0gdmNwdSxcbitcdFx0LmZhdWx0X2lwYVx0PSBncGEsXG4rXHRcdC5uZXN0ZWRcdFx0PSBOVUxMLFxuK1x0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuK1x0XHQuaHZhXHRcdD0gaHZhLFxuK1x0XHQuZXNyXHRcdD0gUFJFX0ZBVUxUX0VTUihsZXZlbCksXG4rXHRcdC5tbXVcdFx0PSBtbXUsXG4rXHR9O1xuK1x0c3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgcmVzdWx0ID0ge307XG4rXHRsb25nIHJldDtcbitcbitcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0aWYgKGlzX2dtZW0pXG4rXHRcdHJldCA9IGdtZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbitcdGVsc2VcbitcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbitcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcbitcdFx0cmV0dXJuIHJldDtcbitcdHJldHVybiByZXN1bHQubWFwcGluZ19zaXplO1xuK31cbitcbitzdGF0aWMgbG9uZyBwcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuK1x0XHRcdCBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpXG4re1xuK1x0czggbGV2ZWw7XG4rXHRsb25nIHJldDtcbitcbitcdC8qIFRyeSBhIHdhbGsgZmlyc3QuICovXG4rXHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXHUwMDNlcGd0LCBncGEsIFx1MDAyNmxldmVsKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xuK1x0cmV0dXJuIF9fcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90LCBsZXZlbCk7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nXG4rcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVtYWluaW5nKVxuK3tcbitcdC8qIEdyYW51bGVzIGFyZSBhbHdheXMgYSBwb3dlci1vZi0yLiAqL1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XG4rXHRcdGdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpO1xuK1xuK1x0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcbit9XG4rXG4rLyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXG4rI2RlZmluZSBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMgM1xuK1xuKy8qKlxuKyAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSAtIHByZS1mYXVsdCBzdGFnZS0yIHBhZ2UgdGFibGVzIGZvciB0aGVcbisgKiBzcGVjaWZpZWQgR1BBLlxuKyAqIEB2Y3B1Olx0VGhlIFZDUFUgcG9pbnRlclxuKyAqIEByYW5nZTpcdHtncGEsIHNpemUsIGZsYWdzfSB0dXBsZVxuKyAqXG4rICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5XG4rICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuXG4rICpcbisgKiBAcmFuZ2UtXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVx1MDAzZXNpemUgc3BlY2lmaWVzIGhvdyBtYW55XG4rICogYnl0ZXMgcmVtYWluIHRvIGJlIHByZS1mYXVsdGVkIGFuZCBAcmFuZ2UtXHUwMDNlZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC5cbisgKlxuKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuXG4rICovXG4rbG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG4re1xuK1x0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cdTAwM2Vrdm07XG4rXHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXHUwMDNlc2l6ZTtcbitcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSBcdTAwMjZrdm0tXHUwMDNlYXJjaC5tbXU7IC8qIENhbm9uaWNhbC4gKi9cbitcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7XG4rXHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cdTAwM2VncGE7XG4rXHRpbnQgbnVtX3JldHJpZXMgPSAwO1xuK1x0bG9uZyByZXQ7XG4rXG4rXHQvKlxuK1x0ICogcEtWTSBpcyB1bnN1cHBvcnRlZCBhcyB0aGVpciB2Q1BVcyBhcmUgaW5zdGFudGlhdGVkIG9uIGZpcnN0IHJ1biBhbmRcbitcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXG4rXHQgKi9cbitcdGlmIChpc19wcm90ZWN0ZWRfa3ZtX2VuYWJsZWQoKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ3BhX3RvX2dmbihncGEpKTtcbitcdGlmICghbWVtc2xvdClcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHQvKiBTUkNVIG11c3QgYmUgcmVsZWFzZWQgZm9yIHByb2dyZXNzIGFuZCBvbmx5IHVzZXJsYW5kIGNhbiBkbyB0aGF0LiAqL1xuK1x0aWYgKG1lbXNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXG4rXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0ZG8ge1xuK1x0XHRyZXQgPSBwcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QpO1xuK1x0fSB3aGlsZSAocmV0ID09IC1FQUdBSU4gXHUwMDI2XHUwMDI2IG51bV9yZXRyaWVzKysgXHUwMDNjIE1BWF9QUkVfRkFVTFRfUkVUUklFUyk7XG4rXG4rXHRpZiAoSVNfRVJSX1ZBTFVFKHJldCkpXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYSwgcmV0LCBieXRlc19yZW1haW5pbmcpO1xuK31cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5pbmRleCAxNzEyM2YwYjZkYWJhLi4zNDg4ZDVhZDIyNWI2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmNcbisrKyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5AQCAtNjU0LDcgKzY1NCw3IEBAIHN0YXRpYyB1OCBnZXRfZ3Vlc3RfbWFwcGluZ190dGwoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdTY0IGFkZHIpXG4gXHRcdHJldHVybiAwO1xuIFxuIFx0dG1wIFx1MDAyNj0gfihzeiAtIDEpO1xuLVx0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cdTAwM2VwZ3QsIHRtcCwgXHUwMDI2cHRlLCBOVUxMKSlcbitcdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXHUwMDNlcGd0LCB0bXAsIFx1MDAyNnB0ZSwgTlVMTCwgMCkpXG4gXHRcdGdvdG8gYWdhaW47XG4gXHRpZiAoIShwdGUgXHUwMDI2IFBURV9WQUxJRCkpXG4gXHRcdGdvdG8gYWdhaW47XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbmluZGV4IDVmOGQxN2VlNWY2NzcuLjFlMGVkZDBmOTlmNzUgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG5AQCAtMTczLDYgKzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2RlYnVnLWV4Y2VwdGlvbnNcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9oZWxsb19lbDJcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9ob3N0X3N2ZVxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2h5cGVyY2FsbHNcbitURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9leHRlcm5hbF9hYm9ydHNcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9tbWlvX3NpZ25fZXh0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvcGFnZV9mYXVsdF90ZXN0XG5AQCAtMTk5LDYgKzIwMCw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGd1ZXN0X21lbWZkX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSByc2VxX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBzdGVhbF90aW1lXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcHJlX2ZhdWx0X21lbW9yeV90ZXN0XG4gXG4gVEVTVF9HRU5fUFJPR1NfczM5MCA9ICQoVEVTVF9HRU5fUFJPR1NfQ09NTU9OKVxuIFRFU1RfR0VOX1BST0dTX3MzOTAgKz0gczM5MC9tZW1vcFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjA5YzFkYjMwMzg1NjZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTAsMCArMSwxNTggQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLypcbisgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxuKyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkLlxuKyAqXG4rICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxuKyAqIHJlYWwgRUwxIHJlZ2lzdGVycyB0aGVuIEVSRVRzIHRvIHZFTDEgYW5kIGV4aXRzIHRvIHVzZXJzcGFjZSBzbyBpdHMgdkNQVVxuKyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkIGJhY2tlZCBieSBhIHNoYWRvdyBzdGFnZSAyIE1NVS5cbisgKlxuKyAqIEFzc2VydCB0aGF0IHByZS1mYXVsdGluZyBpZ25vcmVzIHRoYXQgYW5kIHRhcmdldHMgdGhlIGNhbm9uaWNhbCBzdGFnZS0yXG4rICogcGFnZSB0YWJsZXMgb25seS5cbisgKi9cbisjaW5jbHVkZSBcImt2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwicHJvY2Vzc29yLmhcIlxuKyNpbmNsdWRlIFwidGVzdF91dGlsLmhcIlxuKyNpbmNsdWRlIFwidWNhbGwuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3N5c3JlZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuK1xuKyNkZWZpbmUgVEVTVF9NRU1fU0xPVFx0XHQxMFxuKyNkZWZpbmUgVEVTVF9NRU1fU0laRVx0XHRTWl8yTVxuKyNkZWZpbmUgVEVTVF9NRU1fR1BBXHRcdFNaXzFHXG4rXG4rc3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcbit7XG4rXHR1NjQgb2Zmc2V0O1xuK1xuK1x0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDEpO1xuK1xuK1x0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXG4rXHRHVUVTVF9TWU5DKDEpO1xuK1xuK1x0LypcbitcdCAqIFRvdWNoIHRoZSBwcmVmYXVsdGVkIHJhbmdlLiB2c3RhZ2UtMiBpcyBkaXNhYmxlZCwgc28gdGhlIHNoYWRvd1xuK1x0ICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLlxuK1x0ICovXG4rXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCBcdTAwM2MgVEVTVF9NRU1fU0laRTsgb2Zmc2V0ICs9IFNaXzRLKVxuK1x0XHRSRUFEX09OQ0UoKih1NjQgKikoVEVTVF9NRU1fR1BBICsgb2Zmc2V0KSk7XG4rXG4rXHRHVUVTVF9ET05FKCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGd1ZXN0X2NvZGUodm9pZClcbit7XG4rXHR1NjQgc3A7XG4rXG4rXHRHVUVTVF9BU1NFUlRfRVEoZ2V0X2N1cnJlbnRfZWwoKSwgMik7XG4rXG4rXHQvKlxuK1x0ICogTWlycm9yIHRoZSBFTDIgdHJhbnNsYXRpb24gcmVnaW1lIGludG8gdGhlIHJlYWwgRUwxIHJlZ2lzdGVycyBzb1xuK1x0ICogdGhhdCB2RUwxIHJ1bnMgb24gdGhlIHRlc3QncyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcbitcdCAqIF9FTDEgYWNjZXNzb3JzIHJlYWQgdGhlIEVMMiByZWdpc3RlcnMsIGFuZCB0aGUgX0VMMTIgYWNjZXNzb3JzXG4rXHQgKiB3cml0ZSB0aGUgcmVhbCBFTDEgcmVnaXN0ZXJzLlxuK1x0ICovXG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhzY3Rscl9lbDEpLCBTWVNfU0NUTFJfRUwxMik7XG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyh0Y3JfZWwxKSwgU1lTX1RDUl9FTDEyKTtcbitcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcbitcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKG1haXJfZWwxKSwgU1lTX01BSVJfRUwxMik7XG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhjcGFjcl9lbDEpLCBTWVNfQ1BBQ1JfRUwxMik7XG4rXG4rXHQvKiBSdW4gdkVMMSBvbiB0aGUgc2FtZSBzdGFjay4gKi9cbitcdGFzbSB2b2xhdGlsZShcIm1vdiAlMCwgc3BcIiA6IFwiPXJcIihzcCkpO1xuK1x0d3JpdGVfc3lzcmVnKHNwLCBzcF9lbDEpO1xuK1xuK1x0LypcbitcdCAqIERyb3AgVEdFIHNvIHRoYXQgdkVMMSBpcyBhIG5lc3RlZCBjb250ZXh0IHJhdGhlciB0aGFuIGhvc3QgRUwwLlxuK1x0ICogS1ZNIGJhY2tzIGl0IHdpdGggYSBzaGFkb3cgc3RhZ2UtMiBNTVUgZXZlbiB0aG91Z2ggdnN0YWdlLTIgaXNcbitcdCAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLlxuK1x0ICovXG4rXHR3cml0ZV9zeXNyZWcocmVhZF9zeXNyZWcoaGNyX2VsMikgXHUwMDI2IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7XG4rXHRpc2IoKTtcbitcbitcdHdyaXRlX3N5c3JlZyhQU1JfTU9ERV9FTDFoIHwgUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgUFNSX0FfQklUIHxcbitcdFx0ICAgICBQU1JfRF9CSVQsIHNwc3JfZWwyKTtcbitcdHdyaXRlX3N5c3JlZygodTY0KWd1ZXN0X2VsMV9jb2RlLCBlbHJfZWwyKTtcbitcdGFzbSB2b2xhdGlsZShcImVyZXRcIik7XG4rXG4rXHRHVUVTVF9BU1NFUlQoZmFsc2UpO1xuK31cbitcbitzdGF0aWMgdm9pZCBwcmVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3BhLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4rXHRcdC5ncGEgPSBncGEsXG4rXHRcdC5zaXplID0gc2l6ZSxcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZG8ge1xuK1x0XHRyZXQgPSBfX3ZjcHVfaW9jdGwodmNwdSwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIFx1MDAyNnJhbmdlKTtcbitcdH0gd2hpbGUgKCghcmV0IFx1MDAyNlx1MDAyNiByYW5nZS5zaXplKSB8fFxuK1x0XHQgKHJldCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpKTtcbitcbitcdFRFU1RfQVNTRVJUKCFyZXQsIFwiS1ZNX1BSRV9GQVVMVF9NRU1PUlkgZmFpbGVkLCByZXQ6ICVkIGVycm5vOiAlZFwiLFxuK1x0XHQgICAgcmV0LCBlcnJubyk7XG4rXHRURVNUX0FTU0VSVF9FUShyYW5nZS5zaXplLCAwKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3Qga3ZtX3ZjcHVfaW5pdCBpbml0O1xuK1x0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xuK1x0c3RydWN0IGt2bV92bSAqdm07XG4rXHRzdHJ1Y3QgdWNhbGwgdWM7XG4rXHR1NjQgbnBhZ2VzO1xuK1xuK1x0VEVTVF9SRVFVSVJFKHRlc3Rfc3VwcG9ydHNfZWwyKCkpO1xuK1x0VEVTVF9SRVFVSVJFKGt2bV9jaGVja19jYXAoS1ZNX0NBUF9QUkVfRkFVTFRfTUVNT1JZKSk7XG4rXG4rXHR2bSA9IHZtX2NyZWF0ZSgxKTtcbitcbitcdGt2bV9nZXRfZGVmYXVsdF92Y3B1X3RhcmdldCh2bSwgXHUwMDI2aW5pdCk7XG4rXHRpbml0LmZlYXR1cmVzWzBdIHw9IEJJVChLVk1fQVJNX1ZDUFVfSEFTX0VMMik7XG4rXHR2Y3B1ID0gYWFyY2g2NF92Y3B1X2FkZCh2bSwgMCwgXHUwMDI2aW5pdCwgZ3Vlc3RfY29kZSk7XG4rXHRrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7XG4rXG4rXHRucGFnZXMgPSBURVNUX01FTV9TSVpFIC8gdm0tXHUwMDNlcGFnZV9zaXplO1xuK1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgVEVTVF9NRU1fR1BBLFxuK1x0XHRcdFx0ICAgIFRFU1RfTUVNX1NMT1QsIG5wYWdlcywgMCk7XG4rXHR2aXJ0X21hcCh2bSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9HUEEsIG5wYWdlcyk7XG4rXG4rXHQvKiBSdW4gdGhlIGd1ZXN0IHVudGlsIGl0IGhhcyBFUkVUJ2QgZnJvbSB2RUwyIHRvIHZFTDEuICovXG4rXHR2Y3B1X3J1bih2Y3B1KTtcbitcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuK1x0Y2FzZSBVQ0FMTF9TWU5DOlxuK1x0XHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFVDQUxMX0FCT1JUOlxuK1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRURVNUX0ZBSUwoXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFwiLCB1Yy5jbWQpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFRoZSB2Q1BVJ3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93XG4rXHQgKiBzdGFnZS0yIE1NVS5cbitcdCAqXG4rXHQgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLlxuK1x0ICovXG4rXHRwcmVfZmF1bHQodmNwdSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9TSVpFKTtcbitcbitcdC8qIFJlc3VtZSBhdCB2RUwxIGFuZCB0b3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gKi9cbitcdHZjcHVfcnVuKHZjcHUpO1xuK1x0c3dpdGNoIChnZXRfdWNhbGwodmNwdSwgXHUwMDI2dWMpKSB7XG4rXHRjYXNlIFVDQUxMX0RPTkU6XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBVQ0FMTF9BQk9SVDpcbitcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0VEVTVF9GQUlMKFwiVW5oYW5kbGVkIHVjYWxsOiAlbGRcIiwgdWMuY21kKTtcbitcdH1cbitcbitcdGt2bV92bV9mcmVlKHZtKTtcbitcdHJldHVybiAwO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbmluZGV4IGEwZmNhZTNjYjdhOGIuLjcwMmM3MmJiZmE5NjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTEyLDE5ICsxMiwyOSBAQFxuICNpbmNsdWRlIFx1MDAzY3Byb2Nlc3Nvci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjdWNhbGxfY29tbW9uLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NndWVzdF9tb2Rlcy5oXHUwMDNlXG4gXG4gLyogQXJiaXRyYXJpbHkgY2hvc2VuIHZhbHVlcyAqL1xuLSNkZWZpbmUgVEVTVF9TSVpFXHRcdChTWl8yTSArIFBBR0VfU0laRSlcbi0jZGVmaW5lIFRFU1RfTlBBR0VTXHRcdChURVNUX1NJWkUgLyBQQUdFX1NJWkUpXG4rI2RlZmluZSBURVNUX0JBU0VfU0laRVx0XHRTWl8yTVxuICNkZWZpbmUgVEVTVF9TTE9UXHRcdDEwXG4gXG4rLyogU3RvcmFnZSBvZiB0ZXN0IGluZm8gdG8gc2hhcmUgd2l0aCBndWVzdCBjb2RlICovXG4rc3RydWN0IHRlc3RfY29uZmlnIHtcbitcdHU2NCBwYWdlX3NpemU7XG4rXHR1NjQgdGVzdF9zaXplO1xuK1x0dTY0IHRlc3RfbnVtX3BhZ2VzO1xuK307XG4rXG4rc3RhdGljIHN0cnVjdCB0ZXN0X2NvbmZpZyB0ZXN0X2NvbmZpZztcbitcbiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSlcbiB7XG4gXHR2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDtcbitcdHN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gXHUwMDI2dGVzdF9jb25maWc7XG4gXHRpbnQgaTtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIFRFU1RfTlBBR0VTOyBpKyspIHtcbi1cdFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIFBBR0VfU0laRSk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb25maWctXHUwMDNldGVzdF9udW1fcGFnZXM7IGkrKykge1xuK1x0XHR1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgKyBpICogY29uZmlnLVx1MDAzZXBhZ2Vfc2l6ZSk7XG4gXG4gXHRcdHZhbCA9ICpzcmM7XG4gXHR9XG5AQCAtMzYsNiArNDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcbiBcdGdwYV90IGdwYTtcbiBcdHUzMiBmbGFncztcbitcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuIFx0Ym9vbCB3b3JrZXJfcmVhZHk7XG4gXHRib29sIHByZWZhdWx0X3JlYWR5O1xuIFx0Ym9vbCByZWNyZWF0ZV9zbG90O1xuQEAgLTU2LDE0ICs2NywxNiBAQCBzdGF0aWMgdm9pZCAqZGVsZXRlX3Nsb3Rfd29ya2VyKHZvaWQgKl9fZGF0YSlcbiBcdHdoaWxlICghUkVBRF9PTkNFKGRhdGEtXHUwMDNlcmVjcmVhdGVfc2xvdCkpXG4gXHRcdGNwdV9yZWxheCgpO1xuIFxuLVx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZGF0YS1cdTAwM2VncGEsXG4tXHRcdFx0XHQgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS1cdTAwM2VmbGFncyk7XG4rXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBkYXRhLVx1MDAzZWdwYSxcbitcdFx0XHRcdCAgICBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLCBkYXRhLVx1MDAzZWZsYWdzKTtcbiBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxuLVx0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXG4rXHRcdFx0ICAgICB1NjQgc2l6ZSwgdTY0IGV4cGVjdGVkX2xlZnQsXG4rXHRcdFx0ICAgICBlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIG1lbV9iYWNraW5nX3NyYyxcbitcdFx0XHQgICAgIGJvb2wgcHJpdmF0ZSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4gXHRcdC5ncGEgPSBiYXNlX2dwYSArIG9mZnNldCxcbkBAIC03NCw2ICs4Nyw3IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHRcdC52bSA9IHZjcHUtXHUwMDNldm0sXG4gXHRcdC5ncGEgPSBiYXNlX2dwYSxcbiBcdFx0LmZsYWdzID0gcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwLFxuK1x0XHQubWVtX2JhY2tpbmdfc3JjID0gbWVtX2JhY2tpbmdfc3JjLFxuIFx0fTtcbiBcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcbiBcdHB0aHJlYWRfdCBzbG90X3dvcmtlcjtcbkBAIC0xNTAsOCArMTY0LDggQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdC8qXG4gXHQgKiBBc3NlcnQgc3VjY2VzcyBpZiBwcmVmYXVsdGluZyB0aGUgZW50aXJlIHJhbmdlIHNob3VsZCBzdWNjZWVkLCBpLmUuXG4gXHQgKiBjb21wbGV0ZSB3aXRoIG5vIGJ5dGVzIHJlbWFpbmluZy4gIE90aGVyd2lzZSBwcmVmYXVsdGluZyBzaG91bGQgaGF2ZVxuLVx0ICogZmFpbGVkIGR1ZSB0byBFTk9FTlQgKGR1ZSB0byBSRVRfUEZfRU1VTEFURSBmb3IgZW11bGF0ZWQgTU1JTyB3aGVuXG4tXHQgKiBubyBtZW1zbG90IGV4aXN0cykuXG4rXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAobm8gbWVtc2xvdCBleGlzdHMgZm9yIHRoZSBHUEE7IG9uIHg4NiB0aGlzXG4rXHQgKiBzdXJmYWNlcyB2aWEgUkVUX1BGX0VNVUxBVEUpLlxuIFx0ICovXG4gXHRpZiAoIWV4cGVjdGVkX2xlZnQpXG4gXHRcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG5AQCAtMTYwLDM5ICsxNzQsODIgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdFx0XHRcdFx0ICBLVk1fUFJFX0ZBVUxUX01FTU9SWSwgcmV0LCB2Y3B1LVx1MDAzZXZtKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4rc3RydWN0IHRlc3RfcGFyYW1zIHtcbitcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcbitcdGJvb2wgcHJpdmF0ZTtcbitcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuK307XG4rXG4rc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkoZW51bSB2bV9ndWVzdF9tb2RlIGd1ZXN0X21vZGUsIHZvaWQgKmFyZylcbiB7XG4tXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemU7XG4rXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xuK1x0Z3BhX3QgYmFja2luZ19zcmNfcGFnZXN6LCBtZW1fcGFnZV9zaXplO1xuK1x0c3RydWN0IHRlc3RfcGFyYW1zICpwID0gYXJnO1xuIFx0Y29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0ge1xuLVx0XHQubW9kZSA9IFZNX01PREVfREVGQVVMVCxcbi1cdFx0LnR5cGUgPSB2bV90eXBlLFxuK1x0XHQubW9kZSA9IGd1ZXN0X21vZGUsXG4rXHRcdC50eXBlID0gcC1cdTAwM2V2bV90eXBlLFxuIFx0fTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdTtcbitcdHN0cnVjdCBrdm1fcnVuICpydW47XG4gXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcbiBcdHN0cnVjdCB1Y2FsbCB1YztcbiBcbitcdHByX2luZm8oXCJUZXN0aW5nIGd1ZXN0IG1vZGU6ICVzXFxuXCIsIHZtX2d1ZXN0X21vZGVfc3RyaW5nKGd1ZXN0X21vZGUpKTtcbitcdHByX2luZm8oXCJUZXN0aW5nIG1lbW9yeSBiYWNraW5nIHNyYyB0eXBlOiAlc1xcblwiLFxuK1x0XHR2bV9tZW1fYmFja2luZ19zcmNfYWxpYXMocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpLVx1MDAzZW5hbWUpO1xuK1xuIFx0dm0gPSB2bV9jcmVhdGVfc2hhcGVfd2l0aF9vbmVfdmNwdShzaGFwZSwgXHUwMDI2dmNwdSwgZ3Vlc3RfY29kZSk7XG4gXG4tXHRhbGlnbm1lbnQgPSBndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tWTV9NT0RFX0RFRkFVTFRdLnBhZ2Vfc2l6ZTtcbi1cdGdwYSA9ICh2bS1cdTAwM2VtYXhfZ2ZuIC0gVEVTVF9OUEFHRVMpICogZ3Vlc3RfcGFnZV9zaXplO1xuK1x0Z3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbZ3Vlc3RfbW9kZV0ucGFnZV9zaXplO1xuK1x0aG9zdF9wYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuK1x0YmFja2luZ19zcmNfcGFnZXN6ID0gZ2V0X2JhY2tpbmdfc3JjX3BhZ2VzeihwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyk7XG4rXHRtZW1fcGFnZV9zaXplID0gbWF4KGhvc3RfcGFnZV9zaXplLCBiYWNraW5nX3NyY19wYWdlc3opO1xuK1xuK1x0dGVzdF9jb25maWcucGFnZV9zaXplID0gZ3Vlc3RfcGFnZV9zaXplO1xuK1x0dGVzdF9jb25maWcudGVzdF9zaXplID0gYWxpZ25fdXAoVEVTVF9CQVNFX1NJWkUgKyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXG4rXHRcdFx0XHRcdCBtZW1fcGFnZV9zaXplKTtcbitcdHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzID0gdm1fY2FsY19udW1fZ3Vlc3RfcGFnZXModm0tXHUwMDNlbW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbitcbitcdGdwYSA9ICh2bS1cdTAwM2VtYXhfZ2ZuIC0gdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpICogdGVzdF9jb25maWcucGFnZV9zaXplO1xuIFx0YWxpZ25tZW50ID0gU1pfMk07XG4rXHRhbGlnbm1lbnQgPSBtYXgoYWxpZ25tZW50LCBtZW1fcGFnZV9zaXplKTtcbiBcdGdwYSA9IGFsaWduX2Rvd24oZ3BhLCBhbGlnbm1lbnQpO1xuIFx0Z3ZhID0gZ3BhIFx1MDAyNiAoKDFVTEwgXHUwMDNjXHUwMDNjICh2bS1cdTAwM2V2YV9iaXRzIC0gMSkpIC0gMSk7XG4gXG4tXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIFZNX01FTV9TUkNfQU5PTllNT1VTLCBncGEsIFRFU1RfU0xPVCxcbi1cdFx0XHRcdCAgICBURVNUX05QQUdFUywgcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcbi1cdHZpcnRfbWFwKHZtLCBndmEsIGdwYSwgVEVTVF9OUEFHRVMpO1xuK1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyxcbitcdFx0XHRcdCAgICBncGEsIFRFU1RfU0xPVCwgdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMsXG4rXHRcdFx0XHQgICAgcC1cdTAwM2Vwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApO1xuK1x0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XG4rXG4rXHRpZiAocC1cdTAwM2Vwcml2YXRlKVxuK1x0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbitcbitcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXG4rXHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuK1x0LyogUmV0cnkgdGhlIHNhbWUgcmFuZ2UgYWZ0ZXIgdGhlIGZpcnN0IHByZWZhdWx0IGF0dGVtcHQuICovXG4rXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLFxuK1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbitcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLFxuK1x0XHRcdCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUgLSBob3N0X3BhZ2Vfc2l6ZSxcbitcdFx0XHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcbitcdFx0XHQgcC1cdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXHUwMDNlcHJpdmF0ZSk7XG4rXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplLFxuK1x0XHRcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXG4rXHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuIFxuLVx0aWYgKHByaXZhdGUpXG4tXHRcdHZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCBURVNUX1NJWkUpO1xuK1x0dmNwdV9hcmdzX3NldCh2Y3B1LCAxLCBndmEpO1xuIFxuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIFNaXzJNLCAwLCBwcml2YXRlKTtcbi1cdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBTWl8yTSwgUEFHRV9TSVpFICogMiwgUEFHRV9TSVpFLCBwcml2YXRlKTtcbi1cdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTtcbitcdC8qIEV4cG9ydCB0aGUgc2hhcmVkIHZhcmlhYmxlcyB0byB0aGUgZ3Vlc3QuICovXG4rXHRzeW5jX2dsb2JhbF90b19ndWVzdCh2bSwgdGVzdF9jb25maWcpO1xuIFxuLVx0dmNwdV9hcmdzX3NldCh2Y3B1LCAxLCBndmEpO1xuIFx0dmNwdV9ydW4odmNwdSk7XG4gXG4rXHRydW4gPSB2Y3B1LVx1MDAzZXJ1bjtcbitcdFRFU1RfQVNTRVJUKHJ1bi1cdTAwM2VleGl0X3JlYXNvbiA9PSBVQ0FMTF9FWElUX1JFQVNPTixcbitcdFx0ICAgIFwiV2FudGVkICVzLCBnb3QgZXhpdCByZWFzb246ICV1ICglcylcIixcbitcdFx0ICAgIGV4aXRfcmVhc29uX3N0cihVQ0FMTF9FWElUX1JFQVNPTiksXG4rXHRcdCAgICBydW4tXHUwMDNlZXhpdF9yZWFzb24sIGV4aXRfcmVhc29uX3N0cihydW4tXHUwMDNlZXhpdF9yZWFzb24pKTtcbitcbiBcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuIFx0Y2FzZSBVQ0FMTF9BQk9SVDpcbiBcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG5AQCAtMjA3LDI0ICsyNjQsNjEgQEAgc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4gXHRrdm1fdm1fZnJlZSh2bSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSlcbitzdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmdfc3JjLFxuK1x0XHRcdFx0ICBib29sIHByaXZhdGUpXG4ge1xuK1x0c3RydWN0IHRlc3RfcGFyYW1zIHAgPSB7XG4rXHRcdC52bV90eXBlID0gdm1fdHlwZSxcbitcdFx0LnByaXZhdGUgPSBwcml2YXRlLFxuK1x0XHQubWVtX2JhY2tpbmdfc3JjID0gYmFja2luZ19zcmMsXG4rXHR9O1xuK1xuIFx0aWYgKHZtX3R5cGUgXHUwMDI2XHUwMDI2ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSBcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xuIFx0XHRwcl9pbmZvKFwiU2tpcHBpbmcgdGVzdHMgZm9yIHZtX3R5cGUgMHglbHhcXG5cIiwgdm1fdHlwZSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHZtX3R5cGUsIHByaXZhdGUpO1xuK1x0Zm9yX2VhY2hfZ3Vlc3RfbW9kZShfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSwgXHUwMDI2cCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSlcbit7XG4rXHRwdXRzKFwiXCIpO1xuK1x0cHJpbnRmKFwidXNhZ2U6ICVzIFstaF0gWy1tIG1vZGVdIFstcyBtZW0tdHlwZV1cXG5cIiwgbmFtZSk7XG4rXHRwdXRzKFwiXCIpO1xuK1x0Z3Vlc3RfbW9kZXNfaGVscCgpO1xuK1x0YmFja2luZ19zcmNfaGVscChcIi1zXCIpO1xuK1x0cHV0cyhcIlwiKTtcbiB9XG4gXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbiB7XG4rXHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7XG4rXHRpbnQgb3B0O1xuK1xuK1x0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiaG06czpcIikpICE9IC0xKSB7XG4rXHRcdHN3aXRjaCAob3B0KSB7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdGd1ZXN0X21vZGVzX2NtZGxpbmUob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAncyc6XG4rXHRcdFx0YmFja2luZyA9IHBhcnNlX2JhY2tpbmdfc3JjX3R5cGUob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAnaCc6XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0aGVscChhcmd2WzBdKTtcbitcdFx0XHRleGl0KDApO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiBcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XG4rXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoMCwgYmFja2luZywgZmFsc2UpO1xuICNpZmRlZiBfX3g4Nl82NF9fXG4tXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGZhbHNlKTtcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgdHJ1ZSk7XG4rXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIGZhbHNlKTtcbitcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgdHJ1ZSk7XG4gI2VuZGlmXG4gXHRyZXR1cm4gMDtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNS4yNDg0NTUwODVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMzU4NDUyNjc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEZlYXNpYmlsaXR5IEFzc2Vzc21lbnQqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lIGlmIGl0J3MgYSBnb29kIGNhbmRpZGF0ZSBmb3Igc3l6a2FsbGVyIGZ1enppbmcuIFRoZSBmaXJzdCB0aGluZyBJJ20gZ29pbmcgdG8gY2hlY2sgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEFoLCBcImFtZDY0XCIuIE5vdCBncmVhdCwgYnV0IGxldCdzIGNhcmVmdWxseSByZXZpZXcgdGhlIHBhdGNoIGRpZmYgaXRzZWxmIHRvIHNlZSB3aGF0J3MgYWN0dWFsbHkgYmVlbiB0b3VjaGVkLlxuXG5Pa2F5LCBsZXQncyByZWFkIHRocm91Z2ggdGhlIHBhdGNoIGRpZmYgYW5kIHNlZSB3aGF0J3MgY2hhbmdlZC4gTG9va3MgbGlrZSB3ZSBoYXZlIGNoYW5nZXMgaW4gYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAsIHdoaWNoIGlzIGp1c3QgZG9jdW1lbnRhdGlvbiwgc28gbm8gYmlnIGRlYWwgdGhlcmUuIFRoZW4gdGhlcmUgYXJlIGEgYnVuY2ggb2YgZmlsZXMgdW5kZXIgYGFyY2gvYXJtNjRgOiBpbmNsdWRlcyBhbmQgc291cmNlIGNvZGUgcmVsYXRlZCB0byBLVk0g4oCTIGBlc3IuaGAsIGBrdm1fZW11bGF0ZS5oYCwgYGt2bV9wZ3RhYmxlLmhgLCBga3ZtX3Brdm0uaGAsIGBLY29uZmlnYCwgYGFybS5jYCwgYW5kIG1vcmUuIFRoZXJlJ3MgYWxzbyBzb21lIHN0dWZmIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYCByZWxhdGVkIHRvIHRlc3RzLCBlc3BlY2lhbGx5IGZvciBgYXJtNjRgLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGVyZSAqYW55dGhpbmcqIGFmZmVjdGluZyB4ODYgb3IgY29tbW9uIGtlcm5lbCBjb2RlPyBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIGJlY2F1c2Ugc3l6a2FsbGVyJ3MgbWFpbiBzdHJlbmd0aCBpcyBnZW5lcmFsbHkgb24geDg2LCBub3QgYXJtNjQsIHNvIGl0IG5lZWRzIHRvIGJlIGNhcmVmdWxseSBpbnZlc3RpZ2F0ZWQuIExldCBtZSBtZXRpY3Vsb3VzbHkgZ28gdGhyb3VnaCBldmVyeSBmaWxlIGxpc3RlZCBpbiB0aGUgZGlmZjogYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAsIGFsbCB0aGUgYGFyY2gvYXJtNjRgIGZpbGVzLCBhbmQgdGhlIGB0b29scy90ZXN0aW5nYCBmaWxlcy5cblxuTm9wZS4gTm90aGluZy4gSXQncyBhbGwgZWl0aGVyIGRvY3VtZW50YXRpb24sIGFybTY0LXNwZWNpZmljIEtWTSBjb2RlLCBvciB0ZXN0cyBmb3IgYXJtNjQuIEp1c3QgdG8gYmUgYWJzb2x1dGVseSwgcG9zaXRpdmVseSBjZXJ0YWluLCBJIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgdGhpcyB3aXRoIGEgYGdpdCBkaWZmYCBvciBgZ2l0IHNob3dgIHRvIGxlYXZlIG5vIGRvdWJ0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjk5NiwiT3V0cHV0VG9rZW5zIjoxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjM4LjgzMjk4NDIwN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjQ3MDU3NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRpZmYgLS1naXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9icGYvZHJnbi5yc3Q9OTk9Rm9yIGV4YW1wbGUsIHRvIHByaW50IGBgc3RydWN0IGJwZl9wcm9nX2F1eGBgIGZvciBCUEYgcHJvZ3JhbSBpZCA1MzA3NzpcXG4tLVxcbkRvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0LTEwMy0gICAgJSBnaXQgZGlmZlxcbkRvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0OjEwNDogICAgZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZl9pbnNwZWN0LnB5IGIvdG9vbHMvYnBmX2luc3BlY3QucHlcXG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdC0xMDUtICAgIGluZGV4IDY1MGUyMjguLmFlYTIzNTcgMTAwNzU1XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0PTU0PXdvbid0IGJyZWFrIHVzZXJzcGFjZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTY5LSAgICAgICogIGNvbXAyX3QgaXMgMjQtYml0IHdpdGggNS1iaXQgYmFzZSAyIGV4cG9uZW50IGFuZCAyMCBiaXQgZnJhY3Rpb25cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0OjcwOiAgICBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXFxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdC03MS0gICAgRU9GXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0PTMxMD1Db25zaWRlciB0aGlzIGNoYW5nZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxMi0gICAgY2F0IFxcdTAwM2NcXHUwMDNjICdFT0YnIHwgcGF0Y2ggLWwgLXAxXFxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdDozMTM6ICAgIGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvS2J1aWxkIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL0tidWlsZFxcbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3QtMzE0LSAgICBpbmRleCBlYmIxODBhYWM3NGUuLmE5Yzg4YjBhOGIzYiAxMDA2NDRcXG4tLVxcbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q9ODQ9bG9va2VkIGxpa2UgdGhpczo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwMi1cXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0OjEwMzogIGRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuY1xcbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3QtMTA0LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3Q9NzM9Y2hhbmdlOjpcXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtNzQtXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojc1OlxcdGRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0LTc2LVxcdC0tLSBhL21tL21yZW1hcC5jXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdD0zNj1D5Luj56CB57yW6K+R5Zmo5Y+R5Ye655qE6K2m5ZGK5bi45bi45Lya6KKr6KeG5Li66K+v5oql77yM5LuO6ICM5a+86Ie05Ye6546w5LqG5peo5Zyo6K6p57yW6K+R5Zmo6Zet5Zi055qE6KGl5LiB44CCXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdC04Ni1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdDo4NzogIGRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuY1xcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg4LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XFxuLS1cXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw9MjY3MT1zdWIgcHJvY2VzcyB7XFxuLS1cXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGwtMjg0NC1cXHRcXHQgICAgKCRsaW5lID1+IC9ecmVuYW1lICg/OmZyb218dG8pIFxcXFxTK1xcXFxzKiQvIHx8XFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsOjI4NDU6XFx0XFx0ICAgICAkbGluZSA9fiAvXmRpZmYgLS1naXQgYVxcXFwvW1xcXFx3XFxcXC9cXFxcLlxcXFxfXFxcXC1dKyBiXFxcXC9cXFxcUytcXFxccyokLykpKSB7XFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI4NDYtXFx0XFx0XFx0JGlzX3BhdGNoID0gMTtcXG4tLVxcbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yOTAyLVxcdFxcdCMgZXh0cmFjdCB0aGUgZmlsZW5hbWUgYXMgaXQgcGFzc2VzXFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsOjI5MDM6XFx0XFx0aWYgKCRsaW5lID1+IC9eZGlmZiAtLWdpdC4qPyhcXFxcUyspJC8pIHtcXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGwtMjkwNC1cXHRcXHRcXHQkcmVhbGZpbGUgPSAkMTtcXG4tLVxcbnNjcmlwdHMvZ2V0X21haW50YWluZXIucGw9NTUyPWZvcmVhY2ggbXkgJGZpbGUgKEBBUkdWKSB7XFxuLS1cXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMS1cXHRcXHRwdXNoKEBmaWxlcywgJGZpbGVuYW1lKTtcXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsOjYwMjpcXHQgICAgfSBlbHNpZiAobS9eZGlmZiAtLWdpdCBhXFxcXC8oXFxcXFMrKSBiXFxcXC8oXFxcXFMrKVxcXFxzKiQvKSB7XFxuc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbC02MDMtXFx0XFx0bXkgJGZpbGVuYW1lMSA9ICQxO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzo0MS40ODAwNDc5MjZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MTY4NzIzNTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6XG5cbioqQ2hlY2tpbmcgdGhlIFJlY2VudCBHaXQgQWN0aXZpdHkqKlxuXG5Pa2F5LCBJIG5lZWQgdG8gcXVpY2tseSBzZWUgd2hhdCB0aGUgbW9zdCByZWNlbnQgY29tbWl0IGluIHRoaXMgcmVwb3NpdG9yeSBhY3R1YWxseSAqZGlkKi4gUmF0aGVyIHRoYW4gbmF2aWdhdGluZyB0aHJvdWdoIHRoZSBjb21taXQgaGlzdG9yeSB2aXN1YWxseSAod2hpY2ggY2FuIGJlIHRpbWUtY29uc3VtaW5nKSwgSSdtIGdvaW5nIHRvIGxldmVyYWdlIGBnaXRgIHRvIGdpdmUgbWUgYSBjb25jaXNlIG92ZXJ2aWV3LiBJJ20gdGhpbmtpbmcgSSBzaG91bGQgdXNlIGBnaXQgc2hvdyAtLXN0YXQgSEVBRGAgY29tbWFuZC4gYHNob3dgIHdpbGwgZGlzcGxheSB0aGUgYWN0dWFsIGNvbW1pdCwgYW5kIHRoZSBgLS1zdGF0YCBvcHRpb24gd2lsbCBnaXZlIG1lIHRoZSBjaGFuZ2VzIGJyb2tlbiBkb3duIGZpbGUgYnkgZmlsZS4gVGhpcyB3aWxsIHByZXNlbnQgYSBjbGVhciBzdW1tYXJ5IG9mIHdoYXQncyBiZWVuIGFkZGVkLCBkZWxldGVkLCBvciBtb2RpZmllZCBpbiB0aGF0IGxhc3QgY29tbWl0LiBUaGlzIGlzIHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0IHRoZSBnaXN0IG9mIGl0LiBUaGlzIHdpbGwgc2hvdyBtZSB0aGUgY2hhbmdlcy4gQWx0ZXJuYXRpdmVseSwgYGdpdCBkaWZmLXRyZWUgLS1zdGF0IEhFQURgIGlzIGFuIG9wdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUzNjQsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzo0Ni42NDg3NzM0ODZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQxNjYzNTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L2t2bS9tbXUuYz0yOTE5PXByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGFfdCBncGEsIHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplLFxcbi0tXFxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzMi0vKipcXG5hcmNoL2FybTY0L2t2bS9tbXUuYzoyOTMzOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSAtIHByZS1mYXVsdCBzdGFnZS0yIHBhZ2UgdGFibGVzIGZvciB0aGVcXG5hcmNoL2FybTY0L2t2bS9tbXUuYy0yOTM0LSAqIHNwZWNpZmllZCBHUEEuXFxuLS1cXG5hcmNoL2FybTY0L2t2bS9tbXUuYy0yOTQ1LSAqL1xcbmFyY2gvYXJtNjQva3ZtL21tdS5jOjI5NDY6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDctXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXFxuLS1cXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM9NTc5Nz12b2lkIGt2bV9hcmNoX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODQwLS8qKlxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYzo1ODQxOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSgpIC0tIHByZS1mYXVsdCBhbmQgbGluayBnbWFwIGRhdCB0YWJsZXNcXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg0Mi0gKiBAdmNwdTogdGhlIHZjcHUgdGhhdCBzaGFsbCBhcHBlYXIgdG8gaGF2ZSBnZW5lcmF0ZWQgdGhlIGZhdWx0LWluLlxcbi0tXFxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jLTU4NTktICovXFxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jOjU4NjA6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgKnJhbmdlKVxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODYxLXtcXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NDk3Mz1zdGF0aWMgaW50IGt2bV90ZHBfcGFnZV9wcmVmYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSxcXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxNi1cXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jOjUwMTc6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxOC1cXHRcXHRcXHRcXHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcXG4tLVxcbmFyY2gveDg2L2t2bS92bXgvdGR4LmM9MTcwMT1zdGF0aWMgaW50IHRkeF9zZXB0X21hcF9sZWFmX3NwdGUoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGVudW0gcGdfbGV2ZWwgbGV2ZWwsXFxuLS1cXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jLTE3MTMtXFx0LypcXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jOjE3MTQ6XFx0ICogRW5zdXJlIHByZV9mYXVsdF9hbGxvd2VkIGlzIHJlYWQgYnkga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KClcXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jLTE3MTUtXFx0ICogYmVmb3JlIGt2bV90ZHgtXFx1MDAzZXN0YXRlLiAgVXNlcnNwYWNlIG11c3Qgbm90IGJlIGFsbG93ZWQgdG8gcHJlLWZhdWx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjQ3LjA5MDQ1NDgyOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2NDkyODQwODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEtWTSBQYXRjaCBmb3IgV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKlxuXG5Pa2F5LCBmaXJzdCB0aGluZ3MgZmlyc3QsIGxldCdzIGVzdGFibGlzaCB0aGUgY29udGV4dC4gV2UncmUgbG9va2luZyBhdCBhIHBhdGNoIHNldCwgYW5kIHRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCdzIHdvcnRoIGZ1enppbmcuIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZXMuIEFoLCB0aGUgYGdpdCBkaWZmYCBpcyBhbHJlYWR5IHByb3ZpZGVkLiBFeGNlbGxlbnQuIExldCdzIHJldmlldyBpdCBhZ2Fpbi5cblxuSXQgc2VlbXMgdG8gYmUgYWxsIHRoaW5ncyBLVk0sIGJ1dCB0aGUgZGlmZiByZXZlYWxzOlxuKiAgIGBEb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RgXG4qICAgYGFyY2gvYXJtNjQvLi4uYCBleHRlbnNpdmVseVxuKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vLi4uYFxuXG5Ob3csIGxldCdzIGNvbnN1bHQgdGhlIGNyaXRlcmlhIGZvciBkZWNpZGluZyAqYWdhaW5zdCogZnV6emluZywgc3BlY2lmaWNhbGx5IFNFQ1RJT04gMi4gSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCB0aGlzIHBhdGNoICpkb2Vzbid0KiB3YXJyYW50IGZ1enppbmcgYmFzZWQgb24gdGhlIGRlZmluZWQgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgaGVyZSBhcmUgdGhlIHNjZW5hcmlvcyB3aGVyZSB3ZSBkZWZpbml0aXZlbHkgKmRvbid0KiBmdXp6LiBJIHNlZSB0aGUgbWFpbiBwb2ludHMgYXM6XG4qICAgRG9jdW1lbnRhdGlvbi8gYW5kIHNlbGYtdGVzdHMgKHRvb2xzLykgdGhhdCBkb24ndCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cbiogICBcIkNvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cIlxuXG5BbHJpZ2h0LCBsZXQncyBjb25uZWN0IHRoZSBkb3RzLiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhhdCdzIHdoYXQncyByZWxldmFudCB0byB0aGlzIGZ1enppbmcgZXhlcmNpc2UuIExvb2tpbmcgYXQgdGhlIHBhdGNoIHNldCwgdGhlIGtlcm5lbCBjaGFuZ2VzIGFyZSAqc3RyaWN0bHkqIHVuZGVyIGBhcmNoL2FybTY0L2AuIEl0J3MgYWxsIEFSTTY0IEtWTS1yZWxhdGVkLCBpbmNsdWRpbmcgaGVhZGVycyBhbmQgY29yZSBLVk0gaW1wbGVtZW50YXRpb24gZmlsZXMuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUuIFRoZSByZXN0IGlzIGRvY3VtZW50YXRpb24gYW5kIHRob3NlIHVzZXItc3BhY2Ugc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHNgLlxuXG5UaGUgaW1wbGljYXRpb24gaXMgb2J2aW91czogdGhlIGtlcm5lbCBjb2RlIGNoYW5nZXMgd2lsbCBub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQuXG5cblRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0J3MgcGVyZm9ybSBhIHNhbml0eSBjaGVjay4gTGV0J3MgcXVpY2tseSB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gY29tbW9uIEtWTSBjb2RlIGNoYW5nZXMuIEknbGwgc2VhcmNoIGB2aXJ0L2t2bS9gIGFuZCBgaW5jbHVkZS9saW51eC9rdm0qYCBmb3IgYW55IHRvdWNoZWQgZmlsZXMuIE5vdGhpbmcuIE5vdCBhIHNpbmdsZSBmaWxlIGluIHRoZXNlIGxvY2F0aW9ucyEgVGhpcyBjb25maXJtcyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byBBUk02NCBhbmQgdGhlIG90aGVyIG5vbi1rZXJuZWwgZWxlbWVudHMuXG5cblRoaXMgcGF0Y2ggaXMgZXhjbHVzaXZlbHkgZGVhbGluZyB3aXRoIEFSTTY0IEtWTSBhbmQgc2VsZi10ZXN0cy4gVGhlIEtWTSBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIHRhcmdldCBhbWQ2NCBhcmNoaXRlY3R1cmUgaXMgbm90IGludm9sdmVkLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggZmFsbHMgaW50byB0aHJlZSBvZiB0aGUgXCJuZWdhdGl2ZSBjcml0ZXJpYVwiOlxuKiAgIERvY3VtZW50YXRpb24gY2hhbmdlc1xuKiAgIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMgLyBzZWxmLXRlc3RzXG4qICAgQ29kZSBleGNsdXNpdmUgdG8gYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlLlxuXG5CYXNlZCBvbiB0aGlzLCB0aGUgZnV6emluZy13b3J0aGluZXNzIHBhcmFtZXRlcnMgYXJlIGNsZWFyOlxuXG4qICAgYFdvcnRoRnV6emluZ2A6IGZhbHNlXG4qICAgYEZvY3VzU3ltYm9sc2A6IFxcWyBdXG4qICAgYEVuYWJsZUNvbmZpZ3NgOiBcXFsgXVxuKiAgIGBSZWFzb25pbmdgOiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgY2hhbmdlcyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGltcGxlbWVudGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IGZvciBhcm02NCBLVk0pLiBUaGUgcmVtYWluZGVyIG9mIHRoZSBjaGFuZ2VzIGFyZSBkb2N1bWVudGF0aW9uIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBUaGVyZWZvcmUsIG5vbmUgb2YgdGhlIG1vZGlmaWVkIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgaXMgcmVhY2hhYmxlIG9yIGNvbXBpbGVkIG9uIGFtZDY0LlxuXG5Ob3csIHdpdGggdGhpcyByYXRpb25hbGUgYW5kIGRlZmluaXRpdmUgZmluZGluZ3MsIEkgY2FuIGNvbmZpZGVudGx5IHNldCB0aGUgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0NjksIk91dHB1dFRva2VucyI6MTIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA1NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxNDoxMy41ODMyOTg2NTJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LiBBbGwga2VybmVsIG1vZGlmaWNhdGlvbnMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgYXJlIGV4Y2x1c2l2ZSB0byBhcmNoL2FybTY0IChhZGRpbmcgS1ZNX1BSRV9GQVVMVF9NRU1PUlkgc3VwcG9ydCB0byBhcm02NCBLVk0pLCB3aGlsZSB0aGUgcmVtYWluaW5nIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gRG9jdW1lbnRhdGlvbi8gYW5kIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBCZWNhdXNlIG5vIHJlYWNoYWJsZSBjb2RlIGlzIGNvbXBpbGVkIG9yIGV4ZWN1dGVkIG9uIGFtZDY0LCB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCB3YXJyYW50IGZ1enppbmcgb24gdGhpcyB0YXJnZXQgYXJjaGl0ZWN0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTM6MTQ6MTMuNTgzMzM2NDYyWiIsIlNlcSI6OSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow2v2tj[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-14 13:11:23 +0000 UTC FinishedAt: 2026-09-14 13:14:14 +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+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTM6MTM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA1ZWJlNDMxZmNmMTkyYTBiOTQyMjliNTRkOWZhYjUwZWQwOTZmMzhiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0IGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG5pbmRleCA0OTg4YzMyZGY0YmY4Li5mYjdmOGJhY2E5NzBjIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcbkBAIC02NDg1LDcgJiM0Mzs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcbi06QXJjaGl0ZWN0dXJlczogbm9uZVxuJiM0Mzs6QXJjaGl0ZWN0dXJlczogeDg2LCBzMzkwLCBhcm02NFxuIDpUeXBlOiB2Y3B1IGlvY3RsXG4gOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KVxuIDpSZXR1cm5zOiAwIGlmIGF0IGxlYXN0IG9uZSBwYWdlIGlzIHByb2Nlc3NlZCwgXHUwMDNjIDAgb24gZXJyb3JcbkBAIC02NDkzLDEyICYjNDM7NjQ5MywxNCBAQCBTZWUgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuXG4gRXJyb3JzOlxuIFxuICAgPT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7ICBFQUdBSU4gICAgIEEgcmFjZSBvY2N1cnJlZCBiZWZvcmUgcHJvZ3Jlc3Mgd2FzIG1hZGUsIGJ1dCBhIHJldHJ5IG1heSBzdWNjZWVkLlxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxuICAgICAgICAgICAgICBwYWdlIGFsaWduZWQsIGNhdXNlcyBhbiBvdmVyZmxvdywgb3Igc2l6ZSBpcyB6ZXJvKSwgb3IgdGhlIFZNXG4gICAgICAgICAgICAgIGlzIFVDT05UUk9MIChzMzkwKS5cbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXG4gICBFSU5UUiAgICAgIEFuIHVubWFza2VkIHNpZ25hbCBpcyBwZW5kaW5nIGFuZCBubyBwYWdlIHdhcyBwcm9jZXNzZWQuXG4gICBFRkFVTFQgICAgIFRoZSBwYXJhbWV0ZXIgYWRkcmVzcyB3YXMgaW52YWxpZC5cbiYjNDM7ICBFSFdQT0lTT04gIEEgcG9pc29uZWQgaG9zdCBwYWdlIHdhcyBlbmNvdW50ZXJlZC5cbiAgIEVPUE5PVFNVUFAgTWFwcGluZyBtZW1vcnkgZm9yIGEgR1BBIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZVxuICAgICAgICAgICAgICBoeXBlcnZpc29yLCBhbmQvb3IgZm9yIHRoZSBjdXJyZW50IHZDUFUgc3RhdGUvbW9kZS5cbiAgIEVJTyAgICAgICAgdW5leHBlY3RlZCBlcnJvciBjb25kaXRpb25zIChhbHNvIGNhdXNlcyBhIFdBUk4pXG5AQCAtNjUxOCw3ICYjNDM7NjUyMCwxNyBAQCBFcnJvcnM6XG4gS1ZNX1BSRV9GQVVMVF9NRU1PUlkgcG9wdWxhdGVzIEtWTSYjMzk7cyBzdGFnZS0yIHBhZ2UgdGFibGVzIHVzZWQgdG8gbWFwIG1lbW9yeVxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXG4gc3RhZ2UtMiByZWFkIHBhZ2UgZmF1bHQsIGUuZy4gZmF1bHRzIGluIG1lbW9yeSBhcyBuZWVkZWQsIGJ1dCBkb2VzbiYjMzk7dCBicmVha1xuLUNvVy4gIE9uIHg4NiwgS1ZNIGRvZXMgbm90IG1hcmsgYW55IG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEUgYXMgQWNjZXNzZWQuXG4mIzQzO0NvVy4gIE9uIGFybTY0LCBLVk0gbWFya3MgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURXMgYXMgQWNjZXNzZWQsIGFzIGl0XG4mIzQzO2RvZXMgZm9yIGFueSBzdGFnZS0yIGZhdWx0LCBidXQgbGVhdmVzIHRoZSBBY2Nlc3NlZCBzdGF0ZSBvZiBleGlzdGluZyBQVEVzXG4mIzQzO3VuY2hhbmdlZC4gIE9uIHg4NiwgS1ZNIGRvZXMgbm90IG1hcmsgYW55IG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEUgYXNcbiYjNDM7QWNjZXNzZWQsIGFuZCBmb3IgczM5MCBpdCBpcyBub3QgYXBwbGljYWJsZS5cbiYjNDM7XG4mIzQzO09uIGFybTY0LCBhIEdQQSBpcyBpbnRlcnByZXRlZCBhcyBhbiBJUEEsIGFuZCBuZXZlciBpbnRlcnByZXRlZCBhcyB0aGUgSVBBXG4mIzQzO29mIGEgbmVzdGVkIGd1ZXN0LiBQcmUtZmF1bHRpbmcgb25seSBwb3B1bGF0ZXMgY2Fub25pY2FsIHN0YWdlIDIgcGFnZVxuJiM0Mzt0YWJsZXMuXG4mIzQzO1xuJiM0MztUaGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFybTY0IGlmIHRoZSBwcm90ZWN0ZWQgS1ZNIChwS1ZNKSBmZWF0dXJlXG4mIzQzO2lzIGVuYWJsZWQuXG4gXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXG4gcHJpdmF0ZSBndWVzdCBtZW1vcnkgYmVmb3JlIHRoZSBndWVzdCBpcyAmIzM5O2ZpbmFsaXplZCYjMzk7L21lYXN1cmVkLCB0aGlzIGlvY3RsXG5AQCAtNjUzMyw3ICYjNDM7NjU0NSw3IEBAIFdoZW4gdGhlIGlvY3RsIHJldHVybnMsIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFx1MDAzZSAwIG9uIHJldHVybiwgdGhlIGNhbGxlciBjYW4ganVzdCBpc3N1ZVxuIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LlxuIFxuLVNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuJiM0MztPbiB4ODYsIHNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuIGFyZSBpbmRleGVkIGJ5IHZpcnR1YWwgYWRkcmVzcyBvciBuZXN0ZWQgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcy5cbiBDYWxsaW5nIHRoaXMgaW9jdGwgd2hlbiB0aGUgZ3Vlc3QgaXMgdXNpbmcgc2hhZG93IHBhZ2UgdGFibGVzIChmb3JcbiBleGFtcGxlIGJlY2F1c2UgaXQgaXMgcnVubmluZyBhIG5lc3RlZCBndWVzdCB3aXRoIG5lc3RlZCBwYWdlIHRhYmxlcylcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuaW5kZXggZjgxNmY1ZDc3ZjFhNS4uOWMwMjA1OTgzZDlhOCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmhcbkBAIC00MzcsNiAmIzQzOzQzNyw1MCBAQFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xuICNpbmNsdWRlIFx1MDAzY2FzbS90eXBlcy5oXHUwMDNlXG4gXG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTggZXNyX2dldF9lYyh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBFU1JfRUx4X0VDKGVzcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfdHJhcF9pc19pYWJ0KHVuc2lnbmVkIGxvbmcgZXNyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9nZXRfZWMoZXNyKSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zMXB0dyh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfUzFQVFc7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cbiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX3dyaXRlKHVuc2lnbmVkIGxvbmcgZXNyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9XTlI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfZGFidF9pc19jbSh1bnNpZ25lZCBsb25nIGVzcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfQ007XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZXNyX3RyYXBfaXNfaWFidChlc3IpIFx1MDAyNlx1MDAyNiAhZXNyX2FidF9pc19zMXB0dyhlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zZWEodW5zaWduZWQgbG9uZyBlc3IpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpIHtcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX1NFQV9UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUFfVFRXKDMpOlxuJiM0MztcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbiYjNDM7XHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZXNyX2Jya19jb21tZW50KHVuc2lnbmVkIGxvbmcgZXNyKVxuIHtcbiBcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfQlJLNjRfSVNTX0NPTU1FTlRfTUFTSztcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcbmluZGV4IGEzYzE5MjhiZGY3NDMuLmEzYjI3MjI2NTU1NDMgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuQEAgLTQxMSwxOCAmIzQzOzQxMSwxMyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9kYWJ0X2dldF9yZChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3MxdHcoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1MxUFRXKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2FidF9pc19zMXB0dyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1dOUjtcbi19XG4tXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X0NNKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2RhYnRfaXNfd3JpdGUoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGt2bV92Y3B1X2RhYnRfZ2V0X2FzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00MzgsMTcgJiM0Mzs0MzMsMTIgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaWxfaXMzMmJpdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHVcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRyZXR1cm4gRVNSX0VMeF9FQyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiYjNDM7XHRyZXR1cm4gZXNyX2dldF9lYyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfaWFidChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkgXHUwMDI2XHUwMDI2ICFrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpO1xuJiM0MztcdHJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00NjgsMjYgJiM0Mzs0NTgsOSBAQCBib29sIGt2bV92Y3B1X3RyYXBfaXNfdHJhbnNsYXRpb25fZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0cmV0dXJuIGVzcl9mc2NfaXNfdHJhbnNsYXRpb25fZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmVcbi11NjQga3ZtX3ZjcHVfdHJhcF9nZXRfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbi17XG4tXHR1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7XG4tXG4tXHRCVUdfT04oIWVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChlc3IpKTtcbi1cdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChlc3IgXHUwMDI2IEVTUl9FTHhfRlNDX0xFVkVMKSk7XG4tfVxuLVxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9hYnRfaXNzZWEoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHN3aXRjaCAoa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQodmNwdSkpIHtcbi1cdGNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOlxuLVx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKTpcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHRkZWZhdWx0OlxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4mIzQzO1x0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00OTYsOSAmIzQzOzQ2OSw5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGt2bV92Y3B1X3N5c19nZXRfcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0cmV0dXJuIEVTUl9FTHhfU1lTNjRfSVNTX1JUKGVzcik7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZXNyX2FidF9pc193cml0ZV9mYXVsdCh1bnNpZ25lZCBsb25nIGVzcilcbiB7XG4tXHRpZiAoa3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KSkge1xuJiM0MztcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0LypcbiBcdFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcbiBcdFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXG5AQCAtNTExLDEzICYjNDM7NDg0LDE4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQgKiBmaXJzdCksIHRoZW4gYSBwZXJtaXNzaW9uIGZhdWx0IHRvIGFsbG93IHRoZSBmbGFnc1xuIFx0XHQgKiB0byBiZSBzZXQuXG4gXHRcdCAqL1xuLVx0XHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpO1xuJiM0MztcdFx0cmV0dXJuIGVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChlc3IpO1xuIFx0fVxuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSlcbiYjNDM7XHRpZiAoZXNyX3RyYXBfaXNfaWFidChlc3IpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4ga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKHZjcHUpO1xuJiM0MztcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga3ZtX2lzX3dyaXRlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X21waWRyX2FmZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcbkBAIC04NTksNiAmIzQzOzg1OSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXG4gICogQGFkZHI6XHRJbnB1dCBhZGRyZXNzIGZvciB0aGUgc3RhcnQgb2YgdGhlIHdhbGsuXG4gICogQHB0ZXA6XHRQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXRyaWV2ZWQgUFRFLlxuICAqIEBsZXZlbDpcdFBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGxldmVsIG9mIHRoZSByZXRyaWV2ZWQgUFRFLlxuJiM0MzsgKiBAZmxhZ3M6XHRGbGFncyB0byBjb250cm9sIHRoZSBwYWdlLXRhYmxlIHdhbGtcbiYjNDM7ICpcdFx0KHNlZSBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4KS5cbiAgKlxuICAqIFRoZSBvZmZzZXQgb2YgQGFkZHIgd2l0aGluIGEgcGFnZSBpcyBpZ25vcmVkLlxuICAqXG5AQCAtODY5LDcgJiM0Mzs4NzEsOCBAQCBpbnQga3ZtX3BndGFibGVfd2FsayhzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsIHU2NCBzaXplLFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXG4gICovXG4gaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkcixcbi1cdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpO1xuJiM0MztcdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsXG4mIzQzO1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xuIFxuIC8qKlxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG5pbmRleCBiZWVhMDBlNjkzYTBhLi40ZDZlNTc2NWU5ZTU2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmhcbkBAIC00NCw5ICYjNDM7NDQsOSBAQCBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3Brdm1fZXh0X2FsbG93ZWQoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGV4dClcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fUFRSQVVUSF9HRU5FUklDOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fTVRFOlxuLVx0XHRyZXR1cm4gZmFsc2U7XG4gXHRjYXNlIEtWTV9DQVBfQVJNX0VBR0VSX1NQTElUX0NIVU5LX1NJWkU6XG4gXHRjYXNlIEtWTV9DQVBfQVJNX1NVUFBPUlRFRF9CTE9DS19TSVpFUzpcbiYjNDM7XHRjYXNlIEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWTpcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuICFrdm0gfHwgIWt2bV92bV9pc19wcm90ZWN0ZWQoa3ZtKTtcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZ1xuaW5kZXggNDQ5MTU0ZjlhNDg1Mi4uNzEyMzMwNjhiN2NiNiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbkBAIC0zNyw2ICYjNDM7MzcsNyBAQCBtZW51Y29uZmlnIEtWTVxuIFx0c2VsZWN0IFNDSEVEX0lORk9cbiBcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xuIFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuJiM0MztcdHNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZXG4gXHRoZWxwXG4gXHQgIFN1cHBvcnQgaG9zdGluZyB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcy5cbiBcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9hcm0uYyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jXG5pbmRleCBjY2FlODJjMTI0MmJjLi41OGFjNzBmMzFkODRlIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vYXJtLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jXG5AQCAtMzkzLDYgJiM0MzszOTMsNyBAQCBpbnQga3ZtX3ZtX2lvY3RsX2NoZWNrX2V4dGVuc2lvbihzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgZXh0KVxuIFx0Y2FzZSBLVk1fQ0FQX0NPVU5URVJfT0ZGU0VUOlxuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9XUklUQUJMRV9JTVBfSURfUkVHUzpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fU0VBX1RPX1VTRVI6XG4mIzQzO1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHIgPSAxO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcyOlxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXG5pbmRleCAzOWFhODkxMWY2MmMxLi4yM2E1NzMxMmI5ODFiIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuQEAgLTUzMiw3ICYjNDM7NTMyLDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9hZGp1c3RfcmFuZ2UodTY0IGFkZHIsIHN0cnVjdCBrdm1fbWVtX3JhbmdlICpyYW5nZSlcbiBcdGludCByZXQ7XG4gXG4gXHRoeXBfYXNzZXJ0X2xvY2tfaGVsZChcdTAwMjZob3N0X21tdS5sb2NrKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCk7XG4mIzQzO1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtOTEwLDcgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxuIFx0czggbGV2ZWw7XG4gXHRpbnQgcmV0O1xuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuJiM0MztcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXHRpZiAoZ3Vlc3RfcHRlX2lzX3BvaXNvbmVkKHB0ZSkpXG5AQCAtOTU5LDcgJiM0Mzs5NTksNyBAQCBpbnQgX19wa3ZtX3ZjcHVfaW5fcG9pc29uX2ZhdWx0KHN0cnVjdCBwa3ZtX2h5cF92Y3B1ICpoeXBfdmNwdSlcbiBcdGlwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIoXHUwMDI2aHlwX3ZjcHUtXHUwMDNldmNwdSkpO1xuIFxuIFx0Z3Vlc3RfbG9ja19jb21wb25lbnQodm0pO1xuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuJiM0MztcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gdW5sb2NrO1xuIFxuQEAgLTEzMTUsNyAmIzQzOzEzMTUsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2dldF9ndWVzdF9pbmZvKHBoeXNfYWRkcl90IHBoeXMsIHN0cnVjdCBwa3ZtX2h5cF92bSAqKnZtLFxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFx0fVxuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBwaHlzLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwsIDApO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNTQ0LDcgJiM0MzsxNTQ0LDcgQEAgc3RhdGljIGludCBfX2NoZWNrX2hvc3Rfc2hhcmVkX2d1ZXN0KHN0cnVjdCBwa3ZtX2h5cF92bSAqdm0sIHU2NCAqX19waHlzLCB1NjQgaXBcbiBcdHM4IGxldmVsO1xuIFx0aW50IHJldDtcbiBcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZ2bS1cdTAwM2VwZ3QsIGlwYSwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCwgMCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuIFx0aWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbmluZGV4IGI3NGRkNWNlMWVmZDMuLjM0N2VlYzM5NTdkNmEgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jXG5AQCAtMjk4LDEyICYjNDM7Mjk4LDEzIEBAIHN0YXRpYyBpbnQgbGVhZl93YWxrZXIoY29uc3Qgc3RydWN0IGt2bV9wZ3RhYmxlX3Zpc2l0X2N0eCAqY3R4LFxuIH1cbiBcbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxuLVx0XHRcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbClcbiYjNDM7XHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuJiM0MztcdFx0XHQgZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzKVxuIHtcbiBcdHN0cnVjdCBsZWFmX3dhbGtfZGF0YSBkYXRhO1xuIFx0c3RydWN0IGt2bV9wZ3RhYmxlX3dhbGtlciB3YWxrZXIgPSB7XG4gXHRcdC5jYlx0PSBsZWFmX3dhbGtlcixcbi1cdFx0LmZsYWdzXHQ9IEtWTV9QR1RBQkxFX1dBTEtfTEVBRixcbiYjNDM7XHRcdC5mbGFnc1x0PSBmbGFncyB8IEtWTV9QR1RBQkxFX1dBTEtfTEVBRixcbiBcdFx0LmFyZ1x0PSBcdTAwMjZkYXRhLFxuIFx0fTtcbiBcdGludCByZXQ7XG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vbW11LmMgYi9hcmNoL2FybTY0L2t2bS9tbXUuY1xuaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL21tdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2t2bS9tbXUuY1xuQEAgLTUsNiAmIzQzOzUsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2FjcGkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jbGVhbnVwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbWFuLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaW8uaFx1MDAzZVxuQEAgLTg2Niw3ICYjNDM7ODY3LDcgQEAgc3RhdGljIGludCBnZXRfdXNlcl9tYXBwaW5nX3NpemUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgYWRkcilcbiBcdCAqIElQSS1pbmcgdGhyZWFkcykuXG4gXHQgKi9cbiBcdGxvY2FsX2lycV9zYXZlKGZsYWdzKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCk7XG4mIzQzO1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2cGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcbiBcbiBcdGlmIChyZXQpXG5AQCAtMTU1NCw5ICYjNDM7MTU1NSw5IEBAIHN0YXRpYyB2b2lkICpnZXRfbW11X21lbWNhY2hlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0cmV0dXJuIFx1MDAyNnZjcHUtXHUwMDNlYXJjaC5wa3ZtX21lbWNhY2hlO1xuIH1cbiBcbi1zdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKm1lbWNhY2hlKVxuJiM0MztzdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB2b2lkICptZW1jYWNoZSlcbiB7XG4tXHRpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXModmNwdS1cdTAwM2VhcmNoLmh3X21tdSk7XG4mIzQzO1x0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XG4gXG4gXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuIFx0XHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XG5AQCAtMTYwMywxNSAmIzQzOzE2MDQsNDcgQEAgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHtcbiBcdHN0cnVjdCBrdm1fczJfdHJhbnNcdCpuZXN0ZWQ7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90XHQqbWVtc2xvdDtcbiBcdHVuc2lnbmVkIGxvbmdcdFx0aHZhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0ZXNyO1xuJiM0MztcdHN0cnVjdCBrdm1fczJfbW11XHQqbW11O1xuIH07XG4gXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiYjNDM7c3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbWFwcGluZ19zaXplO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9mc2NfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZWVzcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfd3JpdGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGxldmVsO1xuJiM0MztcbiYjNDM7XHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bGV2ZWwgPSBzMmZkLVx1MDAzZWVzciBcdTAwMjYgRVNSX0VMeF9GU0NfTEVWRUw7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4mIzQzO1x0XHQgICAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbiBcdGJvb2wgd3JpdGVfZmF1bHQsIGV4ZWNfZmF1bHQ7XG4tXHRib29sIHBlcm1fZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbiYjNDM7XHRib29sIHBlcm1fZmF1bHQgPSBrdm1fczJfZmF1bHRfaXNfcGVybShzMmZkKTtcbiBcdGVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncyA9IEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEO1xuIFx0ZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QgPSBLVk1fUEdUQUJMRV9QUk9UX1I7XG4tXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VwZ3Q7XG4mIzQzO1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHR1bnNpZ25lZCBsb25nIG1tdV9zZXE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG5AQCAtMTYyMiw3ICYjNDM7MTY1NSw3IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXG4gXHRpZiAoIXBlcm1fZmF1bHQpIHtcbiBcdFx0bWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSk7XG4tXHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUsIG1lbWNhY2hlKTtcbiYjNDM7XHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZW1tdSwgbWVtY2FjaGUpO1xuIFx0XHRpZiAocmV0KVxuIFx0XHRcdHJldHVybiByZXQ7XG4gXHR9XG5AQCAtMTYzMiw4ICYjNDM7MTY2NSw4IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRlbHNlXG4gXHRcdGdmbiA9IHMyZmQtXHUwMDNlZmF1bHRfaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuLVx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbiYjNDM7XHR3cml0ZV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKTtcbiYjNDM7XHRleGVjX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCk7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0Uod3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2IGV4ZWNfZmF1bHQpO1xuIFxuQEAgLTE2ODcsNyAmIzQzOzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGlmICgocHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcdTAwMjZcdTAwMjYgIXJldClcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdmbik7XG4gXG4tXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xuJiM0MztcdGlmIChyZXQgPT0gLUVBR0FJTilcbiYjNDM7XHRcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xuJiM0MztcbiYjNDM7XHRpZiAocmVzdWx0IFx1MDAyNlx1MDAyNiAhcmV0KVxuJiM0MztcdFx0cmVzdWx0LVx1MDAzZW1hcHBpbmdfc2l6ZSA9IFBBR0VfU0laRTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RydWN0IGt2bV9zMl9mYXVsdF92bWFfaW5mbyB7XG5AQCAtMTcwOSw3ICYjNDM7MTc0OCw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuIHtcbiBcdHVuc2lnbmVkIGludCBmbGFncyA9IEZPTExfSFdQT0lTT04gfCBGT0xMX0xPTkdURVJNIHwgRk9MTF9XUklURTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IHMyZmQtXHUwMDNldmNwdTtcbi1cdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gdmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VwZ3Q7XG4mIzQzO1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiBcdHZvaWQgKmh5cF9tZW1jYWNoZTtcbkBAIC0xNzE3LDcgJiM0MzsxNzU2LDcgQEAgc3RhdGljIGludCBwa3ZtX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRpbnQgcmV0O1xuIFxuIFx0aHlwX21lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZSh2Y3B1KTtcbi1cdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZSh2Y3B1LCBoeXBfbWVtY2FjaGUpO1xuJiM0MztcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZW1tdSwgaHlwX21lbWNhY2hlKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFxuQEAgLTE4NDAsMTEgJiM0MzsxODc5LDYgQEAgc3RhdGljIHNob3J0IGt2bV9zMl9yZXNvbHZlX3ZtYV9zaXplKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdHJldHVybiB2bWFfc2hpZnQ7XG4gfVxuIFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbi17XG4tXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSk7XG4tfVxuLVxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXG4ge1xuQEAgLTE5MTAsMTMgJiM0MzsxOTQ0LDExIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X3Bpbl9wZm4oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuIFx0czJ2aS1cdTAwM2VwZm4gPSBfX2t2bV9mYXVsdGluX3BmbihzMmZkLVx1MDAzZW1lbXNsb3QsIGdldF9jYW5vbmljYWxfZ2ZuKHMyZmQsIHMydmkpLFxuLVx0XHRcdFx0ICAgICAga3ZtX2lzX3dyaXRlX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSkgPyBGT0xMX1dSSVRFIDogMCxcbiYjNDM7XHRcdFx0XHQgICAgICBrdm1fczJfZmF1bHRfaXNfd3JpdGUoczJmZCkgPyBGT0xMX1dSSVRFIDogMCxcbiBcdFx0XHRcdCAgICAgIFx1MDAyNnMydmktXHUwMDNlbWFwX3dyaXRhYmxlLCBcdTAwMjZzMnZpLVx1MDAzZXBhZ2UpO1xuIFx0aWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS1cdTAwM2VwZm4pKSkge1xuLVx0XHRpZiAoczJ2aS1cdTAwM2VwZm4gPT0gS1ZNX1BGTl9FUlJfSFdQT0lTT04pIHtcbi1cdFx0XHRrdm1fc2VuZF9od3BvaXNvbl9zaWduYWwoczJmZC1cdTAwM2VodmEsIF9fZmZzKHMydmktXHUwMDNldm1hX3BhZ2VzaXplKSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbiYjNDM7XHRcdGlmIChzMnZpLVx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSFdQT0lTT047XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTE5NjgsNyAmIzQzOzIwMDAsNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG4gXG4tXHRpZiAoa3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSkgXHUwMDI2XHUwMDI2IHMydmktXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXG4mIzQzO1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuIFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHQvKlxuQEAgLTE5NzcsNyAmIzQzOzIwMDksNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIFx0ICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0XG4gXHQgKiB0aGUgZmF1bHQgYmFjayB0byB0aGUgZ3Vlc3QuXG4gXHQgKi9cbi1cdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC1cdTAwM2V2Y3B1KSkpIHtcbiYjNDM7XHRpZiAoZXNyX2ZzY19pc19leGNsX2F0b21pY19mYXVsdChzMmZkLVx1MDAzZWVzcikpIHtcbiBcdFx0a3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtXHUwMDNldmNwdSwga3ZtX3ZjcHVfZ2V0X2hmYXIoczJmZC1cdTAwM2V2Y3B1KSk7XG4gXHRcdHJldHVybiAxO1xuIFx0fVxuQEAgLTE5ODYsMTMgJiM0MzsyMDE4LDEzIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfd3JpdGFibGUgXHUwMDI2XHUwMDI2IChzMnZpLVx1MDAzZWRldmljZSB8fFxuIFx0XHRcdFx0ICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4tXHRcdFx0XHQgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSkpXG4mIzQzO1x0XHRcdFx0ICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpKSlcbiBcdFx0KnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9XO1xuIFxuIFx0aWYgKHMyZmQtXHUwMDNlbmVzdGVkKVxuIFx0XHQqcHJvdCA9IGFkanVzdF9uZXN0ZWRfZmF1bHRfcGVybXMoczJmZC1cdTAwM2VuZXN0ZWQsICpwcm90KTtcbiBcbi1cdGlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSlcbiYjNDM7XHRpZiAoa3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCkpXG4gXHRcdCpwcm90IHw9IEtWTV9QR1RBQkxFX1BST1RfWDtcbiBcbiBcdGlmIChzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuQEAgLTIwMTYsNyAmIzQzOzIwNDgsOCBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksXG4gXHRcdFx0ICAgIGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90LFxuLVx0XHRcdCAgICB2b2lkICptZW1jYWNoZSlcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKm1lbWNhY2hlLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdClcbiB7XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcbiBcdGJvb2wgd3JpdGFibGUgPSBwcm90IFx1MDAyNiBLVk1fUEdUQUJMRV9QUk9UX1c7XG5AQCAtMjAyOSwxMyAmIzQzOzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdGludCByZXQ7XG4gXG4gXHRrdm1fZmF1bHRfbG9jayhrdm0pO1xuLVx0cGd0ID0gczJmZC1cdTAwM2V2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXBndDtcbiYjNDM7XHRwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRyZXQgPSAtRUFHQUlOO1xuIFx0aWYgKG1tdV9pbnZhbGlkYXRlX3JldHJ5KGt2bSwgczJ2aS1cdTAwM2VtbXVfc2VxKSlcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFxuLVx0cGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID9cbi1cdFx0XHQgICAgICBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZC1cdTAwM2V2Y3B1KSA6IDApO1xuJiM0MztcdHBlcm1fZmF1bHRfZ3JhbnVsZSA9IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZCk7XG4gXHRtYXBwaW5nX3NpemUgPSBzMnZpLVx1MDAzZXZtYV9wYWdlc2l6ZTtcbiBcdHBmbiA9IHMydmktXHUwMDNlcGZuO1xuIFx0Z2ZuID0gczJ2aS1cdTAwM2VnZm47XG5AQCAtMjA5NiwxNCAmIzQzOzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdwYV90b19nZm4oaXBhKSk7XG4gXHR9XG4gXG4tXHRpZiAocmV0ICE9IC1FQUdBSU4pXG4tXHRcdHJldHVybiByZXQ7XG4tXHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAocmV0ID09IC1FQUdBSU4pXG4mIzQzO1x0XHRyZXR1cm4gcmVzdWx0ID8gcmV0IDogMDtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlc3VsdCBcdTAwMjZcdTAwMjYgIXJldClcbiYjNDM7XHRcdHJlc3VsdC1cdTAwM2VtYXBwaW5nX3NpemUgPSBtYXBwaW5nX3NpemU7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuJiM0MztzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuJiM0MztcdGJvb2wgcGVybV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpO1xuIFx0c3RydWN0IGt2bV9zMl9mYXVsdF92bWFfaW5mbyBzMnZpID0ge307XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3Byb3QgcHJvdDtcbiBcdHZvaWQgKm1lbWNhY2hlO1xuQEAgLTIxMjEsNyAmIzQzOzIxNTgsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdG1lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUpO1xuIFx0aWYgKCFwZXJtX2ZhdWx0IHx8IG1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4gXHQgICAgaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpIHtcbi1cdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSwgbWVtY2FjaGUpO1xuJiM0MztcdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNlbW11LCBtZW1jYWNoZSk7XG4gXHRcdGlmIChyZXQpXG4gXHRcdFx0cmV0dXJuIHJldDtcbiBcdH1cbkBAIC0yMTMxLDYgJiM0MzsyMTY4LDEzIEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuIFx0ICogZ2V0IGJsb2NrIG1hcHBpbmcgZm9yIGRldmljZSBNTUlPIHJlZ2lvbi5cbiBcdCAqL1xuIFx0cmV0ID0ga3ZtX3MyX2ZhdWx0X3Bpbl9wZm4oczJmZCwgXHUwMDI2czJ2aSk7XG4mIzQzO1x0aWYgKHJldCA9PSAtRUhXUE9JU09OKSB7XG4mIzQzO1x0XHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cbiYjNDM7XHRcdGlmIChyZXN1bHQpXG4mIzQzO1x0XHRcdHJldHVybiAtRUhXUE9JU09OO1xuJiM0MztcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLnZtYV9wYWdlc2l6ZSkpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuIFx0aWYgKHJldCAhPSAxKVxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuQEAgLTIxNDAsNyAmIzQzOzIxODQsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdH1cbiBcbi1cdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlKTtcbiYjNDM7XHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcdTAwMjZzMnZpLCBwcm90LCBtZW1jYWNoZSwgcmVzdWx0KTtcbiB9XG4gXG4gLyogUmVzb2x2ZSB0aGUgYWNjZXNzIGZhdWx0IGJ5IG1ha2luZyB0aGUgcGFnZSB5b3VuZyBhZ2Fpbi4gKi9cbkBAIC0yMjUwLDcgJiM0MzsyMjk0LDggQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuIFx0c3RydWN0IGt2bV9zMl90cmFucyBuZXN0ZWRfdHJhbnMsICpuZXN0ZWQgPSBOVUxMO1xuLVx0dW5zaWduZWQgbG9uZyBlc3I7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuJiM0MztcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LVx1MDAzZWFyY2guaHdfbW11O1xuIFx0cGh5c19hZGRyX3QgZmF1bHRfaXBhOyAvKiBUaGUgYWRkcmVzcyB3ZSBmYXVsdGVkIG9uICovXG4gXHRwaHlzX2FkZHJfdCBpcGE7IC8qIEFsd2F5cyB0aGUgSVBBIGluIHRoZSBMMSBndWVzdCBwaHlzIHNwYWNlICovXG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90O1xuQEAgLTIyNTksMTEgJiM0MzsyMzA0LDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0Z2ZuX3QgZ2ZuO1xuIFx0aW50IHJldCwgaWR4O1xuIFxuLVx0aWYgKGt2bV92Y3B1X2FidF9pc3NlYSh2Y3B1KSlcbiYjNDM7XHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcbiBcdFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xuIFxuLVx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcbi1cbiBcdC8qXG4gXHQgKiBUaGUgZmF1bHQgSVBBIHNob3VsZCBiZSByZWxpYWJsZSBhdCB0aGlzIHBvaW50IGFzIHdlJiMzOTtyZSBub3QgZGVhbGluZ1xuIFx0ICogd2l0aCBhbiBTRUEuXG5AQCAtMjI3Miw3ICYjNDM7MjMxNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdGlmIChLVk1fQlVHX09OKGlwYSA9PSBJTlZBTElEX0dQQSwgdmNwdS1cdTAwM2Vrdm0pKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbi1cdGlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7XG4mIzQzO1x0aXNfaWFidCA9IGVzcl90cmFwX2lzX2lhYnQoZXNyKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGVzcikpIHtcbiBcdFx0LyogQmV5b25kIHNhbml0aXNlZCBQQVJhbmdlICh3aGljaCBpcyB0aGUgSVBBIGxpbWl0KSAqL1xuQEAgLTIyODIsMTQgJiM0MzsyMzI1LDE0IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0fVxuIFxuIFx0XHQvKiBGYWxscyBiZXR3ZWVuIHRoZSBJUEEgcmFuZ2UgYW5kIHRoZSBQQVJhbmdlPyAqL1xuLVx0XHRpZiAoZmF1bHRfaXBhIFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2V2dGNyKSkpIHtcbiYjNDM7XHRcdGlmIChmYXVsdF9pcGEgXHUwMDNlPSBCSVRfVUxMKFZUQ1JfRUwyX0lQQShtbXUtXHUwMDNldnRjcikpKSB7XG4gXHRcdFx0ZmF1bHRfaXBhIHw9IEZBUl9UT19GSVBBX09GRlNFVChrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7XG4gXG4gXHRcdFx0cmV0dXJuIGt2bV9pbmplY3Rfc2VhKHZjcHUsIGlzX2lhYnQsIGZhdWx0X2lwYSk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdHRyYWNlX2t2bV9ndWVzdF9mYXVsdCgqdmNwdV9wYyh2Y3B1KSwga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSxcbiYjNDM7XHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcbiBcdFx0XHQgICAgICBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwgZmF1bHRfaXBhKTtcbiBcbiBcdC8qIENoZWNrIHRoZSBzdGFnZS0yIGZhdWx0IGlzIHRyYW5zLiBmYXVsdCBvciB3cml0ZSBmYXVsdCAqL1xuQEAgLTIyOTgsOSAmIzQzOzIzNDEsOSBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHQgICAgIWVzcl9mc2NfaXNfYWNjZXNzX2ZsYWdfZmF1bHQoZXNyKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAhZXNyX2ZzY19pc19leGNsX2F0b21pY19mYXVsdChlc3IpKSB7XG4gXHRcdGt2bV9lcnIoXCYjMzQ7VW5zdXBwb3J0ZWQgRlNDOiBFQz0lI3ggeEZTQz0lI2x4IEVTUl9FTDI9JSNseFxcblwmIzM0Oyxcbi1cdFx0XHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiYjNDM7XHRcdFx0ZXNyX2dldF9lYyhlc3IpLFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZykoZXNyIFx1MDAyNiBFU1JfRUx4X0ZTQyksXG4mIzQzO1x0XHRcdCh1bnNpZ25lZCBsb25nKWVzcik7XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTIzMTksOCAmIzQzOzIzNjIsOCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHQgKiBub3RoaW5nIHRvIHdhbGsgYW5kIHdlIHRyZWF0IGl0IGFzIGEgMToxIGJlZm9yZSBnb2luZyB0aHJvdWdoIHRoZVxuIFx0ICogY2Fub25pY2FsIHRyYW5zbGF0aW9uLlxuIFx0ICovXG4tXHRpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS1cdTAwM2Vrdm0sdmNwdS1cdTAwM2VhcmNoLmh3X21tdSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgdmNwdS1cdTAwM2VhcmNoLmh3X21tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiYjNDM7XHRpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS1cdTAwM2Vrdm0sIG1tdSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIG1tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiBcdFx0dTMyIGVzcjtcbiBcbiBcdFx0cmV0ID0ga3ZtX3dhbGtfbmVzdGVkX3MyKHZjcHUsIGZhdWx0X2lwYSwgXHUwMDI2bmVzdGVkX3RyYW5zKTtcbkBAIC0yMzQ5LDcgJiM0MzsyMzkyLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0Z2ZuID0gaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtXHUwMDNla3ZtLCBnZm4pO1xuIFx0aHZhID0gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3QobWVtc2xvdCwgZ2ZuLCBcdTAwMjZ3cml0YWJsZSk7XG4tXHR3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdCh2Y3B1KTtcbiYjNDM7XHR3cml0ZV9mYXVsdCA9IGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoZXNyKTtcbiBcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgfHwgKHdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNiAhd3JpdGFibGUpKSB7XG4gXHRcdC8qXG4gXHRcdCAqIFRoZSBndWVzdCBoYXMgcHV0IGVpdGhlciBpdHMgaW5zdHJ1Y3Rpb25zIG9yIGl0cyBwYWdlLXRhYmxlc1xuQEAgLTIzNjIsNyAmIzQzOzI0MDUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbiYjNDM7XHRcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0XHRyZXQgPSBrdm1faW5qZWN0X3NlYV9kYWJ0KHZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpKTtcbiBcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXHRcdH1cbkBAIC0yMzc3LDcgJiM0MzsyNDIwLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQgKiBTbyBsZXQmIzM5O3MgYXNzdW1lIHRoYXQgdGhlIGd1ZXN0IGlzIGp1c3QgYmVpbmdcbiBcdFx0ICogY2F1dGlvdXMsIGFuZCBza2lwIHRoZSBpbnN0cnVjdGlvbi5cbiBcdFx0ICovXG4tXHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcbiYjNDM7XHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGVzcl9kYWJ0X2lzX2NtKGVzcikpIHtcbiBcdFx0XHRrdm1faW5jcl9wYyh2Y3B1KTtcbiBcdFx0XHRyZXQgPSAxO1xuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbkBAIC0yMzk1LDcgJiM0MzsyNDM4LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0fVxuIFxuIFx0LyogVXNlcnNwYWNlIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWdpc3RlciBvdXQtb2YtYm91bmRzIElQQXMgKi9cbi1cdFZNX0JVR19PTihpcGEgXHUwMDNlPSBrdm1fcGh5c19zaXplKHZjcHUtXHUwMDNlYXJjaC5od19tbXUpKTtcbiYjNDM7XHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcbiBcdFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xuQEAgLTI0MDksMTkgJiM0MzsyNDUyLDIwIEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0Lm5lc3RlZFx0XHQ9IG5lc3RlZCxcbiBcdFx0Lm1lbXNsb3RcdD0gbWVtc2xvdCxcbiBcdFx0Lmh2YVx0XHQ9IGh2YSxcbiYjNDM7XHRcdC5lc3JcdFx0PSBlc3IsXG4mIzQzO1x0XHQubW11XHRcdD0gbW11LFxuIFx0fTtcbiBcbiBcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXHUwMDNla3ZtKSkge1xuIFx0XHRyZXQgPSBwa3ZtX21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbiBcdH0gZWxzZSB7XG4tXHRcdFZNX1dBUk5fT05fT05DRShrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcbiYjNDM7XHRcdFZNX1dBUk5fT05fT05DRShrdm1fczJfZmF1bHRfaXNfcGVybShcdTAwMjZzMmZkKSBcdTAwMjZcdTAwMjYgIXdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHRcdCFrdm1fczJfZmF1bHRfaXNfZXhlYyhcdTAwMjZzMmZkKSk7XG4gXG4gXHRcdGlmIChrdm1fc2xvdF9oYXNfZ21lbShtZW1zbG90KSlcbi1cdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQpO1xuJiM0MztcdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0XHRlbHNlXG4tXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCk7XG4mIzQzO1x0XHRcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0fVxuIFxuIFx0aWYgKHJldCA9PSAwKVxuQEAgLTI3OTIsMyAmIzQzOzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpXG4gXG4gXHR0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpO1xuIH1cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyeSB0byB3YWxrIHRvIHRoZSBzcGVjaWZpZWQgR1BBIGluIGNhbm9uaWNhbCBtbXUgLSBpZiB1bm1hcHBlZCByZXR1cm5zIDAsIGlmXG4mIzQzOyAqIG1hcHBlZCByZXR1cm5zIHRoZSBncmFudWxlIHNpemUsIG90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGxvbmcga3ZtX3dhbGtfczIoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsXG4mIzQzO1x0XHRcdGdwYV90IGdwYSwgczggKmxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bSAqa3ZtID0ga3ZtX3MyX21tdV90b19rdm0ocGd0LVx1MDAzZW1tdSk7XG4mIzQzO1x0a3ZtX3B0ZV90IHB0ZTtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0Z3VhcmQocmVhZF9sb2NrKShcdTAwMjZrdm0tXHUwMDNlbW11X2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihwZ3QsIGdwYSwgXHUwMDI2cHRlLCBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXG4mIzQzO1x0aWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRyZXR1cm4ga3ZtX2dyYW51bGVfc2l6ZSgqbGV2ZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBTeW50aGVzaXNlZCBkYXRhIGFib3J0IGF0IHNwZWNpZmllZCBwYWdlIHRhYmxlIGxldmVsLiAqL1xuJiM0MzsjZGVmaW5lIFBSRV9GQVVMVF9FU1IobGV2ZWwpXHRcdFx0XHRcXFxuJiM0MztcdCAoKEVTUl9FTHhfRUNfREFCVF9MT1cgXHUwMDNjXHUwMDNjIEVTUl9FTHhfRUNfU0hJRlQpIHxcdFxcXG4mIzQzO1x0ICBFU1JfRUx4X0lMIHwgRVNSX0VMeF9GU0NfRkFVTFRfTChsZXZlbCkpXG4mIzQzO1xuJiM0MzsvKiBSZXRyaWV2ZSBlaXRoZXIgYSByZWFkLW9ubHkgb3IgYSByZWFkL3dyaXRlIGh2YS4gKi9cbiYjNDM7c3RhdGljIGh2YV90IGdmbl90b19odmFfbWVtc2xvdF9yZWFkKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIGdmbl90IGdmbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChzbG90LCBnZm4sIC8qd3JpdGFibGU9Ki9OVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvbmcgX19wcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuJiM0MztcdFx0XHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgYm9vbCBpc19nbWVtID0ga3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCk7XG4mIzQzO1x0Y29uc3QgZ2ZuX3QgZ2ZuID0gZ3BhX3RvX2dmbihncGEpO1xuJiM0MztcdGNvbnN0IGh2YV90IGh2YSA9IGlzX2dtZW0gPyAwIDogZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQobWVtc2xvdCwgZ2ZuKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgczJmZCA9IHtcbiYjNDM7XHRcdC52Y3B1XHRcdD0gdmNwdSxcbiYjNDM7XHRcdC5mYXVsdF9pcGFcdD0gZ3BhLFxuJiM0MztcdFx0Lm5lc3RlZFx0XHQ9IE5VTEwsXG4mIzQzO1x0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuJiM0MztcdFx0Lmh2YVx0XHQ9IGh2YSxcbiYjNDM7XHRcdC5lc3JcdFx0PSBQUkVfRkFVTFRfRVNSKGxldmVsKSxcbiYjNDM7XHRcdC5tbXVcdFx0PSBtbXUsXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCByZXN1bHQgPSB7fTtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRpZiAoaXNfZ21lbSlcbiYjNDM7XHRcdHJldCA9IGdtZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRyZXQgPSB1c2VyX21lbV9hYm9ydChcdTAwMjZzMmZkLCBcdTAwMjZyZXN1bHQpO1xuJiM0MztcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIHJlc3VsdC5tYXBwaW5nX3NpemU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb25nIHByZV9mYXVsdF9zMihzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG4mIzQzO1x0XHRcdCBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpXG4mIzQzO3tcbiYjNDM7XHRzOCBsZXZlbDtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IGEgd2FsayBmaXJzdC4gKi9cbiYjNDM7XHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXHUwMDNlcGd0LCBncGEsIFx1MDAyNmxldmVsKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xuJiM0MztcdHJldHVybiBfX3ByZV9mYXVsdF9zMihtbXUsIHZjcHUsIGdwYSwgbWVtc2xvdCwgbGV2ZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZ1xuJiM0MztwcmVfZmF1bHRfYnl0ZXNfY29uc3VtZWQoZ3BhX3QgZ3BhLCB1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZSxcbiYjNDM7XHRcdFx0IHVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVtYWluaW5nKVxuJiM0Mzt7XG4mIzQzO1x0LyogR3JhbnVsZXMgYXJlIGFsd2F5cyBhIHBvd2VyLW9mLTIuICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XG4mIzQzO1x0XHRncmFudWxlX3NpemUgLSAoZ3BhICUgZ3JhbnVsZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXG4mIzQzOyNkZWZpbmUgTUFYX1BSRV9GQVVMVF9SRVRSSUVTIDNcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkgLSBwcmUtZmF1bHQgc3RhZ2UtMiBwYWdlIHRhYmxlcyBmb3IgdGhlXG4mIzQzOyAqIHNwZWNpZmllZCBHUEEuXG4mIzQzOyAqIEB2Y3B1Olx0VGhlIFZDUFUgcG9pbnRlclxuJiM0MzsgKiBAcmFuZ2U6XHR7Z3BhLCBzaXplLCBmbGFnc30gdHVwbGVcbiYjNDM7ICpcbiYjNDM7ICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5XG4mIzQzOyAqIHJhY2V5LiBUaGUgcmFuZ2VzIGZhdWx0ZWQgaW4gYXJlIGNhbm9uaWNhbCwgbmVzdGVkIHBhZ2UgdGFibGVzIGFyZSBpZ25vcmVkLlxuJiM0MzsgKlxuJiM0MzsgKiBAcmFuZ2UtXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVx1MDAzZXNpemUgc3BlY2lmaWVzIGhvdyBtYW55XG4mIzQzOyAqIGJ5dGVzIHJlbWFpbiB0byBiZSBwcmUtZmF1bHRlZCBhbmQgQHJhbmdlLVx1MDAzZWZsYWdzIGlzIHJlc2VydmVkIGFuZCBtdXN0IGJlIDAuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuXG4mIzQzOyAqL1xuJiM0Mztsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiYjNDM7XHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXHUwMDNlc2l6ZTtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11ID0gXHUwMDI2a3ZtLVx1MDAzZWFyY2gubW11OyAvKiBDYW5vbmljYWwuICovXG4mIzQzO1x0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDtcbiYjNDM7XHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cdTAwM2VncGE7XG4mIzQzO1x0aW50IG51bV9yZXRyaWVzID0gMDtcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBwS1ZNIGlzIHVuc3VwcG9ydGVkIGFzIHRoZWlyIHZDUFVzIGFyZSBpbnN0YW50aWF0ZWQgb24gZmlyc3QgcnVuIGFuZFxuJiM0MztcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRtZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBncGFfdG9fZ2ZuKGdwYSkpO1xuJiM0MztcdGlmICghbWVtc2xvdClcbiYjNDM7XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdC8qIFNSQ1UgbXVzdCBiZSByZWxlYXNlZCBmb3IgcHJvZ3Jlc3MgYW5kIG9ubHkgdXNlcmxhbmQgY2FuIGRvIHRoYXQuICovXG4mIzQzO1x0aWYgKG1lbXNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXG4mIzQzO1x0XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0cmV0ID0gcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90KTtcbiYjNDM7XHR9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiBcdTAwMjZcdTAwMjYgbnVtX3JldHJpZXMmIzQzOyYjNDM7IFx1MDAzYyBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMpO1xuJiM0MztcbiYjNDM7XHRpZiAoSVNfRVJSX1ZBTFVFKHJldCkpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdHJldHVybiBwcmVfZmF1bHRfYnl0ZXNfY29uc3VtZWQoZ3BhLCByZXQsIGJ5dGVzX3JlbWFpbmluZyk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5pbmRleCAxNzEyM2YwYjZkYWJhLi4zNDg4ZDVhZDIyNWI2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5AQCAtNjU0LDcgJiM0Mzs2NTQsNyBAQCBzdGF0aWMgdTggZ2V0X2d1ZXN0X21hcHBpbmdfdHRsKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHU2NCBhZGRyKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiBcdHRtcCBcdTAwMjY9IH4oc3ogLSAxKTtcbi1cdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXHUwMDNlcGd0LCB0bXAsIFx1MDAyNnB0ZSwgTlVMTCkpXG4mIzQzO1x0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cdTAwM2VwZ3QsIHRtcCwgXHUwMDI2cHRlLCBOVUxMLCAwKSlcbiBcdFx0Z290byBhZ2FpbjtcbiBcdGlmICghKHB0ZSBcdTAwMjYgUFRFX1ZBTElEKSlcbiBcdFx0Z290byBhZ2FpbjtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxuaW5kZXggNWY4ZDE3ZWU1ZjY3Ny4uMWUwZWRkMGY5OWY3NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbkBAIC0xNzMsNiAmIzQzOzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9kZWJ1Zy1leGNlcHRpb25zXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L2hlbGxvX2VsMlxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9ob3N0X3N2ZVxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9oeXBlcmNhbGxzXG4mIzQzO1RFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvZXh0ZXJuYWxfYWJvcnRzXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L21taW9fc2lnbl9leHRcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvcGFnZV9mYXVsdF90ZXN0XG5AQCAtMTk5LDYgJiM0MzsyMDAsNyBAQCBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gZ3Vlc3RfbWVtZmRfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gcnNlcV90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHN0ZWFsX3RpbWVcbiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHByZV9mYXVsdF9tZW1vcnlfdGVzdFxuIFxuIFRFU1RfR0VOX1BST0dTX3MzOTAgPSAkKFRFU1RfR0VOX1BST0dTX0NPTU1PTilcbiBURVNUX0dFTl9QUk9HU19zMzkwICYjNDM7PSBzMzkwL21lbW9wXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMDljMWRiMzAzODU2NlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSwxNTggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKlxuJiM0MzsgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxuJiM0MzsgKiBsYXN0LXJ1biBjb250ZXh0IGlzIG5lc3RlZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxuJiM0MzsgKiByZWFsIEVMMSByZWdpc3RlcnMgdGhlbiBFUkVUcyB0byB2RUwxIGFuZCBleGl0cyB0byB1c2Vyc3BhY2Ugc28gaXRzIHZDUFVcbiYjNDM7ICogbGFzdC1ydW4gY29udGV4dCBpcyBuZXN0ZWQgYmFja2VkIGJ5IGEgc2hhZG93IHN0YWdlIDIgTU1VLlxuJiM0MzsgKlxuJiM0MzsgKiBBc3NlcnQgdGhhdCBwcmUtZmF1bHRpbmcgaWdub3JlcyB0aGF0IGFuZCB0YXJnZXRzIHRoZSBjYW5vbmljYWwgc3RhZ2UtMlxuJiM0MzsgKiBwYWdlIHRhYmxlcyBvbmx5LlxuJiM0MzsgKi9cbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtwcm9jZXNzb3IuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt0ZXN0X3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1Y2FsbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vc3lzcmVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBURVNUX01FTV9TTE9UXHRcdDEwXG4mIzQzOyNkZWZpbmUgVEVTVF9NRU1fU0laRVx0XHRTWl8yTVxuJiM0MzsjZGVmaW5lIFRFU1RfTUVNX0dQQVx0XHRTWl8xR1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBvZmZzZXQ7XG4mIzQzO1xuJiM0MztcdEdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAxKTtcbiYjNDM7XG4mIzQzO1x0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXG4mIzQzO1x0R1VFU1RfU1lOQygxKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3dcbiYjNDM7XHQgKiBzdGFnZS0yIGlzIGEgMToxIHZpZXcgb2YgdGhlIGNhbm9uaWNhbCBJUEEgc3BhY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXHUwMDNjIFRFU1RfTUVNX1NJWkU7IG9mZnNldCAmIzQzOz0gU1pfNEspXG4mIzQzO1x0XHRSRUFEX09OQ0UoKih1NjQgKikoVEVTVF9NRU1fR1BBICYjNDM7IG9mZnNldCkpO1xuJiM0MztcbiYjNDM7XHRHVUVTVF9ET05FKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGd1ZXN0X2NvZGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBzcDtcbiYjNDM7XG4mIzQzO1x0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDIpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE1pcnJvciB0aGUgRUwyIHRyYW5zbGF0aW9uIHJlZ2ltZSBpbnRvIHRoZSByZWFsIEVMMSByZWdpc3RlcnMgc29cbiYjNDM7XHQgKiB0aGF0IHZFTDEgcnVucyBvbiB0aGUgdGVzdCYjMzk7cyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcbiYjNDM7XHQgKiBfRUwxIGFjY2Vzc29ycyByZWFkIHRoZSBFTDIgcmVnaXN0ZXJzLCBhbmQgdGhlIF9FTDEyIGFjY2Vzc29yc1xuJiM0MztcdCAqIHdyaXRlIHRoZSByZWFsIEVMMSByZWdpc3RlcnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoc2N0bHJfZWwxKSwgU1lTX1NDVExSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHRjcl9lbDEpLCBTWVNfVENSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcbiYjNDM7XHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhtYWlyX2VsMSksIFNZU19NQUlSX0VMMTIpO1xuJiM0MztcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKGNwYWNyX2VsMSksIFNZU19DUEFDUl9FTDEyKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIHZFTDEgb24gdGhlIHNhbWUgc3RhY2suICovXG4mIzQzO1x0YXNtIHZvbGF0aWxlKFwmIzM0O21vdiAlMCwgc3BcJiMzNDsgOiBcJiMzNDs9clwmIzM0OyhzcCkpO1xuJiM0MztcdHdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEcm9wIFRHRSBzbyB0aGF0IHZFTDEgaXMgYSBuZXN0ZWQgY29udGV4dCByYXRoZXIgdGhhbiBob3N0IEVMMC5cbiYjNDM7XHQgKiBLVk0gYmFja3MgaXQgd2l0aCBhIHNoYWRvdyBzdGFnZS0yIE1NVSBldmVuIHRob3VnaCB2c3RhZ2UtMiBpc1xuJiM0MztcdCAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLlxuJiM0MztcdCAqL1xuJiM0MztcdHdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhoY3JfZWwyKSBcdTAwMjYgfkhDUl9FTDJfVEdFLCBoY3JfZWwyKTtcbiYjNDM7XHRpc2IoKTtcbiYjNDM7XG4mIzQzO1x0d3JpdGVfc3lzcmVnKFBTUl9NT0RFX0VMMWggfCBQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBQU1JfQV9CSVQgfFxuJiM0MztcdFx0ICAgICBQU1JfRF9CSVQsIHNwc3JfZWwyKTtcbiYjNDM7XHR3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7XG4mIzQzO1x0YXNtIHZvbGF0aWxlKFwmIzM0O2VyZXRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRHVUVTVF9BU1NFUlQoZmFsc2UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwcmVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3BhLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSByYW5nZSA9IHtcbiYjNDM7XHRcdC5ncGEgPSBncGEsXG4mIzQzO1x0XHQuc2l6ZSA9IHNpemUsXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRyZXQgPSBfX3ZjcHVfaW9jdGwodmNwdSwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIFx1MDAyNnJhbmdlKTtcbiYjNDM7XHR9IHdoaWxlICgoIXJldCBcdTAwMjZcdTAwMjYgcmFuZ2Uuc2l6ZSkgfHxcbiYjNDM7XHRcdCAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkpO1xuJiM0MztcbiYjNDM7XHRURVNUX0FTU0VSVCghcmV0LCBcJiMzNDtLVk1fUFJFX0ZBVUxUX01FTU9SWSBmYWlsZWQsIHJldDogJWQgZXJybm86ICVkXCYjMzQ7LFxuJiM0MztcdFx0ICAgIHJldCwgZXJybm8pO1xuJiM0MztcdFRFU1RfQVNTRVJUX0VRKHJhbmdlLnNpemUsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDtcbiYjNDM7XHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7XG4mIzQzO1x0c3RydWN0IGt2bV92bSAqdm07XG4mIzQzO1x0c3RydWN0IHVjYWxsIHVjO1xuJiM0MztcdHU2NCBucGFnZXM7XG4mIzQzO1xuJiM0MztcdFRFU1RfUkVRVUlSRSh0ZXN0X3N1cHBvcnRzX2VsMigpKTtcbiYjNDM7XHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiYjNDM7XG4mIzQzO1x0dm0gPSB2bV9jcmVhdGUoMSk7XG4mIzQzO1xuJiM0MztcdGt2bV9nZXRfZGVmYXVsdF92Y3B1X3RhcmdldCh2bSwgXHUwMDI2aW5pdCk7XG4mIzQzO1x0aW5pdC5mZWF0dXJlc1swXSB8PSBCSVQoS1ZNX0FSTV9WQ1BVX0hBU19FTDIpO1xuJiM0MztcdHZjcHUgPSBhYXJjaDY0X3ZjcHVfYWRkKHZtLCAwLCBcdTAwMjZpbml0LCBndWVzdF9jb2RlKTtcbiYjNDM7XHRrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7XG4mIzQzO1xuJiM0MztcdG5wYWdlcyA9IFRFU1RfTUVNX1NJWkUgLyB2bS1cdTAwM2VwYWdlX3NpemU7XG4mIzQzO1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgVEVTVF9NRU1fR1BBLFxuJiM0MztcdFx0XHRcdCAgICBURVNUX01FTV9TTE9ULCBucGFnZXMsIDApO1xuJiM0MztcdHZpcnRfbWFwKHZtLCBURVNUX01FTV9HUEEsIFRFU1RfTUVNX0dQQSwgbnBhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIHRoZSBndWVzdCB1bnRpbCBpdCBoYXMgRVJFVCYjMzk7ZCBmcm9tIHZFTDIgdG8gdkVMMS4gKi9cbiYjNDM7XHR2Y3B1X3J1bih2Y3B1KTtcbiYjNDM7XHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcdTAwMjZ1YykpIHtcbiYjNDM7XHRjYXNlIFVDQUxMX1NZTkM6XG4mIzQzO1x0XHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgVUNBTExfQUJPUlQ6XG4mIzQzO1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRURVNUX0ZBSUwoXCYjMzQ7VW5oYW5kbGVkIHVjYWxsOiAlbGRcJiMzNDssIHVjLmNtZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB2Q1BVJiMzOTtzIGxhc3QtcnVuIGNvbnRleHQgaXMgdkVMMSwgc28gaXRzIGh3X21tdSBpcyBhIHNoYWRvd1xuJiM0MztcdCAqIHN0YWdlLTIgTU1VLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogUHJlLWZhdWx0aW5nIG11c3QgaWdub3JlIHRoYXQgYW5kIHBvcHVsYXRlIHRoZSBjYW5vbmljYWwgc3RhZ2UtMi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmVfZmF1bHQodmNwdSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVzdW1lIGF0IHZFTDEgYW5kIHRvdWNoIHRoZSBwcmVmYXVsdGVkIHJhbmdlLiAqL1xuJiM0MztcdHZjcHVfcnVuKHZjcHUpO1xuJiM0MztcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuJiM0MztcdGNhc2UgVUNBTExfRE9ORTpcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgVUNBTExfQUJPUlQ6XG4mIzQzO1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRURVNUX0ZBSUwoXCYjMzQ7VW5oYW5kbGVkIHVjYWxsOiAlbGRcJiMzNDssIHVjLmNtZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrdm1fdm1fZnJlZSh2bSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbmluZGV4IGEwZmNhZTNjYjdhOGIuLjcwMmM3MmJiZmE5NjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTEyLDE5ICYjNDM7MTIsMjkgQEBcbiAjaW5jbHVkZSBcdTAwM2Nwcm9jZXNzb3IuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3VjYWxsX2NvbW1vbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2d1ZXN0X21vZGVzLmhcdTAwM2VcbiBcbiAvKiBBcmJpdHJhcmlseSBjaG9zZW4gdmFsdWVzICovXG4tI2RlZmluZSBURVNUX1NJWkVcdFx0KFNaXzJNICYjNDM7IFBBR0VfU0laRSlcbi0jZGVmaW5lIFRFU1RfTlBBR0VTXHRcdChURVNUX1NJWkUgLyBQQUdFX1NJWkUpXG4mIzQzOyNkZWZpbmUgVEVTVF9CQVNFX1NJWkVcdFx0U1pfMk1cbiAjZGVmaW5lIFRFU1RfU0xPVFx0XHQxMFxuIFxuJiM0MzsvKiBTdG9yYWdlIG9mIHRlc3QgaW5mbyB0byBzaGFyZSB3aXRoIGd1ZXN0IGNvZGUgKi9cbiYjNDM7c3RydWN0IHRlc3RfY29uZmlnIHtcbiYjNDM7XHR1NjQgcGFnZV9zaXplO1xuJiM0MztcdHU2NCB0ZXN0X3NpemU7XG4mIzQzO1x0dTY0IHRlc3RfbnVtX3BhZ2VzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB0ZXN0X2NvbmZpZyB0ZXN0X2NvbmZpZztcbiYjNDM7XG4gc3RhdGljIHZvaWQgZ3Vlc3RfY29kZSh1NjQgYmFzZV9ndmEpXG4ge1xuIFx0dm9sYXRpbGUgdTY0IHZhbCBfX3VzZWQ7XG4mIzQzO1x0c3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSBcdTAwMjZ0ZXN0X2NvbmZpZztcbiBcdGludCBpO1xuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVEVTVF9OUEFHRVM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHU2NCAqc3JjID0gKHU2NCAqKShiYXNlX2d2YSAmIzQzOyBpICogUEFHRV9TSVpFKTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb25maWctXHUwMDNldGVzdF9udW1fcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgJiM0MzsgaSAqIGNvbmZpZy1cdTAwM2VwYWdlX3NpemUpO1xuIFxuIFx0XHR2YWwgPSAqc3JjO1xuIFx0fVxuQEAgLTM2LDYgJiM0Mzs0Niw3IEBAIHN0cnVjdCBzbG90X3dvcmtlcl9kYXRhIHtcbiBcdHN0cnVjdCBrdm1fdm0gKnZtO1xuIFx0Z3BhX3QgZ3BhO1xuIFx0dTMyIGZsYWdzO1xuJiM0MztcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuIFx0Ym9vbCB3b3JrZXJfcmVhZHk7XG4gXHRib29sIHByZWZhdWx0X3JlYWR5O1xuIFx0Ym9vbCByZWNyZWF0ZV9zbG90O1xuQEAgLTU2LDE0ICYjNDM7NjcsMTYgQEAgc3RhdGljIHZvaWQgKmRlbGV0ZV9zbG90X3dvcmtlcih2b2lkICpfX2RhdGEpXG4gXHR3aGlsZSAoIVJFQURfT05DRShkYXRhLVx1MDAzZXJlY3JlYXRlX3Nsb3QpKVxuIFx0XHRjcHVfcmVsYXgoKTtcbiBcbi1cdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGRhdGEtXHUwMDNlZ3BhLFxuLVx0XHRcdFx0ICAgIFRFU1RfU0xPVCwgVEVTVF9OUEFHRVMsIGRhdGEtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgZGF0YS1cdTAwM2VtZW1fYmFja2luZ19zcmMsIGRhdGEtXHUwMDNlZ3BhLFxuJiM0MztcdFx0XHRcdCAgICBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLCBkYXRhLVx1MDAzZWZsYWdzKTtcbiBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxuLVx0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXG4mIzQzO1x0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LFxuJiM0MztcdFx0XHQgICAgIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjLFxuJiM0MztcdFx0XHQgICAgIGJvb2wgcHJpdmF0ZSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4gXHRcdC5ncGEgPSBiYXNlX2dwYSAmIzQzOyBvZmZzZXQsXG5AQCAtNzQsNiAmIzQzOzg3LDcgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdFx0LnZtID0gdmNwdS1cdTAwM2V2bSxcbiBcdFx0LmdwYSA9IGJhc2VfZ3BhLFxuIFx0XHQuZmxhZ3MgPSBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDAsXG4mIzQzO1x0XHQubWVtX2JhY2tpbmdfc3JjID0gbWVtX2JhY2tpbmdfc3JjLFxuIFx0fTtcbiBcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcbiBcdHB0aHJlYWRfdCBzbG90X3dvcmtlcjtcbkBAIC0xNTAsOCAmIzQzOzE2NCw4IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHQvKlxuIFx0ICogQXNzZXJ0IHN1Y2Nlc3MgaWYgcHJlZmF1bHRpbmcgdGhlIGVudGlyZSByYW5nZSBzaG91bGQgc3VjY2VlZCwgaS5lLlxuIFx0ICogY29tcGxldGUgd2l0aCBubyBieXRlcyByZW1haW5pbmcuICBPdGhlcndpc2UgcHJlZmF1bHRpbmcgc2hvdWxkIGhhdmVcbi1cdCAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChkdWUgdG8gUkVUX1BGX0VNVUxBVEUgZm9yIGVtdWxhdGVkIE1NSU8gd2hlblxuLVx0ICogbm8gbWVtc2xvdCBleGlzdHMpLlxuJiM0MztcdCAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChubyBtZW1zbG90IGV4aXN0cyBmb3IgdGhlIEdQQTsgb24geDg2IHRoaXNcbiYjNDM7XHQgKiBzdXJmYWNlcyB2aWEgUkVUX1BGX0VNVUxBVEUpLlxuIFx0ICovXG4gXHRpZiAoIWV4cGVjdGVkX2xlZnQpXG4gXHRcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG5AQCAtMTYwLDM5ICYjNDM7MTc0LDgyIEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHRcdFx0XHRcdCAgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKVxuJiM0MztzdHJ1Y3QgdGVzdF9wYXJhbXMge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcbiYjNDM7XHRib29sIHByaXZhdGU7XG4mIzQzO1x0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeShlbnVtIHZtX2d1ZXN0X21vZGUgZ3Vlc3RfbW9kZSwgdm9pZCAqYXJnKVxuIHtcbi1cdGdwYV90IGdwYSwgZ3ZhLCBhbGlnbm1lbnQsIGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xuJiM0MztcdGdwYV90IGJhY2tpbmdfc3JjX3BhZ2VzeiwgbWVtX3BhZ2Vfc2l6ZTtcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9wYXJhbXMgKnAgPSBhcmc7XG4gXHRjb25zdCBzdHJ1Y3Qgdm1fc2hhcGUgc2hhcGUgPSB7XG4tXHRcdC5tb2RlID0gVk1fTU9ERV9ERUZBVUxULFxuLVx0XHQudHlwZSA9IHZtX3R5cGUsXG4mIzQzO1x0XHQubW9kZSA9IGd1ZXN0X21vZGUsXG4mIzQzO1x0XHQudHlwZSA9IHAtXHUwMDNldm1fdHlwZSxcbiBcdH07XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7XG4mIzQzO1x0c3RydWN0IGt2bV9ydW4gKnJ1bjtcbiBcdHN0cnVjdCBrdm1fdm0gKnZtO1xuIFx0c3RydWN0IHVjYWxsIHVjO1xuIFxuJiM0MztcdHByX2luZm8oXCYjMzQ7VGVzdGluZyBndWVzdCBtb2RlOiAlc1xcblwmIzM0Oywgdm1fZ3Vlc3RfbW9kZV9zdHJpbmcoZ3Vlc3RfbW9kZSkpO1xuJiM0MztcdHByX2luZm8oXCYjMzQ7VGVzdGluZyBtZW1vcnkgYmFja2luZyBzcmMgdHlwZTogJXNcXG5cJiMzNDssXG4mIzQzO1x0XHR2bV9tZW1fYmFja2luZ19zcmNfYWxpYXMocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpLVx1MDAzZW5hbWUpO1xuJiM0MztcbiBcdHZtID0gdm1fY3JlYXRlX3NoYXBlX3dpdGhfb25lX3ZjcHUoc2hhcGUsIFx1MDAyNnZjcHUsIGd1ZXN0X2NvZGUpO1xuIFxuLVx0YWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7XG4tXHRncGEgPSAodm0tXHUwMDNlbWF4X2dmbiAtIFRFU1RfTlBBR0VTKSAqIGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHRndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tndWVzdF9tb2RlXS5wYWdlX3NpemU7XG4mIzQzO1x0aG9zdF9wYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuJiM0MztcdGJhY2tpbmdfc3JjX3BhZ2VzeiA9IGdldF9iYWNraW5nX3NyY19wYWdlc3oocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpO1xuJiM0MztcdG1lbV9wYWdlX3NpemUgPSBtYXgoaG9zdF9wYWdlX3NpemUsIGJhY2tpbmdfc3JjX3BhZ2Vzeik7XG4mIzQzO1xuJiM0MztcdHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSA9IGd1ZXN0X3BhZ2Vfc2l6ZTtcbiYjNDM7XHR0ZXN0X2NvbmZpZy50ZXN0X3NpemUgPSBhbGlnbl91cChURVNUX0JBU0VfU0laRSAmIzQzOyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgbWVtX3BhZ2Vfc2l6ZSk7XG4mIzQzO1x0dGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS1cdTAwM2Vtb2RlLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUpO1xuJiM0MztcbiYjNDM7XHRncGEgPSAodm0tXHUwMDNlbWF4X2dmbiAtIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzKSAqIHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZTtcbiBcdGFsaWdubWVudCA9IFNaXzJNO1xuJiM0MztcdGFsaWdubWVudCA9IG1heChhbGlnbm1lbnQsIG1lbV9wYWdlX3NpemUpO1xuIFx0Z3BhID0gYWxpZ25fZG93bihncGEsIGFsaWdubWVudCk7XG4gXHRndmEgPSBncGEgXHUwMDI2ICgoMVVMTCBcdTAwM2NcdTAwM2MgKHZtLVx1MDAzZXZhX2JpdHMgLSAxKSkgLSAxKTtcbiBcbi1cdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGdwYSwgVEVTVF9TTE9ULFxuLVx0XHRcdFx0ICAgIFRFU1RfTlBBR0VTLCBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApO1xuLVx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCBURVNUX05QQUdFUyk7XG4mIzQzO1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyxcbiYjNDM7XHRcdFx0XHQgICAgZ3BhLCBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLFxuJiM0MztcdFx0XHRcdCAgICBwLVx1MDAzZXByaXZhdGUgPyBLVk1fTUVNX0dVRVNUX01FTUZEIDogMCk7XG4mIzQzO1x0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChwLVx1MDAzZXByaXZhdGUpXG4mIzQzO1x0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSwgMCxcbiYjNDM7XHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuJiM0MztcdC8qIFJldHJ5IHRoZSBzYW1lIHJhbmdlIGFmdGVyIHRoZSBmaXJzdCBwcmVmYXVsdCBhdHRlbXB0LiAqL1xuJiM0MztcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXG4mIzQzO1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbiYjNDM7XHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSxcbiYjNDM7XHRcdFx0IHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLFxuJiM0MztcdFx0XHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuJiM0MztcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsXG4mIzQzO1x0XHRcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXG4mIzQzO1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbiBcbi1cdGlmIChwcml2YXRlKVxuLVx0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgVEVTVF9TSVpFKTtcbiYjNDM7XHR2Y3B1X2FyZ3Nfc2V0KHZjcHUsIDEsIGd2YSk7XG4gXG4tXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgU1pfMk0sIDAsIHByaXZhdGUpO1xuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFNaXzJNLCBQQUdFX1NJWkUgKiAyLCBQQUdFX1NJWkUsIHByaXZhdGUpO1xuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFRFU1RfU0laRSwgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIHByaXZhdGUpO1xuJiM0MztcdC8qIEV4cG9ydCB0aGUgc2hhcmVkIHZhcmlhYmxlcyB0byB0aGUgZ3Vlc3QuICovXG4mIzQzO1x0c3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTtcbiBcbi1cdHZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTtcbiBcdHZjcHVfcnVuKHZjcHUpO1xuIFxuJiM0MztcdHJ1biA9IHZjcHUtXHUwMDNlcnVuO1xuJiM0MztcdFRFU1RfQVNTRVJUKHJ1bi1cdTAwM2VleGl0X3JlYXNvbiA9PSBVQ0FMTF9FWElUX1JFQVNPTixcbiYjNDM7XHRcdCAgICBcJiMzNDtXYW50ZWQgJXMsIGdvdCBleGl0IHJlYXNvbjogJXUgKCVzKVwmIzM0OyxcbiYjNDM7XHRcdCAgICBleGl0X3JlYXNvbl9zdHIoVUNBTExfRVhJVF9SRUFTT04pLFxuJiM0MztcdFx0ICAgIHJ1bi1cdTAwM2VleGl0X3JlYXNvbiwgZXhpdF9yZWFzb25fc3RyKHJ1bi1cdTAwM2VleGl0X3JlYXNvbikpO1xuJiM0MztcbiBcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuIFx0Y2FzZSBVQ0FMTF9BQk9SVDpcbiBcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG5AQCAtMjA3LDI0ICYjNDM7MjY0LDYxIEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKVxuIFx0a3ZtX3ZtX2ZyZWUodm0pO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsXG4mIzQzO1x0XHRcdFx0ICBib29sIHByaXZhdGUpXG4ge1xuJiM0MztcdHN0cnVjdCB0ZXN0X3BhcmFtcyBwID0ge1xuJiM0MztcdFx0LnZtX3R5cGUgPSB2bV90eXBlLFxuJiM0MztcdFx0LnByaXZhdGUgPSBwcml2YXRlLFxuJiM0MztcdFx0Lm1lbV9iYWNraW5nX3NyYyA9IGJhY2tpbmdfc3JjLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0aWYgKHZtX3R5cGUgXHUwMDI2XHUwMDI2ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSBcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xuIFx0XHRwcl9pbmZvKFwmIzM0O1NraXBwaW5nIHRlc3RzIGZvciB2bV90eXBlIDB4JWx4XFxuXCYjMzQ7LCB2bV90eXBlKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuIFxuLVx0X190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7XG4mIzQzO1x0Zm9yX2VhY2hfZ3Vlc3RfbW9kZShfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSwgXHUwMDI2cCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSlcbiYjNDM7e1xuJiM0MztcdHB1dHMoXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRwcmludGYoXCYjMzQ7dXNhZ2U6ICVzIFstaF0gWy1tIG1vZGVdIFstcyBtZW0tdHlwZV1cXG5cJiMzNDssIG5hbWUpO1xuJiM0MztcdHB1dHMoXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRndWVzdF9tb2Rlc19oZWxwKCk7XG4mIzQzO1x0YmFja2luZ19zcmNfaGVscChcJiMzNDstc1wmIzM0Oyk7XG4mIzQzO1x0cHV0cyhcJiMzNDtcJiMzNDspO1xuIH1cbiBcbiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuIHtcbiYjNDM7XHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7aG06czpcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdGd1ZXN0X21vZGVzX2NtZGxpbmUob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7cyYjMzk7OlxuJiM0MztcdFx0XHRiYWNraW5nID0gcGFyc2VfYmFja2luZ19zcmNfdHlwZShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHRoZWxwKGFyZ3ZbMF0pO1xuJiM0MztcdFx0XHRleGl0KDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiBcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XG4mIzQzO1x0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KDAsIGJhY2tpbmcsIGZhbHNlKTtcbiAjaWZkZWYgX194ODZfNjRfX1xuLVx0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KEtWTV9YODZfU1dfUFJPVEVDVEVEX1ZNLCBmYWxzZSk7XG4tXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIHRydWUpO1xuJiM0MztcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgZmFsc2UpO1xuJiM0MztcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgdHJ1ZSk7XG4gI2VuZGlmXG4gXHRyZXR1cm4gMDtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTM6MTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA1ZWJlNDMxZmNmMTkyYTBiOTQyMjliNTRkOWZhYjUwZWQwOTZmMzhiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QKaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0CiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdApAQCAtNjQ4NSw3ICYjNDM7NjQ4NSw3IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiA6Q2FwYWJpbGl0eTogS1ZNX0NBUF9QUkVfRkFVTFRfTUVNT1JZCi06QXJjaGl0ZWN0dXJlczogbm9uZQomIzQzOzpBcmNoaXRlY3R1cmVzOiB4ODYsIHMzOTAsIGFybTY0CiA6VHlwZTogdmNwdSBpb2N0bAogOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KQogOlJldHVybnM6IDAgaWYgYXQgbGVhc3Qgb25lIHBhZ2UgaXMgcHJvY2Vzc2VkLCAmbHQ7IDAgb24gZXJyb3IKQEAgLTY0OTMsMTIgJiM0Mzs2NDkzLDE0IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KIEVycm9yczoKIAogICA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOyAgRUFHQUlOICAgICBBIHJhY2Ugb2NjdXJyZWQgYmVmb3JlIHByb2dyZXNzIHdhcyBtYWRlLCBidXQgYSByZXRyeSBtYXkgc3VjY2VlZC4KICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdAogICAgICAgICAgICAgIHBhZ2UgYWxpZ25lZCwgY2F1c2VzIGFuIG92ZXJmbG93LCBvciBzaXplIGlzIHplcm8pLCBvciB0aGUgVk0KICAgICAgICAgICAgICBpcyBVQ09OVFJPTCAoczM5MCkuCiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuCiAgIEVJTlRSICAgICAgQW4gdW5tYXNrZWQgc2lnbmFsIGlzIHBlbmRpbmcgYW5kIG5vIHBhZ2Ugd2FzIHByb2Nlc3NlZC4KICAgRUZBVUxUICAgICBUaGUgcGFyYW1ldGVyIGFkZHJlc3Mgd2FzIGludmFsaWQuCiYjNDM7ICBFSFdQT0lTT04gIEEgcG9pc29uZWQgaG9zdCBwYWdlIHdhcyBlbmNvdW50ZXJlZC4KICAgRU9QTk9UU1VQUCBNYXBwaW5nIG1lbW9yeSBmb3IgYSBHUEEgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlCiAgICAgICAgICAgICAgaHlwZXJ2aXNvciwgYW5kL29yIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlL21vZGUuCiAgIEVJTyAgICAgICAgdW5leHBlY3RlZCBlcnJvciBjb25kaXRpb25zIChhbHNvIGNhdXNlcyBhIFdBUk4pCkBAIC02NTE4LDcgJiM0Mzs2NTIwLDE3IEBAIEVycm9yczoKIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHBvcHVsYXRlcyBLVk0mIzM5O3Mgc3RhZ2UtMiBwYWdlIHRhYmxlcyB1c2VkIHRvIG1hcCBtZW1vcnkKIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhCiBzdGFnZS0yIHJlYWQgcGFnZSBmYXVsdCwgZS5nLiBmYXVsdHMgaW4gbWVtb3J5IGFzIG5lZWRlZCwgYnV0IGRvZXNuJiMzOTt0IGJyZWFrCi1Db1cuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzIEFjY2Vzc2VkLgomIzQzO0NvVy4gIE9uIGFybTY0LCBLVk0gbWFya3MgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURXMgYXMgQWNjZXNzZWQsIGFzIGl0CiYjNDM7ZG9lcyBmb3IgYW55IHN0YWdlLTIgZmF1bHQsIGJ1dCBsZWF2ZXMgdGhlIEFjY2Vzc2VkIHN0YXRlIG9mIGV4aXN0aW5nIFBURXMKJiM0Mzt1bmNoYW5nZWQuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzCiYjNDM7QWNjZXNzZWQsIGFuZCBmb3IgczM5MCBpdCBpcyBub3QgYXBwbGljYWJsZS4KJiM0MzsKJiM0MztPbiBhcm02NCwgYSBHUEEgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gSVBBLCBhbmQgbmV2ZXIgaW50ZXJwcmV0ZWQgYXMgdGhlIElQQQomIzQzO29mIGEgbmVzdGVkIGd1ZXN0LiBQcmUtZmF1bHRpbmcgb25seSBwb3B1bGF0ZXMgY2Fub25pY2FsIHN0YWdlIDIgcGFnZQomIzQzO3RhYmxlcy4KJiM0MzsKJiM0MztUaGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFybTY0IGlmIHRoZSBwcm90ZWN0ZWQgS1ZNIChwS1ZNKSBmZWF0dXJlCiYjNDM7aXMgZW5hYmxlZC4KIAogSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mCiBwcml2YXRlIGd1ZXN0IG1lbW9yeSBiZWZvcmUgdGhlIGd1ZXN0IGlzICYjMzk7ZmluYWxpemVkJiMzOTsvbWVhc3VyZWQsIHRoaXMgaW9jdGwKQEAgLTY1MzMsNyAmIzQzOzY1NDUsNyBAQCBXaGVuIHRoZSBpb2N0bCByZXR1cm5zLCB0aGUgaW5wdXQgdmFsdWVzIGFyZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZQogcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgICZndDsgMCBvbiByZXR1cm4sIHRoZSBjYWxsZXIgY2FuIGp1c3QgaXNzdWUKIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LgogCi1TaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXkKJiM0MztPbiB4ODYsIHNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleQogYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLgogQ2FsbGluZyB0aGlzIGlvY3RsIHdoZW4gdGhlIGd1ZXN0IGlzIHVzaW5nIHNoYWRvdyBwYWdlIHRhYmxlcyAoZm9yCiBleGFtcGxlIGJlY2F1c2UgaXQgaXMgcnVubmluZyBhIG5lc3RlZCBndWVzdCB3aXRoIG5lc3RlZCBwYWdlIHRhYmxlcykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCmluZGV4IGY4MTZmNWQ3N2YxYTUuLjljMDIwNTk4M2Q5YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaApAQCAtNDM3LDYgJiM0Mzs0MzcsNTAgQEAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogI2luY2x1ZGUgJmx0O2FzbS90eXBlcy5oJmd0OwogCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBlc3JfZ2V0X2VjKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIEVTUl9FTHhfRUMoZXNyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl90cmFwX2lzX2lhYnQodW5zaWduZWQgbG9uZyBlc3IpCiYjNDM7ewomIzQzOwlyZXR1cm4gZXNyX2dldF9lYyhlc3IpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3MxcHR3KHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X1MxUFRXOwomIzQzO30KJiM0MzsKJiM0MzsvKiBBbHdheXMgY2hlY2sgZm9yIFMxUFRXICpiZWZvcmUqIHVzaW5nIHRoaXMuICovCiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX3dyaXRlKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X1dOUjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl9kYWJ0X2lzX2NtKHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzciAmYW1wOyBFU1JfRUx4X0NNOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19leGVjX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoZXNyKSAmYW1wOyZhbXA7ICFlc3JfYWJ0X2lzX3MxcHR3KGVzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3NlYSh1bnNpZ25lZCBsb25nIGVzcikKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoZXNyICZhbXA7IEVTUl9FTHhfRlNDKSB7CiYjNDM7CWNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOgomIzQzOwljYXNlIEVTUl9FTHhfRlNDX1NFQV9UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUFfVFRXKDMpOgomIzQzOwljYXNlIEVTUl9FTHhfRlNDX1NFQ0M6CiYjNDM7CWNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKToKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGVzcl9icmtfY29tbWVudCh1bnNpZ25lZCBsb25nIGVzcikKIHsKIAlyZXR1cm4gZXNyICZhbXA7IEVTUl9FTHhfQlJLNjRfSVNTX0NPTU1FTlRfTUFTSzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAppbmRleCBhM2MxOTI4YmRmNzQzLi5hM2IyNzIyNjU1NTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC00MTEsMTggJiM0Mzs0MTEsMTMgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfcmQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzczF0dyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuICEhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkgJmFtcDsgRVNSX0VMeF9TMVBUVyk7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX3MxcHR3KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiAvKiBBbHdheXMgY2hlY2sgZm9yIFMxUFRXICpiZWZvcmUqIHVzaW5nIHRoaXMuICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlyZXR1cm4ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSAmYW1wOyBFU1JfRUx4X1dOUjsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpICZhbXA7IEVTUl9FTHhfQ00pOwomIzQzOwlyZXR1cm4gZXNyX2RhYnRfaXNfd3JpdGUoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGt2bV92Y3B1X2RhYnRfZ2V0X2FzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQzOCwxNyAmIzQzOzQzMywxMiBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pbF9pczMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlyZXR1cm4gRVNSX0VMeF9FQyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTsKJiM0MzsJcmV0dXJuIGVzcl9nZXRfZWMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2lhYnQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXJldHVybiBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpICZhbXA7JmFtcDsgIWt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSk7CiYjNDM7CXJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ2OCwyNiAmIzQzOzQ1OCw5IEBAIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc190cmFuc2xhdGlvbl9mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJcmV0dXJuIGVzcl9mc2NfaXNfdHJhbnNsYXRpb25fZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUKLXU2NCBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVuc2lnbmVkIGxvbmcgZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTsKLQotCUJVR19PTighZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcikpOwotCXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChlc3IgJmFtcDsgRVNSX0VMeF9GU0NfTEVWRUwpKTsKLX0KLQogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3NlYShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3dpdGNoIChrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSkgewotCWNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOgotCWNhc2UgRVNSX0VMeF9GU0NfU0VBX1RUVygtMSkgLi4uIEVTUl9FTHhfRlNDX1NFQV9UVFcoMyk6Ci0JY2FzZSBFU1JfRUx4X0ZTQ19TRUNDOgotCWNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKToKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KJiM0MzsJcmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ5Niw5ICYjNDM7NDY5LDkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfc3lzX2dldF9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJcmV0dXJuIEVTUl9FTHhfU1lTNjRfSVNTX1JUKGVzcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKQogewotCWlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7CiYjNDM7CWlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHsKIAkJLyoKIAkJICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmUKIAkJICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkCkBAIC01MTEsMTMgJiM0Mzs0ODQsMTggQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCSAqIGZpcnN0KSwgdGhlbiBhIHBlcm1pc3Npb24gZmF1bHQgdG8gYWxsb3cgdGhlIGZsYWdzCiAJCSAqIHRvIGJlIHNldC4KIAkJICovCi0JCXJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSk7CiYjNDM7CQlyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcik7CiAJfQogCi0JaWYgKGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSkKJiM0MzsJaWYgKGVzcl90cmFwX2lzX2lhYnQoZXNyKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIGt2bV92Y3B1X2RhYnRfaXN3cml0ZSh2Y3B1KTsKJiM0MzsJcmV0dXJuIGVzcl9kYWJ0X2lzX3dyaXRlKGVzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3sKJiM0MzsJcmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdm1fdmNwdV9nZXRfbXBpZHJfYWZmKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaAppbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oCkBAIC04NTksNiAmIzQzOzg1OSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsCiAgKiBAYWRkcjoJSW5wdXQgYWRkcmVzcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSB3YWxrLgogICogQHB0ZXA6CVBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHJpZXZlZCBQVEUuCiAgKiBAbGV2ZWw6CVBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGxldmVsIG9mIHRoZSByZXRyaWV2ZWQgUFRFLgomIzQzOyAqIEBmbGFnczoJRmxhZ3MgdG8gY29udHJvbCB0aGUgcGFnZS10YWJsZSB3YWxrCiYjNDM7ICoJCShzZWUgc3RydWN0IGt2bV9wZ3RhYmxlX3Zpc2l0X2N0eCkuCiAgKgogICogVGhlIG9mZnNldCBvZiBAYWRkciB3aXRoaW4gYSBwYWdlIGlzIGlnbm9yZWQuCiAgKgpAQCAtODY5LDcgJiM0Mzs4NzEsOCBAQCBpbnQga3ZtX3BndGFibGVfd2FsayhzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsIHU2NCBzaXplLAogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwogaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwKLQkJCSBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCk7CiYjNDM7CQkJIGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLAomIzQzOwkJCSBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpOwogCiAvKioKICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmgKaW5kZXggYmVlYTAwZTY5M2EwYS4uNGQ2ZTU3NjVlOWU1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaApAQCAtNDQsOSAmIzQzOzQ0LDkgQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9wa3ZtX2V4dF9hbGxvd2VkKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpCiAJY2FzZSBLVk1fQ0FQX0FSTV9QVFJBVVRIX0dFTkVSSUM6CiAJCXJldHVybiB0cnVlOwogCWNhc2UgS1ZNX0NBUF9BUk1fTVRFOgotCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBLVk1fQ0FQX0FSTV9FQUdFUl9TUExJVF9DSFVOS19TSVpFOgogCWNhc2UgS1ZNX0NBUF9BUk1fU1VQUE9SVEVEX0JMT0NLX1NJWkVTOgomIzQzOwljYXNlIEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWToKIAkJcmV0dXJuIGZhbHNlOwogCWRlZmF1bHQ6CiAJCXJldHVybiAha3ZtIHx8ICFrdm1fdm1faXNfcHJvdGVjdGVkKGt2bSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZwppbmRleCA0NDkxNTRmOWE0ODUyLi43MTIzMzA2OGI3Y2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWcKQEAgLTM3LDYgJiM0MzszNyw3IEBAIG1lbnVjb25maWcgS1ZNCiAJc2VsZWN0IFNDSEVEX0lORk8KIAlzZWxlY3QgR1VFU1RfUEVSRl9FVkVOVFMgaWYgUEVSRl9FVkVOVFMKIAlzZWxlY3QgS1ZNX0dVRVNUX01FTUZECiYjNDM7CXNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZCiAJaGVscAogCSAgU3VwcG9ydCBob3N0aW5nIHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9hcm0uYyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jCmluZGV4IGNjYWU4MmMxMjQyYmMuLjU4YWM3MGYzMWQ4NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2FybS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2FybS5jCkBAIC0zOTMsNiAmIzQzOzM5Myw3IEBAIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpCiAJY2FzZSBLVk1fQ0FQX0NPVU5URVJfT0ZGU0VUOgogCWNhc2UgS1ZNX0NBUF9BUk1fV1JJVEFCTEVfSU1QX0lEX1JFR1M6CiAJY2FzZSBLVk1fQ0FQX0FSTV9TRUFfVE9fVVNFUjoKJiM0MzsJY2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6CiAJCXIgPSAxOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfU0VUX0dVRVNUX0RFQlVHMjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jCmluZGV4IDM5YWE4OTExZjYyYzEuLjIzYTU3MzEyYjk4MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuYwpAQCAtNTMyLDcgJiM0Mzs1MzIsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2FkanVzdF9yYW5nZSh1NjQgYWRkciwgc3RydWN0IGt2bV9tZW1fcmFuZ2UgKnJhbmdlKQogCWludCByZXQ7CiAKIAloeXBfYXNzZXJ0X2xvY2tfaGVsZCgmYW1wO2hvc3RfbW11LmxvY2spOwotCXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7aG9zdF9tbXUucGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCk7CiYjNDM7CXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7aG9zdF9tbXUucGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCwgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtOTEwLDcgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLAogCXM4IGxldmVsOwogCWludCByZXQ7CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKGd1ZXN0X3B0ZV9pc19wb2lzb25lZChwdGUpKQpAQCAtOTU5LDcgJiM0Mzs5NTksNyBAQCBpbnQgX19wa3ZtX3ZjcHVfaW5fcG9pc29uX2ZhdWx0KHN0cnVjdCBwa3ZtX2h5cF92Y3B1ICpoeXBfdmNwdSkKIAlpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKCZhbXA7aHlwX3ZjcHUtJmd0O3ZjcHUpKTsKIAogCWd1ZXN0X2xvY2tfY29tcG9uZW50KHZtKTsKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC0xMzE1LDcgJiM0MzsxMzE1LDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9nZXRfZ3Vlc3RfaW5mbyhwaHlzX2FkZHJfdCBwaHlzLCBzdHJ1Y3QgcGt2bV9oeXBfdm0gKip2bSwKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO2hvc3RfbW11LnBndCwgcGh5cywgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO2hvc3RfbW11LnBndCwgcGh5cywgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE1NDQsNyAmIzQzOzE1NDQsNyBAQCBzdGF0aWMgaW50IF9fY2hlY2tfaG9zdF9zaGFyZWRfZ3Vlc3Qoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0ICpfX3BoeXMsIHU2NCBpcAogCXM4IGxldmVsOwogCWludCByZXQ7CiAKLQlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwpOwomIzQzOwlyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZigmYW1wO3ZtLSZndDtwZ3QsIGlwYSwgJmFtcDtwdGUsICZhbXA7bGV2ZWwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKCFrdm1fcHRlX3ZhbGlkKHB0ZSkpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuYwppbmRleCBiNzRkZDVjZTFlZmQzLi4zNDdlZWMzOTU3ZDZhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmMKQEAgLTI5OCwxMiAmIzQzOzI5OCwxMyBAQCBzdGF0aWMgaW50IGxlYWZfd2Fsa2VyKGNvbnN0IHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHggKmN0eCwKIH0KIAogaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwKLQkJCSBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCkKJiM0MzsJCQkga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsCiYjNDM7CQkJIGVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgbGVhZl93YWxrX2RhdGEgZGF0YTsKIAlzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHsKIAkJLmNiCT0gbGVhZl93YWxrZXIsCi0JCS5mbGFncwk9IEtWTV9QR1RBQkxFX1dBTEtfTEVBRiwKJiM0MzsJCS5mbGFncwk9IGZsYWdzIHwgS1ZNX1BHVEFCTEVfV0FMS19MRUFGLAogCQkuYXJnCT0gJmFtcDtkYXRhLAogCX07CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9hcm02NC9rdm0vbW11LmMKaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vbW11LmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vbW11LmMKQEAgLTUsNiAmIzQzOzUsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9hY3BpLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NsZWFudXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tbWFuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX2hvc3QuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9pby5oJmd0OwpAQCAtODY2LDcgJiM0Mzs4NjcsNyBAQCBzdGF0aWMgaW50IGdldF91c2VyX21hcHBpbmdfc2l6ZShzdHJ1Y3Qga3ZtICprdm0sIHU2NCBhZGRyKQogCSAqIElQSS1pbmcgdGhyZWFkcykuCiAJICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7cGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCk7CiYjNDM7CXJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKCZhbXA7cGd0LCBhZGRyLCAmYW1wO3B0ZSwgJmFtcDtsZXZlbCwgMCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJaWYgKHJldCkKQEAgLTE1NTQsOSAmIzQzOzE1NTUsOSBAQCBzdGF0aWMgdm9pZCAqZ2V0X21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCXJldHVybiAmYW1wO3ZjcHUtJmd0O2FyY2gucGt2bV9tZW1jYWNoZTsKIH0KIAotc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICptZW1jYWNoZSkKJiM0MztzdGF0aWMgaW50IHRvcHVwX21tdV9tZW1jYWNoZShzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB2b2lkICptZW1jYWNoZSkKIHsKLQlpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXModmNwdS0mZ3Q7YXJjaC5od19tbXUpOwomIzQzOwlpbnQgbWluX3BhZ2VzID0ga3ZtX21tdV9jYWNoZV9taW5fcGFnZXMobW11KTsKIAogCWlmICghaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpCiAJCXJldHVybiBrdm1fbW11X3RvcHVwX21lbW9yeV9jYWNoZShtZW1jYWNoZSwgbWluX3BhZ2VzKTsKQEAgLTE2MDMsMTUgJiM0MzsxNjA0LDQ3IEBAIHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyB7CiAJc3RydWN0IGt2bV9zMl90cmFucwkqbmVzdGVkOwogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QJKm1lbXNsb3Q7CiAJdW5zaWduZWQgbG9uZwkJaHZhOwomIzQzOwl1bnNpZ25lZCBsb25nCQllc3I7CiYjNDM7CXN0cnVjdCBrdm1fczJfbW11CSptbXU7CiB9OwogCi1zdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQomIzQzO3N0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHsKJiM0MzsJdW5zaWduZWQgbG9uZyBtYXBwaW5nX3NpemU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfcGVybShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiYjNDM7ewomIzQzOwlyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtJmd0O2Vzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC0mZ3Q7ZXNyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHMyZmQtJmd0O2Vzcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1NjQga3ZtX3MyX3Blcm1fZmF1bHRfZ3JhbnVsZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiYjNDM7ewomIzQzOwl1NjQgbGV2ZWw7CiYjNDM7CiYjNDM7CWlmICgha3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJbGV2ZWwgPSBzMmZkLSZndDtlc3IgJmFtcDsgRVNSX0VMeF9GU0NfTEVWRUw7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVChsZXZlbCkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAomIzQzOwkJICAgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdCkKIHsKIAlib29sIHdyaXRlX2ZhdWx0LCBleGVjX2ZhdWx0OwotCWJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLSZndDt2Y3B1KTsKJiM0MzsJYm9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7CiAJZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7CiAJZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QgPSBLVk1fUEdUQUJMRV9QUk9UX1I7Ci0Jc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLSZndDt2Y3B1LSZndDthcmNoLmh3X21tdS0mZ3Q7cGd0OwomIzQzOwlzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtJmd0O21tdS0mZ3Q7cGd0OwogCXVuc2lnbmVkIGxvbmcgbW11X3NlcTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLSZndDt2Y3B1LSZndDtrdm07CkBAIC0xNjIyLDcgJiM0MzsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIAogCWlmICghcGVybV9mYXVsdCkgewogCQltZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7dmNwdSk7Ci0JCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1LCBtZW1jYWNoZSk7CiYjNDM7CQlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBtZW1jYWNoZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE2MzIsOCAmIzQzOzE2NjUsOCBAQCBzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCWVsc2UKIAkJZ2ZuID0gczJmZC0mZ3Q7ZmF1bHRfaXBhICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAKLQl3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdChzMmZkLSZndDt2Y3B1KTsKLQlleGVjX2ZhdWx0ID0ga3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtJmd0O3ZjcHUpOwomIzQzOwl3cml0ZV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKTsKJiM0MzsJZXhlY19mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpOwogCiAJVk1fV0FSTl9PTl9PTkNFKHdyaXRlX2ZhdWx0ICZhbXA7JmFtcDsgZXhlY19mYXVsdCk7CiAKQEAgLTE2ODcsNyAmIzQzOzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIAlpZiAoKHByb3QgJmFtcDsgS1ZNX1BHVEFCTEVfUFJPVF9XKSAmYW1wOyZhbXA7ICFyZXQpCiAJCW1hcmtfcGFnZV9kaXJ0eV9pbl9zbG90KGt2bSwgczJmZC0mZ3Q7bWVtc2xvdCwgZ2ZuKTsKIAotCXJldHVybiByZXQgIT0gLUVBR0FJTiA/IHJldCA6IDA7CiYjNDM7CWlmIChyZXQgPT0gLUVBR0FJTikKJiM0MzsJCXJldHVybiByZXN1bHQgPyByZXQgOiAwOwomIzQzOwomIzQzOwlpZiAocmVzdWx0ICZhbXA7JmFtcDsgIXJldCkKJiM0MzsJCXJlc3VsdC0mZ3Q7bWFwcGluZ19zaXplID0gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHsKQEAgLTE3MDksNyAmIzQzOzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCkKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gczJmZC0mZ3Q7dmNwdTsKLQlzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHZjcHUtJmd0O2FyY2guaHdfbW11LSZndDtwZ3Q7CiYjNDM7CXN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gczJmZC0mZ3Q7bW11LSZndDtwZ3Q7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LSZndDttbTsKIAlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LSZndDtrdm07CiAJdm9pZCAqaHlwX21lbWNhY2hlOwpAQCAtMTcxNyw3ICYjNDM7MTc1Niw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCWludCByZXQ7CiAKIAloeXBfbWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHZjcHUpOwotCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZSh2Y3B1LCBoeXBfbWVtY2FjaGUpOwomIzQzOwlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBoeXBfbWVtY2FjaGUpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xODQwLDExICYjNDM7MTg3OSw2IEBAIHN0YXRpYyBzaG9ydCBrdm1fczJfcmVzb2x2ZV92bWFfc2l6ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJcmV0dXJuIHZtYV9zaGlmdDsKIH0KIAotc3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQotewotCXJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC0mZ3Q7dmNwdSk7Ci19Ci0KIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJCQkJICAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvICpzMnZpKQogewpAQCAtMTkxMCwxMyAmIzQzOzE5NDQsMTEgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfcGluX3Bmbihjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJCXJldHVybiByZXQ7CiAKIAlzMnZpLSZndDtwZm4gPSBfX2t2bV9mYXVsdGluX3BmbihzMmZkLSZndDttZW1zbG90LCBnZXRfY2Fub25pY2FsX2dmbihzMmZkLCBzMnZpKSwKLQkJCQkgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC0mZ3Q7dmNwdSkgPyBGT0xMX1dSSVRFIDogMCwKJiM0MzsJCQkJICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsCiAJCQkJICAgICAgJmFtcDtzMnZpLSZndDttYXBfd3JpdGFibGUsICZhbXA7czJ2aS0mZ3Q7cGFnZSk7CiAJaWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS0mZ3Q7cGZuKSkpIHsKLQkJaWYgKHMydmktJmd0O3BmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikgewotCQkJa3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtJmd0O2h2YSwgX19mZnMoczJ2aS0mZ3Q7dm1hX3BhZ2VzaXplKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQomIzQzOwkJaWYgKHMydmktJmd0O3BmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikKJiM0MzsJCQlyZXR1cm4gLUVIV1BPSVNPTjsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xOTY4LDcgJiM0MzsyMDAwLDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLSZndDt2Y3B1LSZndDtrdm07CiAKLQlpZiAoa3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHMyZmQtJmd0O3ZjcHUpICZhbXA7JmFtcDsgczJ2aS0mZ3Q7bWFwX25vbl9jYWNoZWFibGUpCiYjNDM7CWlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSAmYW1wOyZhbXA7IHMydmktJmd0O21hcF9ub25fY2FjaGVhYmxlKQogCQlyZXR1cm4gLUVOT0VYRUM7CiAKIAkvKgpAQCAtMTk3Nyw3ICYjNDM7MjAwOSw3IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0CiAJICogdGhlIGZhdWx0IGJhY2sgdG8gdGhlIGd1ZXN0LgogCSAqLwotCWlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC0mZ3Q7dmNwdSkpKSB7CiYjNDM7CWlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KHMyZmQtJmd0O2VzcikpIHsKIAkJa3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtJmd0O3ZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtJmd0O3ZjcHUpKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTk4NiwxMyAmIzQzOzIwMTgsMTMgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIAogCWlmIChzMnZpLSZndDttYXBfd3JpdGFibGUgJmFtcDsmYW1wOyAoczJ2aS0mZ3Q7ZGV2aWNlIHx8CiAJCQkJICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLSZndDttZW1zbG90KSB8fAotCQkJCSAgIGt2bV9pc193cml0ZV9mYXVsdChzMmZkLSZndDt2Y3B1KSkpCiYjNDM7CQkJCSAgIGt2bV9zMl9mYXVsdF9pc193cml0ZShzMmZkKSkpCiAJCSpwcm90IHw9IEtWTV9QR1RBQkxFX1BST1RfVzsKIAogCWlmIChzMmZkLSZndDtuZXN0ZWQpCiAJCSpwcm90ID0gYWRqdXN0X25lc3RlZF9mYXVsdF9wZXJtcyhzMmZkLSZndDtuZXN0ZWQsICpwcm90KTsKIAotCWlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC0mZ3Q7dmNwdSkpCiYjNDM7CWlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSkKIAkJKnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9YOwogCiAJaWYgKHMydmktJmd0O21hcF9ub25fY2FjaGVhYmxlKQpAQCAtMjAxNiw3ICYjNDM7MjA0OCw4IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9tYXAoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAogCQkJICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksCiAJCQkgICAgZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QsCi0JCQkgICAgdm9pZCAqbWVtY2FjaGUpCiYjNDM7CQkJICAgIHZvaWQgKm1lbWNhY2hlLAomIzQzOwkJCSAgICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KQogewogCWVudW0ga3ZtX3BndGFibGVfd2Fsa19mbGFncyBmbGFncyA9IEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEOwogCWJvb2wgd3JpdGFibGUgPSBwcm90ICZhbXA7IEtWTV9QR1RBQkxFX1BST1RfVzsKQEAgLTIwMjksMTMgJiM0MzsyMDYyLDEyIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsCiAJaW50IHJldDsKIAogCWt2bV9mYXVsdF9sb2NrKGt2bSk7Ci0JcGd0ID0gczJmZC0mZ3Q7dmNwdS0mZ3Q7YXJjaC5od19tbXUtJmd0O3BndDsKJiM0MzsJcGd0ID0gczJmZC0mZ3Q7bW11LSZndDtwZ3Q7CiAJcmV0ID0gLUVBR0FJTjsKIAlpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLSZndDttbXVfc2VxKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID8KLQkJCSAgICAgIGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShzMmZkLSZndDt2Y3B1KSA6IDApOwomIzQzOwlwZXJtX2ZhdWx0X2dyYW51bGUgPSBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQpOwogCW1hcHBpbmdfc2l6ZSA9IHMydmktJmd0O3ZtYV9wYWdlc2l6ZTsKIAlwZm4gPSBzMnZpLSZndDtwZm47CiAJZ2ZuID0gczJ2aS0mZ3Q7Z2ZuOwpAQCAtMjA5NiwxNCAmIzQzOzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCwKIAkJbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLSZndDttZW1zbG90LCBncGFfdG9fZ2ZuKGlwYSkpOwogCX0KIAotCWlmIChyZXQgIT0gLUVBR0FJTikKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKJiM0MzsJaWYgKHJldCA9PSAtRUFHQUlOKQomIzQzOwkJcmV0dXJuIHJlc3VsdCA/IHJldCA6IDA7CiYjNDM7CiYjNDM7CWlmIChyZXN1bHQgJmFtcDsmYW1wOyAhcmV0KQomIzQzOwkJcmVzdWx0LSZndDttYXBwaW5nX3NpemUgPSBtYXBwaW5nX3NpemU7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQomIzQzO3N0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLAomIzQzOwkJCSAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdCkKIHsKLQlib29sIHBlcm1fZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQoczJmZC0mZ3Q7dmNwdSk7CiYjNDM7CWJvb2wgcGVybV9mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpOwogCXN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gczJ2aSA9IHt9OwogCWVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90OwogCXZvaWQgKm1lbWNhY2hlOwpAQCAtMjEyMSw3ICYjNDM7MjE1OCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCW1lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1KTsKIAlpZiAoIXBlcm1fZmF1bHQgfHwgbWVtc2xvdF9pc19sb2dnaW5nKHMyZmQtJmd0O21lbXNsb3QpIHx8CiAJICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7Ci0JCXJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLSZndDt2Y3B1LCBtZW1jYWNoZSk7CiYjNDM7CQlyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC0mZ3Q7bW11LCBtZW1jYWNoZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTIxMzEsNiAmIzQzOzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpCiAJICogZ2V0IGJsb2NrIG1hcHBpbmcgZm9yIGRldmljZSBNTUlPIHJlZ2lvbi4KIAkgKi8KIAlyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCAmYW1wO3MydmkpOwomIzQzOwlpZiAocmV0ID09IC1FSFdQT0lTT04pIHsKJiM0MzsJCS8qIElmIHJlc3VsdCBpcyBzcGVjaWZpZWQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSB0aGlzLiAqLwomIzQzOwkJaWYgKHJlc3VsdCkKJiM0MzsJCQlyZXR1cm4gLUVIV1BPSVNPTjsKJiM0MzsJCWt2bV9zZW5kX2h3cG9pc29uX3NpZ25hbChzMmZkLSZndDtodmEsIF9fZmZzKHMydmkudm1hX3BhZ2VzaXplKSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQogCWlmIChyZXQgIT0gMSkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjE0MCw3ICYjNDM7MjE4NCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKQogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsICZhbXA7czJ2aSwgcHJvdCwgbWVtY2FjaGUpOwomIzQzOwlyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCAmYW1wO3MydmksIHByb3QsIG1lbWNhY2hlLCByZXN1bHQpOwogfQogCiAvKiBSZXNvbHZlIHRoZSBhY2Nlc3MgZmF1bHQgYnkgbWFraW5nIHRoZSBwYWdlIHlvdW5nIGFnYWluLiAqLwpAQCAtMjI1MCw3ICYjNDM7MjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9zMl90cmFucyBuZXN0ZWRfdHJhbnMsICpuZXN0ZWQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZXNyOwomIzQzOwl1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7CiYjNDM7CXN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LSZndDthcmNoLmh3X21tdTsKIAlwaHlzX2FkZHJfdCBmYXVsdF9pcGE7IC8qIFRoZSBhZGRyZXNzIHdlIGZhdWx0ZWQgb24gKi8KIAlwaHlzX2FkZHJfdCBpcGE7IC8qIEFsd2F5cyB0aGUgSVBBIGluIHRoZSBMMSBndWVzdCBwaHlzIHNwYWNlICovCiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKQEAgLTIyNTksMTEgJiM0MzsyMzA0LDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCWdmbl90IGdmbjsKIAlpbnQgcmV0LCBpZHg7CiAKLQlpZiAoa3ZtX3ZjcHVfYWJ0X2lzc2VhKHZjcHUpKQomIzQzOwlpZiAoZXNyX2FidF9pc19zZWEoZXNyKSkKIAkJcmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpOwogCi0JZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTsKLQogCS8qCiAJICogVGhlIGZhdWx0IElQQSBzaG91bGQgYmUgcmVsaWFibGUgYXQgdGhpcyBwb2ludCBhcyB3ZSYjMzk7cmUgbm90IGRlYWxpbmcKIAkgKiB3aXRoIGFuIFNFQS4KQEAgLTIyNzIsNyAmIzQzOzIzMTUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJaWYgKEtWTV9CVUdfT04oaXBhID09IElOVkFMSURfR1BBLCB2Y3B1LSZndDtrdm0pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7CiYjNDM7CWlzX2lhYnQgPSBlc3JfdHJhcF9pc19pYWJ0KGVzcik7CiAKIAlpZiAoZXNyX2ZzY19pc190cmFuc2xhdGlvbl9mYXVsdChlc3IpKSB7CiAJCS8qIEJleW9uZCBzYW5pdGlzZWQgUEFSYW5nZSAod2hpY2ggaXMgdGhlIElQQSBsaW1pdCkgKi8KQEAgLTIyODIsMTQgJiM0MzsyMzI1LDE0IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkJfQogCiAJCS8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovCi0JCWlmIChmYXVsdF9pcGEgJmd0Oz0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS0mZ3Q7YXJjaC5od19tbXUtJmd0O3Z0Y3IpKSkgewomIzQzOwkJaWYgKGZhdWx0X2lwYSAmZ3Q7PSBCSVRfVUxMKFZUQ1JfRUwyX0lQQShtbXUtJmd0O3Z0Y3IpKSkgewogCQkJZmF1bHRfaXBhIHw9IEZBUl9UT19GSVBBX09GRlNFVChrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7CiAKIAkJCXJldHVybiBrdm1faW5qZWN0X3NlYSh2Y3B1LCBpc19pYWJ0LCBmYXVsdF9pcGEpOwogCQl9CiAJfQogCi0JdHJhY2Vfa3ZtX2d1ZXN0X2ZhdWx0KCp2Y3B1X3BjKHZjcHUpLCBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpLAomIzQzOwl0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzciwKIAkJCSAgICAgIGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpLCBmYXVsdF9pcGEpOwogCiAJLyogQ2hlY2sgdGhlIHN0YWdlLTIgZmF1bHQgaXMgdHJhbnMuIGZhdWx0IG9yIHdyaXRlIGZhdWx0ICovCkBAIC0yMjk4LDkgJiM0MzsyMzQxLDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCSAgICAhZXNyX2ZzY19pc19hY2Nlc3NfZmxhZ19mYXVsdChlc3IpICZhbXA7JmFtcDsKIAkgICAgIWVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoZXNyKSkgewogCQlrdm1fZXJyKCYjMzQ7VW5zdXBwb3J0ZWQgRlNDOiBFQz0lI3ggeEZTQz0lI2x4IEVTUl9FTDI9JSNseFxuJiMzNDssCi0JCQlrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSwKLQkJCSh1bnNpZ25lZCBsb25nKWt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KHZjcHUpLAotCQkJKHVuc2lnbmVkIGxvbmcpa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7CiYjNDM7CQkJZXNyX2dldF9lYyhlc3IpLAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKShlc3IgJmFtcDsgRVNSX0VMeF9GU0MpLAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKWVzcik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMjMxOSw4ICYjNDM7MjM2Miw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkgKiBub3RoaW5nIHRvIHdhbGsgYW5kIHdlIHRyZWF0IGl0IGFzIGEgMToxIGJlZm9yZSBnb2luZyB0aHJvdWdoIHRoZQogCSAqIGNhbm9uaWNhbCB0cmFuc2xhdGlvbi4KIAkgKi8KLQlpZiAoa3ZtX2lzX25lc3RlZF9zMl9tbXUodmNwdS0mZ3Q7a3ZtLHZjcHUtJmd0O2FyY2guaHdfbW11KSAmYW1wOyZhbXA7Ci0JICAgIHZjcHUtJmd0O2FyY2guaHdfbW11LSZndDtuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHsKJiM0MzsJaWYgKGt2bV9pc19uZXN0ZWRfczJfbW11KHZjcHUtJmd0O2t2bSwgbW11KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBtbXUtJmd0O25lc3RlZF9zdGFnZTJfZW5hYmxlZCkgewogCQl1MzIgZXNyOwogCiAJCXJldCA9IGt2bV93YWxrX25lc3RlZF9zMih2Y3B1LCBmYXVsdF9pcGEsICZhbXA7bmVzdGVkX3RyYW5zKTsKQEAgLTIzNDksNyAmIzQzOzIzOTIsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJZ2ZuID0gaXBhICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJbWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtJmd0O2t2bSwgZ2ZuKTsKIAlodmEgPSBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChtZW1zbG90LCBnZm4sICZhbXA7d3JpdGFibGUpOwotCXdyaXRlX2ZhdWx0ID0ga3ZtX2lzX3dyaXRlX2ZhdWx0KHZjcHUpOwomIzQzOwl3cml0ZV9mYXVsdCA9IGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoZXNyKTsKIAlpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIHx8ICh3cml0ZV9mYXVsdCAmYW1wOyZhbXA7ICF3cml0YWJsZSkpIHsKIAkJLyoKIAkJICogVGhlIGd1ZXN0IGhhcyBwdXQgZWl0aGVyIGl0cyBpbnN0cnVjdGlvbnMgb3IgaXRzIHBhZ2UtdGFibGVzCkBAIC0yMzYyLDcgJiM0MzsyNDA1LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoa3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KSkgewomIzQzOwkJaWYgKGVzcl9hYnRfaXNfczFwdHcoZXNyKSkgewogCQkJcmV0ID0ga3ZtX2luamVjdF9zZWFfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KQEAgLTIzNzcsNyAmIzQzOzI0MjAsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCSAqIFNvIGxldCYjMzk7cyBhc3N1bWUgdGhhdCB0aGUgZ3Vlc3QgaXMganVzdCBiZWluZwogCQkgKiBjYXV0aW91cywgYW5kIHNraXAgdGhlIGluc3RydWN0aW9uLgogCQkgKi8KLQkJaWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSAmYW1wOyZhbXA7IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHsKJiM0MzsJCWlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgJmFtcDsmYW1wOyBlc3JfZGFidF9pc19jbShlc3IpKSB7CiAJCQlrdm1faW5jcl9wYyh2Y3B1KTsKIAkJCXJldCA9IDE7CiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC0yMzk1LDcgJiM0MzsyNDM4LDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCX0KIAogCS8qIFVzZXJzcGFjZSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVnaXN0ZXIgb3V0LW9mLWJvdW5kcyBJUEFzICovCi0JVk1fQlVHX09OKGlwYSAmZ3Q7PSBrdm1fcGh5c19zaXplKHZjcHUtJmd0O2FyY2guaHdfbW11KSk7CiYjNDM7CVZNX0JVR19PTihpcGEgJmd0Oz0ga3ZtX3BoeXNfc2l6ZShtbXUpKTsKIAogCWlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHsKIAkJaGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpOwpAQCAtMjQwOSwxOSAmIzQzOzI0NTIsMjAgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkubmVzdGVkCQk9IG5lc3RlZCwKIAkJLm1lbXNsb3QJPSBtZW1zbG90LAogCQkuaHZhCQk9IGh2YSwKJiM0MzsJCS5lc3IJCT0gZXNyLAomIzQzOwkJLm1tdQkJPSBtbXUsCiAJfTsKIAogCWlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtJmd0O2t2bSkpIHsKIAkJcmV0ID0gcGt2bV9tZW1fYWJvcnQoJmFtcDtzMmZkKTsKIAl9IGVsc2UgewotCQlWTV9XQVJOX09OX09OQ0Uoa3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpICZhbXA7JmFtcDsKLQkJCQkhd3JpdGVfZmF1bHQgJmFtcDsmYW1wOwotCQkJCSFrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQodmNwdSkpOwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKCZhbXA7czJmZCkgJmFtcDsmYW1wOyAhd3JpdGVfZmF1bHQgJmFtcDsmYW1wOwomIzQzOwkJCQkha3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoJmFtcDtzMmZkKSk7CiAKIAkJaWYgKGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpKQotCQkJcmV0ID0gZ21lbV9hYm9ydCgmYW1wO3MyZmQpOwomIzQzOwkJCXJldCA9IGdtZW1fYWJvcnQoJmFtcDtzMmZkLCBOVUxMKTsKIAkJZWxzZQotCQkJcmV0ID0gdXNlcl9tZW1fYWJvcnQoJmFtcDtzMmZkKTsKJiM0MzsJCQlyZXQgPSB1c2VyX21lbV9hYm9ydCgmYW1wO3MyZmQsIE5VTEwpOwogCX0KIAogCWlmIChyZXQgPT0gMCkKQEAgLTI3OTIsMyAmIzQzOzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpCiAKIAl0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpOwogfQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJ5IHRvIHdhbGsgdG8gdGhlIHNwZWNpZmllZCBHUEEgaW4gY2Fub25pY2FsIG1tdSAtIGlmIHVubWFwcGVkIHJldHVybnMgMCwgaWYKJiM0MzsgKiBtYXBwZWQgcmV0dXJucyB0aGUgZ3JhbnVsZSBzaXplLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJvci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBrdm1fd2Fsa19zMihzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwKJiM0MzsJCQlncGFfdCBncGEsIHM4ICpsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm0gKmt2bSA9IGt2bV9zMl9tbXVfdG9fa3ZtKHBndC0mZ3Q7bW11KTsKJiM0MzsJa3ZtX3B0ZV90IHB0ZTsKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CWd1YXJkKHJlYWRfbG9jaykoJmFtcDtrdm0tJmd0O21tdV9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYocGd0LCBncGEsICZhbXA7cHRlLCBsZXZlbCwKJiM0MzsJCQkJICAgS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJLyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovCiYjNDM7CWlmICgha3ZtX3B0ZV92YWxpZChwdGUpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBrdm1fZ3JhbnVsZV9zaXplKCpsZXZlbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN5bnRoZXNpc2VkIGRhdGEgYWJvcnQgYXQgc3BlY2lmaWVkIHBhZ2UgdGFibGUgbGV2ZWwuICovCiYjNDM7I2RlZmluZSBQUkVfRkFVTFRfRVNSKGxldmVsKQkJCQlcCiYjNDM7CSAoKEVTUl9FTHhfRUNfREFCVF9MT1cgJmx0OyZsdDsgRVNSX0VMeF9FQ19TSElGVCkgfAlcCiYjNDM7CSAgRVNSX0VMeF9JTCB8IEVTUl9FTHhfRlNDX0ZBVUxUX0wobGV2ZWwpKQomIzQzOwomIzQzOy8qIFJldHJpZXZlIGVpdGhlciBhIHJlYWQtb25seSBvciBhIHJlYWQvd3JpdGUgaHZhLiAqLwomIzQzO3N0YXRpYyBodmFfdCBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBnZm5fdCBnZm4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3Qoc2xvdCwgZ2ZuLCAvKndyaXRhYmxlPSovTlVMTCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb25nIF9fcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKJiM0MzsJCQkgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKQomIzQzO3sKJiM0MzsJY29uc3QgYm9vbCBpc19nbWVtID0ga3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCk7CiYjNDM7CWNvbnN0IGdmbl90IGdmbiA9IGdwYV90b19nZm4oZ3BhKTsKJiM0MzsJY29uc3QgaHZhX3QgaHZhID0gaXNfZ21lbSA/IDAgOiBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChtZW1zbG90LCBnZm4pOwomIzQzOwljb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgczJmZCA9IHsKJiM0MzsJCS52Y3B1CQk9IHZjcHUsCiYjNDM7CQkuZmF1bHRfaXBhCT0gZ3BhLAomIzQzOwkJLm5lc3RlZAkJPSBOVUxMLAomIzQzOwkJLm1lbXNsb3QJPSBtZW1zbG90LAomIzQzOwkJLmh2YQkJPSBodmEsCiYjNDM7CQkuZXNyCQk9IFBSRV9GQVVMVF9FU1IobGV2ZWwpLAomIzQzOwkJLm1tdQkJPSBtbXUsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHJlc3VsdCA9IHt9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJaWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlpZiAoaXNfZ21lbSkKJiM0MzsJCXJldCA9IGdtZW1fYWJvcnQoJmFtcDtzMmZkLCAmYW1wO3Jlc3VsdCk7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IHVzZXJfbWVtX2Fib3J0KCZhbXA7czJmZCwgJmFtcDtyZXN1bHQpOwomIzQzOwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gcmVzdWx0Lm1hcHBpbmdfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcgcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKJiM0MzsJCQkgZ3BhX3QgZ3BhLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KQomIzQzO3sKJiM0MzsJczggbGV2ZWw7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKiBUcnkgYSB3YWxrIGZpcnN0LiAqLwomIzQzOwlyZXQgPSBrdm1fd2Fsa19zMihtbXUtJmd0O3BndCwgZ3BhLCAmYW1wO2xldmVsKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CS8qIE9LLCBoYXZlIHRvIGZhdWx0IHBhZ2UgaW4uICovCiYjNDM7CXJldHVybiBfX3ByZV9mYXVsdF9zMihtbXUsIHZjcHUsIGdwYSwgbWVtc2xvdCwgbGV2ZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZwomIzQzO3ByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGFfdCBncGEsIHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplLAomIzQzOwkJCSB1bnNpZ25lZCBsb25nIGJ5dGVzX3JlbWFpbmluZykKJiM0Mzt7CiYjNDM7CS8qIEdyYW51bGVzIGFyZSBhbHdheXMgYSBwb3dlci1vZi0yLiAqLwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIGdyYW51bGVfYnl0ZXNfcmVtYWluaW5nID0KJiM0MzsJCWdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gbWluKGdyYW51bGVfYnl0ZXNfcmVtYWluaW5nLCBieXRlc19yZW1haW5pbmcpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBJZiB5b3UgbG9zZSB0aGUgcmFjZSB0aGlzIG1hbnkgdGltZXMsIHRpbWUgdG8gZ2l2ZSB1cC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9QUkVfRkFVTFRfUkVUUklFUyAzCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICoga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5IC0gcHJlLWZhdWx0IHN0YWdlLTIgcGFnZSB0YWJsZXMgZm9yIHRoZQomIzQzOyAqIHNwZWNpZmllZCBHUEEuCiYjNDM7ICogQHZjcHU6CVRoZSBWQ1BVIHBvaW50ZXIKJiM0MzsgKiBAcmFuZ2U6CXtncGEsIHNpemUsIGZsYWdzfSB0dXBsZQomIzQzOyAqCiYjNDM7ICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5CiYjNDM7ICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuCiYjNDM7ICoKJiM0MzsgKiBAcmFuZ2UtJmd0O2dwYSBzcGVjaWZpZXMgdGhlIEdQQSB0byBwcmUtZmF1bHQsIEByYW5nZS0mZ3Q7c2l6ZSBzcGVjaWZpZXMgaG93IG1hbnkKJiM0MzsgKiBieXRlcyByZW1haW4gdG8gYmUgcHJlLWZhdWx0ZWQgYW5kIEByYW5nZS0mZ3Q7ZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC4KJiM0MzsgKgomIzQzOyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuCiYjNDM7ICovCiYjNDM7bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAomIzQzOwkJCQkgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtJmd0O2t2bTsKJiM0MzsJY29uc3QgdTY0IGJ5dGVzX3JlbWFpbmluZyA9IHJhbmdlLSZndDtzaXplOwomIzQzOwlzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11ID0gJmFtcDtrdm0tJmd0O2FyY2gubW11OyAvKiBDYW5vbmljYWwuICovCiYjNDM7CXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CiYjNDM7CWNvbnN0IGdwYV90IGdwYSA9IHJhbmdlLSZndDtncGE7CiYjNDM7CWludCBudW1fcmV0cmllcyA9IDA7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBwS1ZNIGlzIHVuc3VwcG9ydGVkIGFzIHRoZWlyIHZDUFVzIGFyZSBpbnN0YW50aWF0ZWQgb24gZmlyc3QgcnVuIGFuZAomIzQzOwkgKiBwcmUtZmF1bHRpbmcgb25seSBydW5uaW5nIHZDUFVzIHdvdWxkIGJlIGluY29uc2lzdGVudCBhbmQgY29uZnVzaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwltZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBncGFfdG9fZ2ZuKGdwYSkpOwomIzQzOwlpZiAoIW1lbXNsb3QpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJLyogU1JDVSBtdXN0IGJlIHJlbGVhc2VkIGZvciBwcm9ncmVzcyBhbmQgb25seSB1c2VybGFuZCBjYW4gZG8gdGhhdC4gKi8KJiM0MzsJaWYgKG1lbXNsb3QtJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1TTE9UX0lOVkFMSUQpCiYjNDM7CQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJcmV0ID0gcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90KTsKJiM0MzsJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4gJmFtcDsmYW1wOyBudW1fcmV0cmllcyYjNDM7JiM0MzsgJmx0OyBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMpOwomIzQzOwomIzQzOwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYSwgcmV0LCBieXRlc19yZW1haW5pbmcpOwomIzQzO30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jIGIvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKaW5kZXggMTcxMjNmMGI2ZGFiYS4uMzQ4OGQ1YWQyMjViNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmMKQEAgLTY1NCw3ICYjNDM7NjU0LDcgQEAgc3RhdGljIHU4IGdldF9ndWVzdF9tYXBwaW5nX3R0bChzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11LCB1NjQgYWRkcikKIAkJcmV0dXJuIDA7CiAKIAl0bXAgJmFtcDs9IH4oc3ogLSAxKTsKLQlpZiAoa3ZtX3BndGFibGVfZ2V0X2xlYWYobW11LSZndDtwZ3QsIHRtcCwgJmFtcDtwdGUsIE5VTEwpKQomIzQzOwlpZiAoa3ZtX3BndGFibGVfZ2V0X2xlYWYobW11LSZndDtwZ3QsIHRtcCwgJmFtcDtwdGUsIE5VTEwsIDApKQogCQlnb3RvIGFnYWluOwogCWlmICghKHB0ZSAmYW1wOyBQVEVfVkFMSUQpKQogCQlnb3RvIGFnYWluOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm0KaW5kZXggNWY4ZDE3ZWU1ZjY3Ny4uMWUwZWRkMGY5OWY3NSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtCkBAIC0xNzMsNiAmIzQzOzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9kZWJ1Zy1leGNlcHRpb25zCiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvaGVsbG9fZWwyCiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gYXJtNjQvaG9zdF9zdmUKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9oeXBlcmNhbGxzCiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdAogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L2V4dGVybmFsX2Fib3J0cwogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGFybTY0L21taW9fc2lnbl9leHQKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBhcm02NC9wYWdlX2ZhdWx0X3Rlc3QKQEAgLTE5OSw2ICYjNDM7MjAwLDcgQEAgVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGd1ZXN0X21lbWZkX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBtbXVfc3RyZXNzX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSByc2VxX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBzdGVhbF90aW1lCiYjNDM7VEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHByZV9mYXVsdF9tZW1vcnlfdGVzdAogCiBURVNUX0dFTl9QUk9HU19zMzkwID0gJChURVNUX0dFTl9QUk9HU19DT01NT04pCiBURVNUX0dFTl9QUk9HU19zMzkwICYjNDM7PSBzMzkwL21lbW9wCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMDljMWRiMzAzODU2NgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYwpAQCAtMCwwICYjNDM7MSwxNTggQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CiYjNDM7LyoKJiM0MzsgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZQomIzQzOyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZQomIzQzOyAqIHJlYWwgRUwxIHJlZ2lzdGVycyB0aGVuIEVSRVRzIHRvIHZFTDEgYW5kIGV4aXRzIHRvIHVzZXJzcGFjZSBzbyBpdHMgdkNQVQomIzQzOyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkIGJhY2tlZCBieSBhIHNoYWRvdyBzdGFnZSAyIE1NVS4KJiM0MzsgKgomIzQzOyAqIEFzc2VydCB0aGF0IHByZS1mYXVsdGluZyBpZ25vcmVzIHRoYXQgYW5kIHRhcmdldHMgdGhlIGNhbm9uaWNhbCBzdGFnZS0yCiYjNDM7ICogcGFnZSB0YWJsZXMgb25seS4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O2t2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7cHJvY2Vzc29yLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dWNhbGwuaCYjMzQ7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9zeXNyZWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2l6ZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFRFU1RfTUVNX1NMT1QJCTEwCiYjNDM7I2RlZmluZSBURVNUX01FTV9TSVpFCQlTWl8yTQomIzQzOyNkZWZpbmUgVEVTVF9NRU1fR1BBCQlTWl8xRwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGd1ZXN0X2VsMV9jb2RlKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgb2Zmc2V0OwomIzQzOwomIzQzOwlHVUVTVF9BU1NFUlRfRVEoZ2V0X2N1cnJlbnRfZWwoKSwgMSk7CiYjNDM7CiYjNDM7CS8qIEV4aXQgdG8gdXNlcnNwYWNlIHdpdGggdGhlIHZFTDEgKG5lc3RlZCkgY29udGV4dCBsaXZlLiAqLwomIzQzOwlHVUVTVF9TWU5DKDEpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3cKJiM0MzsJICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLgomIzQzOwkgKi8KJiM0MzsJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBURVNUX01FTV9TSVpFOyBvZmZzZXQgJiM0Mzs9IFNaXzRLKQomIzQzOwkJUkVBRF9PTkNFKCoodTY0ICopKFRFU1RfTUVNX0dQQSAmIzQzOyBvZmZzZXQpKTsKJiM0MzsKJiM0MzsJR1VFU1RfRE9ORSgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgc3A7CiYjNDM7CiYjNDM7CUdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAyKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTWlycm9yIHRoZSBFTDIgdHJhbnNsYXRpb24gcmVnaW1lIGludG8gdGhlIHJlYWwgRUwxIHJlZ2lzdGVycyBzbwomIzQzOwkgKiB0aGF0IHZFTDEgcnVucyBvbiB0aGUgdGVzdCYjMzk7cyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGUKJiM0MzsJICogX0VMMSBhY2Nlc3NvcnMgcmVhZCB0aGUgRUwyIHJlZ2lzdGVycywgYW5kIHRoZSBfRUwxMiBhY2Nlc3NvcnMKJiM0MzsJICogd3JpdGUgdGhlIHJlYWwgRUwxIHJlZ2lzdGVycy4KJiM0MzsJICovCiYjNDM7CXdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHNjdGxyX2VsMSksIFNZU19TQ1RMUl9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcodGNyX2VsMSksIFNZU19UQ1JfRUwxMik7CiYjNDM7CXdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcobWFpcl9lbDEpLCBTWVNfTUFJUl9FTDEyKTsKJiM0MzsJd3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoY3BhY3JfZWwxKSwgU1lTX0NQQUNSX0VMMTIpOwomIzQzOwomIzQzOwkvKiBSdW4gdkVMMSBvbiB0aGUgc2FtZSBzdGFjay4gKi8KJiM0MzsJYXNtIHZvbGF0aWxlKCYjMzQ7bW92ICUwLCBzcCYjMzQ7IDogJiMzNDs9ciYjMzQ7KHNwKSk7CiYjNDM7CXdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRHJvcCBUR0Ugc28gdGhhdCB2RUwxIGlzIGEgbmVzdGVkIGNvbnRleHQgcmF0aGVyIHRoYW4gaG9zdCBFTDAuCiYjNDM7CSAqIEtWTSBiYWNrcyBpdCB3aXRoIGEgc2hhZG93IHN0YWdlLTIgTU1VIGV2ZW4gdGhvdWdoIHZzdGFnZS0yIGlzCiYjNDM7CSAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLgomIzQzOwkgKi8KJiM0MzsJd3JpdGVfc3lzcmVnKHJlYWRfc3lzcmVnKGhjcl9lbDIpICZhbXA7IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7CiYjNDM7CWlzYigpOwomIzQzOwomIzQzOwl3cml0ZV9zeXNyZWcoUFNSX01PREVfRUwxaCB8IFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFBTUl9BX0JJVCB8CiYjNDM7CQkgICAgIFBTUl9EX0JJVCwgc3Bzcl9lbDIpOwomIzQzOwl3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7CiYjNDM7CWFzbSB2b2xhdGlsZSgmIzM0O2VyZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CUdVRVNUX0FTU0VSVChmYWxzZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHByZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBncGEsIHU2NCBzaXplKQomIzQzO3sKJiM0MzsJc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0gewomIzQzOwkJLmdwYSA9IGdwYSwKJiM0MzsJCS5zaXplID0gc2l6ZSwKJiM0MzsJfTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZG8gewomIzQzOwkJcmV0ID0gX192Y3B1X2lvY3RsKHZjcHUsIEtWTV9QUkVfRkFVTFRfTUVNT1JZLCAmYW1wO3JhbmdlKTsKJiM0MzsJfSB3aGlsZSAoKCFyZXQgJmFtcDsmYW1wOyByYW5nZS5zaXplKSB8fAomIzQzOwkJIChyZXQgJmx0OyAwICZhbXA7JmFtcDsgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpKTsKJiM0MzsKJiM0MzsJVEVTVF9BU1NFUlQoIXJldCwgJiMzNDtLVk1fUFJFX0ZBVUxUX01FTU9SWSBmYWlsZWQsIHJldDogJWQgZXJybm86ICVkJiMzNDssCiYjNDM7CQkgICAgcmV0LCBlcnJubyk7CiYjNDM7CVRFU1RfQVNTRVJUX0VRKHJhbmdlLnNpemUsIDApOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDsKJiM0MzsJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwomIzQzOwlzdHJ1Y3Qga3ZtX3ZtICp2bTsKJiM0MzsJc3RydWN0IHVjYWxsIHVjOwomIzQzOwl1NjQgbnBhZ2VzOwomIzQzOwomIzQzOwlURVNUX1JFUVVJUkUodGVzdF9zdXBwb3J0c19lbDIoKSk7CiYjNDM7CVRFU1RfUkVRVUlSRShrdm1fY2hlY2tfY2FwKEtWTV9DQVBfUFJFX0ZBVUxUX01FTU9SWSkpOwomIzQzOwomIzQzOwl2bSA9IHZtX2NyZWF0ZSgxKTsKJiM0MzsKJiM0MzsJa3ZtX2dldF9kZWZhdWx0X3ZjcHVfdGFyZ2V0KHZtLCAmYW1wO2luaXQpOwomIzQzOwlpbml0LmZlYXR1cmVzWzBdIHw9IEJJVChLVk1fQVJNX1ZDUFVfSEFTX0VMMik7CiYjNDM7CXZjcHUgPSBhYXJjaDY0X3ZjcHVfYWRkKHZtLCAwLCAmYW1wO2luaXQsIGd1ZXN0X2NvZGUpOwomIzQzOwlrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7CiYjNDM7CiYjNDM7CW5wYWdlcyA9IFRFU1RfTUVNX1NJWkUgLyB2bS0mZ3Q7cGFnZV9zaXplOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIFZNX01FTV9TUkNfQU5PTllNT1VTLCBURVNUX01FTV9HUEEsCiYjNDM7CQkJCSAgICBURVNUX01FTV9TTE9ULCBucGFnZXMsIDApOwomIzQzOwl2aXJ0X21hcCh2bSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9HUEEsIG5wYWdlcyk7CiYjNDM7CiYjNDM7CS8qIFJ1biB0aGUgZ3Vlc3QgdW50aWwgaXQgaGFzIEVSRVQmIzM5O2QgZnJvbSB2RUwyIHRvIHZFTDEuICovCiYjNDM7CXZjcHVfcnVuKHZjcHUpOwomIzQzOwlzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCAmYW1wO3VjKSkgewomIzQzOwljYXNlIFVDQUxMX1NZTkM6CiYjNDM7CQlURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFVDQUxMX0FCT1JUOgomIzQzOwkJUkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCVRFU1RfRkFJTCgmIzM0O1VuaGFuZGxlZCB1Y2FsbDogJWxkJiMzNDssIHVjLmNtZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHZDUFUmIzM5O3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93CiYjNDM7CSAqIHN0YWdlLTIgTU1VLgomIzQzOwkgKgomIzQzOwkgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLgomIzQzOwkgKi8KJiM0MzsJcHJlX2ZhdWx0KHZjcHUsIFRFU1RfTUVNX0dQQSwgVEVTVF9NRU1fU0laRSk7CiYjNDM7CiYjNDM7CS8qIFJlc3VtZSBhdCB2RUwxIGFuZCB0b3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gKi8KJiM0MzsJdmNwdV9ydW4odmNwdSk7CiYjNDM7CXN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsICZhbXA7dWMpKSB7CiYjNDM7CWNhc2UgVUNBTExfRE9ORToKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFVDQUxMX0FCT1JUOgomIzQzOwkJUkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCVRFU1RfRkFJTCgmIzM0O1VuaGFuZGxlZCB1Y2FsbDogJWxkJiMzNDssIHVjLmNtZCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3ZtX3ZtX2ZyZWUodm0pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMKaW5kZXggYTBmY2FlM2NiN2E4Yi4uNzAyYzcyYmJmYTk2MCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYwpAQCAtMTIsMTkgJiM0MzsxMiwyOSBAQAogI2luY2x1ZGUgJmx0O3Byb2Nlc3Nvci5oJmd0OwogI2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKICNpbmNsdWRlICZsdDt1Y2FsbF9jb21tb24uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Z3Vlc3RfbW9kZXMuaCZndDsKIAogLyogQXJiaXRyYXJpbHkgY2hvc2VuIHZhbHVlcyAqLwotI2RlZmluZSBURVNUX1NJWkUJCShTWl8yTSAmIzQzOyBQQUdFX1NJWkUpCi0jZGVmaW5lIFRFU1RfTlBBR0VTCQkoVEVTVF9TSVpFIC8gUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgVEVTVF9CQVNFX1NJWkUJCVNaXzJNCiAjZGVmaW5lIFRFU1RfU0xPVAkJMTAKIAomIzQzOy8qIFN0b3JhZ2Ugb2YgdGVzdCBpbmZvIHRvIHNoYXJlIHdpdGggZ3Vlc3QgY29kZSAqLwomIzQzO3N0cnVjdCB0ZXN0X2NvbmZpZyB7CiYjNDM7CXU2NCBwYWdlX3NpemU7CiYjNDM7CXU2NCB0ZXN0X3NpemU7CiYjNDM7CXU2NCB0ZXN0X251bV9wYWdlczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgdGVzdF9jb25maWcgdGVzdF9jb25maWc7CiYjNDM7CiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSkKIHsKIAl2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDsKJiM0MzsJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmYW1wO3Rlc3RfY29uZmlnOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IFRFU1RfTlBBR0VTOyBpJiM0MzsmIzQzOykgewotCQl1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgJiM0MzsgaSAqIFBBR0VfU0laRSk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjb25maWctJmd0O3Rlc3RfbnVtX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJdTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICYjNDM7IGkgKiBjb25maWctJmd0O3BhZ2Vfc2l6ZSk7CiAKIAkJdmFsID0gKnNyYzsKIAl9CkBAIC0zNiw2ICYjNDM7NDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7CiAJc3RydWN0IGt2bV92bSAqdm07CiAJZ3BhX3QgZ3BhOwogCXUzMiBmbGFnczsKJiM0MzsJZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7CiAJYm9vbCB3b3JrZXJfcmVhZHk7CiAJYm9vbCBwcmVmYXVsdF9yZWFkeTsKIAlib29sIHJlY3JlYXRlX3Nsb3Q7CkBAIC01NiwxNCAmIzQzOzY3LDE2IEBAIHN0YXRpYyB2b2lkICpkZWxldGVfc2xvdF93b3JrZXIodm9pZCAqX19kYXRhKQogCXdoaWxlICghUkVBRF9PTkNFKGRhdGEtJmd0O3JlY3JlYXRlX3Nsb3QpKQogCQljcHVfcmVsYXgoKTsKIAotCXZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIGRhdGEtJmd0O2dwYSwKLQkJCQkgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS0mZ3Q7ZmxhZ3MpOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtJmd0O21lbV9iYWNraW5nX3NyYywgZGF0YS0mZ3Q7Z3BhLAomIzQzOwkJCQkgICAgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywgZGF0YS0mZ3Q7ZmxhZ3MpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCi0JCQkgICAgIHU2NCBzaXplLCB1NjQgZXhwZWN0ZWRfbGVmdCwgYm9vbCBwcml2YXRlKQomIzQzOwkJCSAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LAomIzQzOwkJCSAgICAgZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmMsCiYjNDM7CQkJICAgICBib29sIHByaXZhdGUpCiB7CiAJc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0gewogCQkuZ3BhID0gYmFzZV9ncGEgJiM0Mzsgb2Zmc2V0LApAQCAtNzQsNiAmIzQzOzg3LDcgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCwKIAkJLnZtID0gdmNwdS0mZ3Q7dm0sCiAJCS5ncGEgPSBiYXNlX2dwYSwKIAkJLmZsYWdzID0gcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwLAomIzQzOwkJLm1lbV9iYWNraW5nX3NyYyA9IG1lbV9iYWNraW5nX3NyYywKIAl9OwogCWJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTsKIAlwdGhyZWFkX3Qgc2xvdF93b3JrZXI7CkBAIC0xNTAsOCAmIzQzOzE2NCw4IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCiAJLyoKIAkgKiBBc3NlcnQgc3VjY2VzcyBpZiBwcmVmYXVsdGluZyB0aGUgZW50aXJlIHJhbmdlIHNob3VsZCBzdWNjZWVkLCBpLmUuCiAJICogY29tcGxldGUgd2l0aCBubyBieXRlcyByZW1haW5pbmcuICBPdGhlcndpc2UgcHJlZmF1bHRpbmcgc2hvdWxkIGhhdmUKLQkgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAoZHVlIHRvIFJFVF9QRl9FTVVMQVRFIGZvciBlbXVsYXRlZCBNTUlPIHdoZW4KLQkgKiBubyBtZW1zbG90IGV4aXN0cykuCiYjNDM7CSAqIGZhaWxlZCBkdWUgdG8gRU5PRU5UIChubyBtZW1zbG90IGV4aXN0cyBmb3IgdGhlIEdQQTsgb24geDg2IHRoaXMKJiM0MzsJICogc3VyZmFjZXMgdmlhIFJFVF9QRl9FTVVMQVRFKS4KIAkgKi8KIAlpZiAoIWV4cGVjdGVkX2xlZnQpCiAJCVRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS0mZ3Q7dm0pOwpAQCAtMTYwLDM5ICYjNDM7MTc0LDgyIEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsCiAJCQkJCSAgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS0mZ3Q7dm0pOwogfQogCi1zdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSkKJiM0MztzdHJ1Y3QgdGVzdF9wYXJhbXMgewomIzQzOwl1bnNpZ25lZCBsb25nIHZtX3R5cGU7CiYjNDM7CWJvb2wgcHJpdmF0ZTsKJiM0MzsJZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeShlbnVtIHZtX2d1ZXN0X21vZGUgZ3Vlc3RfbW9kZSwgdm9pZCAqYXJnKQogewotCWdwYV90IGdwYSwgZ3ZhLCBhbGlnbm1lbnQsIGd1ZXN0X3BhZ2Vfc2l6ZTsKJiM0MzsJZ3BhX3QgZ3BhLCBndmEsIGFsaWdubWVudCwgZ3Vlc3RfcGFnZV9zaXplLCBob3N0X3BhZ2Vfc2l6ZTsKJiM0MzsJZ3BhX3QgYmFja2luZ19zcmNfcGFnZXN6LCBtZW1fcGFnZV9zaXplOwomIzQzOwlzdHJ1Y3QgdGVzdF9wYXJhbXMgKnAgPSBhcmc7CiAJY29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0gewotCQkubW9kZSA9IFZNX01PREVfREVGQVVMVCwKLQkJLnR5cGUgPSB2bV90eXBlLAomIzQzOwkJLm1vZGUgPSBndWVzdF9tb2RlLAomIzQzOwkJLnR5cGUgPSBwLSZndDt2bV90eXBlLAogCX07CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwomIzQzOwlzdHJ1Y3Qga3ZtX3J1biAqcnVuOwogCXN0cnVjdCBrdm1fdm0gKnZtOwogCXN0cnVjdCB1Y2FsbCB1YzsKIAomIzQzOwlwcl9pbmZvKCYjMzQ7VGVzdGluZyBndWVzdCBtb2RlOiAlc1xuJiMzNDssIHZtX2d1ZXN0X21vZGVfc3RyaW5nKGd1ZXN0X21vZGUpKTsKJiM0MzsJcHJfaW5mbygmIzM0O1Rlc3RpbmcgbWVtb3J5IGJhY2tpbmcgc3JjIHR5cGU6ICVzXG4mIzM0OywKJiM0MzsJCXZtX21lbV9iYWNraW5nX3NyY19hbGlhcyhwLSZndDttZW1fYmFja2luZ19zcmMpLSZndDtuYW1lKTsKJiM0MzsKIAl2bSA9IHZtX2NyZWF0ZV9zaGFwZV93aXRoX29uZV92Y3B1KHNoYXBlLCAmYW1wO3ZjcHUsIGd1ZXN0X2NvZGUpOwogCi0JYWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7Ci0JZ3BhID0gKHZtLSZndDttYXhfZ2ZuIC0gVEVTVF9OUEFHRVMpICogZ3Vlc3RfcGFnZV9zaXplOwomIzQzOwlndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tndWVzdF9tb2RlXS5wYWdlX3NpemU7CiYjNDM7CWhvc3RfcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKJiM0MzsJYmFja2luZ19zcmNfcGFnZXN6ID0gZ2V0X2JhY2tpbmdfc3JjX3BhZ2VzeihwLSZndDttZW1fYmFja2luZ19zcmMpOwomIzQzOwltZW1fcGFnZV9zaXplID0gbWF4KGhvc3RfcGFnZV9zaXplLCBiYWNraW5nX3NyY19wYWdlc3opOwomIzQzOwomIzQzOwl0ZXN0X2NvbmZpZy5wYWdlX3NpemUgPSBndWVzdF9wYWdlX3NpemU7CiYjNDM7CXRlc3RfY29uZmlnLnRlc3Rfc2l6ZSA9IGFsaWduX3VwKFRFU1RfQkFTRV9TSVpFICYjNDM7IHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSwKJiM0MzsJCQkJCSBtZW1fcGFnZV9zaXplKTsKJiM0MzsJdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS0mZ3Q7bW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTsKJiM0MzsKJiM0MzsJZ3BhID0gKHZtLSZndDttYXhfZ2ZuIC0gdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpICogdGVzdF9jb25maWcucGFnZV9zaXplOwogCWFsaWdubWVudCA9IFNaXzJNOwomIzQzOwlhbGlnbm1lbnQgPSBtYXgoYWxpZ25tZW50LCBtZW1fcGFnZV9zaXplKTsKIAlncGEgPSBhbGlnbl9kb3duKGdwYSwgYWxpZ25tZW50KTsKIAlndmEgPSBncGEgJmFtcDsgKCgxVUxMICZsdDsmbHQ7ICh2bS0mZ3Q7dmFfYml0cyAtIDEpKSAtIDEpOwogCi0Jdm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZ3BhLCBURVNUX1NMT1QsCi0JCQkJICAgIFRFU1RfTlBBR0VTLCBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApOwotCXZpcnRfbWFwKHZtLCBndmEsIGdwYSwgVEVTVF9OUEFHRVMpOwomIzQzOwl2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIHAtJmd0O21lbV9iYWNraW5nX3NyYywKJiM0MzsJCQkJICAgIGdwYSwgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywKJiM0MzsJCQkJICAgIHAtJmd0O3ByaXZhdGUgPyBLVk1fTUVNX0dVRVNUX01FTUZEIDogMCk7CiYjNDM7CXZpcnRfbWFwKHZtLCBndmEsIGdwYSwgdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpOwomIzQzOwomIzQzOwlpZiAocC0mZ3Q7cHJpdmF0ZSkKJiM0MzsJCXZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUpOwomIzQzOwomIzQzOwlwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLAomIzQzOwkJCSBwLSZndDttZW1fYmFja2luZ19zcmMsIHAtJmd0O3ByaXZhdGUpOwomIzQzOwkvKiBSZXRyeSB0aGUgc2FtZSByYW5nZSBhZnRlciB0aGUgZmlyc3QgcHJlZmF1bHQgYXR0ZW1wdC4gKi8KJiM0MzsJcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSwgMCwKJiM0MzsJCQkgcC0mZ3Q7bWVtX2JhY2tpbmdfc3JjLCBwLSZndDtwcml2YXRlKTsKJiM0MzsJcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsCiYjNDM7CQkJIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLAomIzQzOwkJCSBob3N0X3BhZ2Vfc2l6ZSAqIDIsIGhvc3RfcGFnZV9zaXplLAomIzQzOwkJCSBwLSZndDttZW1fYmFja2luZ19zcmMsIHAtJmd0O3ByaXZhdGUpOwomIzQzOwlwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplLAomIzQzOwkJCSBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsCiYjNDM7CQkJIHAtJmd0O21lbV9iYWNraW5nX3NyYywgcC0mZ3Q7cHJpdmF0ZSk7CiAKLQlpZiAocHJpdmF0ZSkKLQkJdm1fbWVtX3NldF9wcml2YXRlKHZtLCBncGEsIFRFU1RfU0laRSk7CiYjNDM7CXZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTsKIAotCXByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCBTWl8yTSwgMCwgcHJpdmF0ZSk7Ci0JcHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIFNaXzJNLCBQQUdFX1NJWkUgKiAyLCBQQUdFX1NJWkUsIHByaXZhdGUpOwotCXByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTsKJiM0MzsJLyogRXhwb3J0IHRoZSBzaGFyZWQgdmFyaWFibGVzIHRvIHRoZSBndWVzdC4gKi8KJiM0MzsJc3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTsKIAotCXZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTsKIAl2Y3B1X3J1bih2Y3B1KTsKIAomIzQzOwlydW4gPSB2Y3B1LSZndDtydW47CiYjNDM7CVRFU1RfQVNTRVJUKHJ1bi0mZ3Q7ZXhpdF9yZWFzb24gPT0gVUNBTExfRVhJVF9SRUFTT04sCiYjNDM7CQkgICAgJiMzNDtXYW50ZWQgJXMsIGdvdCBleGl0IHJlYXNvbjogJXUgKCVzKSYjMzQ7LAomIzQzOwkJICAgIGV4aXRfcmVhc29uX3N0cihVQ0FMTF9FWElUX1JFQVNPTiksCiYjNDM7CQkgICAgcnVuLSZndDtleGl0X3JlYXNvbiwgZXhpdF9yZWFzb25fc3RyKHJ1bi0mZ3Q7ZXhpdF9yZWFzb24pKTsKJiM0MzsKIAlzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCAmYW1wO3VjKSkgewogCWNhc2UgVUNBTExfQUJPUlQ6CiAJCVJFUE9SVF9HVUVTVF9BU1NFUlQodWMpOwpAQCAtMjA3LDI0ICYjNDM7MjY0LDYxIEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKQogCWt2bV92bV9mcmVlKHZtKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgdm1fdHlwZSwgYm9vbCBwcml2YXRlKQomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsCiYjNDM7CQkJCSAgYm9vbCBwcml2YXRlKQogewomIzQzOwlzdHJ1Y3QgdGVzdF9wYXJhbXMgcCA9IHsKJiM0MzsJCS52bV90eXBlID0gdm1fdHlwZSwKJiM0MzsJCS5wcml2YXRlID0gcHJpdmF0ZSwKJiM0MzsJCS5tZW1fYmFja2luZ19zcmMgPSBiYWNraW5nX3NyYywKJiM0MzsJfTsKJiM0MzsKIAlpZiAodm1fdHlwZSAmYW1wOyZhbXA7ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSAmYW1wOyBCSVQodm1fdHlwZSkpKSB7CiAJCXByX2luZm8oJiMzNDtTa2lwcGluZyB0ZXN0cyBmb3Igdm1fdHlwZSAweCVseFxuJiMzNDssIHZtX3R5cGUpOwogCQlyZXR1cm47CiAJfQogCi0JX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7CiYjNDM7CWZvcl9lYWNoX2d1ZXN0X21vZGUoX190ZXN0X3ByZV9mYXVsdF9tZW1vcnksICZhbXA7cCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSkKJiM0Mzt7CiYjNDM7CXB1dHMoJiMzNDsmIzM0Oyk7CiYjNDM7CXByaW50ZigmIzM0O3VzYWdlOiAlcyBbLWhdIFstbSBtb2RlXSBbLXMgbWVtLXR5cGVdXG4mIzM0OywgbmFtZSk7CiYjNDM7CXB1dHMoJiMzNDsmIzM0Oyk7CiYjNDM7CWd1ZXN0X21vZGVzX2hlbHAoKTsKJiM0MzsJYmFja2luZ19zcmNfaGVscCgmIzM0Oy1zJiMzNDspOwomIzQzOwlwdXRzKCYjMzQ7JiMzNDspOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewomIzQzOwllbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7CiYjNDM7CWludCBvcHQ7CiYjNDM7CiYjNDM7CWd1ZXN0X21vZGVzX2FwcGVuZF9kZWZhdWx0KCk7CiYjNDM7CiYjNDM7CXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7aG06czomIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O20mIzM5OzoKJiM0MzsJCQlndWVzdF9tb2Rlc19jbWRsaW5lKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7cyYjMzk7OgomIzQzOwkJCWJhY2tpbmcgPSBwYXJzZV9iYWNraW5nX3NyY190eXBlKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7aCYjMzk7OgomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQloZWxwKGFyZ3ZbMF0pOwomIzQzOwkJCWV4aXQoMCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTsKIAotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7CiYjNDM7CXRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBiYWNraW5nLCBmYWxzZSk7CiAjaWZkZWYgX194ODZfNjRfXwotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgZmFsc2UpOwotCXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgdHJ1ZSk7CiYjNDM7CXRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgZmFsc2UpOwomIzQzOwl0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIHRydWUpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyOTk2CgkJCQkJCQlvdXRwdXQ6IDE3CgkJCQkJCQl0aG91Z2h0czogODM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZSBpZiBpdCYjMzk7cyBhIGdvb2QgY2FuZGlkYXRlIGZvciBzeXprYWxsZXIgZnV6emluZy4gVGhlIGZpcnN0IHRoaW5nIEkmIzM5O20gZ29pbmcgdG8gY2hlY2sgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEFoLCAmIzM0O2FtZDY0JiMzNDsuIE5vdCBncmVhdCwgYnV0IGxldCYjMzk7cyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBwYXRjaCBkaWZmIGl0c2VsZiB0byBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBiZWVuIHRvdWNoZWQuCgpPa2F5LCBsZXQmIzM5O3MgcmVhZCB0aHJvdWdoIHRoZSBwYXRjaCBkaWZmIGFuZCBzZWUgd2hhdCYjMzk7cyBjaGFuZ2VkLiBMb29rcyBsaWtlIHdlIGhhdmUgY2hhbmdlcyBpbiBgRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0YCwgd2hpY2ggaXMganVzdCBkb2N1bWVudGF0aW9uLCBzbyBubyBiaWcgZGVhbCB0aGVyZS4gVGhlbiB0aGVyZSBhcmUgYSBidW5jaCBvZiBmaWxlcyB1bmRlciBgYXJjaC9hcm02NGA6IGluY2x1ZGVzIGFuZCBzb3VyY2UgY29kZSByZWxhdGVkIHRvIEtWTSDigJMgYGVzci5oYCwgYGt2bV9lbXVsYXRlLmhgLCBga3ZtX3BndGFibGUuaGAsIGBrdm1fcGt2bS5oYCwgYEtjb25maWdgLCBgYXJtLmNgLCBhbmQgbW9yZS4gVGhlcmUmIzM5O3MgYWxzbyBzb21lIHN0dWZmIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYCByZWxhdGVkIHRvIHRlc3RzLCBlc3BlY2lhbGx5IGZvciBgYXJtNjRgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogaXMgdGhlcmUgKmFueXRoaW5nKiBhZmZlY3RpbmcgeDg2IG9yIGNvbW1vbiBrZXJuZWwgY29kZT8gSSBuZWVkIHRvIGJlIGFic29sdXRlbHkgc3VyZSBiZWNhdXNlIHN5emthbGxlciYjMzk7cyBtYWluIHN0cmVuZ3RoIGlzIGdlbmVyYWxseSBvbiB4ODYsIG5vdCBhcm02NCwgc28gaXQgbmVlZHMgdG8gYmUgY2FyZWZ1bGx5IGludmVzdGlnYXRlZC4gTGV0IG1lIG1ldGljdWxvdXNseSBnbyB0aHJvdWdoIGV2ZXJ5IGZpbGUgbGlzdGVkIGluIHRoZSBkaWZmOiBgRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0YCwgYWxsIHRoZSBgYXJjaC9hcm02NGAgZmlsZXMsIGFuZCB0aGUgYHRvb2xzL3Rlc3RpbmdgIGZpbGVzLgoKTm9wZS4gTm90aGluZy4gSXQmIzM5O3MgYWxsIGVpdGhlciBkb2N1bWVudGF0aW9uLCBhcm02NC1zcGVjaWZpYyBLVk0gY29kZSwgb3IgdGVzdHMgZm9yIGFybTY0LiBKdXN0IHRvIGJlIGFic29sdXRlbHksIHBvc2l0aXZlbHkgY2VydGFpbiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoaXMgd2l0aCBhIGBnaXQgZGlmZmAgb3IgYGdpdCBzaG93YCB0byBsZWF2ZSBubyBkb3VidC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxMzoxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtkaWZmIC0tZ2l0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0PTk5PUZvciBleGFtcGxlLCB0byBwcmludCBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCBmb3IgQlBGIHByb2dyYW0gaWQgNTMwNzc6XG4tLVxuRG9jdW1lbnRhdGlvbi9icGYvZHJnbi5yc3QtMTAzLSAgICAlIGdpdCBkaWZmXG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdDoxMDQ6ICAgIGRpZmYgLS1naXQgYS90b29scy9icGZfaW5zcGVjdC5weSBiL3Rvb2xzL2JwZl9pbnNwZWN0LnB5XG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdC0xMDUtICAgIGluZGV4IDY1MGUyMjguLmFlYTIzNTcgMTAwNzU1XG4tLVxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdD01ND13b24mIzM5O3QgYnJlYWsgdXNlcnNwYWNlOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTY5LSAgICAgICogIGNvbXAyX3QgaXMgMjQtYml0IHdpdGggNS1iaXQgYmFzZSAyIGV4cG9uZW50IGFuZCAyMCBiaXQgZnJhY3Rpb25cbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3Q6NzA6ICAgIGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3QtNzEtICAgIEVPRlxuLS1cbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3Q9MzEwPUNvbnNpZGVyIHRoaXMgY2hhbmdlOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxMi0gICAgY2F0IFx1MDAzY1x1MDAzYyAmIzM5O0VPRiYjMzk7IHwgcGF0Y2ggLWwgLXAxXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0OjMxMzogICAgZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvS2J1aWxkXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxNC0gICAgaW5kZXggZWJiMTgwYWFjNzRlLi5hOWM4OGIwYThiM2IgMTAwNjQ0XG4tLVxuRG9jdW1lbnRhdGlvbi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdD04ND1sb29rZWQgbGlrZSB0aGlzOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwMi1cbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q6MTAzOiAgZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMgYi9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwNC0gIGluZGV4IDU3ZjY5NDRkNjVhNi4uMDBjOWI4MGIzZDMzIDEwMDY0NFxuLS1cbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdD03Mz1jaGFuZ2U6OlxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0LTc0LVxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojc1Olx0ZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmNcbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdC03Ni1cdC0tLSBhL21tL21yZW1hcC5jXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q9MzY9Q+S7o+eggee8luivkeWZqOWPkeWHuueahOitpuWRiuW4uOW4uOS8muiiq+inhuS4uuivr+aKpe+8jOS7juiAjOWvvOiHtOWHuueOsOS6huaXqOWcqOiuqee8luivkeWZqOmXreWYtOeahOihpeS4geOAglxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg2LVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q6ODc6ICBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmNcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg4LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XG4tLVxuc2NyaXB0cy9jaGVja3BhdGNoLnBsPTI2NzE9c3ViIHByb2Nlc3Mge1xuLS1cbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yODQ0LVx0XHQgICAgKCRsaW5lID1+IC9ecmVuYW1lICg/OmZyb218dG8pIFxcUyYjNDM7XFxzKiQvIHx8XG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw6Mjg0NTpcdFx0ICAgICAkbGluZSA9fiAvXmRpZmYgLS1naXQgYVxcL1tcXHdcXC9cXC5cXF9cXC1dJiM0MzsgYlxcL1xcUyYjNDM7XFxzKiQvKSkpIHtcbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yODQ2LVx0XHRcdCRpc19wYXRjaCA9IDE7XG4tLVxuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI5MDItXHRcdCMgZXh0cmFjdCB0aGUgZmlsZW5hbWUgYXMgaXQgcGFzc2VzXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw6MjkwMzpcdFx0aWYgKCRsaW5lID1+IC9eZGlmZiAtLWdpdC4qPyhcXFMmIzQzOykkLykge1xuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI5MDQtXHRcdFx0JHJlYWxmaWxlID0gJDE7XG4tLVxuc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbD01NTI9Zm9yZWFjaCBteSAkZmlsZSAoQEFSR1YpIHtcbi0tXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMS1cdFx0cHVzaChAZmlsZXMsICRmaWxlbmFtZSk7XG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsOjYwMjpcdCAgICB9IGVsc2lmIChtL15kaWZmIC0tZ2l0IGFcXC8oXFxTJiM0MzspIGJcXC8oXFxTJiM0MzspXFxzKiQvKSB7XG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMy1cdFx0bXkgJGZpbGVuYW1lMSA9ICQxO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1MzY0CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6CgoqKkNoZWNraW5nIHRoZSBSZWNlbnQgR2l0IEFjdGl2aXR5KioKCk9rYXksIEkgbmVlZCB0byBxdWlja2x5IHNlZSB3aGF0IHRoZSBtb3N0IHJlY2VudCBjb21taXQgaW4gdGhpcyByZXBvc2l0b3J5IGFjdHVhbGx5ICpkaWQqLiBSYXRoZXIgdGhhbiBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGNvbW1pdCBoaXN0b3J5IHZpc3VhbGx5ICh3aGljaCBjYW4gYmUgdGltZS1jb25zdW1pbmcpLCBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIGBnaXRgIHRvIGdpdmUgbWUgYSBjb25jaXNlIG92ZXJ2aWV3LiBJJiMzOTttIHRoaW5raW5nIEkgc2hvdWxkIHVzZSBgZ2l0IHNob3cgLS1zdGF0IEhFQURgIGNvbW1hbmQuIGBzaG93YCB3aWxsIGRpc3BsYXkgdGhlIGFjdHVhbCBjb21taXQsIGFuZCB0aGUgYC0tc3RhdGAgb3B0aW9uIHdpbGwgZ2l2ZSBtZSB0aGUgY2hhbmdlcyBicm9rZW4gZG93biBmaWxlIGJ5IGZpbGUuIFRoaXMgd2lsbCBwcmVzZW50IGEgY2xlYXIgc3VtbWFyeSBvZiB3aGF0JiMzOTtzIGJlZW4gYWRkZWQsIGRlbGV0ZWQsIG9yIG1vZGlmaWVkIGluIHRoYXQgbGFzdCBjb21taXQuIFRoaXMgaXMgdGhlIHF1aWNrZXN0IHdheSB0byBnZXQgdGhlIGdpc3Qgb2YgaXQuIFRoaXMgd2lsbCBzaG93IG1lIHRoZSBjaGFuZ2VzLiBBbHRlcm5hdGl2ZWx5LCBgZ2l0IGRpZmYtdHJlZSAtLXN0YXQgSEVBRGAgaXMgYW4gb3B0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2t2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2FyY2gvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQva3ZtL21tdS5jPTI5MTk9cHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXG4tLVxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzMi0vKipcbmFyY2gvYXJtNjQva3ZtL21tdS5jOjI5MzM6ICoga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5IC0gcHJlLWZhdWx0IHN0YWdlLTIgcGFnZSB0YWJsZXMgZm9yIHRoZVxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzNC0gKiBzcGVjaWZpZWQgR1BBLlxuLS1cbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDUtICovXG5hcmNoL2FybTY0L2t2bS9tbXUuYzoyOTQ2Omxvbmcga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDctXHRcdFx0XHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcbi0tXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM9NTc5Nz12b2lkIGt2bV9hcmNoX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg0MC0vKipcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYzo1ODQxOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSgpIC0tIHByZS1mYXVsdCBhbmQgbGluayBnbWFwIGRhdCB0YWJsZXNcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODQyLSAqIEB2Y3B1OiB0aGUgdmNwdSB0aGF0IHNoYWxsIGFwcGVhciB0byBoYXZlIGdlbmVyYXRlZCB0aGUgZmF1bHQtaW4uXG4tLVxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jLTU4NTktICovXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM6NTg2MDpsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg2MS17XG4tLVxuYXJjaC94ODYva3ZtL21tdS9tbXUuYz00OTczPXN0YXRpYyBpbnQga3ZtX3RkcF9wYWdlX3ByZWZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLFxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxNi1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTAxNzpsb25nIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUwMTgtXHRcdFx0XHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcbi0tXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jPTE3MDE9c3RhdGljIGludCB0ZHhfc2VwdF9tYXBfbGVhZl9zcHRlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBlbnVtIHBnX2xldmVsIGxldmVsLFxuLS1cbmFyY2gveDg2L2t2bS92bXgvdGR4LmMtMTcxMy1cdC8qXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jOjE3MTQ6XHQgKiBFbnN1cmUgcHJlX2ZhdWx0X2FsbG93ZWQgaXMgcmVhZCBieSBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoKVxuYXJjaC94ODYva3ZtL3ZteC90ZHguYy0xNzE1LVx0ICogYmVmb3JlIGt2bV90ZHgtXHUwMDNlc3RhdGUuICBVc2Vyc3BhY2UgbXVzdCBub3QgYmUgYWxsb3dlZCB0byBwcmUtZmF1bHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxMzoxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQ2OQoJCQkJCQkJb3V0cHV0OiAxMjIKCQkJCQkJCXRob3VnaHRzOiAxMDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEtWTSBQYXRjaCBmb3IgV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgZmlyc3QgdGhpbmdzIGZpcnN0LCBsZXQmIzM5O3MgZXN0YWJsaXNoIHRoZSBjb250ZXh0LiBXZSYjMzk7cmUgbG9va2luZyBhdCBhIHBhdGNoIHNldCwgYW5kIHRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBBaCwgdGhlIGBnaXQgZGlmZmAgaXMgYWxyZWFkeSBwcm92aWRlZC4gRXhjZWxsZW50LiBMZXQmIzM5O3MgcmV2aWV3IGl0IGFnYWluLgoKSXQgc2VlbXMgdG8gYmUgYWxsIHRoaW5ncyBLVk0sIGJ1dCB0aGUgZGlmZiByZXZlYWxzOgoqICAgYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAKKiAgIGBhcmNoL2FybTY0Ly4uLmAgZXh0ZW5zaXZlbHkKKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vLi4uYAoKTm93LCBsZXQmIzM5O3MgY29uc3VsdCB0aGUgY3JpdGVyaWEgZm9yIGRlY2lkaW5nICphZ2FpbnN0KiBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgU0VDVElPTiAyLiBJIG5lZWQgdG8gY29uZmlybSB0aGF0IHRoaXMgcGF0Y2ggKmRvZXNuJiMzOTt0KiB3YXJyYW50IGZ1enppbmcgYmFzZWQgb24gdGhlIGRlZmluZWQgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgaGVyZSBhcmUgdGhlIHNjZW5hcmlvcyB3aGVyZSB3ZSBkZWZpbml0aXZlbHkgKmRvbiYjMzk7dCogZnV6ei4gSSBzZWUgdGhlIG1haW4gcG9pbnRzIGFzOgoqICAgRG9jdW1lbnRhdGlvbi8gYW5kIHNlbGYtdGVzdHMgKHRvb2xzLykgdGhhdCBkb24mIzM5O3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuCiogICAmIzM0O0NvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OwoKQWxyaWdodCwgbGV0JiMzOTtzIGNvbm5lY3QgdGhlIGRvdHMuIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGF0JiMzOTtzIHdoYXQmIzM5O3MgcmVsZXZhbnQgdG8gdGhpcyBmdXp6aW5nIGV4ZXJjaXNlLiBMb29raW5nIGF0IHRoZSBwYXRjaCBzZXQsIHRoZSBrZXJuZWwgY2hhbmdlcyBhcmUgKnN0cmljdGx5KiB1bmRlciBgYXJjaC9hcm02NC9gLiBJdCYjMzk7cyBhbGwgQVJNNjQgS1ZNLXJlbGF0ZWQsIGluY2x1ZGluZyBoZWFkZXJzIGFuZCBjb3JlIEtWTSBpbXBsZW1lbnRhdGlvbiBmaWxlcy4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUuIFRoZSByZXN0IGlzIGRvY3VtZW50YXRpb24gYW5kIHRob3NlIHVzZXItc3BhY2Ugc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHNgLgoKVGhlIGltcGxpY2F0aW9uIGlzIG9idmlvdXM6IHRoZSBrZXJuZWwgY29kZSBjaGFuZ2VzIHdpbGwgbm90IGJlIGNvbXBpbGVkIG9yIGV4ZWN1dGVkIG9uIGFtZDY0LgoKVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQmIzM5O3MgcGVyZm9ybSBhIHNhbml0eSBjaGVjay4gTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGNvbW1vbiBLVk0gY29kZSBjaGFuZ2VzLiBJJiMzOTtsbCBzZWFyY2ggYHZpcnQva3ZtL2AgYW5kIGBpbmNsdWRlL2xpbnV4L2t2bSpgIGZvciBhbnkgdG91Y2hlZCBmaWxlcy4gTm90aGluZy4gTm90IGEgc2luZ2xlIGZpbGUgaW4gdGhlc2UgbG9jYXRpb25zISBUaGlzIGNvbmZpcm1zIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGlzb2xhdGVkIHRvIEFSTTY0IGFuZCB0aGUgb3RoZXIgbm9uLWtlcm5lbCBlbGVtZW50cy4KClRoaXMgcGF0Y2ggaXMgZXhjbHVzaXZlbHkgZGVhbGluZyB3aXRoIEFSTTY0IEtWTSBhbmQgc2VsZi10ZXN0cy4gVGhlIEtWTSBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIHRhcmdldCBhbWQ2NCBhcmNoaXRlY3R1cmUgaXMgbm90IGludm9sdmVkLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGZhbGxzIGludG8gdGhyZWUgb2YgdGhlICYjMzQ7bmVnYXRpdmUgY3JpdGVyaWEmIzM0OzoKKiAgIERvY3VtZW50YXRpb24gY2hhbmdlcwoqICAgVXNlci1zcGFjZSBkaXJlY3RvcmllcyAvIHNlbGYtdGVzdHMKKiAgIENvZGUgZXhjbHVzaXZlIHRvIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZS4KCkJhc2VkIG9uIHRoaXMsIHRoZSBmdXp6aW5nLXdvcnRoaW5lc3MgcGFyYW1ldGVycyBhcmUgY2xlYXI6CgoqICAgYFdvcnRoRnV6emluZ2A6IGZhbHNlCiogICBgRm9jdXNTeW1ib2xzYDogXFsgXQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBcWyBdCiogICBgUmVhc29uaW5nYDogVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgYXJlIGV4Y2x1c2l2ZSB0byBhcmNoL2FybTY0IChpbXBsZW1lbnRpbmcgS1ZNX1BSRV9GQVVMVF9NRU1PUlkgc3VwcG9ydCBmb3IgYXJtNjQgS1ZNKS4gVGhlIHJlbWFpbmRlciBvZiB0aGUgY2hhbmdlcyBhcmUgZG9jdW1lbnRhdGlvbiBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC4gVGhlcmVmb3JlLCBub25lIG9mIHRoZSBtb2RpZmllZCBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIGlzIHJlYWNoYWJsZSBvciBjb21waWxlZCBvbiBhbWQ2NC4KCk5vdywgd2l0aCB0aGlzIHJhdGlvbmFsZSBhbmQgZGVmaW5pdGl2ZSBmaW5kaW5ncywgSSBjYW4gY29uZmlkZW50bHkgc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGtlcm5lbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBleGNsdXNpdmUgdG8gYXJjaC9hcm02NCAoYWRkaW5nIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHN1cHBvcnQgdG8gYXJtNjQgS1ZNKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIGFyZSBsaW1pdGVkIHRvIERvY3VtZW50YXRpb24vIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gQmVjYXVzZSBubyByZWFjaGFibGUgY29kZSBpcyBjb21waWxlZCBvciBleGVjdXRlZCBvbiBhbWQ2NCwgdGhpcyBwYXRjaCBzZXJpZXMgZG9lcyBub3Qgd2FycmFudCBmdXp6aW5nIG9uIHRoaXMgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDEzOjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNC42MjQ2MjE3MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODk1ODcyOTg0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNC42MjQ2Mjc0MTRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMzIyNTc1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDVlYmU0MzFmY2YxOTJhMGI5NDIyOWI1NGQ5ZmFiNTBlZDA5NmYzOGJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgMTQgMTM6MTM6MDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0IGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XFxuaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RcXG5AQCAtNjQ4NSw3ICs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gXFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcXG4tOkFyY2hpdGVjdHVyZXM6IG5vbmVcXG4rOkFyY2hpdGVjdHVyZXM6IHg4NiwgczM5MCwgYXJtNjRcXG4gOlR5cGU6IHZjcHUgaW9jdGxcXG4gOlBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAoaW4vb3V0KVxcbiA6UmV0dXJuczogMCBpZiBhdCBsZWFzdCBvbmUgcGFnZSBpcyBwcm9jZXNzZWQsIFxcdTAwM2MgMCBvbiBlcnJvclxcbkBAIC02NDkzLDEyICs2NDkzLDE0IEBAIFNlZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy5cXG4gRXJyb3JzOlxcbiBcXG4gICA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbisgIEVBR0FJTiAgICAgQSByYWNlIG9jY3VycmVkIGJlZm9yZSBwcm9ncmVzcyB3YXMgbWFkZSwgYnV0IGEgcmV0cnkgbWF5IHN1Y2NlZWQuXFxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxcbiAgICAgICAgICAgICAgcGFnZSBhbGlnbmVkLCBjYXVzZXMgYW4gb3ZlcmZsb3csIG9yIHNpemUgaXMgemVybyksIG9yIHRoZSBWTVxcbiAgICAgICAgICAgICAgaXMgVUNPTlRST0wgKHMzOTApLlxcbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXFxuICAgRUlOVFIgICAgICBBbiB1bm1hc2tlZCBzaWduYWwgaXMgcGVuZGluZyBhbmQgbm8gcGFnZSB3YXMgcHJvY2Vzc2VkLlxcbiAgIEVGQVVMVCAgICAgVGhlIHBhcmFtZXRlciBhZGRyZXNzIHdhcyBpbnZhbGlkLlxcbisgIEVIV1BPSVNPTiAgQSBwb2lzb25lZCBob3N0IHBhZ2Ugd2FzIGVuY291bnRlcmVkLlxcbiAgIEVPUE5PVFNVUFAgTWFwcGluZyBtZW1vcnkgZm9yIGEgR1BBIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZVxcbiAgICAgICAgICAgICAgaHlwZXJ2aXNvciwgYW5kL29yIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlL21vZGUuXFxuICAgRUlPICAgICAgICB1bmV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbnMgKGFsc28gY2F1c2VzIGEgV0FSTilcXG5AQCAtNjUxOCw3ICs2NTIwLDE3IEBAIEVycm9yczpcXG4gS1ZNX1BSRV9GQVVMVF9NRU1PUlkgcG9wdWxhdGVzIEtWTSdzIHN0YWdlLTIgcGFnZSB0YWJsZXMgdXNlZCB0byBtYXAgbWVtb3J5XFxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXFxuIHN0YWdlLTIgcmVhZCBwYWdlIGZhdWx0LCBlLmcuIGZhdWx0cyBpbiBtZW1vcnkgYXMgbmVlZGVkLCBidXQgZG9lc24ndCBicmVha1xcbi1Db1cuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzIEFjY2Vzc2VkLlxcbitDb1cuICBPbiBhcm02NCwgS1ZNIG1hcmtzIG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEVzIGFzIEFjY2Vzc2VkLCBhcyBpdFxcbitkb2VzIGZvciBhbnkgc3RhZ2UtMiBmYXVsdCwgYnV0IGxlYXZlcyB0aGUgQWNjZXNzZWQgc3RhdGUgb2YgZXhpc3RpbmcgUFRFc1xcbit1bmNoYW5nZWQuICBPbiB4ODYsIEtWTSBkb2VzIG5vdCBtYXJrIGFueSBuZXdseSBjcmVhdGVkIHN0YWdlLTIgUFRFIGFzXFxuK0FjY2Vzc2VkLCBhbmQgZm9yIHMzOTAgaXQgaXMgbm90IGFwcGxpY2FibGUuXFxuK1xcbitPbiBhcm02NCwgYSBHUEEgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gSVBBLCBhbmQgbmV2ZXIgaW50ZXJwcmV0ZWQgYXMgdGhlIElQQVxcbitvZiBhIG5lc3RlZCBndWVzdC4gUHJlLWZhdWx0aW5nIG9ubHkgcG9wdWxhdGVzIGNhbm9uaWNhbCBzdGFnZSAyIHBhZ2VcXG4rdGFibGVzLlxcbitcXG4rVGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhcm02NCBpZiB0aGUgcHJvdGVjdGVkIEtWTSAocEtWTSkgZmVhdHVyZVxcbitpcyBlbmFibGVkLlxcbiBcXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXFxuIHByaXZhdGUgZ3Vlc3QgbWVtb3J5IGJlZm9yZSB0aGUgZ3Vlc3QgaXMgJ2ZpbmFsaXplZCcvbWVhc3VyZWQsIHRoaXMgaW9jdGxcXG5AQCAtNjUzMyw3ICs2NTQ1LDcgQEAgV2hlbiB0aGUgaW9jdGwgcmV0dXJucywgdGhlIGlucHV0IHZhbHVlcyBhcmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGVcXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFxcdTAwM2UgMCBvbiByZXR1cm4sIHRoZSBjYWxsZXIgY2FuIGp1c3QgaXNzdWVcXG4gdGhlIGlvY3RsIGFnYWluIHdpdGggdGhlIHNhbWUgYHN0cnVjdCBrdm1fbWFwX21lbW9yeWAgYXJndW1lbnQuXFxuIFxcbi1TaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXlcXG4rT24geDg2LCBzaGFkb3cgcGFnZSB0YWJsZXMgY2Fubm90IHN1cHBvcnQgdGhpcyBpb2N0bCBiZWNhdXNlIHRoZXlcXG4gYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLlxcbiBDYWxsaW5nIHRoaXMgaW9jdGwgd2hlbiB0aGUgZ3Vlc3QgaXMgdXNpbmcgc2hhZG93IHBhZ2UgdGFibGVzIChmb3JcXG4gZXhhbXBsZSBiZWNhdXNlIGl0IGlzIHJ1bm5pbmcgYSBuZXN0ZWQgZ3Vlc3Qgd2l0aCBuZXN0ZWQgcGFnZSB0YWJsZXMpXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXFxuaW5kZXggZjgxNmY1ZDc3ZjFhNS4uOWMwMjA1OTgzZDlhOCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxcbkBAIC00MzcsNiArNDM3LDUwIEBAXFxuICNpZm5kZWYgX19BU1NFTUJMRVJfX1xcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3R5cGVzLmhcXHUwMDNlXFxuIFxcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIHU4IGVzcl9nZXRfZWModW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIEVTUl9FTHhfRUMoZXNyKTtcXG4rfVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGVzcl90cmFwX2lzX2lhYnQodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl9nZXRfZWMoZXNyKSA9PSBFU1JfRUx4X0VDX0lBQlRfTE9XO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zMXB0dyh1bnNpZ25lZCBsb25nIGVzcilcXG4re1xcbitcXHRyZXR1cm4gZXNyIFxcdTAwMjYgRVNSX0VMeF9TMVBUVztcXG4rfVxcbitcXG4rLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfd3JpdGUodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzciBcXHUwMDI2IEVTUl9FTHhfV05SO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfY20odW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzciBcXHUwMDI2IEVTUl9FTHhfQ007XFxuK31cXG4rXFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoZXNyKSBcXHUwMDI2XFx1MDAyNiAhZXNyX2FidF9pc19zMXB0dyhlc3IpO1xcbit9XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19zZWEodW5zaWduZWQgbG9uZyBlc3IpXFxuK3tcXG4rXFx0c3dpdGNoIChlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQykge1xcbitcXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcXG4rXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcXG4rXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUNDOlxcbitcXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rfVxcbitcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGVzcl9icmtfY29tbWVudCh1bnNpZ25lZCBsb25nIGVzcilcXG4ge1xcbiBcXHRyZXR1cm4gZXNyIFxcdTAwMjYgRVNSX0VMeF9CUks2NF9JU1NfQ09NTUVOVF9NQVNLO1xcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmhcXG5pbmRleCBhM2MxOTI4YmRmNzQzLi5hM2IyNzIyNjU1NTQzIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxcbisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxcbkBAIC00MTEsMTggKzQxMSwxMyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9kYWJ0X2dldF9yZChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzczF0dyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuICEhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkgXFx1MDAyNiBFU1JfRUx4X1MxUFRXKTtcXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfczFwdHcoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuIH1cXG4gXFxuIC8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXN3cml0ZShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuIGt2bV92Y3B1X2dldF9lc3IodmNwdSkgXFx1MDAyNiBFU1JfRUx4X1dOUjtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi17XFxuLVxcdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFxcdTAwMjYgRVNSX0VMeF9DTSk7XFxuK1xcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcXG4gfVxcbiBcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfYXMoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbkBAIC00MzgsMTcgKzQzMywxMiBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pbF9pczMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdVxcbiBcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0cmV0dXJuIEVTUl9FTHhfRUMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuK1xcdHJldHVybiBlc3JfZ2V0X2VjKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4ge1xcbi1cXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSkgPT0gRVNSX0VMeF9FQ19JQUJUX0xPVztcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuLXtcXG4tXFx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfaXNfaWFidCh2Y3B1KSBcXHUwMDI2XFx1MDAyNiAha3ZtX3ZjcHVfYWJ0X2lzczF0dyh2Y3B1KTtcXG4rXFx0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XFxuIH1cXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTgga3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbkBAIC00NjgsMjYgKzQ1OCw5IEBAIGJvb2wga3ZtX3ZjcHVfdHJhcF9pc190cmFuc2xhdGlvbl9mYXVsdChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdHJldHVybiBlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW5saW5lXFxuLXU2NCBrdm1fdmNwdV90cmFwX2dldF9wZXJtX2ZhdWx0X2dyYW51bGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi17XFxuLVxcdHVuc2lnbmVkIGxvbmcgZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcXG4tXFxuLVxcdEJVR19PTighZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcikpO1xcbi1cXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoZXNyIFxcdTAwMjYgRVNSX0VMeF9GU0NfTEVWRUwpKTtcXG4tfVxcbi1cXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGt2bV92Y3B1X2FidF9pc3NlYShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4tXFx0c3dpdGNoIChrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSkge1xcbi1cXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcXG4tXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcXG4tXFx0Y2FzZSBFU1JfRUx4X0ZTQ19TRUNDOlxcbi1cXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHRkZWZhdWx0Olxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG5AQCAtNDk2LDkgKzQ2OSw5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGt2bV92Y3B1X3N5c19nZXRfcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRyZXR1cm4gRVNSX0VMeF9TWVM2NF9JU1NfUlQoZXNyKTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKVxcbiB7XFxuLVxcdGlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7XFxuK1xcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcXG4gXFx0XFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXFxuQEAgLTUxMSwxMyArNDg0LDE4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHQgKiBmaXJzdCksIHRoZW4gYSBwZXJtaXNzaW9uIGZhdWx0IHRvIGFsbG93IHRoZSBmbGFnc1xcbiBcXHRcXHQgKiB0byBiZSBzZXQuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpO1xcbitcXHRcXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KGVzcik7XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkpXFxuK1xcdGlmIChlc3JfdHJhcF9pc19pYWJ0KGVzcikpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuLVxcdHJldHVybiBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUodmNwdSk7XFxuK1xcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShlc3IpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wga3ZtX2lzX3dyaXRlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4re1xcbitcXHRyZXR1cm4gZXNyX2FidF9pc193cml0ZV9mYXVsdChrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcXG4gfVxcbiBcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2bV92Y3B1X2dldF9tcGlkcl9hZmYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaFxcbisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3BndGFibGUuaFxcbkBAIC04NTksNiArODU5LDggQEAgaW50IGt2bV9wZ3RhYmxlX3dhbGsoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLCB1NjQgc2l6ZSxcXG4gICogQGFkZHI6XFx0SW5wdXQgYWRkcmVzcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSB3YWxrLlxcbiAgKiBAcHRlcDpcXHRQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXRyaWV2ZWQgUFRFLlxcbiAgKiBAbGV2ZWw6XFx0UG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgbGV2ZWwgb2YgdGhlIHJldHJpZXZlZCBQVEUuXFxuKyAqIEBmbGFnczpcXHRGbGFncyB0byBjb250cm9sIHRoZSBwYWdlLXRhYmxlIHdhbGtcXG4rICpcXHRcXHQoc2VlIHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHgpLlxcbiAgKlxcbiAgKiBUaGUgb2Zmc2V0IG9mIEBhZGRyIHdpdGhpbiBhIHBhZ2UgaXMgaWdub3JlZC5cXG4gICpcXG5AQCAtODY5LDcgKzg3MSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXFxuICAqL1xcbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxcbi1cXHRcXHRcXHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpO1xcbitcXHRcXHRcXHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwsXFxuK1xcdFxcdFxcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xcbiBcXG4gLyoqXFxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX3Brdm0uaFxcbmluZGV4IGJlZWEwMGU2OTNhMGEuLjRkNmU1NzY1ZTllNTYgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXFxuQEAgLTQ0LDkgKzQ0LDkgQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9wa3ZtX2V4dF9hbGxvd2VkKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpXFxuIFxcdGNhc2UgS1ZNX0NBUF9BUk1fUFRSQVVUSF9HRU5FUklDOlxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9NVEU6XFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9FQUdFUl9TUExJVF9DSFVOS19TSVpFOlxcbiBcXHRjYXNlIEtWTV9DQVBfQVJNX1NVUFBPUlRFRF9CTE9DS19TSVpFUzpcXG4rXFx0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuICFrdm0gfHwgIWt2bV92bV9pc19wcm90ZWN0ZWQoa3ZtKTtcXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcXG5pbmRleCA0NDkxNTRmOWE0ODUyLi43MTIzMzA2OGI3Y2I2IDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnXFxuQEAgLTM3LDYgKzM3LDcgQEAgbWVudWNvbmZpZyBLVk1cXG4gXFx0c2VsZWN0IFNDSEVEX0lORk9cXG4gXFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTIGlmIFBFUkZfRVZFTlRTXFxuIFxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkRcXG4rXFx0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcXG4gXFx0aGVscFxcbiBcXHQgIFN1cHBvcnQgaG9zdGluZyB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcy5cXG4gXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2FybS5jIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcXG5pbmRleCBjY2FlODJjMTI0MmJjLi41OGFjNzBmMzFkODRlIDEwMDY0NFxcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL2FybS5jXFxuKysrIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcXG5AQCAtMzkzLDYgKzM5Myw3IEBAIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uKHN0cnVjdCBrdm0gKmt2bSwgbG9uZyBleHQpXFxuIFxcdGNhc2UgS1ZNX0NBUF9DT1VOVEVSX09GRlNFVDpcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9XUklUQUJMRV9JTVBfSURfUkVHUzpcXG4gXFx0Y2FzZSBLVk1fQ0FQX0FSTV9TRUFfVE9fVVNFUjpcXG4rXFx0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XFxuIFxcdFxcdHIgPSAxO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBLVk1fQ0FQX1NFVF9HVUVTVF9ERUJVRzI6XFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXFxuaW5kZXggMzlhYTg5MTFmNjJjMS4uMjNhNTczMTJiOTgxYiAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXFxuKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xcbkBAIC01MzIsNyArNTMyLDcgQEAgc3RhdGljIGludCBob3N0X3N0YWdlMl9hZGp1c3RfcmFuZ2UodTY0IGFkZHIsIHN0cnVjdCBrdm1fbWVtX3JhbmdlICpyYW5nZSlcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGh5cF9hc3NlcnRfbG9ja19oZWxkKFxcdTAwMjZob3N0X21tdS5sb2NrKTtcXG4tXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsKTtcXG4rXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsLCAwKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTkxMCw3ICs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxcbiBcXHRzOCBsZXZlbDtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcdGlmIChndWVzdF9wdGVfaXNfcG9pc29uZWQocHRlKSlcXG5AQCAtOTU5LDcgKzk1OSw3IEBAIGludCBfX3Brdm1fdmNwdV9pbl9wb2lzb25fZmF1bHQoc3RydWN0IHBrdm1faHlwX3ZjcHUgKmh5cF92Y3B1KVxcbiBcXHRpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKFxcdTAwMjZoeXBfdmNwdS1cXHUwMDNldmNwdSkpO1xcbiBcXG4gXFx0Z3Vlc3RfbG9ja19jb21wb25lbnQodm0pO1xcbi1cXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcXHUwMDI2dm0tXFx1MDAzZXBndCwgaXBhLCBcXHUwMDI2cHRlLCBcXHUwMDI2bGV2ZWwpO1xcbitcXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcXHUwMDI2dm0tXFx1MDAzZXBndCwgaXBhLCBcXHUwMDI2cHRlLCBcXHUwMDI2bGV2ZWwsIDApO1xcbiBcXHRpZiAocmV0KVxcbiBcXHRcXHRnb3RvIHVubG9jaztcXG4gXFxuQEAgLTEzMTUsNyArMTMxNSw3IEBAIHN0YXRpYyBpbnQgaG9zdF9zdGFnZTJfZ2V0X2d1ZXN0X2luZm8ocGh5c19hZGRyX3QgcGh5cywgc3RydWN0IHBrdm1faHlwX3ZtICoqdm0sXFxuIFxcdFxcdHJldHVybiAtRVBFUk07XFxuIFxcdH1cXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbkBAIC0xNTQ0LDcgKzE1NDQsNyBAQCBzdGF0aWMgaW50IF9fY2hlY2tfaG9zdF9zaGFyZWRfZ3Vlc3Qoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0ICpfX3BoeXMsIHU2NCBpcFxcbiBcXHRzOCBsZXZlbDtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCk7XFxuK1xcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFxcdTAwMjZ2bS1cXHUwMDNlcGd0LCBpcGEsIFxcdTAwMjZwdGUsIFxcdTAwMjZsZXZlbCwgMCk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcdGlmICgha3ZtX3B0ZV92YWxpZChwdGUpKVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xcbmluZGV4IGI3NGRkNWNlMWVmZDMuLjM0N2VlYzM5NTdkNmEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcXG5AQCAtMjk4LDEyICsyOTgsMTMgQEAgc3RhdGljIGludCBsZWFmX3dhbGtlcihjb25zdCBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4ICpjdHgsXFxuIH1cXG4gXFxuIGludCBrdm1fcGd0YWJsZV9nZXRfbGVhZihzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCwgdTY0IGFkZHIsXFxuLVxcdFxcdFxcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbClcXG4rXFx0XFx0XFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxcbitcXHRcXHRcXHQgZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzKVxcbiB7XFxuIFxcdHN0cnVjdCBsZWFmX3dhbGtfZGF0YSBkYXRhO1xcbiBcXHRzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHtcXG4gXFx0XFx0LmNiXFx0PSBsZWFmX3dhbGtlcixcXG4tXFx0XFx0LmZsYWdzXFx0PSBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXFxuK1xcdFxcdC5mbGFnc1xcdD0gZmxhZ3MgfCBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXFxuIFxcdFxcdC5hcmdcXHQ9IFxcdTAwMjZkYXRhLFxcbiBcXHR9O1xcbiBcXHRpbnQgcmV0O1xcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9tbXUuYyBiL2FyY2gvYXJtNjQva3ZtL21tdS5jXFxuaW5kZXggNzRlN2U3Zjc1NjRjOC4uMTdmMWY2ZDM2ZjJiOCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL21tdS5jXFxuQEAgLTUsNiArNSw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FjcGkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NsZWFudXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tYW4uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pby5oXFx1MDAzZVxcbkBAIC04NjYsNyArODY3LDcgQEAgc3RhdGljIGludCBnZXRfdXNlcl9tYXBwaW5nX3NpemUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgYWRkcilcXG4gXFx0ICogSVBJLWluZyB0aHJlYWRzKS5cXG4gXFx0ICovXFxuIFxcdGxvY2FsX2lycV9zYXZlKGZsYWdzKTtcXG4tXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsKTtcXG4rXFx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXFx1MDAyNnBndCwgYWRkciwgXFx1MDAyNnB0ZSwgXFx1MDAyNmxldmVsLCAwKTtcXG4gXFx0bG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpO1xcbiBcXG4gXFx0aWYgKHJldClcXG5AQCAtMTU1NCw5ICsxNTU1LDkgQEAgc3RhdGljIHZvaWQgKmdldF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRyZXR1cm4gXFx1MDAyNnZjcHUtXFx1MDAzZWFyY2gucGt2bV9tZW1jYWNoZTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICptZW1jYWNoZSlcXG4rc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdm9pZCAqbWVtY2FjaGUpXFxuIHtcXG4tXFx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKHZjcHUtXFx1MDAzZWFyY2guaHdfbW11KTtcXG4rXFx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XFxuIFxcbiBcXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxcbiBcXHRcXHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XFxuQEAgLTE2MDMsMTUgKzE2MDQsNDcgQEAgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHtcXG4gXFx0c3RydWN0IGt2bV9zMl90cmFuc1xcdCpuZXN0ZWQ7XFxuIFxcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3RcXHQqbWVtc2xvdDtcXG4gXFx0dW5zaWduZWQgbG9uZ1xcdFxcdGh2YTtcXG4rXFx0dW5zaWduZWQgbG9uZ1xcdFxcdGVzcjtcXG4rXFx0c3RydWN0IGt2bV9zMl9tbXVcXHQqbW11O1xcbiB9O1xcbiBcXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4rc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQge1xcbitcXHR1bnNpZ25lZCBsb25nIG1hcHBpbmdfc2l6ZTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19leGVjKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHRyZXR1cm4gZXNyX2FidF9pc19leGVjX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc193cml0ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXFxuK3tcXG4rXFx0cmV0dXJuIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNlZXNyKTtcXG4rfVxcbitcXG4rc3RhdGljIHU2NCBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4re1xcbitcXHR1NjQgbGV2ZWw7XFxuK1xcbitcXHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0bGV2ZWwgPSBzMmZkLVxcdTAwM2Vlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQ19MRVZFTDtcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuK1xcdFxcdCAgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXFxuIHtcXG4gXFx0Ym9vbCB3cml0ZV9mYXVsdCwgZXhlY19mYXVsdDtcXG4tXFx0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpO1xcbitcXHRib29sIHBlcm1fZmF1bHQgPSBrdm1fczJfZmF1bHRfaXNfcGVybShzMmZkKTtcXG4gXFx0ZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7XFxuIFxcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90ID0gS1ZNX1BHVEFCTEVfUFJPVF9SO1xcbi1cXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWFyY2guaHdfbW11LVxcdTAwM2VwZ3Q7XFxuK1xcdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gczJmZC1cXHUwMDNlbW11LVxcdTAwM2VwZ3Q7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbW11X3NlcTtcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuIFxcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWt2bTtcXG5AQCAtMTYyMiw3ICsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4gXFxuIFxcdGlmICghcGVybV9mYXVsdCkge1xcbiBcXHRcXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cXHUwMDNldmNwdSk7XFxuLVxcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2V2Y3B1LCBtZW1jYWNoZSk7XFxuK1xcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIG1lbWNhY2hlKTtcXG4gXFx0XFx0aWYgKHJldClcXG4gXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0fVxcbkBAIC0xNjMyLDggKzE2NjUsOCBAQCBzdGF0aWMgaW50IGdtZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRlbHNlXFxuIFxcdFxcdGdmbiA9IHMyZmQtXFx1MDAzZWZhdWx0X2lwYSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXG4tXFx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNldmNwdSk7XFxuLVxcdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cXHUwMDNldmNwdSk7XFxuK1xcdHdyaXRlX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpO1xcbitcXHRleGVjX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoczJmZCk7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0Uod3JpdGVfZmF1bHQgXFx1MDAyNlxcdTAwMjYgZXhlY19mYXVsdCk7XFxuIFxcbkBAIC0xNjg3LDcgKzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4gXFx0aWYgKChwcm90IFxcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbiBcXHRcXHRtYXJrX3BhZ2VfZGlydHlfaW5fc2xvdChrdm0sIHMyZmQtXFx1MDAzZW1lbXNsb3QsIGdmbik7XFxuIFxcbi1cXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xcbitcXHRpZiAocmV0ID09IC1FQUdBSU4pXFxuK1xcdFxcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xcbitcXG4rXFx0aWYgKHJlc3VsdCBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbitcXHRcXHRyZXN1bHQtXFx1MDAzZW1hcHBpbmdfc2l6ZSA9IFBBR0VfU0laRTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8ge1xcbkBAIC0xNzA5LDcgKzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7XFxuIFxcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IHMyZmQtXFx1MDAzZXZjcHU7XFxuLVxcdHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0ID0gdmNwdS1cXHUwMDNlYXJjaC5od19tbXUtXFx1MDAzZXBndDtcXG4rXFx0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVxcdTAwM2VtbXUtXFx1MDAzZXBndDtcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LVxcdTAwM2VtbTtcXG4gXFx0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cXHUwMDNla3ZtO1xcbiBcXHR2b2lkICpoeXBfbWVtY2FjaGU7XFxuQEAgLTE3MTcsNyArMTc1Niw3IEBAIHN0YXRpYyBpbnQgcGt2bV9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRpbnQgcmV0O1xcbiBcXG4gXFx0aHlwX21lbWNhY2hlID0gZ2V0X21tdV9tZW1jYWNoZSh2Y3B1KTtcXG4tXFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHZjcHUsIGh5cF9tZW1jYWNoZSk7XFxuK1xcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIGh5cF9tZW1jYWNoZSk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXG5AQCAtMTg0MCwxMSArMTg3OSw2IEBAIHN0YXRpYyBzaG9ydCBrdm1fczJfcmVzb2x2ZV92bWFfc2l6ZShjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIFxcdHJldHVybiB2bWFfc2hpZnQ7XFxuIH1cXG4gXFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcXG4te1xcbi1cXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9nZXRfdm1hX2luZm8oY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiBcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXFxuIHtcXG5AQCAtMTkxMCwxMyArMTk0NCwxMSBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9waW5fcGZuKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuIFxcdHMydmktXFx1MDAzZXBmbiA9IF9fa3ZtX2ZhdWx0aW5fcGZuKHMyZmQtXFx1MDAzZW1lbXNsb3QsIGdldF9jYW5vbmljYWxfZ2ZuKHMyZmQsIHMydmkpLFxcbi1cXHRcXHRcXHRcXHQgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cXHUwMDNldmNwdSkgPyBGT0xMX1dSSVRFIDogMCxcXG4rXFx0XFx0XFx0XFx0ICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsXFxuIFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZzMnZpLVxcdTAwM2VtYXBfd3JpdGFibGUsIFxcdTAwMjZzMnZpLVxcdTAwM2VwYWdlKTtcXG4gXFx0aWYgKHVubGlrZWx5KGlzX2Vycm9yX25vc2xvdF9wZm4oczJ2aS1cXHUwMDNlcGZuKSkpIHtcXG4tXFx0XFx0aWYgKHMydmktXFx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTikge1xcbi1cXHRcXHRcXHRrdm1fc2VuZF9od3BvaXNvbl9zaWduYWwoczJmZC1cXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLVxcdTAwM2V2bWFfcGFnZXNpemUpKTtcXG4tXFx0XFx0XFx0cmV0dXJuIDA7XFxuLVxcdFxcdH1cXG4rXFx0XFx0aWYgKHMydmktXFx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSFdQT0lTT047XFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbkBAIC0xOTY4LDcgKzIwMDAsNyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiB7XFxuIFxcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWt2bTtcXG4gXFxuLVxcdGlmIChrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cXHUwMDNldmNwdSkgXFx1MDAyNlxcdTAwMjYgczJ2aS1cXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXFxuK1xcdGlmIChrdm1fczJfZmF1bHRfaXNfZXhlYyhzMmZkKSBcXHUwMDI2XFx1MDAyNiBzMnZpLVxcdTAwM2VtYXBfbm9uX2NhY2hlYWJsZSlcXG4gXFx0XFx0cmV0dXJuIC1FTk9FWEVDO1xcbiBcXG4gXFx0LypcXG5AQCAtMTk3Nyw3ICsyMDA5LDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0ICogYW5kIHRyaWdnZXIgdGhlIGV4Y2VwdGlvbiBoZXJlLiBTaW5jZSB0aGUgbWVtc2xvdCBpcyB2YWxpZCwgaW5qZWN0XFxuIFxcdCAqIHRoZSBmYXVsdCBiYWNrIHRvIHRoZSBndWVzdC5cXG4gXFx0ICovXFxuLVxcdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IoczJmZC1cXHUwMDNldmNwdSkpKSB7XFxuK1xcdGlmIChlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KHMyZmQtXFx1MDAzZWVzcikpIHtcXG4gXFx0XFx0a3ZtX2luamVjdF9kYWJ0X2V4Y2xfYXRvbWljKHMyZmQtXFx1MDAzZXZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtXFx1MDAzZXZjcHUpKTtcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcdH1cXG5AQCAtMTk4NiwxMyArMjAxOCwxMyBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxcbiBcXG4gXFx0aWYgKHMydmktXFx1MDAzZW1hcF93cml0YWJsZSBcXHUwMDI2XFx1MDAyNiAoczJ2aS1cXHUwMDNlZGV2aWNlIHx8XFxuIFxcdFxcdFxcdFxcdCAgICFtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cXHUwMDNlbWVtc2xvdCkgfHxcXG4tXFx0XFx0XFx0XFx0ICAga3ZtX2lzX3dyaXRlX2ZhdWx0KHMyZmQtXFx1MDAzZXZjcHUpKSlcXG4rXFx0XFx0XFx0XFx0ICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpKSlcXG4gXFx0XFx0KnByb3QgfD0gS1ZNX1BHVEFCTEVfUFJPVF9XO1xcbiBcXG4gXFx0aWYgKHMyZmQtXFx1MDAzZW5lc3RlZClcXG4gXFx0XFx0KnByb3QgPSBhZGp1c3RfbmVzdGVkX2ZhdWx0X3Blcm1zKHMyZmQtXFx1MDAzZW5lc3RlZCwgKnByb3QpO1xcbiBcXG4tXFx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVxcdTAwM2V2Y3B1KSlcXG4rXFx0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpKVxcbiBcXHRcXHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1g7XFxuIFxcbiBcXHRpZiAoczJ2aS1cXHUwMDNlbWFwX25vbl9jYWNoZWFibGUpXFxuQEAgLTIwMTYsNyArMjA0OCw4IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXFxuIFxcdFxcdFxcdCAgICBjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvICpzMnZpLFxcbiBcXHRcXHRcXHQgICAgZW51bSBrdm1fcGd0YWJsZV9wcm90IHByb3QsXFxuLVxcdFxcdFxcdCAgICB2b2lkICptZW1jYWNoZSlcXG4rXFx0XFx0XFx0ICAgIHZvaWQgKm1lbWNhY2hlLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgKnJlc3VsdClcXG4ge1xcbiBcXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcXG4gXFx0Ym9vbCB3cml0YWJsZSA9IHByb3QgXFx1MDAyNiBLVk1fUEdUQUJMRV9QUk9UX1c7XFxuQEAgLTIwMjksMTMgKzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdGt2bV9mYXVsdF9sb2NrKGt2bSk7XFxuLVxcdHBndCA9IHMyZmQtXFx1MDAzZXZjcHUtXFx1MDAzZWFyY2guaHdfbW11LVxcdTAwM2VwZ3Q7XFxuK1xcdHBndCA9IHMyZmQtXFx1MDAzZW1tdS1cXHUwMDNlcGd0O1xcbiBcXHRyZXQgPSAtRUFHQUlOO1xcbiBcXHRpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLVxcdTAwM2VtbXVfc2VxKSlcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiBcXG4tXFx0cGVybV9mYXVsdF9ncmFudWxlID0gKGt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpID9cXG4tXFx0XFx0XFx0ICAgICAga3ZtX3ZjcHVfdHJhcF9nZXRfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQtXFx1MDAzZXZjcHUpIDogMCk7XFxuK1xcdHBlcm1fZmF1bHRfZ3JhbnVsZSA9IGt2bV9zMl9wZXJtX2ZhdWx0X2dyYW51bGUoczJmZCk7XFxuIFxcdG1hcHBpbmdfc2l6ZSA9IHMydmktXFx1MDAzZXZtYV9wYWdlc2l6ZTtcXG4gXFx0cGZuID0gczJ2aS1cXHUwMDNlcGZuO1xcbiBcXHRnZm4gPSBzMnZpLVxcdTAwM2VnZm47XFxuQEAgLTIwOTYsMTQgKzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4gXFx0XFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVxcdTAwM2VtZW1zbG90LCBncGFfdG9fZ2ZuKGlwYSkpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocmV0ICE9IC1FQUdBSU4pXFxuLVxcdFxcdHJldHVybiByZXQ7XFxuLVxcdHJldHVybiAwO1xcbitcXHRpZiAocmV0ID09IC1FQUdBSU4pXFxuK1xcdFxcdHJldHVybiByZXN1bHQgPyByZXQgOiAwO1xcbitcXG4rXFx0aWYgKHJlc3VsdCBcXHUwMDI2XFx1MDAyNiAhcmV0KVxcbitcXHRcXHRyZXN1bHQtXFx1MDAzZW1hcHBpbmdfc2l6ZSA9IG1hcHBpbmdfc2l6ZTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbitzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxcbiB7XFxuLVxcdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVxcdTAwM2V2Y3B1KTtcXG4rXFx0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XFxuIFxcdHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gczJ2aSA9IHt9O1xcbiBcXHRlbnVtIGt2bV9wZ3RhYmxlX3Byb3QgcHJvdDtcXG4gXFx0dm9pZCAqbWVtY2FjaGU7XFxuQEAgLTIxMjEsNyArMjE1OCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cXHUwMDNldmNwdSk7XFxuIFxcdGlmICghcGVybV9mYXVsdCB8fCBtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cXHUwMDNlbWVtc2xvdCkgfHxcXG4gXFx0ICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7XFxuLVxcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2V2Y3B1LCBtZW1jYWNoZSk7XFxuK1xcdFxcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVxcdTAwM2VtbXUsIG1lbWNhY2hlKTtcXG4gXFx0XFx0aWYgKHJldClcXG4gXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gXFx0fVxcbkBAIC0yMTMxLDYgKzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXFxuIFxcdCAqIGdldCBibG9jayBtYXBwaW5nIGZvciBkZXZpY2UgTU1JTyByZWdpb24uXFxuIFxcdCAqL1xcbiBcXHRyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCBcXHUwMDI2czJ2aSk7XFxuK1xcdGlmIChyZXQgPT0gLUVIV1BPSVNPTikge1xcbitcXHRcXHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cXG4rXFx0XFx0aWYgKHJlc3VsdClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSFdQT0lTT047XFxuK1xcdFxcdGt2bV9zZW5kX2h3cG9pc29uX3NpZ25hbChzMmZkLVxcdTAwM2VodmEsIF9fZmZzKHMydmkudm1hX3BhZ2VzaXplKSk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuIFxcdGlmIChyZXQgIT0gMSlcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTIxNDAsNyArMjE4NCw3IEBAIHN0YXRpYyBpbnQgdXNlcl9tZW1fYWJvcnQoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcXHUwMDI2czJ2aSwgcHJvdCwgbWVtY2FjaGUpO1xcbitcXHRyZXR1cm4ga3ZtX3MyX2ZhdWx0X21hcChzMmZkLCBcXHUwMDI2czJ2aSwgcHJvdCwgbWVtY2FjaGUsIHJlc3VsdCk7XFxuIH1cXG4gXFxuIC8qIFJlc29sdmUgdGhlIGFjY2VzcyBmYXVsdCBieSBtYWtpbmcgdGhlIHBhZ2UgeW91bmcgYWdhaW4uICovXFxuQEAgLTIyNTAsNyArMjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX3MyX3RyYW5zIG5lc3RlZF90cmFucywgKm5lc3RlZCA9IE5VTEw7XFxuLVxcdHVuc2lnbmVkIGxvbmcgZXNyO1xcbitcXHR1bnNpZ25lZCBsb25nIGVzciA9IGt2bV92Y3B1X2dldF9lc3IodmNwdSk7XFxuK1xcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSB2Y3B1LVxcdTAwM2VhcmNoLmh3X21tdTtcXG4gXFx0cGh5c19hZGRyX3QgZmF1bHRfaXBhOyAvKiBUaGUgYWRkcmVzcyB3ZSBmYXVsdGVkIG9uICovXFxuIFxcdHBoeXNfYWRkcl90IGlwYTsgLyogQWx3YXlzIHRoZSBJUEEgaW4gdGhlIEwxIGd1ZXN0IHBoeXMgc3BhY2UgKi9cXG4gXFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDtcXG5AQCAtMjI1OSwxMSArMjMwNCw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0Z2ZuX3QgZ2ZuO1xcbiBcXHRpbnQgcmV0LCBpZHg7XFxuIFxcbi1cXHRpZiAoa3ZtX3ZjcHVfYWJ0X2lzc2VhKHZjcHUpKVxcbitcXHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcXG4gXFx0XFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xcbiBcXG4tXFx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcXG4tXFxuIFxcdC8qXFxuIFxcdCAqIFRoZSBmYXVsdCBJUEEgc2hvdWxkIGJlIHJlbGlhYmxlIGF0IHRoaXMgcG9pbnQgYXMgd2UncmUgbm90IGRlYWxpbmdcXG4gXFx0ICogd2l0aCBhbiBTRUEuXFxuQEAgLTIyNzIsNyArMjMxNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0aWYgKEtWTV9CVUdfT04oaXBhID09IElOVkFMSURfR1BBLCB2Y3B1LVxcdTAwM2Vrdm0pKVxcbiBcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuLVxcdGlzX2lhYnQgPSBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSk7XFxuK1xcdGlzX2lhYnQgPSBlc3JfdHJhcF9pc19pYWJ0KGVzcik7XFxuIFxcbiBcXHRpZiAoZXNyX2ZzY19pc190cmFuc2xhdGlvbl9mYXVsdChlc3IpKSB7XFxuIFxcdFxcdC8qIEJleW9uZCBzYW5pdGlzZWQgUEFSYW5nZSAod2hpY2ggaXMgdGhlIElQQSBsaW1pdCkgKi9cXG5AQCAtMjI4MiwxNCArMjMyNSwxNCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdC8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovXFxuLVxcdFxcdGlmIChmYXVsdF9pcGEgXFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEodmNwdS1cXHUwMDNlYXJjaC5od19tbXUtXFx1MDAzZXZ0Y3IpKSkge1xcbitcXHRcXHRpZiAoZmF1bHRfaXBhIFxcdTAwM2U9IEJJVF9VTEwoVlRDUl9FTDJfSVBBKG1tdS1cXHUwMDNldnRjcikpKSB7XFxuIFxcdFxcdFxcdGZhdWx0X2lwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xcbiBcXG4gXFx0XFx0XFx0cmV0dXJuIGt2bV9pbmplY3Rfc2VhKHZjcHUsIGlzX2lhYnQsIGZhdWx0X2lwYSk7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4tXFx0dHJhY2Vfa3ZtX2d1ZXN0X2ZhdWx0KCp2Y3B1X3BjKHZjcHUpLCBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpLFxcbitcXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcXG4gXFx0XFx0XFx0ICAgICAga3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSksIGZhdWx0X2lwYSk7XFxuIFxcbiBcXHQvKiBDaGVjayB0aGUgc3RhZ2UtMiBmYXVsdCBpcyB0cmFucy4gZmF1bHQgb3Igd3JpdGUgZmF1bHQgKi9cXG5AQCAtMjI5OCw5ICsyMzQxLDkgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgICAgIWVzcl9mc2NfaXNfYWNjZXNzX2ZsYWdfZmF1bHQoZXNyKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgIWVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoZXNyKSkge1xcbiBcXHRcXHRrdm1fZXJyKFxcXCJVbnN1cHBvcnRlZCBGU0M6IEVDPSUjeCB4RlNDPSUjbHggRVNSX0VMMj0lI2x4XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcXG4tXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQodmNwdSksXFxuLVxcdFxcdFxcdCh1bnNpZ25lZCBsb25nKWt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xcbitcXHRcXHRcXHRlc3JfZ2V0X2VjKGVzciksXFxuK1xcdFxcdFxcdCh1bnNpZ25lZCBsb25nKShlc3IgXFx1MDAyNiBFU1JfRUx4X0ZTQyksXFxuK1xcdFxcdFxcdCh1bnNpZ25lZCBsb25nKWVzcik7XFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXHR9XFxuIFxcbkBAIC0yMzE5LDggKzIzNjIsOCBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdCAqIG5vdGhpbmcgdG8gd2FsayBhbmQgd2UgdHJlYXQgaXQgYXMgYSAxOjEgYmVmb3JlIGdvaW5nIHRocm91Z2ggdGhlXFxuIFxcdCAqIGNhbm9uaWNhbCB0cmFuc2xhdGlvbi5cXG4gXFx0ICovXFxuLVxcdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVxcdTAwM2Vrdm0sdmNwdS1cXHUwMDNlYXJjaC5od19tbXUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICB2Y3B1LVxcdTAwM2VhcmNoLmh3X21tdS1cXHUwMDNlbmVzdGVkX3N0YWdlMl9lbmFibGVkKSB7XFxuK1xcdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVxcdTAwM2Vrdm0sIG1tdSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIG1tdS1cXHUwMDNlbmVzdGVkX3N0YWdlMl9lbmFibGVkKSB7XFxuIFxcdFxcdHUzMiBlc3I7XFxuIFxcbiBcXHRcXHRyZXQgPSBrdm1fd2Fsa19uZXN0ZWRfczIodmNwdSwgZmF1bHRfaXBhLCBcXHUwMDI2bmVzdGVkX3RyYW5zKTtcXG5AQCAtMjM0OSw3ICsyMzkyLDcgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRnZm4gPSBpcGEgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gXFx0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtXFx1MDAzZWt2bSwgZ2ZuKTtcXG4gXFx0aHZhID0gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3QobWVtc2xvdCwgZ2ZuLCBcXHUwMDI2d3JpdGFibGUpO1xcbi1cXHR3cml0ZV9mYXVsdCA9IGt2bV9pc193cml0ZV9mYXVsdCh2Y3B1KTtcXG4rXFx0d3JpdGVfZmF1bHQgPSBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGVzcik7XFxuIFxcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgfHwgKHdyaXRlX2ZhdWx0IFxcdTAwMjZcXHUwMDI2ICF3cml0YWJsZSkpIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVGhlIGd1ZXN0IGhhcyBwdXQgZWl0aGVyIGl0cyBpbnN0cnVjdGlvbnMgb3IgaXRzIHBhZ2UtdGFibGVzXFxuQEAgLTIzNjIsNyArMjQwNSw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmIChrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpKSB7XFxuK1xcdFxcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcXG4gXFx0XFx0XFx0cmV0ID0ga3ZtX2luamVjdF9zZWFfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7XFxuIFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gXFx0XFx0fVxcbkBAIC0yMzc3LDcgKzI0MjAsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIFxcdFxcdCAqIFNvIGxldCdzIGFzc3VtZSB0aGF0IHRoZSBndWVzdCBpcyBqdXN0IGJlaW5nXFxuIFxcdFxcdCAqIGNhdXRpb3VzLCBhbmQgc2tpcCB0aGUgaW5zdHJ1Y3Rpb24uXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIFxcdTAwMjZcXHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcXG4rXFx0XFx0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSBcXHUwMDI2XFx1MDAyNiBlc3JfZGFidF9pc19jbShlc3IpKSB7XFxuIFxcdFxcdFxcdGt2bV9pbmNyX3BjKHZjcHUpO1xcbiBcXHRcXHRcXHRyZXQgPSAxO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuQEAgLTIzOTUsNyArMjQzOCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0fVxcbiBcXG4gXFx0LyogVXNlcnNwYWNlIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWdpc3RlciBvdXQtb2YtYm91bmRzIElQQXMgKi9cXG4tXFx0Vk1fQlVHX09OKGlwYSBcXHUwMDNlPSBrdm1fcGh5c19zaXplKHZjcHUtXFx1MDAzZWFyY2guaHdfbW11KSk7XFxuK1xcdFZNX0JVR19PTihpcGEgXFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcXG4gXFxuIFxcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcXG4gXFx0XFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xcbkBAIC0yNDA5LDE5ICsyNDUyLDIwIEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gXFx0XFx0Lm5lc3RlZFxcdFxcdD0gbmVzdGVkLFxcbiBcXHRcXHQubWVtc2xvdFxcdD0gbWVtc2xvdCxcXG4gXFx0XFx0Lmh2YVxcdFxcdD0gaHZhLFxcbitcXHRcXHQuZXNyXFx0XFx0PSBlc3IsXFxuK1xcdFxcdC5tbXVcXHRcXHQ9IG1tdSxcXG4gXFx0fTtcXG4gXFxuIFxcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXFx1MDAzZWt2bSkpIHtcXG4gXFx0XFx0cmV0ID0gcGt2bV9tZW1fYWJvcnQoXFx1MDAyNnMyZmQpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRWTV9XQVJOX09OX09OQ0Uoa3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHZjcHUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdCF3cml0ZV9mYXVsdCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcXG4rXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKFxcdTAwMjZzMmZkKSBcXHUwMDI2XFx1MDAyNiAhd3JpdGVfZmF1bHQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0XFx0IWt2bV9zMl9mYXVsdF9pc19leGVjKFxcdTAwMjZzMmZkKSk7XFxuIFxcbiBcXHRcXHRpZiAoa3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCkpXFxuLVxcdFxcdFxcdHJldCA9IGdtZW1fYWJvcnQoXFx1MDAyNnMyZmQpO1xcbitcXHRcXHRcXHRyZXQgPSBnbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBOVUxMKTtcXG4gXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRyZXQgPSB1c2VyX21lbV9hYm9ydChcXHUwMDI2czJmZCk7XFxuK1xcdFxcdFxcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBOVUxMKTtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKHJldCA9PSAwKVxcbkBAIC0yNzkyLDMgKzI4MzYsMTQzIEBAIHZvaWQga3ZtX3RvZ2dsZV9jYWNoZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgd2FzX2VuYWJsZWQpXFxuIFxcbiBcXHR0cmFjZV9rdm1fdG9nZ2xlX2NhY2hlKCp2Y3B1X3BjKHZjcHUpLCB3YXNfZW5hYmxlZCwgbm93X2VuYWJsZWQpO1xcbiB9XFxuK1xcbisvKlxcbisgKiBUcnkgdG8gd2FsayB0byB0aGUgc3BlY2lmaWVkIEdQQSBpbiBjYW5vbmljYWwgbW11IC0gaWYgdW5tYXBwZWQgcmV0dXJucyAwLCBpZlxcbisgKiBtYXBwZWQgcmV0dXJucyB0aGUgZ3JhbnVsZSBzaXplLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJvci5cXG4rICovXFxuK3N0YXRpYyBsb25nIGt2bV93YWxrX3MyKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LFxcbitcXHRcXHRcXHRncGFfdCBncGEsIHM4ICpsZXZlbClcXG4re1xcbitcXHRzdHJ1Y3Qga3ZtICprdm0gPSBrdm1fczJfbW11X3RvX2t2bShwZ3QtXFx1MDAzZW1tdSk7XFxuK1xcdGt2bV9wdGVfdCBwdGU7XFxuK1xcdGxvbmcgcmV0O1xcbitcXG4rXFx0Z3VhcmQocmVhZF9sb2NrKShcXHUwMDI2a3ZtLVxcdTAwM2VtbXVfbG9jayk7XFxuK1xcbitcXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihwZ3QsIGdwYSwgXFx1MDAyNnB0ZSwgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgIEtWTV9QR1RBQkxFX1dBTEtfU0hBUkVEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXFxuK1xcdGlmICgha3ZtX3B0ZV92YWxpZChwdGUpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGt2bV9ncmFudWxlX3NpemUoKmxldmVsKTtcXG4rfVxcbitcXG4rLyogU3ludGhlc2lzZWQgZGF0YSBhYm9ydCBhdCBzcGVjaWZpZWQgcGFnZSB0YWJsZSBsZXZlbC4gKi9cXG4rI2RlZmluZSBQUkVfRkFVTFRfRVNSKGxldmVsKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0ICgoRVNSX0VMeF9FQ19EQUJUX0xPVyBcXHUwMDNjXFx1MDAzYyBFU1JfRUx4X0VDX1NISUZUKSB8XFx0XFxcXFxcbitcXHQgIEVTUl9FTHhfSUwgfCBFU1JfRUx4X0ZTQ19GQVVMVF9MKGxldmVsKSlcXG4rXFxuKy8qIFJldHJpZXZlIGVpdGhlciBhIHJlYWQtb25seSBvciBhIHJlYWQvd3JpdGUgaHZhLiAqL1xcbitzdGF0aWMgaHZhX3QgZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgZ2ZuX3QgZ2ZuKVxcbit7XFxuK1xcdHJldHVybiBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChzbG90LCBnZm4sIC8qd3JpdGFibGU9Ki9OVUxMKTtcXG4rfVxcbitcXG4rc3RhdGljIGxvbmcgX19wcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbitcXHRcXHRcXHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgaXNfZ21lbSA9IGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpO1xcbitcXHRjb25zdCBnZm5fdCBnZm4gPSBncGFfdG9fZ2ZuKGdwYSk7XFxuK1xcdGNvbnN0IGh2YV90IGh2YSA9IGlzX2dtZW0gPyAwIDogZ2ZuX3RvX2h2YV9tZW1zbG90X3JlYWQobWVtc2xvdCwgZ2ZuKTtcXG4rXFx0Y29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHMyZmQgPSB7XFxuK1xcdFxcdC52Y3B1XFx0XFx0PSB2Y3B1LFxcbitcXHRcXHQuZmF1bHRfaXBhXFx0PSBncGEsXFxuK1xcdFxcdC5uZXN0ZWRcXHRcXHQ9IE5VTEwsXFxuK1xcdFxcdC5tZW1zbG90XFx0PSBtZW1zbG90LFxcbitcXHRcXHQuaHZhXFx0XFx0PSBodmEsXFxuK1xcdFxcdC5lc3JcXHRcXHQ9IFBSRV9GQVVMVF9FU1IobGV2ZWwpLFxcbitcXHRcXHQubW11XFx0XFx0PSBtbXUsXFxuK1xcdH07XFxuK1xcdHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0IHJlc3VsdCA9IHt9O1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkpXFxuK1xcdFxcdHJldHVybiAtRUZBVUxUO1xcbitcXG4rXFx0aWYgKGlzX2dtZW0pXFxuK1xcdFxcdHJldCA9IGdtZW1fYWJvcnQoXFx1MDAyNnMyZmQsIFxcdTAwMjZyZXN1bHQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldCA9IHVzZXJfbWVtX2Fib3J0KFxcdTAwMjZzMmZkLCBcXHUwMDI2cmVzdWx0KTtcXG4rXFx0aWYgKElTX0VSUl9WQUxVRShyZXQpKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRyZXR1cm4gcmVzdWx0Lm1hcHBpbmdfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIGxvbmcgcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcXG4rXFx0XFx0XFx0IGdwYV90IGdwYSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdClcXG4re1xcbitcXHRzOCBsZXZlbDtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHQvKiBUcnkgYSB3YWxrIGZpcnN0LiAqL1xcbitcXHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXFx1MDAzZXBndCwgZ3BhLCBcXHUwMDI2bGV2ZWwpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xcbitcXHRyZXR1cm4gX19wcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QsIGxldmVsKTtcXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmdcXG4rcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGJ5dGVzX3JlbWFpbmluZylcXG4re1xcbitcXHQvKiBHcmFudWxlcyBhcmUgYWx3YXlzIGEgcG93ZXItb2YtMi4gKi9cXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpO1xcbitcXG4rXFx0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcXG4rfVxcbitcXG4rLyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXFxuKyNkZWZpbmUgTUFYX1BSRV9GQVVMVF9SRVRSSUVTIDNcXG4rXFxuKy8qKlxcbisgKiBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkgLSBwcmUtZmF1bHQgc3RhZ2UtMiBwYWdlIHRhYmxlcyBmb3IgdGhlXFxuKyAqIHNwZWNpZmllZCBHUEEuXFxuKyAqIEB2Y3B1OlxcdFRoZSBWQ1BVIHBvaW50ZXJcXG4rICogQHJhbmdlOlxcdHtncGEsIHNpemUsIGZsYWdzfSB0dXBsZVxcbisgKlxcbisgKiBUaGUgbWFwcGluZyBwZXJmb3JtZWQgaXMgYWx3YXlzIGJlc3QtZWZmb3J0IC0gZmF1bHRpbmcgaW4gaXMgbmVjZXNzYXJpbHlcXG4rICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuXFxuKyAqXFxuKyAqIEByYW5nZS1cXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVxcdTAwM2VzaXplIHNwZWNpZmllcyBob3cgbWFueVxcbisgKiBieXRlcyByZW1haW4gdG8gYmUgcHJlLWZhdWx0ZWQgYW5kIEByYW5nZS1cXHUwMDNlZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC5cXG4rICpcXG4rICogUmV0dXJuczogdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJlLWZhdWx0IGNvbnN1bWVkLCBvciBhbiBlcnJvci5cXG4rICovXFxuK2xvbmcga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcXG4rXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXFxuK3tcXG4rXFx0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cXHUwMDNla3ZtO1xcbitcXHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXFx1MDAzZXNpemU7XFxuK1xcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSBcXHUwMDI2a3ZtLVxcdTAwM2VhcmNoLm1tdTsgLyogQ2Fub25pY2FsLiAqL1xcbitcXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90O1xcbitcXHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cXHUwMDNlZ3BhO1xcbitcXHRpbnQgbnVtX3JldHJpZXMgPSAwO1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHBLVk0gaXMgdW5zdXBwb3J0ZWQgYXMgdGhlaXIgdkNQVXMgYXJlIGluc3RhbnRpYXRlZCBvbiBmaXJzdCBydW4gYW5kXFxuK1xcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoaXNfcHJvdGVjdGVkX2t2bV9lbmFibGVkKCkpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdG1lbXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdwYV90b19nZm4oZ3BhKSk7XFxuK1xcdGlmICghbWVtc2xvdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdC8qIFNSQ1UgbXVzdCBiZSByZWxlYXNlZCBmb3IgcHJvZ3Jlc3MgYW5kIG9ubHkgdXNlcmxhbmQgY2FuIGRvIHRoYXQuICovXFxuK1xcdGlmIChtZW1zbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXFxuK1xcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0ZG8ge1xcbitcXHRcXHRyZXQgPSBwcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QpO1xcbitcXHR9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNiBudW1fcmV0cmllcysrIFxcdTAwM2MgTUFYX1BSRV9GQVVMVF9SRVRSSUVTKTtcXG4rXFxuK1xcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIHByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGEsIHJldCwgYnl0ZXNfcmVtYWluaW5nKTtcXG4rfVxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXFxuaW5kZXggMTcxMjNmMGI2ZGFiYS4uMzQ4OGQ1YWQyMjViNiAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuY1xcbisrKyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXFxuQEAgLTY1NCw3ICs2NTQsNyBAQCBzdGF0aWMgdTggZ2V0X2d1ZXN0X21hcHBpbmdfdHRsKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHU2NCBhZGRyKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuIFxcdHRtcCBcXHUwMDI2PSB+KHN6IC0gMSk7XFxuLVxcdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXFx1MDAzZXBndCwgdG1wLCBcXHUwMDI2cHRlLCBOVUxMKSlcXG4rXFx0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cXHUwMDNlcGd0LCB0bXAsIFxcdTAwMjZwdGUsIE5VTEwsIDApKVxcbiBcXHRcXHRnb3RvIGFnYWluO1xcbiBcXHRpZiAoIShwdGUgXFx1MDAyNiBQVEVfVkFMSUQpKVxcbiBcXHRcXHRnb3RvIGFnYWluO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxcbmluZGV4IDVmOGQxN2VlNWY2NzcuLjFlMGVkZDBmOTlmNzUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cXG5AQCAtMTczLDYgKzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2RlYnVnLWV4Y2VwdGlvbnNcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvaGVsbG9fZWwyXFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2hvc3Rfc3ZlXFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2h5cGVyY2FsbHNcXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2V4dGVybmFsX2Fib3J0c1xcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9tbWlvX3NpZ25fZXh0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L3BhZ2VfZmF1bHRfdGVzdFxcbkBAIC0xOTksNiArMjAwLDcgQEAgVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gZ3Vlc3RfbWVtZmRfdGVzdFxcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBtbXVfc3RyZXNzX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcnNlcV90ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IHN0ZWFsX3RpbWVcXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcHJlX2ZhdWx0X21lbW9yeV90ZXN0XFxuIFxcbiBURVNUX0dFTl9QUk9HU19zMzkwID0gJChURVNUX0dFTl9QUk9HU19DT01NT04pXFxuIFRFU1RfR0VOX1BST0dTX3MzOTAgKz0gczM5MC9tZW1vcFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYXJtNjQvbnZfcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjA5YzFkYjMwMzg1NjZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2FybTY0L252X3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXFxuQEAgLTAsMCArMSwxNTggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKlxcbisgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxcbisgKiBsYXN0LXJ1biBjb250ZXh0IGlzIG5lc3RlZC5cXG4rICpcXG4rICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxcbisgKiByZWFsIEVMMSByZWdpc3RlcnMgdGhlbiBFUkVUcyB0byB2RUwxIGFuZCBleGl0cyB0byB1c2Vyc3BhY2Ugc28gaXRzIHZDUFVcXG4rICogbGFzdC1ydW4gY29udGV4dCBpcyBuZXN0ZWQgYmFja2VkIGJ5IGEgc2hhZG93IHN0YWdlIDIgTU1VLlxcbisgKlxcbisgKiBBc3NlcnQgdGhhdCBwcmUtZmF1bHRpbmcgaWdub3JlcyB0aGF0IGFuZCB0YXJnZXRzIHRoZSBjYW5vbmljYWwgc3RhZ2UtMlxcbisgKiBwYWdlIHRhYmxlcyBvbmx5LlxcbisgKi9cXG4rI2luY2x1ZGUgXFxcImt2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJwcm9jZXNzb3IuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInRlc3RfdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidWNhbGwuaFxcXCJcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vc3lzcmVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBURVNUX01FTV9TTE9UXFx0XFx0MTBcXG4rI2RlZmluZSBURVNUX01FTV9TSVpFXFx0XFx0U1pfMk1cXG4rI2RlZmluZSBURVNUX01FTV9HUEFcXHRcXHRTWl8xR1xcbitcXG4rc3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcXG4re1xcbitcXHR1NjQgb2Zmc2V0O1xcbitcXG4rXFx0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDEpO1xcbitcXG4rXFx0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXFxuK1xcdEdVRVNUX1NZTkMoMSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUb3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gdnN0YWdlLTIgaXMgZGlzYWJsZWQsIHNvIHRoZSBzaGFkb3dcXG4rXFx0ICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXFx1MDAzYyBURVNUX01FTV9TSVpFOyBvZmZzZXQgKz0gU1pfNEspXFxuK1xcdFxcdFJFQURfT05DRSgqKHU2NCAqKShURVNUX01FTV9HUEEgKyBvZmZzZXQpKTtcXG4rXFxuK1xcdEdVRVNUX0RPTkUoKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZ3Vlc3RfY29kZSh2b2lkKVxcbit7XFxuK1xcdHU2NCBzcDtcXG4rXFxuK1xcdEdVRVNUX0FTU0VSVF9FUShnZXRfY3VycmVudF9lbCgpLCAyKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE1pcnJvciB0aGUgRUwyIHRyYW5zbGF0aW9uIHJlZ2ltZSBpbnRvIHRoZSByZWFsIEVMMSByZWdpc3RlcnMgc29cXG4rXFx0ICogdGhhdCB2RUwxIHJ1bnMgb24gdGhlIHRlc3QncyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcXG4rXFx0ICogX0VMMSBhY2Nlc3NvcnMgcmVhZCB0aGUgRUwyIHJlZ2lzdGVycywgYW5kIHRoZSBfRUwxMiBhY2Nlc3NvcnNcXG4rXFx0ICogd3JpdGUgdGhlIHJlYWwgRUwxIHJlZ2lzdGVycy5cXG4rXFx0ICovXFxuK1xcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHNjdGxyX2VsMSksIFNZU19TQ1RMUl9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcodGNyX2VsMSksIFNZU19UQ1JfRUwxMik7XFxuK1xcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcobWFpcl9lbDEpLCBTWVNfTUFJUl9FTDEyKTtcXG4rXFx0d3JpdGVfc3lzcmVnX3MocmVhZF9zeXNyZWcoY3BhY3JfZWwxKSwgU1lTX0NQQUNSX0VMMTIpO1xcbitcXG4rXFx0LyogUnVuIHZFTDEgb24gdGhlIHNhbWUgc3RhY2suICovXFxuK1xcdGFzbSB2b2xhdGlsZShcXFwibW92ICUwLCBzcFxcXCIgOiBcXFwiPXJcXFwiKHNwKSk7XFxuK1xcdHdyaXRlX3N5c3JlZyhzcCwgc3BfZWwxKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIERyb3AgVEdFIHNvIHRoYXQgdkVMMSBpcyBhIG5lc3RlZCBjb250ZXh0IHJhdGhlciB0aGFuIGhvc3QgRUwwLlxcbitcXHQgKiBLVk0gYmFja3MgaXQgd2l0aCBhIHNoYWRvdyBzdGFnZS0yIE1NVSBldmVuIHRob3VnaCB2c3RhZ2UtMiBpc1xcbitcXHQgKiBkaXNhYmxlZCAoSENSX0VMMi5WTT0wKS5cXG4rXFx0ICovXFxuK1xcdHdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhoY3JfZWwyKSBcXHUwMDI2IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7XFxuK1xcdGlzYigpO1xcbitcXG4rXFx0d3JpdGVfc3lzcmVnKFBTUl9NT0RFX0VMMWggfCBQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBQU1JfQV9CSVQgfFxcbitcXHRcXHQgICAgIFBTUl9EX0JJVCwgc3Bzcl9lbDIpO1xcbitcXHR3cml0ZV9zeXNyZWcoKHU2NClndWVzdF9lbDFfY29kZSwgZWxyX2VsMik7XFxuK1xcdGFzbSB2b2xhdGlsZShcXFwiZXJldFxcXCIpO1xcbitcXG4rXFx0R1VFU1RfQVNTRVJUKGZhbHNlKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHJlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGdwYSwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IHJhbmdlID0ge1xcbitcXHRcXHQuZ3BhID0gZ3BhLFxcbitcXHRcXHQuc2l6ZSA9IHNpemUsXFxuK1xcdH07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdHJldCA9IF9fdmNwdV9pb2N0bCh2Y3B1LCBLVk1fUFJFX0ZBVUxUX01FTU9SWSwgXFx1MDAyNnJhbmdlKTtcXG4rXFx0fSB3aGlsZSAoKCFyZXQgXFx1MDAyNlxcdTAwMjYgcmFuZ2Uuc2l6ZSkgfHxcXG4rXFx0XFx0IChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSk7XFxuK1xcbitcXHRURVNUX0FTU0VSVCghcmV0LCBcXFwiS1ZNX1BSRV9GQVVMVF9NRU1PUlkgZmFpbGVkLCByZXQ6ICVkIGVycm5vOiAlZFxcXCIsXFxuK1xcdFxcdCAgICByZXQsIGVycm5vKTtcXG4rXFx0VEVTVF9BU1NFUlRfRVEocmFuZ2Uuc2l6ZSwgMCk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV92Y3B1X2luaXQgaW5pdDtcXG4rXFx0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xcbitcXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcXG4rXFx0c3RydWN0IHVjYWxsIHVjO1xcbitcXHR1NjQgbnBhZ2VzO1xcbitcXG4rXFx0VEVTVF9SRVFVSVJFKHRlc3Rfc3VwcG9ydHNfZWwyKCkpO1xcbitcXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcXG4rXFxuK1xcdHZtID0gdm1fY3JlYXRlKDEpO1xcbitcXG4rXFx0a3ZtX2dldF9kZWZhdWx0X3ZjcHVfdGFyZ2V0KHZtLCBcXHUwMDI2aW5pdCk7XFxuK1xcdGluaXQuZmVhdHVyZXNbMF0gfD0gQklUKEtWTV9BUk1fVkNQVV9IQVNfRUwyKTtcXG4rXFx0dmNwdSA9IGFhcmNoNjRfdmNwdV9hZGQodm0sIDAsIFxcdTAwMjZpbml0LCBndWVzdF9jb2RlKTtcXG4rXFx0a3ZtX2FyY2hfdm1fZmluYWxpemVfdmNwdXModm0pO1xcbitcXG4rXFx0bnBhZ2VzID0gVEVTVF9NRU1fU0laRSAvIHZtLVxcdTAwM2VwYWdlX3NpemU7XFxuK1xcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgVk1fTUVNX1NSQ19BTk9OWU1PVVMsIFRFU1RfTUVNX0dQQSxcXG4rXFx0XFx0XFx0XFx0ICAgIFRFU1RfTUVNX1NMT1QsIG5wYWdlcywgMCk7XFxuK1xcdHZpcnRfbWFwKHZtLCBURVNUX01FTV9HUEEsIFRFU1RfTUVNX0dQQSwgbnBhZ2VzKTtcXG4rXFxuK1xcdC8qIFJ1biB0aGUgZ3Vlc3QgdW50aWwgaXQgaGFzIEVSRVQnZCBmcm9tIHZFTDIgdG8gdkVMMS4gKi9cXG4rXFx0dmNwdV9ydW4odmNwdSk7XFxuK1xcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFxcdTAwMjZ1YykpIHtcXG4rXFx0Y2FzZSBVQ0FMTF9TWU5DOlxcbitcXHRcXHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgVUNBTExfQUJPUlQ6XFxuK1xcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0VEVTVF9GQUlMKFxcXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFxcXCIsIHVjLmNtZCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB2Q1BVJ3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93XFxuK1xcdCAqIHN0YWdlLTIgTU1VLlxcbitcXHQgKlxcbitcXHQgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLlxcbitcXHQgKi9cXG4rXFx0cHJlX2ZhdWx0KHZjcHUsIFRFU1RfTUVNX0dQQSwgVEVTVF9NRU1fU0laRSk7XFxuK1xcbitcXHQvKiBSZXN1bWUgYXQgdkVMMSBhbmQgdG91Y2ggdGhlIHByZWZhdWx0ZWQgcmFuZ2UuICovXFxuK1xcdHZjcHVfcnVuKHZjcHUpO1xcbitcXHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcXHUwMDI2dWMpKSB7XFxuK1xcdGNhc2UgVUNBTExfRE9ORTpcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgVUNBTExfQUJPUlQ6XFxuK1xcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0VEVTVF9GQUlMKFxcXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFxcXCIsIHVjLmNtZCk7XFxuK1xcdH1cXG4rXFxuK1xcdGt2bV92bV9mcmVlKHZtKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3ByZV9mYXVsdF9tZW1vcnlfdGVzdC5jXFxuaW5kZXggYTBmY2FlM2NiN2E4Yi4uNzAyYzcyYmJmYTk2MCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcXG5AQCAtMTIsMTkgKzEyLDI5IEBAXFxuICNpbmNsdWRlIFxcdTAwM2Nwcm9jZXNzb3IuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3VjYWxsX2NvbW1vbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZ3Vlc3RfbW9kZXMuaFxcdTAwM2VcXG4gXFxuIC8qIEFyYml0cmFyaWx5IGNob3NlbiB2YWx1ZXMgKi9cXG4tI2RlZmluZSBURVNUX1NJWkVcXHRcXHQoU1pfMk0gKyBQQUdFX1NJWkUpXFxuLSNkZWZpbmUgVEVTVF9OUEFHRVNcXHRcXHQoVEVTVF9TSVpFIC8gUEFHRV9TSVpFKVxcbisjZGVmaW5lIFRFU1RfQkFTRV9TSVpFXFx0XFx0U1pfMk1cXG4gI2RlZmluZSBURVNUX1NMT1RcXHRcXHQxMFxcbiBcXG4rLyogU3RvcmFnZSBvZiB0ZXN0IGluZm8gdG8gc2hhcmUgd2l0aCBndWVzdCBjb2RlICovXFxuK3N0cnVjdCB0ZXN0X2NvbmZpZyB7XFxuK1xcdHU2NCBwYWdlX3NpemU7XFxuK1xcdHU2NCB0ZXN0X3NpemU7XFxuK1xcdHU2NCB0ZXN0X251bV9wYWdlcztcXG4rfTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgdGVzdF9jb25maWcgdGVzdF9jb25maWc7XFxuK1xcbiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSlcXG4ge1xcbiBcXHR2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDtcXG4rXFx0c3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSBcXHUwMDI2dGVzdF9jb25maWc7XFxuIFxcdGludCBpO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFRFU1RfTlBBR0VTOyBpKyspIHtcXG4tXFx0XFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIFBBR0VfU0laRSk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjb25maWctXFx1MDAzZXRlc3RfbnVtX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIGNvbmZpZy1cXHUwMDNlcGFnZV9zaXplKTtcXG4gXFxuIFxcdFxcdHZhbCA9ICpzcmM7XFxuIFxcdH1cXG5AQCAtMzYsNiArNDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7XFxuIFxcdHN0cnVjdCBrdm1fdm0gKnZtO1xcbiBcXHRncGFfdCBncGE7XFxuIFxcdHUzMiBmbGFncztcXG4rXFx0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBtZW1fYmFja2luZ19zcmM7XFxuIFxcdGJvb2wgd29ya2VyX3JlYWR5O1xcbiBcXHRib29sIHByZWZhdWx0X3JlYWR5O1xcbiBcXHRib29sIHJlY3JlYXRlX3Nsb3Q7XFxuQEAgLTU2LDE0ICs2NywxNiBAQCBzdGF0aWMgdm9pZCAqZGVsZXRlX3Nsb3Rfd29ya2VyKHZvaWQgKl9fZGF0YSlcXG4gXFx0d2hpbGUgKCFSRUFEX09OQ0UoZGF0YS1cXHUwMDNlcmVjcmVhdGVfc2xvdCkpXFxuIFxcdFxcdGNwdV9yZWxheCgpO1xcbiBcXG4tXFx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZGF0YS1cXHUwMDNlZ3BhLFxcbi1cXHRcXHRcXHRcXHQgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS1cXHUwMDNlZmxhZ3MpO1xcbitcXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtXFx1MDAzZW1lbV9iYWNraW5nX3NyYywgZGF0YS1cXHUwMDNlZ3BhLFxcbitcXHRcXHRcXHRcXHQgICAgVEVTVF9TTE9ULCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcywgZGF0YS1cXHUwMDNlZmxhZ3MpO1xcbiBcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXFxuLVxcdFxcdFxcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXFxuK1xcdFxcdFxcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LFxcbitcXHRcXHRcXHQgICAgIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjLFxcbitcXHRcXHRcXHQgICAgIGJvb2wgcHJpdmF0ZSlcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XFxuIFxcdFxcdC5ncGEgPSBiYXNlX2dwYSArIG9mZnNldCxcXG5AQCAtNzQsNiArODcsNyBAQCBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxcbiBcXHRcXHQudm0gPSB2Y3B1LVxcdTAwM2V2bSxcXG4gXFx0XFx0LmdwYSA9IGJhc2VfZ3BhLFxcbiBcXHRcXHQuZmxhZ3MgPSBwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDAsXFxuK1xcdFxcdC5tZW1fYmFja2luZ19zcmMgPSBtZW1fYmFja2luZ19zcmMsXFxuIFxcdH07XFxuIFxcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcXG4gXFx0cHRocmVhZF90IHNsb3Rfd29ya2VyO1xcbkBAIC0xNTAsOCArMTY0LDggQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcXG4gXFx0LypcXG4gXFx0ICogQXNzZXJ0IHN1Y2Nlc3MgaWYgcHJlZmF1bHRpbmcgdGhlIGVudGlyZSByYW5nZSBzaG91bGQgc3VjY2VlZCwgaS5lLlxcbiBcXHQgKiBjb21wbGV0ZSB3aXRoIG5vIGJ5dGVzIHJlbWFpbmluZy4gIE90aGVyd2lzZSBwcmVmYXVsdGluZyBzaG91bGQgaGF2ZVxcbi1cXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAoZHVlIHRvIFJFVF9QRl9FTVVMQVRFIGZvciBlbXVsYXRlZCBNTUlPIHdoZW5cXG4tXFx0ICogbm8gbWVtc2xvdCBleGlzdHMpLlxcbitcXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAobm8gbWVtc2xvdCBleGlzdHMgZm9yIHRoZSBHUEE7IG9uIHg4NiB0aGlzXFxuK1xcdCAqIHN1cmZhY2VzIHZpYSBSRVRfUEZfRU1VTEFURSkuXFxuIFxcdCAqL1xcbiBcXHRpZiAoIWV4cGVjdGVkX2xlZnQpXFxuIFxcdFxcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cXHUwMDNldm0pO1xcbkBAIC0xNjAsMzkgKzE3NCw4MiBAQCBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxcbiBcXHRcXHRcXHRcXHRcXHQgIEtWTV9QUkVfRkFVTFRfTUVNT1JZLCByZXQsIHZjcHUtXFx1MDAzZXZtKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXFxuK3N0cnVjdCB0ZXN0X3BhcmFtcyB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcXG4rXFx0Ym9vbCBwcml2YXRlO1xcbitcXHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIG1lbV9iYWNraW5nX3NyYztcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KGVudW0gdm1fZ3Vlc3RfbW9kZSBndWVzdF9tb2RlLCB2b2lkICphcmcpXFxuIHtcXG4tXFx0Z3BhX3QgZ3BhLCBndmEsIGFsaWdubWVudCwgZ3Vlc3RfcGFnZV9zaXplO1xcbitcXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xcbitcXHRncGFfdCBiYWNraW5nX3NyY19wYWdlc3osIG1lbV9wYWdlX3NpemU7XFxuK1xcdHN0cnVjdCB0ZXN0X3BhcmFtcyAqcCA9IGFyZztcXG4gXFx0Y29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0ge1xcbi1cXHRcXHQubW9kZSA9IFZNX01PREVfREVGQVVMVCxcXG4tXFx0XFx0LnR5cGUgPSB2bV90eXBlLFxcbitcXHRcXHQubW9kZSA9IGd1ZXN0X21vZGUsXFxuK1xcdFxcdC50eXBlID0gcC1cXHUwMDNldm1fdHlwZSxcXG4gXFx0fTtcXG4gXFx0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xcbitcXHRzdHJ1Y3Qga3ZtX3J1biAqcnVuO1xcbiBcXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcXG4gXFx0c3RydWN0IHVjYWxsIHVjO1xcbiBcXG4rXFx0cHJfaW5mbyhcXFwiVGVzdGluZyBndWVzdCBtb2RlOiAlc1xcXFxuXFxcIiwgdm1fZ3Vlc3RfbW9kZV9zdHJpbmcoZ3Vlc3RfbW9kZSkpO1xcbitcXHRwcl9pbmZvKFxcXCJUZXN0aW5nIG1lbW9yeSBiYWNraW5nIHNyYyB0eXBlOiAlc1xcXFxuXFxcIixcXG4rXFx0XFx0dm1fbWVtX2JhY2tpbmdfc3JjX2FsaWFzKHAtXFx1MDAzZW1lbV9iYWNraW5nX3NyYyktXFx1MDAzZW5hbWUpO1xcbitcXG4gXFx0dm0gPSB2bV9jcmVhdGVfc2hhcGVfd2l0aF9vbmVfdmNwdShzaGFwZSwgXFx1MDAyNnZjcHUsIGd1ZXN0X2NvZGUpO1xcbiBcXG4tXFx0YWxpZ25tZW50ID0gZ3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbVk1fTU9ERV9ERUZBVUxUXS5wYWdlX3NpemU7XFxuLVxcdGdwYSA9ICh2bS1cXHUwMDNlbWF4X2dmbiAtIFRFU1RfTlBBR0VTKSAqIGd1ZXN0X3BhZ2Vfc2l6ZTtcXG4rXFx0Z3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbZ3Vlc3RfbW9kZV0ucGFnZV9zaXplO1xcbitcXHRob3N0X3BhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGJhY2tpbmdfc3JjX3BhZ2VzeiA9IGdldF9iYWNraW5nX3NyY19wYWdlc3oocC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjKTtcXG4rXFx0bWVtX3BhZ2Vfc2l6ZSA9IG1heChob3N0X3BhZ2Vfc2l6ZSwgYmFja2luZ19zcmNfcGFnZXN6KTtcXG4rXFxuK1xcdHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZSA9IGd1ZXN0X3BhZ2Vfc2l6ZTtcXG4rXFx0dGVzdF9jb25maWcudGVzdF9zaXplID0gYWxpZ25fdXAoVEVTVF9CQVNFX1NJWkUgKyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCBtZW1fcGFnZV9zaXplKTtcXG4rXFx0dGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMgPSB2bV9jYWxjX251bV9ndWVzdF9wYWdlcyh2bS1cXHUwMDNlbW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcXG4rXFxuK1xcdGdwYSA9ICh2bS1cXHUwMDNlbWF4X2dmbiAtIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzKSAqIHRlc3RfY29uZmlnLnBhZ2Vfc2l6ZTtcXG4gXFx0YWxpZ25tZW50ID0gU1pfMk07XFxuK1xcdGFsaWdubWVudCA9IG1heChhbGlnbm1lbnQsIG1lbV9wYWdlX3NpemUpO1xcbiBcXHRncGEgPSBhbGlnbl9kb3duKGdwYSwgYWxpZ25tZW50KTtcXG4gXFx0Z3ZhID0gZ3BhIFxcdTAwMjYgKCgxVUxMIFxcdTAwM2NcXHUwMDNjICh2bS1cXHUwMDNldmFfYml0cyAtIDEpKSAtIDEpO1xcbiBcXG4tXFx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZ3BhLCBURVNUX1NMT1QsXFxuLVxcdFxcdFxcdFxcdCAgICBURVNUX05QQUdFUywgcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcXG4tXFx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCBURVNUX05QQUdFUyk7XFxuK1xcdHZtX3VzZXJzcGFjZV9tZW1fcmVnaW9uX2FkZCh2bSwgcC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjLFxcbitcXHRcXHRcXHRcXHQgICAgZ3BhLCBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLFxcbitcXHRcXHRcXHRcXHQgICAgcC1cXHUwMDNlcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcXG4rXFx0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XFxuK1xcbitcXHRpZiAocC1cXHUwMDNlcHJpdmF0ZSlcXG4rXFx0XFx0dm1fbWVtX3NldF9wcml2YXRlKHZtLCBncGEsIHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSk7XFxuK1xcbitcXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLFxcbitcXHRcXHRcXHQgcC1cXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVxcdTAwM2Vwcml2YXRlKTtcXG4rXFx0LyogUmV0cnkgdGhlIHNhbWUgcmFuZ2UgYWZ0ZXIgdGhlIGZpcnN0IHByZWZhdWx0IGF0dGVtcHQuICovXFxuK1xcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXFxuK1xcdFxcdFxcdCBwLVxcdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXFx1MDAzZXByaXZhdGUpO1xcbitcXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSxcXG4rXFx0XFx0XFx0IHRlc3RfY29uZmlnLnRlc3Rfc2l6ZSAtIGhvc3RfcGFnZV9zaXplLFxcbitcXHRcXHRcXHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcXG4rXFx0XFx0XFx0IHAtXFx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cXHUwMDNlcHJpdmF0ZSk7XFxuK1xcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsXFxuK1xcdFxcdFxcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXFxuK1xcdFxcdFxcdCBwLVxcdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXFx1MDAzZXByaXZhdGUpO1xcbiBcXG4tXFx0aWYgKHByaXZhdGUpXFxuLVxcdFxcdHZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCBURVNUX1NJWkUpO1xcbitcXHR2Y3B1X2FyZ3Nfc2V0KHZjcHUsIDEsIGd2YSk7XFxuIFxcbi1cXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgU1pfMk0sIDAsIHByaXZhdGUpO1xcbi1cXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgU1pfMk0sIFBBR0VfU0laRSAqIDIsIFBBR0VfU0laRSwgcHJpdmF0ZSk7XFxuLVxcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTtcXG4rXFx0LyogRXhwb3J0IHRoZSBzaGFyZWQgdmFyaWFibGVzIHRvIHRoZSBndWVzdC4gKi9cXG4rXFx0c3luY19nbG9iYWxfdG9fZ3Vlc3Qodm0sIHRlc3RfY29uZmlnKTtcXG4gXFxuLVxcdHZjcHVfYXJnc19zZXQodmNwdSwgMSwgZ3ZhKTtcXG4gXFx0dmNwdV9ydW4odmNwdSk7XFxuIFxcbitcXHRydW4gPSB2Y3B1LVxcdTAwM2VydW47XFxuK1xcdFRFU1RfQVNTRVJUKHJ1bi1cXHUwMDNlZXhpdF9yZWFzb24gPT0gVUNBTExfRVhJVF9SRUFTT04sXFxuK1xcdFxcdCAgICBcXFwiV2FudGVkICVzLCBnb3QgZXhpdCByZWFzb246ICV1ICglcylcXFwiLFxcbitcXHRcXHQgICAgZXhpdF9yZWFzb25fc3RyKFVDQUxMX0VYSVRfUkVBU09OKSxcXG4rXFx0XFx0ICAgIHJ1bi1cXHUwMDNlZXhpdF9yZWFzb24sIGV4aXRfcmVhc29uX3N0cihydW4tXFx1MDAzZWV4aXRfcmVhc29uKSk7XFxuK1xcbiBcXHRzd2l0Y2ggKGdldF91Y2FsbCh2Y3B1LCBcXHUwMDI2dWMpKSB7XFxuIFxcdGNhc2UgVUNBTExfQUJPUlQ6XFxuIFxcdFxcdFJFUE9SVF9HVUVTVF9BU1NFUlQodWMpO1xcbkBAIC0yMDcsMjQgKzI2NCw2MSBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSlcXG4gXFx0a3ZtX3ZtX2ZyZWUodm0pO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXFxuK3N0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgYmFja2luZ19zcmMsXFxuK1xcdFxcdFxcdFxcdCAgYm9vbCBwcml2YXRlKVxcbiB7XFxuK1xcdHN0cnVjdCB0ZXN0X3BhcmFtcyBwID0ge1xcbitcXHRcXHQudm1fdHlwZSA9IHZtX3R5cGUsXFxuK1xcdFxcdC5wcml2YXRlID0gcHJpdmF0ZSxcXG4rXFx0XFx0Lm1lbV9iYWNraW5nX3NyYyA9IGJhY2tpbmdfc3JjLFxcbitcXHR9O1xcbitcXG4gXFx0aWYgKHZtX3R5cGUgXFx1MDAyNlxcdTAwMjYgIShrdm1fY2hlY2tfY2FwKEtWTV9DQVBfVk1fVFlQRVMpIFxcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xcbiBcXHRcXHRwcl9pbmZvKFxcXCJTa2lwcGluZyB0ZXN0cyBmb3Igdm1fdHlwZSAweCVseFxcXFxuXFxcIiwgdm1fdHlwZSk7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4tXFx0X190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodm1fdHlwZSwgcHJpdmF0ZSk7XFxuK1xcdGZvcl9lYWNoX2d1ZXN0X21vZGUoX190ZXN0X3ByZV9mYXVsdF9tZW1vcnksIFxcdTAwMjZwKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaGVscChjaGFyICpuYW1lKVxcbit7XFxuK1xcdHB1dHMoXFxcIlxcXCIpO1xcbitcXHRwcmludGYoXFxcInVzYWdlOiAlcyBbLWhdIFstbSBtb2RlXSBbLXMgbWVtLXR5cGVdXFxcXG5cXFwiLCBuYW1lKTtcXG4rXFx0cHV0cyhcXFwiXFxcIik7XFxuK1xcdGd1ZXN0X21vZGVzX2hlbHAoKTtcXG4rXFx0YmFja2luZ19zcmNfaGVscChcXFwiLXNcXFwiKTtcXG4rXFx0cHV0cyhcXFwiXFxcIik7XFxuIH1cXG4gXFxuIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXFxuIHtcXG4rXFx0ZW51bSB2bV9tZW1fYmFja2luZ19zcmNfdHlwZSBiYWNraW5nID0gREVGQVVMVF9WTV9NRU1fU1JDO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcXG4rXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJobTpzOlxcXCIpKSAhPSAtMSkge1xcbitcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbitcXHRcXHRjYXNlICdtJzpcXG4rXFx0XFx0XFx0Z3Vlc3RfbW9kZXNfY21kbGluZShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncyc6XFxuK1xcdFxcdFxcdGJhY2tpbmcgPSBwYXJzZV9iYWNraW5nX3NyY190eXBlKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdoJzpcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0aGVscChhcmd2WzBdKTtcXG4rXFx0XFx0XFx0ZXhpdCgwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcXG4gXFxuLVxcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XFxuK1xcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBiYWNraW5nLCBmYWxzZSk7XFxuICNpZmRlZiBfX3g4Nl82NF9fXFxuLVxcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgZmFsc2UpO1xcbi1cXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIHRydWUpO1xcbitcXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIGZhbHNlKTtcXG4rXFx0dGVzdF9wcmVfZmF1bHRfbWVtb3J5KEtWTV9YODZfU1dfUFJPVEVDVEVEX1ZNLCBiYWNraW5nLCB0cnVlKTtcXG4gI2VuZGlmXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjA1LjI0ODQ1MzMyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjgzMzQ4ODA2NDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDVlYmU0MzFmY2YxOTJhMGI5NDIyOWI1NGQ5ZmFiNTBlZDA5NmYzOGJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxMzoxMzowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdCBiL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdFxuaW5kZXggNDk4OGMzMmRmNGJmOC4uZmI3ZjhiYWNhOTcwYyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0XG5AQCAtNjQ4NSw3ICs2NDg1LDcgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFxuIDpDYXBhYmlsaXR5OiBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUllcbi06QXJjaGl0ZWN0dXJlczogbm9uZVxuKzpBcmNoaXRlY3R1cmVzOiB4ODYsIHMzOTAsIGFybTY0XG4gOlR5cGU6IHZjcHUgaW9jdGxcbiA6UGFyYW1ldGVyczogc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5IChpbi9vdXQpXG4gOlJldHVybnM6IDAgaWYgYXQgbGVhc3Qgb25lIHBhZ2UgaXMgcHJvY2Vzc2VkLCBcdTAwM2MgMCBvbiBlcnJvclxuQEAgLTY0OTMsMTIgKzY0OTMsMTQgQEAgU2VlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLlxuIEVycm9yczpcbiBcbiAgID09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4rICBFQUdBSU4gICAgIEEgcmFjZSBvY2N1cnJlZCBiZWZvcmUgcHJvZ3Jlc3Mgd2FzIG1hZGUsIGJ1dCBhIHJldHJ5IG1heSBzdWNjZWVkLlxuICAgRUlOVkFMICAgICBUaGUgc3BlY2lmaWVkIGBncGFgIGFuZCBgc2l6ZWAgd2VyZSBpbnZhbGlkIChlLmcuIG5vdFxuICAgICAgICAgICAgICBwYWdlIGFsaWduZWQsIGNhdXNlcyBhbiBvdmVyZmxvdywgb3Igc2l6ZSBpcyB6ZXJvKSwgb3IgdGhlIFZNXG4gICAgICAgICAgICAgIGlzIFVDT05UUk9MIChzMzkwKS5cbiAgIEVOT0VOVCAgICAgVGhlIHNwZWNpZmllZCBgZ3BhYCBpcyBvdXRzaWRlIGRlZmluZWQgbWVtc2xvdHMuXG4gICBFSU5UUiAgICAgIEFuIHVubWFza2VkIHNpZ25hbCBpcyBwZW5kaW5nIGFuZCBubyBwYWdlIHdhcyBwcm9jZXNzZWQuXG4gICBFRkFVTFQgICAgIFRoZSBwYXJhbWV0ZXIgYWRkcmVzcyB3YXMgaW52YWxpZC5cbisgIEVIV1BPSVNPTiAgQSBwb2lzb25lZCBob3N0IHBhZ2Ugd2FzIGVuY291bnRlcmVkLlxuICAgRU9QTk9UU1VQUCBNYXBwaW5nIG1lbW9yeSBmb3IgYSBHUEEgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlXG4gICAgICAgICAgICAgIGh5cGVydmlzb3IsIGFuZC9vciBmb3IgdGhlIGN1cnJlbnQgdkNQVSBzdGF0ZS9tb2RlLlxuICAgRUlPICAgICAgICB1bmV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbnMgKGFsc28gY2F1c2VzIGEgV0FSTilcbkBAIC02NTE4LDcgKzY1MjAsMTcgQEAgRXJyb3JzOlxuIEtWTV9QUkVfRkFVTFRfTUVNT1JZIHBvcHVsYXRlcyBLVk0ncyBzdGFnZS0yIHBhZ2UgdGFibGVzIHVzZWQgdG8gbWFwIG1lbW9yeVxuIGZvciB0aGUgY3VycmVudCB2Q1BVIHN0YXRlLiAgS1ZNIG1hcHMgbWVtb3J5IGFzIGlmIHRoZSB2Q1BVIGdlbmVyYXRlZCBhXG4gc3RhZ2UtMiByZWFkIHBhZ2UgZmF1bHQsIGUuZy4gZmF1bHRzIGluIG1lbW9yeSBhcyBuZWVkZWQsIGJ1dCBkb2Vzbid0IGJyZWFrXG4tQ29XLiAgT24geDg2LCBLVk0gZG9lcyBub3QgbWFyayBhbnkgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURSBhcyBBY2Nlc3NlZC5cbitDb1cuICBPbiBhcm02NCwgS1ZNIG1hcmtzIG5ld2x5IGNyZWF0ZWQgc3RhZ2UtMiBQVEVzIGFzIEFjY2Vzc2VkLCBhcyBpdFxuK2RvZXMgZm9yIGFueSBzdGFnZS0yIGZhdWx0LCBidXQgbGVhdmVzIHRoZSBBY2Nlc3NlZCBzdGF0ZSBvZiBleGlzdGluZyBQVEVzXG4rdW5jaGFuZ2VkLiAgT24geDg2LCBLVk0gZG9lcyBub3QgbWFyayBhbnkgbmV3bHkgY3JlYXRlZCBzdGFnZS0yIFBURSBhc1xuK0FjY2Vzc2VkLCBhbmQgZm9yIHMzOTAgaXQgaXMgbm90IGFwcGxpY2FibGUuXG4rXG4rT24gYXJtNjQsIGEgR1BBIGlzIGludGVycHJldGVkIGFzIGFuIElQQSwgYW5kIG5ldmVyIGludGVycHJldGVkIGFzIHRoZSBJUEFcbitvZiBhIG5lc3RlZCBndWVzdC4gUHJlLWZhdWx0aW5nIG9ubHkgcG9wdWxhdGVzIGNhbm9uaWNhbCBzdGFnZSAyIHBhZ2Vcbit0YWJsZXMuXG4rXG4rVGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhcm02NCBpZiB0aGUgcHJvdGVjdGVkIEtWTSAocEtWTSkgZmVhdHVyZVxuK2lzIGVuYWJsZWQuXG4gXG4gSW4gdGhlIGNhc2Ugb2YgY29uZmlkZW50aWFsIFZNIHR5cGVzIHdoZXJlIHRoZXJlIGlzIGFuIGluaXRpYWwgc2V0IHVwIG9mXG4gcHJpdmF0ZSBndWVzdCBtZW1vcnkgYmVmb3JlIHRoZSBndWVzdCBpcyAnZmluYWxpemVkJy9tZWFzdXJlZCwgdGhpcyBpb2N0bFxuQEAgLTY1MzMsNyArNjU0NSw3IEBAIFdoZW4gdGhlIGlvY3RsIHJldHVybnMsIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlXG4gcmVtYWluaW5nIHJhbmdlLiAgSWYgYHNpemVgIFx1MDAzZSAwIG9uIHJldHVybiwgdGhlIGNhbGxlciBjYW4ganVzdCBpc3N1ZVxuIHRoZSBpb2N0bCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGBzdHJ1Y3Qga3ZtX21hcF9tZW1vcnlgIGFyZ3VtZW50LlxuIFxuLVNoYWRvdyBwYWdlIHRhYmxlcyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGlvY3RsIGJlY2F1c2UgdGhleVxuK09uIHg4Niwgc2hhZG93IHBhZ2UgdGFibGVzIGNhbm5vdCBzdXBwb3J0IHRoaXMgaW9jdGwgYmVjYXVzZSB0aGV5XG4gYXJlIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzIG9yIG5lc3RlZCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzLlxuIENhbGxpbmcgdGhpcyBpb2N0bCB3aGVuIHRoZSBndWVzdCBpcyB1c2luZyBzaGFkb3cgcGFnZSB0YWJsZXMgKGZvclxuIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyBydW5uaW5nIGEgbmVzdGVkIGd1ZXN0IHdpdGggbmVzdGVkIHBhZ2UgdGFibGVzKVxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oXG5pbmRleCBmODE2ZjVkNzdmMWE1Li45YzAyMDU5ODNkOWE4IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaFxuQEAgLTQzNyw2ICs0MzcsNTAgQEBcbiAjaWZuZGVmIF9fQVNTRU1CTEVSX19cbiAjaW5jbHVkZSBcdTAwM2Nhc20vdHlwZXMuaFx1MDAzZVxuIFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTggZXNyX2dldF9lYyh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gRVNSX0VMeF9FQyhlc3IpO1xuK31cbitcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX3RyYXBfaXNfaWFidCh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gZXNyX2dldF9lYyhlc3IpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3MxcHR3KHVuc2lnbmVkIGxvbmcgZXNyKVxuK3tcbitcdHJldHVybiBlc3IgXHUwMDI2IEVTUl9FTHhfUzFQVFc7XG4rfVxuK1xuKy8qIEFsd2F5cyBjaGVjayBmb3IgUzFQVFcgKmJlZm9yZSogdXNpbmcgdGhpcy4gKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2RhYnRfaXNfd3JpdGUodW5zaWduZWQgbG9uZyBlc3IpXG4re1xuK1x0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9XTlI7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfZGFidF9pc19jbSh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRyZXR1cm4gZXNyIFx1MDAyNiBFU1JfRUx4X0NNO1xuK31cbitcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgZXNyX2FidF9pc19leGVjX2ZhdWx0KHVuc2lnbmVkIGxvbmcgZXNyKVxuK3tcbitcdHJldHVybiBlc3JfdHJhcF9pc19pYWJ0KGVzcikgXHUwMDI2XHUwMDI2ICFlc3JfYWJ0X2lzX3MxcHR3KGVzcik7XG4rfVxuK1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBlc3JfYWJ0X2lzX3NlYSh1bnNpZ25lZCBsb25nIGVzcilcbit7XG4rXHRzd2l0Y2ggKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpIHtcbitcdGNhc2UgRVNSX0VMeF9GU0NfRVhUQUJUOlxuK1x0Y2FzZSBFU1JfRUx4X0ZTQ19TRUFfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VBX1RUVygzKTpcbitcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQzpcbitcdGNhc2UgRVNSX0VMeF9GU0NfU0VDQ19UVFcoLTEpIC4uLiBFU1JfRUx4X0ZTQ19TRUNDX1RUVygzKTpcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBlc3JfYnJrX2NvbW1lbnQodW5zaWduZWQgbG9uZyBlc3IpXG4ge1xuIFx0cmV0dXJuIGVzciBcdTAwMjYgRVNSX0VMeF9CUks2NF9JU1NfQ09NTUVOVF9NQVNLO1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuaW5kZXggYTNjMTkyOGJkZjc0My4uYTNiMjcyMjY1NTU0MyAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oXG5AQCAtNDExLDE4ICs0MTEsMTMgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfcmQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9hYnRfaXNzMXR3KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRyZXR1cm4gISEoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSBcdTAwMjYgRVNSX0VMeF9TMVBUVyk7XG4rXHRyZXR1cm4gZXNyX2FidF9pc19zMXB0dyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gLyogQWx3YXlzIGNoZWNrIGZvciBTMVBUVyAqYmVmb3JlKiB1c2luZyB0aGlzLiAqL1xuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbi1cdHJldHVybiBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X1dOUjtcbi19XG4tXG4tc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2RhYnRfaXNfY20oY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiAhIShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpIFx1MDAyNiBFU1JfRUx4X0NNKTtcbitcdHJldHVybiBlc3JfZGFidF9pc193cml0ZShrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQga3ZtX3ZjcHVfZGFidF9nZXRfYXMoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuQEAgLTQzOCwxNyArNDMzLDEyIEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lsX2lzMzJiaXQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB1OCBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIEVTUl9FTHhfRUMoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4rXHRyZXR1cm4gZXNyX2dldF9lYyhrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X3RyYXBfaXNfaWFidChjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4ge1xuLVx0cmV0dXJuIGt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpID09IEVTUl9FTHhfRUNfSUFCVF9MT1c7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLXtcbi1cdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkgXHUwMDI2XHUwMDI2ICFrdm1fdmNwdV9hYnRfaXNzMXR3KHZjcHUpO1xuK1x0cmV0dXJuIGVzcl90cmFwX2lzX2lhYnQoa3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KSk7XG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTgga3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuQEAgLTQ2OCwyNiArNDU4LDkgQEAgYm9vbCBrdm1fdmNwdV90cmFwX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdHJldHVybiBlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lXG4tdTY0IGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4te1xuLVx0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuLVxuLVx0QlVHX09OKCFlc3JfZnNjX2lzX3Blcm1pc3Npb25fZmF1bHQoZXNyKSk7XG4tXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoZXNyIFx1MDAyNiBFU1JfRUx4X0ZTQ19MRVZFTCkpO1xuLX1cbi1cbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wga3ZtX3ZjcHVfYWJ0X2lzc2VhKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4tXHRzd2l0Y2ggKGt2bV92Y3B1X3RyYXBfZ2V0X2ZhdWx0KHZjcHUpKSB7XG4tXHRjYXNlIEVTUl9FTHhfRlNDX0VYVEFCVDpcbi1cdGNhc2UgRVNSX0VMeF9GU0NfU0VBX1RUVygtMSkgLi4uIEVTUl9FTHhfRlNDX1NFQV9UVFcoMyk6XG4tXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0M6XG4tXHRjYXNlIEVTUl9FTHhfRlNDX1NFQ0NfVFRXKC0xKSAuLi4gRVNSX0VMeF9GU0NfU0VDQ19UVFcoMyk6XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0ZGVmYXVsdDpcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuK1x0cmV0dXJuIGVzcl9hYnRfaXNfc2VhKGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBrdm1fdmNwdV9zeXNfZ2V0X3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbkBAIC00OTYsOSArNDY5LDkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQga3ZtX3ZjcHVfc3lzX2dldF9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRyZXR1cm4gRVNSX0VMeF9TWVM2NF9JU1NfUlQoZXNyKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4rc3RhdGljIGlubGluZSBib29sIGVzcl9hYnRfaXNfd3JpdGVfZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpXG4ge1xuLVx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbitcdGlmIChlc3JfYWJ0X2lzX3MxcHR3KGVzcikpIHtcbiBcdFx0LypcbiBcdFx0ICogT25seSBhIHBlcm1pc3Npb24gZmF1bHQgb24gYSBTMVBUVyBzaG91bGQgYmVcbiBcdFx0ICogY29uc2lkZXJlZCBhcyBhIHdyaXRlLiBPdGhlcndpc2UsIHBhZ2UgdGFibGVzIGJha2VkXG5AQCAtNTExLDEzICs0ODQsMTggQEAgc3RhdGljIGlubGluZSBib29sIGt2bV9pc193cml0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdCAqIGZpcnN0KSwgdGhlbiBhIHBlcm1pc3Npb24gZmF1bHQgdG8gYWxsb3cgdGhlIGZsYWdzXG4gXHRcdCAqIHRvIGJlIHNldC5cbiBcdFx0ICovXG4tXHRcdHJldHVybiBrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSk7XG4rXHRcdHJldHVybiBlc3JfZnNjX2lzX3Blcm1pc3Npb25fZmF1bHQoZXNyKTtcbiBcdH1cbiBcbi1cdGlmIChrdm1fdmNwdV90cmFwX2lzX2lhYnQodmNwdSkpXG4rXHRpZiAoZXNyX3RyYXBfaXNfaWFidChlc3IpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4ga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKHZjcHUpO1xuK1x0cmV0dXJuIGVzcl9kYWJ0X2lzX3dyaXRlKGVzcik7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1faXNfd3JpdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGt2bV92Y3B1X2dldF9lc3IodmNwdSkpO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X21waWRyX2FmZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG5pbmRleCA0MWE4Njg3OTM4ZWI2Li5kMDE2N2Y3ZGZiZWUzIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGd0YWJsZS5oXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wZ3RhYmxlLmhcbkBAIC04NTksNiArODU5LDggQEAgaW50IGt2bV9wZ3RhYmxlX3dhbGsoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLCB1NjQgc2l6ZSxcbiAgKiBAYWRkcjpcdElucHV0IGFkZHJlc3MgZm9yIHRoZSBzdGFydCBvZiB0aGUgd2Fsay5cbiAgKiBAcHRlcDpcdFBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHJpZXZlZCBQVEUuXG4gICogQGxldmVsOlx0UG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgbGV2ZWwgb2YgdGhlIHJldHJpZXZlZCBQVEUuXG4rICogQGZsYWdzOlx0RmxhZ3MgdG8gY29udHJvbCB0aGUgcGFnZS10YWJsZSB3YWxrXG4rICpcdFx0KHNlZSBzdHJ1Y3Qga3ZtX3BndGFibGVfdmlzaXRfY3R4KS5cbiAgKlxuICAqIFRoZSBvZmZzZXQgb2YgQGFkZHIgd2l0aGluIGEgcGFnZSBpcyBpZ25vcmVkLlxuICAqXG5AQCAtODY5LDcgKzg3MSw4IEBAIGludCBrdm1fcGd0YWJsZV93YWxrKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkciwgdTY0IHNpemUsXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiAgKi9cbiBpbnQga3ZtX3BndGFibGVfZ2V0X2xlYWYoc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QsIHU2NCBhZGRyLFxuLVx0XHRcdCBrdm1fcHRlX3QgKnB0ZXAsIHM4ICpsZXZlbCk7XG4rXHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuK1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpO1xuIFxuIC8qKlxuICAqIGt2bV9wZ3RhYmxlX3N0YWdlMl9wdGVfcHJvdCgpIC0gUmV0cmlldmUgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlcyBvZiBhXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG5pbmRleCBiZWVhMDBlNjkzYTBhLi40ZDZlNTc2NWU5ZTU2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcGt2bS5oXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9wa3ZtLmhcbkBAIC00NCw5ICs0NCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fcGt2bV9leHRfYWxsb3dlZChzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgZXh0KVxuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9QVFJBVVRIX0dFTkVSSUM6XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0Y2FzZSBLVk1fQ0FQX0FSTV9NVEU6XG4tXHRcdHJldHVybiBmYWxzZTtcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fRUFHRVJfU1BMSVRfQ0hVTktfU0laRTpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fU1VQUE9SVEVEX0JMT0NLX1NJWkVTOlxuK1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHJldHVybiBmYWxzZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAha3ZtIHx8ICFrdm1fdm1faXNfcHJvdGVjdGVkKGt2bSk7XG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWdcbmluZGV4IDQ0OTE1NGY5YTQ4NTIuLjcxMjMzMDY4YjdjYjYgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnXG4rKysgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnXG5AQCAtMzcsNiArMzcsNyBAQCBtZW51Y29uZmlnIEtWTVxuIFx0c2VsZWN0IFNDSEVEX0lORk9cbiBcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xuIFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuK1x0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcbiBcdGhlbHBcbiBcdCAgU3VwcG9ydCBob3N0aW5nIHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzLlxuIFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2FybS5jIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcbmluZGV4IGNjYWU4MmMxMjQyYmMuLjU4YWM3MGYzMWQ4NGUgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9hcm0uY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vYXJtLmNcbkBAIC0zOTMsNiArMzkzLDcgQEAgaW50IGt2bV92bV9pb2N0bF9jaGVja19leHRlbnNpb24oc3RydWN0IGt2bSAqa3ZtLCBsb25nIGV4dClcbiBcdGNhc2UgS1ZNX0NBUF9DT1VOVEVSX09GRlNFVDpcbiBcdGNhc2UgS1ZNX0NBUF9BUk1fV1JJVEFCTEVfSU1QX0lEX1JFR1M6XG4gXHRjYXNlIEtWTV9DQVBfQVJNX1NFQV9UT19VU0VSOlxuK1x0Y2FzZSBLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlk6XG4gXHRcdHIgPSAxO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcyOlxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL21lbV9wcm90ZWN0LmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9tZW1fcHJvdGVjdC5jXG5pbmRleCAzOWFhODkxMWY2MmMxLi4yM2E1NzMxMmI5ODFiIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbWVtX3Byb3RlY3QuY1xuQEAgLTUzMiw3ICs1MzIsNyBAQCBzdGF0aWMgaW50IGhvc3Rfc3RhZ2UyX2FkanVzdF9yYW5nZSh1NjQgYWRkciwgc3RydWN0IGt2bV9tZW1fcmFuZ2UgKnJhbmdlKVxuIFx0aW50IHJldDtcbiBcbiBcdGh5cF9hc3NlcnRfbG9ja19oZWxkKFx1MDAyNmhvc3RfbW11LmxvY2spO1xuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNmhvc3RfbW11LnBndCwgYWRkciwgXHUwMDI2cHRlLCBcdTAwMjZsZXZlbCwgMCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuIFxuQEAgLTkxMCw3ICs5MTAsNyBAQCBzdGF0aWMgaW50IGdldF92YWxpZF9ndWVzdF9wdGUoc3RydWN0IHBrdm1faHlwX3ZtICp2bSwgdTY0IGlwYSwga3ZtX3B0ZV90ICpwdGVwLFxuIFx0czggbGV2ZWw7XG4gXHRpbnQgcmV0O1xuIFxuLVx0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2dm0tXHUwMDNlcGd0LCBpcGEsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwsIDApO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdGlmIChndWVzdF9wdGVfaXNfcG9pc29uZWQocHRlKSlcbkBAIC05NTksNyArOTU5LDcgQEAgaW50IF9fcGt2bV92Y3B1X2luX3BvaXNvbl9mYXVsdChzdHJ1Y3QgcGt2bV9oeXBfdmNwdSAqaHlwX3ZjcHUpXG4gXHRpcGEgfD0gRkFSX1RPX0ZJUEFfT0ZGU0VUKGt2bV92Y3B1X2dldF9oZmFyKFx1MDAyNmh5cF92Y3B1LVx1MDAzZXZjcHUpKTtcbiBcbiBcdGd1ZXN0X2xvY2tfY29tcG9uZW50KHZtKTtcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gdW5sb2NrO1xuIFxuQEAgLTEzMTUsNyArMTMxNSw3IEBAIHN0YXRpYyBpbnQgaG9zdF9zdGFnZTJfZ2V0X2d1ZXN0X2luZm8ocGh5c19hZGRyX3QgcGh5cywgc3RydWN0IHBrdm1faHlwX3ZtICoqdm0sXG4gXHRcdHJldHVybiAtRVBFUk07XG4gXHR9XG4gXG4tXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZob3N0X21tdS5wZ3QsIHBoeXMsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2aG9zdF9tbXUucGd0LCBwaHlzLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtMTU0NCw3ICsxNTQ0LDcgQEAgc3RhdGljIGludCBfX2NoZWNrX2hvc3Rfc2hhcmVkX2d1ZXN0KHN0cnVjdCBwa3ZtX2h5cF92bSAqdm0sIHU2NCAqX19waHlzLCB1NjQgaXBcbiBcdHM4IGxldmVsO1xuIFx0aW50IHJldDtcbiBcbi1cdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsKTtcbitcdHJldCA9IGt2bV9wZ3RhYmxlX2dldF9sZWFmKFx1MDAyNnZtLVx1MDAzZXBndCwgaXBhLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXHRpZiAoIWt2bV9wdGVfdmFsaWQocHRlKSlcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvcGd0YWJsZS5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3BndGFibGUuY1xuaW5kZXggYjc0ZGQ1Y2UxZWZkMy4uMzQ3ZWVjMzk1N2Q2YSAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9wZ3RhYmxlLmNcbkBAIC0yOTgsMTIgKzI5OCwxMyBAQCBzdGF0aWMgaW50IGxlYWZfd2Fsa2VyKGNvbnN0IHN0cnVjdCBrdm1fcGd0YWJsZV92aXNpdF9jdHggKmN0eCxcbiB9XG4gXG4gaW50IGt2bV9wZ3RhYmxlX2dldF9sZWFmKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LCB1NjQgYWRkcixcbi1cdFx0XHQga3ZtX3B0ZV90ICpwdGVwLCBzOCAqbGV2ZWwpXG4rXHRcdFx0IGt2bV9wdGVfdCAqcHRlcCwgczggKmxldmVsLFxuK1x0XHRcdCBlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IGxlYWZfd2Fsa19kYXRhIGRhdGE7XG4gXHRzdHJ1Y3Qga3ZtX3BndGFibGVfd2Fsa2VyIHdhbGtlciA9IHtcbiBcdFx0LmNiXHQ9IGxlYWZfd2Fsa2VyLFxuLVx0XHQuZmxhZ3NcdD0gS1ZNX1BHVEFCTEVfV0FMS19MRUFGLFxuK1x0XHQuZmxhZ3NcdD0gZmxhZ3MgfCBLVk1fUEdUQUJMRV9XQUxLX0xFQUYsXG4gXHRcdC5hcmdcdD0gXHUwMDI2ZGF0YSxcbiBcdH07XG4gXHRpbnQgcmV0O1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9hcm02NC9rdm0vbW11LmNcbmluZGV4IDc0ZTdlN2Y3NTY0YzguLjE3ZjFmNmQzNmYyYjggMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9hcm02NC9rdm0vbW11LmNcbkBAIC01LDYgKzUsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2FjcGkuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NsZWFudXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pby5oXHUwMDNlXG5AQCAtODY2LDcgKzg2Nyw3IEBAIHN0YXRpYyBpbnQgZ2V0X3VzZXJfbWFwcGluZ19zaXplKHN0cnVjdCBrdm0gKmt2bSwgdTY0IGFkZHIpXG4gXHQgKiBJUEktaW5nIHRocmVhZHMpLlxuIFx0ICovXG4gXHRsb2NhbF9pcnFfc2F2ZShmbGFncyk7XG4tXHRyZXQgPSBrdm1fcGd0YWJsZV9nZXRfbGVhZihcdTAwMjZwZ3QsIGFkZHIsIFx1MDAyNnB0ZSwgXHUwMDI2bGV2ZWwpO1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYoXHUwMDI2cGd0LCBhZGRyLCBcdTAwMjZwdGUsIFx1MDAyNmxldmVsLCAwKTtcbiBcdGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcbiBcbiBcdGlmIChyZXQpXG5AQCAtMTU1NCw5ICsxNTU1LDkgQEAgc3RhdGljIHZvaWQgKmdldF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHRyZXR1cm4gXHUwMDI2dmNwdS1cdTAwM2VhcmNoLnBrdm1fbWVtY2FjaGU7XG4gfVxuIFxuLXN0YXRpYyBpbnQgdG9wdXBfbW11X21lbWNhY2hlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdm9pZCAqbWVtY2FjaGUpXG4rc3RhdGljIGludCB0b3B1cF9tbXVfbWVtY2FjaGUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdm9pZCAqbWVtY2FjaGUpXG4ge1xuLVx0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKHZjcHUtXHUwMDNlYXJjaC5od19tbXUpO1xuK1x0aW50IG1pbl9wYWdlcyA9IGt2bV9tbXVfY2FjaGVfbWluX3BhZ2VzKG1tdSk7XG4gXG4gXHRpZiAoIWlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKVxuIFx0XHRyZXR1cm4ga3ZtX21tdV90b3B1cF9tZW1vcnlfY2FjaGUobWVtY2FjaGUsIG1pbl9wYWdlcyk7XG5AQCAtMTYwMywxNSArMTYwNCw0NyBAQCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2Mge1xuIFx0c3RydWN0IGt2bV9zMl90cmFuc1x0Km5lc3RlZDtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3RcdCptZW1zbG90O1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRodmE7XG4rXHR1bnNpZ25lZCBsb25nXHRcdGVzcjtcbitcdHN0cnVjdCBrdm1fczJfbW11XHQqbW11O1xuIH07XG4gXG4tc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbitzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCB7XG4rXHR1bnNpZ25lZCBsb25nIG1hcHBpbmdfc2l6ZTtcbit9O1xuK1xuK3N0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbit7XG4rXHRyZXR1cm4gZXNyX2ZzY19pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNlZXNyKTtcbit9XG4rXG4rc3RhdGljIGJvb2wga3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpO1xuK31cbitcbitzdGF0aWMgYm9vbCBrdm1fczJfZmF1bHRfaXNfd3JpdGUoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkKVxuK3tcbitcdHJldHVybiBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KHMyZmQtXHUwMDNlZXNyKTtcbit9XG4rXG4rc3RhdGljIHU2NCBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbit7XG4rXHR1NjQgbGV2ZWw7XG4rXG4rXHRpZiAoIWt2bV9zMl9mYXVsdF9pc19wZXJtKHMyZmQpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGxldmVsID0gczJmZC1cdTAwM2Vlc3IgXHUwMDI2IEVTUl9FTHhfRlNDX0xFVkVMO1xuK1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKGxldmVsKSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4rXHRcdCAgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXG4ge1xuIFx0Ym9vbCB3cml0ZV9mYXVsdCwgZXhlY19mYXVsdDtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuK1x0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XG4gXHRlbnVtIGt2bV9wZ3RhYmxlX3dhbGtfZmxhZ3MgZmxhZ3MgPSBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRDtcbiBcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90ID0gS1ZNX1BHVEFCTEVfUFJPVF9SO1xuLVx0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZXZjcHUtXHUwMDNlYXJjaC5od19tbXUtXHUwMDNlcGd0O1xuK1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHR1bnNpZ25lZCBsb25nIG1tdV9zZXE7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiBcdHN0cnVjdCBrdm0gKmt2bSA9IHMyZmQtXHUwMDNldmNwdS1cdTAwM2Vrdm07XG5AQCAtMTYyMiw3ICsxNjU1LDcgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcbiBcdGlmICghcGVybV9mYXVsdCkge1xuIFx0XHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNldmNwdSwgbWVtY2FjaGUpO1xuK1x0XHRyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2VtbXUsIG1lbWNhY2hlKTtcbiBcdFx0aWYgKHJldClcbiBcdFx0XHRyZXR1cm4gcmV0O1xuIFx0fVxuQEAgLTE2MzIsOCArMTY2NSw4IEBAIHN0YXRpYyBpbnQgZ21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRlbHNlXG4gXHRcdGdmbiA9IHMyZmQtXHUwMDNlZmF1bHRfaXBhIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuLVx0d3JpdGVfZmF1bHQgPSBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbi1cdGV4ZWNfZmF1bHQgPSBrdm1fdmNwdV90cmFwX2lzX2V4ZWNfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KTtcbitcdHdyaXRlX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpO1xuK1x0ZXhlY19mYXVsdCA9IGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpO1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFKHdyaXRlX2ZhdWx0IFx1MDAyNlx1MDAyNiBleGVjX2ZhdWx0KTtcbiBcbkBAIC0xNjg3LDcgKzE3MjAsMTMgQEAgc3RhdGljIGludCBnbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGlmICgocHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XKSBcdTAwMjZcdTAwMjYgIXJldClcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdmbik7XG4gXG4tXHRyZXR1cm4gcmV0ICE9IC1FQUdBSU4gPyByZXQgOiAwO1xuK1x0aWYgKHJldCA9PSAtRUFHQUlOKVxuK1x0XHRyZXR1cm4gcmVzdWx0ID8gcmV0IDogMDtcbitcbitcdGlmIChyZXN1bHQgXHUwMDI2XHUwMDI2ICFyZXQpXG4rXHRcdHJlc3VsdC1cdTAwM2VtYXBwaW5nX3NpemUgPSBQQUdFX1NJWkU7XG4rXG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHtcbkBAIC0xNzA5LDcgKzE3NDgsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9MT05HVEVSTSB8IEZPTExfV1JJVEU7XG4gXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBzMmZkLVx1MDAzZXZjcHU7XG4tXHRzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IHZjcHUtXHUwMDNlYXJjaC5od19tbXUtXHUwMDNlcGd0O1xuK1x0c3RydWN0IGt2bV9wZ3RhYmxlICpwZ3QgPSBzMmZkLVx1MDAzZW1tdS1cdTAwM2VwZ3Q7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LVx1MDAzZWt2bTtcbiBcdHZvaWQgKmh5cF9tZW1jYWNoZTtcbkBAIC0xNzE3LDcgKzE3NTYsNyBAQCBzdGF0aWMgaW50IHBrdm1fbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdGludCByZXQ7XG4gXG4gXHRoeXBfbWVtY2FjaGUgPSBnZXRfbW11X21lbWNhY2hlKHZjcHUpO1xuLVx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHZjcHUsIGh5cF9tZW1jYWNoZSk7XG4rXHRyZXQgPSB0b3B1cF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2VtbXUsIGh5cF9tZW1jYWNoZSk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcbkBAIC0xODQwLDExICsxODc5LDYgQEAgc3RhdGljIHNob3J0IGt2bV9zMl9yZXNvbHZlX3ZtYV9zaXplKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdHJldHVybiB2bWFfc2hpZnQ7XG4gfVxuIFxuLXN0YXRpYyBib29sIGt2bV9zMl9mYXVsdF9pc19wZXJtKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbi17XG4tXHRyZXR1cm4ga3ZtX3ZjcHVfdHJhcF9pc19wZXJtaXNzaW9uX2ZhdWx0KHMyZmQtXHUwMDNldmNwdSk7XG4tfVxuLVxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2dldF92bWFfaW5mbyhjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmkpXG4ge1xuQEAgLTE5MTAsMTMgKzE5NDQsMTEgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfcGluX3Bmbihjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRzMnZpLVx1MDAzZXBmbiA9IF9fa3ZtX2ZhdWx0aW5fcGZuKHMyZmQtXHUwMDNlbWVtc2xvdCwgZ2V0X2Nhbm9uaWNhbF9nZm4oczJmZCwgczJ2aSksXG4tXHRcdFx0XHQgICAgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSA/IEZPTExfV1JJVEUgOiAwLFxuK1x0XHRcdFx0ICAgICAga3ZtX3MyX2ZhdWx0X2lzX3dyaXRlKHMyZmQpID8gRk9MTF9XUklURSA6IDAsXG4gXHRcdFx0XHQgICAgICBcdTAwMjZzMnZpLVx1MDAzZW1hcF93cml0YWJsZSwgXHUwMDI2czJ2aS1cdTAwM2VwYWdlKTtcbiBcdGlmICh1bmxpa2VseShpc19lcnJvcl9ub3Nsb3RfcGZuKHMydmktXHUwMDNlcGZuKSkpIHtcbi1cdFx0aWYgKHMydmktXHUwMDNlcGZuID09IEtWTV9QRk5fRVJSX0hXUE9JU09OKSB7XG4tXHRcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLVx1MDAzZXZtYV9wYWdlc2l6ZSkpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4rXHRcdGlmIChzMnZpLVx1MDAzZXBmbiA9PSBLVk1fUEZOX0VSUl9IV1BPSVNPTilcbitcdFx0XHRyZXR1cm4gLUVIV1BPSVNPTjtcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHR9XG4gXG5AQCAtMTk2OCw3ICsyMDAwLDcgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfY29tcHV0ZV9wcm90KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiB7XG4gXHRzdHJ1Y3Qga3ZtICprdm0gPSBzMmZkLVx1MDAzZXZjcHUtXHUwMDNla3ZtO1xuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVx1MDAzZXZjcHUpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuK1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpIFx1MDAyNlx1MDAyNiBzMnZpLVx1MDAzZW1hcF9ub25fY2FjaGVhYmxlKVxuIFx0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHQvKlxuQEAgLTE5NzcsNyArMjAwOSw3IEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHQgKiBhbmQgdHJpZ2dlciB0aGUgZXhjZXB0aW9uIGhlcmUuIFNpbmNlIHRoZSBtZW1zbG90IGlzIHZhbGlkLCBpbmplY3RcbiBcdCAqIHRoZSBmYXVsdCBiYWNrIHRvIHRoZSBndWVzdC5cbiBcdCAqL1xuLVx0aWYgKGVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoa3ZtX3ZjcHVfZ2V0X2VzcihzMmZkLVx1MDAzZXZjcHUpKSkge1xuK1x0aWYgKGVzcl9mc2NfaXNfZXhjbF9hdG9taWNfZmF1bHQoczJmZC1cdTAwM2Vlc3IpKSB7XG4gXHRcdGt2bV9pbmplY3RfZGFidF9leGNsX2F0b21pYyhzMmZkLVx1MDAzZXZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHMyZmQtXHUwMDNldmNwdSkpO1xuIFx0XHRyZXR1cm4gMTtcbiBcdH1cbkBAIC0xOTg2LDEzICsyMDE4LDEzIEBAIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X2NvbXB1dGVfcHJvdChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfd3JpdGFibGUgXHUwMDI2XHUwMDI2IChzMnZpLVx1MDAzZWRldmljZSB8fFxuIFx0XHRcdFx0ICAgIW1lbXNsb3RfaXNfbG9nZ2luZyhzMmZkLVx1MDAzZW1lbXNsb3QpIHx8XG4tXHRcdFx0XHQgICBrdm1faXNfd3JpdGVfZmF1bHQoczJmZC1cdTAwM2V2Y3B1KSkpXG4rXHRcdFx0XHQgICBrdm1fczJfZmF1bHRfaXNfd3JpdGUoczJmZCkpKVxuIFx0XHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1c7XG4gXG4gXHRpZiAoczJmZC1cdTAwM2VuZXN0ZWQpXG4gXHRcdCpwcm90ID0gYWRqdXN0X25lc3RlZF9mYXVsdF9wZXJtcyhzMmZkLVx1MDAzZW5lc3RlZCwgKnByb3QpO1xuIFxuLVx0aWYgKGt2bV92Y3B1X3RyYXBfaXNfZXhlY19mYXVsdChzMmZkLVx1MDAzZXZjcHUpKVxuK1x0aWYgKGt2bV9zMl9mYXVsdF9pc19leGVjKHMyZmQpKVxuIFx0XHQqcHJvdCB8PSBLVk1fUEdUQUJMRV9QUk9UX1g7XG4gXG4gXHRpZiAoczJ2aS1cdTAwM2VtYXBfbm9uX2NhY2hlYWJsZSlcbkBAIC0yMDE2LDcgKzIwNDgsOCBAQCBzdGF0aWMgaW50IGt2bV9zMl9mYXVsdF9jb21wdXRlX3Byb3QoY29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjICpzMmZkLFxuIHN0YXRpYyBpbnQga3ZtX3MyX2ZhdWx0X21hcChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4gXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfdm1hX2luZm8gKnMydmksXG4gXHRcdFx0ICAgIGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90LFxuLVx0XHRcdCAgICB2b2lkICptZW1jYWNoZSlcbitcdFx0XHQgICAgdm9pZCAqbWVtY2FjaGUsXG4rXHRcdFx0ICAgIHN0cnVjdCBrdm1fczJfZmF1bHRfcmVzdWx0ICpyZXN1bHQpXG4ge1xuIFx0ZW51bSBrdm1fcGd0YWJsZV93YWxrX2ZsYWdzIGZsYWdzID0gS1ZNX1BHVEFCTEVfV0FMS19TSEFSRUQ7XG4gXHRib29sIHdyaXRhYmxlID0gcHJvdCBcdTAwMjYgS1ZNX1BHVEFCTEVfUFJPVF9XO1xuQEAgLTIwMjksMTMgKzIwNjIsMTIgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdGludCByZXQ7XG4gXG4gXHRrdm1fZmF1bHRfbG9jayhrdm0pO1xuLVx0cGd0ID0gczJmZC1cdTAwM2V2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXBndDtcbitcdHBndCA9IHMyZmQtXHUwMDNlbW11LVx1MDAzZXBndDtcbiBcdHJldCA9IC1FQUdBSU47XG4gXHRpZiAobW11X2ludmFsaWRhdGVfcmV0cnkoa3ZtLCBzMnZpLVx1MDAzZW1tdV9zZXEpKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4tXHRwZXJtX2ZhdWx0X2dyYW51bGUgPSAoa3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCkgP1xuLVx0XHRcdCAgICAgIGt2bV92Y3B1X3RyYXBfZ2V0X3Blcm1fZmF1bHRfZ3JhbnVsZShzMmZkLVx1MDAzZXZjcHUpIDogMCk7XG4rXHRwZXJtX2ZhdWx0X2dyYW51bGUgPSBrdm1fczJfcGVybV9mYXVsdF9ncmFudWxlKHMyZmQpO1xuIFx0bWFwcGluZ19zaXplID0gczJ2aS1cdTAwM2V2bWFfcGFnZXNpemU7XG4gXHRwZm4gPSBzMnZpLVx1MDAzZXBmbjtcbiBcdGdmbiA9IHMydmktXHUwMDNlZ2ZuO1xuQEAgLTIwOTYsMTQgKzIxMjgsMTkgQEAgc3RhdGljIGludCBrdm1fczJfZmF1bHRfbWFwKGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZCxcbiBcdFx0bWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBzMmZkLVx1MDAzZW1lbXNsb3QsIGdwYV90b19nZm4oaXBhKSk7XG4gXHR9XG4gXG4tXHRpZiAocmV0ICE9IC1FQUdBSU4pXG4tXHRcdHJldHVybiByZXQ7XG4tXHRyZXR1cm4gMDtcbitcdGlmIChyZXQgPT0gLUVBR0FJTilcbitcdFx0cmV0dXJuIHJlc3VsdCA/IHJldCA6IDA7XG4rXG4rXHRpZiAocmVzdWx0IFx1MDAyNlx1MDAyNiAhcmV0KVxuK1x0XHRyZXN1bHQtXHUwMDNlbWFwcGluZ19zaXplID0gbWFwcGluZ19zaXplO1xuK1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4rc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQsXG4rXHRcdFx0ICBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3Jlc3VsdCAqcmVzdWx0KVxuIHtcbi1cdGJvb2wgcGVybV9mYXVsdCA9IGt2bV92Y3B1X3RyYXBfaXNfcGVybWlzc2lvbl9mYXVsdChzMmZkLVx1MDAzZXZjcHUpO1xuK1x0Ym9vbCBwZXJtX2ZhdWx0ID0ga3ZtX3MyX2ZhdWx0X2lzX3Blcm0oczJmZCk7XG4gXHRzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X3ZtYV9pbmZvIHMydmkgPSB7fTtcbiBcdGVudW0ga3ZtX3BndGFibGVfcHJvdCBwcm90O1xuIFx0dm9pZCAqbWVtY2FjaGU7XG5AQCAtMjEyMSw3ICsyMTU4LDcgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHRtZW1jYWNoZSA9IGdldF9tbXVfbWVtY2FjaGUoczJmZC1cdTAwM2V2Y3B1KTtcbiBcdGlmICghcGVybV9mYXVsdCB8fCBtZW1zbG90X2lzX2xvZ2dpbmcoczJmZC1cdTAwM2VtZW1zbG90KSB8fFxuIFx0ICAgIGlzX3Byb3RlY3RlZF9rdm1fZW5hYmxlZCgpKSB7XG4tXHRcdHJldCA9IHRvcHVwX21tdV9tZW1jYWNoZShzMmZkLVx1MDAzZXZjcHUsIG1lbWNhY2hlKTtcbitcdFx0cmV0ID0gdG9wdXBfbW11X21lbWNhY2hlKHMyZmQtXHUwMDNlbW11LCBtZW1jYWNoZSk7XG4gXHRcdGlmIChyZXQpXG4gXHRcdFx0cmV0dXJuIHJldDtcbiBcdH1cbkBAIC0yMTMxLDYgKzIxNjgsMTMgQEAgc3RhdGljIGludCB1c2VyX21lbV9hYm9ydChjb25zdCBzdHJ1Y3Qga3ZtX3MyX2ZhdWx0X2Rlc2MgKnMyZmQpXG4gXHQgKiBnZXQgYmxvY2sgbWFwcGluZyBmb3IgZGV2aWNlIE1NSU8gcmVnaW9uLlxuIFx0ICovXG4gXHRyZXQgPSBrdm1fczJfZmF1bHRfcGluX3BmbihzMmZkLCBcdTAwMjZzMnZpKTtcbitcdGlmIChyZXQgPT0gLUVIV1BPSVNPTikge1xuK1x0XHQvKiBJZiByZXN1bHQgaXMgc3BlY2lmaWVkLCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgdGhpcy4gKi9cbitcdFx0aWYgKHJlc3VsdClcbitcdFx0XHRyZXR1cm4gLUVIV1BPSVNPTjtcbitcdFx0a3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHMyZmQtXHUwMDNlaHZhLCBfX2ZmcyhzMnZpLnZtYV9wYWdlc2l6ZSkpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbiBcdGlmIChyZXQgIT0gMSlcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0yMTQwLDcgKzIxODQsNyBAQCBzdGF0aWMgaW50IHVzZXJfbWVtX2Fib3J0KGNvbnN0IHN0cnVjdCBrdm1fczJfZmF1bHRfZGVzYyAqczJmZClcbiBcdFx0cmV0dXJuIHJldDtcbiBcdH1cbiBcbi1cdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlKTtcbitcdHJldHVybiBrdm1fczJfZmF1bHRfbWFwKHMyZmQsIFx1MDAyNnMydmksIHByb3QsIG1lbWNhY2hlLCByZXN1bHQpO1xuIH1cbiBcbiAvKiBSZXNvbHZlIHRoZSBhY2Nlc3MgZmF1bHQgYnkgbWFraW5nIHRoZSBwYWdlIHlvdW5nIGFnYWluLiAqL1xuQEAgLTIyNTAsNyArMjI5NCw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X3NlYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fczJfdHJhbnMgbmVzdGVkX3RyYW5zLCAqbmVzdGVkID0gTlVMTDtcbi1cdHVuc2lnbmVkIGxvbmcgZXNyO1xuK1x0dW5zaWduZWQgbG9uZyBlc3IgPSBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpO1xuK1x0c3RydWN0IGt2bV9zMl9tbXUgKm1tdSA9IHZjcHUtXHUwMDNlYXJjaC5od19tbXU7XG4gXHRwaHlzX2FkZHJfdCBmYXVsdF9pcGE7IC8qIFRoZSBhZGRyZXNzIHdlIGZhdWx0ZWQgb24gKi9cbiBcdHBoeXNfYWRkcl90IGlwYTsgLyogQWx3YXlzIHRoZSBJUEEgaW4gdGhlIEwxIGd1ZXN0IHBoeXMgc3BhY2UgKi9cbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7XG5AQCAtMjI1OSwxMSArMjMwNCw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdGdmbl90IGdmbjtcbiBcdGludCByZXQsIGlkeDtcbiBcbi1cdGlmIChrdm1fdmNwdV9hYnRfaXNzZWEodmNwdSkpXG4rXHRpZiAoZXNyX2FidF9pc19zZWEoZXNyKSlcbiBcdFx0cmV0dXJuIGt2bV9oYW5kbGVfZ3Vlc3Rfc2VhKHZjcHUpO1xuIFxuLVx0ZXNyID0ga3ZtX3ZjcHVfZ2V0X2Vzcih2Y3B1KTtcbi1cbiBcdC8qXG4gXHQgKiBUaGUgZmF1bHQgSVBBIHNob3VsZCBiZSByZWxpYWJsZSBhdCB0aGlzIHBvaW50IGFzIHdlJ3JlIG5vdCBkZWFsaW5nXG4gXHQgKiB3aXRoIGFuIFNFQS5cbkBAIC0yMjcyLDcgKzIzMTUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRpZiAoS1ZNX0JVR19PTihpcGEgPT0gSU5WQUxJRF9HUEEsIHZjcHUtXHUwMDNla3ZtKSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4tXHRpc19pYWJ0ID0ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpO1xuK1x0aXNfaWFidCA9IGVzcl90cmFwX2lzX2lhYnQoZXNyKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX3RyYW5zbGF0aW9uX2ZhdWx0KGVzcikpIHtcbiBcdFx0LyogQmV5b25kIHNhbml0aXNlZCBQQVJhbmdlICh3aGljaCBpcyB0aGUgSVBBIGxpbWl0KSAqL1xuQEAgLTIyODIsMTQgKzIzMjUsMTQgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHR9XG4gXG4gXHRcdC8qIEZhbGxzIGJldHdlZW4gdGhlIElQQSByYW5nZSBhbmQgdGhlIFBBUmFuZ2U/ICovXG4tXHRcdGlmIChmYXVsdF9pcGEgXHUwMDNlPSBCSVRfVUxMKFZUQ1JfRUwyX0lQQSh2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZXZ0Y3IpKSkge1xuK1x0XHRpZiAoZmF1bHRfaXBhIFx1MDAzZT0gQklUX1VMTChWVENSX0VMMl9JUEEobW11LVx1MDAzZXZ0Y3IpKSkge1xuIFx0XHRcdGZhdWx0X2lwYSB8PSBGQVJfVE9fRklQQV9PRkZTRVQoa3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xuIFxuIFx0XHRcdHJldHVybiBrdm1faW5qZWN0X3NlYSh2Y3B1LCBpc19pYWJ0LCBmYXVsdF9pcGEpO1xuIFx0XHR9XG4gXHR9XG4gXG4tXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGt2bV92Y3B1X2dldF9lc3IodmNwdSksXG4rXHR0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGVzcixcbiBcdFx0XHQgICAgICBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwgZmF1bHRfaXBhKTtcbiBcbiBcdC8qIENoZWNrIHRoZSBzdGFnZS0yIGZhdWx0IGlzIHRyYW5zLiBmYXVsdCBvciB3cml0ZSBmYXVsdCAqL1xuQEAgLTIyOTgsOSArMjM0MSw5IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAgICAhZXNyX2ZzY19pc19hY2Nlc3NfZmxhZ19mYXVsdChlc3IpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICFlc3JfZnNjX2lzX2V4Y2xfYXRvbWljX2ZhdWx0KGVzcikpIHtcbiBcdFx0a3ZtX2VycihcIlVuc3VwcG9ydGVkIEZTQzogRUM9JSN4IHhGU0M9JSNseCBFU1JfRUwyPSUjbHhcXG5cIixcbi1cdFx0XHRrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV90cmFwX2dldF9mYXVsdCh2Y3B1KSxcbi1cdFx0XHQodW5zaWduZWQgbG9uZylrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTtcbitcdFx0XHRlc3JfZ2V0X2VjKGVzciksXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpKGVzciBcdTAwMjYgRVNSX0VMeF9GU0MpLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKWVzcik7XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFx0fVxuIFxuQEAgLTIzMTksOCArMjM2Miw4IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAqIG5vdGhpbmcgdG8gd2FsayBhbmQgd2UgdHJlYXQgaXQgYXMgYSAxOjEgYmVmb3JlIGdvaW5nIHRocm91Z2ggdGhlXG4gXHQgKiBjYW5vbmljYWwgdHJhbnNsYXRpb24uXG4gXHQgKi9cbi1cdGlmIChrdm1faXNfbmVzdGVkX3MyX21tdSh2Y3B1LVx1MDAzZWt2bSx2Y3B1LVx1MDAzZWFyY2guaHdfbW11KSBcdTAwMjZcdTAwMjZcbi1cdCAgICB2Y3B1LVx1MDAzZWFyY2guaHdfbW11LVx1MDAzZW5lc3RlZF9zdGFnZTJfZW5hYmxlZCkge1xuK1x0aWYgKGt2bV9pc19uZXN0ZWRfczJfbW11KHZjcHUtXHUwMDNla3ZtLCBtbXUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1tdS1cdTAwM2VuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQpIHtcbiBcdFx0dTMyIGVzcjtcbiBcbiBcdFx0cmV0ID0ga3ZtX3dhbGtfbmVzdGVkX3MyKHZjcHUsIGZhdWx0X2lwYSwgXHUwMDI2bmVzdGVkX3RyYW5zKTtcbkBAIC0yMzQ5LDcgKzIzOTIsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRnZm4gPSBpcGEgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRtZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3QodmNwdS1cdTAwM2Vrdm0sIGdmbik7XG4gXHRodmEgPSBnZm5fdG9faHZhX21lbXNsb3RfcHJvdChtZW1zbG90LCBnZm4sIFx1MDAyNndyaXRhYmxlKTtcbi1cdHdyaXRlX2ZhdWx0ID0ga3ZtX2lzX3dyaXRlX2ZhdWx0KHZjcHUpO1xuK1x0d3JpdGVfZmF1bHQgPSBlc3JfYWJ0X2lzX3dyaXRlX2ZhdWx0KGVzcik7XG4gXHRpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpIHx8ICh3cml0ZV9mYXVsdCBcdTAwMjZcdTAwMjYgIXdyaXRhYmxlKSkge1xuIFx0XHQvKlxuIFx0XHQgKiBUaGUgZ3Vlc3QgaGFzIHB1dCBlaXRoZXIgaXRzIGluc3RydWN0aW9ucyBvciBpdHMgcGFnZS10YWJsZXNcbkBAIC0yMzYyLDcgKzI0MDUsNyBAQCBpbnQga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGt2bV92Y3B1X2FidF9pc3MxdHcodmNwdSkpIHtcbitcdFx0aWYgKGVzcl9hYnRfaXNfczFwdHcoZXNyKSkge1xuIFx0XHRcdHJldCA9IGt2bV9pbmplY3Rfc2VhX2RhYnQodmNwdSwga3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpO1xuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdFx0fVxuQEAgLTIzNzcsNyArMjQyMCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0ICogU28gbGV0J3MgYXNzdW1lIHRoYXQgdGhlIGd1ZXN0IGlzIGp1c3QgYmVpbmdcbiBcdFx0ICogY2F1dGlvdXMsIGFuZCBza2lwIHRoZSBpbnN0cnVjdGlvbi5cbiBcdFx0ICovXG4tXHRcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkgXHUwMDI2XHUwMDI2IGt2bV92Y3B1X2RhYnRfaXNfY20odmNwdSkpIHtcbitcdFx0aWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSBcdTAwMjZcdTAwMjYgZXNyX2RhYnRfaXNfY20oZXNyKSkge1xuIFx0XHRcdGt2bV9pbmNyX3BjKHZjcHUpO1xuIFx0XHRcdHJldCA9IDE7XG4gXHRcdFx0Z290byBvdXRfdW5sb2NrO1xuQEAgLTIzOTUsNyArMjQzOCw3IEBAIGludCBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdH1cbiBcbiBcdC8qIFVzZXJzcGFjZSBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVnaXN0ZXIgb3V0LW9mLWJvdW5kcyBJUEFzICovXG4tXHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZSh2Y3B1LVx1MDAzZWFyY2guaHdfbW11KSk7XG4rXHRWTV9CVUdfT04oaXBhIFx1MDAzZT0ga3ZtX3BoeXNfc2l6ZShtbXUpKTtcbiBcbiBcdGlmIChlc3JfZnNjX2lzX2FjY2Vzc19mbGFnX2ZhdWx0KGVzcikpIHtcbiBcdFx0aGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpO1xuQEAgLTI0MDksMTkgKzI0NTIsMjAgQEAgaW50IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHQubmVzdGVkXHRcdD0gbmVzdGVkLFxuIFx0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuIFx0XHQuaHZhXHRcdD0gaHZhLFxuK1x0XHQuZXNyXHRcdD0gZXNyLFxuK1x0XHQubW11XHRcdD0gbW11LFxuIFx0fTtcbiBcbiBcdGlmIChrdm1fdm1faXNfcHJvdGVjdGVkKHZjcHUtXHUwMDNla3ZtKSkge1xuIFx0XHRyZXQgPSBwa3ZtX21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbiBcdH0gZWxzZSB7XG4tXHRcdFZNX1dBUk5fT05fT05DRShrdm1fdmNwdV90cmFwX2lzX3Blcm1pc3Npb25fZmF1bHQodmNwdSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQha3ZtX3ZjcHVfdHJhcF9pc19leGVjX2ZhdWx0KHZjcHUpKTtcbitcdFx0Vk1fV0FSTl9PTl9PTkNFKGt2bV9zMl9mYXVsdF9pc19wZXJtKFx1MDAyNnMyZmQpIFx1MDAyNlx1MDAyNiAhd3JpdGVfZmF1bHQgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQha3ZtX3MyX2ZhdWx0X2lzX2V4ZWMoXHUwMDI2czJmZCkpO1xuIFxuIFx0XHRpZiAoa3ZtX3Nsb3RfaGFzX2dtZW0obWVtc2xvdCkpXG4tXHRcdFx0cmV0ID0gZ21lbV9hYm9ydChcdTAwMjZzMmZkKTtcbitcdFx0XHRyZXQgPSBnbWVtX2Fib3J0KFx1MDAyNnMyZmQsIE5VTEwpO1xuIFx0XHRlbHNlXG4tXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCk7XG4rXHRcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCwgTlVMTCk7XG4gXHR9XG4gXG4gXHRpZiAocmV0ID09IDApXG5AQCAtMjc5MiwzICsyODM2LDE0MyBAQCB2b2lkIGt2bV90b2dnbGVfY2FjaGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIHdhc19lbmFibGVkKVxuIFxuIFx0dHJhY2Vfa3ZtX3RvZ2dsZV9jYWNoZSgqdmNwdV9wYyh2Y3B1KSwgd2FzX2VuYWJsZWQsIG5vd19lbmFibGVkKTtcbiB9XG4rXG4rLypcbisgKiBUcnkgdG8gd2FsayB0byB0aGUgc3BlY2lmaWVkIEdQQSBpbiBjYW5vbmljYWwgbW11IC0gaWYgdW5tYXBwZWQgcmV0dXJucyAwLCBpZlxuKyAqIG1hcHBlZCByZXR1cm5zIHRoZSBncmFudWxlIHNpemUsIG90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBsb25nIGt2bV93YWxrX3MyKHN0cnVjdCBrdm1fcGd0YWJsZSAqcGd0LFxuK1x0XHRcdGdwYV90IGdwYSwgczggKmxldmVsKVxuK3tcbitcdHN0cnVjdCBrdm0gKmt2bSA9IGt2bV9zMl9tbXVfdG9fa3ZtKHBndC1cdTAwM2VtbXUpO1xuK1x0a3ZtX3B0ZV90IHB0ZTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0Z3VhcmQocmVhZF9sb2NrKShcdTAwMjZrdm0tXHUwMDNlbW11X2xvY2spO1xuK1xuK1x0cmV0ID0ga3ZtX3BndGFibGVfZ2V0X2xlYWYocGd0LCBncGEsIFx1MDAyNnB0ZSwgbGV2ZWwsXG4rXHRcdFx0XHQgICBLVk1fUEdUQUJMRV9XQUxLX1NIQVJFRCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0LyogVW5wb3B1bGF0ZWQsIG11c3QgZmF1bHQuICovXG4rXHRpZiAoIWt2bV9wdGVfdmFsaWQocHRlKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4ga3ZtX2dyYW51bGVfc2l6ZSgqbGV2ZWwpO1xuK31cbitcbisvKiBTeW50aGVzaXNlZCBkYXRhIGFib3J0IGF0IHNwZWNpZmllZCBwYWdlIHRhYmxlIGxldmVsLiAqL1xuKyNkZWZpbmUgUFJFX0ZBVUxUX0VTUihsZXZlbClcdFx0XHRcdFxcXG4rXHQgKChFU1JfRUx4X0VDX0RBQlRfTE9XIFx1MDAzY1x1MDAzYyBFU1JfRUx4X0VDX1NISUZUKSB8XHRcXFxuK1x0ICBFU1JfRUx4X0lMIHwgRVNSX0VMeF9GU0NfRkFVTFRfTChsZXZlbCkpXG4rXG4rLyogUmV0cmlldmUgZWl0aGVyIGEgcmVhZC1vbmx5IG9yIGEgcmVhZC93cml0ZSBodmEuICovXG4rc3RhdGljIGh2YV90IGdmbl90b19odmFfbWVtc2xvdF9yZWFkKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIGdmbl90IGdmbilcbit7XG4rXHRyZXR1cm4gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3Qoc2xvdCwgZ2ZuLCAvKndyaXRhYmxlPSovTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBsb25nIF9fcHJlX2ZhdWx0X3MyKHN0cnVjdCBrdm1fczJfbW11ICptbXUsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcbitcdFx0XHQgICBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsIHM4IGxldmVsKVxuK3tcbitcdGNvbnN0IGJvb2wgaXNfZ21lbSA9IGt2bV9zbG90X2hhc19nbWVtKG1lbXNsb3QpO1xuK1x0Y29uc3QgZ2ZuX3QgZ2ZuID0gZ3BhX3RvX2dmbihncGEpO1xuK1x0Y29uc3QgaHZhX3QgaHZhID0gaXNfZ21lbSA/IDAgOiBnZm5fdG9faHZhX21lbXNsb3RfcmVhZChtZW1zbG90LCBnZm4pO1xuK1x0Y29uc3Qgc3RydWN0IGt2bV9zMl9mYXVsdF9kZXNjIHMyZmQgPSB7XG4rXHRcdC52Y3B1XHRcdD0gdmNwdSxcbitcdFx0LmZhdWx0X2lwYVx0PSBncGEsXG4rXHRcdC5uZXN0ZWRcdFx0PSBOVUxMLFxuK1x0XHQubWVtc2xvdFx0PSBtZW1zbG90LFxuK1x0XHQuaHZhXHRcdD0gaHZhLFxuK1x0XHQuZXNyXHRcdD0gUFJFX0ZBVUxUX0VTUihsZXZlbCksXG4rXHRcdC5tbXVcdFx0PSBtbXUsXG4rXHR9O1xuK1x0c3RydWN0IGt2bV9zMl9mYXVsdF9yZXN1bHQgcmVzdWx0ID0ge307XG4rXHRsb25nIHJldDtcbitcbitcdGlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0aWYgKGlzX2dtZW0pXG4rXHRcdHJldCA9IGdtZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbitcdGVsc2VcbitcdFx0cmV0ID0gdXNlcl9tZW1fYWJvcnQoXHUwMDI2czJmZCwgXHUwMDI2cmVzdWx0KTtcbitcdGlmIChJU19FUlJfVkFMVUUocmV0KSlcbitcdFx0cmV0dXJuIHJldDtcbitcdHJldHVybiByZXN1bHQubWFwcGluZ19zaXplO1xuK31cbitcbitzdGF0aWMgbG9uZyBwcmVfZmF1bHRfczIoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuK1x0XHRcdCBncGFfdCBncGEsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpXG4re1xuK1x0czggbGV2ZWw7XG4rXHRsb25nIHJldDtcbitcbitcdC8qIFRyeSBhIHdhbGsgZmlyc3QuICovXG4rXHRyZXQgPSBrdm1fd2Fsa19zMihtbXUtXHUwMDNlcGd0LCBncGEsIFx1MDAyNmxldmVsKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXHQvKiBPSywgaGF2ZSB0byBmYXVsdCBwYWdlIGluLiAqL1xuK1x0cmV0dXJuIF9fcHJlX2ZhdWx0X3MyKG1tdSwgdmNwdSwgZ3BhLCBtZW1zbG90LCBsZXZlbCk7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nXG4rcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemUsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVtYWluaW5nKVxuK3tcbitcdC8qIEdyYW51bGVzIGFyZSBhbHdheXMgYSBwb3dlci1vZi0yLiAqL1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBncmFudWxlX2J5dGVzX3JlbWFpbmluZyA9XG4rXHRcdGdyYW51bGVfc2l6ZSAtIChncGEgJSBncmFudWxlX3NpemUpO1xuK1xuK1x0cmV0dXJuIG1pbihncmFudWxlX2J5dGVzX3JlbWFpbmluZywgYnl0ZXNfcmVtYWluaW5nKTtcbit9XG4rXG4rLyogSWYgeW91IGxvc2UgdGhlIHJhY2UgdGhpcyBtYW55IHRpbWVzLCB0aW1lIHRvIGdpdmUgdXAuICovXG4rI2RlZmluZSBNQVhfUFJFX0ZBVUxUX1JFVFJJRVMgM1xuK1xuKy8qKlxuKyAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSAtIHByZS1mYXVsdCBzdGFnZS0yIHBhZ2UgdGFibGVzIGZvciB0aGVcbisgKiBzcGVjaWZpZWQgR1BBLlxuKyAqIEB2Y3B1Olx0VGhlIFZDUFUgcG9pbnRlclxuKyAqIEByYW5nZTpcdHtncGEsIHNpemUsIGZsYWdzfSB0dXBsZVxuKyAqXG4rICogVGhlIG1hcHBpbmcgcGVyZm9ybWVkIGlzIGFsd2F5cyBiZXN0LWVmZm9ydCAtIGZhdWx0aW5nIGluIGlzIG5lY2Vzc2FyaWx5XG4rICogcmFjZXkuIFRoZSByYW5nZXMgZmF1bHRlZCBpbiBhcmUgY2Fub25pY2FsLCBuZXN0ZWQgcGFnZSB0YWJsZXMgYXJlIGlnbm9yZWQuXG4rICpcbisgKiBAcmFuZ2UtXHUwMDNlZ3BhIHNwZWNpZmllcyB0aGUgR1BBIHRvIHByZS1mYXVsdCwgQHJhbmdlLVx1MDAzZXNpemUgc3BlY2lmaWVzIGhvdyBtYW55XG4rICogYnl0ZXMgcmVtYWluIHRvIGJlIHByZS1mYXVsdGVkIGFuZCBAcmFuZ2UtXHUwMDNlZmxhZ3MgaXMgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMC5cbisgKlxuKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByZS1mYXVsdCBjb25zdW1lZCwgb3IgYW4gZXJyb3IuXG4rICovXG4rbG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXG4re1xuK1x0c3RydWN0IGt2bSAqa3ZtID0gdmNwdS1cdTAwM2Vrdm07XG4rXHRjb25zdCB1NjQgYnl0ZXNfcmVtYWluaW5nID0gcmFuZ2UtXHUwMDNlc2l6ZTtcbitcdHN0cnVjdCBrdm1fczJfbW11ICptbXUgPSBcdTAwMjZrdm0tXHUwMDNlYXJjaC5tbXU7IC8qIENhbm9uaWNhbC4gKi9cbitcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7XG4rXHRjb25zdCBncGFfdCBncGEgPSByYW5nZS1cdTAwM2VncGE7XG4rXHRpbnQgbnVtX3JldHJpZXMgPSAwO1xuK1x0bG9uZyByZXQ7XG4rXG4rXHQvKlxuK1x0ICogcEtWTSBpcyB1bnN1cHBvcnRlZCBhcyB0aGVpciB2Q1BVcyBhcmUgaW5zdGFudGlhdGVkIG9uIGZpcnN0IHJ1biBhbmRcbitcdCAqIHByZS1mYXVsdGluZyBvbmx5IHJ1bm5pbmcgdkNQVXMgd291bGQgYmUgaW5jb25zaXN0ZW50IGFuZCBjb25mdXNpbmcuXG4rXHQgKi9cbitcdGlmIChpc19wcm90ZWN0ZWRfa3ZtX2VuYWJsZWQoKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0bWVtc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ3BhX3RvX2dmbihncGEpKTtcbitcdGlmICghbWVtc2xvdClcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHQvKiBTUkNVIG11c3QgYmUgcmVsZWFzZWQgZm9yIHByb2dyZXNzIGFuZCBvbmx5IHVzZXJsYW5kIGNhbiBkbyB0aGF0LiAqL1xuK1x0aWYgKG1lbXNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0lOVkFMSUQpXG4rXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0ZG8ge1xuK1x0XHRyZXQgPSBwcmVfZmF1bHRfczIobW11LCB2Y3B1LCBncGEsIG1lbXNsb3QpO1xuK1x0fSB3aGlsZSAocmV0ID09IC1FQUdBSU4gXHUwMDI2XHUwMDI2IG51bV9yZXRyaWVzKysgXHUwMDNjIE1BWF9QUkVfRkFVTFRfUkVUUklFUyk7XG4rXG4rXHRpZiAoSVNfRVJSX1ZBTFVFKHJldCkpXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gcHJlX2ZhdWx0X2J5dGVzX2NvbnN1bWVkKGdwYSwgcmV0LCBieXRlc19yZW1haW5pbmcpO1xuK31cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5pbmRleCAxNzEyM2YwYjZkYWJhLi4zNDg4ZDVhZDIyNWI2IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rdm0vbmVzdGVkLmNcbisrKyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5jXG5AQCAtNjU0LDcgKzY1NCw3IEBAIHN0YXRpYyB1OCBnZXRfZ3Vlc3RfbWFwcGluZ190dGwoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgdTY0IGFkZHIpXG4gXHRcdHJldHVybiAwO1xuIFxuIFx0dG1wIFx1MDAyNj0gfihzeiAtIDEpO1xuLVx0aWYgKGt2bV9wZ3RhYmxlX2dldF9sZWFmKG1tdS1cdTAwM2VwZ3QsIHRtcCwgXHUwMDI2cHRlLCBOVUxMKSlcbitcdGlmIChrdm1fcGd0YWJsZV9nZXRfbGVhZihtbXUtXHUwMDNlcGd0LCB0bXAsIFx1MDAyNnB0ZSwgTlVMTCwgMCkpXG4gXHRcdGdvdG8gYWdhaW47XG4gXHRpZiAoIShwdGUgXHUwMDI2IFBURV9WQUxJRCkpXG4gXHRcdGdvdG8gYWdhaW47XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbmluZGV4IDVmOGQxN2VlNWY2NzcuLjFlMGVkZDBmOTlmNzUgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG5AQCAtMTczLDYgKzE3Myw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2RlYnVnLWV4Y2VwdGlvbnNcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9oZWxsb19lbDJcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9ob3N0X3N2ZVxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGFybTY0L2h5cGVyY2FsbHNcbitURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9leHRlcm5hbF9hYm9ydHNcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBhcm02NC9tbWlvX3NpZ25fZXh0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gYXJtNjQvcGFnZV9mYXVsdF90ZXN0XG5AQCAtMTk5LDYgKzIwMCw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGd1ZXN0X21lbWZkX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSByc2VxX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBzdGVhbF90aW1lXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gcHJlX2ZhdWx0X21lbW9yeV90ZXN0XG4gXG4gVEVTVF9HRU5fUFJPR1NfczM5MCA9ICQoVEVTVF9HRU5fUFJPR1NfQ09NTU9OKVxuIFRFU1RfR0VOX1BST0dTX3MzOTAgKz0gczM5MC9tZW1vcFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjA5YzFkYjMwMzg1NjZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9hcm02NC9udl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTAsMCArMSwxNTggQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLypcbisgKiBudl9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QgLSBUZXN0IEtWTV9QUkVfRkFVTFRfTUVNT1JZIG9uIGEgdkNQVSB3aG9zZVxuKyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkLlxuKyAqXG4rICogVGhlIGd1ZXN0IGVudGVycyB2RUwyLCBzZXRzIHVwIGl0cyBFTDIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbiBpbnRvIHRoZVxuKyAqIHJlYWwgRUwxIHJlZ2lzdGVycyB0aGVuIEVSRVRzIHRvIHZFTDEgYW5kIGV4aXRzIHRvIHVzZXJzcGFjZSBzbyBpdHMgdkNQVVxuKyAqIGxhc3QtcnVuIGNvbnRleHQgaXMgbmVzdGVkIGJhY2tlZCBieSBhIHNoYWRvdyBzdGFnZSAyIE1NVS5cbisgKlxuKyAqIEFzc2VydCB0aGF0IHByZS1mYXVsdGluZyBpZ25vcmVzIHRoYXQgYW5kIHRhcmdldHMgdGhlIGNhbm9uaWNhbCBzdGFnZS0yXG4rICogcGFnZSB0YWJsZXMgb25seS5cbisgKi9cbisjaW5jbHVkZSBcImt2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwicHJvY2Vzc29yLmhcIlxuKyNpbmNsdWRlIFwidGVzdF91dGlsLmhcIlxuKyNpbmNsdWRlIFwidWNhbGwuaFwiXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3N5c3JlZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuK1xuKyNkZWZpbmUgVEVTVF9NRU1fU0xPVFx0XHQxMFxuKyNkZWZpbmUgVEVTVF9NRU1fU0laRVx0XHRTWl8yTVxuKyNkZWZpbmUgVEVTVF9NRU1fR1BBXHRcdFNaXzFHXG4rXG4rc3RhdGljIHZvaWQgZ3Vlc3RfZWwxX2NvZGUodm9pZClcbit7XG4rXHR1NjQgb2Zmc2V0O1xuK1xuK1x0R1VFU1RfQVNTRVJUX0VRKGdldF9jdXJyZW50X2VsKCksIDEpO1xuK1xuK1x0LyogRXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCB0aGUgdkVMMSAobmVzdGVkKSBjb250ZXh0IGxpdmUuICovXG4rXHRHVUVTVF9TWU5DKDEpO1xuK1xuK1x0LypcbitcdCAqIFRvdWNoIHRoZSBwcmVmYXVsdGVkIHJhbmdlLiB2c3RhZ2UtMiBpcyBkaXNhYmxlZCwgc28gdGhlIHNoYWRvd1xuK1x0ICogc3RhZ2UtMiBpcyBhIDE6MSB2aWV3IG9mIHRoZSBjYW5vbmljYWwgSVBBIHNwYWNlLlxuK1x0ICovXG4rXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCBcdTAwM2MgVEVTVF9NRU1fU0laRTsgb2Zmc2V0ICs9IFNaXzRLKVxuK1x0XHRSRUFEX09OQ0UoKih1NjQgKikoVEVTVF9NRU1fR1BBICsgb2Zmc2V0KSk7XG4rXG4rXHRHVUVTVF9ET05FKCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGd1ZXN0X2NvZGUodm9pZClcbit7XG4rXHR1NjQgc3A7XG4rXG4rXHRHVUVTVF9BU1NFUlRfRVEoZ2V0X2N1cnJlbnRfZWwoKSwgMik7XG4rXG4rXHQvKlxuK1x0ICogTWlycm9yIHRoZSBFTDIgdHJhbnNsYXRpb24gcmVnaW1lIGludG8gdGhlIHJlYWwgRUwxIHJlZ2lzdGVycyBzb1xuK1x0ICogdGhhdCB2RUwxIHJ1bnMgb24gdGhlIHRlc3QncyBzdGFnZS0xIHBhZ2UgdGFibGVzLiBXaXRoIEUySD0xLCB0aGVcbitcdCAqIF9FTDEgYWNjZXNzb3JzIHJlYWQgdGhlIEVMMiByZWdpc3RlcnMsIGFuZCB0aGUgX0VMMTIgYWNjZXNzb3JzXG4rXHQgKiB3cml0ZSB0aGUgcmVhbCBFTDEgcmVnaXN0ZXJzLlxuK1x0ICovXG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhzY3Rscl9lbDEpLCBTWVNfU0NUTFJfRUwxMik7XG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyh0Y3JfZWwxKSwgU1lTX1RDUl9FTDEyKTtcbitcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKHR0YnIwX2VsMSksIFNZU19UVEJSMF9FTDEyKTtcbitcdHdyaXRlX3N5c3JlZ19zKHJlYWRfc3lzcmVnKG1haXJfZWwxKSwgU1lTX01BSVJfRUwxMik7XG4rXHR3cml0ZV9zeXNyZWdfcyhyZWFkX3N5c3JlZyhjcGFjcl9lbDEpLCBTWVNfQ1BBQ1JfRUwxMik7XG4rXG4rXHQvKiBSdW4gdkVMMSBvbiB0aGUgc2FtZSBzdGFjay4gKi9cbitcdGFzbSB2b2xhdGlsZShcIm1vdiAlMCwgc3BcIiA6IFwiPXJcIihzcCkpO1xuK1x0d3JpdGVfc3lzcmVnKHNwLCBzcF9lbDEpO1xuK1xuK1x0LypcbitcdCAqIERyb3AgVEdFIHNvIHRoYXQgdkVMMSBpcyBhIG5lc3RlZCBjb250ZXh0IHJhdGhlciB0aGFuIGhvc3QgRUwwLlxuK1x0ICogS1ZNIGJhY2tzIGl0IHdpdGggYSBzaGFkb3cgc3RhZ2UtMiBNTVUgZXZlbiB0aG91Z2ggdnN0YWdlLTIgaXNcbitcdCAqIGRpc2FibGVkIChIQ1JfRUwyLlZNPTApLlxuK1x0ICovXG4rXHR3cml0ZV9zeXNyZWcocmVhZF9zeXNyZWcoaGNyX2VsMikgXHUwMDI2IH5IQ1JfRUwyX1RHRSwgaGNyX2VsMik7XG4rXHRpc2IoKTtcbitcbitcdHdyaXRlX3N5c3JlZyhQU1JfTU9ERV9FTDFoIHwgUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgUFNSX0FfQklUIHxcbitcdFx0ICAgICBQU1JfRF9CSVQsIHNwc3JfZWwyKTtcbitcdHdyaXRlX3N5c3JlZygodTY0KWd1ZXN0X2VsMV9jb2RlLCBlbHJfZWwyKTtcbitcdGFzbSB2b2xhdGlsZShcImVyZXRcIik7XG4rXG4rXHRHVUVTVF9BU1NFUlQoZmFsc2UpO1xuK31cbitcbitzdGF0aWMgdm9pZCBwcmVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3BhLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4rXHRcdC5ncGEgPSBncGEsXG4rXHRcdC5zaXplID0gc2l6ZSxcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZG8ge1xuK1x0XHRyZXQgPSBfX3ZjcHVfaW9jdGwodmNwdSwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIFx1MDAyNnJhbmdlKTtcbitcdH0gd2hpbGUgKCghcmV0IFx1MDAyNlx1MDAyNiByYW5nZS5zaXplKSB8fFxuK1x0XHQgKHJldCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpKTtcbitcbitcdFRFU1RfQVNTRVJUKCFyZXQsIFwiS1ZNX1BSRV9GQVVMVF9NRU1PUlkgZmFpbGVkLCByZXQ6ICVkIGVycm5vOiAlZFwiLFxuK1x0XHQgICAgcmV0LCBlcnJubyk7XG4rXHRURVNUX0FTU0VSVF9FUShyYW5nZS5zaXplLCAwKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3Qga3ZtX3ZjcHVfaW5pdCBpbml0O1xuK1x0c3RydWN0IGt2bV92Y3B1ICp2Y3B1O1xuK1x0c3RydWN0IGt2bV92bSAqdm07XG4rXHRzdHJ1Y3QgdWNhbGwgdWM7XG4rXHR1NjQgbnBhZ2VzO1xuK1xuK1x0VEVTVF9SRVFVSVJFKHRlc3Rfc3VwcG9ydHNfZWwyKCkpO1xuK1x0VEVTVF9SRVFVSVJFKGt2bV9jaGVja19jYXAoS1ZNX0NBUF9QUkVfRkFVTFRfTUVNT1JZKSk7XG4rXG4rXHR2bSA9IHZtX2NyZWF0ZSgxKTtcbitcbitcdGt2bV9nZXRfZGVmYXVsdF92Y3B1X3RhcmdldCh2bSwgXHUwMDI2aW5pdCk7XG4rXHRpbml0LmZlYXR1cmVzWzBdIHw9IEJJVChLVk1fQVJNX1ZDUFVfSEFTX0VMMik7XG4rXHR2Y3B1ID0gYWFyY2g2NF92Y3B1X2FkZCh2bSwgMCwgXHUwMDI2aW5pdCwgZ3Vlc3RfY29kZSk7XG4rXHRrdm1fYXJjaF92bV9maW5hbGl6ZV92Y3B1cyh2bSk7XG4rXG4rXHRucGFnZXMgPSBURVNUX01FTV9TSVpFIC8gdm0tXHUwMDNlcGFnZV9zaXplO1xuK1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgVEVTVF9NRU1fR1BBLFxuK1x0XHRcdFx0ICAgIFRFU1RfTUVNX1NMT1QsIG5wYWdlcywgMCk7XG4rXHR2aXJ0X21hcCh2bSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9HUEEsIG5wYWdlcyk7XG4rXG4rXHQvKiBSdW4gdGhlIGd1ZXN0IHVudGlsIGl0IGhhcyBFUkVUJ2QgZnJvbSB2RUwyIHRvIHZFTDEuICovXG4rXHR2Y3B1X3J1bih2Y3B1KTtcbitcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuK1x0Y2FzZSBVQ0FMTF9TWU5DOlxuK1x0XHRURVNUX0FTU0VSVF9FUSh1Yy5hcmdzWzFdLCAxKTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFVDQUxMX0FCT1JUOlxuK1x0XHRSRVBPUlRfR1VFU1RfQVNTRVJUKHVjKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRURVNUX0ZBSUwoXCJVbmhhbmRsZWQgdWNhbGw6ICVsZFwiLCB1Yy5jbWQpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFRoZSB2Q1BVJ3MgbGFzdC1ydW4gY29udGV4dCBpcyB2RUwxLCBzbyBpdHMgaHdfbW11IGlzIGEgc2hhZG93XG4rXHQgKiBzdGFnZS0yIE1NVS5cbitcdCAqXG4rXHQgKiBQcmUtZmF1bHRpbmcgbXVzdCBpZ25vcmUgdGhhdCBhbmQgcG9wdWxhdGUgdGhlIGNhbm9uaWNhbCBzdGFnZS0yLlxuK1x0ICovXG4rXHRwcmVfZmF1bHQodmNwdSwgVEVTVF9NRU1fR1BBLCBURVNUX01FTV9TSVpFKTtcbitcbitcdC8qIFJlc3VtZSBhdCB2RUwxIGFuZCB0b3VjaCB0aGUgcHJlZmF1bHRlZCByYW5nZS4gKi9cbitcdHZjcHVfcnVuKHZjcHUpO1xuK1x0c3dpdGNoIChnZXRfdWNhbGwodmNwdSwgXHUwMDI2dWMpKSB7XG4rXHRjYXNlIFVDQUxMX0RPTkU6XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBVQ0FMTF9BQk9SVDpcbitcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0VEVTVF9GQUlMKFwiVW5oYW5kbGVkIHVjYWxsOiAlbGRcIiwgdWMuY21kKTtcbitcdH1cbitcbitcdGt2bV92bV9mcmVlKHZtKTtcbitcdHJldHVybiAwO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbmluZGV4IGEwZmNhZTNjYjdhOGIuLjcwMmM3MmJiZmE5NjAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vcHJlX2ZhdWx0X21lbW9yeV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9wcmVfZmF1bHRfbWVtb3J5X3Rlc3QuY1xuQEAgLTEyLDE5ICsxMiwyOSBAQFxuICNpbmNsdWRlIFx1MDAzY3Byb2Nlc3Nvci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjdWNhbGxfY29tbW9uLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NndWVzdF9tb2Rlcy5oXHUwMDNlXG4gXG4gLyogQXJiaXRyYXJpbHkgY2hvc2VuIHZhbHVlcyAqL1xuLSNkZWZpbmUgVEVTVF9TSVpFXHRcdChTWl8yTSArIFBBR0VfU0laRSlcbi0jZGVmaW5lIFRFU1RfTlBBR0VTXHRcdChURVNUX1NJWkUgLyBQQUdFX1NJWkUpXG4rI2RlZmluZSBURVNUX0JBU0VfU0laRVx0XHRTWl8yTVxuICNkZWZpbmUgVEVTVF9TTE9UXHRcdDEwXG4gXG4rLyogU3RvcmFnZSBvZiB0ZXN0IGluZm8gdG8gc2hhcmUgd2l0aCBndWVzdCBjb2RlICovXG4rc3RydWN0IHRlc3RfY29uZmlnIHtcbitcdHU2NCBwYWdlX3NpemU7XG4rXHR1NjQgdGVzdF9zaXplO1xuK1x0dTY0IHRlc3RfbnVtX3BhZ2VzO1xuK307XG4rXG4rc3RhdGljIHN0cnVjdCB0ZXN0X2NvbmZpZyB0ZXN0X2NvbmZpZztcbitcbiBzdGF0aWMgdm9pZCBndWVzdF9jb2RlKHU2NCBiYXNlX2d2YSlcbiB7XG4gXHR2b2xhdGlsZSB1NjQgdmFsIF9fdXNlZDtcbitcdHN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gXHUwMDI2dGVzdF9jb25maWc7XG4gXHRpbnQgaTtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIFRFU1RfTlBBR0VTOyBpKyspIHtcbi1cdFx0dTY0ICpzcmMgPSAodTY0ICopKGJhc2VfZ3ZhICsgaSAqIFBBR0VfU0laRSk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb25maWctXHUwMDNldGVzdF9udW1fcGFnZXM7IGkrKykge1xuK1x0XHR1NjQgKnNyYyA9ICh1NjQgKikoYmFzZV9ndmEgKyBpICogY29uZmlnLVx1MDAzZXBhZ2Vfc2l6ZSk7XG4gXG4gXHRcdHZhbCA9ICpzcmM7XG4gXHR9XG5AQCAtMzYsNiArNDYsNyBAQCBzdHJ1Y3Qgc2xvdF93b3JrZXJfZGF0YSB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcbiBcdGdwYV90IGdwYTtcbiBcdHUzMiBmbGFncztcbitcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuIFx0Ym9vbCB3b3JrZXJfcmVhZHk7XG4gXHRib29sIHByZWZhdWx0X3JlYWR5O1xuIFx0Ym9vbCByZWNyZWF0ZV9zbG90O1xuQEAgLTU2LDE0ICs2NywxNiBAQCBzdGF0aWMgdm9pZCAqZGVsZXRlX3Nsb3Rfd29ya2VyKHZvaWQgKl9fZGF0YSlcbiBcdHdoaWxlICghUkVBRF9PTkNFKGRhdGEtXHUwMDNlcmVjcmVhdGVfc2xvdCkpXG4gXHRcdGNwdV9yZWxheCgpO1xuIFxuLVx0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBWTV9NRU1fU1JDX0FOT05ZTU9VUywgZGF0YS1cdTAwM2VncGEsXG4tXHRcdFx0XHQgICAgVEVTVF9TTE9ULCBURVNUX05QQUdFUywgZGF0YS1cdTAwM2VmbGFncyk7XG4rXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIGRhdGEtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBkYXRhLVx1MDAzZWdwYSxcbitcdFx0XHRcdCAgICBURVNUX1NMT1QsIHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzLCBkYXRhLVx1MDAzZWZsYWdzKTtcbiBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBwcmVfZmF1bHRfbWVtb3J5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGJhc2VfZ3BhLCB1NjQgb2Zmc2V0LFxuLVx0XHRcdCAgICAgdTY0IHNpemUsIHU2NCBleHBlY3RlZF9sZWZ0LCBib29sIHByaXZhdGUpXG4rXHRcdFx0ICAgICB1NjQgc2l6ZSwgdTY0IGV4cGVjdGVkX2xlZnQsXG4rXHRcdFx0ICAgICBlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIG1lbV9iYWNraW5nX3NyYyxcbitcdFx0XHQgICAgIGJvb2wgcHJpdmF0ZSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgcmFuZ2UgPSB7XG4gXHRcdC5ncGEgPSBiYXNlX2dwYSArIG9mZnNldCxcbkBAIC03NCw2ICs4Nyw3IEBAIHN0YXRpYyB2b2lkIHByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYmFzZV9ncGEsIHU2NCBvZmZzZXQsXG4gXHRcdC52bSA9IHZjcHUtXHUwMDNldm0sXG4gXHRcdC5ncGEgPSBiYXNlX2dwYSxcbiBcdFx0LmZsYWdzID0gcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwLFxuK1x0XHQubWVtX2JhY2tpbmdfc3JjID0gbWVtX2JhY2tpbmdfc3JjLFxuIFx0fTtcbiBcdGJvb2wgc2xvdF9yZWNyZWF0ZWQgPSBmYWxzZTtcbiBcdHB0aHJlYWRfdCBzbG90X3dvcmtlcjtcbkBAIC0xNTAsOCArMTY0LDggQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdC8qXG4gXHQgKiBBc3NlcnQgc3VjY2VzcyBpZiBwcmVmYXVsdGluZyB0aGUgZW50aXJlIHJhbmdlIHNob3VsZCBzdWNjZWVkLCBpLmUuXG4gXHQgKiBjb21wbGV0ZSB3aXRoIG5vIGJ5dGVzIHJlbWFpbmluZy4gIE90aGVyd2lzZSBwcmVmYXVsdGluZyBzaG91bGQgaGF2ZVxuLVx0ICogZmFpbGVkIGR1ZSB0byBFTk9FTlQgKGR1ZSB0byBSRVRfUEZfRU1VTEFURSBmb3IgZW11bGF0ZWQgTU1JTyB3aGVuXG4tXHQgKiBubyBtZW1zbG90IGV4aXN0cykuXG4rXHQgKiBmYWlsZWQgZHVlIHRvIEVOT0VOVCAobm8gbWVtc2xvdCBleGlzdHMgZm9yIHRoZSBHUEE7IG9uIHg4NiB0aGlzXG4rXHQgKiBzdXJmYWNlcyB2aWEgUkVUX1BGX0VNVUxBVEUpLlxuIFx0ICovXG4gXHRpZiAoIWV4cGVjdGVkX2xlZnQpXG4gXHRcdFRFU1RfQVNTRVJUX1ZNX1ZDUFVfSU9DVEwoIXJldCwgS1ZNX1BSRV9GQVVMVF9NRU1PUlksIHJldCwgdmNwdS1cdTAwM2V2bSk7XG5AQCAtMTYwLDM5ICsxNzQsODIgQEAgc3RhdGljIHZvaWQgcHJlX2ZhdWx0X21lbW9yeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBiYXNlX2dwYSwgdTY0IG9mZnNldCxcbiBcdFx0XHRcdFx0ICBLVk1fUFJFX0ZBVUxUX01FTU9SWSwgcmV0LCB2Y3B1LVx1MDAzZXZtKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4rc3RydWN0IHRlc3RfcGFyYW1zIHtcbitcdHVuc2lnbmVkIGxvbmcgdm1fdHlwZTtcbitcdGJvb2wgcHJpdmF0ZTtcbitcdGVudW0gdm1fbWVtX2JhY2tpbmdfc3JjX3R5cGUgbWVtX2JhY2tpbmdfc3JjO1xuK307XG4rXG4rc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkoZW51bSB2bV9ndWVzdF9tb2RlIGd1ZXN0X21vZGUsIHZvaWQgKmFyZylcbiB7XG4tXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemU7XG4rXHRncGFfdCBncGEsIGd2YSwgYWxpZ25tZW50LCBndWVzdF9wYWdlX3NpemUsIGhvc3RfcGFnZV9zaXplO1xuK1x0Z3BhX3QgYmFja2luZ19zcmNfcGFnZXN6LCBtZW1fcGFnZV9zaXplO1xuK1x0c3RydWN0IHRlc3RfcGFyYW1zICpwID0gYXJnO1xuIFx0Y29uc3Qgc3RydWN0IHZtX3NoYXBlIHNoYXBlID0ge1xuLVx0XHQubW9kZSA9IFZNX01PREVfREVGQVVMVCxcbi1cdFx0LnR5cGUgPSB2bV90eXBlLFxuK1x0XHQubW9kZSA9IGd1ZXN0X21vZGUsXG4rXHRcdC50eXBlID0gcC1cdTAwM2V2bV90eXBlLFxuIFx0fTtcbiBcdHN0cnVjdCBrdm1fdmNwdSAqdmNwdTtcbitcdHN0cnVjdCBrdm1fcnVuICpydW47XG4gXHRzdHJ1Y3Qga3ZtX3ZtICp2bTtcbiBcdHN0cnVjdCB1Y2FsbCB1YztcbiBcbitcdHByX2luZm8oXCJUZXN0aW5nIGd1ZXN0IG1vZGU6ICVzXFxuXCIsIHZtX2d1ZXN0X21vZGVfc3RyaW5nKGd1ZXN0X21vZGUpKTtcbitcdHByX2luZm8oXCJUZXN0aW5nIG1lbW9yeSBiYWNraW5nIHNyYyB0eXBlOiAlc1xcblwiLFxuK1x0XHR2bV9tZW1fYmFja2luZ19zcmNfYWxpYXMocC1cdTAwM2VtZW1fYmFja2luZ19zcmMpLVx1MDAzZW5hbWUpO1xuK1xuIFx0dm0gPSB2bV9jcmVhdGVfc2hhcGVfd2l0aF9vbmVfdmNwdShzaGFwZSwgXHUwMDI2dmNwdSwgZ3Vlc3RfY29kZSk7XG4gXG4tXHRhbGlnbm1lbnQgPSBndWVzdF9wYWdlX3NpemUgPSB2bV9ndWVzdF9tb2RlX3BhcmFtc1tWTV9NT0RFX0RFRkFVTFRdLnBhZ2Vfc2l6ZTtcbi1cdGdwYSA9ICh2bS1cdTAwM2VtYXhfZ2ZuIC0gVEVTVF9OUEFHRVMpICogZ3Vlc3RfcGFnZV9zaXplO1xuK1x0Z3Vlc3RfcGFnZV9zaXplID0gdm1fZ3Vlc3RfbW9kZV9wYXJhbXNbZ3Vlc3RfbW9kZV0ucGFnZV9zaXplO1xuK1x0aG9zdF9wYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuK1x0YmFja2luZ19zcmNfcGFnZXN6ID0gZ2V0X2JhY2tpbmdfc3JjX3BhZ2VzeihwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyk7XG4rXHRtZW1fcGFnZV9zaXplID0gbWF4KGhvc3RfcGFnZV9zaXplLCBiYWNraW5nX3NyY19wYWdlc3opO1xuK1xuK1x0dGVzdF9jb25maWcucGFnZV9zaXplID0gZ3Vlc3RfcGFnZV9zaXplO1xuK1x0dGVzdF9jb25maWcudGVzdF9zaXplID0gYWxpZ25fdXAoVEVTVF9CQVNFX1NJWkUgKyB0ZXN0X2NvbmZpZy5wYWdlX3NpemUsXG4rXHRcdFx0XHRcdCBtZW1fcGFnZV9zaXplKTtcbitcdHRlc3RfY29uZmlnLnRlc3RfbnVtX3BhZ2VzID0gdm1fY2FsY19udW1fZ3Vlc3RfcGFnZXModm0tXHUwMDNlbW9kZSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbitcbitcdGdwYSA9ICh2bS1cdTAwM2VtYXhfZ2ZuIC0gdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMpICogdGVzdF9jb25maWcucGFnZV9zaXplO1xuIFx0YWxpZ25tZW50ID0gU1pfMk07XG4rXHRhbGlnbm1lbnQgPSBtYXgoYWxpZ25tZW50LCBtZW1fcGFnZV9zaXplKTtcbiBcdGdwYSA9IGFsaWduX2Rvd24oZ3BhLCBhbGlnbm1lbnQpO1xuIFx0Z3ZhID0gZ3BhIFx1MDAyNiAoKDFVTEwgXHUwMDNjXHUwMDNjICh2bS1cdTAwM2V2YV9iaXRzIC0gMSkpIC0gMSk7XG4gXG4tXHR2bV91c2Vyc3BhY2VfbWVtX3JlZ2lvbl9hZGQodm0sIFZNX01FTV9TUkNfQU5PTllNT1VTLCBncGEsIFRFU1RfU0xPVCxcbi1cdFx0XHRcdCAgICBURVNUX05QQUdFUywgcHJpdmF0ZSA/IEtWTV9NRU1fR1VFU1RfTUVNRkQgOiAwKTtcbi1cdHZpcnRfbWFwKHZtLCBndmEsIGdwYSwgVEVTVF9OUEFHRVMpO1xuK1x0dm1fdXNlcnNwYWNlX21lbV9yZWdpb25fYWRkKHZtLCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYyxcbitcdFx0XHRcdCAgICBncGEsIFRFU1RfU0xPVCwgdGVzdF9jb25maWcudGVzdF9udW1fcGFnZXMsXG4rXHRcdFx0XHQgICAgcC1cdTAwM2Vwcml2YXRlID8gS1ZNX01FTV9HVUVTVF9NRU1GRCA6IDApO1xuK1x0dmlydF9tYXAodm0sIGd2YSwgZ3BhLCB0ZXN0X2NvbmZpZy50ZXN0X251bV9wYWdlcyk7XG4rXG4rXHRpZiAocC1cdTAwM2Vwcml2YXRlKVxuK1x0XHR2bV9tZW1fc2V0X3ByaXZhdGUodm0sIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplKTtcbitcbitcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCAwLCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUsIDAsXG4rXHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuK1x0LyogUmV0cnkgdGhlIHNhbWUgcmFuZ2UgYWZ0ZXIgdGhlIGZpcnN0IHByZWZhdWx0IGF0dGVtcHQuICovXG4rXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgMCwgdGVzdF9jb25maWcudGVzdF9zaXplLCAwLFxuK1x0XHRcdCBwLVx1MDAzZW1lbV9iYWNraW5nX3NyYywgcC1cdTAwM2Vwcml2YXRlKTtcbitcdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLFxuK1x0XHRcdCB0ZXN0X2NvbmZpZy50ZXN0X3NpemUgLSBob3N0X3BhZ2Vfc2l6ZSxcbitcdFx0XHQgaG9zdF9wYWdlX3NpemUgKiAyLCBob3N0X3BhZ2Vfc2l6ZSxcbitcdFx0XHQgcC1cdTAwM2VtZW1fYmFja2luZ19zcmMsIHAtXHUwMDNlcHJpdmF0ZSk7XG4rXHRwcmVfZmF1bHRfbWVtb3J5KHZjcHUsIGdwYSwgdGVzdF9jb25maWcudGVzdF9zaXplLFxuK1x0XHRcdCBob3N0X3BhZ2Vfc2l6ZSwgaG9zdF9wYWdlX3NpemUsXG4rXHRcdFx0IHAtXHUwMDNlbWVtX2JhY2tpbmdfc3JjLCBwLVx1MDAzZXByaXZhdGUpO1xuIFxuLVx0aWYgKHByaXZhdGUpXG4tXHRcdHZtX21lbV9zZXRfcHJpdmF0ZSh2bSwgZ3BhLCBURVNUX1NJWkUpO1xuK1x0dmNwdV9hcmdzX3NldCh2Y3B1LCAxLCBndmEpO1xuIFxuLVx0cHJlX2ZhdWx0X21lbW9yeSh2Y3B1LCBncGEsIDAsIFNaXzJNLCAwLCBwcml2YXRlKTtcbi1cdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBTWl8yTSwgUEFHRV9TSVpFICogMiwgUEFHRV9TSVpFLCBwcml2YXRlKTtcbi1cdHByZV9mYXVsdF9tZW1vcnkodmNwdSwgZ3BhLCBURVNUX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBwcml2YXRlKTtcbitcdC8qIEV4cG9ydCB0aGUgc2hhcmVkIHZhcmlhYmxlcyB0byB0aGUgZ3Vlc3QuICovXG4rXHRzeW5jX2dsb2JhbF90b19ndWVzdCh2bSwgdGVzdF9jb25maWcpO1xuIFxuLVx0dmNwdV9hcmdzX3NldCh2Y3B1LCAxLCBndmEpO1xuIFx0dmNwdV9ydW4odmNwdSk7XG4gXG4rXHRydW4gPSB2Y3B1LVx1MDAzZXJ1bjtcbitcdFRFU1RfQVNTRVJUKHJ1bi1cdTAwM2VleGl0X3JlYXNvbiA9PSBVQ0FMTF9FWElUX1JFQVNPTixcbitcdFx0ICAgIFwiV2FudGVkICVzLCBnb3QgZXhpdCByZWFzb246ICV1ICglcylcIixcbitcdFx0ICAgIGV4aXRfcmVhc29uX3N0cihVQ0FMTF9FWElUX1JFQVNPTiksXG4rXHRcdCAgICBydW4tXHUwMDNlZXhpdF9yZWFzb24sIGV4aXRfcmVhc29uX3N0cihydW4tXHUwMDNlZXhpdF9yZWFzb24pKTtcbitcbiBcdHN3aXRjaCAoZ2V0X3VjYWxsKHZjcHUsIFx1MDAyNnVjKSkge1xuIFx0Y2FzZSBVQ0FMTF9BQk9SVDpcbiBcdFx0UkVQT1JUX0dVRVNUX0FTU0VSVCh1Yyk7XG5AQCAtMjA3LDI0ICsyNjQsNjEgQEAgc3RhdGljIHZvaWQgX190ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBib29sIHByaXZhdGUpXG4gXHRrdm1fdm1fZnJlZSh2bSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHRlc3RfcHJlX2ZhdWx0X21lbW9yeSh1bnNpZ25lZCBsb25nIHZtX3R5cGUsIGJvb2wgcHJpdmF0ZSlcbitzdGF0aWMgdm9pZCB0ZXN0X3ByZV9mYXVsdF9tZW1vcnkodW5zaWduZWQgbG9uZyB2bV90eXBlLCBlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmdfc3JjLFxuK1x0XHRcdFx0ICBib29sIHByaXZhdGUpXG4ge1xuK1x0c3RydWN0IHRlc3RfcGFyYW1zIHAgPSB7XG4rXHRcdC52bV90eXBlID0gdm1fdHlwZSxcbitcdFx0LnByaXZhdGUgPSBwcml2YXRlLFxuK1x0XHQubWVtX2JhY2tpbmdfc3JjID0gYmFja2luZ19zcmMsXG4rXHR9O1xuK1xuIFx0aWYgKHZtX3R5cGUgXHUwMDI2XHUwMDI2ICEoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1ZNX1RZUEVTKSBcdTAwMjYgQklUKHZtX3R5cGUpKSkge1xuIFx0XHRwcl9pbmZvKFwiU2tpcHBpbmcgdGVzdHMgZm9yIHZtX3R5cGUgMHglbHhcXG5cIiwgdm1fdHlwZSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdF9fdGVzdF9wcmVfZmF1bHRfbWVtb3J5KHZtX3R5cGUsIHByaXZhdGUpO1xuK1x0Zm9yX2VhY2hfZ3Vlc3RfbW9kZShfX3Rlc3RfcHJlX2ZhdWx0X21lbW9yeSwgXHUwMDI2cCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGhlbHAoY2hhciAqbmFtZSlcbit7XG4rXHRwdXRzKFwiXCIpO1xuK1x0cHJpbnRmKFwidXNhZ2U6ICVzIFstaF0gWy1tIG1vZGVdIFstcyBtZW0tdHlwZV1cXG5cIiwgbmFtZSk7XG4rXHRwdXRzKFwiXCIpO1xuK1x0Z3Vlc3RfbW9kZXNfaGVscCgpO1xuK1x0YmFja2luZ19zcmNfaGVscChcIi1zXCIpO1xuK1x0cHV0cyhcIlwiKTtcbiB9XG4gXG4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSlcbiB7XG4rXHRlbnVtIHZtX21lbV9iYWNraW5nX3NyY190eXBlIGJhY2tpbmcgPSBERUZBVUxUX1ZNX01FTV9TUkM7XG4rXHRpbnQgb3B0O1xuK1xuK1x0Z3Vlc3RfbW9kZXNfYXBwZW5kX2RlZmF1bHQoKTtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiaG06czpcIikpICE9IC0xKSB7XG4rXHRcdHN3aXRjaCAob3B0KSB7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdGd1ZXN0X21vZGVzX2NtZGxpbmUob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAncyc6XG4rXHRcdFx0YmFja2luZyA9IHBhcnNlX2JhY2tpbmdfc3JjX3R5cGUob3B0YXJnKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAnaCc6XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0aGVscChhcmd2WzBdKTtcbitcdFx0XHRleGl0KDApO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRURVNUX1JFUVVJUkUoa3ZtX2NoZWNrX2NhcChLVk1fQ0FQX1BSRV9GQVVMVF9NRU1PUlkpKTtcbiBcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeSgwLCBmYWxzZSk7XG4rXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoMCwgYmFja2luZywgZmFsc2UpO1xuICNpZmRlZiBfX3g4Nl82NF9fXG4tXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGZhbHNlKTtcbi1cdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgdHJ1ZSk7XG4rXHR0ZXN0X3ByZV9mYXVsdF9tZW1vcnkoS1ZNX1g4Nl9TV19QUk9URUNURURfVk0sIGJhY2tpbmcsIGZhbHNlKTtcbitcdHRlc3RfcHJlX2ZhdWx0X21lbW9yeShLVk1fWDg2X1NXX1BST1RFQ1RFRF9WTSwgYmFja2luZywgdHJ1ZSk7XG4gI2VuZGlmXG4gXHRyZXR1cm4gMDtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzowNS4yNDg0NTUwODVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMzU4NDUyNjc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEZlYXNpYmlsaXR5IEFzc2Vzc21lbnQqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lIGlmIGl0J3MgYSBnb29kIGNhbmRpZGF0ZSBmb3Igc3l6a2FsbGVyIGZ1enppbmcuIFRoZSBmaXJzdCB0aGluZyBJJ20gZ29pbmcgdG8gY2hlY2sgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEFoLCBcImFtZDY0XCIuIE5vdCBncmVhdCwgYnV0IGxldCdzIGNhcmVmdWxseSByZXZpZXcgdGhlIHBhdGNoIGRpZmYgaXRzZWxmIHRvIHNlZSB3aGF0J3MgYWN0dWFsbHkgYmVlbiB0b3VjaGVkLlxuXG5Pa2F5LCBsZXQncyByZWFkIHRocm91Z2ggdGhlIHBhdGNoIGRpZmYgYW5kIHNlZSB3aGF0J3MgY2hhbmdlZC4gTG9va3MgbGlrZSB3ZSBoYXZlIGNoYW5nZXMgaW4gYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAsIHdoaWNoIGlzIGp1c3QgZG9jdW1lbnRhdGlvbiwgc28gbm8gYmlnIGRlYWwgdGhlcmUuIFRoZW4gdGhlcmUgYXJlIGEgYnVuY2ggb2YgZmlsZXMgdW5kZXIgYGFyY2gvYXJtNjRgOiBpbmNsdWRlcyBhbmQgc291cmNlIGNvZGUgcmVsYXRlZCB0byBLVk0g4oCTIGBlc3IuaGAsIGBrdm1fZW11bGF0ZS5oYCwgYGt2bV9wZ3RhYmxlLmhgLCBga3ZtX3Brdm0uaGAsIGBLY29uZmlnYCwgYGFybS5jYCwgYW5kIG1vcmUuIFRoZXJlJ3MgYWxzbyBzb21lIHN0dWZmIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vYCByZWxhdGVkIHRvIHRlc3RzLCBlc3BlY2lhbGx5IGZvciBgYXJtNjRgLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGVyZSAqYW55dGhpbmcqIGFmZmVjdGluZyB4ODYgb3IgY29tbW9uIGtlcm5lbCBjb2RlPyBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIGJlY2F1c2Ugc3l6a2FsbGVyJ3MgbWFpbiBzdHJlbmd0aCBpcyBnZW5lcmFsbHkgb24geDg2LCBub3QgYXJtNjQsIHNvIGl0IG5lZWRzIHRvIGJlIGNhcmVmdWxseSBpbnZlc3RpZ2F0ZWQuIExldCBtZSBtZXRpY3Vsb3VzbHkgZ28gdGhyb3VnaCBldmVyeSBmaWxlIGxpc3RlZCBpbiB0aGUgZGlmZjogYERvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdGAsIGFsbCB0aGUgYGFyY2gvYXJtNjRgIGZpbGVzLCBhbmQgdGhlIGB0b29scy90ZXN0aW5nYCBmaWxlcy5cblxuTm9wZS4gTm90aGluZy4gSXQncyBhbGwgZWl0aGVyIGRvY3VtZW50YXRpb24sIGFybTY0LXNwZWNpZmljIEtWTSBjb2RlLCBvciB0ZXN0cyBmb3IgYXJtNjQuIEp1c3QgdG8gYmUgYWJzb2x1dGVseSwgcG9zaXRpdmVseSBjZXJ0YWluLCBJIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgdGhpcyB3aXRoIGEgYGdpdCBkaWZmYCBvciBgZ2l0IHNob3dgIHRvIGxlYXZlIG5vIGRvdWJ0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjk5NiwiT3V0cHV0VG9rZW5zIjoxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjM4LjgzMjk4NDIwN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjQ3MDU3NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRpZmYgLS1naXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9icGYvZHJnbi5yc3Q9OTk9Rm9yIGV4YW1wbGUsIHRvIHByaW50IGBgc3RydWN0IGJwZl9wcm9nX2F1eGBgIGZvciBCUEYgcHJvZ3JhbSBpZCA1MzA3NzpcXG4tLVxcbkRvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0LTEwMy0gICAgJSBnaXQgZGlmZlxcbkRvY3VtZW50YXRpb24vYnBmL2RyZ24ucnN0OjEwNDogICAgZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZl9pbnNwZWN0LnB5IGIvdG9vbHMvYnBmX2luc3BlY3QucHlcXG5Eb2N1bWVudGF0aW9uL2JwZi9kcmduLnJzdC0xMDUtICAgIGluZGV4IDY1MGUyMjguLmFlYTIzNTcgMTAwNzU1XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0PTU0PXdvbid0IGJyZWFrIHVzZXJzcGFjZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTY5LSAgICAgICogIGNvbXAyX3QgaXMgMjQtYml0IHdpdGggNS1iaXQgYmFzZSAyIGV4cG9uZW50IGFuZCAyMCBiaXQgZnJhY3Rpb25cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0OjcwOiAgICBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXFxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdC03MS0gICAgRU9GXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0PTMxMD1Db25zaWRlciB0aGlzIGNoYW5nZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jaGVja3VhcGkucnN0LTMxMi0gICAgY2F0IFxcdTAwM2NcXHUwMDNjICdFT0YnIHwgcGF0Y2ggLWwgLXAxXFxuRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY2hlY2t1YXBpLnJzdDozMTM6ICAgIGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvS2J1aWxkIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL0tidWlsZFxcbkRvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NoZWNrdWFwaS5yc3QtMzE0LSAgICBpbmRleCBlYmIxODBhYWM3NGUuLmE5Yzg4YjBhOGIzYiAxMDA2NDRcXG4tLVxcbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3Q9ODQ9bG9va2VkIGxpa2UgdGhpczo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTEwMi1cXG5Eb2N1bWVudGF0aW9uL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0OjEwMzogIGRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuY1xcbkRvY3VtZW50YXRpb24vZG9jLWd1aWRlL2NvbnRyaWJ1dGluZy5yc3QtMTA0LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3Q9NzM9Y2hhbmdlOjpcXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtNzQtXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojc1OlxcdGRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0LTc2LVxcdC0tLSBhL21tL21yZW1hcC5jXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdD0zNj1D5Luj56CB57yW6K+R5Zmo5Y+R5Ye655qE6K2m5ZGK5bi45bi45Lya6KKr6KeG5Li66K+v5oql77yM5LuO6ICM5a+86Ie05Ye6546w5LqG5peo5Zyo6K6p57yW6K+R5Zmo6Zet5Zi055qE6KGl5LiB44CCXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdC04Ni1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kb2MtZ3VpZGUvY29udHJpYnV0aW5nLnJzdDo4NzogIGRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuY1xcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2RvYy1ndWlkZS9jb250cmlidXRpbmcucnN0LTg4LSAgaW5kZXggNTdmNjk0NGQ2NWE2Li4wMGM5YjgwYjNkMzMgMTAwNjQ0XFxuLS1cXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGw9MjY3MT1zdWIgcHJvY2VzcyB7XFxuLS1cXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGwtMjg0NC1cXHRcXHQgICAgKCRsaW5lID1+IC9ecmVuYW1lICg/OmZyb218dG8pIFxcXFxTK1xcXFxzKiQvIHx8XFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsOjI4NDU6XFx0XFx0ICAgICAkbGluZSA9fiAvXmRpZmYgLS1naXQgYVxcXFwvW1xcXFx3XFxcXC9cXFxcLlxcXFxfXFxcXC1dKyBiXFxcXC9cXFxcUytcXFxccyokLykpKSB7XFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsLTI4NDYtXFx0XFx0XFx0JGlzX3BhdGNoID0gMTtcXG4tLVxcbnNjcmlwdHMvY2hlY2twYXRjaC5wbC0yOTAyLVxcdFxcdCMgZXh0cmFjdCB0aGUgZmlsZW5hbWUgYXMgaXQgcGFzc2VzXFxuc2NyaXB0cy9jaGVja3BhdGNoLnBsOjI5MDM6XFx0XFx0aWYgKCRsaW5lID1+IC9eZGlmZiAtLWdpdC4qPyhcXFxcUyspJC8pIHtcXG5zY3JpcHRzL2NoZWNrcGF0Y2gucGwtMjkwNC1cXHRcXHRcXHQkcmVhbGZpbGUgPSAkMTtcXG4tLVxcbnNjcmlwdHMvZ2V0X21haW50YWluZXIucGw9NTUyPWZvcmVhY2ggbXkgJGZpbGUgKEBBUkdWKSB7XFxuLS1cXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsLTYwMS1cXHRcXHRwdXNoKEBmaWxlcywgJGZpbGVuYW1lKTtcXG5zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsOjYwMjpcXHQgICAgfSBlbHNpZiAobS9eZGlmZiAtLWdpdCBhXFxcXC8oXFxcXFMrKSBiXFxcXC8oXFxcXFMrKVxcXFxzKiQvKSB7XFxuc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbC02MDMtXFx0XFx0bXkgJGZpbGVuYW1lMSA9ICQxO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzo0MS40ODAwNDc5MjZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MTY4NzIzNTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6XG5cbioqQ2hlY2tpbmcgdGhlIFJlY2VudCBHaXQgQWN0aXZpdHkqKlxuXG5Pa2F5LCBJIG5lZWQgdG8gcXVpY2tseSBzZWUgd2hhdCB0aGUgbW9zdCByZWNlbnQgY29tbWl0IGluIHRoaXMgcmVwb3NpdG9yeSBhY3R1YWxseSAqZGlkKi4gUmF0aGVyIHRoYW4gbmF2aWdhdGluZyB0aHJvdWdoIHRoZSBjb21taXQgaGlzdG9yeSB2aXN1YWxseSAod2hpY2ggY2FuIGJlIHRpbWUtY29uc3VtaW5nKSwgSSdtIGdvaW5nIHRvIGxldmVyYWdlIGBnaXRgIHRvIGdpdmUgbWUgYSBjb25jaXNlIG92ZXJ2aWV3LiBJJ20gdGhpbmtpbmcgSSBzaG91bGQgdXNlIGBnaXQgc2hvdyAtLXN0YXQgSEVBRGAgY29tbWFuZC4gYHNob3dgIHdpbGwgZGlzcGxheSB0aGUgYWN0dWFsIGNvbW1pdCwgYW5kIHRoZSBgLS1zdGF0YCBvcHRpb24gd2lsbCBnaXZlIG1lIHRoZSBjaGFuZ2VzIGJyb2tlbiBkb3duIGZpbGUgYnkgZmlsZS4gVGhpcyB3aWxsIHByZXNlbnQgYSBjbGVhciBzdW1tYXJ5IG9mIHdoYXQncyBiZWVuIGFkZGVkLCBkZWxldGVkLCBvciBtb2RpZmllZCBpbiB0aGF0IGxhc3QgY29tbWl0LiBUaGlzIGlzIHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0IHRoZSBnaXN0IG9mIGl0LiBUaGlzIHdpbGwgc2hvdyBtZSB0aGUgY2hhbmdlcy4gQWx0ZXJuYXRpdmVseSwgYGdpdCBkaWZmLXRyZWUgLS1zdGF0IEhFQURgIGlzIGFuIG9wdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUzNjQsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxMzo0Ni42NDg3NzM0ODZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQxNjYzNTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJhcmNoL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L2t2bS9tbXUuYz0yOTE5PXByZV9mYXVsdF9ieXRlc19jb25zdW1lZChncGFfdCBncGEsIHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplLFxcbi0tXFxuYXJjaC9hcm02NC9rdm0vbW11LmMtMjkzMi0vKipcXG5hcmNoL2FybTY0L2t2bS9tbXUuYzoyOTMzOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSAtIHByZS1mYXVsdCBzdGFnZS0yIHBhZ2UgdGFibGVzIGZvciB0aGVcXG5hcmNoL2FybTY0L2t2bS9tbXUuYy0yOTM0LSAqIHNwZWNpZmllZCBHUEEuXFxuLS1cXG5hcmNoL2FybTY0L2t2bS9tbXUuYy0yOTQ1LSAqL1xcbmFyY2gvYXJtNjQva3ZtL21tdS5jOjI5NDY6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbmFyY2gvYXJtNjQva3ZtL21tdS5jLTI5NDctXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSAqcmFuZ2UpXFxuLS1cXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmM9NTc5Nz12b2lkIGt2bV9hcmNoX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODQwLS8qKlxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYzo1ODQxOiAqIGt2bV9hcmNoX3ZjcHVfcHJlX2ZhdWx0X21lbW9yeSgpIC0tIHByZS1mYXVsdCBhbmQgbGluayBnbWFwIGRhdCB0YWJsZXNcXG5hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMtNTg0Mi0gKiBAdmNwdTogdGhlIHZjcHUgdGhhdCBzaGFsbCBhcHBlYXIgdG8gaGF2ZSBnZW5lcmF0ZWQgdGhlIGZhdWx0LWluLlxcbi0tXFxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jLTU4NTktICovXFxuYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jOjU4NjA6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkgKnJhbmdlKVxcbmFyY2gvczM5MC9rdm0va3ZtLXMzOTAuYy01ODYxLXtcXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NDk3Mz1zdGF0aWMgaW50IGt2bV90ZHBfcGFnZV9wcmVmYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSxcXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxNi1cXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jOjUwMTc6bG9uZyBrdm1fYXJjaF92Y3B1X3ByZV9mYXVsdF9tZW1vcnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTAxOC1cXHRcXHRcXHRcXHQgICAgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5ICpyYW5nZSlcXG4tLVxcbmFyY2gveDg2L2t2bS92bXgvdGR4LmM9MTcwMT1zdGF0aWMgaW50IHRkeF9zZXB0X21hcF9sZWFmX3NwdGUoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGVudW0gcGdfbGV2ZWwgbGV2ZWwsXFxuLS1cXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jLTE3MTMtXFx0LypcXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jOjE3MTQ6XFx0ICogRW5zdXJlIHByZV9mYXVsdF9hbGxvd2VkIGlzIHJlYWQgYnkga3ZtX2FyY2hfdmNwdV9wcmVfZmF1bHRfbWVtb3J5KClcXG5hcmNoL3g4Ni9rdm0vdm14L3RkeC5jLTE3MTUtXFx0ICogYmVmb3JlIGt2bV90ZHgtXFx1MDAzZXN0YXRlLiAgVXNlcnNwYWNlIG11c3Qgbm90IGJlIGFsbG93ZWQgdG8gcHJlLWZhdWx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDEzOjEzOjQ3LjA5MDQ1NDgyOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2NDkyODQwODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEtWTSBQYXRjaCBmb3IgV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKlxuXG5Pa2F5LCBmaXJzdCB0aGluZ3MgZmlyc3QsIGxldCdzIGVzdGFibGlzaCB0aGUgY29udGV4dC4gV2UncmUgbG9va2luZyBhdCBhIHBhdGNoIHNldCwgYW5kIHRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCdzIHdvcnRoIGZ1enppbmcuIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZXMuIEFoLCB0aGUgYGdpdCBkaWZmYCBpcyBhbHJlYWR5IHByb3ZpZGVkLiBFeGNlbGxlbnQuIExldCdzIHJldmlldyBpdCBhZ2Fpbi5cblxuSXQgc2VlbXMgdG8gYmUgYWxsIHRoaW5ncyBLVk0sIGJ1dCB0aGUgZGlmZiByZXZlYWxzOlxuKiAgIGBEb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3RgXG4qICAgYGFyY2gvYXJtNjQvLi4uYCBleHRlbnNpdmVseVxuKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vLi4uYFxuXG5Ob3csIGxldCdzIGNvbnN1bHQgdGhlIGNyaXRlcmlhIGZvciBkZWNpZGluZyAqYWdhaW5zdCogZnV6emluZywgc3BlY2lmaWNhbGx5IFNFQ1RJT04gMi4gSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCB0aGlzIHBhdGNoICpkb2Vzbid0KiB3YXJyYW50IGZ1enppbmcgYmFzZWQgb24gdGhlIGRlZmluZWQgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgaGVyZSBhcmUgdGhlIHNjZW5hcmlvcyB3aGVyZSB3ZSBkZWZpbml0aXZlbHkgKmRvbid0KiBmdXp6LiBJIHNlZSB0aGUgbWFpbiBwb2ludHMgYXM6XG4qICAgRG9jdW1lbnRhdGlvbi8gYW5kIHNlbGYtdGVzdHMgKHRvb2xzLykgdGhhdCBkb24ndCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS5cbiogICBcIkNvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cIlxuXG5BbHJpZ2h0LCBsZXQncyBjb25uZWN0IHRoZSBkb3RzLiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhhdCdzIHdoYXQncyByZWxldmFudCB0byB0aGlzIGZ1enppbmcgZXhlcmNpc2UuIExvb2tpbmcgYXQgdGhlIHBhdGNoIHNldCwgdGhlIGtlcm5lbCBjaGFuZ2VzIGFyZSAqc3RyaWN0bHkqIHVuZGVyIGBhcmNoL2FybTY0L2AuIEl0J3MgYWxsIEFSTTY0IEtWTS1yZWxhdGVkLCBpbmNsdWRpbmcgaGVhZGVycyBhbmQgY29yZSBLVk0gaW1wbGVtZW50YXRpb24gZmlsZXMuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUuIFRoZSByZXN0IGlzIGRvY3VtZW50YXRpb24gYW5kIHRob3NlIHVzZXItc3BhY2Ugc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHNgLlxuXG5UaGUgaW1wbGljYXRpb24gaXMgb2J2aW91czogdGhlIGtlcm5lbCBjb2RlIGNoYW5nZXMgd2lsbCBub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQuXG5cblRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0J3MgcGVyZm9ybSBhIHNhbml0eSBjaGVjay4gTGV0J3MgcXVpY2tseSB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gY29tbW9uIEtWTSBjb2RlIGNoYW5nZXMuIEknbGwgc2VhcmNoIGB2aXJ0L2t2bS9gIGFuZCBgaW5jbHVkZS9saW51eC9rdm0qYCBmb3IgYW55IHRvdWNoZWQgZmlsZXMuIE5vdGhpbmcuIE5vdCBhIHNpbmdsZSBmaWxlIGluIHRoZXNlIGxvY2F0aW9ucyEgVGhpcyBjb25maXJtcyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byBBUk02NCBhbmQgdGhlIG90aGVyIG5vbi1rZXJuZWwgZWxlbWVudHMuXG5cblRoaXMgcGF0Y2ggaXMgZXhjbHVzaXZlbHkgZGVhbGluZyB3aXRoIEFSTTY0IEtWTSBhbmQgc2VsZi10ZXN0cy4gVGhlIEtWTSBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIHRhcmdldCBhbWQ2NCBhcmNoaXRlY3R1cmUgaXMgbm90IGludm9sdmVkLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggZmFsbHMgaW50byB0aHJlZSBvZiB0aGUgXCJuZWdhdGl2ZSBjcml0ZXJpYVwiOlxuKiAgIERvY3VtZW50YXRpb24gY2hhbmdlc1xuKiAgIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMgLyBzZWxmLXRlc3RzXG4qICAgQ29kZSBleGNsdXNpdmUgdG8gYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlLlxuXG5CYXNlZCBvbiB0aGlzLCB0aGUgZnV6emluZy13b3J0aGluZXNzIHBhcmFtZXRlcnMgYXJlIGNsZWFyOlxuXG4qICAgYFdvcnRoRnV6emluZ2A6IGZhbHNlXG4qICAgYEZvY3VzU3ltYm9sc2A6IFxcWyBdXG4qICAgYEVuYWJsZUNvbmZpZ3NgOiBcXFsgXVxuKiAgIGBSZWFzb25pbmdgOiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gQWxsIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgY2hhbmdlcyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGltcGxlbWVudGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IGZvciBhcm02NCBLVk0pLiBUaGUgcmVtYWluZGVyIG9mIHRoZSBjaGFuZ2VzIGFyZSBkb2N1bWVudGF0aW9uIGFuZCB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLiBUaGVyZWZvcmUsIG5vbmUgb2YgdGhlIG1vZGlmaWVkIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgaXMgcmVhY2hhYmxlIG9yIGNvbXBpbGVkIG9uIGFtZDY0LlxuXG5Ob3csIHdpdGggdGhpcyByYXRpb25hbGUgYW5kIGRlZmluaXRpdmUgZmluZGluZ3MsIEkgY2FuIGNvbmZpZGVudGx5IHNldCB0aGUgcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0NjksIk91dHB1dFRva2VucyI6MTIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA1NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxMzoxNDoxMy41ODMyOTg2NTJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMyNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIEFsbCBrZXJuZWwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgZXhjbHVzaXZlIHRvIGFyY2gvYXJtNjQgKGFkZGluZyBLVk1fUFJFX0ZBVUxUX01FTU9SWSBzdXBwb3J0IHRvIGFybTY0IEtWTSksIHdoaWxlIHRoZSByZW1haW5pbmcgY2hhbmdlcyBhcmUgbGltaXRlZCB0byBEb2N1bWVudGF0aW9uLyBhbmQgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEJlY2F1c2Ugbm8gcmVhY2hhYmxlIGNvZGUgaXMgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gYW1kNjQsIHRoaXMgcGF0Y2ggc2VyaWVzIGRvZXMgbm90IHdhcnJhbnQgZnV6emluZyBvbiB0aGlzIHRhcmdldCBhcmNoaXRlY3R1cmUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LiBBbGwga2VybmVsIG1vZGlmaWNhdGlvbnMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgYXJlIGV4Y2x1c2l2ZSB0byBhcmNoL2FybTY0IChhZGRpbmcgS1ZNX1BSRV9GQVVMVF9NRU1PUlkgc3VwcG9ydCB0byBhcm02NCBLVk0pLCB3aGlsZSB0aGUgcmVtYWluaW5nIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gRG9jdW1lbnRhdGlvbi8gYW5kIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBCZWNhdXNlIG5vIHJlYWNoYWJsZSBjb2RlIGlzIGNvbXBpbGVkIG9yIGV4ZWN1dGVkIG9uIGFtZDY0LCB0aGlzIHBhdGNoIHNlcmllcyBkb2VzIG5vdCB3YXJyYW50IGZ1enppbmcgb24gdGhpcyB0YXJnZXQgYXJjaGl0ZWN0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTM6MTQ6MTMuNTgzMzM2NDYyWiIsIlNlcSI6OSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow2v2tj[1] Phase: Running StartedAt: 2026-09-14 13:14:24 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2v2tj[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-14 13:14:24 +0000 UTC FinishedAt: 2026-09-14 13:14:29 +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,}