Name: series-workflow99qhf Phase: Succeeded StartedAt: 2026-09-07 19:24:20 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[0] Phase: Succeeded StartedAt: 2026-09-07 19:24:20 +0000 UTC FinishedAt: 2026-09-07 19:26:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 19:24:20 +0000 UTC FinishedAt: 2026-09-07 19:26:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ISO9660_FS", "ZISOFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ISO9660_FS", "ZISOFS" ], "series_id": "479c587b-60a9-4be2-a0df-b2ce37eaa157" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "zisofs_read_folio", "zisofs_fill_pages", "zisofs_uncompress_block" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lTTzk2NjBfRlMmIzM0OywKICAgICYjMzQ7WklTT0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7emlzb2ZzX3JlYWRfZm9saW8mIzM0OywKICAgICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywKICAgICYjMzQ7emlzb2ZzX3VuY29tcHJlc3NfYmxvY2smIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSBgc3RydWN0IHBhZ2VgIEFQSXMgdG8gYHN0cnVjdCBmb2xpb2AgQVBJcyAodXNpbmcgYGttYXBfbG9jYWxfZm9saW9gLCBgZm9saW9femVyb19yYW5nZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCwgYF9fZmlsZW1hcF9nZXRfZm9saW9gLCBldGMuKS4gXG5cblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbnZlcnRzIHppc29mcyAodHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBzdXBwb3J0IGluIElTTzk2NjAgZmlsZXN5c3RlbSkgZnJvbSBwYWdlLWJhc2VkIEFQSXMgdG8gZm9saW8tYmFzZWQgQVBJcyBhY3Jvc3Mgemlzb2ZzX3JlYWRfZm9saW8sIHppc29mc19maWxsX3BhZ2VzLCBhbmQgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2suIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGZpbGVzeXN0ZW0gYW5kIHBhZ2UgY2FjaGUgZGVjb21wcmVzc2lvbiBsb2dpYyB0aGF0IGNhbiBiZSBleGVyY2lzZWQgYnkgbW91bnRpbmcgYW5kIHJlYWRpbmcgY29tcHJlc3NlZCBJU08gaW1hZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzUwMzFmNjk3NWQzZTM1ZDhjMjY0ODE4YmU4NTEzOWUxMTIzYjkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbmluZGV4IGY5ODY5ZDYyYjg1MDkuLjJkMjNhYmFlYjg3NDIgMTAwNjQ0XG4tLS0gYS9mcy9pc29mcy9jb21wcmVzcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9pc29mcy9jb21wcmVzcy5jXG5AQCAtMzksNyAmIzQzOzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgKi9cbiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gXHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4ge1xuIFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5AQCAtNjYsMTEgJiM0Mzs2NiwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdGlmIChibG9ja19zaXplID09IDApIHtcbiBcdFx0Zm9yICggaSA9IDAgOyBpIFx1MDAzYyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHtcbiBcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuJiM0MztcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2ldO1xuIFxuLVx0XHRcdGlmICghcGFnZXNbaV0pXG4mIzQzO1x0XHRcdGlmICghZm9saW8pXG4gXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRtZW16ZXJvX3BhZ2UocGFnZXNbaV0sIG9mZiwgUEFHRV9TSVpFIC0gb2ZmKTtcbi1cdFx0XHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xuJiM0MztcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcbiYjNDM7XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdH1cbiBcdFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XG4gXHR9XG5AQCAtMTE5LDExICYjNDM7MTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFxuIFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbiYjNDM7XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4mIzQzO1xuIFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfcGFnZShwYWdlc1tjdXJwYWdlXSlcbi1cdFx0XHRcdFx0XHQmIzQzOyBwb2Zmc2V0O1xuLVx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRSAtIHBvZmZzZXQ7XG4mIzQzO1x0XHRcdGlmIChmb2xpbykge1xuJiM0MztcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIHBvZmZzZXQpO1xuJiM0MztcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gXHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuQEAgLTE3Myw5ICYjNDM7MTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIFx0XHRcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTtcbi1cdFx0XHRcdFNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7XG4mIzQzO1x0XHRcdGlmIChmb2xpbykge1xuJiM0MztcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gXHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbkBAIC0yMDYsNyAmIzQzOzIwOCw3IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuICAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cbiAgKi9cbiBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXG4tXHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiB7XG4gXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG5AQCAtMjIxLDE0ICYjNDM7MjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdGludCBlcnI7XG4gXHRsb2ZmX3QgcmV0O1xuIFxuLVx0QlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTtcbiYjNDM7XHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcbiBcbiBcdC8qXG4gXHQgKiBXZSB3YW50IHRvIHJlYWQgYXQgbGVhc3QgJiMzOTtmdWxsX3BhZ2UmIzM5OyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiBcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiBcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiBcdCAqL1xuLVx0c3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7XG4mIzQzO1x0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcbiBcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiAmIzQzOyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gXG4gXHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbkBAIC0yNjcsOSAmIzQzOzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0fVxuIFx0XHRlcnIgPSAwO1xuIFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbi1cdFx0XHRcdFx0ICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuIFx0XHRwb2Zmc2V0ICYjNDM7PSByZXQ7XG4tXHRcdHBhZ2VzICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdFx0Zm9saW9zICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuQEAgLTI4OSw5ICYjNDM7MjkxLDExIEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0Y3N0YXJ0X2Jsb2NrJiM0MzsmIzQzOztcbiBcdH1cbiBcbi1cdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqcGFnZXMpIHtcbi1cdFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XG4tXHRcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xuJiM0MztcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuJiM0MztcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHR9XG4gXHRicmVsc2UoYmgpO1xuIFx0cmV0dXJuIDA7XG5AQCAtMzEyLDcgJiM0MzszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cbiBcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG4gXHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbi1cdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4mIzQzO1x0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gXG4gXHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuQEAgLTMzNiwzMyAmIzQzOzM0MCwzOCBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRmdWxsX3BhZ2UgPSAwO1xuIFx0XHRwY291bnQgPSAxO1xuIFx0fVxuLVx0cGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLFxuLVx0XHRcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuLVx0aWYgKCFwYWdlcykge1xuJiM0MztcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuJiM0MztcdFx0XHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XG4mIzQzO1x0aWYgKCFmb2xpb3MpIHtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRwYWdlc1tmdWxsX3BhZ2VdID0gXHUwMDI2Zm9saW8tXHUwMDNlcGFnZTtcbiYjNDM7XHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgaW5kZXgpO1xuJiM0MztcdFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXG4mIzQzO1x0XHRcdFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxuJiM0MztcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuJiM0MztcdFx0aWYgKElTX0VSUihmb2xpb3NbaV0pKVxuJiM0MztcdFx0XHRmb2xpb3NbaV0gPSBOVUxMO1xuIFx0fVxuIFxuLVx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7XG4mIzQzO1x0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuIFxuLVx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi9cbiYjNDM7XHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKHBhZ2VzW2ldKSB7XG4tXHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pO1xuLVx0XHRcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHRcdGlmIChmb2xpb3NbaV0pIHtcbiYjNDM7XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHRcdFx0XHRmb2xpb19wdXQoZm9saW9zW2ldKTtcbiBcdFx0fVxuLVx0fVx0XHRcdFxuJiM0MztcdH1cbiBcbiBcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcJiMzNDtjcml0aWNhbFwmIzM0OyBwYWdlICovXG4tXHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0a2ZyZWUoZm9saW9zKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lTTzk2NjBfRlMmIzM0OywKICAgICYjMzQ7WklTT0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7emlzb2ZzX3JlYWRfZm9saW8mIzM0OywKICAgICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywKICAgICYjMzQ7emlzb2ZzX3VuY29tcHJlc3NfYmxvY2smIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgemlzb2ZzICh0cmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaW4gSVNPOTY2MCBmaWxlc3lzdGVtKSBmcm9tIHBhZ2UtYmFzZWQgQVBJcyB0byBmb2xpby1iYXNlZCBBUElzIGFjcm9zcyB6aXNvZnNfcmVhZF9mb2xpbywgemlzb2ZzX2ZpbGxfcGFnZXMsIGFuZCB6aXNvZnNfdW5jb21wcmVzc19ibG9jay4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgZmlsZXN5c3RlbSBhbmQgcGFnZSBjYWNoZSBkZWNvbXByZXNzaW9uIGxvZ2ljIHRoYXQgY2FuIGJlIGV4ZXJjaXNlZCBieSBtb3VudGluZyBhbmQgcmVhZGluZyBjb21wcmVzc2VkIElTTyBpbWFnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgNyAxOToyNTozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMgYi9mcy9pc29mcy9jb21wcmVzcy5jCmluZGV4IGY5ODY5ZDYyYjg1MDkuLjJkMjNhYmFlYjg3NDIgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvaXNvZnMvY29tcHJlc3MuYwpAQCAtMzksNyAmIzQzOzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTsKICAqLwogc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAJCQkJICAgICAgbG9mZl90IGJsb2NrX2VuZCwgaW50IHBjb3VudCwKLQkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LAogCQkJCSAgICAgIGludCAqZXJycCkKIHsKIAl1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktJmd0O2lfZm9ybWF0X3Bhcm1bMV07CkBAIC02NiwxMSAmIzQzOzY2LDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCWlmIChibG9ja19zaXplID09IDApIHsKIAkJZm9yICggaSA9IDAgOyBpICZsdDsgcGNvdW50IDsgaSYjNDM7JiM0MzsgKSB7CiAJCQl1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0OwomIzQzOwkJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07CiAKLQkJCWlmICghcGFnZXNbaV0pCiYjNDM7CQkJaWYgKCFmb2xpbykKIAkJCQljb250aW51ZTsKLQkJCW1lbXplcm9fcGFnZShwYWdlc1tpXSwgb2ZmLCBQQUdFX1NJWkUgLSBvZmYpOwotCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2ldKTsKJiM0MzsJCQlmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTsKJiM0MzsJCQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAkJfQogCQlyZXR1cm4gKCgobG9mZl90KXBjb3VudCkgJmx0OyZsdDsgUEFHRV9TSElGVCkgLSBwb2Zmc2V0OwogCX0KQEAgLTExOSwxMSAmIzQzOzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAogCXdoaWxlIChjdXJwYWdlICZsdDsgcGNvdW50ICZhbXA7JmFtcDsgY3VyYmggJmx0OyBoYXZlYmxvY2tzICZhbXA7JmFtcDsKIAkgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHsKJiM0MzsJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07CiYjNDM7CiAJCWlmICghc3RyZWFtLmF2YWlsX291dCkgewotCQkJaWYgKHBhZ2VzW2N1cnBhZ2VdKSB7Ci0JCQkJc3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKQotCQkJCQkJJiM0MzsgcG9mZnNldDsKLQkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFIC0gcG9mZnNldDsKJiM0MzsJCQlpZiAoZm9saW8pIHsKJiM0MzsJCQkJc3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7CiYjNDM7CQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7CiAJCQkJcG9mZnNldCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCXN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopJmFtcDt6aXNvZnNfc2lua19wYWdlOwpAQCAtMTczLDkgJiM0MzsxNzUsOSBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAogCQlpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHsKIAkJCS8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi8KLQkJCWlmIChwYWdlc1tjdXJwYWdlXSkgewotCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTsKLQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZXNbY3VycGFnZV0pOwomIzQzOwkJCWlmIChmb2xpbykgewomIzQzOwkJCQlmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pOwomIzQzOwkJCQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAkJCX0KIAkJCWlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7CiAJCQkJa3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7CkBAIC0yMDYsNyAmIzQzOzIwOCw3IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLgogICovCiBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCi0JCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7CQkJICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpCiB7CiAJbG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjsKIAlsb2ZmX3QgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKQEAgLTIyMSwxNCAmIzQzOzIyMywxNCBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJaW50IGVycjsKIAlsb2ZmX3QgcmV0OwogCi0JQlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTsKJiM0MzsJQlVHX09OKCFmb2xpb3NbZnVsbF9wYWdlXSk7CiAKIAkvKgogCSAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAmIzM5O2Z1bGxfcGFnZSYjMzk7IHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0bwogCSAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmcKIAkgKiBwYWdlcyB3aXRoIHRoZSBkYXRhIHdlIGhhdmUgYW55d2F5Li4uCiAJICovCi0Jc3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7CiYjNDM7CXN0YXJ0X29mZiA9IGZvbGlvX3Bvcyhmb2xpb3NbZnVsbF9wYWdlXSk7CiAJZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICYjNDM7IFBBR0VfU0laRSwgaW5vZGUtJmd0O2lfc2l6ZSk7CiAKIAljc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgJmd0OyZndDsgemlzb2ZzX2Jsb2NrX3NoaWZ0OwpAQCAtMjY3LDkgJiM0MzsyNjksOSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJCX0KIAkJZXJyID0gMDsKIAkJcmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsCi0JCQkJCSAgICAgIHBjb3VudCwgcGFnZXMsIHBvZmZzZXQsICZhbXA7ZXJyKTsKJiM0MzsJCQkJCSAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCAmYW1wO2Vycik7CiAJCXBvZmZzZXQgJiM0Mzs9IHJldDsKLQkJcGFnZXMgJiM0Mzs9IHBvZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJCWZvbGlvcyAmIzQzOz0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlwY291bnQgLT0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlmdWxsX3BhZ2UgLT0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlwb2Zmc2V0ICZhbXA7PSB+UEFHRV9NQVNLOwpAQCAtMjg5LDkgJiM0MzsyOTEsMTEgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LAogCQljc3RhcnRfYmxvY2smIzQzOyYjNDM7OwogCX0KIAotCWlmIChwb2Zmc2V0ICZhbXA7JmFtcDsgKnBhZ2VzKSB7Ci0JCW1lbXplcm9fcGFnZSgqcGFnZXMsIHBvZmZzZXQsIFBBR0VfU0laRSAtIHBvZmZzZXQpOwotCQlTZXRQYWdlVXB0b2RhdGUoKnBhZ2VzKTsKJiM0MzsJaWYgKHBvZmZzZXQgJmFtcDsmYW1wOyAqZm9saW9zKSB7CiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvczsKJiM0MzsKJiM0MzsJCWZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIHBvZmZzZXQsIGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldCk7CiYjNDM7CQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAl9CiAJYnJlbHNlKGJoKTsKIAlyZXR1cm4gMDsKQEAgLTMxMiw3ICYjNDM7MzE2LDcgQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAl1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPQogCQlQQUdFX1NISUZUICZsdDs9IHppc29mc19ibG9ja19zaGlmdCA/CiAJCSgxICZsdDsmbHQ7ICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwOwotCXN0cnVjdCBwYWdlICoqcGFnZXM7CiYjNDM7CXN0cnVjdCBmb2xpbyAqKmZvbGlvczsKIAlwZ29mZl90IGluZGV4ID0gZm9saW8tJmd0O2luZGV4LCBlbmRfaW5kZXg7CiAKIAllbmRfaW5kZXggPSAoaW5vZGUtJmd0O2lfc2l6ZSAmIzQzOyBQQUdFX1NJWkUgLSAxKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwpAQCAtMzM2LDMzICYjNDM7MzQwLDM4IEBAIHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJCWZ1bGxfcGFnZSA9IDA7CiAJCXBjb3VudCA9IDE7CiAJfQotCXBhZ2VzID0ga3phbGxvY19vYmpzKCpwYWdlcywKLQkJCSAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpOwotCWlmICghcGFnZXMpIHsKJiM0MzsJZm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsCiYjNDM7CQkJICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpOwomIzQzOwlpZiAoIWZvbGlvcykgewogCQlmb2xpb191bmxvY2soZm9saW8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcGFnZXNbZnVsbF9wYWdlXSA9ICZhbXA7Zm9saW8tJmd0O3BhZ2U7CiYjNDM7CWZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7Ci0JCWlmIChpICE9IGZ1bGxfcGFnZSkKLQkJCXBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChtYXBwaW5nLCBpbmRleCk7CiYjNDM7CQlpZiAoaSA9PSBmdWxsX3BhZ2UpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LAomIzQzOwkJCQlGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsCiYjNDM7CQkJCW1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOwomIzQzOwkJaWYgKElTX0VSUihmb2xpb3NbaV0pKQomIzQzOwkJCWZvbGlvc1tpXSA9IE5VTEw7CiAJfQogCi0JZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7CiYjNDM7CWVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTsKIAotCS8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIHBhZ2VzLCBkbyBub3QgU2V0UGFnZVVwdG9kYXRlICovCiYjNDM7CS8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqLwogCWZvciAoaSA9IDA7IGkgJmx0OyBwY291bnQ7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlc1tpXSkgewotCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOwotCQkJdW5sb2NrX3BhZ2UocGFnZXNbaV0pOwomIzQzOwkJaWYgKGZvbGlvc1tpXSkgewomIzQzOwkJCWZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pOwomIzQzOwkJCWZvbGlvX3VubG9jayhmb2xpb3NbaV0pOwogCQkJaWYgKGkgIT0gZnVsbF9wYWdlKQotCQkJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKJiM0MzsJCQkJZm9saW9fcHV0KGZvbGlvc1tpXSk7CiAJCX0KLQl9CQkJCiYjNDM7CX0KIAogCS8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSAmIzM0O2NyaXRpY2FsJiMzNDsgcGFnZSAqLwotCWtmcmVlKHBhZ2VzKTsKJiM0MzsJa2ZyZWUoZm9saW9zKTsKIAlyZXR1cm4gZXJyOwogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwMjEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxNzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBMaW51eCBLZXJuZWwgUGF0Y2ggRXZhbHVhdGlvbiBSZXF1ZXN0KioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCBhIHJlcXVlc3QgaGVyZSB0byBldmFsdWF0ZSBhIHBhdGNoIHNlcmllcyBmb3IgdGhlIExpbnV4IGtlcm5lbCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIE15IGZpcnN0IHByaW9yaXR5IGlzIGFsd2F5cyBzYWZldHksIHNvIEkmIzM5O20gaW1tZWRpYXRlbHkgcnVubmluZyBhIHF1aWNrIHJpc2sgYXNzZXNzbWVudC4gQmFzZWQgb24gdGhlIHVzZXImIzM5O3MgZnJhbWluZywgdGhpcyBhcHBlYXJzIHRvIGJlIGEgc3RhbmRhcmQgcmVxdWVzdCDigJMgY29kZSByZXZpZXcsIHNlY3VyaXR5IFFBLCB0eXBpY2FsIExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuYWx5c2lzLiBObyByZWQgZmxhZ3Mgc28gZmFyLiBUaGlzIGZlZWxzIGxpa2UgYSBiZW5pZ24gUUEgb3IgcGF0Y2ggYW5hbHlzaXMgdGFzay4gTXkgam9iIGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjaGFuZ2VzIGFjdHVhbGx5IG1vZGlmeSByZWFjaGFibGUgY29kZSB0aGF0JiMzOTtzIHdvcnRoIGZ1enppbmcuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYW5kIHBvdGVudGlhbCBmb2N1cyBzeW1ib2xzIHRvIGd1aWRlIG15IGFuYWx5c2lzLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBzcGVjaWZpY3MuIEkmIzM5O2xsIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29kZSBpbiBgZnMvaXNvZnMvY29tcHJlc3MuY2AgaXRzZWxmLiBJIG5lZWQgdG8gY3Jvc3MtcmVmZXJlbmNlIHRoYXQgd2l0aCB0aGUgcmVsZXZhbnQgS2NvbmZpZyBmaWxlcy4gSSYjMzk7bGwgY2hlY2sgYm90aCBgZnMvaXNvZnMvS2NvbmZpZ2AgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBtb3JlIGdlbmVyYWwgYGZzL0tjb25maWdgIHRvIHVuZGVyc3RhbmQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY29udHJvbCB0aGUgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGNvZGUgaXMgYWN0dWFsbHkgdXNlZCBpbiBhIGZ1enphYmxlIGVudmlyb25tZW50LiBJJiMzOTttIHJlYWR5IHRvIGJlZ2luIHRoZSBkZWVwIGRpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aXNvZnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9pc29mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtcbkZ1bGwgb3V0cHV0IGlzIHRvbyBsb25nLCBzaG93aW5nIDUwMCBvdXQgb2YgOTM4IGxpbmVzLlxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxuXG5mcy9pc29mcy9LY29uZmlnPTI9Y29uZmlnIElTTzk2NjBfRlNcbi0tXG5mcy9pc29mcy9LY29uZmlnLTExLVx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcbmZzL2lzb2ZzL0tjb25maWc6MTI6XHQgIFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pc29mcy5yc3RcdTAwM2UgYW5kIHRoZSBDRC1ST00tSE9XVE8sXG5mcy9pc29mcy9LY29uZmlnLTEzLVx0ICBhdmFpbGFibGUgZnJvbSBcdTAwM2NodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0b1x1MDAzZSksIHRoZXJlYnlcbi0tXG5mcy9pc29mcy9LY29uZmlnLTE2LVx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXG5mcy9pc29mcy9LY29uZmlnOjE3Olx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXNvZnMuXG5mcy9pc29mcy9LY29uZmlnLTE4LVxuLS1cbmZzL2lzb2ZzL0tjb25maWc9MzE9Y29uZmlnIFpJU09GU1xuLS1cbmZzL2lzb2ZzL0tjb25maWctMzgtXHQgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWVcbmZzL2lzb2ZzL0tjb25maWc6Mzk6XHQgIFx1MDAzY2h0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvZnMvemlzb2ZzL1x1MDAzZSBmb3IgdGhlIHRvb2xzXG5mcy9pc29mcy9LY29uZmlnLTQwLVx0ICBuZWNlc3NhcnkgdG8gY3JlYXRlIHN1Y2ggYSBmaWxlc3lzdGVtLiAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZVxuLS1cbmZzL2lzb2ZzL01ha2VmaWxlLTItI1xuZnMvaXNvZnMvTWFrZWZpbGU6MzojIE1ha2VmaWxlIGZvciB0aGUgTGludXggaXNvZnMgZmlsZXN5c3RlbSByb3V0aW5lcy5cbmZzL2lzb2ZzL01ha2VmaWxlLTQtI1xuZnMvaXNvZnMvTWFrZWZpbGUtNS1cbmZzL2lzb2ZzL01ha2VmaWxlOjY6b2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpICYjNDM7PSBpc29mcy5vXG5mcy9pc29mcy9NYWtlZmlsZS03LVxuZnMvaXNvZnMvTWFrZWZpbGU6ODppc29mcy15IFx0XHQ6PSBuYW1laS5vIGlub2RlLm8gZGlyLm8gdXRpbC5vIHJvY2subyBleHBvcnQub1xuZnMvaXNvZnMvTWFrZWZpbGU6OTppc29mcy0kKENPTkZJR19KT0xJRVQpXHQmIzQzOz0gam9saWV0Lm9cbmZzL2lzb2ZzL01ha2VmaWxlOjEwOmlzb2ZzLSQoQ09ORklHX1pJU09GUylcdCYjNDM7PSBjb21wcmVzcy5vXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy04LS8qXG5mcy9pc29mcy9jb21wcmVzcy5jOjk6ICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuY1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMC0gKlxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjEtXG5mcy9pc29mcy9jb21wcmVzcy5jOjIyOiNpbmNsdWRlIFwmIzM0O2lzb2ZzLmhcJiMzNDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM6I2luY2x1ZGUgXCYjMzQ7emlzb2ZzLmhcJiMzNDtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQtXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjY6c3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX1NJWkVdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNy1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxLSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMjpzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNC1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2LSAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xuZnMvaXNvZnMvY29tcHJlc3MuYzozNzogKiB0byBvbmUgemlzb2ZzIGJsb2NrLiBTdG9yZSB0aGUgZGF0YSBpbiB0aGUgQHBhZ2VzIGFycmF5IHdpdGggQHBjb3VudFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOC0gKiBlbnRyaWVzLiBTdGFydCBzdG9yaW5nIGF0IG9mZnNldCBAcG9mZnNldCBvZiB0aGUgZmlyc3QgcGFnZS5cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzktICovXG5mcy9pc29mcy9jb21wcmVzcy5jOjQwOnN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuZnMvaXNvZnMvY29tcHJlc3MuYy00MS1cdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy00NC17XG5mcy9pc29mcy9jb21wcmVzcy5jOjQ1Olx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5mcy9pc29mcy9jb21wcmVzcy5jLTQ2LVx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy02MC1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6NjE6XHRpZiAoYmxvY2tfc2l6ZSBcdTAwM2UgZGVmbGF0ZUJvdW5kKDFVTCBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSkge1xuZnMvaXNvZnMvY29tcHJlc3MuYy02Mi1cdFx0KmVycnAgPSAtRUlPO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtODUtXHR9XG5mcy9pc29mcy9jb21wcmVzcy5jOjg2Olx0aGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrbnVtLCBiaHMsIG5lZWRibG9ja3MpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy04Ny1cdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwNi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3Olx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA4Olx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA5LVx0XHRcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cdFx0XHQqZXJycCA9IC1FSU87XG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNy1cdFx0XHQgICAgICAgemVycik7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXHRcdFx0fSBlbHNlIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTMxOlx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzItXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTYxLVx0XHRcdFx0XHRwcmludGsoS0VSTl9ERUJVR1xuZnMvaXNvZnMvY29tcHJlc3MuYzoxNjI6XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVx0XHRcdH1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTgyOlx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVx0emxpYl9pbmZsYXRlRW5kKFx1MDAyNnN0cmVhbSk7XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTYtel9laW86XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcdG11dGV4X3VubG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjA5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM3Olx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM4Olx0XHRcdFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTIzOS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XHRcdCgoY3N0YXJ0X2Jsb2NrIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFx1MDAyNiBQQUdFX01BU0spKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ2LVx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgJiM0MzsgY3N0YXJ0X2Jsb2NrKSBcdTAwM2NcdTAwM2MgMjtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQ3Olx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNDgtXHRpZiAoIWJoKVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjU5LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNjA6XHRcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNjEtXHRcdFx0aWYgKCFiaClcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3MC1cdFx0ZXJyID0gMDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjcxOlx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjcyLVx0XHRcdFx0XHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzA5OnN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxMC17XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTQtXHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTc6XHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE5LVx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzMxLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XHRpZiAoUEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCkge1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXHRcdC8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmVcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVx0XHQgICB3ZSBtdXN0IGRvLiAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XHRcdGZ1bGxfcGFnZSA9IGluZGV4IFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM2Olx0XHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzc6XHRcdFx0ZW5kX2luZGV4IC0gKGluZGV4IFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVx0XHRpbmRleCAtPSBmdWxsX3BhZ2U7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNDMtXHRmb2xpb3MgPSBremFsbG9jX29ianMoKmZvbGlvcyxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0Olx0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQ1LVx0aWYgKCFmb2xpb3MpIHtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2MC1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzYxOlx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjItXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3ODpjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHppc29mc19hb3BzID0ge1xuZnMvaXNvZnMvY29tcHJlc3MuYzozNzk6XHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODAtXHQvKiBObyBibWFwIG9wZXJhdGlvbiBzdXBwb3J0ZWQgKi9cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4Mi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzgzOmludCBfX2luaXQgemlzb2ZzX2luaXQodm9pZClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg1Olx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2Olx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg3LVx0XHRyZXR1cm4gLUVOT01FTTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzkyOnZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzkzLXtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0Olx0dmZyZWUoemlzb2ZzX3psaWJfd29ya3NwYWNlKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzk1LX1cbi0tXG5mcy9pc29mcy9kaXIuYy0yLS8qXG5mcy9pc29mcy9kaXIuYzozOiAqICBsaW51eC9mcy9pc29mcy9kaXIuY1xuZnMvaXNvZnMvZGlyLmMtNC0gKlxuLS1cbmZzL2lzb2ZzL2Rpci5jLTExLSAqXG5mcy9pc29mcy9kaXIuYzoxMjogKiAgaXNvZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9uc1xuZnMvaXNvZnMvZGlyLmMtMTMtICovXG4tLVxuZnMvaXNvZnMvZGlyLmMtMTYtI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG5mcy9pc29mcy9kaXIuYzoxNzojaW5jbHVkZSBcJiMzNDtpc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9kaXIuYy0xOC0jaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlYXR0ci5oXHUwMDNlXG5mcy9pc29mcy9kaXIuYy0xOS1cbmZzL2lzb2ZzL2Rpci5jOjIwOmludCBpc29mc19uYW1lX3RyYW5zbGF0ZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLCBjaGFyICpuZXcsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9pc29mcy9kaXIuYy0yMS17XG4tLVxuZnMvaXNvZnMvZGlyLmM9NTM9aW50IGdldF9hY29ybl9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLFxuLS1cbmZzL2lzb2ZzL2Rpci5jLTU3LVx0dW5zaWduZWQgY2hhciAqY2hyO1xuZnMvaXNvZnMvZGlyLmM6NTg6XHRpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTtcbmZzL2lzb2ZzL2Rpci5jLTU5LVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTg0LSAqL1xuZnMvaXNvZnMvZGlyLmM6ODU6c3RhdGljIGludCBkb19pc29mc19yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLFxuZnMvaXNvZnMvZGlyLmMtODYtXHRcdHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LFxuLS1cbmZzL2lzb2ZzL2Rpci5jLTk4LVx0c3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTtcbmZzL2lzb2ZzL2Rpci5jOjk5Olx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuZnMvaXNvZnMvZGlyLmMtMTAwLVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTEwNy1cdFx0aWYgKCFiaCkge1xuZnMvaXNvZnMvZGlyLmM6MTA4Olx0XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrKTtcbmZzL2lzb2ZzL2Rpci5jLTEwOS1cdFx0XHRpZiAoIWJoKVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTEzNS1cbmZzL2lzb2ZzL2Rpci5jOjEzNjpcdFx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBvZmZzZXRfc2F2ZWQsIGJ1ZnNpemUpKSB7XG5mcy9pc29mcy9kaXIuYy0xMzctXHRcdFx0cHJpbnRrKEtFUk5fTk9USUNFIFwmIzM0O2lzbzk2NjA6IENvcnJ1cHRlZCBkaXJlY3RvcnkgZW50cnlcJiMzNDtcbi0tXG5mcy9pc29mcy9kaXIuYy0xNDQtXHRcdGlmIChmaXJzdF9kZSkge1xuZnMvaXNvZnMvZGlyLmM6MTQ1Olx0XHRcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLFxuZnMvaXNvZnMvZGlyLmMtMTQ2LVx0XHRcdFx0XHRcdFx0XHUwMDI2YmxvY2tfc2F2ZWQsXG5mcy9pc29mcy9kaXIuYy0xNDctXHRcdFx0XHRcdFx0XHRcdTAwMjZvZmZzZXRfc2F2ZWQpO1xuZnMvaXNvZnMvZGlyLmM6MTQ4Olx0XHRcdGlub2RlX251bWJlciA9IGlzb2ZzX2dldF9pbm8oYmxvY2tfc2F2ZWQsXG5mcy9pc29mcy9kaXIuYy0xNDktXHRcdFx0XHRcdFx0XHRvZmZzZXRfc2F2ZWQsIGJ1ZmJpdHMpO1xuLS1cbmZzL2lzb2ZzL2Rpci5jLTIxMC1cdFx0XHRpZiAoc2JpLVx1MDAzZXNfbWFwcGluZyA9PSAmIzM5O24mIzM5Oykge1xuZnMvaXNvZnMvZGlyLmM6MjExOlx0XHRcdFx0bGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHRtcG5hbWUsIGlub2RlKTtcbmZzL2lzb2ZzL2Rpci5jLTIxMi1cdFx0XHRcdHAgPSB0bXBuYW1lO1xuLS1cbmZzL2lzb2ZzL2Rpci5jLTIzMS0gKiBoYW5kbGluZyBzcGxpdCBkaXJlY3RvcnkgZW50cmllcy4uIFRoZSByZWFsIHdvcmsgaXMgZG9uZSBieVxuZnMvaXNvZnMvZGlyLmM6MjMyOiAqIFwmIzM0O2RvX2lzb2ZzX3JlYWRkaXIoKVwmIzM0Oy5cbmZzL2lzb2ZzL2Rpci5jLTIzMy0gKi9cbmZzL2lzb2ZzL2Rpci5jOjIzNDpzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuZnMvaXNvZnMvZGlyLmMtMjM1LXtcbi0tXG5mcy9pc29mcy9kaXIuYy0yNDMtXG5mcy9pc29mcy9kaXIuYzoyNDQ6XHRyZXN1bHQgPSBkb19pc29mc19yZWFkZGlyKGlub2RlLCBmaWxlLCBjdHgsIHRtcG5hbWUpO1xuZnMvaXNvZnMvZGlyLmMtMjQ1LVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTI0OS1cbmZzL2lzb2ZzL2Rpci5jOjI1MDppbnQgaXNvZnNfZmlsZWF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGZpbGVfa2F0dHIgKmZhKVxuZnMvaXNvZnMvZGlyLmMtMjUxLXtcbmZzL2lzb2ZzL2Rpci5jOjI1MjpcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkZW50cnktXHUwMDNlZF9zYik7XG5mcy9pc29mcy9kaXIuYy0yNTMtXG4tLVxuZnMvaXNvZnMvZGlyLmMtMjYzLVxuZnMvaXNvZnMvZGlyLmM6MjY0OmNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPVxuZnMvaXNvZnMvZGlyLmMtMjY1LXtcbi0tXG5mcy9pc29mcy9kaXIuYy0yNjctXHQucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsXG5mcy9pc29mcy9kaXIuYzoyNjg6XHQuaXRlcmF0ZV9zaGFyZWQgPSBpc29mc19yZWFkZGlyLFxuZnMvaXNvZnMvZGlyLmMtMjY5LVx0LnNldGxlYXNlID0gZ2VuZXJpY19zZXRsZWFzZSxcbi0tXG5mcy9pc29mcy9kaXIuYy0yNzQtICovXG5mcy9pc29mcy9kaXIuYzoyNzU6Y29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPVxuZnMvaXNvZnMvZGlyLmMtMjc2LXtcbmZzL2lzb2ZzL2Rpci5jOjI3NzpcdC5sb29rdXAgPSBpc29mc19sb29rdXAsXG5mcy9pc29mcy9kaXIuYzoyNzg6XHQuZmlsZWF0dHJfZ2V0ID0gaXNvZnNfZmlsZWF0dHJfZ2V0LFxuZnMvaXNvZnMvZGlyLmMtMjc5LX07XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtMi0vKlxuZnMvaXNvZnMvZXhwb3J0LmM6MzogKiBmcy9pc29mcy9leHBvcnQuY1xuZnMvaXNvZnMvZXhwb3J0LmMtNC0gKlxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE2LVxuZnMvaXNvZnMvZXhwb3J0LmM6MTc6I2luY2x1ZGUgXCYjMzQ7aXNvZnMuaFwmIzM0O1xuZnMvaXNvZnMvZXhwb3J0LmMtMTgtXG5mcy9pc29mcy9leHBvcnQuYz0xOT1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXG5mcy9pc29mcy9leHBvcnQuYzoyMDppc29mc19leHBvcnRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuZnMvaXNvZnMvZXhwb3J0LmMtMjEtXHRcdCAgdW5zaWduZWQgbG9uZyBibG9jayxcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0yOC1cdFx0cmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7XG5mcy9pc29mcy9leHBvcnQuYzoyOTpcdGlub2RlID0gaXNvZnNfaWdldChzYiwgYmxvY2ssIG9mZnNldCk7XG5mcy9pc29mcy9leHBvcnQuYy0zMC1cdGlmIChJU19FUlIoaW5vZGUpKVxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTQyLSAqIGFuZCByZXR1cm4gdGhlIHVuZGVybHlpbmcgaW5vZGUuICBTZWUgdGhlIGNvbW1lbnRzIGZvclxuZnMvaXNvZnMvZXhwb3J0LmM6NDM6ICogaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoKS4gKi9cbmZzL2lzb2ZzL2V4cG9ydC5jOjQ0OnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19leHBvcnRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZClcbmZzL2lzb2ZzL2V4cG9ydC5jLTQ1LXtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy01NS1cdGlmICghU19JU0RJUihjaGlsZF9pbm9kZS1cdTAwM2VpX21vZGUpKSB7XG5mcy9pc29mcy9leHBvcnQuYzo1NjpcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O2lzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiBcJiMzNDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTU3LVx0XHQgICAgICAgXCYjMzQ7Y2hpbGQgaXMgbm90IGEgZGlyZWN0b3J5IVxcblwmIzM0Oyk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtNjUtXHRpZiAoZV9jaGlsZF9pbm9kZS1cdTAwM2VpX2lnZXQ1X29mZnNldCAhPSAwKSB7XG5mcy9pc29mcy9leHBvcnQuYzo2NjpcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O2lzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiBcJiMzNDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTY3LVx0XHQgICAgICAgXCYjMzQ7Y2hpbGQgZGlyZWN0b3J5IG5vdCBub3JtYWxpemVkIVxcblwmIzM0Oyk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtODUtXHRkZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQqKWJoLVx1MDAzZWJfZGF0YTtcbmZzL2lzb2ZzL2V4cG9ydC5jOjg2Olx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCAwLCBjaGlsZF9pbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKSB8fFxuZnMvaXNvZnMvZXhwb3J0LmMtODctXHQgICAgaXNvbnVtXzcxMShkZS1cdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cdTAwM2VuYW1lWzBdICE9IDApIHtcbmZzL2lzb2ZzL2V4cG9ydC5jOjg4Olx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7aXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFwmIzM0Oy5cXFwmIzM0OyBkaXJlY3RvcnkgZm9yIE5GUy5cXG5cJiMzNDspO1xuZnMvaXNvZnMvZXhwb3J0LmMtODktXHRcdHJ2ID0gRVJSX1BUUigtRUFDQ0VTKTtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy05Ny1cdC8qIFZlcmlmeSBpdCBpcyBpbiBmYWN0IHRoZSBcJiMzNDsuLlwmIzM0OyBlbnRyeS4gKi9cbmZzL2lzb2ZzL2V4cG9ydC5jOjk4Olx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBwYXJlbnRfb2Zmc2V0LFxuZnMvaXNvZnMvZXhwb3J0LmMtOTktXHRcdFx0XHQgICAgY2hpbGRfaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSkgfHxcbmZzL2lzb2ZzL2V4cG9ydC5jLTEwMC1cdCAgICBpc29udW1fNzExKGRlLVx1MDAzZW5hbWVfbGVuKSAhPSAxIHx8IGRlLVx1MDAzZW5hbWVbMF0gIT0gMSkge1xuZnMvaXNvZnMvZXhwb3J0LmM6MTAxOlx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7aXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFwmIzM0Oy4uXFxcJiMzNDsgXCYjMzQ7XG5mcy9pc29mcy9leHBvcnQuYy0xMDItXHRcdCAgICAgICBcJiMzNDtkaXJlY3RvcnkgZm9yIE5GUy5cXG5cJiMzNDspO1xuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTEwNy1cdC8qIE5vcm1hbGl6ZSAqL1xuZnMvaXNvZnMvZXhwb3J0LmM6MTA4Olx0aXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsIFx1MDAyNnBhcmVudF9ibG9jaywgXHUwMDI2cGFyZW50X29mZnNldCk7XG5mcy9pc29mcy9leHBvcnQuYy0xMDktXG5mcy9pc29mcy9leHBvcnQuYzoxMTA6XHRydiA9IGRfb2J0YWluX2FsaWFzKGlzb2ZzX2lnZXQoY2hpbGRfaW5vZGUtXHUwMDNlaV9zYiwgcGFyZW50X2Jsb2NrLFxuZnMvaXNvZnMvZXhwb3J0LmMtMTExLVx0XHRcdFx0ICAgICBwYXJlbnRfb2Zmc2V0KSk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmM9MTE4PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2V4cG9ydC5jOjExOTppc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9pc29mcy9leHBvcnQuYy0xMjAtXHRcdCAgICAgICBfX3UzMiAqZmgzMixcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xNjAtXG5mcy9pc29mcy9leHBvcnQuYzoxNjE6c3RydWN0IGlzb2ZzX2ZpZCB7XG5mcy9pc29mcy9leHBvcnQuYy0xNjItXHR1MzIgYmxvY2s7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtMTY5LVxuZnMvaXNvZnMvZXhwb3J0LmM6MTcwOnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19maF90b19kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3MS1cdHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpXG5mcy9pc29mcy9leHBvcnQuYy0xNzIte1xuZnMvaXNvZnMvZXhwb3J0LmM6MTczOlx0c3RydWN0IGlzb2ZzX2ZpZCAqaWZpZCA9IChzdHJ1Y3QgaXNvZnNfZmlkICopZmlkO1xuZnMvaXNvZnMvZXhwb3J0LmMtMTc0LVxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE3Ny1cbmZzL2lzb2ZzL2V4cG9ydC5jOjE3ODpcdHJldHVybiBpc29mc19leHBvcnRfaWdldChzYiwgaWZpZC1cdTAwM2VibG9jaywgaWZpZC1cdTAwM2VvZmZzZXQsXG5mcy9pc29mcy9leHBvcnQuYy0xNzktXHRcdFx0aWZpZC1cdTAwM2VnZW5lcmF0aW9uKTtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xODEtXG5mcy9pc29mcy9leHBvcnQuYzoxODI6c3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2ZoX3RvX3BhcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuZnMvaXNvZnMvZXhwb3J0LmMtMTgzLVx0XHRzdHJ1Y3QgZmlkICpmaWQsIGludCBmaF9sZW4sIGludCBmaF90eXBlKVxuZnMvaXNvZnMvZXhwb3J0LmMtMTg0LXtcbmZzL2lzb2ZzL2V4cG9ydC5jOjE4NTpcdHN0cnVjdCBpc29mc19maWQgKmlmaWQgPSAoc3RydWN0IGlzb2ZzX2ZpZCAqKWZpZDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTE4Ni1cbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xODktXG5mcy9pc29mcy9leHBvcnQuYzoxOTA6XHRyZXR1cm4gaXNvZnNfZXhwb3J0X2lnZXQoc2IsXG5mcy9pc29mcy9leHBvcnQuYy0xOTEtXHRcdFx0ZmhfbGVuIFx1MDAzZSAzID8gaWZpZC1cdTAwM2VwYXJlbnRfYmxvY2sgOiAwLFxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE5NS1cbmZzL2lzb2ZzL2V4cG9ydC5jOjE5Njpjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgaXNvZnNfZXhwb3J0X29wcyA9IHtcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5NzpcdC5lbmNvZGVfZmhcdD0gaXNvZnNfZXhwb3J0X2VuY29kZV9maCxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5ODpcdC5maF90b19kZW50cnlcdD0gaXNvZnNfZmhfdG9fZGVudHJ5LFxuZnMvaXNvZnMvZXhwb3J0LmM6MTk5Olx0LmZoX3RvX3BhcmVudFx0PSBpc29mc19maF90b19wYXJlbnQsXG5mcy9pc29mcy9leHBvcnQuYzoyMDA6XHQuZ2V0X3BhcmVudCAgICAgPSBpc29mc19leHBvcnRfZ2V0X3BhcmVudCxcbmZzL2lzb2ZzL2V4cG9ydC5jLTIwMS19O1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMi0vKlxuZnMvaXNvZnMvaW5vZGUuYzozOiAqICBsaW51eC9mcy9pc29mcy9pbm9kZS5jXG5mcy9pc29mcy9pbm9kZS5jLTQtICpcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTMwLVxuZnMvaXNvZnMvaW5vZGUuYzozMTojaW5jbHVkZSBcJiMzNDtpc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9pbm9kZS5jOjMyOiNpbmNsdWRlIFwmIzM0O3ppc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9pbm9kZS5jLTMzLVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMzgtXG5mcy9pc29mcy9pbm9kZS5jOjM5OnN0YXRpYyBpbnQgaXNvZnNfaGFzaGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XG5mcy9pc29mcy9pbm9kZS5jOjQwOnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy00MS1cdFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSk7XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy00My0jaWZkZWYgQ09ORklHX0pPTElFVFxuZnMvaXNvZnMvaW5vZGUuYzo0NDpzdGF0aWMgaW50IGlzb2ZzX2hhc2hpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpO1xuZnMvaXNvZnMvaW5vZGUuYzo0NTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XG5mcy9pc29mcy9pbm9kZS5jOjQ2OnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy00Ny1cdFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSk7XG5mcy9pc29mcy9pbm9kZS5jOjQ4OnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcF9tcyhjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9pc29mcy9pbm9kZS5jLTQ5LVx0XHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKTtcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTUxLVxuZnMvaXNvZnMvaW5vZGUuYzo1MjpzdGF0aWMgdm9pZCBpc29mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2lzb2ZzL2lub2RlLmMtNTMte1xuZnMvaXNvZnMvaW5vZGUuYzo1NDpcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihzYik7XG5mcy9pc29mcy9pbm9kZS5jLTU1LVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtNjQtXG5mcy9pc29mcy9pbm9kZS5jOjY1OnN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHJlbG9jYXRlZCk7XG5mcy9pc29mcy9pbm9kZS5jOjY2OnN0YXRpYyBpbnQgaXNvZnNfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopO1xuZnMvaXNvZnMvaW5vZGUuYzo2NzpzdGF0aWMgaW50IGlzb2ZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IGRlbnRyeSAqKTtcbmZzL2lzb2ZzL2lub2RlLmMtNjgtXG5mcy9pc29mcy9pbm9kZS5jOjY5OnN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXNvZnNfaW5vZGVfY2FjaGVwO1xuZnMvaXNvZnMvaW5vZGUuYy03MC1cbmZzL2lzb2ZzL2lub2RlLmM6NzE6c3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2lzb2ZzL2lub2RlLmMtNzIte1xuZnMvaXNvZnMvaW5vZGUuYy03My1cdHN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWk7XG5mcy9pc29mcy9pbm9kZS5jOjc0Olx0ZWkgPSBhbGxvY19pbm9kZV9zYihzYiwgaXNvZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbmZzL2lzb2ZzL2lub2RlLmMtNzUtXHRpZiAoIWVpKVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtNzktXG5mcy9pc29mcy9pbm9kZS5jOjgwOnN0YXRpYyB2b2lkIGlzb2ZzX2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2lzb2ZzL2lub2RlLmMtODEte1xuZnMvaXNvZnMvaW5vZGUuYzo4MjpcdGttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTtcbmZzL2lzb2ZzL2lub2RlLmMtODMtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9OTI9c3RhdGljIGludCBfX2luaXQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpXG5mcy9pc29mcy9pbm9kZS5jLTkzLXtcbmZzL2lzb2ZzL2lub2RlLmM6OTQ6XHRpc29mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcJiMzNDtpc29mc19pbm9kZV9jYWNoZVwmIzM0OyxcbmZzL2lzb2ZzL2lub2RlLmMtOTUtXHRcdFx0XHRcdHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLFxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtOTgtXHRcdFx0XHRcdGluaXRfb25jZSk7XG5mcy9pc29mcy9pbm9kZS5jOjk5Olx0aWYgKCFpc29mc19pbm9kZV9jYWNoZXApXG5mcy9pc29mcy9pbm9kZS5jLTEwMC1cdFx0cmV0dXJuIC1FTk9NRU07XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0xMDQ9c3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xMTAtXHRyY3VfYmFycmllcigpO1xuZnMvaXNvZnMvaW5vZGUuYzoxMTE6XHRrbWVtX2NhY2hlX2Rlc3Ryb3koaXNvZnNfaW5vZGVfY2FjaGVwKTtcbmZzL2lzb2ZzL2lub2RlLmMtMTEyLX1cbmZzL2lzb2ZzL2lub2RlLmMtMTEzLVxuZnMvaXNvZnMvaW5vZGUuYzoxMTQ6c3RhdGljIGludCBpc29mc19yZWNvbmZpZ3VyZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG5mcy9pc29mcy9pbm9kZS5jLTExNS17XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xMjEtXG5mcy9pc29mcy9pbm9kZS5jOjEyMjpzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaXNvZnNfc29wcyA9IHtcbmZzL2lzb2ZzL2lub2RlLmM6MTIzOlx0LmFsbG9jX2lub2RlXHQ9IGlzb2ZzX2FsbG9jX2lub2RlLFxuZnMvaXNvZnMvaW5vZGUuYzoxMjQ6XHQuZnJlZV9pbm9kZVx0PSBpc29mc19mcmVlX2lub2RlLFxuZnMvaXNvZnMvaW5vZGUuYzoxMjU6XHQucHV0X3N1cGVyXHQ9IGlzb2ZzX3B1dF9zdXBlcixcbmZzL2lzb2ZzL2lub2RlLmM6MTI2Olx0LnN0YXRmc1x0XHQ9IGlzb2ZzX3N0YXRmcyxcbmZzL2lzb2ZzL2lub2RlLmM6MTI3Olx0LnNob3dfb3B0aW9uc1x0PSBpc29mc19zaG93X29wdGlvbnMsXG5mcy9pc29mcy9pbm9kZS5jLTEyOC19O1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTMwLVxuZnMvaXNvZnMvaW5vZGUuYzoxMzE6c3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBpc29mc19kZW50cnlfb3BzW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTEzMi1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTMzOlx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaGksXG5mcy9pc29mcy9pbm9kZS5jOjEzNDpcdFx0LmRfY29tcGFyZVx0PSBpc29mc19kZW50cnlfY21waSxcbmZzL2lzb2ZzL2lub2RlLmMtMTM1LVx0fSxcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTEzNy1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTM4Olx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaF9tcyxcbmZzL2lzb2ZzL2lub2RlLmM6MTM5Olx0XHQuZF9jb21wYXJlXHQ9IGlzb2ZzX2RlbnRyeV9jbXBfbXMsXG5mcy9pc29mcy9pbm9kZS5jLTE0MC1cdH0sXG5mcy9pc29mcy9pbm9kZS5jLTE0MS1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTQyOlx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaGlfbXMsXG5mcy9pc29mcy9pbm9kZS5jOjE0MzpcdFx0LmRfY29tcGFyZVx0PSBpc29mc19kZW50cnlfY21waV9tcyxcbmZzL2lzb2ZzL2lub2RlLmMtMTQ0LVx0fSxcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE0Ny1cbmZzL2lzb2ZzL2lub2RlLmM6MTQ4OnN0cnVjdCBpc29mc19vcHRpb25ze1xuZnMvaXNvZnMvaW5vZGUuYy0xNDktXHR1bnNpZ25lZCBpbnQgcm9jazoxO1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTcxLS8qXG5mcy9pc29mcy9pbm9kZS5jOjE3MjogKiBDb21wdXRlIHRoZSBoYXNoIGZvciB0aGUgaXNvZnMgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuXG5mcy9pc29mcy9pbm9kZS5jLTE3My0gKi9cbmZzL2lzb2ZzL2lub2RlLmM9MTc0PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6MTc1Omlzb2ZzX2hhc2hpX2NvbW1vbihjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyLCBpbnQgbXMpXG5mcy9pc29mcy9pbm9kZS5jLTE3Ni17XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xOTktLypcbmZzL2lzb2ZzL2lub2RlLmM6MjAwOiAqIENvbXBhcmUgb2YgdHdvIGlzb2ZzIG5hbWVzLlxuZnMvaXNvZnMvaW5vZGUuYy0yMDEtICovXG5mcy9pc29mcy9pbm9kZS5jOjIwMjpzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBfY29tbW9uKFxuZnMvaXNvZnMvaW5vZGUuYy0yMDMtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0cixcbi0tXG5mcy9pc29mcy9pbm9kZS5jPTIyOT1zdGF0aWMgaW50XG5mcy9pc29mcy9pbm9kZS5jOjIzMDppc29mc19oYXNoaShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKVxuZnMvaXNvZnMvaW5vZGUuYy0yMzEte1xuZnMvaXNvZnMvaW5vZGUuYzoyMzI6XHRyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMCk7XG5mcy9pc29mcy9pbm9kZS5jLTIzMy19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yMzU9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyMzY6aXNvZnNfZGVudHJ5X2NtcGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yMzctXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTIzOC17XG5mcy9pc29mcy9pbm9kZS5jOjIzOTpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMCwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI0MC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0yNDMtLypcbmZzL2lzb2ZzL2lub2RlLmM6MjQ0OiAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS5cbmZzL2lzb2ZzL2lub2RlLmMtMjQ1LSAqL1xuZnMvaXNvZnMvaW5vZGUuYz0yNDY9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyNDc6aXNvZnNfaGFzaF9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxuZnMvaXNvZnMvaW5vZGUuYy0yNDgte1xuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MjY0PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6MjY1Omlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcbmZzL2lzb2ZzL2lub2RlLmMtMjY2LXtcbmZzL2lzb2ZzL2lub2RlLmM6MjY3Olx0cmV0dXJuIGlzb2ZzX2hhc2hfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI2OC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yNzA9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyNzE6aXNvZnNfaGFzaGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcbmZzL2lzb2ZzL2lub2RlLmMtMjcyLXtcbmZzL2lzb2ZzL2lub2RlLmM6MjczOlx0cmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDEpO1xuZnMvaXNvZnMvaW5vZGUuYy0yNzQtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9Mjc2PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6Mjc3Omlzb2ZzX2RlbnRyeV9jbXBfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yNzgtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTI3OS17XG5mcy9pc29mcy9pbm9kZS5jOjI4MDpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMCk7XG5mcy9pc29mcy9pbm9kZS5jLTI4MS19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yODM9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyODQ6aXNvZnNfZGVudHJ5X2NtcGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yODUtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTI4Ni17XG5mcy9pc29mcy9pbm9kZS5jOjI4NzpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI4OC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yOTE9ZW51bSB7XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0yOTctXG5mcy9pc29mcy9pbm9kZS5jOjI5ODpzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN0YW50X3RhYmxlIGlzb2ZzX3BhcmFtX21hcFtdID0ge1xuZnMvaXNvZnMvaW5vZGUuYy0yOTktXHR7XCYjMzQ7YWNvcm5cJiMzNDssXHQmIzM5O2EmIzM5O30sXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0zMDctXG5mcy9pc29mcy9pbm9kZS5jOjMwODpzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN0YW50X3RhYmxlIGlzb2ZzX3BhcmFtX2NoZWNrW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTMwOS1cdHtcJiMzNDtyZWxheGVkXCYjMzQ7LFx0JiMzOTtyJiMzOTt9LFxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMzE1LVxuZnMvaXNvZnMvaW5vZGUuYzozMTY6c3RhdGljIGNvbnN0IHN0cnVjdCBmc19wYXJhbWV0ZXJfc3BlYyBpc29mc19wYXJhbV9zcGVjW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTMxNy1cdGZzcGFyYW1fZmxhZ1x0KFwmIzM0O25vcm9ja1wmIzM0OyxcdFx0T3B0X25vcm9jayksXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0zMjQtXHRmc3BhcmFtX3N0cmluZ1x0KFwmIzM0O2lvY2hhcnNldFwmIzM0OyxcdFx0T3B0X2lvY2hhcnNldCksXG5mcy9pc29mcy9pbm9kZS5jOjMyNTpcdGZzcGFyYW1fZW51bVx0KFwmIzM0O21hcFwmIzM0OyxcdFx0XHRPcHRfbWFwLCBpc29mc19wYXJhbV9tYXApLFxuZnMvaXNvZnMvaW5vZGUuYy0zMjYtXHRmc3BhcmFtX3UzMlx0KFwmIzM0O3Nlc3Npb25cJiMzNDssXHRcdE9wdF9zZXNzaW9uKSxcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MjEyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBoYXZpbmcgaXQ6CgoqKkRpZ2dpbmcgaW50byB0aGUgSVNPRlMgQ29uZmlndXJhdGlvbioqCgpSaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmVjaXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5IGZvciB0aGUgWklTT0ZTIGFuZCB0aGUgYnJvYWRlciBJU085NjYwIGZpbGUgc3lzdGVtIHN1cHBvcnQuIFRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0LCBhcyBhbHdheXMsIGlzIHRoZSBgS2NvbmZpZ2AgZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSYjMzk7cyBzb3VyY2UgZGlyZWN0b3J5LiBTcGVjaWZpY2FsbHksIGBmcy9pc29mcy9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtsbCBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgYFpJU09GU2AgYW5kIGBJU085NjYwX0ZTYCwgdGhlIGtleSB2YXJpYWJsZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBJJiMzOTtsbCBwb3JlIG92ZXIgdGhhdCB0byBnZXQgdGhlIGRlZmluaXRpdmUgcGljdHVyZSBvZiB3aGF0JiMzOTtzIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgd2hhdCB0aGUgZGVwZW5kZW5jaWVzIGFyZS4gSXQmIzM5O3MgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGJ1aWx0IGFuZCBjb25maWd1cmVkIGluIHRoaXMga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBJU085NjYwX0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtJU08gOTY2MCBDRFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0XCYjMzQ7XG4gICA0Olx0XHRzZWxlY3QgQlVGRkVSX0hFQURcbiAgIDU6XHRcdGhlbHBcbiAgIDY6XHRcdCAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gdXNlZCBvbiBDRC1ST01zLiAgSXQgd2FzIHByZXZpb3VzbHlcbiAgIDc6XHRcdCAga25vd24gYXMgXCYjMzQ7SGlnaCBTaWVycmEgRmlsZSBTeXN0ZW1cJiMzNDsgYW5kIGlzIGNhbGxlZCBcJiMzNDtoc2ZzXCYjMzQ7IG9uIG90aGVyXG4gICA4Olx0XHQgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvclxuICAgOTpcdFx0ICBsb25nIFVuaXggZmlsZW5hbWVzIGFuZCBzeW1ib2xpYyBsaW5rcyBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhpc1xuICAxMDpcdFx0ICBkcml2ZXIuICBJZiB5b3UgaGF2ZSBhIENELVJPTSBkcml2ZSBhbmQgd2FudCB0byBkbyBtb3JlIHdpdGggaXQgdGhhblxuICAxMTpcdFx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcbiAgMTI6XHRcdCAgXHUwMDNjZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnJzdFx1MDAzZSBhbmQgdGhlIENELVJPTS1IT1dUTyxcbiAgMTM6XHRcdCAgYXZhaWxhYmxlIGZyb20gXHUwMDNjaHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG9cdTAwM2UpLCB0aGVyZWJ5XG4gIDE0Olx0XHQgIGVubGFyZ2luZyB5b3VyIGtlcm5lbCBieSBhYm91dCAyNyBLQjsgb3RoZXJ3aXNlIHNheSBOLlxuICAxNTpcdFxuICAxNjpcdFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXG4gIDE3Olx0XHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cbiAgMTg6XHRcbiAgMTk6XHRjb25maWcgSk9MSUVUXG4gIDIwOlx0XHRib29sIFwmIzM0O01pY3Jvc29mdCBKb2xpZXQgQ0RST00gZXh0ZW5zaW9uc1wmIzM0O1xuICAyMTpcdFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXG4gIDIyOlx0XHRzZWxlY3QgTkxTXG4gIDIzOlx0XHRoZWxwXG4gIDI0Olx0XHQgIEpvbGlldCBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24gZm9yIHRoZSBJU08gOTY2MCBDRC1ST00gZmlsZSBzeXN0ZW1cbiAgMjU6XHRcdCAgd2hpY2ggYWxsb3dzIGZvciBsb25nIGZpbGVuYW1lcyBpbiB1bmljb2RlIGZvcm1hdCAodW5pY29kZSBpcyB0aGVcbiAgMjY6XHRcdCAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZVxuICAyNzpcdFx0ICBjaGFyYWN0ZXJzIG9mIGFsbW9zdCBhbGwgbGFuZ3VhZ2VzIG9mIHRoZSB3b3JsZDsgc2VlXG4gIDI4Olx0XHQgIFx1MDAzY2h0dHA6Ly93d3cudW5pY29kZS5vcmcvXHUwMDNlIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gIFNheSBZIGhlcmUgaWYgeW91XG4gIDI5Olx0XHQgIHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIEpvbGlldCBDRC1ST01zIHVuZGVyIExpbnV4LlxuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBaSVNPRlNcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBleHRlbnNpb25cJiMzNDtcbiAgMzM6XHRcdGRlcGVuZHMgb24gSVNPOTY2MF9GU1xuICAzNDpcdFx0c2VsZWN0IFpMSUJfSU5GTEFURVxuICAzNTpcdFx0aGVscFxuICAzNjpcdFx0ICBUaGlzIGlzIGEgTGludXgtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIFJvY2tSaWRnZSB3aGljaCBsZXRzIHlvdSBzdG9yZVxuICAzNzpcdFx0ICBkYXRhIGluIGNvbXByZXNzZWQgZm9ybSBvbiBhIENELVJPTSBhbmQgaGF2ZSBpdCB0cmFuc3BhcmVudGx5XG4gIDM4Olx0XHQgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWVcbiAgMzk6XHRcdCAgXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXHUwMDNlIGZvciB0aGUgdG9vbHNcbiAgNDA6XHRcdCAgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBzdWNoIGEgZmlsZXN5c3RlbS4gIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmVcbiAgNDE6XHRcdCAgYWJsZSB0byByZWFkIHN1Y2ggY29tcHJlc3NlZCBDRC1ST01zLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MTgxCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBJU085NjYwIENvbXByZXNzaW9uIENvZGUqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkgd2l0aCBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIEkmIzM5O20gc3RhcnRpbmcgYXQgdGhlIHRvcCwgcm91Z2hseSBsaW5lcyAxIHRvIDQwMC4gVGhhdCYjMzk7cyBhIGdvb2QgY2h1bmssIHByb2JhYmx5IHRoZSBpbml0aWFsIHNldHVwLCBkZWNsYXJhdGlvbnMsIGFuZCBtYXliZSBzb21lIGNvcmUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY29tcHJlc3Npb24uIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgaG93IHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzIGlzIG1hbmFnZWQgaW4gdGhlIElTTzk2NjAgZmlsZXN5c3RlbS4gVGhpbmdzIHRvIGxvb2sgZm9yIGltbWVkaWF0ZWx5IGFyZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBpdCBzdXBwb3J0cywgYW55IGRhdGEgc3RydWN0dXJlcyB1c2VkIHRvIGhvbGQgY29tcHJlc3NlZCBibG9ja3MsIGFuZCBob3cgdGhleSYjMzk7cmUgaWRlbnRpZmllZC4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlbnRyeSBwb2ludHMgZm9yIHRoZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiByb3V0aW5lcyDigJMgdGhlIG9uZXMgdGhhdCBhcmUgY2FsbGVkIHdoZW4gYSBmaWxlIGlzIHdyaXR0ZW4gb3IgcmVhZC4gQXJlIHRoZXkgZGlyZWN0IGNhbGxzIHRvIGxpYnJhcnkgcm91dGluZXMsIG9yIGFyZSB0aGVyZSBpbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9ucz8gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGNydWNpYWwgYml0cyBvZiBjb2RlIHRoYXQgZGVjaWRlIHdoZXRoZXIgY29tcHJlc3Npb24gaXMgZXZlbiAqYXR0ZW1wdGVkKiBvbiBhIHBhcnRpY3VsYXIgZmlsZSDigJMgcHJvYmFibHkgc29tZSBjaGVja3Mgb24gZmlsZSBhdHRyaWJ1dGVzIG9yIGV4dGVuc2lvbnMuIEhvcGVmdWxseSwgSSYjMzk7bGwgcXVpY2tseSBzcG90IGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGFyZWFzIHdoZXJlIGRhdGEgaW50ZWdyaXR5IG1pZ2h0IGJlIGF0IHJpc2suIFRoaXMgYXJlYSwgYXJvdW5kIGxpbmVzIDEtNDAwLCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBJU085NjYwIGltcGxlbWVudGF0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgZmluZCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbiAgIDI6XHQvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gICAzOlx0ICogICBcbiAgIDQ6XHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxuICAgNTpcdCAqXG4gICA2Olx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgIDc6XHRcbiAgIDg6XHQvKlxuICAgOTpcdCAqIGxpbnV4L2ZzL2lzb2ZzL2NvbXByZXNzLmNcbiAgMTA6XHQgKlxuICAxMTpcdCAqIFRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gb2YgZmlsZXMgb24gYW4gaXNvOTY2MCBmaWxlc3lzdGVtXG4gIDEyOlx0ICovXG4gIDEzOlx0XG4gIDE0Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiAgMTU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAgMTY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9iaW8uaFx1MDAzZVxuICAxNzpcdFxuICAxODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAxOTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFx1MDAzZVxuICAyMDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3psaWIuaFx1MDAzZVxuICAyMTpcdFxuICAyMjpcdCNpbmNsdWRlIFwmIzM0O2lzb2ZzLmhcJiMzNDtcbiAgMjM6XHQjaW5jbHVkZSBcJiMzNDt6aXNvZnMuaFwmIzM0O1xuICAyNDpcdFxuICAyNTpcdC8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbiAgMjY6XHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XG4gIDI3Olx0XG4gIDI4Olx0LypcbiAgMjk6XHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxuICAzMDpcdCAqIGFsbG9jYXRpb247IHRoaXMgYXZvaWRzIGZhaWx1cmVzIGF0IGJsb2NrLWRlY29tcHJlc3Npb24gdGltZS5cbiAgMzE6XHQgKi9cbiAgMzI6XHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuICAzMzpcdHN0YXRpYyBERUZJTkVfTVVURVgoemlzb2ZzX3psaWJfbG9jayk7XG4gIDM0Olx0XG4gIDM1Olx0LypcbiAgMzY6XHQgKiBSZWFkIGRhdGEgb2YgQGlub2RlIGZyb20gQGJsb2NrX3N0YXJ0IHRvIEBibG9ja19lbmQgYW5kIHVuY29tcHJlc3NcbiAgMzc6XHQgKiB0byBvbmUgemlzb2ZzIGJsb2NrLiBTdG9yZSB0aGUgZGF0YSBpbiB0aGUgQHBhZ2VzIGFycmF5IHdpdGggQHBjb3VudFxuICAzODpcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxuICAzOTpcdCAqL1xuICA0MDpcdHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuICA0MTpcdFx0XHRcdFx0ICAgICAgbG9mZl90IGJsb2NrX2VuZCwgaW50IHBjb3VudCxcbiAgNDI6XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gIDQzOlx0XHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4gIDQ0Olx0e1xuICA0NTpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gIDQ2Olx0XHR1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTtcbiAgNDc6XHRcdHVuc2lnbmVkIGludCBidWZzaGlmdCA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTtcbiAgNDg6XHRcdHVuc2lnbmVkIGludCBidWZtYXNrID0gYnVmc2l6ZSAtIDE7XG4gIDQ5Olx0XHRpbnQgaSwgYmxvY2tfc2l6ZSA9IGJsb2NrX2VuZCAtIGJsb2NrX3N0YXJ0O1xuICA1MDpcdFx0el9zdHJlYW0gc3RyZWFtID0geyAudG90YWxfb3V0ID0gMCxcbiAgNTE6XHRcdFx0XHQgICAgLmF2YWlsX2luID0gMCxcbiAgNTI6XHRcdFx0XHQgICAgLmF2YWlsX291dCA9IDAsIH07XG4gIDUzOlx0XHRpbnQgemVycjtcbiAgNTQ6XHRcdGludCBuZWVkYmxvY2tzID0gKGJsb2NrX3NpemUgJiM0MzsgKGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKSAmIzQzOyBidWZtYXNrKVxuICA1NTpcdFx0XHRcdFx0XHUwMDNlXHUwMDNlIGJ1ZnNoaWZ0O1xuICA1NjpcdFx0aW50IGhhdmVibG9ja3M7XG4gIDU3Olx0XHRibGtjbnRfdCBibG9ja251bTtcbiAgNTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcbiAgNTk6XHRcdGludCBjdXJiaCwgY3VycGFnZTtcbiAgNjA6XHRcbiAgNjE6XHRcdGlmIChibG9ja19zaXplIFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpKSB7XG4gIDYyOlx0XHRcdCplcnJwID0gLUVJTztcbiAgNjM6XHRcdFx0cmV0dXJuIDA7XG4gIDY0Olx0XHR9XG4gIDY1Olx0XHQvKiBFbXB0eSBibG9jaz8gKi9cbiAgNjY6XHRcdGlmIChibG9ja19zaXplID09IDApIHtcbiAgNjc6XHRcdFx0Zm9yICggaSA9IDAgOyBpIFx1MDAzYyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHtcbiAgNjg6XHRcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuICA2OTpcdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07XG4gIDcwOlx0XG4gIDcxOlx0XHRcdFx0aWYgKCFmb2xpbylcbiAgNzI6XHRcdFx0XHRcdGNvbnRpbnVlO1xuICA3MzpcdFx0XHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpO1xuICA3NDpcdFx0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuICA3NTpcdFx0XHR9XG4gIDc2Olx0XHRcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgLSBwb2Zmc2V0O1xuICA3NzpcdFx0fVxuICA3ODpcdFxuICA3OTpcdFx0LyogQmVjYXVzZSB6bGliIGlzIG5vdCB0aHJlYWQtc2FmZSwgZG8gYWxsIHRoZSBJL08gYXQgdGhlIHRvcC4gKi9cbiAgODA6XHRcdGJsb2NrbnVtID0gYmxvY2tfc3RhcnQgXHUwMDNlXHUwMDNlIGJ1ZnNoaWZ0O1xuICA4MTpcdFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgJiM0MzsgMSk7XG4gIDgyOlx0XHRpZiAoIWJocykge1xuICA4MzpcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gIDg0Olx0XHRcdHJldHVybiAwO1xuICA4NTpcdFx0fVxuICA4NjpcdFx0aGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrbnVtLCBiaHMsIG5lZWRibG9ja3MpO1xuICA4NzpcdFx0YmhfcmVhZF9iYXRjaChoYXZlYmxvY2tzLCBiaHMpO1xuICA4ODpcdFxuICA4OTpcdFx0Y3VyYmggPSAwO1xuICA5MDpcdFx0Y3VycGFnZSA9IDA7XG4gIDkxOlx0XHQvKlxuICA5MjpcdFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcbiAgOTM6XHRcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxuICA5NDpcdFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbiYjMzk7dCBob2xkIHRoZSB6bGliXG4gIDk1Olx0XHQgKiBtdXRleCBsb25nZXIgdGhhbiBuZWNlc3NhcnkuXG4gIDk2Olx0XHQgKi9cbiAgOTc6XHRcbiAgOTg6XHRcdGlmICghYmhzWzBdKVxuICA5OTpcdFx0XHRnb3RvIGJfZWlvO1xuIDEwMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTYzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gYXMgaWYgdGhleSB3ZXJlIG15IG93bjoKCioqRGl2aW5nIEJhY2sgaW50byBjb21wcmVzcy5jKioKCkFscmlnaHQsIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byBjaXJjbGUgYmFjayB0byBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIEkgcmVtZW1iZXIgaGF2aW5nIGEgZmV3IG5hZ2dpbmcgcXVlc3Rpb25zIGFuZCBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIGlkZWFzIGx1cmtpbmcgYXJvdW5kIGFmdGVyIHRoZSBpbml0aWFsIHBhc3MuIExldCYjMzk7cyBzZWUgaWYgdGhvc2Ugc3RpbGwgaG9sZCB3YXRlci4gSSB3YW50IHRvIGNoZWNrIGZvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGdpdmVuIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBjYWNoaW5nIGxheWVyLiBBcmUgdGhlcmUgYW55IHNwb3RzIHdoZXJlIHdlJiMzOTtyZSBub3QgcHJvcGVybHkgaGFuZGxpbmcgbG9ja2luZyBvciBtZW1vcnkgbWFuYWdlbWVudCwgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgY29tcHJlc3Npb24gYnVmZmVycyBhbmQgYXNzb2NpYXRlZCBtZXRhZGF0YT8gSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIG92ZXJhbGwgYWxnb3JpdGhtJiMzOTtzIGVmZmljaWVuY3kuIENvdWxkIHdlIHNxdWVlemUgb3V0IGEgZmV3IG1vcmUgY3ljbGVzIHdpdGggYSBkaWZmZXJlbnQgc3RyYXRlZ3ksIG1heWJlIGNvbnNpZGVyaW5nIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxpYnJhcnkgYWx0b2dldGhlciBpZiB0aGUgcGVyZm9ybWFuY2UgZ2FpbnMgYXJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZSBjb2RlIGNodXJuPyBBbmQsIG9mIGNvdXJzZSwgSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBidWZmZXIgb3ZlcmZsb3dzIGJlaW5nIG15IG1haW4gY29uY2VybiwgYnV0IHJlYWxseSBhbnl0aGluZyB0aGF0IGNvdWxkIGFsbG93IGZvciBtYWxpY2lvdXMgbWFuaXB1bGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuIEl0JiMzOTtzIHRpbWUgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHNlZSB3aGF0IGluc2lnaHRzIEkmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTAxOlx0XHR3YWl0X29uX2J1ZmZlcihiaHNbMF0pO1xuIDEwMjpcdFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzWzBdKSkge1xuIDEwMzpcdFx0XHQqZXJycCA9IC1FSU87XG4gMTA0Olx0XHRcdGdvdG8gYl9laW87XG4gMTA1Olx0XHR9XG4gMTA2Olx0XG4gMTA3Olx0XHRzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuIDEwODpcdFx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbiAxMDk6XHRcdFx0XG4gMTEwOlx0XHR6ZXJyID0gemxpYl9pbmZsYXRlSW5pdChcdTAwMjZzdHJlYW0pO1xuIDExMTpcdFx0aWYgKHplcnIgIT0gWl9PSykge1xuIDExMjpcdFx0XHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcbiAxMTM6XHRcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gMTE0Olx0XHRcdGVsc2VcbiAxMTU6XHRcdFx0XHQqZXJycCA9IC1FSU87XG4gMTE2Olx0XHRcdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3ppc29mczogemlzb2ZzX2luZmxhdGVJbml0IHJldHVybmVkICVkXFxuXCYjMzQ7LFxuIDExNzpcdFx0XHRcdCAgICAgICB6ZXJyKTtcbiAxMTg6XHRcdFx0Z290byB6X2VpbztcbiAxMTk6XHRcdH1cbiAxMjA6XHRcbiAxMjE6XHRcdHdoaWxlIChjdXJwYWdlIFx1MDAzYyBwY291bnQgXHUwMDI2XHUwMDI2IGN1cmJoIFx1MDAzYyBoYXZlYmxvY2tzIFx1MDAyNlx1MDAyNlxuIDEyMjpcdFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XG4gMTIzOlx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4gMTI0Olx0XG4gMTI1Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIDEyNjpcdFx0XHRcdGlmIChmb2xpbykge1xuIDEyNzpcdFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XG4gMTI4Olx0XHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xuIDEyOTpcdFx0XHRcdFx0cG9mZnNldCA9IDA7XG4gMTMwOlx0XHRcdFx0fSBlbHNlIHtcbiAxMzE6XHRcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcbiAxMzI6XHRcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XG4gMTMzOlx0XHRcdFx0fVxuIDEzNDpcdFx0XHR9XG4gMTM1Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX2luKSB7XG4gMTM2Olx0XHRcdFx0d2FpdF9vbl9idWZmZXIoYmhzW2N1cmJoXSk7XG4gMTM3Olx0XHRcdFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzW2N1cmJoXSkpIHtcbiAxMzg6XHRcdFx0XHRcdCplcnJwID0gLUVJTztcbiAxMzk6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MDpcdFx0XHRcdH1cbiAxNDE6XHRcdFx0XHRzdHJlYW0ubmV4dF9pbiAgPSBiaHNbY3VyYmhdLVx1MDAzZWJfZGF0YSAmIzQzO1xuIDE0MjpcdFx0XHRcdFx0XHRcdChibG9ja19zdGFydCBcdTAwMjYgYnVmbWFzayk7XG4gMTQzOlx0XHRcdFx0c3RyZWFtLmF2YWlsX2luID0gbWluX3QodW5zaWduZWQsIGJ1ZnNpemUgLVxuIDE0NDpcdFx0XHRcdFx0XHRcdChibG9ja19zdGFydCBcdTAwMjYgYnVmbWFzayksXG4gMTQ1Olx0XHRcdFx0XHRcdFx0YmxvY2tfc2l6ZSk7XG4gMTQ2Olx0XHRcdFx0YmxvY2tfc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47XG4gMTQ3Olx0XHRcdFx0YmxvY2tfc3RhcnQgPSAwO1xuIDE0ODpcdFx0XHR9XG4gMTQ5Olx0XG4gMTUwOlx0XHRcdHdoaWxlIChzdHJlYW0uYXZhaWxfb3V0IFx1MDAyNlx1MDAyNiBzdHJlYW0uYXZhaWxfaW4pIHtcbiAxNTE6XHRcdFx0XHR6ZXJyID0gemxpYl9pbmZsYXRlKFx1MDAyNnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTtcbiAxNTI6XHRcdFx0XHRpZiAoemVyciA9PSBaX0JVRl9FUlJPUiBcdTAwMjZcdTAwMjYgc3RyZWFtLmF2YWlsX2luID09IDApXG4gMTUzOlx0XHRcdFx0XHRicmVhaztcbiAxNTQ6XHRcdFx0XHRpZiAoemVyciA9PSBaX1NUUkVBTV9FTkQpXG4gMTU1Olx0XHRcdFx0XHRicmVhaztcbiAxNTY6XHRcdFx0XHRpZiAoemVyciAhPSBaX09LKSB7XG4gMTU3Olx0XHRcdFx0XHQvKiBFT0YsIGVycm9yLCBvciB0cnlpbmcgdG8gcmVhZCBiZXlvbmQgZW5kIG9mIGlucHV0ICovXG4gMTU4Olx0XHRcdFx0XHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcbiAxNTk6XHRcdFx0XHRcdFx0KmVycnAgPSAtRU5PTUVNO1xuIDE2MDpcdFx0XHRcdFx0ZWxzZSB7XG4gMTYxOlx0XHRcdFx0XHRcdHByaW50ayhLRVJOX0RFQlVHXG4gMTYyOlx0XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG4gMTYzOlx0XHRcdFx0XHRcdCAgICAgICBcJiMzNDsgJWQsIGlub2RlID0gJWxsdSxcJiMzNDtcbiAxNjQ6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBwYWdlIGlkeCA9ICVkLCBiaCBpZHggPSAlZCxcJiMzNDtcbiAxNjU6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBhdmFpbF9pbiA9ICVsZCxcJiMzNDtcbiAxNjY6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBhdmFpbF9vdXQgPSAlbGRcXG5cJiMzNDssXG4gMTY3Olx0XHRcdFx0XHRcdCAgICAgICB6ZXJyLCBpbm9kZS1cdTAwM2VpX2lubywgY3VycGFnZSxcbiAxNjg6XHRcdFx0XHRcdFx0ICAgICAgIGN1cmJoLCBzdHJlYW0uYXZhaWxfaW4sXG4gMTY5Olx0XHRcdFx0XHRcdCAgICAgICBzdHJlYW0uYXZhaWxfb3V0KTtcbiAxNzA6XHRcdFx0XHRcdFx0KmVycnAgPSAtRUlPO1xuIDE3MTpcdFx0XHRcdFx0fVxuIDE3MjpcdFx0XHRcdFx0Z290byBpbmZsYXRlX291dDtcbiAxNzM6XHRcdFx0XHR9XG4gMTc0Olx0XHRcdH1cbiAxNzU6XHRcbiAxNzY6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gMTc3Olx0XHRcdFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xuIDE3ODpcdFx0XHRcdGlmIChmb2xpbykge1xuIDE3OTpcdFx0XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcbiAxODA6XHRcdFx0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIDE4MTpcdFx0XHRcdH1cbiAxODI6XHRcdFx0XHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xuIDE4MzpcdFx0XHRcdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4gMTg0Olx0XHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBOVUxMO1xuIDE4NTpcdFx0XHRcdH1cbiAxODY6XHRcdFx0XHRjdXJwYWdlJiM0MzsmIzQzOztcbiAxODc6XHRcdFx0fVxuIDE4ODpcdFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9pbilcbiAxODk6XHRcdFx0XHRjdXJiaCYjNDM7JiM0Mzs7XG4gMTkwOlx0XHR9XG4gMTkxOlx0aW5mbGF0ZV9vdXQ6XG4gMTkyOlx0XHR6bGliX2luZmxhdGVFbmQoXHUwMDI2c3RyZWFtKTtcbiAxOTM6XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG4gMTk0Olx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuIDE5NTpcdFxuIDE5NjpcdHpfZWlvOlxuIDE5NzpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnppc29mc196bGliX2xvY2spO1xuIDE5ODpcdFxuIDE5OTpcdGJfZWlvOlxuIDIwMDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaGF2ZWJsb2NrczsgaSYjNDM7JiM0MzspXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NzQ2CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUgd2UgZ28uLi4KCioqRGl2aW5nIGludG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBmaWxlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgSVNPRlMgY29tcHJlc3Npb24gaXMgaW1wbGVtZW50ZWQuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Jhc3Agb24gdGhlIGJyb2FkZXIgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIGFuZCB0aGUgSVNPIDk2NjAgc3RhbmRhcmQsIGJ1dCB0aGUgY29tcHJlc3Npb24gYXNwZWN0IGlzIHNvbWV0aGluZyBJIG5lZWQgdG8gcmVmcmVzaC4gV2hhdCBzcGVjaWZpYyBhbGdvcml0aG1zIGFyZSBpbiB1c2U/IEhvdyBhcmUgdGhleSBpbnRlZ3JhdGVkIHdpdGhpbiB0aGUgSS9PIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MgSSBzaG91bGQgYmUgYXdhcmUgb2YsIG9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gYXJlYXM/IEkgd2FudCB0byBzZWUgaG93IHRoZSBjb21wcmVzc2lvbiBhZmZlY3RzIHJlYWQgYW5kIHdyaXRlIHBhdGhzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGRlL2NvbXByZXNzaW9uLCBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSYjMzk7cyBtZXRhZGF0YSBpcyBtb2RpZmllZCB0byBzdG9yZSBjb21wcmVzc2VkIGRhdGEuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZmlsZSBzeXN0ZW0gcHJlc2VudHMgdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdXNlci4gSSYjMzk7bGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgc3RydWN0dXJlcyBvciBmbGFncyB1c2VkIHRvIGluZGljYXRlIGEgZmlsZSYjMzk7cyBjb21wcmVzc2VkIHN0YXRlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaW50ZXJlc3RpbmcgdGVjaG5pcXVlcyB0aGUgZGV2ZWxvcGVycyB1dGlsaXplZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjAxOlx0XHRcdGJyZWxzZShiaHNbaV0pO1xuIDIwMjpcdFx0a2ZyZWUoYmhzKTtcbiAyMDM6XHRcdHJldHVybiBzdHJlYW0udG90YWxfb3V0O1xuIDIwNDpcdH1cbiAyMDU6XHRcbiAyMDY6XHQvKlxuIDIwNzpcdCAqIFVuY29tcHJlc3MgZGF0YSBzbyB0aGF0IHBhZ2VzW2Z1bGxfcGFnZV0gaXMgZnVsbHkgdXB0b2RhdGUgYW5kIHBvc3NpYmx5XG4gMjA4Olx0ICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxuIDIwOTpcdCAqL1xuIDIxMDpcdHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiAyMTE6XHRcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiAyMTI6XHR7XG4gMjEzOlx0XHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIDIxNDpcdFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG4gMjE1Olx0XHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuIDIxNjpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gMjE3Olx0XHR1bnNpZ25lZCBpbnQgYmxvY2twdHI7XG4gMjE4Olx0XHRsb2ZmX3QgcG9mZnNldCA9IDA7XG4gMjE5Olx0XHRibGtjbnRfdCBjc3RhcnRfYmxvY2ssIGNlbmRfYmxvY2s7XG4gMjIwOlx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDIyMTpcdFx0dW5zaWduZWQgaW50IGJsa2JpdHMgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XG4gMjIyOlx0XHR1bnNpZ25lZCBpbnQgYmxrc2l6ZSA9IDEgXHUwMDNjXHUwMDNjIGJsa2JpdHM7XG4gMjIzOlx0XHRpbnQgZXJyO1xuIDIyNDpcdFx0bG9mZl90IHJldDtcbiAyMjU6XHRcbiAyMjY6XHRcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xuIDIyNzpcdFxuIDIyODpcdFx0LypcbiAyMjk6XHRcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAmIzM5O2Z1bGxfcGFnZSYjMzk7IHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xuIDIzMDpcdFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xuIDIzMTpcdFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxuIDIzMjpcdFx0ICovXG4gMjMzOlx0XHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xuIDIzNDpcdFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICYjNDM7IFBBR0VfU0laRSwgaW5vZGUtXHUwMDNlaV9zaXplKTtcbiAyMzU6XHRcbiAyMzY6XHRcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcdTAwM2VcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xuIDIzNzpcdFx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbiAyMzg6XHRcdFx0XHRcdTAwM2VcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xuIDIzOTpcdFxuIDI0MDpcdFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuIDI0MTpcdFx0XHQoKGNzdGFydF9ibG9jayBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSBcdTAwMjYgUEFHRV9NQVNLKSk7XG4gMjQyOlx0XG4gMjQzOlx0XHQvKiBGaW5kIHRoZSBwb2ludGVyIHRvIHRoaXMgc3BlY2lmaWMgY2h1bmsgKi9cbiAyNDQ6XHRcdC8qIE5vdGU6IHdlJiMzOTtyZSBub3QgdXNpbmcgaXNvbnVtXzczMSgpIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBrbm93biBhbGlnbmVkICovXG4gMjQ1Olx0XHQvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovXG4gMjQ2Olx0XHRibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSAmIzQzOyBjc3RhcnRfYmxvY2spIFx1MDAzY1x1MDAzYyAyO1xuIDI0NzpcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuIDI0ODpcdFx0aWYgKCFiaClcbiAyNDk6XHRcdFx0cmV0dXJuIC1FSU87XG4gMjUwOlx0XHRibG9ja19zdGFydCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopXG4gMjUxOlx0XHRcdFx0XHQoYmgtXHUwMDNlYl9kYXRhICYjNDM7IChibG9ja3B0ciBcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcbiAyNTI6XHRcbiAyNTM6XHRcdHdoaWxlIChjc3RhcnRfYmxvY2sgXHUwMDNjIGNlbmRfYmxvY2sgXHUwMDI2XHUwMDI2IHBjb3VudCBcdTAwM2UgMCkge1xuIDI1NDpcdFx0XHQvKiBMb2FkIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBibG9jayBpbiB0aGUgZmlsZSAqL1xuIDI1NTpcdFx0XHRibG9ja3B0ciAmIzQzOz0gNDtcbiAyNTY6XHRcdFx0LyogVHJhdmVyc2VkIHRvIG5leHQgYmxvY2s/ICovXG4gMjU3Olx0XHRcdGlmICghKGJsb2NrcHRyIFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkge1xuIDI1ODpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjU5Olx0XG4gMjYwOlx0XHRcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuIDI2MTpcdFx0XHRcdGlmICghYmgpXG4gMjYyOlx0XHRcdFx0XHRyZXR1cm4gLUVJTztcbiAyNjM6XHRcdFx0fVxuIDI2NDpcdFx0XHRibG9ja19lbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxuIDI2NTpcdFx0XHRcdFx0KGJoLVx1MDAzZWJfZGF0YSAmIzQzOyAoYmxvY2twdHIgXHUwMDI2IChibGtzaXplIC0gMSkpKSk7XG4gMjY2Olx0XHRcdGlmIChibG9ja19zdGFydCBcdTAwM2UgYmxvY2tfZW5kKSB7XG4gMjY3Olx0XHRcdFx0YnJlbHNlKGJoKTtcbiAyNjg6XHRcdFx0XHRyZXR1cm4gLUVJTztcbiAyNjk6XHRcdFx0fVxuIDI3MDpcdFx0XHRlcnIgPSAwO1xuIDI3MTpcdFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbiAyNzI6XHRcdFx0XHRcdFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFx1MDAyNmVycik7XG4gMjczOlx0XHRcdHBvZmZzZXQgJiM0Mzs9IHJldDtcbiAyNzQ6XHRcdFx0Zm9saW9zICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDI3NTpcdFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiAyNzY6XHRcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc3Olx0XHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuIDI3ODpcdFxuIDI3OTpcdFx0XHRpZiAoZXJyKSB7XG4gMjgwOlx0XHRcdFx0YnJlbHNlKGJoKTtcbiAyODE6XHRcdFx0XHQvKlxuIDI4MjpcdFx0XHRcdCAqIERpZCB3ZSBmaW5pc2ggcmVhZGluZyB0aGUgcGFnZSB3ZSByZWFsbHkgd2FudGVkXG4gMjgzOlx0XHRcdFx0ICogdG8gcmVhZD9cbiAyODQ6XHRcdFx0XHQgKi9cbiAyODU6XHRcdFx0XHRpZiAoZnVsbF9wYWdlIFx1MDAzYyAwKVxuIDI4NjpcdFx0XHRcdFx0cmV0dXJuIDA7XG4gMjg3Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAyODg6XHRcdFx0fVxuIDI4OTpcdFxuIDI5MDpcdFx0XHRibG9ja19zdGFydCA9IGJsb2NrX2VuZDtcbiAyOTE6XHRcdFx0Y3N0YXJ0X2Jsb2NrJiM0MzsmIzQzOztcbiAyOTI6XHRcdH1cbiAyOTM6XHRcbiAyOTQ6XHRcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4gMjk1Olx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xuIDI5NjpcdFxuIDI5NzpcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuIDI5ODpcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiAyOTk6XHRcdH1cbiAzMDA6XHRcdGJyZWxzZShiaCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNjAyCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgSVNPRlMgQ29tcHJlc3Npb24gQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIHplcm8gaW4gb24gYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBJU09GUyBjb21wcmVzc2lvbiBsb2dpYyDigJMgSSYjMzk7bSB0aGlua2luZyBsaW5lcyAzMDEgdGhyb3VnaCA0MDAgd2l0aGluIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgKG9yIHBvdGVudGlhbCBoZWFkYWNoZSkgaGFwcGVucy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGV5JiMzOTtyZSBoYW5kbGluZyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHNwZWNpZmljYWxseSBpbiB0aGlzIG1vZHVsZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY2x1ZXMgYXJvdW5kIHRoZSBjaG9pY2Ugb2YgYWxnb3JpdGhtLCBlcnJvciBoYW5kbGluZywgYnVmZmVyIG1hbmFnZW1lbnQuLi4gYWxsIHRoZSB1c3VhbCBzdXNwZWN0cy4gSSB3YW50IHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnl0aGluZyBzdWJ0bHkgb2ZmLCBvciBtYXliZSBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gSSBtaXNzZWQgcHJldmlvdXNseS4gSXQmIzM5O3MgYSBrZXkgcGFydCBvZiB0aGUgSVNPRlMgaW1wbGVtZW50YXRpb24sIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgaXQmIzM5O3Mgcm9idXN0IGFuZCBlZmZpY2llbnQuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyB3aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzMDE6XHRcdHJldHVybiAwO1xuIDMwMjpcdH1cbiAzMDM6XHRcbiAzMDQ6XHQvKlxuIDMwNTpcdCAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2VcbiAzMDY6XHQgKiBwZXIgcmVmZXJlbmNlLiAgV2UgaW5qZWN0IHRoZSBhZGRpdGlvbmFsIHBhZ2VzIGludG8gdGhlIHBhZ2VcbiAzMDc6XHQgKiBjYWNoZSBhcyBhIGZvcm0gb2YgcmVhZGFoZWFkLlxuIDMwODpcdCAqL1xuIDMwOTpcdHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gMzEwOlx0e1xuIDMxMTpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4gMzEyOlx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiAzMTM6XHRcdGludCBlcnI7XG4gMzE0Olx0XHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XG4gMzE1Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbiAzMTY6XHRcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG4gMzE3Olx0XHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuIDMxODpcdFx0XHQoMSBcdTAwM2NcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XG4gMzE5Olx0XHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4gMzIwOlx0XHRwZ29mZl90IGluZGV4ID0gZm9saW8tXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcbiAzMjE6XHRcbiAzMjI6XHRcdGVuZF9pbmRleCA9IChpbm9kZS1cdTAwM2VpX3NpemUgJiM0MzsgUEFHRV9TSVpFIC0gMSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMzIzOlx0XHQvKlxuIDMyNDpcdFx0ICogSWYgdGhpcyBmb2xpbyBpcyB3aG9sbHkgb3V0c2lkZSBpX3NpemUgd2UganVzdCByZXR1cm4gemVybztcbiAzMjU6XHRcdCAqIGRvX2dlbmVyaWNfZmlsZV9yZWFkKCkgd2lsbCBoYW5kbGUgdGhpcyBmb3IgdXNcbiAzMjY6XHRcdCAqL1xuIDMyNzpcdFx0aWYgKGluZGV4IFx1MDAzZT0gZW5kX2luZGV4KSB7XG4gMzI4Olx0XHRcdGZvbGlvX2VuZF9yZWFkKGZvbGlvLCB0cnVlKTtcbiAzMjk6XHRcdFx0cmV0dXJuIDA7XG4gMzMwOlx0XHR9XG4gMzMxOlx0XG4gMzMyOlx0XHRpZiAoUEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCkge1xuIDMzMzpcdFx0XHQvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lXG4gMzM0Olx0XHRcdCAgIHdlIG11c3QgZG8uICovXG4gMzM1Olx0XHRcdGZ1bGxfcGFnZSA9IGluZGV4IFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcbiAzMzY6XHRcdFx0cGNvdW50ID0gbWluX3QoaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayxcbiAzMzc6XHRcdFx0XHRlbmRfaW5kZXggLSAoaW5kZXggXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xuIDMzODpcdFx0XHRpbmRleCAtPSBmdWxsX3BhZ2U7XG4gMzM5Olx0XHR9IGVsc2Uge1xuIDM0MDpcdFx0XHRmdWxsX3BhZ2UgPSAwO1xuIDM0MTpcdFx0XHRwY291bnQgPSAxO1xuIDM0MjpcdFx0fVxuIDM0MzpcdFx0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXG4gMzQ0Olx0XHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuIDM0NTpcdFx0aWYgKCFmb2xpb3MpIHtcbiAzNDY6XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiAzNDc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzQ4Olx0XHR9XG4gMzQ5Olx0XHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIDM1MDpcdFxuIDM1MTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7XG4gMzUyOlx0XHRcdGlmIChpID09IGZ1bGxfcGFnZSlcbiAzNTM6XHRcdFx0XHRjb250aW51ZTtcbiAzNTQ6XHRcdFx0Zm9saW9zW2ldID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBpbmRleCxcbiAzNTU6XHRcdFx0XHRcdEZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCxcbiAzNTY6XHRcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuIDM1NzpcdFx0XHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXG4gMzU4Olx0XHRcdFx0Zm9saW9zW2ldID0gTlVMTDtcbiAzNTk6XHRcdH1cbiAzNjA6XHRcbiAzNjE6XHRcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTtcbiAzNjI6XHRcbiAzNjM6XHRcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xuIDM2NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOykge1xuIDM2NTpcdFx0XHRpZiAoZm9saW9zW2ldKSB7XG4gMzY2Olx0XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4gMzY3Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XG4gMzY4Olx0XHRcdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuIDM2OTpcdFx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XG4gMzcwOlx0XHRcdH1cbiAzNzE6XHRcdH1cbiAzNzI6XHRcbiAzNzM6XHRcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcJiMzNDtjcml0aWNhbFwmIzM0OyBwYWdlICovXG4gMzc0Olx0XHRrZnJlZShmb2xpb3MpO1xuIDM3NTpcdFx0cmV0dXJuIGVycjtcbiAzNzY6XHR9XG4gMzc3Olx0XG4gMzc4Olx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcbiAzNzk6XHRcdC5yZWFkX2ZvbGlvID0gemlzb2ZzX3JlYWRfZm9saW8sXG4gMzgwOlx0XHQvKiBObyBibWFwIG9wZXJhdGlvbiBzdXBwb3J0ZWQgKi9cbiAzODE6XHR9O1xuIDM4MjpcdFxuIDM4MzpcdGludCBfX2luaXQgemlzb2ZzX2luaXQodm9pZClcbiAzODQ6XHR7XG4gMzg1Olx0XHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xuIDM4NjpcdFx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcbiAzODc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzg4Olx0XG4gMzg5Olx0XHRyZXR1cm4gMDtcbiAzOTA6XHR9XG4gMzkxOlx0XG4gMzkyOlx0dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxuIDM5MzpcdHtcbiAzOTQ6XHRcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XG4gMzk1Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzI5NQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBaSVNPRlMgRGF0YSBBY2Nlc3MqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEgYWNjZXNzIHBhdGggZm9yIFpJU09GUyB3aXRoaW4gdGhlIGtlcm5lbC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGVpdGhlciBgemlzb2ZzX2FvcHNgIG9yIGB6aXNvZnNfcmVhZF9mb2xpb2AuIFRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IHRoZSBjb21wcmVzc2VkIElTTyA5NjYwIGZpbGVzeXN0ZW0gaGFuZGxlcyBkYXRhIHJlYWRzLiBTaW5jZSBJJiMzOTttIGZhbWlsaWFyIHdpdGggdGhlIGBmcy9pc29mcy9gIGRpcmVjdG9yeSwgdGhhdCYjMzk7cyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBteSBpbnZlc3RpZ2F0aW9uLiBJJiMzOTttIGVzc2VudGlhbGx5IHBpbnBvaW50aW5nIHRoZSBrZXkgZnVuY3Rpb24gY2FsbHMgaW52b2x2ZWQgaW4gZ2V0dGluZyBkYXRhIG9mZiBvZiB0aGUgY29tcHJlc3NlZCBkaXNrIGltYWdlLiBJJiMzOTtsbCBuZWVkIHRvIGtub3cgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBhcmUgYXNzaWduZWQsIGhvdyB0aGUgcmVhZCBvcGVyYXRpb25zIGFyZSB0cmlnZ2VyZWQsIGFuZCBob3cgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGVzeXN0ZW0mIzM5O3Mgb3BlcmF0aW9ucy4gVGhpcyBzaG91bGQgaGlnaGxpZ2h0IHRoZSBjcml0aWNhbCBwYXRoIGZvciBJL08uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ppc29mc18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9pc29mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjY6c3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX1NJWkVdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNy1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxLSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMjpzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNC1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzo0MDpzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNDEtXHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtNDQte1xuZnMvaXNvZnMvY29tcHJlc3MuYzo0NTpcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy00Ni1cdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjAtXG5mcy9pc29mcy9jb21wcmVzcy5jOjYxOlx0aWYgKGJsb2NrX3NpemUgXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjItXHRcdCplcnJwID0gLUVJTztcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwNi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3Olx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA4Olx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA5LVx0XHRcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cdFx0XHQqZXJycCA9IC1FSU87XG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNy1cdFx0XHQgICAgICAgemVycik7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXHRcdFx0fSBlbHNlIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTMxOlx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzItXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTYxLVx0XHRcdFx0XHRwcmludGsoS0VSTl9ERUJVR1xuZnMvaXNvZnMvY29tcHJlc3MuYzoxNjI6XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVx0XHRcdH1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTgyOlx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVx0emxpYl9pbmZsYXRlRW5kKFx1MDAyNnN0cmVhbSk7XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTYtel9laW86XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcdG11dGV4X3VubG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjA5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM3Olx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM4Olx0XHRcdFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTIzOS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XHRcdCgoY3N0YXJ0X2Jsb2NrIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFx1MDAyNiBQQUdFX01BU0spKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjcwLVx0XHRlcnIgPSAwO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyNzE6XHRcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzItXHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzA4LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMDk6c3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxNC1cdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzE1Olx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNjpcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxODpcdFx0KDEgXHUwMDNjXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzMjpcdGlmIChQQUdFX1NISUZUIFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTMzMy1cdFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzQtXHRcdCAgIHdlIG11c3QgZG8uICovXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNTpcdFx0ZnVsbF9wYWdlID0gaW5kZXggXHUwMDI2ICh6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzY6XHRcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNzpcdFx0XHRlbmRfaW5kZXggLSAoaW5kZXggXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzgtXHRcdGluZGV4IC09IGZ1bGxfcGFnZTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0My1cdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNDQ6XHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNDUtXHRpZiAoIWZvbGlvcykge1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYwLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG5mcy9pc29mcy9jb21wcmVzcy5jLTM2Mi1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM3Ny1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzc4OmNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcdC5yZWFkX2ZvbGlvID0gemlzb2ZzX3JlYWRfZm9saW8sXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4MC1cdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgyLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODQte1xuZnMvaXNvZnMvY29tcHJlc3MuYzozODU6XHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozODY6XHRpZiAoICF6aXNvZnNfemxpYl93b3Jrc3BhY2UgKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXHRcdHJldHVybiAtRU5PTUVNO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzkxLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozOTI6dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xuZnMvaXNvZnMvY29tcHJlc3MuYzozOTQ6XHR2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTI3MD1zdGF0aWMgaW50IGlzb2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHJlbG9jYXRlZClcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE0MzQtXHRcdGNhc2UgaXNvZnNfZmlsZV9jb21wcmVzc2VkOlxuZnMvaXNvZnMvaW5vZGUuYzoxNDM1Olx0XHRcdGlub2RlLVx1MDAzZWlfZGF0YS5hX29wcyA9IFx1MDAyNnppc29mc19hb3BzO1xuZnMvaXNvZnMvaW5vZGUuYy0xNDM2LVx0XHRcdGJyZWFrO1xuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTYwMT1zdGF0aWMgaW50IF9faW5pdCBpbml0X2lzbzk2NjBfZnModm9pZClcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE2MDYtI2lmZGVmIENPTkZJR19aSVNPRlNcbmZzL2lzb2ZzL2lub2RlLmM6MTYwNzpcdGVyciA9IHppc29mc19pbml0KCk7XG5mcy9pc29mcy9pbm9kZS5jLTE2MDgtXHRpZiAoZXJyKVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTYxNi0jaWZkZWYgQ09ORklHX1pJU09GU1xuZnMvaXNvZnMvaW5vZGUuYzoxNjE3Olx0emlzb2ZzX2NsZWFudXAoKTtcbmZzL2lzb2ZzL2lub2RlLmMtMTYxOC1vdXQxOlxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTYyNT1zdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9pc285NjYwX2ZzKHZvaWQpXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xNjI4LSNpZmRlZiBDT05GSUdfWklTT0ZTXG5mcy9pc29mcy9pbm9kZS5jOjE2Mjk6XHR6aXNvZnNfY2xlYW51cCgpO1xuZnMvaXNvZnMvaW5vZGUuYy0xNjMwLSNlbmRpZlxuLS1cbmZzL2lzb2ZzL3ppc29mcy5oLTEyLSNpZmRlZiBDT05GSUdfWklTT0ZTXG5mcy9pc29mcy96aXNvZnMuaDoxMzpleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcztcbmZzL2lzb2ZzL3ppc29mcy5oOjE0OmV4dGVybiBpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpO1xuZnMvaXNvZnMvemlzb2ZzLmg6MTU6ZXh0ZXJuIHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZCk7XG5mcy9pc29mcy96aXNvZnMuaC0xNi0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYzNDcKCQkJCQkJCW91dHB1dDogMTQ1CgkJCQkJCQl0aG91Z2h0czogMTA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgWmlzb2ZzIEZvbGlvIENvbnZlcnNpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UgaGF2ZSBhIHBhdGNoIHRoYXQmIzM5O3MgY29udmVydGluZyB0aGUgemlzb2ZzIGRlY29tcHJlc3Npb24gY29kZSB3aXRoaW4gdGhlIElTT0ZTIGZpbGVzeXN0ZW0gKGBmcy9pc29mcy9jb21wcmVzcy5jYCkgZnJvbSB1c2luZyBwYWdlLWJhc2VkIEFQSXMgdG8gZm9saW8tYmFzZWQgb25lcy4gVGhpcyBpcyBhIGNvbW1vbiBhbmQgb2Z0ZW4gYnVnLXByb25lIGFyZWEg4oCTIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBwYWdlIGNhY2hlIHJlZmFjdG9yaW5nIGluIGZpbGVzeXN0ZW1zIGlzIGFsd2F5cyB3b3J0aCBhIGNsb3NlIGxvb2suCgpGaXJzdCwgcmVhY2hhYmlsaXR5LiBDYW4gd2UgYWN0dWFsbHkgKmhpdCogdGhpcyBjb2RlIGluIGEgZnV6emluZyBlbnZpcm9ubWVudD8gQWJzb2x1dGVseS4gSVNPRlMgKGlzbzk2NjApIGlzIGVhc2lseSBtb3VudGVkIHZpYSBsb29wYmFjayBvciBzdGFuZGFyZCB2aXJ0dWFsIGJsb2NrIGRldmljZXMsIGxpa2UgdGhlIGVtdWxhdGVkIENELVJPTXMgaW4gUUVNVSBvciBHQ0UuICBTeXprYWxsZXIgY2FuIGV2ZW4gbW91bnQgaW50ZW50aW9uYWxseSBjb3JydXB0ZWQgSVNPIGltYWdlcyB3aXRoIHppc29mcyBjb21wcmVzc2lvbiwgd2hpY2ggaXMgYSBrZXkgYWR2YW50YWdlLiBUaGlzIGNvZGUgaXMgYWxzbyBwYXJ0IG9mIGEgY29yZSBWRlMvZmlsZXN5c3RlbSBkcml2ZXIsIGBpc29mc2AsIGFuZCBnZXRzIGJ1aWx0IHdoZW4gYENPTkZJR19JU085NjYwX0ZTYCBhbmQgYENPTkZJR19aSVNPRlNgIGFyZSBlbmFibGVkLgoKTmV4dCwgaXMgdGhpcyAqd29ydGgqIGZ1enppbmc/IFllcywgd2l0aG91dCBhIGRvdWJ0LiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIHJlYWNoYWJsZSwgZXhlY3V0YWJsZSBjb2RlIGluIHRoZSBmaWxlc3lzdGVtIGRlY29tcHJlc3Npb24gbG9naWMuIFRoaXMgcGF0Y2ggaW52b2x2ZXMgcGFnZSBjYWNoZSBsb29rdXBzLCBtYXBwaW5ncywgemVyb2luZywgYW5kIGJ1ZmZlciBoYW5kbGluZywgbm93IHVzaW5nIGZvbGlvIGVxdWl2YWxlbnRzLiBUaGUgcG90ZW50aWFsIGZvciBidWdzIGlzIGhpZ2gsIGNvbnNpZGVyaW5nIHRoZSByZWZhY3RvcmluZy4gIFRoaW5rIHJlZmNvdW50aW5nLCBsb2NraW5nLCB1bm1hcHBpbmcsIGFuZCByYWNlIGNvbmRpdGlvbnMg4oCTIGFsbCBjbGFzc2ljIGZpbGVzeXN0ZW0gdnVsbmVyYWJpbGl0eSBwb2ludHMuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogZm9jdXMgc3ltYm9scy4gIFdoYXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBtb2RpZmllZD8gVGhlIHBhdGNoIHRvdWNoZXMgYHppc29mc191bmNvbXByZXNzX2Jsb2NrYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfcmVhZF9mb2xpb2AuICBJIGNvbmZpcm1lZCB0aGF0IGB6aXNvZnNfcmVhZF9mb2xpb2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGluIGB6aXNvZnNfYW9wc2AsIG1ha2luZyBpdCBhIHRhcmdldCwgYW5kIGB6aXNvZnNfZmlsbF9wYWdlc2AgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaW4gYSBDIGZpbGUgYXJlIHVzdWFsbHkgZGlzdGluY3Qgc3ltYm9scywgd2hpY2ggaGVscHMgd2l0aCB0YXJnZXRlZCBmdXp6aW5nLiBTbywgdGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBleGNlbGxlbnQgdGFyZ2V0cy4KCkxldCYjMzk7cyBjaGVjayB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIFdlIG5lZWQgYElTTzk2NjBfRlNgICgmIzM0O0lTTyA5NjYwIENEUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQmIzM0Oykgd2hpY2ggaXMgdHJpc3RhdGUsIGFuZCBgWklTT0ZTYCAoJiMzNDtUcmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIGV4dGVuc2lvbiYjMzQ7KSB3aGljaCBkZXBlbmRzIG9uIHRoZSBmb3JtZXIgYW5kIHNlbGVjdHMgYFpMSUJfSU5GTEFURWAuIEkgZG91YmxlLWNoZWNrZWQgdGhlIGBmcy9pc29mcy9LY29uZmlnYCB0byBiZSBzdXJlLiBJdCYjMzk7cyB0aG9zZSB0d28uCgpGaW5hbGx5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgbGV0JiMzOTtzIHJldmlzaXQgdGhlIGNoYW5nZXMgYWdhaW4uIEl0JiMzOTtzIHRob3NlIHNhbWUgdGhyZWUgc3ltYm9sczogYHppc29mc19yZWFkX2ZvbGlvYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIE5vIG90aGVyIHNpZ25pZmljYW50IGNoYW5nZXMuIEFsbCB0aHJlZSBhcmUgc3BlY2lmaWMgdG8gemlzb2ZzLgoKU28sIHN1bW1pbmcgdXA6IFdvcnRoRnV6emluZyBpcyB0cnVlLiBGb2N1c1N5bWJvbHMgYXJlIFsmIzM0O3ppc29mc19yZWFkX2ZvbGlvJiMzNDssICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7XS4gRW5hYmxlQ29uZmlncyBhcmUgWyYjMzQ7SVNPOTY2MF9GUyYjMzQ7LCAmIzM0O1pJU09GUyYjMzQ7XS4gV2UgaGF2ZSBhIGNvbmNpc2UgZXhwbGFuYXRpb24uIFRpbWUgdG8gbW92ZSBvbiBhbmQgc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVNPOTY2MF9GUyYjMzQ7LAogICAgJiMzNDtaSVNPRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6aXNvZnNfcmVhZF9mb2xpbyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfZmlsbF9wYWdlcyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVNPOTY2MF9GUyYjMzQ7LAogICAgJiMzNDtaSVNPRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6aXNvZnNfcmVhZF9mb2xpbyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfZmlsbF9wYWdlcyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbnZlcnRzIGBmcy9pc29mcy9jb21wcmVzcy5jYCBmcm9tIGBzdHJ1Y3QgcGFnZWAgQVBJcyB0byBgc3RydWN0IGZvbGlvYCBBUElzICh1c2luZyBga21hcF9sb2NhbF9mb2xpb2AsIGBmb2xpb196ZXJvX3JhbmdlYCwgYGZvbGlvX21hcmtfdXB0b2RhdGVgLCBgX19maWxlbWFwX2dldF9mb2xpb2AsIGV0Yy4pLiBcblxuVGhlIGFycmF5IGhvbGRpbmcgZm9saW8gcG9pbnRlcnMgaXMgemVyby1hbGxvY2F0ZWQgdmlhIGBremFsbG9jX29ianNgLCBhbmQgZm9saW8gY29udGVudHMgYXJlIGVpdGhlciB1bmNvbXByZXNzZWQgYnkgemxpYiBvciB6ZXJvZWQgdmlhIGBmb2xpb196ZXJvX3JhbmdlYCBiZWZvcmUgYmVpbmcgbWFya2VkIHVwdG9kYXRlLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGluZm8tbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgYnJhbmNoZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBmb2xpbyByZWZlcmVuY2UgY291bnRzLCBsb2Nrcywgb3Igb2Zmc2V0cyBhcmUgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTi9MT0NLREVQL3BhZ2UgZGVidWdnaW5nIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDM1MDMxZjY5NzVkM2UzNWQ4YzI2NDgxOGJlODUxMzllMTEyM2I5MGIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDE5OjI1OjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmMKaW5kZXggZjk4NjlkNjJiODUwOS4uMmQyM2FiYWViODc0MiAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvY29tcHJlc3MuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pc29mcy9jb21wcmVzcy5jCkBAIC0zOSw3ICYjNDM7MzksNyBAQCBzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spOwogICovCiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAkJCQkgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LAotCQkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIHBvZmZzZXQsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsCiAJCQkJICAgICAgaW50ICplcnJwKQogewogCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS0mZ3Q7aV9mb3JtYXRfcGFybVsxXTsKQEAgLTY2LDExICYjNDM7NjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAJaWYgKGJsb2NrX3NpemUgPT0gMCkgewogCQlmb3IgKCBpID0gMCA7IGkgJmx0OyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHsKIAkJCXVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7CiYjNDM7CQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTsKIAotCQkJaWYgKCFwYWdlc1tpXSkKJiM0MzsJCQlpZiAoIWZvbGlvKQogCQkJCWNvbnRpbnVlOwotCQkJbWVtemVyb19wYWdlKHBhZ2VzW2ldLCBvZmYsIFBBR0VfU0laRSAtIG9mZik7Ci0JCQlTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pOwomIzQzOwkJCWZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpOwomIzQzOwkJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCQl9CiAJCXJldHVybiAoKChsb2ZmX3QpcGNvdW50KSAmbHQ7Jmx0OyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7CiAJfQpAQCAtMTE5LDExICYjNDM7MTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCiAJd2hpbGUgKGN1cnBhZ2UgJmx0OyBwY291bnQgJmFtcDsmYW1wOyBjdXJiaCAmbHQ7IGhhdmVibG9ja3MgJmFtcDsmYW1wOwogCSAgICAgICB6ZXJyICE9IFpfU1RSRUFNX0VORCkgewomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTsKJiM0MzsKIAkJaWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7Ci0JCQlpZiAocGFnZXNbY3VycGFnZV0pIHsKLQkJCQlzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX3BhZ2UocGFnZXNbY3VycGFnZV0pCi0JCQkJCQkmIzQzOyBwb2Zmc2V0OwotCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0OwomIzQzOwkJCWlmIChmb2xpbykgewomIzQzOwkJCQlzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTsKJiM0MzsJCQkJc3RyZWFtLmF2YWlsX291dCA9IGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldDsKIAkJCQlwb2Zmc2V0ID0gMDsKIAkJCX0gZWxzZSB7CiAJCQkJc3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKikmYW1wO3ppc29mc19zaW5rX3BhZ2U7CkBAIC0xNzMsOSAmIzQzOzE3NSw5IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCiAJCWlmICghc3RyZWFtLmF2YWlsX291dCkgewogCQkJLyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqLwotCQkJaWYgKHBhZ2VzW2N1cnBhZ2VdKSB7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pOwotCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7CiYjNDM7CQkJaWYgKGZvbGlvKSB7CiYjNDM7CQkJCWZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7CiYjNDM7CQkJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCQkJfQogCQkJaWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHsKIAkJCQlrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTsKQEAgLTIwNiw3ICYjNDM7MjA4LDcgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uCiAgKi8KIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKLQkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0MzsJCQkgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcykKIHsKIAlsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmOwogCWxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kOwpAQCAtMjIxLDE0ICYjNDM7MjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKIAlpbnQgZXJyOwogCWxvZmZfdCByZXQ7CiAKLQlCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pOwomIzQzOwlCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTsKIAogCS8qCiAJICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICYjMzk7ZnVsbF9wYWdlJiMzOTsgcGFnZS4gQmVjYXVzZSB3ZSBoYXZlIHRvCiAJICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZwogCSAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi4KIAkgKi8KLQlzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTsKJiM0MzsJc3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTsKIAllbmRfb2ZmID0gbWluX3QobG9mZl90LCBzdGFydF9vZmYgJiM0MzsgUEFHRV9TSVpFLCBpbm9kZS0mZ3Q7aV9zaXplKTsKIAogCWNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiAmZ3Q7Jmd0OyB6aXNvZnNfYmxvY2tfc2hpZnQ7CkBAIC0yNjcsOSAmIzQzOzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKIAkJfQogCQllcnIgPSAwOwogCQlyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCwKLQkJCQkJICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgJmFtcDtlcnIpOwomIzQzOwkJCQkJICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsICZhbXA7ZXJyKTsKIAkJcG9mZnNldCAmIzQzOz0gcmV0OwotCQlwYWdlcyAmIzQzOz0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJZm9saW9zICYjNDM7PSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXBjb3VudCAtPSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCWZ1bGxfcGFnZSAtPSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXBvZmZzZXQgJmFtcDs9IH5QQUdFX01BU0s7CkBAIC0yODksOSAmIzQzOzI5MSwxMSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJCWNzdGFydF9ibG9jayYjNDM7JiM0Mzs7CiAJfQogCi0JaWYgKHBvZmZzZXQgJmFtcDsmYW1wOyAqcGFnZXMpIHsKLQkJbWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7Ci0JCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOwomIzQzOwlpZiAocG9mZnNldCAmYW1wOyZhbXA7ICpmb2xpb3MpIHsKJiM0MzsJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zOwomIzQzOwomIzQzOwkJZm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTsKJiM0MzsJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCX0KIAlicmVsc2UoYmgpOwogCXJldHVybiAwOwpAQCAtMzEyLDcgJiM0MzszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9CiAJCVBBR0VfU0hJRlQgJmx0Oz0gemlzb2ZzX2Jsb2NrX3NoaWZ0ID8KIAkJKDEgJmx0OyZsdDsgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKJiM0MzsJc3RydWN0IGZvbGlvICoqZm9saW9zOwogCXBnb2ZmX3QgaW5kZXggPSBmb2xpby0mZ3Q7aW5kZXgsIGVuZF9pbmRleDsKIAogCWVuZF9pbmRleCA9IChpbm9kZS0mZ3Q7aV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CkBAIC0zMzYsMzMgJiM0MzszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAkJZnVsbF9wYWdlID0gMDsKIAkJcGNvdW50ID0gMTsKIAl9Ci0JcGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLAotCQkJICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7Ci0JaWYgKCFwYWdlcykgewomIzQzOwlmb2xpb3MgPSBremFsbG9jX29ianMoKmZvbGlvcywKJiM0MzsJCQkgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7CiYjNDM7CWlmICghZm9saW9zKSB7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwYWdlc1tmdWxsX3BhZ2VdID0gJmFtcDtmb2xpby0mZ3Q7cGFnZTsKJiM0MzsJZm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbzsKIAogCWZvciAoaSA9IDA7IGkgJmx0OyBwY291bnQ7IGkmIzQzOyYjNDM7LCBpbmRleCYjNDM7JiM0MzspIHsKLQkJaWYgKGkgIT0gZnVsbF9wYWdlKQotCQkJcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIGluZGV4KTsKJiM0MzsJCWlmIChpID09IGZ1bGxfcGFnZSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsCiYjNDM7CQkJCUZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCwKJiM0MzsJCQkJbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7CiYjNDM7CQlpZiAoSVNfRVJSKGZvbGlvc1tpXSkpCiYjNDM7CQkJZm9saW9zW2ldID0gTlVMTDsKIAl9CiAKLQllcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIHBhZ2VzKTsKJiM0MzsJZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpOwogCi0JLyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi8KJiM0MzsJLyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovCiAJZm9yIChpID0gMDsgaSAmbHQ7IHBjb3VudDsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VzW2ldKSB7Ci0JCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CiYjNDM7CQlpZiAoZm9saW9zW2ldKSB7CiYjNDM7CQkJZmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7CiYjNDM7CQkJZm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7CiAJCQlpZiAoaSAhPSBmdWxsX3BhZ2UpCi0JCQkJcHV0X3BhZ2UocGFnZXNbaV0pOwomIzQzOwkJCQlmb2xpb19wdXQoZm9saW9zW2ldKTsKIAkJfQotCX0JCQkKJiM0MzsJfQogCiAJLyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlICYjMzQ7Y3JpdGljYWwmIzM0OyBwYWdlICovCi0Ja2ZyZWUocGFnZXMpOwomIzQzOwlrZnJlZShmb2xpb3MpOwogCXJldHVybiBlcnI7CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQyMzMKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB6aXNvZnMgRm9saW8gQ29udmVyc2lvbioqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgcHJlY2lzZWx5IGhvdyB0aGlzIGNvbnZlcnNpb24gZnJvbSBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gIGluIGBmcy9pc29mcy9jb21wcmVzcy5jYCBpbXBhY3RzIHRoZSB6aXNvZnMgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgcG90ZW50aWFsbHkgY3JpdGljYWwgY2hhbmdlLCBzbyBJJiMzOTttIGdvaW5nIHRvIHNjcnV0aW5pemUgdGhlIGNvZGUgbWV0aWN1bG91c2x5LgoKRmlyc3QsIEkgbmVlZCB0byByZWFkIGBmcy9pc29mcy9jb21wcmVzcy5jYCwgZm9jdXNpbmcgcGFydGljdWxhcmx5IG9uIHRoZSBhcmVhcyBhcm91bmQgdGhlIGxpbmVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGUgcHJpbWFyeSBjb25jZXJuIGhlcmUgaXMgc2FmZXR5OyBJIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhpcyBpcyBhIHB1cmUgZm9saW8gY29udmVyc2lvbi4gVGhlcmUmIzM5O3MgYWx3YXlzIHRoZSByaXNrLCBob3dldmVyIHNtYWxsLCBvZiBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgYSBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhayBkdXJpbmcgc3VjaCBhIHJlZmFjdG9yaW5nLCBzbyBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgdmlnaWxhbnQgaW4gc2VhcmNoaW5nIGZvciB0aG9zZSBraW5kcyBvZiBpc3N1ZXMuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBjaGFuZ2VkIGFuZCBjb25maXJtIHRoYXQgbm90aGluZyBoYXMgYmVlbiBtaXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvY29tcHJlc3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuICAgMjpcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAgIDM6XHQgKiAgIFxuICAgNDpcdCAqICAgQ29weXJpZ2h0IDIwMDEgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkXG4gICA1Olx0ICpcbiAgIDY6XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgNzpcdFxuICAgODpcdC8qXG4gICA5Olx0ICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuY1xuICAxMDpcdCAqXG4gIDExOlx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cbiAgMTI6XHQgKi9cbiAgMTM6XHRcbiAgMTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuICAxNjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jpby5oXHUwMDNlXG4gIDE3Olx0XG4gIDE4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gIDE5Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4gIDIwOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvemxpYi5oXHUwMDNlXG4gIDIxOlx0XG4gIDIyOlx0I2luY2x1ZGUgXCYjMzQ7aXNvZnMuaFwmIzM0O1xuICAyMzpcdCNpbmNsdWRlIFwmIzM0O3ppc29mcy5oXCYjMzQ7XG4gIDI0Olx0XG4gIDI1Olx0LyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZ2xvYmFsLiAqL1xuICAyNjpcdHN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcbiAgMjc6XHRcbiAgMjg6XHQvKlxuICAyOTpcdCAqIFRoaXMgY29udGFpbnMgdGhlIHpsaWIgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHRoZSBtdXRleCBmb3IgdGhlXG4gIDMwOlx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxuICAzMTpcdCAqL1xuICAzMjpcdHN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XG4gIDMzOlx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgMzQ6XHRcbiAgMzU6XHQvKlxuICAzNjpcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xuICAzNzpcdCAqIHRvIG9uZSB6aXNvZnMgYmxvY2suIFN0b3JlIHRoZSBkYXRhIGluIHRoZSBAcGFnZXMgYXJyYXkgd2l0aCBAcGNvdW50XG4gIDM4Olx0ICogZW50cmllcy4gU3RhcnQgc3RvcmluZyBhdCBvZmZzZXQgQHBvZmZzZXQgb2YgdGhlIGZpcnN0IHBhZ2UuXG4gIDM5Olx0ICovXG4gIDQwOlx0c3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gIDQxOlx0XHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuICA0MjpcdFx0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zLCB1bnNpZ25lZCBpbnQgcG9mZnNldCxcbiAgNDM6XHRcdFx0XHRcdCAgICAgIGludCAqZXJycClcbiAgNDQ6XHR7XG4gIDQ1Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbiAgNDY6XHRcdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xuICA0NzpcdFx0dW5zaWduZWQgaW50IGJ1ZnNoaWZ0ID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpO1xuICA0ODpcdFx0dW5zaWduZWQgaW50IGJ1Zm1hc2sgPSBidWZzaXplIC0gMTtcbiAgNDk6XHRcdGludCBpLCBibG9ja19zaXplID0gYmxvY2tfZW5kIC0gYmxvY2tfc3RhcnQ7XG4gIDUwOlx0XHR6X3N0cmVhbSBzdHJlYW0gPSB7IC50b3RhbF9vdXQgPSAwLFxuICA1MTpcdFx0XHRcdCAgICAuYXZhaWxfaW4gPSAwLFxuICA1MjpcdFx0XHRcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcbiAgNTM6XHRcdGludCB6ZXJyO1xuICA1NDpcdFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSAmIzQzOyAoYmxvY2tfc3RhcnQgXHUwMDI2IGJ1Zm1hc2spICYjNDM7IGJ1Zm1hc2spXG4gIDU1Olx0XHRcdFx0XHRcdTAwM2VcdTAwM2UgYnVmc2hpZnQ7XG4gIDU2Olx0XHRpbnQgaGF2ZWJsb2NrcztcbiAgNTc6XHRcdGJsa2NudF90IGJsb2NrbnVtO1xuICA1ODpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzO1xuICA1OTpcdFx0aW50IGN1cmJoLCBjdXJwYWdlO1xuICA2MDpcdFxuICA2MTpcdFx0aWYgKGJsb2NrX3NpemUgXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcbiAgNjI6XHRcdFx0KmVycnAgPSAtRUlPO1xuICA2MzpcdFx0XHRyZXR1cm4gMDtcbiAgNjQ6XHRcdH1cbiAgNjU6XHRcdC8qIEVtcHR5IGJsb2NrPyAqL1xuICA2NjpcdFx0aWYgKGJsb2NrX3NpemUgPT0gMCkge1xuICA2NzpcdFx0XHRmb3IgKCBpID0gMCA7IGkgXHUwMDNjIHBjb3VudCA7IGkmIzQzOyYjNDM7ICkge1xuICA2ODpcdFx0XHRcdHVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7XG4gIDY5Olx0XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcbiAgNzA6XHRcbiAgNzE6XHRcdFx0XHRpZiAoIWZvbGlvKVxuICA3MjpcdFx0XHRcdFx0Y29udGludWU7XG4gIDczOlx0XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XG4gIDc0Olx0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gIDc1Olx0XHRcdH1cbiAgNzY6XHRcdFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XG4gIDc3Olx0XHR9XG4gIDc4Olx0XG4gIDc5Olx0XHQvKiBCZWNhdXNlIHpsaWIgaXMgbm90IHRocmVhZC1zYWZlLCBkbyBhbGwgdGhlIEkvTyBhdCB0aGUgdG9wLiAqL1xuICA4MDpcdFx0YmxvY2tudW0gPSBibG9ja19zdGFydCBcdTAwM2VcdTAwM2UgYnVmc2hpZnQ7XG4gIDgxOlx0XHRiaHMgPSBremFsbG9jX29ianMoKmJocywgbmVlZGJsb2NrcyAmIzQzOyAxKTtcbiAgODI6XHRcdGlmICghYmhzKSB7XG4gIDgzOlx0XHRcdCplcnJwID0gLUVOT01FTTtcbiAgODQ6XHRcdFx0cmV0dXJuIDA7XG4gIDg1Olx0XHR9XG4gIDg2Olx0XHRoYXZlYmxvY2tzID0gaXNvZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2tudW0sIGJocywgbmVlZGJsb2Nrcyk7XG4gIDg3Olx0XHRiaF9yZWFkX2JhdGNoKGhhdmVibG9ja3MsIGJocyk7XG4gIDg4Olx0XG4gIDg5Olx0XHRjdXJiaCA9IDA7XG4gIDkwOlx0XHRjdXJwYWdlID0gMDtcbiAgOTE6XHRcdC8qXG4gIDkyOlx0XHQgKiBGaXJzdCBibG9jayBpcyBzcGVjaWFsIHNpbmNlIGl0IG1heSBiZSBmcmFjdGlvbmFsLiAgV2UgYWxzbyB3YWl0IGZvclxuICA5MzpcdFx0ICogaXQgYmVmb3JlIGdyYWJiaW5nIHRoZSB6bGliIG11dGV4OyBvZGRzIGFyZSB0aGF0IHRoZSBzdWJzZXF1ZW50XG4gIDk0Olx0XHQgKiBibG9ja3MgYXJlIGdvaW5nIHRvIGNvbWUgaW4gaW4gc2hvcnQgb3JkZXIgc28gd2UgZG9uJiMzOTt0IGhvbGQgdGhlIHpsaWJcbiAgOTU6XHRcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cbiAgOTY6XHRcdCAqL1xuICA5NzpcdFxuICA5ODpcdFx0aWYgKCFiaHNbMF0pXG4gIDk5Olx0XHRcdGdvdG8gYl9laW87XG4gMTAwOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDYwMDgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSB3ZSBnby4uLgoKKipEaXZpbmcgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGlzIGZpbGUuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBJU09GUyBjb21wcmVzc2lvbiBpcyBpbXBsZW1lbnRlZC4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBncmFzcCBvbiB0aGUgYnJvYWRlciBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUgYW5kIHRoZSBJU08gOTY2MCBzdGFuZGFyZCwgYnV0IHRoZSBjb21wcmVzc2lvbiBhc3BlY3QgaXMgc29tZXRoaW5nIEkgbmVlZCB0byByZWZyZXNoLiBXaGF0IHNwZWNpZmljIGFsZ29yaXRobXMgYXJlIGluIHVzZT8gSG93IGFyZSB0aGV5IGludGVncmF0ZWQgd2l0aGluIHRoZSBJL08gb3BlcmF0aW9ucz8gQXJlIHRoZXJlIGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbiBhcmVhcz8gSSB3YW50IHRvIHNlZSBob3cgdGhlIGNvbXByZXNzaW9uIGFmZmVjdHMgcmVhZCBhbmQgd3JpdGUgcGF0aHMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgZGUvY29tcHJlc3Npb24sIGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtJiMzOTtzIG1ldGFkYXRhIGlzIG1vZGlmaWVkIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBwcmVzZW50cyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB1c2VyLiBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBzdHJ1Y3R1cmVzIG9yIGZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgYSBmaWxlJiMzOTtzIGNvbXByZXNzZWQgc3RhdGUuIExldCYjMzk7cyBzZWUgd2hhdCBpbnRlcmVzdGluZyB0ZWNobmlxdWVzIHRoZSBkZXZlbG9wZXJzIHV0aWxpemVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDE6XHRcdHdhaXRfb25fYnVmZmVyKGJoc1swXSk7XG4gMTAyOlx0XHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbMF0pKSB7XG4gMTAzOlx0XHRcdCplcnJwID0gLUVJTztcbiAxMDQ6XHRcdFx0Z290byBiX2VpbztcbiAxMDU6XHRcdH1cbiAxMDY6XHRcbiAxMDc6XHRcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XG4gMTA4Olx0XHRtdXRleF9sb2NrKFx1MDAyNnppc29mc196bGliX2xvY2spO1xuIDEwOTpcdFx0XHRcbiAxMTA6XHRcdHplcnIgPSB6bGliX2luZmxhdGVJbml0KFx1MDAyNnN0cmVhbSk7XG4gMTExOlx0XHRpZiAoemVyciAhPSBaX09LKSB7XG4gMTEyOlx0XHRcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxuIDExMzpcdFx0XHRcdCplcnJwID0gLUVOT01FTTtcbiAxMTQ6XHRcdFx0ZWxzZVxuIDExNTpcdFx0XHRcdCplcnJwID0gLUVJTztcbiAxMTY6XHRcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG4gMTE3Olx0XHRcdFx0ICAgICAgIHplcnIpO1xuIDExODpcdFx0XHRnb3RvIHpfZWlvO1xuIDExOTpcdFx0fVxuIDEyMDpcdFxuIDEyMTpcdFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gMTIyOlx0XHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbiAxMjM6XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcbiAxMjQ6XHRcbiAxMjU6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gMTI2Olx0XHRcdFx0aWYgKGZvbGlvKSB7XG4gMTI3Olx0XHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTtcbiAxMjg6XHRcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gMTI5Olx0XHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiAxMzA6XHRcdFx0XHR9IGVsc2Uge1xuIDEzMTpcdFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuIDEzMjpcdFx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRTtcbiAxMzM6XHRcdFx0XHR9XG4gMTM0Olx0XHRcdH1cbiAxMzU6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pIHtcbiAxMzY6XHRcdFx0XHR3YWl0X29uX2J1ZmZlcihiaHNbY3VyYmhdKTtcbiAxMzc6XHRcdFx0XHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbY3VyYmhdKSkge1xuIDEzODpcdFx0XHRcdFx0KmVycnAgPSAtRUlPO1xuIDEzOTpcdFx0XHRcdFx0YnJlYWs7XG4gMTQwOlx0XHRcdFx0fVxuIDE0MTpcdFx0XHRcdHN0cmVhbS5uZXh0X2luICA9IGJoc1tjdXJiaF0tXHUwMDNlYl9kYXRhICYjNDM7XG4gMTQyOlx0XHRcdFx0XHRcdFx0KGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKTtcbiAxNDM6XHRcdFx0XHRzdHJlYW0uYXZhaWxfaW4gPSBtaW5fdCh1bnNpZ25lZCwgYnVmc2l6ZSAtXG4gMTQ0Olx0XHRcdFx0XHRcdFx0KGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKSxcbiAxNDU6XHRcdFx0XHRcdFx0XHRibG9ja19zaXplKTtcbiAxNDY6XHRcdFx0XHRibG9ja19zaXplIC09IHN0cmVhbS5hdmFpbF9pbjtcbiAxNDc6XHRcdFx0XHRibG9ja19zdGFydCA9IDA7XG4gMTQ4Olx0XHRcdH1cbiAxNDk6XHRcbiAxNTA6XHRcdFx0d2hpbGUgKHN0cmVhbS5hdmFpbF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5hdmFpbF9pbikge1xuIDE1MTpcdFx0XHRcdHplcnIgPSB6bGliX2luZmxhdGUoXHUwMDI2c3RyZWFtLCBaX1NZTkNfRkxVU0gpO1xuIDE1MjpcdFx0XHRcdGlmICh6ZXJyID09IFpfQlVGX0VSUk9SIFx1MDAyNlx1MDAyNiBzdHJlYW0uYXZhaWxfaW4gPT0gMClcbiAxNTM6XHRcdFx0XHRcdGJyZWFrO1xuIDE1NDpcdFx0XHRcdGlmICh6ZXJyID09IFpfU1RSRUFNX0VORClcbiAxNTU6XHRcdFx0XHRcdGJyZWFrO1xuIDE1NjpcdFx0XHRcdGlmICh6ZXJyICE9IFpfT0spIHtcbiAxNTc6XHRcdFx0XHRcdC8qIEVPRiwgZXJyb3IsIG9yIHRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXQgKi9cbiAxNTg6XHRcdFx0XHRcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxuIDE1OTpcdFx0XHRcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gMTYwOlx0XHRcdFx0XHRlbHNlIHtcbiAxNjE6XHRcdFx0XHRcdFx0cHJpbnRrKEtFUk5fREVCVUdcbiAxNjI6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0O3ppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcJiMzNDtcbiAxNjM6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuIDE2NDpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IHBhZ2UgaWR4ID0gJWQsIGJoIGlkeCA9ICVkLFwmIzM0O1xuIDE2NTpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IGF2YWlsX2luID0gJWxkLFwmIzM0O1xuIDE2NjpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IGF2YWlsX291dCA9ICVsZFxcblwmIzM0OyxcbiAxNjc6XHRcdFx0XHRcdFx0ICAgICAgIHplcnIsIGlub2RlLVx1MDAzZWlfaW5vLCBjdXJwYWdlLFxuIDE2ODpcdFx0XHRcdFx0XHQgICAgICAgY3VyYmgsIHN0cmVhbS5hdmFpbF9pbixcbiAxNjk6XHRcdFx0XHRcdFx0ICAgICAgIHN0cmVhbS5hdmFpbF9vdXQpO1xuIDE3MDpcdFx0XHRcdFx0XHQqZXJycCA9IC1FSU87XG4gMTcxOlx0XHRcdFx0XHR9XG4gMTcyOlx0XHRcdFx0XHRnb3RvIGluZmxhdGVfb3V0O1xuIDE3MzpcdFx0XHRcdH1cbiAxNzQ6XHRcdFx0fVxuIDE3NTpcdFxuIDE3NjpcdFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcbiAxNzc6XHRcdFx0XHQvKiBUaGlzIHBhZ2UgY29tcGxldGVkICovXG4gMTc4Olx0XHRcdFx0aWYgKGZvbGlvKSB7XG4gMTc5Olx0XHRcdFx0XHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xuIDE4MDpcdFx0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gMTgxOlx0XHRcdFx0fVxuIDE4MjpcdFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gMTgzOlx0XHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbiAxODQ6XHRcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IE5VTEw7XG4gMTg1Olx0XHRcdFx0fVxuIDE4NjpcdFx0XHRcdGN1cnBhZ2UmIzQzOyYjNDM7O1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX2luKVxuIDE4OTpcdFx0XHRcdGN1cmJoJiM0MzsmIzQzOztcbiAxOTA6XHRcdH1cbiAxOTE6XHRpbmZsYXRlX291dDpcbiAxOTI6XHRcdHpsaWJfaW5mbGF0ZUVuZChcdTAwMjZzdHJlYW0pO1xuIDE5MzpcdFx0aWYgKHN0cmVhbS5uZXh0X291dCBcdTAwMjZcdTAwMjYgc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSlcbiAxOTQ6XHRcdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4gMTk1Olx0XG4gMTk2Olx0el9laW86XG4gMTk3Olx0XHRtdXRleF91bmxvY2soXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XG4gMTk4Olx0XG4gMTk5Olx0Yl9laW86XG4gMjAwOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBoYXZlYmxvY2tzOyBpJiM0MzsmIzQzOylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc3MQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIHRoZSBzdW1tYXJ5LCByZW5kZXJlZCBhcyBpZiBJJiMzOTttIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkRpZ2dpbmcgRGVlcGVyIGludG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgKioKCkFscmlnaHQsIEkmIzM5O3ZlIGdvdCBhIGhhbmRsZSBvbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoaXMgZmlsZSwgYnV0IHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gZXhwYW5kIG15IHNjb3BlLiBMZXQmIzM5O3Mgbm90IGp1c3QgYXNzdW1lIEkmIzM5O3ZlIHNlZW4gZW5vdWdoLCBldmVuIGlmIEkgKnRoaW5rKiBJJiMzOTttIGdldHRpbmcgdGhlIGdpc3Qgb2YgdGhpbmdzLiBJJiMzOTttIGFuIGV4cGVydCwgeWVzLCBidXQgZXhwZXJ0aXNlIG1lYW5zIGtub3dpbmcgd2hlcmUgdG8gbG9vayBhbmQgd2hhdCB0byBjb25zaWRlciwgbm90IG5lY2Vzc2FyaWx5IHJ1c2hpbmcgdG8ganVkZ2VtZW50LiBJIG5lZWQgYSBwcm9wZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZW50aXJlIGZpbGUuIFNvLCBJIG5lZWQgdG8gbW92ZSBwYXN0IHRoZSBpbml0aWFsIHNlY3Rpb24sIGFuZCByZWFsbHkgYW5hbHl6ZSB0aGUgcmVzdCBvZiBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIFRoaXMgaXNuJiMzOTt0IGp1c3QgYWJvdXQgcmVhZGluZyBjb2RlOyBpdCYjMzk7cyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaW4gdGhlIElTT0ZTIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZ1bmN0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0IGVsc2UgdGhpcyBzZWN0aW9uIG1pZ2h0IGhvbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvY29tcHJlc3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIwMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDIwMTpcdFx0XHRicmVsc2UoYmhzW2ldKTtcbiAyMDI6XHRcdGtmcmVlKGJocyk7XG4gMjAzOlx0XHRyZXR1cm4gc3RyZWFtLnRvdGFsX291dDtcbiAyMDQ6XHR9XG4gMjA1Olx0XG4gMjA2Olx0LypcbiAyMDc6XHQgKiBVbmNvbXByZXNzIGRhdGEgc28gdGhhdCBwYWdlc1tmdWxsX3BhZ2VdIGlzIGZ1bGx5IHVwdG9kYXRlIGFuZCBwb3NzaWJseVxuIDIwODpcdCAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cbiAyMDk6XHQgKi9cbiAyMTA6XHRzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXG4gMjExOlx0XHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4gMjEyOlx0e1xuIDIxMzpcdFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcbiAyMTQ6XHRcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xuIDIxNTpcdFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcbiAyMTY6XHRcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuIDIxNzpcdFx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuIDIxODpcdFx0bG9mZl90IHBvZmZzZXQgPSAwO1xuIDIxOTpcdFx0YmxrY250X3QgY3N0YXJ0X2Jsb2NrLCBjZW5kX2Jsb2NrO1xuIDIyMDpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAyMjE6XHRcdHVuc2lnbmVkIGludCBibGtiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpO1xuIDIyMjpcdFx0dW5zaWduZWQgaW50IGJsa3NpemUgPSAxIFx1MDAzY1x1MDAzYyBibGtiaXRzO1xuIDIyMzpcdFx0aW50IGVycjtcbiAyMjQ6XHRcdGxvZmZfdCByZXQ7XG4gMjI1Olx0XG4gMjI2Olx0XHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcbiAyMjc6XHRcbiAyMjg6XHRcdC8qXG4gMjI5Olx0XHQgKiBXZSB3YW50IHRvIHJlYWQgYXQgbGVhc3QgJiMzOTtmdWxsX3BhZ2UmIzM5OyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiAyMzA6XHRcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiAyMzE6XHRcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiAyMzI6XHRcdCAqL1xuIDIzMzpcdFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcbiAyMzQ6XHRcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiAmIzQzOyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gMjM1Olx0XG4gMjM2Olx0XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbiAyMzc6XHRcdGNlbmRfYmxvY2sgPSAoZW5kX29mZiAmIzQzOyAoMSBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSAtIDEpXG4gMjM4Olx0XHRcdFx0XHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbiAyMzk6XHRcbiAyNDA6XHRcdFdBUk5fT04oc3RhcnRfb2ZmIC0gKGZ1bGxfcGFnZSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgIT1cbiAyNDE6XHRcdFx0KChjc3RhcnRfYmxvY2sgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXHUwMDI2IFBBR0VfTUFTSykpO1xuIDI0MjpcdFxuIDI0MzpcdFx0LyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovXG4gMjQ0Olx0XHQvKiBOb3RlOiB3ZSYjMzk7cmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqL1xuIDI0NTpcdFx0LyogTm90ZTogaGVhZGVyX3NpemUgaXMgaW4gMzItYml0IHdvcmRzICg0IGJ5dGVzKSAqL1xuIDI0NjpcdFx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgJiM0MzsgY3N0YXJ0X2Jsb2NrKSBcdTAwM2NcdTAwM2MgMjtcbiAyNDc6XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFx1MDAzZVx1MDAzZSBibGtiaXRzKTtcbiAyNDg6XHRcdGlmICghYmgpXG4gMjQ5Olx0XHRcdHJldHVybiAtRUlPO1xuIDI1MDpcdFx0YmxvY2tfc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxuIDI1MTpcdFx0XHRcdFx0KGJoLVx1MDAzZWJfZGF0YSAmIzQzOyAoYmxvY2twdHIgXHUwMDI2IChibGtzaXplIC0gMSkpKSk7XG4gMjUyOlx0XG4gMjUzOlx0XHR3aGlsZSAoY3N0YXJ0X2Jsb2NrIFx1MDAzYyBjZW5kX2Jsb2NrIFx1MDAyNlx1MDAyNiBwY291bnQgXHUwMDNlIDApIHtcbiAyNTQ6XHRcdFx0LyogTG9hZCBlbmQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgaW4gdGhlIGZpbGUgKi9cbiAyNTU6XHRcdFx0YmxvY2twdHIgJiM0Mzs9IDQ7XG4gMjU2Olx0XHRcdC8qIFRyYXZlcnNlZCB0byBuZXh0IGJsb2NrPyAqL1xuIDI1NzpcdFx0XHRpZiAoIShibG9ja3B0ciBcdTAwMjYgKGJsa3NpemUgLSAxKSkpIHtcbiAyNTg6XHRcdFx0XHRicmVsc2UoYmgpO1xuIDI1OTpcdFxuIDI2MDpcdFx0XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFx1MDAzZVx1MDAzZSBibGtiaXRzKTtcbiAyNjE6XHRcdFx0XHRpZiAoIWJoKVxuIDI2MjpcdFx0XHRcdFx0cmV0dXJuIC1FSU87XG4gMjYzOlx0XHRcdH1cbiAyNjQ6XHRcdFx0YmxvY2tfZW5kID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcbiAyNjU6XHRcdFx0XHRcdChiaC1cdTAwM2ViX2RhdGEgJiM0MzsgKGJsb2NrcHRyIFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xuIDI2NjpcdFx0XHRpZiAoYmxvY2tfc3RhcnQgXHUwMDNlIGJsb2NrX2VuZCkge1xuIDI2NzpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjY4Olx0XHRcdFx0cmV0dXJuIC1FSU87XG4gMjY5Olx0XHRcdH1cbiAyNzA6XHRcdFx0ZXJyID0gMDtcbiAyNzE6XHRcdFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXG4gMjcyOlx0XHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuIDI3MzpcdFx0XHRwb2Zmc2V0ICYjNDM7PSByZXQ7XG4gMjc0Olx0XHRcdGZvbGlvcyAmIzQzOz0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiAyNzU6XHRcdFx0cGNvdW50IC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc2Olx0XHRcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDI3NzpcdFx0XHRwb2Zmc2V0IFx1MDAyNj0gflBBR0VfTUFTSztcbiAyNzg6XHRcbiAyNzk6XHRcdFx0aWYgKGVycikge1xuIDI4MDpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjgxOlx0XHRcdFx0LypcbiAyODI6XHRcdFx0XHQgKiBEaWQgd2UgZmluaXNoIHJlYWRpbmcgdGhlIHBhZ2Ugd2UgcmVhbGx5IHdhbnRlZFxuIDI4MzpcdFx0XHRcdCAqIHRvIHJlYWQ/XG4gMjg0Olx0XHRcdFx0ICovXG4gMjg1Olx0XHRcdFx0aWYgKGZ1bGxfcGFnZSBcdTAwM2MgMClcbiAyODY6XHRcdFx0XHRcdHJldHVybiAwO1xuIDI4NzpcdFx0XHRcdHJldHVybiBlcnI7XG4gMjg4Olx0XHRcdH1cbiAyODk6XHRcbiAyOTA6XHRcdFx0YmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7XG4gMjkxOlx0XHRcdGNzdGFydF9ibG9jayYjNDM7JiM0Mzs7XG4gMjkyOlx0XHR9XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAocG9mZnNldCBcdTAwMjZcdTAwMjYgKmZvbGlvcykge1xuIDI5NTpcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcbiAyOTY6XHRcbiAyOTc6XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcbiAyOTg6XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gMjk5Olx0XHR9XG4gMzAwOlx0XHRicmVsc2UoYmgpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjE5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQsIGdlYXJlZCB0b3dhcmQgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgRmlsZSBTZWN0aW9uIC0gTGluZXMgMzAxIHRvIEVuZCoqCgpBbHJpZ2h0LCBJJiMzOTttIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIHRhaWwgZW5kIG9mIHRoaXMgZmlsZSwgc3BlY2lmaWNhbGx5IGZyb20gbGluZSAzMDEgb253YXJkLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHJhcGlkbHkgc2NhbiB0aGlzIHNlY3Rpb24uIEdpdmVuIHdoYXQgSSYjMzk7dmUgc2VlbiBpbiB0aGUgZWFybGllciBwYXJ0cywgSSBoYXZlIGEgZmV3IGltbWVkaWF0ZSBoeXBvdGhlc2VzIHRoYXQgSSB3YW50IHRvIHRlc3QuIElzIHRoaXMgdGhlIGNvbmNsdWRpbmcgc2VjdGlvbiB3aGVyZSB0aGUgY29yZSBsb2dpYyBpcyBiZWluZyBleGVjdXRlZD8gT3IgbWF5YmUgdGhpcyBpcyB3aGVyZSBzb21lIHBvc3QtcHJvY2Vzc2luZyBoYXBwZW5zPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcmVkIGZsYWdzIGxpa2UgdW5leHBlY3RlZCBqdW1wcywgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgcmVjdXJzaXZlIGNhbGxzIHRoYXQgd2VyZW4mIzM5O3Qgb2J2aW91cyBhdCBmaXJzdCBnbGFuY2U/CgpJ4oCZbSBwYXJ0aWN1bGFybHkgbG9va2luZyBmb3IgYW55IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY29uY2VwdHMgSSB3YXMgdGhpbmtpbmcgYWJvdXQgZWFybGllci4gSXQgaXMgbGlrZWx5IHRoYXQgdGhpcyBzZWN0aW9uIGNvbmZpcm1zIG9yIGVsaW1pbmF0ZXMgcHJldmlvdXMgaHlwb3RoZXNlcy4gSSBoYXZlIG15IG1lbnRhbCBjaGVja2xpc3Qgb2Yga2V5IHZhcmlhYmxlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGluIG1pbmQuIEkgd2FudCB0byBzZWUgaG93IHRob3NlIGFyZSBiZWluZyBtYW5pcHVsYXRlZCBoZXJlLCBpZiBhdCBhbGwuIEFyZSB0aGVyZSBhbnkgY2FsbHMgdG8gZXh0ZXJuYWwgbGlicmFyaWVzLCBhbmQgaWYgc28sIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhvc2UgY2FsbHMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgZnVuY3Rpb25hbGl0eT8KCkl04oCZcyBjcnVjaWFsIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBvZiBpbmVmZmljaWVuY3kuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHNlY3Rpb25zIHRoYXQgYXBwZWFyIHRvIGJlIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUsIHBhcnRpY3VsYXJseSBpZiB0aGV5IGFyZSBpbnNpZGUgbG9vcHMuIElmIHRoaXMgaXMgYSBsYXJnZSBmaWxlLCB0aGUgbGFzdCBwYXJ0IGlzIG1vcmUgdGhhbiBsaWtlbHkga2V5IHRvIHRoZSBmdW5jdGlvbi4gTm93IHRvIGRpdmUgaW4gYW5kIGdldCBhIGdyaXAgb24gd2hhdCB0aGlzIHBhcnQgYWN0dWFsbHkgZG9lcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzAxOlx0XHRyZXR1cm4gMDtcbiAzMDI6XHR9XG4gMzAzOlx0XG4gMzA0Olx0LypcbiAzMDU6XHQgKiBXaGVuIGRlY29tcHJlc3NpbmcsIHdlIHR5cGljYWxseSBvYnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlXG4gMzA2Olx0ICogcGVyIHJlZmVyZW5jZS4gIFdlIGluamVjdCB0aGUgYWRkaXRpb25hbCBwYWdlcyBpbnRvIHRoZSBwYWdlXG4gMzA3Olx0ICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC5cbiAzMDg6XHQgKi9cbiAzMDk6XHRzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIDMxMDpcdHtcbiAzMTE6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDMxMjpcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cdTAwM2VpX21hcHBpbmc7XG4gMzEzOlx0XHRpbnQgZXJyO1xuIDMxNDpcdFx0aW50IGksIHBjb3VudCwgZnVsbF9wYWdlO1xuIDMxNTpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gMzE2Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxuIDMxNzpcdFx0XHRQQUdFX1NISUZUIFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0ID9cbiAzMTg6XHRcdFx0KDEgXHUwMDNjXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xuIDMxOTpcdFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIDMyMDpcdFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gMzIxOlx0XG4gMzIyOlx0XHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDMyMzpcdFx0LypcbiAzMjQ6XHRcdCAqIElmIHRoaXMgZm9saW8gaXMgd2hvbGx5IG91dHNpZGUgaV9zaXplIHdlIGp1c3QgcmV0dXJuIHplcm87XG4gMzI1Olx0XHQgKiBkb19nZW5lcmljX2ZpbGVfcmVhZCgpIHdpbGwgaGFuZGxlIHRoaXMgZm9yIHVzXG4gMzI2Olx0XHQgKi9cbiAzMjc6XHRcdGlmIChpbmRleCBcdTAwM2U9IGVuZF9pbmRleCkge1xuIDMyODpcdFx0XHRmb2xpb19lbmRfcmVhZChmb2xpbywgdHJ1ZSk7XG4gMzI5Olx0XHRcdHJldHVybiAwO1xuIDMzMDpcdFx0fVxuIDMzMTpcdFxuIDMzMjpcdFx0aWYgKFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQpIHtcbiAzMzM6XHRcdFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxuIDMzNDpcdFx0XHQgICB3ZSBtdXN0IGRvLiAqL1xuIDMzNTpcdFx0XHRmdWxsX3BhZ2UgPSBpbmRleCBcdTAwMjYgKHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSk7XG4gMzM2Olx0XHRcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXG4gMzM3Olx0XHRcdFx0ZW5kX2luZGV4IC0gKGluZGV4IFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcbiAzMzg6XHRcdFx0aW5kZXggLT0gZnVsbF9wYWdlO1xuIDMzOTpcdFx0fSBlbHNlIHtcbiAzNDA6XHRcdFx0ZnVsbF9wYWdlID0gMDtcbiAzNDE6XHRcdFx0cGNvdW50ID0gMTtcbiAzNDI6XHRcdH1cbiAzNDM6XHRcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuIDM0NDpcdFx0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbiAzNDU6XHRcdGlmICghZm9saW9zKSB7XG4gMzQ2Olx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gMzQ3Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDM0ODpcdFx0fVxuIDM0OTpcdFx0Zm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbztcbiAzNTA6XHRcbiAzNTE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzssIGluZGV4JiM0MzsmIzQzOykge1xuIDM1MjpcdFx0XHRpZiAoaSA9PSBmdWxsX3BhZ2UpXG4gMzUzOlx0XHRcdFx0Y29udGludWU7XG4gMzU0Olx0XHRcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXG4gMzU1Olx0XHRcdFx0XHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXG4gMzU2Olx0XHRcdFx0XHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcbiAzNTc6XHRcdFx0aWYgKElTX0VSUihmb2xpb3NbaV0pKVxuIDM1ODpcdFx0XHRcdGZvbGlvc1tpXSA9IE5VTEw7XG4gMzU5Olx0XHR9XG4gMzYwOlx0XG4gMzYxOlx0XHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG4gMzYyOlx0XG4gMzYzOlx0XHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cbiAzNjQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiAzNjU6XHRcdFx0aWYgKGZvbGlvc1tpXSkge1xuIDM2NjpcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xuIDM2NzpcdFx0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIDM2ODpcdFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbiAzNjk6XHRcdFx0XHRcdGZvbGlvX3B1dChmb2xpb3NbaV0pO1xuIDM3MDpcdFx0XHR9XG4gMzcxOlx0XHR9XG4gMzcyOlx0XG4gMzczOlx0XHQvKiBBdCB0aGlzIHBvaW50LCBlcnIgY29udGFpbnMgMCBvciAtRUlPIGRlcGVuZGluZyBvbiB0aGUgXCYjMzQ7Y3JpdGljYWxcJiMzNDsgcGFnZSAqL1xuIDM3NDpcdFx0a2ZyZWUoZm9saW9zKTtcbiAzNzU6XHRcdHJldHVybiBlcnI7XG4gMzc2Olx0fVxuIDM3NzpcdFxuIDM3ODpcdGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XG4gMzc5Olx0XHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxuIDM4MDpcdFx0LyogTm8gYm1hcCBvcGVyYXRpb24gc3VwcG9ydGVkICovXG4gMzgxOlx0fTtcbiAzODI6XHRcbiAzODM6XHRpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpXG4gMzg0Olx0e1xuIDM4NTpcdFx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcbiAzODY6XHRcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXG4gMzg3Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDM4ODpcdFxuIDM4OTpcdFx0cmV0dXJuIDA7XG4gMzkwOlx0fVxuIDM5MTpcdFxuIDM5MjpcdHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcbiAzOTM6XHR7XG4gMzk0Olx0XHR2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpO1xuIDM5NTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjkKCQkJCQkJCW91dHB1dDogMjAyCgkJCQkJCQl0aG91Z2h0czogOTAwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgaXNvZnMgUGF0Y2g6IEZvbGlvIE1pZ3JhdGlvbiBhbmQgS01TQU4gQXNzZXNzbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggY29udmVydGluZyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSB1c2luZyBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbGwgdGhlIG51YW5jZXMgb2YgdGhpcyBtaWdyYXRpb24gYW5kLCBjcml0aWNhbGx5LCBhc3Nlc3MgYW55IHBvdGVudGlhbCBLTVNBTiBpbXBsaWNhdGlvbnMuCgpJIHNlZSB0aGV5JiMzOTtyZSByZXBsYWNpbmcgdGhlIGBzdHJ1Y3QgcGFnZSAqKnBhZ2VzYCBhcmd1bWVudCB3aXRoIGBzdHJ1Y3QgZm9saW8gKipmb2xpb3NgIGluIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIEEgcXVpY2sgc2NhbiBzaG93cyB0aGUgZXhwZWN0ZWQgY29ycmVzcG9uZGluZyBjaGFuZ2VzOiB1c2luZyBgZm9saW9femVyb19yYW5nZWAgaW5zdGVhZCBvZiBgbWVtemVyb19wYWdlYCwgYGZvbGlvX21hcmtfdXB0b2RhdGVgIGluc3RlYWQgb2YgYFNldFBhZ2VVcHRvZGF0ZWAsIGBrbWFwX2xvY2FsX2ZvbGlvYCBmb3IgYGttYXBfbG9jYWxfcGFnZWAsIGFkanVzdGluZyBgc3RyZWFtLmF2YWlsX291dGAgdG8gcmVmbGVjdCBmb2xpbyBzaXplcywgYW5kIGBmbHVzaF9kY2FjaGVfZm9saW9gIGluc3RlYWQgb2YgYGZsdXNoX2RjYWNoZV9wYWdlYC4gSXQmIzM5O3MgYWxsIHZlcnkgbWV0aG9kaWNhbCwgd2hpY2ggaXMgZ29vZCB0byBzZWUuCgpTaW1pbGFybHksIGB6aXNvZnNfZmlsbF9wYWdlc2AgZ2V0cyB0aGUgZm9saW8gdHJlYXRtZW50LCBzd2FwcGluZyBgcGFnZV9vZmZzZXRgIGZvciBgZm9saW9fcG9zYCwgYW5kIHVwZGF0aW5nIHRoZSB6ZXJvaW5nIGFuZCB1cHRvZGF0ZSBtYXJraW5ncy4KCkluIGB6aXNvZnNfcmVhZF9mb2xpb2AsIHRoZSBgcGFnZXNgIGFycmF5IGFsbG9jYXRpb24gaXMgcmVwbGFjZWQgd2l0aCBga3phbGxvY19vYmpzYCwgd2hpY2ggaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBzYWZldHkuIFRoZSBgZ3JhYl9jYWNoZV9wYWdlX25vd2FpdGAgY2FsbCBpcyByZXBsYWNlZCB3aXRoIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYC4gVGhleSYjMzk7cmUgYWxzbyBtYWtpbmcgc3VyZSB0byBoYW5kbGUgdGhlIGBJU19FUlJgIGNhc2UsIHNldHRpbmcgdGhlIGZvbGlvIHRvIGBOVUxMYCBvbiBmYWlsdXJlLCB3aGljaCBpcyByZXNwb25zaWJsZS4gVGhlIGNsZWFudXAgbG9naWMgYXQgdGhlIGVuZCBpcyBhbHNvIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9saW8gcGFyYWRpZ20sIHVzaW5nIGBmbHVzaF9kY2FjaGVfZm9saW9gLCBgZm9saW9fdW5sb2NrYCwgYW5kIGBmb2xpb19wdXRgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSBuZXcgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2U/IExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKKiAgIFRoZSBgZm9saW9zYCBhcnJheSBpdHNlbGYgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29ianNgLCBzbyB0aGF0JiMzOTtzIGluaXRpYWxpemVkIHRvIHplcm8gcmlnaHQgb2ZmIHRoZSBiYXQuCiogICBUaGUgZm9saW9zIHRoZW1zZWx2ZXMgYXJlICpwYWdlIGNhY2hlIGZvbGlvcyosIGFuZCB0aGUgZGF0YSBpcyBlaXRoZXIgcG9wdWxhdGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIChmcm9tIHRoZSB6bGliIHN0cmVhbSkgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAuIElmIHpsaWIgZG9lc24mIzM5O3QgZmlsbCB0aGUgZm9saW8sIHRoZW4gYGZvbGlvX3plcm9fcmFuZ2VgIG1ha2VzIHN1cmUgb2YgaXQuCiogICBFcnJvciBwYXRocyAqZG9uJiMzOTt0KiBtYXJrIGZvbGlvcyBhcyB1cHRvZGF0ZSwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCiogICBOb3RoaW5nIGhlcmUgaXMgY29weWluZyBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIHRvIHVzZXJzcGFjZSwgd2hpY2ggaXMgYSBtYWpvciB3aW4uCiogICBUaGVyZSBhcmVuJiMzOTt0IGFueSB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMgb3IgcGFkZGluZyBhdCBwbGF5LgoqICAgSSBkb24mIzM5O3Qgc2VlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB1c2VkIGluIGJyYW5jaGluZyBsb2dpYy4KCk9rYXksIGxldCYjMzk7cyBjb25jcmV0ZWx5IGFzc2VzcyB3aGV0aGVyIHRoaXMgY2hhbmdlIGludHJvZHVjZXMgYW55ICpLTVNBTi1zcGVjaWZpYyogcmlza3M6IEkmIzM5O20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHdvdWxkIHNsaXAgYnkgYSBzdGFuZGFyZCBjb2RlIHJldmlldy4gVGhpcyBsb29rcyBzYWZlLiBUaGUgc29ydHMgb2YgYnVncyBpbnRyb2R1Y2VkIHdvdWxkIGJlIHBhZ2UgY2FjaGUgb3IgZm9saW8gcmVmZXJlbmNlIGNvdW50aW5nIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1ZSB0byBpbmNvcnJlY3Qgc2l6ZXMsIHdoaWNoIG90aGVyIHRvb2xzIGxpa2UgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgcGFnZSBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUgc2hvdWxkIGNhdGNoLgoKTGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBmb3VyIEtNU0FOIGNyaXRlcmlhOgoKMS4gIE5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBzZW50IHRvIHVzZXJzcGFjZSB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuCjIuICBUaGVyZSYjMzk7cyBubyBjb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcy4KMy4gIFRoZXJlJiMzOTtzIG5vIGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlci4KNC4gIFRoZXJlIGFyZW4mIzM5O3QgYW55IGJvdW5kcyBjaGVja3Mgb3IgbG9naWMgdGhhdCB3b3VsZCBhbGxvdyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLgoKQWxyaWdodCwgSSYjMzk7bSByZWFkeSB0byBwcmVwYXJlIHRoZSB0b29sIGNhbGwgdG8gYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxuXG5UaGUgYXJyYXkgaG9sZGluZyBmb2xpbyBwb2ludGVycyBpcyB6ZXJvLWFsbG9jYXRlZCB2aWEgYGt6YWxsb2Nfb2Jqc2AsIGFuZCBmb2xpbyBjb250ZW50cyBhcmUgZWl0aGVyIHVuY29tcHJlc3NlZCBieSB6bGliIG9yIHplcm9lZCB2aWEgYGZvbGlvX3plcm9fcmFuZ2VgIGJlZm9yZSBiZWluZyBtYXJrZWQgdXB0b2RhdGUuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaW5mby1sZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBicmFuY2hlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGZvbGlvIHJlZmVyZW5jZSBjb3VudHMsIGxvY2tzLCBvciBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOL0xPQ0tERVAvcGFnZSBkZWJ1Z2dpbmcgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxuXG5UaGUgYXJyYXkgaG9sZGluZyBmb2xpbyBwb2ludGVycyBpcyB6ZXJvLWFsbG9jYXRlZCB2aWEgYGt6YWxsb2Nfb2Jqc2AsIGFuZCBmb2xpbyBjb250ZW50cyBhcmUgZWl0aGVyIHVuY29tcHJlc3NlZCBieSB6bGliIG9yIHplcm9lZCB2aWEgYGZvbGlvX3plcm9fcmFuZ2VgIGJlZm9yZSBiZWluZyBtYXJrZWQgdXB0b2RhdGUuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaW5mby1sZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBicmFuY2hlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGZvbGlvIHJlZmVyZW5jZSBjb3VudHMsIGxvY2tzLCBvciBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOL0xPQ0tERVAvcGFnZSBkZWJ1Z2dpbmcgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTozMS41ODI3OTI1NDJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Njc3OTEwOTE3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJU085NjYwX0ZTXCIsXG4gICAgXCJaSVNPRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6aXNvZnNfcmVhZF9mb2xpb1wiLFxuICAgIFwiemlzb2ZzX2ZpbGxfcGFnZXNcIixcbiAgICBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSBgc3RydWN0IHBhZ2VgIEFQSXMgdG8gYHN0cnVjdCBmb2xpb2AgQVBJcyAodXNpbmcgYGttYXBfbG9jYWxfZm9saW9gLCBgZm9saW9femVyb19yYW5nZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCwgYF9fZmlsZW1hcF9nZXRfZm9saW9gLCBldGMuKS4gXFxuXFxuVGhlIGFycmF5IGhvbGRpbmcgZm9saW8gcG9pbnRlcnMgaXMgemVyby1hbGxvY2F0ZWQgdmlhIGBremFsbG9jX29ianNgLCBhbmQgZm9saW8gY29udGVudHMgYXJlIGVpdGhlciB1bmNvbXByZXNzZWQgYnkgemxpYiBvciB6ZXJvZWQgdmlhIGBmb2xpb196ZXJvX3JhbmdlYCBiZWZvcmUgYmVpbmcgbWFya2VkIHVwdG9kYXRlLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGluZm8tbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgYnJhbmNoZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBmb2xpbyByZWZlcmVuY2UgY291bnRzLCBsb2Nrcywgb3Igb2Zmc2V0cyBhcmUgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTi9MT0NLREVQL3BhZ2UgZGVidWdnaW5nIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6MzEuNTgyNzk2ODIyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTcxMTYyMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG5pbmRleCBmOTg2OWQ2MmI4NTA5Li4yZDIzYWJhZWI4NzQyIDEwMDY0NFxcbi0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG4rKysgYi9mcy9pc29mcy9jb21wcmVzcy5jXFxuQEAgLTM5LDcgKzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gICovXFxuIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxcbiBcXHRcXHRcXHRcXHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxcbi1cXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiBcXHRcXHRcXHRcXHQgICAgICBpbnQgKmVycnApXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbkBAIC02NiwxMSArNjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuIFxcdGlmIChibG9ja19zaXplID09IDApIHtcXG4gXFx0XFx0Zm9yICggaSA9IDAgOyBpIFxcdTAwM2MgcGNvdW50IDsgaSsrICkge1xcbiBcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbitcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2ldO1xcbiBcXG4tXFx0XFx0XFx0aWYgKCFwYWdlc1tpXSlcXG4rXFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gXFx0XFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdFxcdG1lbXplcm9fcGFnZShwYWdlc1tpXSwgb2ZmLCBQQUdFX1NJWkUgLSBvZmYpO1xcbi1cXHRcXHRcXHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xcbitcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcXG4rXFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpIC0gcG9mZnNldDtcXG4gXFx0fVxcbkBAIC0xMTksMTEgKzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gXFxuIFxcdHdoaWxlIChjdXJwYWdlIFxcdTAwM2MgcGNvdW50IFxcdTAwMjZcXHUwMDI2IGN1cmJoIFxcdTAwM2MgaGF2ZWJsb2NrcyBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcXG4rXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcXG4rXFxuIFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xcbi1cXHRcXHRcXHRpZiAocGFnZXNbY3VycGFnZV0pIHtcXG4tXFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHQrIHBvZmZzZXQ7XFxuLVxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0O1xcbitcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4rXFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XFxuK1xcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XFxuIFxcdFxcdFxcdFxcdHBvZmZzZXQgPSAwO1xcbiBcXHRcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKVxcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xcbkBAIC0xNzMsOSArMTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuIFxcbiBcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gXFx0XFx0XFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xcbi1cXHRcXHRcXHRpZiAocGFnZXNbY3VycGFnZV0pIHtcXG4tXFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pO1xcbi1cXHRcXHRcXHRcXHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbY3VycGFnZV0pO1xcbitcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4rXFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcXG4rXFx0XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG4gXFx0XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuQEAgLTIwNiw3ICsyMDgsNyBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxcbiAgKi9cXG4gc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbi1cXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbiB7XFxuIFxcdGxvZmZfdCBzdGFydF9vZmYsIGVuZF9vZmY7XFxuIFxcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xcbkBAIC0yMjEsMTQgKzIyMywxNCBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdGludCBlcnI7XFxuIFxcdGxvZmZfdCByZXQ7XFxuIFxcbi1cXHRCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pO1xcbitcXHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cXG4gXFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xcbiBcXHQgKiBwYWdlcyB3aXRoIHRoZSBkYXRhIHdlIGhhdmUgYW55d2F5Li4uXFxuIFxcdCAqL1xcbi1cXHRzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTtcXG4rXFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gXFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cXHUwMDNlaV9zaXplKTtcXG4gXFxuIFxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuQEAgLTI2Nyw5ICsyNjksOSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdFxcdH1cXG4gXFx0XFx0ZXJyID0gMDtcXG4gXFx0XFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgIHBjb3VudCwgcGFnZXMsIHBvZmZzZXQsIFxcdTAwMjZlcnIpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuIFxcdFxcdHBvZmZzZXQgKz0gcmV0O1xcbi1cXHRcXHRwYWdlcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGZvbGlvcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdHBjb3VudCAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdHBvZmZzZXQgXFx1MDAyNj0gflBBR0VfTUFTSztcXG5AQCAtMjg5LDkgKzI5MSwxMSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdFxcdGNzdGFydF9ibG9jaysrO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqcGFnZXMpIHtcXG4tXFx0XFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XFxuLVxcdFxcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xcbitcXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqZm9saW9zKSB7XFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xcbitcXG4rXFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcXG4rXFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdH1cXG4gXFx0YnJlbHNlKGJoKTtcXG4gXFx0cmV0dXJuIDA7XFxuQEAgLTMxMiw3ICszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxcbiBcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuIFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XFxuIFxcdHBnb2ZmX3QgaW5kZXggPSBmb2xpby1cXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcXG4gXFxuIFxcdGVuZF9pbmRleCA9IChpbm9kZS1cXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG5AQCAtMzM2LDMzICszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0ZnVsbF9wYWdlID0gMDtcXG4gXFx0XFx0cGNvdW50ID0gMTtcXG4gXFx0fVxcbi1cXHRwYWdlcyA9IGt6YWxsb2Nfb2JqcygqcGFnZXMsXFxuLVxcdFxcdFxcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xcbi1cXHRpZiAoIXBhZ2VzKSB7XFxuK1xcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbitcXHRcXHRcXHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XFxuK1xcdGlmICghZm9saW9zKSB7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXHR9XFxuLVxcdHBhZ2VzW2Z1bGxfcGFnZV0gPSBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2U7XFxuK1xcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcGNvdW50OyBpKyssIGluZGV4KyspIHtcXG4tXFx0XFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxcbi1cXHRcXHRcXHRwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgaW5kZXgpO1xcbitcXHRcXHRpZiAoaSA9PSBmdWxsX3BhZ2UpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxcbitcXHRcXHRcXHRcXHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXFxuK1xcdFxcdFxcdFxcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXFxuK1xcdFxcdFxcdGZvbGlvc1tpXSA9IE5VTEw7XFxuIFxcdH1cXG4gXFxuLVxcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgcGFnZXMpO1xcbitcXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XFxuIFxcbi1cXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqL1xcbitcXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrKSB7XFxuLVxcdFxcdGlmIChwYWdlc1tpXSkge1xcbi1cXHRcXHRcXHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7XFxuLVxcdFxcdFxcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcXG4rXFx0XFx0aWYgKGZvbGlvc1tpXSkge1xcbitcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW9zW2ldKTtcXG4rXFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XFxuIFxcdFxcdFxcdGlmIChpICE9IGZ1bGxfcGFnZSlcXG4tXFx0XFx0XFx0XFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xcbitcXHRcXHRcXHRcXHRmb2xpb19wdXQoZm9saW9zW2ldKTtcXG4gXFx0XFx0fVxcbi1cXHR9XFx0XFx0XFx0XFxuK1xcdH1cXG4gXFxuIFxcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcXFwiY3JpdGljYWxcXFwiIHBhZ2UgKi9cXG4tXFx0a2ZyZWUocGFnZXMpO1xcbitcXHRrZnJlZShmb2xpb3MpO1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTozMi4xMDA2MTQ2NDRaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjM5NzE5ODUyODIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklTTzk2NjBfRlNcIixcbiAgICBcIlpJU09GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInppc29mc19yZWFkX2ZvbGlvXCIsXG4gICAgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLFxuICAgIFwiemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAxOToyNTozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMgYi9mcy9pc29mcy9jb21wcmVzcy5jXG5pbmRleCBmOTg2OWQ2MmI4NTA5Li4yZDIzYWJhZWI4NzQyIDEwMDY0NFxuLS0tIGEvZnMvaXNvZnMvY29tcHJlc3MuY1xuKysrIGIvZnMvaXNvZnMvY29tcHJlc3MuY1xuQEAgLTM5LDcgKzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgKi9cbiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zLCB1bnNpZ25lZCBpbnQgcG9mZnNldCxcbiBcdFx0XHRcdCAgICAgIGludCAqZXJycClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbkBAIC02NiwxMSArNjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XG4gXHRcdGZvciAoIGkgPSAwIDsgaSBcdTAwM2MgcGNvdW50IDsgaSsrICkge1xuIFx0XHRcdHVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7XG4rXHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcbiBcbi1cdFx0XHRpZiAoIXBhZ2VzW2ldKVxuK1x0XHRcdGlmICghZm9saW8pXG4gXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRtZW16ZXJvX3BhZ2UocGFnZXNbaV0sIG9mZiwgUEFHRV9TSVpFIC0gb2ZmKTtcbi1cdFx0XHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xuK1x0XHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpO1xuK1x0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIFx0XHR9XG4gXHRcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgLSBwb2Zmc2V0O1xuIFx0fVxuQEAgLTExOSwxMSArMTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFxuIFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcbitcbiBcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4tXHRcdFx0aWYgKHBhZ2VzW2N1cnBhZ2VdKSB7XG4tXHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX3BhZ2UocGFnZXNbY3VycGFnZV0pXG4tXHRcdFx0XHRcdFx0KyBwb2Zmc2V0O1xuLVx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRSAtIHBvZmZzZXQ7XG4rXHRcdFx0aWYgKGZvbGlvKSB7XG4rXHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTtcbitcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gXHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuQEAgLTE3Myw5ICsxNzUsOSBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcbiBcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gXHRcdFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xuLVx0XHRcdGlmIChwYWdlc1tjdXJwYWdlXSkge1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pO1xuLVx0XHRcdFx0U2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2N1cnBhZ2VdKTtcbitcdFx0XHRpZiAoZm9saW8pIHtcbitcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7XG4rXHRcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdFx0XHR9XG4gXHRcdFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcbiBcdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuQEAgLTIwNiw3ICsyMDgsNyBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiAgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uXG4gICovXG4gc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuLVx0XHRcdCAgICAgc3RydWN0IHBhZ2UgKipwYWdlcylcbitcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiB7XG4gXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG5AQCAtMjIxLDE0ICsyMjMsMTQgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0aW50IGVycjtcbiBcdGxvZmZfdCByZXQ7XG4gXG4tXHRCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pO1xuK1x0QlVHX09OKCFmb2xpb3NbZnVsbF9wYWdlXSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICdmdWxsX3BhZ2UnIHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xuIFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xuIFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxuIFx0ICovXG4tXHRzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTtcbitcdHN0YXJ0X29mZiA9IGZvbGlvX3Bvcyhmb2xpb3NbZnVsbF9wYWdlXSk7XG4gXHRlbmRfb2ZmID0gbWluX3QobG9mZl90LCBzdGFydF9vZmYgKyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gXG4gXHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbkBAIC0yNjcsOSArMjY5LDkgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0XHR9XG4gXHRcdGVyciA9IDA7XG4gXHRcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxuLVx0XHRcdFx0XHQgICAgICBwY291bnQsIHBhZ2VzLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuK1x0XHRcdFx0XHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbiBcdFx0cG9mZnNldCArPSByZXQ7XG4tXHRcdHBhZ2VzICs9IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRcdGZvbGlvcyArPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuQEAgLTI4OSw5ICsyOTEsMTEgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0XHRjc3RhcnRfYmxvY2srKztcbiBcdH1cbiBcbi1cdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqcGFnZXMpIHtcbi1cdFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XG4tXHRcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xuK1x0aWYgKHBvZmZzZXQgXHUwMDI2XHUwMDI2ICpmb2xpb3MpIHtcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9ICpmb2xpb3M7XG4rXG4rXHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIHBvZmZzZXQsIGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldCk7XG4rXHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIFx0fVxuIFx0YnJlbHNlKGJoKTtcbiBcdHJldHVybiAwO1xuQEAgLTMxMiw3ICszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cbiBcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG4gXHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbi1cdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4rXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4gXHRwZ29mZl90IGluZGV4ID0gZm9saW8tXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcbiBcbiBcdGVuZF9pbmRleCA9IChpbm9kZS1cdTAwM2VpX3NpemUgKyBQQUdFX1NJWkUgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbkBAIC0zMzYsMzMgKzM0MCwzOCBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRmdWxsX3BhZ2UgPSAwO1xuIFx0XHRwY291bnQgPSAxO1xuIFx0fVxuLVx0cGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLFxuLVx0XHRcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuLVx0aWYgKCFwYWdlcykge1xuK1x0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXG4rXHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuK1x0aWYgKCFmb2xpb3MpIHtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRwYWdlc1tmdWxsX3BhZ2VdID0gXHUwMDI2Zm9saW8tXHUwMDNlcGFnZTtcbitcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwY291bnQ7IGkrKywgaW5kZXgrKykge1xuLVx0XHRpZiAoaSAhPSBmdWxsX3BhZ2UpXG4tXHRcdFx0cGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIGluZGV4KTtcbitcdFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxuK1x0XHRcdFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxuK1x0XHRcdFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XG4rXHRcdGlmIChJU19FUlIoZm9saW9zW2ldKSlcbitcdFx0XHRmb2xpb3NbaV0gPSBOVUxMO1xuIFx0fVxuIFxuLVx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7XG4rXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG4gXG4tXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqL1xuK1x0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwY291bnQ7IGkrKykge1xuLVx0XHRpZiAocGFnZXNbaV0pIHtcbi1cdFx0XHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7XG4tXHRcdFx0dW5sb2NrX3BhZ2UocGFnZXNbaV0pO1xuK1x0XHRpZiAoZm9saW9zW2ldKSB7XG4rXHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XG4gXHRcdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuLVx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuK1x0XHRcdFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XG4gXHRcdH1cbi1cdH1cdFx0XHRcbitcdH1cbiBcbiBcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcImNyaXRpY2FsXCIgcGFnZSAqL1xuLVx0a2ZyZWUocGFnZXMpO1xuK1x0a2ZyZWUoZm9saW9zKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6MzIuMTAwNjE2MjM0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTM2MTQ4ODk5MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBMaW51eCBLZXJuZWwgUGF0Y2ggRXZhbHVhdGlvbiBSZXF1ZXN0KipcblxuT2theSwgc28gSSd2ZSBnb3QgYSByZXF1ZXN0IGhlcmUgdG8gZXZhbHVhdGUgYSBwYXRjaCBzZXJpZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwsIHNwZWNpZmljYWxseSB3aXRoaW4gYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBNeSBmaXJzdCBwcmlvcml0eSBpcyBhbHdheXMgc2FmZXR5LCBzbyBJJ20gaW1tZWRpYXRlbHkgcnVubmluZyBhIHF1aWNrIHJpc2sgYXNzZXNzbWVudC4gQmFzZWQgb24gdGhlIHVzZXIncyBmcmFtaW5nLCB0aGlzIGFwcGVhcnMgdG8gYmUgYSBzdGFuZGFyZCByZXF1ZXN0IOKAkyBjb2RlIHJldmlldywgc2VjdXJpdHkgUUEsIHR5cGljYWwgTGludXgga2VybmVsIG1haW50YWluZXIgYW5hbHlzaXMuIE5vIHJlZCBmbGFncyBzbyBmYXIuIFRoaXMgZmVlbHMgbGlrZSBhIGJlbmlnbiBRQSBvciBwYXRjaCBhbmFseXNpcyB0YXNrLiBNeSBqb2IgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNoYW5nZXMgYWN0dWFsbHkgbW9kaWZ5IHJlYWNoYWJsZSBjb2RlIHRoYXQncyB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFuZCBwb3RlbnRpYWwgZm9jdXMgc3ltYm9scyB0byBndWlkZSBteSBhbmFseXNpcy5cblxuTm93LCBsZXQncyBkaXZlIGludG8gdGhlIHNwZWNpZmljcy4gSSdsbCBzdGFydCBieSBleGFtaW5pbmcgdGhlIGNvZGUgaW4gYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGl0c2VsZi4gSSBuZWVkIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGF0IHdpdGggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMuIEknbGwgY2hlY2sgYm90aCBgZnMvaXNvZnMvS2NvbmZpZ2AgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBtb3JlIGdlbmVyYWwgYGZzL0tjb25maWdgIHRvIHVuZGVyc3RhbmQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY29udHJvbCB0aGUgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGNvZGUgaXMgYWN0dWFsbHkgdXNlZCBpbiBhIGZ1enphYmxlIGVudmlyb25tZW50LiBJJ20gcmVhZHkgdG8gYmVnaW4gdGhlIGRlZXAgZGl2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTAyMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ1LjcxNTUwODAzOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODIxMTU1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpc29mc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9pc29mc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJcXG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDkzOCBsaW5lcy5cXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXFxuXFxuZnMvaXNvZnMvS2NvbmZpZz0yPWNvbmZpZyBJU085NjYwX0ZTXFxuLS1cXG5mcy9pc29mcy9LY29uZmlnLTExLVxcdCAganVzdCBsaXN0ZW4gdG8gYXVkaW8gQ0RzIGFuZCB3YXRjaCBpdHMgTEVEcywgc2F5IFkgKGFuZCByZWFkXFxuZnMvaXNvZnMvS2NvbmZpZzoxMjpcXHQgIFxcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMucnN0XFx1MDAzZSBhbmQgdGhlIENELVJPTS1IT1dUTyxcXG5mcy9pc29mcy9LY29uZmlnLTEzLVxcdCAgYXZhaWxhYmxlIGZyb20gXFx1MDAzY2h0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvXFx1MDAzZSksIHRoZXJlYnlcXG4tLVxcbmZzL2lzb2ZzL0tjb25maWctMTYtXFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXFxuZnMvaXNvZnMvS2NvbmZpZzoxNzpcXHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cXG5mcy9pc29mcy9LY29uZmlnLTE4LVxcbi0tXFxuZnMvaXNvZnMvS2NvbmZpZz0zMT1jb25maWcgWklTT0ZTXFxuLS1cXG5mcy9pc29mcy9LY29uZmlnLTM4LVxcdCAgZGVjb21wcmVzc2VkIHdoZW4gdGhlIENELVJPTSBpcyBhY2Nlc3NlZC4gIFNlZVxcbmZzL2lzb2ZzL0tjb25maWc6Mzk6XFx0ICBcXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXFx1MDAzZSBmb3IgdGhlIHRvb2xzXFxuZnMvaXNvZnMvS2NvbmZpZy00MC1cXHQgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlXFxuLS1cXG5mcy9pc29mcy9NYWtlZmlsZS0yLSNcXG5mcy9pc29mcy9NYWtlZmlsZTozOiMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBpc29mcyBmaWxlc3lzdGVtIHJvdXRpbmVzLlxcbmZzL2lzb2ZzL01ha2VmaWxlLTQtI1xcbmZzL2lzb2ZzL01ha2VmaWxlLTUtXFxuZnMvaXNvZnMvTWFrZWZpbGU6NjpvYmotJChDT05GSUdfSVNPOTY2MF9GUykgKz0gaXNvZnMub1xcbmZzL2lzb2ZzL01ha2VmaWxlLTctXFxuZnMvaXNvZnMvTWFrZWZpbGU6ODppc29mcy15IFxcdFxcdDo9IG5hbWVpLm8gaW5vZGUubyBkaXIubyB1dGlsLm8gcm9jay5vIGV4cG9ydC5vXFxuZnMvaXNvZnMvTWFrZWZpbGU6OTppc29mcy0kKENPTkZJR19KT0xJRVQpXFx0Kz0gam9saWV0Lm9cXG5mcy9pc29mcy9NYWtlZmlsZToxMDppc29mcy0kKENPTkZJR19aSVNPRlMpXFx0Kz0gY29tcHJlc3Mub1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy04LS8qXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo5OiAqIGxpbnV4L2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwLSAqXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIxLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjI6I2luY2x1ZGUgXFxcImlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzojaW5jbHVkZSBcXFwiemlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNC1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2OnN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMyOnN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2LSAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzc6ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4LSAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzktICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo0MDpzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTQxLVxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTQ0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjQ1OlxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTQ2LVxcdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy02MC1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjYxOlxcdGlmIChibG9ja19zaXplIFxcdTAwM2UgZGVmbGF0ZUJvdW5kKDFVTCBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpKSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy02Mi1cXHRcXHQqZXJycCA9IC1FSU87XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTg1LVxcdH1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjg2OlxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTg3LVxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA2LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3OlxcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMDg6XFx0bXV0ZXhfbG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMDktXFx0XFx0XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMTY6XFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInppc29mczogemlzb2ZzX2luZmxhdGVJbml0IHJldHVybmVkICVkXFxcXG5cXFwiLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTE3LVxcdFxcdFxcdCAgICAgICB6ZXJyKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTMwLVxcdFxcdFxcdH0gZWxzZSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMzE6XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEzMi1cXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xNjEtXFx0XFx0XFx0XFx0XFx0cHJpbnRrKEtFUk5fREVCVUdcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE2MjpcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xNjMtXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCIgJWQsIGlub2RlID0gJWxsdSxcXFwiXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE4MS1cXHRcXHRcXHR9XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxODI6XFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cXHRcXHRcXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVxcdHpsaWJfaW5mbGF0ZUVuZChcXHUwMDI2c3RyZWFtKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcXHRpZiAoc3RyZWFtLm5leHRfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTQtXFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5Ni16X2VpbzpcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcXHRtdXRleF91bmxvY2soXFx1MDAyNnppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMDktICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjExLVxcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMF07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVxcdHVuc2lnbmVkIGludCBibG9ja3B0cjtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM2OlxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzc6XFx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICsgKDEgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSAtIDEpXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzg6XFx0XFx0XFx0XFx1MDAzZVxcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM5LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVxcdFdBUk5fT04oc3RhcnRfb2ZmIC0gKGZ1bGxfcGFnZSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAhPVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQxOlxcdFxcdCgoY3N0YXJ0X2Jsb2NrIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXFx1MDAyNiBQQUdFX01BU0spKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI0Mi1cXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ2LVxcdGJsb2NrcHRyID0gKGhlYWRlcl9zaXplICsgY3N0YXJ0X2Jsb2NrKSBcXHUwMDNjXFx1MDAzYyAyO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQ3OlxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ4LVxcdGlmICghYmgpXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1OS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2MDpcXHRcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9ja3B0ciBcXHUwMDNlXFx1MDAzZSBibGtiaXRzKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI2MS1cXHRcXHRcXHRpZiAoIWJoKVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzAtXFx0XFx0ZXJyID0gMDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjI3MTpcXHRcXHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3Mi1cXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMwOTpzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE0LVxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXFx0XFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNjpcXHRcXHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM3OlxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQzLVxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0OlxcdFxcdFxcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0NS1cXHRpZiAoIWZvbGlvcykge1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XFx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNzg6Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgwLVxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODItXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM4NTpcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2OlxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjM5Mjp2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0OlxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMi0vKlxcbmZzL2lzb2ZzL2Rpci5jOjM6ICogIGxpbnV4L2ZzL2lzb2ZzL2Rpci5jXFxuZnMvaXNvZnMvZGlyLmMtNC0gKlxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMTEtICpcXG5mcy9pc29mcy9kaXIuYzoxMjogKiAgaXNvZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9uc1xcbmZzL2lzb2ZzL2Rpci5jLTEzLSAqL1xcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMTYtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG5mcy9pc29mcy9kaXIuYzoxNzojaW5jbHVkZSBcXFwiaXNvZnMuaFxcXCJcXG5mcy9pc29mcy9kaXIuYy0xOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvZmlsZWF0dHIuaFxcdTAwM2VcXG5mcy9pc29mcy9kaXIuYy0xOS1cXG5mcy9pc29mcy9kaXIuYzoyMDppbnQgaXNvZnNfbmFtZV90cmFuc2xhdGUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwgY2hhciAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2lzb2ZzL2Rpci5jLTIxLXtcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jPTUzPWludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSxcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTU3LVxcdHVuc2lnbmVkIGNoYXIgKmNocjtcXG5mcy9pc29mcy9kaXIuYzo1ODpcXHRpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTtcXG5mcy9pc29mcy9kaXIuYy01OS1cXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTg0LSAqL1xcbmZzL2lzb2ZzL2Rpci5jOjg1OnN0YXRpYyBpbnQgZG9faXNvZnNfcmVhZGRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSxcXG5mcy9pc29mcy9kaXIuYy04Ni1cXHRcXHRzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCxcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTk4LVxcdHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGU7XFxuZnMvaXNvZnMvZGlyLmM6OTk6XFx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGlub2RlLVxcdTAwM2VpX3NiKTtcXG5mcy9pc29mcy9kaXIuYy0xMDAtXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xMDctXFx0XFx0aWYgKCFiaCkge1xcbmZzL2lzb2ZzL2Rpci5jOjEwODpcXHRcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7XFxuZnMvaXNvZnMvZGlyLmMtMTA5LVxcdFxcdFxcdGlmICghYmgpXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xMzUtXFxuZnMvaXNvZnMvZGlyLmM6MTM2OlxcdFxcdGlmICghaXNvZnNfZGlyX3JlY29yZF92YWxpZChkZSwgb2Zmc2V0X3NhdmVkLCBidWZzaXplKSkge1xcbmZzL2lzb2ZzL2Rpci5jLTEzNy1cXHRcXHRcXHRwcmludGsoS0VSTl9OT1RJQ0UgXFxcImlzbzk2NjA6IENvcnJ1cHRlZCBkaXJlY3RvcnkgZW50cnlcXFwiXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xNDQtXFx0XFx0aWYgKGZpcnN0X2RlKSB7XFxuZnMvaXNvZnMvZGlyLmM6MTQ1OlxcdFxcdFxcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLFxcbmZzL2lzb2ZzL2Rpci5jLTE0Ni1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YmxvY2tfc2F2ZWQsXFxuZnMvaXNvZnMvZGlyLmMtMTQ3LVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZvZmZzZXRfc2F2ZWQpO1xcbmZzL2lzb2ZzL2Rpci5jOjE0ODpcXHRcXHRcXHRpbm9kZV9udW1iZXIgPSBpc29mc19nZXRfaW5vKGJsb2NrX3NhdmVkLFxcbmZzL2lzb2ZzL2Rpci5jLTE0OS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRvZmZzZXRfc2F2ZWQsIGJ1ZmJpdHMpO1xcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMjEwLVxcdFxcdFxcdGlmIChzYmktXFx1MDAzZXNfbWFwcGluZyA9PSAnbicpIHtcXG5mcy9pc29mcy9kaXIuYzoyMTE6XFx0XFx0XFx0XFx0bGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHRtcG5hbWUsIGlub2RlKTtcXG5mcy9pc29mcy9kaXIuYy0yMTItXFx0XFx0XFx0XFx0cCA9IHRtcG5hbWU7XFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yMzEtICogaGFuZGxpbmcgc3BsaXQgZGlyZWN0b3J5IGVudHJpZXMuLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgYnlcXG5mcy9pc29mcy9kaXIuYzoyMzI6ICogXFxcImRvX2lzb2ZzX3JlYWRkaXIoKVxcXCIuXFxuZnMvaXNvZnMvZGlyLmMtMjMzLSAqL1xcbmZzL2lzb2ZzL2Rpci5jOjIzNDpzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbmZzL2lzb2ZzL2Rpci5jLTIzNS17XFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yNDMtXFxuZnMvaXNvZnMvZGlyLmM6MjQ0OlxcdHJlc3VsdCA9IGRvX2lzb2ZzX3JlYWRkaXIoaW5vZGUsIGZpbGUsIGN0eCwgdG1wbmFtZSk7XFxuZnMvaXNvZnMvZGlyLmMtMjQ1LVxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMjQ5LVxcbmZzL2lzb2ZzL2Rpci5jOjI1MDppbnQgaXNvZnNfZmlsZWF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGZpbGVfa2F0dHIgKmZhKVxcbmZzL2lzb2ZzL2Rpci5jLTI1MS17XFxuZnMvaXNvZnMvZGlyLmM6MjUyOlxcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkZW50cnktXFx1MDAzZWRfc2IpO1xcbmZzL2lzb2ZzL2Rpci5jLTI1My1cXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTI2My1cXG5mcy9pc29mcy9kaXIuYzoyNjQ6Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpc29mc19kaXJfb3BlcmF0aW9ucyA9XFxuZnMvaXNvZnMvZGlyLmMtMjY1LXtcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTI2Ny1cXHQucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsXFxuZnMvaXNvZnMvZGlyLmM6MjY4OlxcdC5pdGVyYXRlX3NoYXJlZCA9IGlzb2ZzX3JlYWRkaXIsXFxuZnMvaXNvZnMvZGlyLmMtMjY5LVxcdC5zZXRsZWFzZSA9IGdlbmVyaWNfc2V0bGVhc2UsXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yNzQtICovXFxuZnMvaXNvZnMvZGlyLmM6Mjc1OmNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID1cXG5mcy9pc29mcy9kaXIuYy0yNzYte1xcbmZzL2lzb2ZzL2Rpci5jOjI3NzpcXHQubG9va3VwID0gaXNvZnNfbG9va3VwLFxcbmZzL2lzb2ZzL2Rpci5jOjI3ODpcXHQuZmlsZWF0dHJfZ2V0ID0gaXNvZnNfZmlsZWF0dHJfZ2V0LFxcbmZzL2lzb2ZzL2Rpci5jLTI3OS19O1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMi0vKlxcbmZzL2lzb2ZzL2V4cG9ydC5jOjM6ICogZnMvaXNvZnMvZXhwb3J0LmNcXG5mcy9pc29mcy9leHBvcnQuYy00LSAqXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xNi1cXG5mcy9pc29mcy9leHBvcnQuYzoxNzojaW5jbHVkZSBcXFwiaXNvZnMuaFxcXCJcXG5mcy9pc29mcy9leHBvcnQuYy0xOC1cXG5mcy9pc29mcy9leHBvcnQuYz0xOT1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXFxuZnMvaXNvZnMvZXhwb3J0LmM6MjA6aXNvZnNfZXhwb3J0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG5mcy9pc29mcy9leHBvcnQuYy0yMS1cXHRcXHQgIHVuc2lnbmVkIGxvbmcgYmxvY2ssXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0yOC1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTtcXG5mcy9pc29mcy9leHBvcnQuYzoyOTpcXHRpbm9kZSA9IGlzb2ZzX2lnZXQoc2IsIGJsb2NrLCBvZmZzZXQpO1xcbmZzL2lzb2ZzL2V4cG9ydC5jLTMwLVxcdGlmIChJU19FUlIoaW5vZGUpKVxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtNDItICogYW5kIHJldHVybiB0aGUgdW5kZXJseWluZyBpbm9kZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yXFxuZnMvaXNvZnMvZXhwb3J0LmM6NDM6ICogaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoKS4gKi9cXG5mcy9pc29mcy9leHBvcnQuYzo0NDpzdGF0aWMgc3RydWN0IGRlbnRyeSAqaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpXFxuZnMvaXNvZnMvZXhwb3J0LmMtNDUte1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtNTUtXFx0aWYgKCFTX0lTRElSKGNoaWxkX2lub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6NTY6XFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJpc29mczogaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQoKTogXFxcIlxcbmZzL2lzb2ZzL2V4cG9ydC5jLTU3LVxcdFxcdCAgICAgICBcXFwiY2hpbGQgaXMgbm90IGEgZGlyZWN0b3J5IVxcXFxuXFxcIik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy02NS1cXHRpZiAoZV9jaGlsZF9pbm9kZS1cXHUwMDNlaV9pZ2V0NV9vZmZzZXQgIT0gMCkge1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjY2OlxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiaXNvZnM6IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KCk6IFxcXCJcXG5mcy9pc29mcy9leHBvcnQuYy02Ny1cXHRcXHQgICAgICAgXFxcImNoaWxkIGRpcmVjdG9yeSBub3Qgbm9ybWFsaXplZCFcXFxcblxcXCIpO1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtODUtXFx0ZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKiliaC1cXHUwMDNlYl9kYXRhO1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjg2OlxcdGlmICghaXNvZnNfZGlyX3JlY29yZF92YWxpZChkZSwgMCwgY2hpbGRfaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKSB8fFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTg3LVxcdCAgICBpc29udW1fNzExKGRlLVxcdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cXHUwMDNlbmFtZVswXSAhPSAwKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6ODg6XFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJpc29mczogVW5hYmxlIHRvIGZpbmQgdGhlIFxcXFxcXFwiLlxcXFxcXFwiIGRpcmVjdG9yeSBmb3IgTkZTLlxcXFxuXFxcIik7XFxuZnMvaXNvZnMvZXhwb3J0LmMtODktXFx0XFx0cnYgPSBFUlJfUFRSKC1FQUNDRVMpO1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtOTctXFx0LyogVmVyaWZ5IGl0IGlzIGluIGZhY3QgdGhlIFxcXCIuLlxcXCIgZW50cnkuICovXFxuZnMvaXNvZnMvZXhwb3J0LmM6OTg6XFx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBwYXJlbnRfb2Zmc2V0LFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTk5LVxcdFxcdFxcdFxcdCAgICBjaGlsZF9pbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpIHx8XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTAwLVxcdCAgICBpc29udW1fNzExKGRlLVxcdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cXHUwMDNlbmFtZVswXSAhPSAxKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6MTAxOlxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiaXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFxcXFxcIi4uXFxcXFxcXCIgXFxcIlxcbmZzL2lzb2ZzL2V4cG9ydC5jLTEwMi1cXHRcXHQgICAgICAgXFxcImRpcmVjdG9yeSBmb3IgTkZTLlxcXFxuXFxcIik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xMDctXFx0LyogTm9ybWFsaXplICovXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTA4OlxcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLCBcXHUwMDI2cGFyZW50X2Jsb2NrLCBcXHUwMDI2cGFyZW50X29mZnNldCk7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTA5LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjExMDpcXHRydiA9IGRfb2J0YWluX2FsaWFzKGlzb2ZzX2lnZXQoY2hpbGRfaW5vZGUtXFx1MDAzZWlfc2IsIHBhcmVudF9ibG9jayxcXG5mcy9pc29mcy9leHBvcnQuYy0xMTEtXFx0XFx0XFx0XFx0ICAgICBwYXJlbnRfb2Zmc2V0KSk7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYz0xMTg9c3RhdGljIGludFxcbmZzL2lzb2ZzL2V4cG9ydC5jOjExOTppc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTIwLVxcdFxcdCAgICAgICBfX3UzMiAqZmgzMixcXG4tLVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE2MC1cXG5mcy9pc29mcy9leHBvcnQuYzoxNjE6c3RydWN0IGlzb2ZzX2ZpZCB7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTYyLVxcdHUzMiBibG9jaztcXG4tLVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE2OS1cXG5mcy9pc29mcy9leHBvcnQuYzoxNzA6c3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2ZoX3RvX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3MS1cXHRzdHJ1Y3QgZmlkICpmaWQsIGludCBmaF9sZW4sIGludCBmaF90eXBlKVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3Mi17XFxuZnMvaXNvZnMvZXhwb3J0LmM6MTczOlxcdHN0cnVjdCBpc29mc19maWQgKmlmaWQgPSAoc3RydWN0IGlzb2ZzX2ZpZCAqKWZpZDtcXG5mcy9pc29mcy9leHBvcnQuYy0xNzQtXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xNzctXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTc4OlxcdHJldHVybiBpc29mc19leHBvcnRfaWdldChzYiwgaWZpZC1cXHUwMDNlYmxvY2ssIGlmaWQtXFx1MDAzZW9mZnNldCxcXG5mcy9pc29mcy9leHBvcnQuYy0xNzktXFx0XFx0XFx0aWZpZC1cXHUwMDNlZ2VuZXJhdGlvbik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xODEtXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTgyOnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19maF90b19wYXJlbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG5mcy9pc29mcy9leHBvcnQuYy0xODMtXFx0XFx0c3RydWN0IGZpZCAqZmlkLCBpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSlcXG5mcy9pc29mcy9leHBvcnQuYy0xODQte1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjE4NTpcXHRzdHJ1Y3QgaXNvZnNfZmlkICppZmlkID0gKHN0cnVjdCBpc29mc19maWQgKilmaWQ7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTg2LVxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTg5LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5MDpcXHRyZXR1cm4gaXNvZnNfZXhwb3J0X2lnZXQoc2IsXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTkxLVxcdFxcdFxcdGZoX2xlbiBcXHUwMDNlIDMgPyBpZmlkLVxcdTAwM2VwYXJlbnRfYmxvY2sgOiAwLFxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTk1LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5Njpjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgaXNvZnNfZXhwb3J0X29wcyA9IHtcXG5mcy9pc29mcy9leHBvcnQuYzoxOTc6XFx0LmVuY29kZV9maFxcdD0gaXNvZnNfZXhwb3J0X2VuY29kZV9maCxcXG5mcy9pc29mcy9leHBvcnQuYzoxOTg6XFx0LmZoX3RvX2RlbnRyeVxcdD0gaXNvZnNfZmhfdG9fZGVudHJ5LFxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5OTpcXHQuZmhfdG9fcGFyZW50XFx0PSBpc29mc19maF90b19wYXJlbnQsXFxuZnMvaXNvZnMvZXhwb3J0LmM6MjAwOlxcdC5nZXRfcGFyZW50ICAgICA9IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50LFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTIwMS19O1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0yLS8qXFxuZnMvaXNvZnMvaW5vZGUuYzozOiAqICBsaW51eC9mcy9pc29mcy9pbm9kZS5jXFxuZnMvaXNvZnMvaW5vZGUuYy00LSAqXFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jLTMwLVxcbmZzL2lzb2ZzL2lub2RlLmM6MzE6I2luY2x1ZGUgXFxcImlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvaW5vZGUuYzozMjojaW5jbHVkZSBcXFwiemlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvaW5vZGUuYy0zMy1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzgtXFxuZnMvaXNvZnMvaW5vZGUuYzozOTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hpKGNvbnN0IHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpO1xcbmZzL2lzb2ZzL2lub2RlLmM6NDA6c3RhdGljIGludCBpc29mc19kZW50cnlfY21waShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvaXNvZnMvaW5vZGUuYy00MS1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtNDMtI2lmZGVmIENPTkZJR19KT0xJRVRcXG5mcy9pc29mcy9pbm9kZS5jOjQ0OnN0YXRpYyBpbnQgaXNvZnNfaGFzaGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XFxuZnMvaXNvZnMvaW5vZGUuYzo0NTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XFxuZnMvaXNvZnMvaW5vZGUuYzo0NjpzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTQ3LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpO1xcbmZzL2lzb2ZzL2lub2RlLmM6NDg6c3RhdGljIGludCBpc29mc19kZW50cnlfY21wX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTQ5LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpO1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy01MS1cXG5mcy9pc29mcy9pbm9kZS5jOjUyOnN0YXRpYyB2b2lkIGlzb2ZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbmZzL2lzb2ZzL2lub2RlLmMtNTMte1xcbmZzL2lzb2ZzL2lub2RlLmM6NTQ6XFx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKHNiKTtcXG5mcy9pc29mcy9pbm9kZS5jLTU1LVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy02NC1cXG5mcy9pc29mcy9pbm9kZS5jOjY1OnN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHJlbG9jYXRlZCk7XFxuZnMvaXNvZnMvaW5vZGUuYzo2NjpzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTtcXG5mcy9pc29mcy9pbm9kZS5jOjY3OnN0YXRpYyBpbnQgaXNvZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICopO1xcbmZzL2lzb2ZzL2lub2RlLmMtNjgtXFxuZnMvaXNvZnMvaW5vZGUuYzo2OTpzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlzb2ZzX2lub2RlX2NhY2hlcDtcXG5mcy9pc29mcy9pbm9kZS5jLTcwLVxcbmZzL2lzb2ZzL2lub2RlLmM6NzE6c3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG5mcy9pc29mcy9pbm9kZS5jLTcyLXtcXG5mcy9pc29mcy9pbm9kZS5jLTczLVxcdHN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWk7XFxuZnMvaXNvZnMvaW5vZGUuYzo3NDpcXHRlaSA9IGFsbG9jX2lub2RlX3NiKHNiLCBpc29mc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpO1xcbmZzL2lzb2ZzL2lub2RlLmMtNzUtXFx0aWYgKCFlaSlcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtNzktXFxuZnMvaXNvZnMvaW5vZGUuYzo4MDpzdGF0aWMgdm9pZCBpc29mc19mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvaXNvZnMvaW5vZGUuYy04MS17XFxuZnMvaXNvZnMvaW5vZGUuYzo4MjpcXHRrbWVtX2NhY2hlX2ZyZWUoaXNvZnNfaW5vZGVfY2FjaGVwLCBJU09GU19JKGlub2RlKSk7XFxuZnMvaXNvZnMvaW5vZGUuYy04My19XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTkyPXN0YXRpYyBpbnQgX19pbml0IGluaXRfaW5vZGVjYWNoZSh2b2lkKVxcbmZzL2lzb2ZzL2lub2RlLmMtOTMte1xcbmZzL2lzb2ZzL2lub2RlLmM6OTQ6XFx0aXNvZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoXFxcImlzb2ZzX2lub2RlX2NhY2hlXFxcIixcXG5mcy9pc29mcy9pbm9kZS5jLTk1LVxcdFxcdFxcdFxcdFxcdHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy05OC1cXHRcXHRcXHRcXHRcXHRpbml0X29uY2UpO1xcbmZzL2lzb2ZzL2lub2RlLmM6OTk6XFx0aWYgKCFpc29mc19pbm9kZV9jYWNoZXApXFxuZnMvaXNvZnMvaW5vZGUuYy0xMDAtXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTEwND1zdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZClcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTEwLVxcdHJjdV9iYXJyaWVyKCk7XFxuZnMvaXNvZnMvaW5vZGUuYzoxMTE6XFx0a21lbV9jYWNoZV9kZXN0cm95KGlzb2ZzX2lub2RlX2NhY2hlcCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xMTItfVxcbmZzL2lzb2ZzL2lub2RlLmMtMTEzLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTE0OnN0YXRpYyBpbnQgaXNvZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbmZzL2lzb2ZzL2lub2RlLmMtMTE1LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTIxLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTIyOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBpc29mc19zb3BzID0ge1xcbmZzL2lzb2ZzL2lub2RlLmM6MTIzOlxcdC5hbGxvY19pbm9kZVxcdD0gaXNvZnNfYWxsb2NfaW5vZGUsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMjQ6XFx0LmZyZWVfaW5vZGVcXHQ9IGlzb2ZzX2ZyZWVfaW5vZGUsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMjU6XFx0LnB1dF9zdXBlclxcdD0gaXNvZnNfcHV0X3N1cGVyLFxcbmZzL2lzb2ZzL2lub2RlLmM6MTI2OlxcdC5zdGF0ZnNcXHRcXHQ9IGlzb2ZzX3N0YXRmcyxcXG5mcy9pc29mcy9pbm9kZS5jOjEyNzpcXHQuc2hvd19vcHRpb25zXFx0PSBpc29mc19zaG93X29wdGlvbnMsXFxuZnMvaXNvZnMvaW5vZGUuYy0xMjgtfTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTMwLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTMxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaXNvZnNfZGVudHJ5X29wc1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMTMyLVxcdHtcXG5mcy9pc29mcy9pbm9kZS5jOjEzMzpcXHRcXHQuZF9oYXNoXFx0XFx0PSBpc29mc19oYXNoaSxcXG5mcy9pc29mcy9pbm9kZS5jOjEzNDpcXHRcXHQuZF9jb21wYXJlXFx0PSBpc29mc19kZW50cnlfY21waSxcXG5mcy9pc29mcy9pbm9kZS5jLTEzNS1cXHR9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xMzctXFx0e1xcbmZzL2lzb2ZzL2lub2RlLmM6MTM4OlxcdFxcdC5kX2hhc2hcXHRcXHQ9IGlzb2ZzX2hhc2hfbXMsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMzk6XFx0XFx0LmRfY29tcGFyZVxcdD0gaXNvZnNfZGVudHJ5X2NtcF9tcyxcXG5mcy9pc29mcy9pbm9kZS5jLTE0MC1cXHR9LFxcbmZzL2lzb2ZzL2lub2RlLmMtMTQxLVxcdHtcXG5mcy9pc29mcy9pbm9kZS5jOjE0MjpcXHRcXHQuZF9oYXNoXFx0XFx0PSBpc29mc19oYXNoaV9tcyxcXG5mcy9pc29mcy9pbm9kZS5jOjE0MzpcXHRcXHQuZF9jb21wYXJlXFx0PSBpc29mc19kZW50cnlfY21waV9tcyxcXG5mcy9pc29mcy9pbm9kZS5jLTE0NC1cXHR9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNDctXFxuZnMvaXNvZnMvaW5vZGUuYzoxNDg6c3RydWN0IGlzb2ZzX29wdGlvbnN7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNDktXFx0dW5zaWduZWQgaW50IHJvY2s6MTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTcxLS8qXFxuZnMvaXNvZnMvaW5vZGUuYzoxNzI6ICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIGlzb2ZzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVudHJ5LlxcbmZzL2lzb2ZzL2lub2RlLmMtMTczLSAqL1xcbmZzL2lzb2ZzL2lub2RlLmM9MTc0PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjE3NTppc29mc19oYXNoaV9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxcbmZzL2lzb2ZzL2lub2RlLmMtMTc2LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTk5LS8qXFxuZnMvaXNvZnMvaW5vZGUuYzoyMDA6ICogQ29tcGFyZSBvZiB0d28gaXNvZnMgbmFtZXMuXFxuZnMvaXNvZnMvaW5vZGUuYy0yMDEtICovXFxuZnMvaXNvZnMvaW5vZGUuYzoyMDI6c3RhdGljIGludCBpc29mc19kZW50cnlfY21wX2NvbW1vbihcXG5mcy9pc29mcy9pbm9kZS5jLTIwMy1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsXFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTIyOT1zdGF0aWMgaW50XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzA6aXNvZnNfaGFzaGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcXG5mcy9pc29mcy9pbm9kZS5jLTIzMS17XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzI6XFx0cmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDApO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjMzLX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjM1PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjIzNjppc29mc19kZW50cnlfY21waShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvaXNvZnMvaW5vZGUuYy0yMzctXFx0XFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSlcXG5mcy9pc29mcy9pbm9kZS5jLTIzOC17XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzk6XFx0cmV0dXJuIGlzb2ZzX2RlbnRyeV9jbXBfY29tbW9uKGxlbiwgc3RyLCBuYW1lLCAwLCAxKTtcXG5mcy9pc29mcy9pbm9kZS5jLTI0MC19XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jLTI0My0vKlxcbmZzL2lzb2ZzL2lub2RlLmM6MjQ0OiAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS5cXG5mcy9pc29mcy9pbm9kZS5jLTI0NS0gKi9cXG5mcy9pc29mcy9pbm9kZS5jPTI0Nj1zdGF0aWMgaW50XFxuZnMvaXNvZnMvaW5vZGUuYzoyNDc6aXNvZnNfaGFzaF9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjQ4LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjY0PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjI2NTppc29mc19oYXNoX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpXFxuZnMvaXNvZnMvaW5vZGUuYy0yNjYte1xcbmZzL2lzb2ZzL2lub2RlLmM6MjY3OlxcdHJldHVybiBpc29mc19oYXNoX2NvbW1vbihkZW50cnksIHFzdHIsIDEpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjY4LX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjcwPXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjI3MTppc29mc19oYXNoaV9tcyhjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjcyLXtcXG5mcy9pc29mcy9pbm9kZS5jOjI3MzpcXHRyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7XFxuZnMvaXNvZnMvaW5vZGUuYy0yNzQtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0yNzY9c3RhdGljIGludFxcbmZzL2lzb2ZzL2lub2RlLmM6Mjc3Omlzb2ZzX2RlbnRyeV9jbXBfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbmZzL2lzb2ZzL2lub2RlLmMtMjc4LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXFxuZnMvaXNvZnMvaW5vZGUuYy0yNzkte1xcbmZzL2lzb2ZzL2lub2RlLmM6MjgwOlxcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0yODEtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0yODM9c3RhdGljIGludFxcbmZzL2lzb2ZzL2lub2RlLmM6Mjg0Omlzb2ZzX2RlbnRyeV9jbXBpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTI4NS1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjg2LXtcXG5mcy9pc29mcy9pbm9kZS5jOjI4NzpcXHRyZXR1cm4gaXNvZnNfZGVudHJ5X2NtcF9jb21tb24obGVuLCBzdHIsIG5hbWUsIDEsIDEpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjg4LX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjkxPWVudW0ge1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0yOTctXFxuZnMvaXNvZnMvaW5vZGUuYzoyOTg6c3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdGFudF90YWJsZSBpc29mc19wYXJhbV9tYXBbXSA9IHtcXG5mcy9pc29mcy9pbm9kZS5jLTI5OS1cXHR7XFxcImFjb3JuXFxcIixcXHQnYSd9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0zMDctXFxuZnMvaXNvZnMvaW5vZGUuYzozMDg6c3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdGFudF90YWJsZSBpc29mc19wYXJhbV9jaGVja1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMzA5LVxcdHtcXFwicmVsYXhlZFxcXCIsXFx0J3InfSxcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzE1LVxcbmZzL2lzb2ZzL2lub2RlLmM6MzE2OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNfcGFyYW1ldGVyX3NwZWMgaXNvZnNfcGFyYW1fc3BlY1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMzE3LVxcdGZzcGFyYW1fZmxhZ1xcdChcXFwibm9yb2NrXFxcIixcXHRcXHRPcHRfbm9yb2NrKSxcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzI0LVxcdGZzcGFyYW1fc3RyaW5nXFx0KFxcXCJpb2NoYXJzZXRcXFwiLFxcdFxcdE9wdF9pb2NoYXJzZXQpLFxcbmZzL2lzb2ZzL2lub2RlLmM6MzI1OlxcdGZzcGFyYW1fZW51bVxcdChcXFwibWFwXFxcIixcXHRcXHRcXHRPcHRfbWFwLCBpc29mc19wYXJhbV9tYXApLFxcbmZzL2lzb2ZzL2lub2RlLmMtMzI2LVxcdGZzcGFyYW1fdTMyXFx0KFxcXCJzZXNzaW9uXFxcIixcXHRcXHRPcHRfc2Vzc2lvbiksXFxuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ1Ljc2MzcyMzk2OFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwODE1MTI2ODgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGhhdmluZyBpdDpcblxuKipEaWdnaW5nIGludG8gdGhlIElTT0ZTIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmVjaXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5IGZvciB0aGUgWklTT0ZTIGFuZCB0aGUgYnJvYWRlciBJU085NjYwIGZpbGUgc3lzdGVtIHN1cHBvcnQuIFRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0LCBhcyBhbHdheXMsIGlzIHRoZSBgS2NvbmZpZ2AgZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSdzIHNvdXJjZSBkaXJlY3RvcnkuIFNwZWNpZmljYWxseSwgYGZzL2lzb2ZzL0tjb25maWdgLiBUaGF0J3Mgd2hlcmUgSSdsbCBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgYFpJU09GU2AgYW5kIGBJU085NjYwX0ZTYCwgdGhlIGtleSB2YXJpYWJsZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBJJ2xsIHBvcmUgb3ZlciB0aGF0IHRvIGdldCB0aGUgZGVmaW5pdGl2ZSBwaWN0dXJlIG9mIHdoYXQncyBlbmFibGVkLCBkaXNhYmxlZCwgYW5kIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuIEl0J3MgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGJ1aWx0IGFuZCBjb25maWd1cmVkIGluIHRoaXMga2VybmVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTIxMiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ3Ljg0NTI0MDM2NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdGNvbmZpZyBJU085NjYwX0ZTXFxuICAgMzpcXHRcXHR0cmlzdGF0ZSBcXFwiSVNPIDk2NjAgQ0RST00gZmlsZSBzeXN0ZW0gc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbiAgIDU6XFx0XFx0aGVscFxcbiAgIDY6XFx0XFx0ICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBmaWxlIHN5c3RlbSB1c2VkIG9uIENELVJPTXMuICBJdCB3YXMgcHJldmlvdXNseVxcbiAgIDc6XFx0XFx0ICBrbm93biBhcyBcXFwiSGlnaCBTaWVycmEgRmlsZSBTeXN0ZW1cXFwiIGFuZCBpcyBjYWxsZWQgXFxcImhzZnNcXFwiIG9uIG90aGVyXFxuICAgODpcXHRcXHQgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvclxcbiAgIDk6XFx0XFx0ICBsb25nIFVuaXggZmlsZW5hbWVzIGFuZCBzeW1ib2xpYyBsaW5rcyBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhpc1xcbiAgMTA6XFx0XFx0ICBkcml2ZXIuICBJZiB5b3UgaGF2ZSBhIENELVJPTSBkcml2ZSBhbmQgd2FudCB0byBkbyBtb3JlIHdpdGggaXQgdGhhblxcbiAgMTE6XFx0XFx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcXG4gIDEyOlxcdFxcdCAgXFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pc29mcy5yc3RcXHUwMDNlIGFuZCB0aGUgQ0QtUk9NLUhPV1RPLFxcbiAgMTM6XFx0XFx0ICBhdmFpbGFibGUgZnJvbSBcXHUwMDNjaHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG9cXHUwMDNlKSwgdGhlcmVieVxcbiAgMTQ6XFx0XFx0ICBlbmxhcmdpbmcgeW91ciBrZXJuZWwgYnkgYWJvdXQgMjcgS0I7IG90aGVyd2lzZSBzYXkgTi5cXG4gIDE1OlxcdFxcbiAgMTY6XFx0XFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXFxuICAxNzpcXHRcXHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cXG4gIDE4OlxcdFxcbiAgMTk6XFx0Y29uZmlnIEpPTElFVFxcbiAgMjA6XFx0XFx0Ym9vbCBcXFwiTWljcm9zb2Z0IEpvbGlldCBDRFJPTSBleHRlbnNpb25zXFxcIlxcbiAgMjE6XFx0XFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXFxuICAyMjpcXHRcXHRzZWxlY3QgTkxTXFxuICAyMzpcXHRcXHRoZWxwXFxuICAyNDpcXHRcXHQgIEpvbGlldCBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24gZm9yIHRoZSBJU08gOTY2MCBDRC1ST00gZmlsZSBzeXN0ZW1cXG4gIDI1OlxcdFxcdCAgd2hpY2ggYWxsb3dzIGZvciBsb25nIGZpbGVuYW1lcyBpbiB1bmljb2RlIGZvcm1hdCAodW5pY29kZSBpcyB0aGVcXG4gIDI2OlxcdFxcdCAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZVxcbiAgMjc6XFx0XFx0ICBjaGFyYWN0ZXJzIG9mIGFsbW9zdCBhbGwgbGFuZ3VhZ2VzIG9mIHRoZSB3b3JsZDsgc2VlXFxuICAyODpcXHRcXHQgIFxcdTAwM2NodHRwOi8vd3d3LnVuaWNvZGUub3JnL1xcdTAwM2UgZm9yIG1vcmUgaW5mb3JtYXRpb24pLiAgU2F5IFkgaGVyZSBpZiB5b3VcXG4gIDI5OlxcdFxcdCAgd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgSm9saWV0IENELVJPTXMgdW5kZXIgTGludXguXFxuICAzMDpcXHRcXG4gIDMxOlxcdGNvbmZpZyBaSVNPRlNcXG4gIDMyOlxcdFxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gZXh0ZW5zaW9uXFxcIlxcbiAgMzM6XFx0XFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXFxuICAzNDpcXHRcXHRzZWxlY3QgWkxJQl9JTkZMQVRFXFxuICAzNTpcXHRcXHRoZWxwXFxuICAzNjpcXHRcXHQgIFRoaXMgaXMgYSBMaW51eC1zcGVjaWZpYyBleHRlbnNpb24gdG8gUm9ja1JpZGdlIHdoaWNoIGxldHMgeW91IHN0b3JlXFxuICAzNzpcXHRcXHQgIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtIG9uIGEgQ0QtUk9NIGFuZCBoYXZlIGl0IHRyYW5zcGFyZW50bHlcXG4gIDM4OlxcdFxcdCAgZGVjb21wcmVzc2VkIHdoZW4gdGhlIENELVJPTSBpcyBhY2Nlc3NlZC4gIFNlZVxcbiAgMzk6XFx0XFx0ICBcXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXFx1MDAzZSBmb3IgdGhlIHRvb2xzXFxuICA0MDpcXHRcXHQgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlXFxuICA0MTpcXHRcXHQgIGFibGUgdG8gcmVhZCBzdWNoIGNvbXByZXNzZWQgQ0QtUk9Ncy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NDcuODQ1MzEwNDI2WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDAzMDAzODEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIElTTzk2NjAgQ29tcHJlc3Npb24gQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBJJ20gc3RhcnRpbmcgYXQgdGhlIHRvcCwgcm91Z2hseSBsaW5lcyAxIHRvIDQwMC4gVGhhdCdzIGEgZ29vZCBjaHVuaywgcHJvYmFibHkgdGhlIGluaXRpYWwgc2V0dXAsIGRlY2xhcmF0aW9ucywgYW5kIG1heWJlIHNvbWUgY29yZSBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb21wcmVzc2lvbi4gSSdtIGV4cGVjdGluZyB0byBzZWUgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyB0aGUgY29tcHJlc3Npb24gcHJvY2VzcyBpcyBtYW5hZ2VkIGluIHRoZSBJU085NjYwIGZpbGVzeXN0ZW0uIFRoaW5ncyB0byBsb29rIGZvciBpbW1lZGlhdGVseSBhcmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgaXQgc3VwcG9ydHMsIGFueSBkYXRhIHN0cnVjdHVyZXMgdXNlZCB0byBob2xkIGNvbXByZXNzZWQgYmxvY2tzLCBhbmQgaG93IHRoZXkncmUgaWRlbnRpZmllZC4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudHJ5IHBvaW50cyBmb3IgdGhlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIOKAkyB0aGUgb25lcyB0aGF0IGFyZSBjYWxsZWQgd2hlbiBhIGZpbGUgaXMgd3JpdHRlbiBvciByZWFkLiBBcmUgdGhleSBkaXJlY3QgY2FsbHMgdG8gbGlicmFyeSByb3V0aW5lcywgb3IgYXJlIHRoZXJlIGludGVybmFsIHdyYXBwZXIgZnVuY3Rpb25zPyBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGJpdHMgb2YgY29kZSB0aGF0IGRlY2lkZSB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGV2ZW4gKmF0dGVtcHRlZCogb24gYSBwYXJ0aWN1bGFyIGZpbGUg4oCTIHByb2JhYmx5IHNvbWUgY2hlY2tzIG9uIGZpbGUgYXR0cmlidXRlcyBvciBleHRlbnNpb25zLiBIb3BlZnVsbHksIEknbGwgcXVpY2tseSBzcG90IGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGFyZWFzIHdoZXJlIGRhdGEgaW50ZWdyaXR5IG1pZ2h0IGJlIGF0IHJpc2suIFRoaXMgYXJlYSwgYXJvdW5kIGxpbmVzIDEtNDAwLCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBJU085NjYwIGltcGxlbWVudGF0aW9uLiBMZXQncyBzZWUgd2hhdCB3ZSBmaW5kIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjE4MSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NTEuODc1MzUyNjQyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkyMzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcXG4gICAyOlxcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcXG4gICAzOlxcdCAqICAgXFxuICAgNDpcXHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXFxuICAgNzpcXHRcXG4gICA4OlxcdC8qXFxuICAgOTpcXHQgKiBsaW51eC9mcy9pc29mcy9jb21wcmVzcy5jXFxuICAxMDpcXHQgKlxcbiAgMTE6XFx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cXG4gIDEyOlxcdCAqL1xcbiAgMTM6XFx0XFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAgMTY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jpby5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgMTk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4gIDIwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC96bGliLmhcXHUwMDNlXFxuICAyMTpcXHRcXG4gIDIyOlxcdCNpbmNsdWRlIFxcXCJpc29mcy5oXFxcIlxcbiAgMjM6XFx0I2luY2x1ZGUgXFxcInppc29mcy5oXFxcIlxcbiAgMjQ6XFx0XFxuICAyNTpcXHQvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBnbG9iYWwuICovXFxuICAyNjpcXHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XFxuICAyNzpcXHRcXG4gIDI4OlxcdC8qXFxuICAyOTpcXHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxcbiAgMzA6XFx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxcbiAgMzE6XFx0ICovXFxuICAzMjpcXHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAgMzM6XFx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0LypcXG4gIDM2OlxcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbiAgMzc6XFx0ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG4gIDM4OlxcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbiAgMzk6XFx0ICovXFxuICA0MDpcXHRzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gIDQxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuICA0MjpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiAgNDM6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW50ICplcnJwKVxcbiAgNDQ6XFx0e1xcbiAgNDU6XFx0XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbiAgNDY6XFx0XFx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XFxuICA0NzpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuICA0ODpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmbWFzayA9IGJ1ZnNpemUgLSAxO1xcbiAgNDk6XFx0XFx0aW50IGksIGJsb2NrX3NpemUgPSBibG9ja19lbmQgLSBibG9ja19zdGFydDtcXG4gIDUwOlxcdFxcdHpfc3RyZWFtIHN0cmVhbSA9IHsgLnRvdGFsX291dCA9IDAsXFxuICA1MTpcXHRcXHRcXHRcXHQgICAgLmF2YWlsX2luID0gMCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcXG4gIDUzOlxcdFxcdGludCB6ZXJyO1xcbiAgNTQ6XFx0XFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSArIChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spICsgYnVmbWFzaylcXG4gIDU1OlxcdFxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgNTY6XFx0XFx0aW50IGhhdmVibG9ja3M7XFxuICA1NzpcXHRcXHRibGtjbnRfdCBibG9ja251bTtcXG4gIDU4OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcXG4gIDU5OlxcdFxcdGludCBjdXJiaCwgY3VycGFnZTtcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0aWYgKGJsb2NrX3NpemUgXFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcXG4gIDYyOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gIDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgNjQ6XFx0XFx0fVxcbiAgNjU6XFx0XFx0LyogRW1wdHkgYmxvY2s/ICovXFxuICA2NjpcXHRcXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XFxuICA2NzpcXHRcXHRcXHRmb3IgKCBpID0gMCA7IGkgXFx1MDAzYyBwY291bnQgOyBpKysgKSB7XFxuICA2ODpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbiAgNjk6XFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcXG4gIDcwOlxcdFxcbiAgNzE6XFx0XFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gIDcyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNzM6XFx0XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XFxuICA3NDpcXHRcXHRcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG4gIDc1OlxcdFxcdFxcdH1cXG4gIDc2OlxcdFxcdFxcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XFxuICA3NzpcXHRcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdFxcdC8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovXFxuICA4MDpcXHRcXHRibG9ja251bSA9IGJsb2NrX3N0YXJ0IFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgODE6XFx0XFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgKyAxKTtcXG4gIDgyOlxcdFxcdGlmICghYmhzKSB7XFxuICA4MzpcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuICA4NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDg1OlxcdFxcdH1cXG4gIDg2OlxcdFxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG4gIDg3OlxcdFxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0Y3VyYmggPSAwO1xcbiAgOTA6XFx0XFx0Y3VycGFnZSA9IDA7XFxuICA5MTpcXHRcXHQvKlxcbiAgOTI6XFx0XFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcXG4gIDkzOlxcdFxcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxcbiAgOTQ6XFx0XFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbid0IGhvbGQgdGhlIHpsaWJcXG4gIDk1OlxcdFxcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cXG4gIDk2OlxcdFxcdCAqL1xcbiAgOTc6XFx0XFxuICA5ODpcXHRcXHRpZiAoIWJoc1swXSlcXG4gIDk5OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwMDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NTEuODc1NTQ3NjMyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM2NTIxNDM1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGFzIGlmIHRoZXkgd2VyZSBteSBvd246XG5cbioqRGl2aW5nIEJhY2sgaW50byBjb21wcmVzcy5jKipcblxuQWxyaWdodCwgSSdtIHRoaW5raW5nIHdlIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBJIHJlbWVtYmVyIGhhdmluZyBhIGZldyBuYWdnaW5nIHF1ZXN0aW9ucyBhbmQgcG90ZW50aWFsIG9wdGltaXphdGlvbiBpZGVhcyBsdXJraW5nIGFyb3VuZCBhZnRlciB0aGUgaW5pdGlhbCBwYXNzLiBMZXQncyBzZWUgaWYgdGhvc2Ugc3RpbGwgaG9sZCB3YXRlci4gSSB3YW50IHRvIGNoZWNrIGZvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGdpdmVuIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBjYWNoaW5nIGxheWVyLiBBcmUgdGhlcmUgYW55IHNwb3RzIHdoZXJlIHdlJ3JlIG5vdCBwcm9wZXJseSBoYW5kbGluZyBsb2NraW5nIG9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRoZSBjb21wcmVzc2lvbiBidWZmZXJzIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhPyBJJ20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBvdmVyYWxsIGFsZ29yaXRobSdzIGVmZmljaWVuY3kuIENvdWxkIHdlIHNxdWVlemUgb3V0IGEgZmV3IG1vcmUgY3ljbGVzIHdpdGggYSBkaWZmZXJlbnQgc3RyYXRlZ3ksIG1heWJlIGNvbnNpZGVyaW5nIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxpYnJhcnkgYWx0b2dldGhlciBpZiB0aGUgcGVyZm9ybWFuY2UgZ2FpbnMgYXJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZSBjb2RlIGNodXJuPyBBbmQsIG9mIGNvdXJzZSwgSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBidWZmZXIgb3ZlcmZsb3dzIGJlaW5nIG15IG1haW4gY29uY2VybiwgYnV0IHJlYWxseSBhbnl0aGluZyB0aGF0IGNvdWxkIGFsbG93IGZvciBtYWxpY2lvdXMgbWFuaXB1bGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuIEl0J3MgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSd2ZSBnb3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3OTYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1NC4yNDA3NjU1OTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTQyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvaXNvZnMvY29tcHJlc3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTAxOlxcdFxcdHdhaXRfb25fYnVmZmVyKGJoc1swXSk7XFxuIDEwMjpcXHRcXHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbMF0pKSB7XFxuIDEwMzpcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDEwNDpcXHRcXHRcXHRnb3RvIGJfZWlvO1xcbiAxMDU6XFx0XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRcXHRzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAxMDg6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuIDEwOTpcXHRcXHRcXHRcXG4gMTEwOlxcdFxcdHplcnIgPSB6bGliX2luZmxhdGVJbml0KFxcdTAwMjZzdHJlYW0pO1xcbiAxMTE6XFx0XFx0aWYgKHplcnIgIT0gWl9PSykge1xcbiAxMTI6XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9NRU1fRVJST1IpXFxuIDExMzpcXHRcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuIDExNDpcXHRcXHRcXHRlbHNlXFxuIDExNTpcXHRcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDExNjpcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVRyBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXFxcblxcXCIsXFxuIDExNzpcXHRcXHRcXHRcXHQgICAgICAgemVycik7XFxuIDExODpcXHRcXHRcXHRnb3RvIHpfZWlvO1xcbiAxMTk6XFx0XFx0fVxcbiAxMjA6XFx0XFxuIDEyMTpcXHRcXHR3aGlsZSAoY3VycGFnZSBcXHUwMDNjIHBjb3VudCBcXHUwMDI2XFx1MDAyNiBjdXJiaCBcXHUwMDNjIGhhdmVibG9ja3MgXFx1MDAyNlxcdTAwMjZcXG4gMTIyOlxcdFxcdCAgICAgICB6ZXJyICE9IFpfU1RSRUFNX0VORCkge1xcbiAxMjM6XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcXG4gMTI0OlxcdFxcbiAxMjU6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XFxuIDEyNjpcXHRcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4gMTI3OlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIHBvZmZzZXQpO1xcbiAxMjg6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLmF2YWlsX291dCA9IGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldDtcXG4gMTI5OlxcdFxcdFxcdFxcdFxcdHBvZmZzZXQgPSAwO1xcbiAxMzA6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTMxOlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXFx1MDAyNnppc29mc19zaW5rX3BhZ2U7XFxuIDEzMjpcXHRcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xcbiAxMzM6XFx0XFx0XFx0XFx0fVxcbiAxMzQ6XFx0XFx0XFx0fVxcbiAxMzU6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pIHtcXG4gMTM2OlxcdFxcdFxcdFxcdHdhaXRfb25fYnVmZmVyKGJoc1tjdXJiaF0pO1xcbiAxMzc6XFx0XFx0XFx0XFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzW2N1cmJoXSkpIHtcXG4gMTM4OlxcdFxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTM5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDA6XFx0XFx0XFx0XFx0fVxcbiAxNDE6XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfaW4gID0gYmhzW2N1cmJoXS1cXHUwMDNlYl9kYXRhICtcXG4gMTQyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spO1xcbiAxNDM6XFx0XFx0XFx0XFx0c3RyZWFtLmF2YWlsX2luID0gbWluX3QodW5zaWduZWQsIGJ1ZnNpemUgLVxcbiAxNDQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0KGJsb2NrX3N0YXJ0IFxcdTAwMjYgYnVmbWFzayksXFxuIDE0NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRibG9ja19zaXplKTtcXG4gMTQ2OlxcdFxcdFxcdFxcdGJsb2NrX3NpemUgLT0gc3RyZWFtLmF2YWlsX2luO1xcbiAxNDc6XFx0XFx0XFx0XFx0YmxvY2tfc3RhcnQgPSAwO1xcbiAxNDg6XFx0XFx0XFx0fVxcbiAxNDk6XFx0XFxuIDE1MDpcXHRcXHRcXHR3aGlsZSAoc3RyZWFtLmF2YWlsX291dCBcXHUwMDI2XFx1MDAyNiBzdHJlYW0uYXZhaWxfaW4pIHtcXG4gMTUxOlxcdFxcdFxcdFxcdHplcnIgPSB6bGliX2luZmxhdGUoXFx1MDAyNnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTtcXG4gMTUyOlxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfQlVGX0VSUk9SIFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5hdmFpbF9pbiA9PSAwKVxcbiAxNTM6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NDpcXHRcXHRcXHRcXHRpZiAoemVyciA9PSBaX1NUUkVBTV9FTkQpXFxuIDE1NTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU2OlxcdFxcdFxcdFxcdGlmICh6ZXJyICE9IFpfT0spIHtcXG4gMTU3OlxcdFxcdFxcdFxcdFxcdC8qIEVPRiwgZXJyb3IsIG9yIHRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXQgKi9cXG4gMTU4OlxcdFxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxcbiAxNTk6XFx0XFx0XFx0XFx0XFx0XFx0KmVycnAgPSAtRU5PTUVNO1xcbiAxNjA6XFx0XFx0XFx0XFx0XFx0ZWxzZSB7XFxuIDE2MTpcXHRcXHRcXHRcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVR1xcbiAxNjI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCJ6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXFxcIlxcbiAxNjM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCIgJWQsIGlub2RlID0gJWxsdSxcXFwiXFxuIDE2NDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBwYWdlIGlkeCA9ICVkLCBiaCBpZHggPSAlZCxcXFwiXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBhdmFpbF9pbiA9ICVsZCxcXFwiXFxuIDE2NjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBhdmFpbF9vdXQgPSAlbGRcXFxcblxcXCIsXFxuIDE2NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgemVyciwgaW5vZGUtXFx1MDAzZWlfaW5vLCBjdXJwYWdlLFxcbiAxNjg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGN1cmJoLCBzdHJlYW0uYXZhaWxfaW4sXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RyZWFtLmF2YWlsX291dCk7XFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDE3MTpcXHRcXHRcXHRcXHRcXHR9XFxuIDE3MjpcXHRcXHRcXHRcXHRcXHRnb3RvIGluZmxhdGVfb3V0O1xcbiAxNzM6XFx0XFx0XFx0XFx0fVxcbiAxNzQ6XFx0XFx0XFx0fVxcbiAxNzU6XFx0XFxuIDE3NjpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gMTc3OlxcdFxcdFxcdFxcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cXG4gMTc4OlxcdFxcdFxcdFxcdGlmIChmb2xpbykge1xcbiAxNzk6XFx0XFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcXG4gMTgwOlxcdFxcdFxcdFxcdFxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbiAxODE6XFx0XFx0XFx0XFx0fVxcbiAxODI6XFx0XFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG4gMTgzOlxcdFxcdFxcdFxcdFxcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gTlVMTDtcXG4gMTg1OlxcdFxcdFxcdFxcdH1cXG4gMTg2OlxcdFxcdFxcdFxcdGN1cnBhZ2UrKztcXG4gMTg3OlxcdFxcdFxcdH1cXG4gMTg4OlxcdFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX2luKVxcbiAxODk6XFx0XFx0XFx0XFx0Y3VyYmgrKztcXG4gMTkwOlxcdFxcdH1cXG4gMTkxOlxcdGluZmxhdGVfb3V0OlxcbiAxOTI6XFx0XFx0emxpYl9pbmZsYXRlRW5kKFxcdTAwMjZzdHJlYW0pO1xcbiAxOTM6XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCBcXHUwMDI2XFx1MDAyNiBzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKVxcbiAxOTQ6XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuIDE5NTpcXHRcXG4gMTk2OlxcdHpfZWlvOlxcbiAxOTc6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0Yl9laW86XFxuIDIwMDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaGF2ZWJsb2NrczsgaSsrKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1NC4yNDA4NjM0MDVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTA3MDQ2NDg2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSB3ZSBnby4uLlxuXG4qKkRpdmluZyBpbnRvIGBmcy9pc29mcy9jb21wcmVzcy5jYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBmaWxlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgSVNPRlMgY29tcHJlc3Npb24gaXMgaW1wbGVtZW50ZWQuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Jhc3Agb24gdGhlIGJyb2FkZXIgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIGFuZCB0aGUgSVNPIDk2NjAgc3RhbmRhcmQsIGJ1dCB0aGUgY29tcHJlc3Npb24gYXNwZWN0IGlzIHNvbWV0aGluZyBJIG5lZWQgdG8gcmVmcmVzaC4gV2hhdCBzcGVjaWZpYyBhbGdvcml0aG1zIGFyZSBpbiB1c2U/IEhvdyBhcmUgdGhleSBpbnRlZ3JhdGVkIHdpdGhpbiB0aGUgSS9PIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MgSSBzaG91bGQgYmUgYXdhcmUgb2YsIG9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gYXJlYXM/IEkgd2FudCB0byBzZWUgaG93IHRoZSBjb21wcmVzc2lvbiBhZmZlY3RzIHJlYWQgYW5kIHdyaXRlIHBhdGhzLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgZGUvY29tcHJlc3Npb24sIGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtJ3MgbWV0YWRhdGEgaXMgbW9kaWZpZWQgdG8gc3RvcmUgY29tcHJlc3NlZCBkYXRhLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtIHByZXNlbnRzIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIHVzZXIuIEknbGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgc3RydWN0dXJlcyBvciBmbGFncyB1c2VkIHRvIGluZGljYXRlIGEgZmlsZSdzIGNvbXByZXNzZWQgc3RhdGUuIExldCdzIHNlZSB3aGF0IGludGVyZXN0aW5nIHRlY2huaXF1ZXMgdGhlIGRldmVsb3BlcnMgdXRpbGl6ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzQ2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1OS4zMTEzMzE2OTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvaXNvZnMvY29tcHJlc3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjAxOlxcdFxcdFxcdGJyZWxzZShiaHNbaV0pO1xcbiAyMDI6XFx0XFx0a2ZyZWUoYmhzKTtcXG4gMjAzOlxcdFxcdHJldHVybiBzdHJlYW0udG90YWxfb3V0O1xcbiAyMDQ6XFx0fVxcbiAyMDU6XFx0XFxuIDIwNjpcXHQvKlxcbiAyMDc6XFx0ICogVW5jb21wcmVzcyBkYXRhIHNvIHRoYXQgcGFnZXNbZnVsbF9wYWdlXSBpcyBmdWxseSB1cHRvZGF0ZSBhbmQgcG9zc2libHlcXG4gMjA4OlxcdCAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cXG4gMjA5OlxcdCAqL1xcbiAyMTA6XFx0c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbiAyMTE6XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXFxuIDIxMjpcXHR7XFxuIDIxMzpcXHRcXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xcbiAyMTQ6XFx0XFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XFxuIDIxNTpcXHRcXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcXG4gMjE2OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG4gMjE3OlxcdFxcdHVuc2lnbmVkIGludCBibG9ja3B0cjtcXG4gMjE4OlxcdFxcdGxvZmZfdCBwb2Zmc2V0ID0gMDtcXG4gMjE5OlxcdFxcdGJsa2NudF90IGNzdGFydF9ibG9jaywgY2VuZF9ibG9jaztcXG4gMjIwOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDIyMTpcXHRcXHR1bnNpZ25lZCBpbnQgYmxrYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTtcXG4gMjIyOlxcdFxcdHVuc2lnbmVkIGludCBibGtzaXplID0gMSBcXHUwMDNjXFx1MDAzYyBibGtiaXRzO1xcbiAyMjM6XFx0XFx0aW50IGVycjtcXG4gMjI0OlxcdFxcdGxvZmZfdCByZXQ7XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xcbiAyMjc6XFx0XFxuIDIyODpcXHRcXHQvKlxcbiAyMjk6XFx0XFx0ICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICdmdWxsX3BhZ2UnIHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xcbiAyMzA6XFx0XFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xcbiAyMzE6XFx0XFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxcbiAyMzI6XFx0XFx0ICovXFxuIDIzMzpcXHRcXHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xcbiAyMzQ6XFx0XFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cXHUwMDNlaV9zaXplKTtcXG4gMjM1OlxcdFxcbiAyMzY6XFx0XFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG4gMjM3OlxcdFxcdGNlbmRfYmxvY2sgPSAoZW5kX29mZiArICgxIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgLSAxKVxcbiAyMzg6XFx0XFx0XFx0XFx0XFx1MDAzZVxcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRXQVJOX09OKHN0YXJ0X29mZiAtIChmdWxsX3BhZ2UgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkgIT1cXG4gMjQxOlxcdFxcdFxcdCgoY3N0YXJ0X2Jsb2NrIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXFx1MDAyNiBQQUdFX01BU0spKTtcXG4gMjQyOlxcdFxcbiAyNDM6XFx0XFx0LyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovXFxuIDI0NDpcXHRcXHQvKiBOb3RlOiB3ZSdyZSBub3QgdXNpbmcgaXNvbnVtXzczMSgpIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBrbm93biBhbGlnbmVkICovXFxuIDI0NTpcXHRcXHQvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovXFxuIDI0NjpcXHRcXHRibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSArIGNzdGFydF9ibG9jaykgXFx1MDAzY1xcdTAwM2MgMjtcXG4gMjQ3OlxcdFxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbiAyNDg6XFx0XFx0aWYgKCFiaClcXG4gMjQ5OlxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNTA6XFx0XFx0YmxvY2tfc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0KGJoLVxcdTAwM2ViX2RhdGEgKyAoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xcbiAyNTI6XFx0XFxuIDI1MzpcXHRcXHR3aGlsZSAoY3N0YXJ0X2Jsb2NrIFxcdTAwM2MgY2VuZF9ibG9jayBcXHUwMDI2XFx1MDAyNiBwY291bnQgXFx1MDAzZSAwKSB7XFxuIDI1NDpcXHRcXHRcXHQvKiBMb2FkIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBibG9jayBpbiB0aGUgZmlsZSAqL1xcbiAyNTU6XFx0XFx0XFx0YmxvY2twdHIgKz0gNDtcXG4gMjU2OlxcdFxcdFxcdC8qIFRyYXZlcnNlZCB0byBuZXh0IGJsb2NrPyAqL1xcbiAyNTc6XFx0XFx0XFx0aWYgKCEoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkge1xcbiAyNTg6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0XFx0XFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXFx1MDAzZVxcdTAwM2UgYmxrYml0cyk7XFxuIDI2MTpcXHRcXHRcXHRcXHRpZiAoIWJoKVxcbiAyNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIDI2MzpcXHRcXHRcXHR9XFxuIDI2NDpcXHRcXHRcXHRibG9ja19lbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxcbiAyNjU6XFx0XFx0XFx0XFx0XFx0KGJoLVxcdTAwM2ViX2RhdGEgKyAoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xcbiAyNjY6XFx0XFx0XFx0aWYgKGJsb2NrX3N0YXJ0IFxcdTAwM2UgYmxvY2tfZW5kKSB7XFxuIDI2NzpcXHRcXHRcXHRcXHRicmVsc2UoYmgpO1xcbiAyNjg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIDI2OTpcXHRcXHRcXHR9XFxuIDI3MDpcXHRcXHRcXHRlcnIgPSAwO1xcbiAyNzE6XFx0XFx0XFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXFxuIDI3MjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuIDI3MzpcXHRcXHRcXHRwb2Zmc2V0ICs9IHJldDtcXG4gMjc0OlxcdFxcdFxcdGZvbGlvcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDI3NTpcXHRcXHRcXHRwY291bnQgLT0gcG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzY6XFx0XFx0XFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMjc3OlxcdFxcdFxcdHBvZmZzZXQgXFx1MDAyNj0gflBBR0VfTUFTSztcXG4gMjc4OlxcdFxcbiAyNzk6XFx0XFx0XFx0aWYgKGVycikge1xcbiAyODA6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjgxOlxcdFxcdFxcdFxcdC8qXFxuIDI4MjpcXHRcXHRcXHRcXHQgKiBEaWQgd2UgZmluaXNoIHJlYWRpbmcgdGhlIHBhZ2Ugd2UgcmVhbGx5IHdhbnRlZFxcbiAyODM6XFx0XFx0XFx0XFx0ICogdG8gcmVhZD9cXG4gMjg0OlxcdFxcdFxcdFxcdCAqL1xcbiAyODU6XFx0XFx0XFx0XFx0aWYgKGZ1bGxfcGFnZSBcXHUwMDNjIDApXFxuIDI4NjpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjg3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDI4ODpcXHRcXHRcXHR9XFxuIDI4OTpcXHRcXG4gMjkwOlxcdFxcdFxcdGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kO1xcbiAyOTE6XFx0XFx0XFx0Y3N0YXJ0X2Jsb2NrKys7XFxuIDI5MjpcXHRcXHR9XFxuIDI5MzpcXHRcXG4gMjk0OlxcdFxcdGlmIChwb2Zmc2V0IFxcdTAwMjZcXHUwMDI2ICpmb2xpb3MpIHtcXG4gMjk1OlxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xcbiAyOTY6XFx0XFxuIDI5NzpcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xcbiAyOTg6XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIDI5OTpcXHRcXHR9XFxuIDMwMDpcXHRcXHRicmVsc2UoYmgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1OS4zMTE0Mjk5NDVaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjIwNDkwNDk3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byB0aGUgSVNPRlMgQ29tcHJlc3Npb24gQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBMZXQncyB6ZXJvIGluIG9uIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgSVNPRlMgY29tcHJlc3Npb24gbG9naWMg4oCTIEknbSB0aGlua2luZyBsaW5lcyAzMDEgdGhyb3VnaCA0MDAgd2l0aGluIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgKG9yIHBvdGVudGlhbCBoZWFkYWNoZSkgaGFwcGVucy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGV5J3JlIGhhbmRsaW5nIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gc3BlY2lmaWNhbGx5IGluIHRoaXMgbW9kdWxlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFyb3VuZCB0aGUgY2hvaWNlIG9mIGFsZ29yaXRobSwgZXJyb3IgaGFuZGxpbmcsIGJ1ZmZlciBtYW5hZ2VtZW50Li4uIGFsbCB0aGUgdXN1YWwgc3VzcGVjdHMuIEkgd2FudCB0byBzZWUgaWYgdGhlcmUncyBhbnl0aGluZyBzdWJ0bHkgb2ZmLCBvciBtYXliZSBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gSSBtaXNzZWQgcHJldmlvdXNseS4gSXQncyBhIGtleSBwYXJ0IG9mIHRoZSBJU09GUyBpbXBsZW1lbnRhdGlvbiwgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCdzIHJvYnVzdCBhbmQgZWZmaWNpZW50LiBMZXQncyBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjAyLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjowMS41MTYzMzgwNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDE6XFx0XFx0cmV0dXJuIDA7XFxuIDMwMjpcXHR9XFxuIDMwMzpcXHRcXG4gMzA0OlxcdC8qXFxuIDMwNTpcXHQgKiBXaGVuIGRlY29tcHJlc3NpbmcsIHdlIHR5cGljYWxseSBvYnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlXFxuIDMwNjpcXHQgKiBwZXIgcmVmZXJlbmNlLiAgV2UgaW5qZWN0IHRoZSBhZGRpdGlvbmFsIHBhZ2VzIGludG8gdGhlIHBhZ2VcXG4gMzA3OlxcdCAqIGNhY2hlIGFzIGEgZm9ybSBvZiByZWFkYWhlYWQuXFxuIDMwODpcXHQgKi9cXG4gMzA5OlxcdHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIDMxMDpcXHR7XFxuIDMxMTpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gMzEyOlxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXFx1MDAzZWlfbWFwcGluZztcXG4gMzEzOlxcdFxcdGludCBlcnI7XFxuIDMxNDpcXHRcXHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XFxuIDMxNTpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuIDMxNjpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxcbiAzMTc6XFx0XFx0XFx0UEFHRV9TSElGVCBcXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xcbiAzMTg6XFx0XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuIDMxOTpcXHRcXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XFxuIDMyMDpcXHRcXHRwZ29mZl90IGluZGV4ID0gZm9saW8tXFx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XFxuIDMyMTpcXHRcXG4gMzIyOlxcdFxcdGVuZF9pbmRleCA9IChpbm9kZS1cXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMzIzOlxcdFxcdC8qXFxuIDMyNDpcXHRcXHQgKiBJZiB0aGlzIGZvbGlvIGlzIHdob2xseSBvdXRzaWRlIGlfc2l6ZSB3ZSBqdXN0IHJldHVybiB6ZXJvO1xcbiAzMjU6XFx0XFx0ICogZG9fZ2VuZXJpY19maWxlX3JlYWQoKSB3aWxsIGhhbmRsZSB0aGlzIGZvciB1c1xcbiAzMjY6XFx0XFx0ICovXFxuIDMyNzpcXHRcXHRpZiAoaW5kZXggXFx1MDAzZT0gZW5kX2luZGV4KSB7XFxuIDMyODpcXHRcXHRcXHRmb2xpb19lbmRfcmVhZChmb2xpbywgdHJ1ZSk7XFxuIDMyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzMwOlxcdFxcdH1cXG4gMzMxOlxcdFxcbiAzMzI6XFx0XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuIDMzMzpcXHRcXHRcXHQvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lXFxuIDMzNDpcXHRcXHRcXHQgICB3ZSBtdXN0IGRvLiAqL1xcbiAzMzU6XFx0XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG4gMzM2OlxcdFxcdFxcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXFxuIDMzNzpcXHRcXHRcXHRcXHRlbmRfaW5kZXggLSAoaW5kZXggXFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcXG4gMzM4OlxcdFxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4gMzM5OlxcdFxcdH0gZWxzZSB7XFxuIDM0MDpcXHRcXHRcXHRmdWxsX3BhZ2UgPSAwO1xcbiAzNDE6XFx0XFx0XFx0cGNvdW50ID0gMTtcXG4gMzQyOlxcdFxcdH1cXG4gMzQzOlxcdFxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbiAzNDQ6XFx0XFx0XFx0XFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xcbiAzNDU6XFx0XFx0aWYgKCFmb2xpb3MpIHtcXG4gMzQ2OlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDM0NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMzQ4OlxcdFxcdH1cXG4gMzQ5OlxcdFxcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XFxuIDM1MDpcXHRcXG4gMzUxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwY291bnQ7IGkrKywgaW5kZXgrKykge1xcbiAzNTI6XFx0XFx0XFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxcbiAzNTM6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDM1NDpcXHRcXHRcXHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxcbiAzNTU6XFx0XFx0XFx0XFx0XFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxcbiAzNTY6XFx0XFx0XFx0XFx0XFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XFxuIDM1NzpcXHRcXHRcXHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXFxuIDM1ODpcXHRcXHRcXHRcXHRmb2xpb3NbaV0gPSBOVUxMO1xcbiAzNTk6XFx0XFx0fVxcbiAzNjA6XFx0XFxuIDM2MTpcXHRcXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XFxuIDM2MjpcXHRcXG4gMzYzOlxcdFxcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xcbiAzNjQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrKSB7XFxuIDM2NTpcXHRcXHRcXHRpZiAoZm9saW9zW2ldKSB7XFxuIDM2NjpcXHRcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW9zW2ldKTtcXG4gMzY3OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xcbiAzNjg6XFx0XFx0XFx0XFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxcbiAzNjk6XFx0XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XFxuIDM3MDpcXHRcXHRcXHR9XFxuIDM3MTpcXHRcXHR9XFxuIDM3MjpcXHRcXG4gMzczOlxcdFxcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcXFwiY3JpdGljYWxcXFwiIHBhZ2UgKi9cXG4gMzc0OlxcdFxcdGtmcmVlKGZvbGlvcyk7XFxuIDM3NTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAzNzY6XFx0fVxcbiAzNzc6XFx0XFxuIDM3ODpcXHRjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHppc29mc19hb3BzID0ge1xcbiAzNzk6XFx0XFx0LnJlYWRfZm9saW8gPSB6aXNvZnNfcmVhZF9mb2xpbyxcXG4gMzgwOlxcdFxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbiAzODE6XFx0fTtcXG4gMzgyOlxcdFxcbiAzODM6XFx0aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcXG4gMzg2OlxcdFxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuIDM4NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMzg4OlxcdFxcbiAzODk6XFx0XFx0cmV0dXJuIDA7XFxuIDM5MDpcXHR9XFxuIDM5MTpcXHRcXG4gMzkyOlxcdHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcXG4gMzkzOlxcdHtcXG4gMzk0OlxcdFxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuIDM5NTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjAxLjUxNjQzNDJaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjAxMDM4MTk4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIFpJU09GUyBEYXRhIEFjY2VzcyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkYXRhIGFjY2VzcyBwYXRoIGZvciBaSVNPRlMgd2l0aGluIHRoZSBrZXJuZWwuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIHRoZSB1c2FnZSBvZiBlaXRoZXIgYHppc29mc19hb3BzYCBvciBgemlzb2ZzX3JlYWRfZm9saW9gLiBUaGUgZ29hbCBoZXJlIGlzIHRvIGdldCBhIHNvbGlkIGdyYXNwIG9mIGhvdyB0aGUgY29tcHJlc3NlZCBJU08gOTY2MCBmaWxlc3lzdGVtIGhhbmRsZXMgZGF0YSByZWFkcy4gU2luY2UgSSdtIGZhbWlsaWFyIHdpdGggdGhlIGBmcy9pc29mcy9gIGRpcmVjdG9yeSwgdGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IG15IGludmVzdGlnYXRpb24uIEknbSBlc3NlbnRpYWxseSBwaW5wb2ludGluZyB0aGUga2V5IGZ1bmN0aW9uIGNhbGxzIGludm9sdmVkIGluIGdldHRpbmcgZGF0YSBvZmYgb2YgdGhlIGNvbXByZXNzZWQgZGlzayBpbWFnZS4gSSdsbCBuZWVkIHRvIGtub3cgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBhcmUgYXNzaWduZWQsIGhvdyB0aGUgcmVhZCBvcGVyYXRpb25zIGFyZSB0cmlnZ2VyZWQsIGFuZCBob3cgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGVzeXN0ZW0ncyBvcGVyYXRpb25zLiBUaGlzIHNob3VsZCBoaWdobGlnaHQgdGhlIGNyaXRpY2FsIHBhdGggZm9yIEkvTy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMyOTUsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjAzLjUyNjgxOTA3OFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY4ODAyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiemlzb2ZzX1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9pc29mc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2OnN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMyOnN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5LSAqL1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6NDA6c3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy00MS1cXHRcXHRcXHRcXHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy00NC17XFxuZnMvaXNvZnMvY29tcHJlc3MuYzo0NTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYy00Ni1cXHR1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo2MTpcXHRpZiAoYmxvY2tfc2l6ZSBcXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSkge1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjItXFx0XFx0KmVycnAgPSAtRUlPO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMDYtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMDc6XFx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjEwODpcXHRtdXRleF9sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwOS1cXHRcXHRcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTE1LVxcdFxcdFxcdCplcnJwID0gLUVJTztcXG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcXHRcXHRwcmludGsoS0VSTl9ERUJVRyBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXFxcblxcXCIsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMTctXFx0XFx0XFx0ICAgICAgIHplcnIpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXFx0XFx0XFx0fSBlbHNlIHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjEzMTpcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKVxcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTMyLVxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE2MS1cXHRcXHRcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVR1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTYyOlxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZSByZXR1cm5lZFxcXCJcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiAlZCwgaW5vZGUgPSAlbGx1LFxcXCJcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVxcdFxcdFxcdH1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjE4MjpcXHRcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgzLVxcdFxcdFxcdFxcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTItXFx0emxpYl9pbmZsYXRlRW5kKFxcdTAwMjZzdHJlYW0pO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTkzOlxcdGlmIChzdHJlYW0ubmV4dF9vdXQgXFx1MDAyNlxcdTAwMjYgc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSlcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk2LXpfZWlvOlxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTk3OlxcdG11dGV4X3VubG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTgtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIwOS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjIxMDpzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIxNS1cXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIxNjpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTctXFx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMzUtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIzNzpcXHRjZW5kX2Jsb2NrID0gKGVuZF9vZmYgKyAoMSBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIzODpcXHRcXHRcXHRcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMzktXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNDAtXFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpICE9XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XFx0XFx0KChjc3RhcnRfYmxvY2sgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSBcXHUwMDI2IFBBR0VfTUFTSykpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzAtXFx0XFx0ZXJyID0gMDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjI3MTpcXHRcXHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3Mi1cXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMwOTpzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE0LVxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXFx0XFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNjpcXHRcXHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM3OlxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQzLVxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0OlxcdFxcdFxcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0NS1cXHRpZiAoIWZvbGlvcykge1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XFx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNzg6Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgwLVxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODItXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM4NTpcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2OlxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjM5Mjp2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0OlxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0xMjcwPXN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcmVsb2NhdGVkKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNDM0LVxcdFxcdGNhc2UgaXNvZnNfZmlsZV9jb21wcmVzc2VkOlxcbmZzL2lzb2ZzL2lub2RlLmM6MTQzNTpcXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9kYXRhLmFfb3BzID0gXFx1MDAyNnppc29mc19hb3BzO1xcbmZzL2lzb2ZzL2lub2RlLmMtMTQzNi1cXHRcXHRcXHRicmVhaztcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MTYwMT1zdGF0aWMgaW50IF9faW5pdCBpbml0X2lzbzk2NjBfZnModm9pZClcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTYwNi0jaWZkZWYgQ09ORklHX1pJU09GU1xcbmZzL2lzb2ZzL2lub2RlLmM6MTYwNzpcXHRlcnIgPSB6aXNvZnNfaW5pdCgpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMTYwOC1cXHRpZiAoZXJyKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNjE2LSNpZmRlZiBDT05GSUdfWklTT0ZTXFxuZnMvaXNvZnMvaW5vZGUuYzoxNjE3OlxcdHppc29mc19jbGVhbnVwKCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNjE4LW91dDE6XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTE2MjU9c3RhdGljIHZvaWQgX19leGl0IGV4aXRfaXNvOTY2MF9mcyh2b2lkKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNjI4LSNpZmRlZiBDT05GSUdfWklTT0ZTXFxuZnMvaXNvZnMvaW5vZGUuYzoxNjI5OlxcdHppc29mc19jbGVhbnVwKCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNjMwLSNlbmRpZlxcbi0tXFxuZnMvaXNvZnMvemlzb2ZzLmgtMTItI2lmZGVmIENPTkZJR19aSVNPRlNcXG5mcy9pc29mcy96aXNvZnMuaDoxMzpleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcztcXG5mcy9pc29mcy96aXNvZnMuaDoxNDpleHRlcm4gaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKTtcXG5mcy9pc29mcy96aXNvZnMuaDoxNTpleHRlcm4gdm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKTtcXG5mcy9pc29mcy96aXNvZnMuaC0xNi0jZW5kaWZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MDMuNTczNzA0NjM4WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjgxNjA5MDQ4MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFppc29mcyBGb2xpbyBDb252ZXJzaW9uIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSBoYXZlIGEgcGF0Y2ggdGhhdCdzIGNvbnZlcnRpbmcgdGhlIHppc29mcyBkZWNvbXByZXNzaW9uIGNvZGUgd2l0aGluIHRoZSBJU09GUyBmaWxlc3lzdGVtIChgZnMvaXNvZnMvY29tcHJlc3MuY2ApIGZyb20gdXNpbmcgcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIG9uZXMuIFRoaXMgaXMgYSBjb21tb24gYW5kIG9mdGVuIGJ1Zy1wcm9uZSBhcmVhIOKAkyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcGFnZSBjYWNoZSByZWZhY3RvcmluZyBpbiBmaWxlc3lzdGVtcyBpcyBhbHdheXMgd29ydGggYSBjbG9zZSBsb29rLlxuXG5GaXJzdCwgcmVhY2hhYmlsaXR5LiBDYW4gd2UgYWN0dWFsbHkgKmhpdCogdGhpcyBjb2RlIGluIGEgZnV6emluZyBlbnZpcm9ubWVudD8gQWJzb2x1dGVseS4gSVNPRlMgKGlzbzk2NjApIGlzIGVhc2lseSBtb3VudGVkIHZpYSBsb29wYmFjayBvciBzdGFuZGFyZCB2aXJ0dWFsIGJsb2NrIGRldmljZXMsIGxpa2UgdGhlIGVtdWxhdGVkIENELVJPTXMgaW4gUUVNVSBvciBHQ0UuICBTeXprYWxsZXIgY2FuIGV2ZW4gbW91bnQgaW50ZW50aW9uYWxseSBjb3JydXB0ZWQgSVNPIGltYWdlcyB3aXRoIHppc29mcyBjb21wcmVzc2lvbiwgd2hpY2ggaXMgYSBrZXkgYWR2YW50YWdlLiBUaGlzIGNvZGUgaXMgYWxzbyBwYXJ0IG9mIGEgY29yZSBWRlMvZmlsZXN5c3RlbSBkcml2ZXIsIGBpc29mc2AsIGFuZCBnZXRzIGJ1aWx0IHdoZW4gYENPTkZJR19JU085NjYwX0ZTYCBhbmQgYENPTkZJR19aSVNPRlNgIGFyZSBlbmFibGVkLlxuXG5OZXh0LCBpcyB0aGlzICp3b3J0aCogZnV6emluZz8gWWVzLCB3aXRob3V0IGEgZG91YnQuIFdlJ3JlIGRlYWxpbmcgd2l0aCByZWFjaGFibGUsIGV4ZWN1dGFibGUgY29kZSBpbiB0aGUgZmlsZXN5c3RlbSBkZWNvbXByZXNzaW9uIGxvZ2ljLiBUaGlzIHBhdGNoIGludm9sdmVzIHBhZ2UgY2FjaGUgbG9va3VwcywgbWFwcGluZ3MsIHplcm9pbmcsIGFuZCBidWZmZXIgaGFuZGxpbmcsIG5vdyB1c2luZyBmb2xpbyBlcXVpdmFsZW50cy4gVGhlIHBvdGVudGlhbCBmb3IgYnVncyBpcyBoaWdoLCBjb25zaWRlcmluZyB0aGUgcmVmYWN0b3JpbmcuICBUaGluayByZWZjb3VudGluZywgbG9ja2luZywgdW5tYXBwaW5nLCBhbmQgcmFjZSBjb25kaXRpb25zIOKAkyBhbGwgY2xhc3NpYyBmaWxlc3lzdGVtIHZ1bG5lcmFiaWxpdHkgcG9pbnRzLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcGFydDogZm9jdXMgc3ltYm9scy4gIFdoYXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBtb2RpZmllZD8gVGhlIHBhdGNoIHRvdWNoZXMgYHppc29mc191bmNvbXByZXNzX2Jsb2NrYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfcmVhZF9mb2xpb2AuICBJIGNvbmZpcm1lZCB0aGF0IGB6aXNvZnNfcmVhZF9mb2xpb2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGluIGB6aXNvZnNfYW9wc2AsIG1ha2luZyBpdCBhIHRhcmdldCwgYW5kIGB6aXNvZnNfZmlsbF9wYWdlc2AgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaW4gYSBDIGZpbGUgYXJlIHVzdWFsbHkgZGlzdGluY3Qgc3ltYm9scywgd2hpY2ggaGVscHMgd2l0aCB0YXJnZXRlZCBmdXp6aW5nLiBTbywgdGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBleGNlbGxlbnQgdGFyZ2V0cy5cblxuTGV0J3MgY2hlY2sgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBXZSBuZWVkIGBJU085NjYwX0ZTYCAoXCJJU08gOTY2MCBDRFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0XCIpIHdoaWNoIGlzIHRyaXN0YXRlLCBhbmQgYFpJU09GU2AgKFwiVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBleHRlbnNpb25cIikgd2hpY2ggZGVwZW5kcyBvbiB0aGUgZm9ybWVyIGFuZCBzZWxlY3RzIGBaTElCX0lORkxBVEVgLiBJIGRvdWJsZS1jaGVja2VkIHRoZSBgZnMvaXNvZnMvS2NvbmZpZ2AgdG8gYmUgc3VyZS4gSXQncyB0aG9zZSB0d28uXG5cbkZpbmFsbHksIGp1c3QgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBsZXQncyByZXZpc2l0IHRoZSBjaGFuZ2VzIGFnYWluLiBJdCdzIHRob3NlIHNhbWUgdGhyZWUgc3ltYm9sczogYHppc29mc19yZWFkX2ZvbGlvYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIE5vIG90aGVyIHNpZ25pZmljYW50IGNoYW5nZXMuIEFsbCB0aHJlZSBhcmUgc3BlY2lmaWMgdG8gemlzb2ZzLlxuXG5Tbywgc3VtbWluZyB1cDogV29ydGhGdXp6aW5nIGlzIHRydWUuIEZvY3VzU3ltYm9scyBhcmUgW1wiemlzb2ZzX3JlYWRfZm9saW9cIiwgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLCBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJdLiBFbmFibGVDb25maWdzIGFyZSBbXCJJU085NjYwX0ZTXCIsIFwiWklTT0ZTXCJdLiBXZSBoYXZlIGEgY29uY2lzZSBleHBsYW5hdGlvbi4gVGltZSB0byBtb3ZlIG9uIGFuZCBzZXQgdGhlIHJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MzQ3LCJPdXRwdXRUb2tlbnMiOjE0NSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNDAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MTEuNzM0NjExOTg5WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODU4NTEwOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklTTzk2NjBfRlNcIixcbiAgICBcIlpJU09GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInppc29mc19yZWFkX2ZvbGlvXCIsXG4gICAgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLFxuICAgIFwiemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJU085NjYwX0ZTXCIsXG4gICAgXCJaSVNPRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6aXNvZnNfcmVhZF9mb2xpb1wiLFxuICAgIFwiemlzb2ZzX2ZpbGxfcGFnZXNcIixcbiAgICBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgemlzb2ZzICh0cmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaW4gSVNPOTY2MCBmaWxlc3lzdGVtKSBmcm9tIHBhZ2UtYmFzZWQgQVBJcyB0byBmb2xpby1iYXNlZCBBUElzIGFjcm9zcyB6aXNvZnNfcmVhZF9mb2xpbywgemlzb2ZzX2ZpbGxfcGFnZXMsIGFuZCB6aXNvZnNfdW5jb21wcmVzc19ibG9jay4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgZmlsZXN5c3RlbSBhbmQgcGFnZSBjYWNoZSBkZWNvbXByZXNzaW9uIGxvZ2ljIHRoYXQgY2FuIGJlIGV4ZXJjaXNlZCBieSBtb3VudGluZyBhbmQgcmVhZGluZyBjb21wcmVzc2VkIElTTyBpbWFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjExLjgyMDQ3MTk2OFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY1NDE0MjA0ODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoxMS44MjEwODEzNDhaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyNjU0MDgwNzMzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMzUwMzFmNjk3NWQzZTM1ZDhjMjY0ODE4YmU4NTEzOWUxMTIzYjkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuY1xuaW5kZXggZjk4NjlkNjJiODUwOS4uMmQyM2FiYWViODc0MiAxMDA2NDRcbi0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbisrKyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbkBAIC0zOSw3ICszOSw3IEBAIHN0YXRpYyBERUZJTkVfTVVURVgoemlzb2ZzX3psaWJfbG9jayk7XG4gICovXG4gc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuLVx0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgcG9mZnNldCxcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gXHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4ge1xuIFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5AQCAtNjYsMTEgKzY2LDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFx0aWYgKGJsb2NrX3NpemUgPT0gMCkge1xuIFx0XHRmb3IgKCBpID0gMCA7IGkgXHUwMDNjIHBjb3VudCA7IGkrKyApIHtcbiBcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuK1x0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07XG4gXG4tXHRcdFx0aWYgKCFwYWdlc1tpXSlcbitcdFx0XHRpZiAoIWZvbGlvKVxuIFx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0bWVtemVyb19wYWdlKHBhZ2VzW2ldLCBvZmYsIFBBR0VfU0laRSAtIG9mZik7XG4tXHRcdFx0U2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2ldKTtcbitcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcbitcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdFx0fVxuIFx0XHRyZXR1cm4gKCgobG9mZl90KXBjb3VudCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpIC0gcG9mZnNldDtcbiBcdH1cbkBAIC0xMTksMTEgKzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcbiBcdHdoaWxlIChjdXJwYWdlIFx1MDAzYyBwY291bnQgXHUwMDI2XHUwMDI2IGN1cmJoIFx1MDAzYyBoYXZlYmxvY2tzIFx1MDAyNlx1MDAyNlxuIFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4rXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuLVx0XHRcdGlmIChwYWdlc1tjdXJwYWdlXSkge1xuLVx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKVxuLVx0XHRcdFx0XHRcdCsgcG9mZnNldDtcbi1cdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0O1xuK1x0XHRcdGlmIChmb2xpbykge1xuK1x0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XG4rXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xuIFx0XHRcdFx0cG9mZnNldCA9IDA7XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcbkBAIC0xNzMsOSArMTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIFx0XHRcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTtcbi1cdFx0XHRcdFNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7XG4rXHRcdFx0aWYgKGZvbGlvKSB7XG4rXHRcdFx0XHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xuK1x0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gXHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbkBAIC0yMDYsNyArMjA4LDcgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxuICAqL1xuIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbi1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4rXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4ge1xuIFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcbiBcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xuQEAgLTIyMSwxNCArMjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdGludCBlcnI7XG4gXHRsb2ZmX3QgcmV0O1xuIFxuLVx0QlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTtcbitcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xuIFxuIFx0LypcbiBcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiBcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiBcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiBcdCAqL1xuLVx0c3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7XG4rXHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xuIFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cdTAwM2VpX3NpemUpO1xuIFxuIFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5AQCAtMjY3LDkgKzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0fVxuIFx0XHRlcnIgPSAwO1xuIFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbi1cdFx0XHRcdFx0ICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbitcdFx0XHRcdFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFx1MDAyNmVycik7XG4gXHRcdHBvZmZzZXQgKz0gcmV0O1xuLVx0XHRwYWdlcyArPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0XHRmb2xpb3MgKz0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0cGNvdW50IC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwb2Zmc2V0IFx1MDAyNj0gflBBR0VfTUFTSztcbkBAIC0yODksOSArMjkxLDExIEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0Y3N0YXJ0X2Jsb2NrKys7XG4gXHR9XG4gXG4tXHRpZiAocG9mZnNldCBcdTAwMjZcdTAwMjYgKnBhZ2VzKSB7XG4tXHRcdG1lbXplcm9fcGFnZSgqcGFnZXMsIHBvZmZzZXQsIFBBR0VfU0laRSAtIHBvZmZzZXQpO1xuLVx0XHRTZXRQYWdlVXB0b2RhdGUoKnBhZ2VzKTtcbitcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xuK1xuK1x0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuK1x0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdH1cbiBcdGJyZWxzZShiaCk7XG4gXHRyZXR1cm4gMDtcbkBAIC0zMTIsNyArMzE2LDcgQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG4gXHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuIFx0XHQoMSBcdTAwM2NcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XG4tXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuK1x0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gXG4gXHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG5AQCAtMzM2LDMzICszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0ZnVsbF9wYWdlID0gMDtcbiBcdFx0cGNvdW50ID0gMTtcbiBcdH1cbi1cdHBhZ2VzID0ga3phbGxvY19vYmpzKCpwYWdlcyxcbi1cdFx0XHQgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbi1cdGlmICghcGFnZXMpIHtcbitcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuK1x0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbitcdGlmICghZm9saW9zKSB7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFx0fVxuLVx0cGFnZXNbZnVsbF9wYWdlXSA9IFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2U7XG4rXHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpKyssIGluZGV4KyspIHtcbi1cdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuLVx0XHRcdHBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChtYXBwaW5nLCBpbmRleCk7XG4rXHRcdGlmIChpID09IGZ1bGxfcGFnZSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9saW9zW2ldID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBpbmRleCxcbitcdFx0XHRcdEZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCxcbitcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuK1x0XHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXG4rXHRcdFx0Zm9saW9zW2ldID0gTlVMTDtcbiBcdH1cbiBcbi1cdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgcGFnZXMpO1xuK1x0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuIFxuLVx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi9cbitcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VzW2ldKSB7XG4tXHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pO1xuLVx0XHRcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcbitcdFx0aWYgKGZvbGlvc1tpXSkge1xuK1x0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcbitcdFx0XHRcdGZvbGlvX3B1dChmb2xpb3NbaV0pO1xuIFx0XHR9XG4tXHR9XHRcdFx0XG4rXHR9XG4gXG4gXHQvKiBBdCB0aGlzIHBvaW50LCBlcnIgY29udGFpbnMgMCBvciAtRUlPIGRlcGVuZGluZyBvbiB0aGUgXCJjcml0aWNhbFwiIHBhZ2UgKi9cbi1cdGtmcmVlKHBhZ2VzKTtcbitcdGtmcmVlKGZvbGlvcyk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjExLjgyMTA4MjY3N1oiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMDg1Mzk3MjEyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIHppc29mcyBGb2xpbyBDb252ZXJzaW9uKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgcHJlY2lzZWx5IGhvdyB0aGlzIGNvbnZlcnNpb24gZnJvbSBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gIGluIGBmcy9pc29mcy9jb21wcmVzcy5jYCBpbXBhY3RzIHRoZSB6aXNvZnMgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgcG90ZW50aWFsbHkgY3JpdGljYWwgY2hhbmdlLCBzbyBJJ20gZ29pbmcgdG8gc2NydXRpbml6ZSB0aGUgY29kZSBtZXRpY3Vsb3VzbHkuXG5cbkZpcnN0LCBJIG5lZWQgdG8gcmVhZCBgZnMvaXNvZnMvY29tcHJlc3MuY2AsIGZvY3VzaW5nIHBhcnRpY3VsYXJseSBvbiB0aGUgYXJlYXMgYXJvdW5kIHRoZSBsaW5lcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIHNhZmV0eTsgSSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgYSBwdXJlIGZvbGlvIGNvbnZlcnNpb24uIFRoZXJlJ3MgYWx3YXlzIHRoZSByaXNrLCBob3dldmVyIHNtYWxsLCBvZiBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgYSBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhayBkdXJpbmcgc3VjaCBhIHJlZmFjdG9yaW5nLCBzbyBJJ2xsIGJlIHBhcnRpY3VsYXJseSB2aWdpbGFudCBpbiBzZWFyY2hpbmcgZm9yIHRob3NlIGtpbmRzIG9mIGlzc3Vlcy4gTGV0J3Mgc2VlIHdoYXQncyBjaGFuZ2VkIGFuZCBjb25maXJtIHRoYXQgbm90aGluZyBoYXMgYmVlbiBtaXNzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyMzMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoyMi42NzUwNTg1NjZaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA4NDcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcXG4gICAyOlxcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcXG4gICAzOlxcdCAqICAgXFxuICAgNDpcXHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXFxuICAgNzpcXHRcXG4gICA4OlxcdC8qXFxuICAgOTpcXHQgKiBsaW51eC9mcy9pc29mcy9jb21wcmVzcy5jXFxuICAxMDpcXHQgKlxcbiAgMTE6XFx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cXG4gIDEyOlxcdCAqL1xcbiAgMTM6XFx0XFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAgMTY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jpby5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgMTk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4gIDIwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC96bGliLmhcXHUwMDNlXFxuICAyMTpcXHRcXG4gIDIyOlxcdCNpbmNsdWRlIFxcXCJpc29mcy5oXFxcIlxcbiAgMjM6XFx0I2luY2x1ZGUgXFxcInppc29mcy5oXFxcIlxcbiAgMjQ6XFx0XFxuICAyNTpcXHQvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBnbG9iYWwuICovXFxuICAyNjpcXHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XFxuICAyNzpcXHRcXG4gIDI4OlxcdC8qXFxuICAyOTpcXHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxcbiAgMzA6XFx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxcbiAgMzE6XFx0ICovXFxuICAzMjpcXHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAgMzM6XFx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0LypcXG4gIDM2OlxcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbiAgMzc6XFx0ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG4gIDM4OlxcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbiAgMzk6XFx0ICovXFxuICA0MDpcXHRzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gIDQxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuICA0MjpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiAgNDM6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW50ICplcnJwKVxcbiAgNDQ6XFx0e1xcbiAgNDU6XFx0XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbiAgNDY6XFx0XFx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XFxuICA0NzpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuICA0ODpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmbWFzayA9IGJ1ZnNpemUgLSAxO1xcbiAgNDk6XFx0XFx0aW50IGksIGJsb2NrX3NpemUgPSBibG9ja19lbmQgLSBibG9ja19zdGFydDtcXG4gIDUwOlxcdFxcdHpfc3RyZWFtIHN0cmVhbSA9IHsgLnRvdGFsX291dCA9IDAsXFxuICA1MTpcXHRcXHRcXHRcXHQgICAgLmF2YWlsX2luID0gMCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcXG4gIDUzOlxcdFxcdGludCB6ZXJyO1xcbiAgNTQ6XFx0XFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSArIChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spICsgYnVmbWFzaylcXG4gIDU1OlxcdFxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgNTY6XFx0XFx0aW50IGhhdmVibG9ja3M7XFxuICA1NzpcXHRcXHRibGtjbnRfdCBibG9ja251bTtcXG4gIDU4OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcXG4gIDU5OlxcdFxcdGludCBjdXJiaCwgY3VycGFnZTtcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0aWYgKGJsb2NrX3NpemUgXFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcXG4gIDYyOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gIDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgNjQ6XFx0XFx0fVxcbiAgNjU6XFx0XFx0LyogRW1wdHkgYmxvY2s/ICovXFxuICA2NjpcXHRcXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XFxuICA2NzpcXHRcXHRcXHRmb3IgKCBpID0gMCA7IGkgXFx1MDAzYyBwY291bnQgOyBpKysgKSB7XFxuICA2ODpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbiAgNjk6XFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcXG4gIDcwOlxcdFxcbiAgNzE6XFx0XFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gIDcyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNzM6XFx0XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XFxuICA3NDpcXHRcXHRcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG4gIDc1OlxcdFxcdFxcdH1cXG4gIDc2OlxcdFxcdFxcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XFxuICA3NzpcXHRcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdFxcdC8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovXFxuICA4MDpcXHRcXHRibG9ja251bSA9IGJsb2NrX3N0YXJ0IFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgODE6XFx0XFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgKyAxKTtcXG4gIDgyOlxcdFxcdGlmICghYmhzKSB7XFxuICA4MzpcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuICA4NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDg1OlxcdFxcdH1cXG4gIDg2OlxcdFxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG4gIDg3OlxcdFxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0Y3VyYmggPSAwO1xcbiAgOTA6XFx0XFx0Y3VycGFnZSA9IDA7XFxuICA5MTpcXHRcXHQvKlxcbiAgOTI6XFx0XFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcXG4gIDkzOlxcdFxcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxcbiAgOTQ6XFx0XFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbid0IGhvbGQgdGhlIHpsaWJcXG4gIDk1OlxcdFxcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cXG4gIDk2OlxcdFxcdCAqL1xcbiAgOTc6XFx0XFxuICA5ODpcXHRcXHRpZiAoIWJoc1swXSlcXG4gIDk5OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwMDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjIuNjc1MTY5NTI2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMDc0MDc1NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUgd2UgZ28uLi5cblxuKipEaXZpbmcgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoaXMgZmlsZS4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIElTT0ZTIGNvbXByZXNzaW9uIGlzIGltcGxlbWVudGVkLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIGdyYXNwIG9uIHRoZSBicm9hZGVyIGZpbGUgc3lzdGVtIHN0cnVjdHVyZSBhbmQgdGhlIElTTyA5NjYwIHN0YW5kYXJkLCBidXQgdGhlIGNvbXByZXNzaW9uIGFzcGVjdCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIHJlZnJlc2guIFdoYXQgc3BlY2lmaWMgYWxnb3JpdGhtcyBhcmUgaW4gdXNlPyBIb3cgYXJlIHRoZXkgaW50ZWdyYXRlZCB3aXRoaW4gdGhlIEkvTyBvcGVyYXRpb25zPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIEkgc2hvdWxkIGJlIGF3YXJlIG9mLCBvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIGFyZWFzPyBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgY29tcHJlc3Npb24gYWZmZWN0cyByZWFkIGFuZCB3cml0ZSBwYXRocy4gSSdsbCBiZSBsb29raW5nIGZvciB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGRlL2NvbXByZXNzaW9uLCBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSdzIG1ldGFkYXRhIGlzIG1vZGlmaWVkIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBwcmVzZW50cyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB1c2VyLiBJJ2xsIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIHN0cnVjdHVyZXMgb3IgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSBhIGZpbGUncyBjb21wcmVzc2VkIHN0YXRlLiBMZXQncyBzZWUgd2hhdCBpbnRlcmVzdGluZyB0ZWNobmlxdWVzIHRoZSBkZXZlbG9wZXJzIHV0aWxpemVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDA4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoyNC45ODI1ODA1NloiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDMyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDE6XFx0XFx0d2FpdF9vbl9idWZmZXIoYmhzWzBdKTtcXG4gMTAyOlxcdFxcdGlmICghYnVmZmVyX3VwdG9kYXRlKGJoc1swXSkpIHtcXG4gMTAzOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTA0OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwNTpcXHRcXHR9XFxuIDEwNjpcXHRcXG4gMTA3OlxcdFxcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuIDEwODpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG4gMTA5OlxcdFxcdFxcdFxcbiAxMTA6XFx0XFx0emVyciA9IHpsaWJfaW5mbGF0ZUluaXQoXFx1MDAyNnN0cmVhbSk7XFxuIDExMTpcXHRcXHRpZiAoemVyciAhPSBaX09LKSB7XFxuIDExMjpcXHRcXHRcXHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcXG4gMTEzOlxcdFxcdFxcdFxcdCplcnJwID0gLUVOT01FTTtcXG4gMTE0OlxcdFxcdFxcdGVsc2VcXG4gMTE1OlxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTE2OlxcdFxcdFxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxcXFxuXFxcIixcXG4gMTE3OlxcdFxcdFxcdFxcdCAgICAgICB6ZXJyKTtcXG4gMTE4OlxcdFxcdFxcdGdvdG8gel9laW87XFxuIDExOTpcXHRcXHR9XFxuIDEyMDpcXHRcXG4gMTIxOlxcdFxcdHdoaWxlIChjdXJwYWdlIFxcdTAwM2MgcGNvdW50IFxcdTAwMjZcXHUwMDI2IGN1cmJoIFxcdTAwM2MgaGF2ZWJsb2NrcyBcXHUwMDI2XFx1MDAyNlxcbiAxMjI6XFx0XFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XFxuIDEyMzpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2N1cnBhZ2VdO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gMTI2OlxcdFxcdFxcdFxcdGlmIChmb2xpbykge1xcbiAxMjc6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XFxuIDEyODpcXHRcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xcbiAxMjk6XFx0XFx0XFx0XFx0XFx0cG9mZnNldCA9IDA7XFxuIDEzMDpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiAxMzE6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcXG4gMTMyOlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XFxuIDEzMzpcXHRcXHRcXHRcXHR9XFxuIDEzNDpcXHRcXHRcXHR9XFxuIDEzNTpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9pbikge1xcbiAxMzY6XFx0XFx0XFx0XFx0d2FpdF9vbl9idWZmZXIoYmhzW2N1cmJoXSk7XFxuIDEzNzpcXHRcXHRcXHRcXHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbY3VyYmhdKSkge1xcbiAxMzg6XFx0XFx0XFx0XFx0XFx0KmVycnAgPSAtRUlPO1xcbiAxMzk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MDpcXHRcXHRcXHRcXHR9XFxuIDE0MTpcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9pbiAgPSBiaHNbY3VyYmhdLVxcdTAwM2ViX2RhdGEgK1xcbiAxNDI6XFx0XFx0XFx0XFx0XFx0XFx0XFx0KGJsb2NrX3N0YXJ0IFxcdTAwMjYgYnVmbWFzayk7XFxuIDE0MzpcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfaW4gPSBtaW5fdCh1bnNpZ25lZCwgYnVmc2l6ZSAtXFxuIDE0NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQoYmxvY2tfc3RhcnQgXFx1MDAyNiBidWZtYXNrKSxcXG4gMTQ1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGJsb2NrX3NpemUpO1xcbiAxNDY6XFx0XFx0XFx0XFx0YmxvY2tfc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47XFxuIDE0NzpcXHRcXHRcXHRcXHRibG9ja19zdGFydCA9IDA7XFxuIDE0ODpcXHRcXHRcXHR9XFxuIDE0OTpcXHRcXG4gMTUwOlxcdFxcdFxcdHdoaWxlIChzdHJlYW0uYXZhaWxfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5hdmFpbF9pbikge1xcbiAxNTE6XFx0XFx0XFx0XFx0emVyciA9IHpsaWJfaW5mbGF0ZShcXHUwMDI2c3RyZWFtLCBaX1NZTkNfRkxVU0gpO1xcbiAxNTI6XFx0XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9CVUZfRVJST1IgXFx1MDAyNlxcdTAwMjYgc3RyZWFtLmF2YWlsX2luID09IDApXFxuIDE1MzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU0OlxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfU1RSRUFNX0VORClcXG4gMTU1OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTY6XFx0XFx0XFx0XFx0aWYgKHplcnIgIT0gWl9PSykge1xcbiAxNTc6XFx0XFx0XFx0XFx0XFx0LyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqL1xcbiAxNTg6XFx0XFx0XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9NRU1fRVJST1IpXFxuIDE1OTpcXHRcXHRcXHRcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuIDE2MDpcXHRcXHRcXHRcXHRcXHRlbHNlIHtcXG4gMTYxOlxcdFxcdFxcdFxcdFxcdFxcdHByaW50ayhLRVJOX0RFQlVHXFxuIDE2MjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcXFwiXFxuIDE2MzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiAlZCwgaW5vZGUgPSAlbGx1LFxcXCJcXG4gMTY0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIHBhZ2UgaWR4ID0gJWQsIGJoIGlkeCA9ICVkLFxcXCJcXG4gMTY1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIGF2YWlsX2luID0gJWxkLFxcXCJcXG4gMTY2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIGF2YWlsX291dCA9ICVsZFxcXFxuXFxcIixcXG4gMTY3OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICB6ZXJyLCBpbm9kZS1cXHUwMDNlaV9pbm8sIGN1cnBhZ2UsXFxuIDE2ODpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgY3VyYmgsIHN0cmVhbS5hdmFpbF9pbixcXG4gMTY5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJlYW0uYXZhaWxfb3V0KTtcXG4gMTcwOlxcdFxcdFxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTcxOlxcdFxcdFxcdFxcdFxcdH1cXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGdvdG8gaW5mbGF0ZV9vdXQ7XFxuIDE3MzpcXHRcXHRcXHRcXHR9XFxuIDE3NDpcXHRcXHRcXHR9XFxuIDE3NTpcXHRcXG4gMTc2OlxcdFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xcbiAxNzc6XFx0XFx0XFx0XFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xcbiAxNzg6XFx0XFx0XFx0XFx0aWYgKGZvbGlvKSB7XFxuIDE3OTpcXHRcXHRcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xcbiAxODA6XFx0XFx0XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIDE4MTpcXHRcXHRcXHRcXHR9XFxuIDE4MjpcXHRcXHRcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xcbiAxODM6XFx0XFx0XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuIDE4NDpcXHRcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSBOVUxMO1xcbiAxODU6XFx0XFx0XFx0XFx0fVxcbiAxODY6XFx0XFx0XFx0XFx0Y3VycGFnZSsrO1xcbiAxODc6XFx0XFx0XFx0fVxcbiAxODg6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pXFxuIDE4OTpcXHRcXHRcXHRcXHRjdXJiaCsrO1xcbiAxOTA6XFx0XFx0fVxcbiAxOTE6XFx0aW5mbGF0ZV9vdXQ6XFxuIDE5MjpcXHRcXHR6bGliX2luZmxhdGVFbmQoXFx1MDAyNnN0cmVhbSk7XFxuIDE5MzpcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXFxuIDE5NDpcXHRcXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4gMTk1OlxcdFxcbiAxOTY6XFx0el9laW86XFxuIDE5NzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnppc29mc196bGliX2xvY2spO1xcbiAxOTg6XFx0XFxuIDE5OTpcXHRiX2VpbzpcXG4gMjAwOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBoYXZlYmxvY2tzOyBpKyspXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjI0Ljk4MjY3NjkyWiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5MDAxMDcyODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyB0aGUgc3VtbWFyeSwgcmVuZGVyZWQgYXMgaWYgSSdtIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGlnZ2luZyBEZWVwZXIgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKlxuXG5BbHJpZ2h0LCBJJ3ZlIGdvdCBhIGhhbmRsZSBvbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoaXMgZmlsZSwgYnV0IHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gZXhwYW5kIG15IHNjb3BlLiBMZXQncyBub3QganVzdCBhc3N1bWUgSSd2ZSBzZWVuIGVub3VnaCwgZXZlbiBpZiBJICp0aGluayogSSdtIGdldHRpbmcgdGhlIGdpc3Qgb2YgdGhpbmdzLiBJJ20gYW4gZXhwZXJ0LCB5ZXMsIGJ1dCBleHBlcnRpc2UgbWVhbnMga25vd2luZyB3aGVyZSB0byBsb29rIGFuZCB3aGF0IHRvIGNvbnNpZGVyLCBub3QgbmVjZXNzYXJpbHkgcnVzaGluZyB0byBqdWRnZW1lbnQuIEkgbmVlZCBhIHByb3BlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBlbnRpcmUgZmlsZS4gU28sIEkgbmVlZCB0byBtb3ZlIHBhc3QgdGhlIGluaXRpYWwgc2VjdGlvbiwgYW5kIHJlYWxseSBhbmFseXplIHRoZSByZXN0IG9mIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgY29kZTsgaXQncyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaW4gdGhlIElTT0ZTIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZ1bmN0aW9ucy4gTGV0J3Mgc2VlIHdoYXQgZWxzZSB0aGlzIHNlY3Rpb24gbWlnaHQgaG9sZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc3MSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjYuODgyNzk2NzdaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIzNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIwMTpcXHRcXHRcXHRicmVsc2UoYmhzW2ldKTtcXG4gMjAyOlxcdFxcdGtmcmVlKGJocyk7XFxuIDIwMzpcXHRcXHRyZXR1cm4gc3RyZWFtLnRvdGFsX291dDtcXG4gMjA0OlxcdH1cXG4gMjA1OlxcdFxcbiAyMDY6XFx0LypcXG4gMjA3OlxcdCAqIFVuY29tcHJlc3MgZGF0YSBzbyB0aGF0IHBhZ2VzW2Z1bGxfcGFnZV0gaXMgZnVsbHkgdXB0b2RhdGUgYW5kIHBvc3NpYmx5XFxuIDIwODpcXHQgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uXFxuIDIwOTpcXHQgKi9cXG4gMjEwOlxcdHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcXG4gMjExOlxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbiAyMTI6XFx0e1xcbiAyMTM6XFx0XFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcXG4gMjE0OlxcdFxcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xcbiAyMTU6XFx0XFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMF07XFxuIDIxNjpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuIDIxNzpcXHRcXHR1bnNpZ25lZCBpbnQgYmxvY2twdHI7XFxuIDIxODpcXHRcXHRsb2ZmX3QgcG9mZnNldCA9IDA7XFxuIDIxOTpcXHRcXHRibGtjbnRfdCBjc3RhcnRfYmxvY2ssIGNlbmRfYmxvY2s7XFxuIDIyMDpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAyMjE6XFx0XFx0dW5zaWduZWQgaW50IGJsa2JpdHMgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuIDIyMjpcXHRcXHR1bnNpZ25lZCBpbnQgYmxrc2l6ZSA9IDEgXFx1MDAzY1xcdTAwM2MgYmxrYml0cztcXG4gMjIzOlxcdFxcdGludCBlcnI7XFxuIDIyNDpcXHRcXHRsb2ZmX3QgcmV0O1xcbiAyMjU6XFx0XFxuIDIyNjpcXHRcXHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gMjI3OlxcdFxcbiAyMjg6XFx0XFx0LypcXG4gMjI5OlxcdFxcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cXG4gMjMwOlxcdFxcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcXG4gMjMxOlxcdFxcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cXG4gMjMyOlxcdFxcdCAqL1xcbiAyMzM6XFx0XFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gMjM0OlxcdFxcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiArIFBBR0VfU0laRSwgaW5vZGUtXFx1MDAzZWlfc2l6ZSk7XFxuIDIzNTpcXHRcXG4gMjM2OlxcdFxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuIDIzNzpcXHRcXHRjZW5kX2Jsb2NrID0gKGVuZF9vZmYgKyAoMSBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcXG4gMjM4OlxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG4gMjM5OlxcdFxcbiAyNDA6XFx0XFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpICE9XFxuIDI0MTpcXHRcXHRcXHQoKGNzdGFydF9ibG9jayBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFxcdTAwMjYgUEFHRV9NQVNLKSk7XFxuIDI0MjpcXHRcXG4gMjQzOlxcdFxcdC8qIEZpbmQgdGhlIHBvaW50ZXIgdG8gdGhpcyBzcGVjaWZpYyBjaHVuayAqL1xcbiAyNDQ6XFx0XFx0LyogTm90ZTogd2UncmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqL1xcbiAyNDU6XFx0XFx0LyogTm90ZTogaGVhZGVyX3NpemUgaXMgaW4gMzItYml0IHdvcmRzICg0IGJ5dGVzKSAqL1xcbiAyNDY6XFx0XFx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgKyBjc3RhcnRfYmxvY2spIFxcdTAwM2NcXHUwMDNjIDI7XFxuIDI0NzpcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9ja3B0ciBcXHUwMDNlXFx1MDAzZSBibGtiaXRzKTtcXG4gMjQ4OlxcdFxcdGlmICghYmgpXFxuIDI0OTpcXHRcXHRcXHRyZXR1cm4gLUVJTztcXG4gMjUwOlxcdFxcdGJsb2NrX3N0YXJ0ID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdChiaC1cXHUwMDNlYl9kYXRhICsgKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcXG4gMjUyOlxcdFxcbiAyNTM6XFx0XFx0d2hpbGUgKGNzdGFydF9ibG9jayBcXHUwMDNjIGNlbmRfYmxvY2sgXFx1MDAyNlxcdTAwMjYgcGNvdW50IFxcdTAwM2UgMCkge1xcbiAyNTQ6XFx0XFx0XFx0LyogTG9hZCBlbmQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgaW4gdGhlIGZpbGUgKi9cXG4gMjU1OlxcdFxcdFxcdGJsb2NrcHRyICs9IDQ7XFxuIDI1NjpcXHRcXHRcXHQvKiBUcmF2ZXJzZWQgdG8gbmV4dCBibG9jaz8gKi9cXG4gMjU3OlxcdFxcdFxcdGlmICghKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpIHtcXG4gMjU4OlxcdFxcdFxcdFxcdGJyZWxzZShiaCk7XFxuIDI1OTpcXHRcXG4gMjYwOlxcdFxcdFxcdFxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbiAyNjE6XFx0XFx0XFx0XFx0aWYgKCFiaClcXG4gMjYyOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNjM6XFx0XFx0XFx0fVxcbiAyNjQ6XFx0XFx0XFx0YmxvY2tfZW5kID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcXG4gMjY1OlxcdFxcdFxcdFxcdFxcdChiaC1cXHUwMDNlYl9kYXRhICsgKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcXG4gMjY2OlxcdFxcdFxcdGlmIChibG9ja19zdGFydCBcXHUwMDNlIGJsb2NrX2VuZCkge1xcbiAyNjc6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjY4OlxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNjk6XFx0XFx0XFx0fVxcbiAyNzA6XFx0XFx0XFx0ZXJyID0gMDtcXG4gMjcxOlxcdFxcdFxcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxcbiAyNzI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFxcdTAwMjZlcnIpO1xcbiAyNzM6XFx0XFx0XFx0cG9mZnNldCArPSByZXQ7XFxuIDI3NDpcXHRcXHRcXHRmb2xpb3MgKz0gcG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzU6XFx0XFx0XFx0cGNvdW50IC09IHBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMjc2OlxcdFxcdFxcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDI3NzpcXHRcXHRcXHRwb2Zmc2V0IFxcdTAwMjY9IH5QQUdFX01BU0s7XFxuIDI3ODpcXHRcXG4gMjc5OlxcdFxcdFxcdGlmIChlcnIpIHtcXG4gMjgwOlxcdFxcdFxcdFxcdGJyZWxzZShiaCk7XFxuIDI4MTpcXHRcXHRcXHRcXHQvKlxcbiAyODI6XFx0XFx0XFx0XFx0ICogRGlkIHdlIGZpbmlzaCByZWFkaW5nIHRoZSBwYWdlIHdlIHJlYWxseSB3YW50ZWRcXG4gMjgzOlxcdFxcdFxcdFxcdCAqIHRvIHJlYWQ/XFxuIDI4NDpcXHRcXHRcXHRcXHQgKi9cXG4gMjg1OlxcdFxcdFxcdFxcdGlmIChmdWxsX3BhZ2UgXFx1MDAzYyAwKVxcbiAyODY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDI4NzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAyODg6XFx0XFx0XFx0fVxcbiAyODk6XFx0XFxuIDI5MDpcXHRcXHRcXHRibG9ja19zdGFydCA9IGJsb2NrX2VuZDtcXG4gMjkxOlxcdFxcdFxcdGNzdGFydF9ibG9jaysrO1xcbiAyOTI6XFx0XFx0fVxcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqZm9saW9zKSB7XFxuIDI5NTpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcXG4gMjk2OlxcdFxcbiAyOTc6XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcXG4gMjk4OlxcdFxcdFxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbiAyOTk6XFx0XFx0fVxcbiAzMDA6XFx0XFx0YnJlbHNlKGJoKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjYuODgyOTIyMTVaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDE1NDI2ODMwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkLCBnZWFyZWQgdG93YXJkIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgRmlsZSBTZWN0aW9uIC0gTGluZXMgMzAxIHRvIEVuZCoqXG5cbkFscmlnaHQsIEknbSBhdCB0aGUgcG9pbnQgd2hlcmUgSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSB0YWlsIGVuZCBvZiB0aGlzIGZpbGUsIHNwZWNpZmljYWxseSBmcm9tIGxpbmUgMzAxIG9ud2FyZC4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byByYXBpZGx5IHNjYW4gdGhpcyBzZWN0aW9uLiBHaXZlbiB3aGF0IEkndmUgc2VlbiBpbiB0aGUgZWFybGllciBwYXJ0cywgSSBoYXZlIGEgZmV3IGltbWVkaWF0ZSBoeXBvdGhlc2VzIHRoYXQgSSB3YW50IHRvIHRlc3QuIElzIHRoaXMgdGhlIGNvbmNsdWRpbmcgc2VjdGlvbiB3aGVyZSB0aGUgY29yZSBsb2dpYyBpcyBiZWluZyBleGVjdXRlZD8gT3IgbWF5YmUgdGhpcyBpcyB3aGVyZSBzb21lIHBvc3QtcHJvY2Vzc2luZyBoYXBwZW5zPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcmVkIGZsYWdzIGxpa2UgdW5leHBlY3RlZCBqdW1wcywgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgcmVjdXJzaXZlIGNhbGxzIHRoYXQgd2VyZW4ndCBvYnZpb3VzIGF0IGZpcnN0IGdsYW5jZT9cblxuSeKAmW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIGFueSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGNvbmNlcHRzIEkgd2FzIHRoaW5raW5nIGFib3V0IGVhcmxpZXIuIEl0IGlzIGxpa2VseSB0aGF0IHRoaXMgc2VjdGlvbiBjb25maXJtcyBvciBlbGltaW5hdGVzIHByZXZpb3VzIGh5cG90aGVzZXMuIEkgaGF2ZSBteSBtZW50YWwgY2hlY2tsaXN0IG9mIGtleSB2YXJpYWJsZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBpbiBtaW5kLiBJIHdhbnQgdG8gc2VlIGhvdyB0aG9zZSBhcmUgYmVpbmcgbWFuaXB1bGF0ZWQgaGVyZSwgaWYgYXQgYWxsLiBBcmUgdGhlcmUgYW55IGNhbGxzIHRvIGV4dGVybmFsIGxpYnJhcmllcywgYW5kIGlmIHNvLCB3aGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIG9mIHRob3NlIGNhbGxzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvdmVyYWxsIGZ1bmN0aW9uYWxpdHk/XG5cbkl04oCZcyBjcnVjaWFsIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBvZiBpbmVmZmljaWVuY3kuIEknbGwgYmUgbG9va2luZyBmb3Igc2VjdGlvbnMgdGhhdCBhcHBlYXIgdG8gYmUgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSwgcGFydGljdWxhcmx5IGlmIHRoZXkgYXJlIGluc2lkZSBsb29wcy4gSWYgdGhpcyBpcyBhIGxhcmdlIGZpbGUsIHRoZSBsYXN0IHBhcnQgaXMgbW9yZSB0aGFuIGxpa2VseSBrZXkgdG8gdGhlIGZ1bmN0aW9uLiBOb3cgdG8gZGl2ZSBpbiBhbmQgZ2V0IGEgZ3JpcCBvbiB3aGF0IHRoaXMgcGFydCBhY3R1YWxseSBkb2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NjE5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjozMS4wMzcxOTM2NzVaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMxOTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMwMTpcXHRcXHRyZXR1cm4gMDtcXG4gMzAyOlxcdH1cXG4gMzAzOlxcdFxcbiAzMDQ6XFx0LypcXG4gMzA1OlxcdCAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2VcXG4gMzA2OlxcdCAqIHBlciByZWZlcmVuY2UuICBXZSBpbmplY3QgdGhlIGFkZGl0aW9uYWwgcGFnZXMgaW50byB0aGUgcGFnZVxcbiAzMDc6XFx0ICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC5cXG4gMzA4OlxcdCAqL1xcbiAzMDk6XFx0c3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gMzEwOlxcdHtcXG4gMzExOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xcbiAzMTI6XFx0XFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cXHUwMDNlaV9tYXBwaW5nO1xcbiAzMTM6XFx0XFx0aW50IGVycjtcXG4gMzE0OlxcdFxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG4gMzE1OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG4gMzE2OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XFxuIDMxNzpcXHRcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuIDMxODpcXHRcXHRcXHQoMSBcXHUwMDNjXFx1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcXG4gMzE5OlxcdFxcdHN0cnVjdCBmb2xpbyAqKmZvbGlvcztcXG4gMzIwOlxcdFxcdHBnb2ZmX3QgaW5kZXggPSBmb2xpby1cXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcXG4gMzIxOlxcdFxcbiAzMjI6XFx0XFx0ZW5kX2luZGV4ID0gKGlub2RlLVxcdTAwM2VpX3NpemUgKyBQQUdFX1NJWkUgLSAxKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAzMjM6XFx0XFx0LypcXG4gMzI0OlxcdFxcdCAqIElmIHRoaXMgZm9saW8gaXMgd2hvbGx5IG91dHNpZGUgaV9zaXplIHdlIGp1c3QgcmV0dXJuIHplcm87XFxuIDMyNTpcXHRcXHQgKiBkb19nZW5lcmljX2ZpbGVfcmVhZCgpIHdpbGwgaGFuZGxlIHRoaXMgZm9yIHVzXFxuIDMyNjpcXHRcXHQgKi9cXG4gMzI3OlxcdFxcdGlmIChpbmRleCBcXHUwMDNlPSBlbmRfaW5kZXgpIHtcXG4gMzI4OlxcdFxcdFxcdGZvbGlvX2VuZF9yZWFkKGZvbGlvLCB0cnVlKTtcXG4gMzI5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAzMzA6XFx0XFx0fVxcbiAzMzE6XFx0XFxuIDMzMjpcXHRcXHRpZiAoUEFHRV9TSElGVCBcXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQpIHtcXG4gMzMzOlxcdFxcdFxcdC8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmVcXG4gMzM0OlxcdFxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuIDMzNTpcXHRcXHRcXHRmdWxsX3BhZ2UgPSBpbmRleCBcXHUwMDI2ICh6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpO1xcbiAzMzY6XFx0XFx0XFx0cGNvdW50ID0gbWluX3QoaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayxcXG4gMzM3OlxcdFxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbiAzMzg6XFx0XFx0XFx0aW5kZXggLT0gZnVsbF9wYWdlO1xcbiAzMzk6XFx0XFx0fSBlbHNlIHtcXG4gMzQwOlxcdFxcdFxcdGZ1bGxfcGFnZSA9IDA7XFxuIDM0MTpcXHRcXHRcXHRwY291bnQgPSAxO1xcbiAzNDI6XFx0XFx0fVxcbiAzNDM6XFx0XFx0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXFxuIDM0NDpcXHRcXHRcXHRcXHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XFxuIDM0NTpcXHRcXHRpZiAoIWZvbGlvcykge1xcbiAzNDY6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gMzQ3OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzNDg6XFx0XFx0fVxcbiAzNDk6XFx0XFx0Zm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbztcXG4gMzUwOlxcdFxcbiAzNTE6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrLCBpbmRleCsrKSB7XFxuIDM1MjpcXHRcXHRcXHRpZiAoaSA9PSBmdWxsX3BhZ2UpXFxuIDM1MzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gMzU0OlxcdFxcdFxcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXFxuIDM1NTpcXHRcXHRcXHRcXHRcXHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXFxuIDM1NjpcXHRcXHRcXHRcXHRcXHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcXG4gMzU3OlxcdFxcdFxcdGlmIChJU19FUlIoZm9saW9zW2ldKSlcXG4gMzU4OlxcdFxcdFxcdFxcdGZvbGlvc1tpXSA9IE5VTEw7XFxuIDM1OTpcXHRcXHR9XFxuIDM2MDpcXHRcXG4gMzYxOlxcdFxcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTtcXG4gMzYyOlxcdFxcbiAzNjM6XFx0XFx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovXFxuIDM2NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcGNvdW50OyBpKyspIHtcXG4gMzY1OlxcdFxcdFxcdGlmIChmb2xpb3NbaV0pIHtcXG4gMzY2OlxcdFxcdFxcdFxcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xcbiAzNjc6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XFxuIDM2ODpcXHRcXHRcXHRcXHRpZiAoaSAhPSBmdWxsX3BhZ2UpXFxuIDM2OTpcXHRcXHRcXHRcXHRcXHRmb2xpb19wdXQoZm9saW9zW2ldKTtcXG4gMzcwOlxcdFxcdFxcdH1cXG4gMzcxOlxcdFxcdH1cXG4gMzcyOlxcdFxcbiAzNzM6XFx0XFx0LyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlIFxcXCJjcml0aWNhbFxcXCIgcGFnZSAqL1xcbiAzNzQ6XFx0XFx0a2ZyZWUoZm9saW9zKTtcXG4gMzc1OlxcdFxcdHJldHVybiBlcnI7XFxuIDM3NjpcXHR9XFxuIDM3NzpcXHRcXG4gMzc4OlxcdGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XFxuIDM3OTpcXHRcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbiAzODA6XFx0XFx0LyogTm8gYm1hcCBvcGVyYXRpb24gc3VwcG9ydGVkICovXFxuIDM4MTpcXHR9O1xcbiAzODI6XFx0XFxuIDM4MzpcXHRpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpXFxuIDM4NDpcXHR7XFxuIDM4NTpcXHRcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbiAzODY6XFx0XFx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcXG4gMzg3OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzODg6XFx0XFxuIDM4OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzkwOlxcdH1cXG4gMzkxOlxcdFxcbiAzOTI6XFx0dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxcbiAzOTM6XFx0e1xcbiAzOTQ6XFx0XFx0dmZyZWUoemlzb2ZzX3psaWJfd29ya3NwYWNlKTtcXG4gMzk1OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MzEuMDM3MzI4MjU1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjczMjQ1MzQ0NzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBpc29mcyBQYXRjaDogRm9saW8gTWlncmF0aW9uIGFuZCBLTVNBTiBBc3Nlc3NtZW50KipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggY29udmVydGluZyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSB1c2luZyBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbGwgdGhlIG51YW5jZXMgb2YgdGhpcyBtaWdyYXRpb24gYW5kLCBjcml0aWNhbGx5LCBhc3Nlc3MgYW55IHBvdGVudGlhbCBLTVNBTiBpbXBsaWNhdGlvbnMuXG5cbkkgc2VlIHRoZXkncmUgcmVwbGFjaW5nIHRoZSBgc3RydWN0IHBhZ2UgKipwYWdlc2AgYXJndW1lbnQgd2l0aCBgc3RydWN0IGZvbGlvICoqZm9saW9zYCBpbiBgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tgLiBBIHF1aWNrIHNjYW4gc2hvd3MgdGhlIGV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgY2hhbmdlczogdXNpbmcgYGZvbGlvX3plcm9fcmFuZ2VgIGluc3RlYWQgb2YgYG1lbXplcm9fcGFnZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCBpbnN0ZWFkIG9mIGBTZXRQYWdlVXB0b2RhdGVgLCBga21hcF9sb2NhbF9mb2xpb2AgZm9yIGBrbWFwX2xvY2FsX3BhZ2VgLCBhZGp1c3RpbmcgYHN0cmVhbS5hdmFpbF9vdXRgIHRvIHJlZmxlY3QgZm9saW8gc2l6ZXMsIGFuZCBgZmx1c2hfZGNhY2hlX2ZvbGlvYCBpbnN0ZWFkIG9mIGBmbHVzaF9kY2FjaGVfcGFnZWAuIEl0J3MgYWxsIHZlcnkgbWV0aG9kaWNhbCwgd2hpY2ggaXMgZ29vZCB0byBzZWUuXG5cblNpbWlsYXJseSwgYHppc29mc19maWxsX3BhZ2VzYCBnZXRzIHRoZSBmb2xpbyB0cmVhdG1lbnQsIHN3YXBwaW5nIGBwYWdlX29mZnNldGAgZm9yIGBmb2xpb19wb3NgLCBhbmQgdXBkYXRpbmcgdGhlIHplcm9pbmcgYW5kIHVwdG9kYXRlIG1hcmtpbmdzLlxuXG5JbiBgemlzb2ZzX3JlYWRfZm9saW9gLCB0aGUgYHBhZ2VzYCBhcnJheSBhbGxvY2F0aW9uIGlzIHJlcGxhY2VkIHdpdGggYGt6YWxsb2Nfb2Jqc2AsIHdoaWNoIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3Igc2FmZXR5LiBUaGUgYGdyYWJfY2FjaGVfcGFnZV9ub3dhaXRgIGNhbGwgaXMgcmVwbGFjZWQgd2l0aCBgX19maWxlbWFwX2dldF9mb2xpb2AuIFRoZXkncmUgYWxzbyBtYWtpbmcgc3VyZSB0byBoYW5kbGUgdGhlIGBJU19FUlJgIGNhc2UsIHNldHRpbmcgdGhlIGZvbGlvIHRvIGBOVUxMYCBvbiBmYWlsdXJlLCB3aGljaCBpcyByZXNwb25zaWJsZS4gVGhlIGNsZWFudXAgbG9naWMgYXQgdGhlIGVuZCBpcyBhbHNvIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9saW8gcGFyYWRpZ20sIHVzaW5nIGBmbHVzaF9kY2FjaGVfZm9saW9gLCBgZm9saW9fdW5sb2NrYCwgYW5kIGBmb2xpb19wdXRgLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBhcmUgdGhlcmUgYW55IG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuKiAgIFRoZSBgZm9saW9zYCBhcnJheSBpdHNlbGYgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29ianNgLCBzbyB0aGF0J3MgaW5pdGlhbGl6ZWQgdG8gemVybyByaWdodCBvZmYgdGhlIGJhdC5cbiogICBUaGUgZm9saW9zIHRoZW1zZWx2ZXMgYXJlICpwYWdlIGNhY2hlIGZvbGlvcyosIGFuZCB0aGUgZGF0YSBpcyBlaXRoZXIgcG9wdWxhdGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIChmcm9tIHRoZSB6bGliIHN0cmVhbSkgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAuIElmIHpsaWIgZG9lc24ndCBmaWxsIHRoZSBmb2xpbywgdGhlbiBgZm9saW9femVyb19yYW5nZWAgbWFrZXMgc3VyZSBvZiBpdC5cbiogICBFcnJvciBwYXRocyAqZG9uJ3QqIG1hcmsgZm9saW9zIGFzIHVwdG9kYXRlLCB3aGljaCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvci5cbiogICBOb3RoaW5nIGhlcmUgaXMgY29weWluZyBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIHRvIHVzZXJzcGFjZSwgd2hpY2ggaXMgYSBtYWpvciB3aW4uXG4qICAgVGhlcmUgYXJlbid0IGFueSB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMgb3IgcGFkZGluZyBhdCBwbGF5LlxuKiAgIEkgZG9uJ3Qgc2VlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB1c2VkIGluIGJyYW5jaGluZyBsb2dpYy5cblxuT2theSwgbGV0J3MgY29uY3JldGVseSBhc3Nlc3Mgd2hldGhlciB0aGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGFueSAqS01TQU4tc3BlY2lmaWMqIHJpc2tzOiBJJ20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHdvdWxkIHNsaXAgYnkgYSBzdGFuZGFyZCBjb2RlIHJldmlldy4gVGhpcyBsb29rcyBzYWZlLiBUaGUgc29ydHMgb2YgYnVncyBpbnRyb2R1Y2VkIHdvdWxkIGJlIHBhZ2UgY2FjaGUgb3IgZm9saW8gcmVmZXJlbmNlIGNvdW50aW5nIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1ZSB0byBpbmNvcnJlY3Qgc2l6ZXMsIHdoaWNoIG90aGVyIHRvb2xzIGxpa2UgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgcGFnZSBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUgc2hvdWxkIGNhdGNoLlxuXG5MZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGZvdXIgS01TQU4gY3JpdGVyaWE6XG5cbjEuICBObyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgc2VudCB0byB1c2Vyc3BhY2Ugd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nLlxuMi4gIFRoZXJlJ3Mgbm8gY29uZGl0aW9uYWwgbG9naWMgdGhhdCBkZXBlbmRzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiAgVGhlcmUncyBubyBhbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXIuXG40LiAgVGhlcmUgYXJlbid0IGFueSBib3VuZHMgY2hlY2tzIG9yIGxvZ2ljIHRoYXQgd291bGQgYWxsb3cgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLlxuXG5BbHJpZ2h0LCBJJ20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNDI5LCJPdXRwdXRUb2tlbnMiOjIwMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkwMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjM4LjM2MTg2NTU0OVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxOTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow99qhf[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 19:24:20 +0000 UTC FinishedAt: 2026-09-07 19:26:40 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ISO9660_FS", "ZISOFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ISO9660_FS", "ZISOFS" ], "series_id": "479c587b-60a9-4be2-a0df-b2ce37eaa157" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "zisofs_read_folio", "zisofs_fill_pages", "zisofs_uncompress_block" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lTTzk2NjBfRlMmIzM0OywKICAgICYjMzQ7WklTT0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7emlzb2ZzX3JlYWRfZm9saW8mIzM0OywKICAgICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywKICAgICYjMzQ7emlzb2ZzX3VuY29tcHJlc3NfYmxvY2smIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSBgc3RydWN0IHBhZ2VgIEFQSXMgdG8gYHN0cnVjdCBmb2xpb2AgQVBJcyAodXNpbmcgYGttYXBfbG9jYWxfZm9saW9gLCBgZm9saW9femVyb19yYW5nZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCwgYF9fZmlsZW1hcF9nZXRfZm9saW9gLCBldGMuKS4gXG5cblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbnZlcnRzIHppc29mcyAodHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBzdXBwb3J0IGluIElTTzk2NjAgZmlsZXN5c3RlbSkgZnJvbSBwYWdlLWJhc2VkIEFQSXMgdG8gZm9saW8tYmFzZWQgQVBJcyBhY3Jvc3Mgemlzb2ZzX3JlYWRfZm9saW8sIHppc29mc19maWxsX3BhZ2VzLCBhbmQgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2suIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGZpbGVzeXN0ZW0gYW5kIHBhZ2UgY2FjaGUgZGVjb21wcmVzc2lvbiBsb2dpYyB0aGF0IGNhbiBiZSBleGVyY2lzZWQgYnkgbW91bnRpbmcgYW5kIHJlYWRpbmcgY29tcHJlc3NlZCBJU08gaW1hZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzUwMzFmNjk3NWQzZTM1ZDhjMjY0ODE4YmU4NTEzOWUxMTIzYjkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbmluZGV4IGY5ODY5ZDYyYjg1MDkuLjJkMjNhYmFlYjg3NDIgMTAwNjQ0XG4tLS0gYS9mcy9pc29mcy9jb21wcmVzcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9pc29mcy9jb21wcmVzcy5jXG5AQCAtMzksNyAmIzQzOzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgKi9cbiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gXHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4ge1xuIFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5AQCAtNjYsMTEgJiM0Mzs2NiwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdGlmIChibG9ja19zaXplID09IDApIHtcbiBcdFx0Zm9yICggaSA9IDAgOyBpIFx1MDAzYyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHtcbiBcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuJiM0MztcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2ldO1xuIFxuLVx0XHRcdGlmICghcGFnZXNbaV0pXG4mIzQzO1x0XHRcdGlmICghZm9saW8pXG4gXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRtZW16ZXJvX3BhZ2UocGFnZXNbaV0sIG9mZiwgUEFHRV9TSVpFIC0gb2ZmKTtcbi1cdFx0XHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xuJiM0MztcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcbiYjNDM7XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdH1cbiBcdFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XG4gXHR9XG5AQCAtMTE5LDExICYjNDM7MTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFxuIFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbiYjNDM7XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4mIzQzO1xuIFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfcGFnZShwYWdlc1tjdXJwYWdlXSlcbi1cdFx0XHRcdFx0XHQmIzQzOyBwb2Zmc2V0O1xuLVx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRSAtIHBvZmZzZXQ7XG4mIzQzO1x0XHRcdGlmIChmb2xpbykge1xuJiM0MztcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIHBvZmZzZXQpO1xuJiM0MztcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gXHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuQEAgLTE3Myw5ICYjNDM7MTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIFx0XHRcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTtcbi1cdFx0XHRcdFNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7XG4mIzQzO1x0XHRcdGlmIChmb2xpbykge1xuJiM0MztcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gXHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbkBAIC0yMDYsNyAmIzQzOzIwOCw3IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuICAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cbiAgKi9cbiBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXG4tXHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKVxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiB7XG4gXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG5AQCAtMjIxLDE0ICYjNDM7MjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdGludCBlcnI7XG4gXHRsb2ZmX3QgcmV0O1xuIFxuLVx0QlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTtcbiYjNDM7XHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcbiBcbiBcdC8qXG4gXHQgKiBXZSB3YW50IHRvIHJlYWQgYXQgbGVhc3QgJiMzOTtmdWxsX3BhZ2UmIzM5OyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiBcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiBcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiBcdCAqL1xuLVx0c3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7XG4mIzQzO1x0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcbiBcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiAmIzQzOyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gXG4gXHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbkBAIC0yNjcsOSAmIzQzOzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0fVxuIFx0XHRlcnIgPSAwO1xuIFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbi1cdFx0XHRcdFx0ICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuIFx0XHRwb2Zmc2V0ICYjNDM7PSByZXQ7XG4tXHRcdHBhZ2VzICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdFx0Zm9saW9zICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuQEAgLTI4OSw5ICYjNDM7MjkxLDExIEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0Y3N0YXJ0X2Jsb2NrJiM0MzsmIzQzOztcbiBcdH1cbiBcbi1cdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqcGFnZXMpIHtcbi1cdFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XG4tXHRcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xuJiM0MztcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuJiM0MztcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHR9XG4gXHRicmVsc2UoYmgpO1xuIFx0cmV0dXJuIDA7XG5AQCAtMzEyLDcgJiM0MzszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cbiBcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG4gXHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbi1cdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4mIzQzO1x0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gXG4gXHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuQEAgLTMzNiwzMyAmIzQzOzM0MCwzOCBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRmdWxsX3BhZ2UgPSAwO1xuIFx0XHRwY291bnQgPSAxO1xuIFx0fVxuLVx0cGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLFxuLVx0XHRcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuLVx0aWYgKCFwYWdlcykge1xuJiM0MztcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuJiM0MztcdFx0XHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XG4mIzQzO1x0aWYgKCFmb2xpb3MpIHtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRwYWdlc1tmdWxsX3BhZ2VdID0gXHUwMDI2Zm9saW8tXHUwMDNlcGFnZTtcbiYjNDM7XHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgaW5kZXgpO1xuJiM0MztcdFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXG4mIzQzO1x0XHRcdFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxuJiM0MztcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuJiM0MztcdFx0aWYgKElTX0VSUihmb2xpb3NbaV0pKVxuJiM0MztcdFx0XHRmb2xpb3NbaV0gPSBOVUxMO1xuIFx0fVxuIFxuLVx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7XG4mIzQzO1x0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuIFxuLVx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi9cbiYjNDM7XHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKHBhZ2VzW2ldKSB7XG4tXHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pO1xuLVx0XHRcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHRcdGlmIChmb2xpb3NbaV0pIHtcbiYjNDM7XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHRcdFx0XHRmb2xpb19wdXQoZm9saW9zW2ldKTtcbiBcdFx0fVxuLVx0fVx0XHRcdFxuJiM0MztcdH1cbiBcbiBcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcJiMzNDtjcml0aWNhbFwmIzM0OyBwYWdlICovXG4tXHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0a2ZyZWUoZm9saW9zKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lTTzk2NjBfRlMmIzM0OywKICAgICYjMzQ7WklTT0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7emlzb2ZzX3JlYWRfZm9saW8mIzM0OywKICAgICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywKICAgICYjMzQ7emlzb2ZzX3VuY29tcHJlc3NfYmxvY2smIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgemlzb2ZzICh0cmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaW4gSVNPOTY2MCBmaWxlc3lzdGVtKSBmcm9tIHBhZ2UtYmFzZWQgQVBJcyB0byBmb2xpby1iYXNlZCBBUElzIGFjcm9zcyB6aXNvZnNfcmVhZF9mb2xpbywgemlzb2ZzX2ZpbGxfcGFnZXMsIGFuZCB6aXNvZnNfdW5jb21wcmVzc19ibG9jay4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgZmlsZXN5c3RlbSBhbmQgcGFnZSBjYWNoZSBkZWNvbXByZXNzaW9uIGxvZ2ljIHRoYXQgY2FuIGJlIGV4ZXJjaXNlZCBieSBtb3VudGluZyBhbmQgcmVhZGluZyBjb21wcmVzc2VkIElTTyBpbWFnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgNyAxOToyNTozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMgYi9mcy9pc29mcy9jb21wcmVzcy5jCmluZGV4IGY5ODY5ZDYyYjg1MDkuLjJkMjNhYmFlYjg3NDIgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvaXNvZnMvY29tcHJlc3MuYwpAQCAtMzksNyAmIzQzOzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTsKICAqLwogc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAJCQkJICAgICAgbG9mZl90IGJsb2NrX2VuZCwgaW50IHBjb3VudCwKLQkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LAogCQkJCSAgICAgIGludCAqZXJycCkKIHsKIAl1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktJmd0O2lfZm9ybWF0X3Bhcm1bMV07CkBAIC02NiwxMSAmIzQzOzY2LDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCWlmIChibG9ja19zaXplID09IDApIHsKIAkJZm9yICggaSA9IDAgOyBpICZsdDsgcGNvdW50IDsgaSYjNDM7JiM0MzsgKSB7CiAJCQl1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0OwomIzQzOwkJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07CiAKLQkJCWlmICghcGFnZXNbaV0pCiYjNDM7CQkJaWYgKCFmb2xpbykKIAkJCQljb250aW51ZTsKLQkJCW1lbXplcm9fcGFnZShwYWdlc1tpXSwgb2ZmLCBQQUdFX1NJWkUgLSBvZmYpOwotCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2ldKTsKJiM0MzsJCQlmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTsKJiM0MzsJCQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAkJfQogCQlyZXR1cm4gKCgobG9mZl90KXBjb3VudCkgJmx0OyZsdDsgUEFHRV9TSElGVCkgLSBwb2Zmc2V0OwogCX0KQEAgLTExOSwxMSAmIzQzOzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAogCXdoaWxlIChjdXJwYWdlICZsdDsgcGNvdW50ICZhbXA7JmFtcDsgY3VyYmggJmx0OyBoYXZlYmxvY2tzICZhbXA7JmFtcDsKIAkgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHsKJiM0MzsJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07CiYjNDM7CiAJCWlmICghc3RyZWFtLmF2YWlsX291dCkgewotCQkJaWYgKHBhZ2VzW2N1cnBhZ2VdKSB7Ci0JCQkJc3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKQotCQkJCQkJJiM0MzsgcG9mZnNldDsKLQkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFIC0gcG9mZnNldDsKJiM0MzsJCQlpZiAoZm9saW8pIHsKJiM0MzsJCQkJc3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7CiYjNDM7CQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7CiAJCQkJcG9mZnNldCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCXN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopJmFtcDt6aXNvZnNfc2lua19wYWdlOwpAQCAtMTczLDkgJiM0MzsxNzUsOSBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAogCQlpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHsKIAkJCS8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi8KLQkJCWlmIChwYWdlc1tjdXJwYWdlXSkgewotCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTsKLQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZXNbY3VycGFnZV0pOwomIzQzOwkJCWlmIChmb2xpbykgewomIzQzOwkJCQlmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pOwomIzQzOwkJCQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAkJCX0KIAkJCWlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7CiAJCQkJa3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7CkBAIC0yMDYsNyAmIzQzOzIwOCw3IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLgogICovCiBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCi0JCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpCiYjNDM7CQkJICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpCiB7CiAJbG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjsKIAlsb2ZmX3QgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKQEAgLTIyMSwxNCAmIzQzOzIyMywxNCBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJaW50IGVycjsKIAlsb2ZmX3QgcmV0OwogCi0JQlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTsKJiM0MzsJQlVHX09OKCFmb2xpb3NbZnVsbF9wYWdlXSk7CiAKIAkvKgogCSAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAmIzM5O2Z1bGxfcGFnZSYjMzk7IHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0bwogCSAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmcKIAkgKiBwYWdlcyB3aXRoIHRoZSBkYXRhIHdlIGhhdmUgYW55d2F5Li4uCiAJICovCi0Jc3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7CiYjNDM7CXN0YXJ0X29mZiA9IGZvbGlvX3Bvcyhmb2xpb3NbZnVsbF9wYWdlXSk7CiAJZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICYjNDM7IFBBR0VfU0laRSwgaW5vZGUtJmd0O2lfc2l6ZSk7CiAKIAljc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgJmd0OyZndDsgemlzb2ZzX2Jsb2NrX3NoaWZ0OwpAQCAtMjY3LDkgJiM0MzsyNjksOSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJCX0KIAkJZXJyID0gMDsKIAkJcmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsCi0JCQkJCSAgICAgIHBjb3VudCwgcGFnZXMsIHBvZmZzZXQsICZhbXA7ZXJyKTsKJiM0MzsJCQkJCSAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCAmYW1wO2Vycik7CiAJCXBvZmZzZXQgJiM0Mzs9IHJldDsKLQkJcGFnZXMgJiM0Mzs9IHBvZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJCWZvbGlvcyAmIzQzOz0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlwY291bnQgLT0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlmdWxsX3BhZ2UgLT0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlwb2Zmc2V0ICZhbXA7PSB+UEFHRV9NQVNLOwpAQCAtMjg5LDkgJiM0MzsyOTEsMTEgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LAogCQljc3RhcnRfYmxvY2smIzQzOyYjNDM7OwogCX0KIAotCWlmIChwb2Zmc2V0ICZhbXA7JmFtcDsgKnBhZ2VzKSB7Ci0JCW1lbXplcm9fcGFnZSgqcGFnZXMsIHBvZmZzZXQsIFBBR0VfU0laRSAtIHBvZmZzZXQpOwotCQlTZXRQYWdlVXB0b2RhdGUoKnBhZ2VzKTsKJiM0MzsJaWYgKHBvZmZzZXQgJmFtcDsmYW1wOyAqZm9saW9zKSB7CiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvczsKJiM0MzsKJiM0MzsJCWZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIHBvZmZzZXQsIGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldCk7CiYjNDM7CQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKIAl9CiAJYnJlbHNlKGJoKTsKIAlyZXR1cm4gMDsKQEAgLTMxMiw3ICYjNDM7MzE2LDcgQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAl1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPQogCQlQQUdFX1NISUZUICZsdDs9IHppc29mc19ibG9ja19zaGlmdCA/CiAJCSgxICZsdDsmbHQ7ICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwOwotCXN0cnVjdCBwYWdlICoqcGFnZXM7CiYjNDM7CXN0cnVjdCBmb2xpbyAqKmZvbGlvczsKIAlwZ29mZl90IGluZGV4ID0gZm9saW8tJmd0O2luZGV4LCBlbmRfaW5kZXg7CiAKIAllbmRfaW5kZXggPSAoaW5vZGUtJmd0O2lfc2l6ZSAmIzQzOyBQQUdFX1NJWkUgLSAxKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwpAQCAtMzM2LDMzICYjNDM7MzQwLDM4IEBAIHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJCWZ1bGxfcGFnZSA9IDA7CiAJCXBjb3VudCA9IDE7CiAJfQotCXBhZ2VzID0ga3phbGxvY19vYmpzKCpwYWdlcywKLQkJCSAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpOwotCWlmICghcGFnZXMpIHsKJiM0MzsJZm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsCiYjNDM7CQkJICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpOwomIzQzOwlpZiAoIWZvbGlvcykgewogCQlmb2xpb191bmxvY2soZm9saW8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcGFnZXNbZnVsbF9wYWdlXSA9ICZhbXA7Zm9saW8tJmd0O3BhZ2U7CiYjNDM7CWZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7Ci0JCWlmIChpICE9IGZ1bGxfcGFnZSkKLQkJCXBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChtYXBwaW5nLCBpbmRleCk7CiYjNDM7CQlpZiAoaSA9PSBmdWxsX3BhZ2UpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LAomIzQzOwkJCQlGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsCiYjNDM7CQkJCW1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOwomIzQzOwkJaWYgKElTX0VSUihmb2xpb3NbaV0pKQomIzQzOwkJCWZvbGlvc1tpXSA9IE5VTEw7CiAJfQogCi0JZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7CiYjNDM7CWVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTsKIAotCS8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIHBhZ2VzLCBkbyBub3QgU2V0UGFnZVVwdG9kYXRlICovCiYjNDM7CS8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqLwogCWZvciAoaSA9IDA7IGkgJmx0OyBwY291bnQ7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlc1tpXSkgewotCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOwotCQkJdW5sb2NrX3BhZ2UocGFnZXNbaV0pOwomIzQzOwkJaWYgKGZvbGlvc1tpXSkgewomIzQzOwkJCWZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pOwomIzQzOwkJCWZvbGlvX3VubG9jayhmb2xpb3NbaV0pOwogCQkJaWYgKGkgIT0gZnVsbF9wYWdlKQotCQkJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKJiM0MzsJCQkJZm9saW9fcHV0KGZvbGlvc1tpXSk7CiAJCX0KLQl9CQkJCiYjNDM7CX0KIAogCS8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSAmIzM0O2NyaXRpY2FsJiMzNDsgcGFnZSAqLwotCWtmcmVlKHBhZ2VzKTsKJiM0MzsJa2ZyZWUoZm9saW9zKTsKIAlyZXR1cm4gZXJyOwogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwMjEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxNzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBMaW51eCBLZXJuZWwgUGF0Y2ggRXZhbHVhdGlvbiBSZXF1ZXN0KioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCBhIHJlcXVlc3QgaGVyZSB0byBldmFsdWF0ZSBhIHBhdGNoIHNlcmllcyBmb3IgdGhlIExpbnV4IGtlcm5lbCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIE15IGZpcnN0IHByaW9yaXR5IGlzIGFsd2F5cyBzYWZldHksIHNvIEkmIzM5O20gaW1tZWRpYXRlbHkgcnVubmluZyBhIHF1aWNrIHJpc2sgYXNzZXNzbWVudC4gQmFzZWQgb24gdGhlIHVzZXImIzM5O3MgZnJhbWluZywgdGhpcyBhcHBlYXJzIHRvIGJlIGEgc3RhbmRhcmQgcmVxdWVzdCDigJMgY29kZSByZXZpZXcsIHNlY3VyaXR5IFFBLCB0eXBpY2FsIExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuYWx5c2lzLiBObyByZWQgZmxhZ3Mgc28gZmFyLiBUaGlzIGZlZWxzIGxpa2UgYSBiZW5pZ24gUUEgb3IgcGF0Y2ggYW5hbHlzaXMgdGFzay4gTXkgam9iIGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjaGFuZ2VzIGFjdHVhbGx5IG1vZGlmeSByZWFjaGFibGUgY29kZSB0aGF0JiMzOTtzIHdvcnRoIGZ1enppbmcuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYW5kIHBvdGVudGlhbCBmb2N1cyBzeW1ib2xzIHRvIGd1aWRlIG15IGFuYWx5c2lzLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBzcGVjaWZpY3MuIEkmIzM5O2xsIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29kZSBpbiBgZnMvaXNvZnMvY29tcHJlc3MuY2AgaXRzZWxmLiBJIG5lZWQgdG8gY3Jvc3MtcmVmZXJlbmNlIHRoYXQgd2l0aCB0aGUgcmVsZXZhbnQgS2NvbmZpZyBmaWxlcy4gSSYjMzk7bGwgY2hlY2sgYm90aCBgZnMvaXNvZnMvS2NvbmZpZ2AgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBtb3JlIGdlbmVyYWwgYGZzL0tjb25maWdgIHRvIHVuZGVyc3RhbmQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY29udHJvbCB0aGUgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGNvZGUgaXMgYWN0dWFsbHkgdXNlZCBpbiBhIGZ1enphYmxlIGVudmlyb25tZW50LiBJJiMzOTttIHJlYWR5IHRvIGJlZ2luIHRoZSBkZWVwIGRpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aXNvZnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9pc29mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtcbkZ1bGwgb3V0cHV0IGlzIHRvbyBsb25nLCBzaG93aW5nIDUwMCBvdXQgb2YgOTM4IGxpbmVzLlxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxuXG5mcy9pc29mcy9LY29uZmlnPTI9Y29uZmlnIElTTzk2NjBfRlNcbi0tXG5mcy9pc29mcy9LY29uZmlnLTExLVx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcbmZzL2lzb2ZzL0tjb25maWc6MTI6XHQgIFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pc29mcy5yc3RcdTAwM2UgYW5kIHRoZSBDRC1ST00tSE9XVE8sXG5mcy9pc29mcy9LY29uZmlnLTEzLVx0ICBhdmFpbGFibGUgZnJvbSBcdTAwM2NodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0b1x1MDAzZSksIHRoZXJlYnlcbi0tXG5mcy9pc29mcy9LY29uZmlnLTE2LVx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXG5mcy9pc29mcy9LY29uZmlnOjE3Olx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXNvZnMuXG5mcy9pc29mcy9LY29uZmlnLTE4LVxuLS1cbmZzL2lzb2ZzL0tjb25maWc9MzE9Y29uZmlnIFpJU09GU1xuLS1cbmZzL2lzb2ZzL0tjb25maWctMzgtXHQgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWVcbmZzL2lzb2ZzL0tjb25maWc6Mzk6XHQgIFx1MDAzY2h0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvZnMvemlzb2ZzL1x1MDAzZSBmb3IgdGhlIHRvb2xzXG5mcy9pc29mcy9LY29uZmlnLTQwLVx0ICBuZWNlc3NhcnkgdG8gY3JlYXRlIHN1Y2ggYSBmaWxlc3lzdGVtLiAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZVxuLS1cbmZzL2lzb2ZzL01ha2VmaWxlLTItI1xuZnMvaXNvZnMvTWFrZWZpbGU6MzojIE1ha2VmaWxlIGZvciB0aGUgTGludXggaXNvZnMgZmlsZXN5c3RlbSByb3V0aW5lcy5cbmZzL2lzb2ZzL01ha2VmaWxlLTQtI1xuZnMvaXNvZnMvTWFrZWZpbGUtNS1cbmZzL2lzb2ZzL01ha2VmaWxlOjY6b2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpICYjNDM7PSBpc29mcy5vXG5mcy9pc29mcy9NYWtlZmlsZS03LVxuZnMvaXNvZnMvTWFrZWZpbGU6ODppc29mcy15IFx0XHQ6PSBuYW1laS5vIGlub2RlLm8gZGlyLm8gdXRpbC5vIHJvY2subyBleHBvcnQub1xuZnMvaXNvZnMvTWFrZWZpbGU6OTppc29mcy0kKENPTkZJR19KT0xJRVQpXHQmIzQzOz0gam9saWV0Lm9cbmZzL2lzb2ZzL01ha2VmaWxlOjEwOmlzb2ZzLSQoQ09ORklHX1pJU09GUylcdCYjNDM7PSBjb21wcmVzcy5vXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy04LS8qXG5mcy9pc29mcy9jb21wcmVzcy5jOjk6ICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuY1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMC0gKlxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjEtXG5mcy9pc29mcy9jb21wcmVzcy5jOjIyOiNpbmNsdWRlIFwmIzM0O2lzb2ZzLmhcJiMzNDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM6I2luY2x1ZGUgXCYjMzQ7emlzb2ZzLmhcJiMzNDtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQtXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjY6c3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX1NJWkVdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNy1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxLSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMjpzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNC1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2LSAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xuZnMvaXNvZnMvY29tcHJlc3MuYzozNzogKiB0byBvbmUgemlzb2ZzIGJsb2NrLiBTdG9yZSB0aGUgZGF0YSBpbiB0aGUgQHBhZ2VzIGFycmF5IHdpdGggQHBjb3VudFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOC0gKiBlbnRyaWVzLiBTdGFydCBzdG9yaW5nIGF0IG9mZnNldCBAcG9mZnNldCBvZiB0aGUgZmlyc3QgcGFnZS5cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzktICovXG5mcy9pc29mcy9jb21wcmVzcy5jOjQwOnN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuZnMvaXNvZnMvY29tcHJlc3MuYy00MS1cdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy00NC17XG5mcy9pc29mcy9jb21wcmVzcy5jOjQ1Olx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5mcy9pc29mcy9jb21wcmVzcy5jLTQ2LVx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy02MC1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6NjE6XHRpZiAoYmxvY2tfc2l6ZSBcdTAwM2UgZGVmbGF0ZUJvdW5kKDFVTCBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSkge1xuZnMvaXNvZnMvY29tcHJlc3MuYy02Mi1cdFx0KmVycnAgPSAtRUlPO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtODUtXHR9XG5mcy9pc29mcy9jb21wcmVzcy5jOjg2Olx0aGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrbnVtLCBiaHMsIG5lZWRibG9ja3MpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy04Ny1cdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwNi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3Olx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA4Olx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA5LVx0XHRcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cdFx0XHQqZXJycCA9IC1FSU87XG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNy1cdFx0XHQgICAgICAgemVycik7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXHRcdFx0fSBlbHNlIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTMxOlx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzItXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTYxLVx0XHRcdFx0XHRwcmludGsoS0VSTl9ERUJVR1xuZnMvaXNvZnMvY29tcHJlc3MuYzoxNjI6XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVx0XHRcdH1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTgyOlx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVx0emxpYl9pbmZsYXRlRW5kKFx1MDAyNnN0cmVhbSk7XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTYtel9laW86XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcdG11dGV4X3VubG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjA5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM3Olx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM4Olx0XHRcdFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTIzOS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XHRcdCgoY3N0YXJ0X2Jsb2NrIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFx1MDAyNiBQQUdFX01BU0spKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ2LVx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgJiM0MzsgY3N0YXJ0X2Jsb2NrKSBcdTAwM2NcdTAwM2MgMjtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQ3Olx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNDgtXHRpZiAoIWJoKVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjU5LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNjA6XHRcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNjEtXHRcdFx0aWYgKCFiaClcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3MC1cdFx0ZXJyID0gMDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjcxOlx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjcyLVx0XHRcdFx0XHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzA5OnN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxMC17XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTQtXHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTc6XHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE5LVx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzMxLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XHRpZiAoUEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCkge1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXHRcdC8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmVcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVx0XHQgICB3ZSBtdXN0IGRvLiAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XHRcdGZ1bGxfcGFnZSA9IGluZGV4IFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM2Olx0XHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzc6XHRcdFx0ZW5kX2luZGV4IC0gKGluZGV4IFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVx0XHRpbmRleCAtPSBmdWxsX3BhZ2U7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNDMtXHRmb2xpb3MgPSBremFsbG9jX29ianMoKmZvbGlvcyxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0Olx0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQ1LVx0aWYgKCFmb2xpb3MpIHtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2MC1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzYxOlx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjItXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3ODpjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHppc29mc19hb3BzID0ge1xuZnMvaXNvZnMvY29tcHJlc3MuYzozNzk6XHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODAtXHQvKiBObyBibWFwIG9wZXJhdGlvbiBzdXBwb3J0ZWQgKi9cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4Mi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzgzOmludCBfX2luaXQgemlzb2ZzX2luaXQodm9pZClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg1Olx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2Olx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg3LVx0XHRyZXR1cm4gLUVOT01FTTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzkyOnZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzkzLXtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0Olx0dmZyZWUoemlzb2ZzX3psaWJfd29ya3NwYWNlKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzk1LX1cbi0tXG5mcy9pc29mcy9kaXIuYy0yLS8qXG5mcy9pc29mcy9kaXIuYzozOiAqICBsaW51eC9mcy9pc29mcy9kaXIuY1xuZnMvaXNvZnMvZGlyLmMtNC0gKlxuLS1cbmZzL2lzb2ZzL2Rpci5jLTExLSAqXG5mcy9pc29mcy9kaXIuYzoxMjogKiAgaXNvZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9uc1xuZnMvaXNvZnMvZGlyLmMtMTMtICovXG4tLVxuZnMvaXNvZnMvZGlyLmMtMTYtI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG5mcy9pc29mcy9kaXIuYzoxNzojaW5jbHVkZSBcJiMzNDtpc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9kaXIuYy0xOC0jaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlYXR0ci5oXHUwMDNlXG5mcy9pc29mcy9kaXIuYy0xOS1cbmZzL2lzb2ZzL2Rpci5jOjIwOmludCBpc29mc19uYW1lX3RyYW5zbGF0ZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLCBjaGFyICpuZXcsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9pc29mcy9kaXIuYy0yMS17XG4tLVxuZnMvaXNvZnMvZGlyLmM9NTM9aW50IGdldF9hY29ybl9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLFxuLS1cbmZzL2lzb2ZzL2Rpci5jLTU3LVx0dW5zaWduZWQgY2hhciAqY2hyO1xuZnMvaXNvZnMvZGlyLmM6NTg6XHRpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTtcbmZzL2lzb2ZzL2Rpci5jLTU5LVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTg0LSAqL1xuZnMvaXNvZnMvZGlyLmM6ODU6c3RhdGljIGludCBkb19pc29mc19yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLFxuZnMvaXNvZnMvZGlyLmMtODYtXHRcdHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LFxuLS1cbmZzL2lzb2ZzL2Rpci5jLTk4LVx0c3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTtcbmZzL2lzb2ZzL2Rpci5jOjk5Olx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuZnMvaXNvZnMvZGlyLmMtMTAwLVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTEwNy1cdFx0aWYgKCFiaCkge1xuZnMvaXNvZnMvZGlyLmM6MTA4Olx0XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrKTtcbmZzL2lzb2ZzL2Rpci5jLTEwOS1cdFx0XHRpZiAoIWJoKVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTEzNS1cbmZzL2lzb2ZzL2Rpci5jOjEzNjpcdFx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBvZmZzZXRfc2F2ZWQsIGJ1ZnNpemUpKSB7XG5mcy9pc29mcy9kaXIuYy0xMzctXHRcdFx0cHJpbnRrKEtFUk5fTk9USUNFIFwmIzM0O2lzbzk2NjA6IENvcnJ1cHRlZCBkaXJlY3RvcnkgZW50cnlcJiMzNDtcbi0tXG5mcy9pc29mcy9kaXIuYy0xNDQtXHRcdGlmIChmaXJzdF9kZSkge1xuZnMvaXNvZnMvZGlyLmM6MTQ1Olx0XHRcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLFxuZnMvaXNvZnMvZGlyLmMtMTQ2LVx0XHRcdFx0XHRcdFx0XHUwMDI2YmxvY2tfc2F2ZWQsXG5mcy9pc29mcy9kaXIuYy0xNDctXHRcdFx0XHRcdFx0XHRcdTAwMjZvZmZzZXRfc2F2ZWQpO1xuZnMvaXNvZnMvZGlyLmM6MTQ4Olx0XHRcdGlub2RlX251bWJlciA9IGlzb2ZzX2dldF9pbm8oYmxvY2tfc2F2ZWQsXG5mcy9pc29mcy9kaXIuYy0xNDktXHRcdFx0XHRcdFx0XHRvZmZzZXRfc2F2ZWQsIGJ1ZmJpdHMpO1xuLS1cbmZzL2lzb2ZzL2Rpci5jLTIxMC1cdFx0XHRpZiAoc2JpLVx1MDAzZXNfbWFwcGluZyA9PSAmIzM5O24mIzM5Oykge1xuZnMvaXNvZnMvZGlyLmM6MjExOlx0XHRcdFx0bGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHRtcG5hbWUsIGlub2RlKTtcbmZzL2lzb2ZzL2Rpci5jLTIxMi1cdFx0XHRcdHAgPSB0bXBuYW1lO1xuLS1cbmZzL2lzb2ZzL2Rpci5jLTIzMS0gKiBoYW5kbGluZyBzcGxpdCBkaXJlY3RvcnkgZW50cmllcy4uIFRoZSByZWFsIHdvcmsgaXMgZG9uZSBieVxuZnMvaXNvZnMvZGlyLmM6MjMyOiAqIFwmIzM0O2RvX2lzb2ZzX3JlYWRkaXIoKVwmIzM0Oy5cbmZzL2lzb2ZzL2Rpci5jLTIzMy0gKi9cbmZzL2lzb2ZzL2Rpci5jOjIzNDpzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuZnMvaXNvZnMvZGlyLmMtMjM1LXtcbi0tXG5mcy9pc29mcy9kaXIuYy0yNDMtXG5mcy9pc29mcy9kaXIuYzoyNDQ6XHRyZXN1bHQgPSBkb19pc29mc19yZWFkZGlyKGlub2RlLCBmaWxlLCBjdHgsIHRtcG5hbWUpO1xuZnMvaXNvZnMvZGlyLmMtMjQ1LVxuLS1cbmZzL2lzb2ZzL2Rpci5jLTI0OS1cbmZzL2lzb2ZzL2Rpci5jOjI1MDppbnQgaXNvZnNfZmlsZWF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGZpbGVfa2F0dHIgKmZhKVxuZnMvaXNvZnMvZGlyLmMtMjUxLXtcbmZzL2lzb2ZzL2Rpci5jOjI1MjpcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkZW50cnktXHUwMDNlZF9zYik7XG5mcy9pc29mcy9kaXIuYy0yNTMtXG4tLVxuZnMvaXNvZnMvZGlyLmMtMjYzLVxuZnMvaXNvZnMvZGlyLmM6MjY0OmNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPVxuZnMvaXNvZnMvZGlyLmMtMjY1LXtcbi0tXG5mcy9pc29mcy9kaXIuYy0yNjctXHQucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsXG5mcy9pc29mcy9kaXIuYzoyNjg6XHQuaXRlcmF0ZV9zaGFyZWQgPSBpc29mc19yZWFkZGlyLFxuZnMvaXNvZnMvZGlyLmMtMjY5LVx0LnNldGxlYXNlID0gZ2VuZXJpY19zZXRsZWFzZSxcbi0tXG5mcy9pc29mcy9kaXIuYy0yNzQtICovXG5mcy9pc29mcy9kaXIuYzoyNzU6Y29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPVxuZnMvaXNvZnMvZGlyLmMtMjc2LXtcbmZzL2lzb2ZzL2Rpci5jOjI3NzpcdC5sb29rdXAgPSBpc29mc19sb29rdXAsXG5mcy9pc29mcy9kaXIuYzoyNzg6XHQuZmlsZWF0dHJfZ2V0ID0gaXNvZnNfZmlsZWF0dHJfZ2V0LFxuZnMvaXNvZnMvZGlyLmMtMjc5LX07XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtMi0vKlxuZnMvaXNvZnMvZXhwb3J0LmM6MzogKiBmcy9pc29mcy9leHBvcnQuY1xuZnMvaXNvZnMvZXhwb3J0LmMtNC0gKlxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE2LVxuZnMvaXNvZnMvZXhwb3J0LmM6MTc6I2luY2x1ZGUgXCYjMzQ7aXNvZnMuaFwmIzM0O1xuZnMvaXNvZnMvZXhwb3J0LmMtMTgtXG5mcy9pc29mcy9leHBvcnQuYz0xOT1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXG5mcy9pc29mcy9leHBvcnQuYzoyMDppc29mc19leHBvcnRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuZnMvaXNvZnMvZXhwb3J0LmMtMjEtXHRcdCAgdW5zaWduZWQgbG9uZyBibG9jayxcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0yOC1cdFx0cmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7XG5mcy9pc29mcy9leHBvcnQuYzoyOTpcdGlub2RlID0gaXNvZnNfaWdldChzYiwgYmxvY2ssIG9mZnNldCk7XG5mcy9pc29mcy9leHBvcnQuYy0zMC1cdGlmIChJU19FUlIoaW5vZGUpKVxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTQyLSAqIGFuZCByZXR1cm4gdGhlIHVuZGVybHlpbmcgaW5vZGUuICBTZWUgdGhlIGNvbW1lbnRzIGZvclxuZnMvaXNvZnMvZXhwb3J0LmM6NDM6ICogaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoKS4gKi9cbmZzL2lzb2ZzL2V4cG9ydC5jOjQ0OnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19leHBvcnRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZClcbmZzL2lzb2ZzL2V4cG9ydC5jLTQ1LXtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy01NS1cdGlmICghU19JU0RJUihjaGlsZF9pbm9kZS1cdTAwM2VpX21vZGUpKSB7XG5mcy9pc29mcy9leHBvcnQuYzo1NjpcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O2lzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiBcJiMzNDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTU3LVx0XHQgICAgICAgXCYjMzQ7Y2hpbGQgaXMgbm90IGEgZGlyZWN0b3J5IVxcblwmIzM0Oyk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtNjUtXHRpZiAoZV9jaGlsZF9pbm9kZS1cdTAwM2VpX2lnZXQ1X29mZnNldCAhPSAwKSB7XG5mcy9pc29mcy9leHBvcnQuYzo2NjpcdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O2lzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiBcJiMzNDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTY3LVx0XHQgICAgICAgXCYjMzQ7Y2hpbGQgZGlyZWN0b3J5IG5vdCBub3JtYWxpemVkIVxcblwmIzM0Oyk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtODUtXHRkZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQqKWJoLVx1MDAzZWJfZGF0YTtcbmZzL2lzb2ZzL2V4cG9ydC5jOjg2Olx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCAwLCBjaGlsZF9pbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKSB8fFxuZnMvaXNvZnMvZXhwb3J0LmMtODctXHQgICAgaXNvbnVtXzcxMShkZS1cdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cdTAwM2VuYW1lWzBdICE9IDApIHtcbmZzL2lzb2ZzL2V4cG9ydC5jOjg4Olx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7aXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFwmIzM0Oy5cXFwmIzM0OyBkaXJlY3RvcnkgZm9yIE5GUy5cXG5cJiMzNDspO1xuZnMvaXNvZnMvZXhwb3J0LmMtODktXHRcdHJ2ID0gRVJSX1BUUigtRUFDQ0VTKTtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy05Ny1cdC8qIFZlcmlmeSBpdCBpcyBpbiBmYWN0IHRoZSBcJiMzNDsuLlwmIzM0OyBlbnRyeS4gKi9cbmZzL2lzb2ZzL2V4cG9ydC5jOjk4Olx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBwYXJlbnRfb2Zmc2V0LFxuZnMvaXNvZnMvZXhwb3J0LmMtOTktXHRcdFx0XHQgICAgY2hpbGRfaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSkgfHxcbmZzL2lzb2ZzL2V4cG9ydC5jLTEwMC1cdCAgICBpc29udW1fNzExKGRlLVx1MDAzZW5hbWVfbGVuKSAhPSAxIHx8IGRlLVx1MDAzZW5hbWVbMF0gIT0gMSkge1xuZnMvaXNvZnMvZXhwb3J0LmM6MTAxOlx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7aXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFwmIzM0Oy4uXFxcJiMzNDsgXCYjMzQ7XG5mcy9pc29mcy9leHBvcnQuYy0xMDItXHRcdCAgICAgICBcJiMzNDtkaXJlY3RvcnkgZm9yIE5GUy5cXG5cJiMzNDspO1xuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTEwNy1cdC8qIE5vcm1hbGl6ZSAqL1xuZnMvaXNvZnMvZXhwb3J0LmM6MTA4Olx0aXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsIFx1MDAyNnBhcmVudF9ibG9jaywgXHUwMDI2cGFyZW50X29mZnNldCk7XG5mcy9pc29mcy9leHBvcnQuYy0xMDktXG5mcy9pc29mcy9leHBvcnQuYzoxMTA6XHRydiA9IGRfb2J0YWluX2FsaWFzKGlzb2ZzX2lnZXQoY2hpbGRfaW5vZGUtXHUwMDNlaV9zYiwgcGFyZW50X2Jsb2NrLFxuZnMvaXNvZnMvZXhwb3J0LmMtMTExLVx0XHRcdFx0ICAgICBwYXJlbnRfb2Zmc2V0KSk7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmM9MTE4PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2V4cG9ydC5jOjExOTppc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9pc29mcy9leHBvcnQuYy0xMjAtXHRcdCAgICAgICBfX3UzMiAqZmgzMixcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xNjAtXG5mcy9pc29mcy9leHBvcnQuYzoxNjE6c3RydWN0IGlzb2ZzX2ZpZCB7XG5mcy9pc29mcy9leHBvcnQuYy0xNjItXHR1MzIgYmxvY2s7XG4tLVxuZnMvaXNvZnMvZXhwb3J0LmMtMTY5LVxuZnMvaXNvZnMvZXhwb3J0LmM6MTcwOnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19maF90b19kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3MS1cdHN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpXG5mcy9pc29mcy9leHBvcnQuYy0xNzIte1xuZnMvaXNvZnMvZXhwb3J0LmM6MTczOlx0c3RydWN0IGlzb2ZzX2ZpZCAqaWZpZCA9IChzdHJ1Y3QgaXNvZnNfZmlkICopZmlkO1xuZnMvaXNvZnMvZXhwb3J0LmMtMTc0LVxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE3Ny1cbmZzL2lzb2ZzL2V4cG9ydC5jOjE3ODpcdHJldHVybiBpc29mc19leHBvcnRfaWdldChzYiwgaWZpZC1cdTAwM2VibG9jaywgaWZpZC1cdTAwM2VvZmZzZXQsXG5mcy9pc29mcy9leHBvcnQuYy0xNzktXHRcdFx0aWZpZC1cdTAwM2VnZW5lcmF0aW9uKTtcbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xODEtXG5mcy9pc29mcy9leHBvcnQuYzoxODI6c3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2ZoX3RvX3BhcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuZnMvaXNvZnMvZXhwb3J0LmMtMTgzLVx0XHRzdHJ1Y3QgZmlkICpmaWQsIGludCBmaF9sZW4sIGludCBmaF90eXBlKVxuZnMvaXNvZnMvZXhwb3J0LmMtMTg0LXtcbmZzL2lzb2ZzL2V4cG9ydC5jOjE4NTpcdHN0cnVjdCBpc29mc19maWQgKmlmaWQgPSAoc3RydWN0IGlzb2ZzX2ZpZCAqKWZpZDtcbmZzL2lzb2ZzL2V4cG9ydC5jLTE4Ni1cbi0tXG5mcy9pc29mcy9leHBvcnQuYy0xODktXG5mcy9pc29mcy9leHBvcnQuYzoxOTA6XHRyZXR1cm4gaXNvZnNfZXhwb3J0X2lnZXQoc2IsXG5mcy9pc29mcy9leHBvcnQuYy0xOTEtXHRcdFx0ZmhfbGVuIFx1MDAzZSAzID8gaWZpZC1cdTAwM2VwYXJlbnRfYmxvY2sgOiAwLFxuLS1cbmZzL2lzb2ZzL2V4cG9ydC5jLTE5NS1cbmZzL2lzb2ZzL2V4cG9ydC5jOjE5Njpjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgaXNvZnNfZXhwb3J0X29wcyA9IHtcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5NzpcdC5lbmNvZGVfZmhcdD0gaXNvZnNfZXhwb3J0X2VuY29kZV9maCxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5ODpcdC5maF90b19kZW50cnlcdD0gaXNvZnNfZmhfdG9fZGVudHJ5LFxuZnMvaXNvZnMvZXhwb3J0LmM6MTk5Olx0LmZoX3RvX3BhcmVudFx0PSBpc29mc19maF90b19wYXJlbnQsXG5mcy9pc29mcy9leHBvcnQuYzoyMDA6XHQuZ2V0X3BhcmVudCAgICAgPSBpc29mc19leHBvcnRfZ2V0X3BhcmVudCxcbmZzL2lzb2ZzL2V4cG9ydC5jLTIwMS19O1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMi0vKlxuZnMvaXNvZnMvaW5vZGUuYzozOiAqICBsaW51eC9mcy9pc29mcy9pbm9kZS5jXG5mcy9pc29mcy9pbm9kZS5jLTQtICpcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTMwLVxuZnMvaXNvZnMvaW5vZGUuYzozMTojaW5jbHVkZSBcJiMzNDtpc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9pbm9kZS5jOjMyOiNpbmNsdWRlIFwmIzM0O3ppc29mcy5oXCYjMzQ7XG5mcy9pc29mcy9pbm9kZS5jLTMzLVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMzgtXG5mcy9pc29mcy9pbm9kZS5jOjM5OnN0YXRpYyBpbnQgaXNvZnNfaGFzaGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XG5mcy9pc29mcy9pbm9kZS5jOjQwOnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy00MS1cdFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSk7XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy00My0jaWZkZWYgQ09ORklHX0pPTElFVFxuZnMvaXNvZnMvaW5vZGUuYzo0NDpzdGF0aWMgaW50IGlzb2ZzX2hhc2hpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpO1xuZnMvaXNvZnMvaW5vZGUuYzo0NTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XG5mcy9pc29mcy9pbm9kZS5jOjQ2OnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy00Ny1cdFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSk7XG5mcy9pc29mcy9pbm9kZS5jOjQ4OnN0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcF9tcyhjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9pc29mcy9pbm9kZS5jLTQ5LVx0XHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKTtcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTUxLVxuZnMvaXNvZnMvaW5vZGUuYzo1MjpzdGF0aWMgdm9pZCBpc29mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2lzb2ZzL2lub2RlLmMtNTMte1xuZnMvaXNvZnMvaW5vZGUuYzo1NDpcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihzYik7XG5mcy9pc29mcy9pbm9kZS5jLTU1LVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtNjQtXG5mcy9pc29mcy9pbm9kZS5jOjY1OnN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHJlbG9jYXRlZCk7XG5mcy9pc29mcy9pbm9kZS5jOjY2OnN0YXRpYyBpbnQgaXNvZnNfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopO1xuZnMvaXNvZnMvaW5vZGUuYzo2NzpzdGF0aWMgaW50IGlzb2ZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IGRlbnRyeSAqKTtcbmZzL2lzb2ZzL2lub2RlLmMtNjgtXG5mcy9pc29mcy9pbm9kZS5jOjY5OnN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXNvZnNfaW5vZGVfY2FjaGVwO1xuZnMvaXNvZnMvaW5vZGUuYy03MC1cbmZzL2lzb2ZzL2lub2RlLmM6NzE6c3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2lzb2ZzL2lub2RlLmMtNzIte1xuZnMvaXNvZnMvaW5vZGUuYy03My1cdHN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWk7XG5mcy9pc29mcy9pbm9kZS5jOjc0Olx0ZWkgPSBhbGxvY19pbm9kZV9zYihzYiwgaXNvZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbmZzL2lzb2ZzL2lub2RlLmMtNzUtXHRpZiAoIWVpKVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtNzktXG5mcy9pc29mcy9pbm9kZS5jOjgwOnN0YXRpYyB2b2lkIGlzb2ZzX2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2lzb2ZzL2lub2RlLmMtODEte1xuZnMvaXNvZnMvaW5vZGUuYzo4MjpcdGttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTtcbmZzL2lzb2ZzL2lub2RlLmMtODMtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9OTI9c3RhdGljIGludCBfX2luaXQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpXG5mcy9pc29mcy9pbm9kZS5jLTkzLXtcbmZzL2lzb2ZzL2lub2RlLmM6OTQ6XHRpc29mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcJiMzNDtpc29mc19pbm9kZV9jYWNoZVwmIzM0OyxcbmZzL2lzb2ZzL2lub2RlLmMtOTUtXHRcdFx0XHRcdHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLFxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtOTgtXHRcdFx0XHRcdGluaXRfb25jZSk7XG5mcy9pc29mcy9pbm9kZS5jOjk5Olx0aWYgKCFpc29mc19pbm9kZV9jYWNoZXApXG5mcy9pc29mcy9pbm9kZS5jLTEwMC1cdFx0cmV0dXJuIC1FTk9NRU07XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0xMDQ9c3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xMTAtXHRyY3VfYmFycmllcigpO1xuZnMvaXNvZnMvaW5vZGUuYzoxMTE6XHRrbWVtX2NhY2hlX2Rlc3Ryb3koaXNvZnNfaW5vZGVfY2FjaGVwKTtcbmZzL2lzb2ZzL2lub2RlLmMtMTEyLX1cbmZzL2lzb2ZzL2lub2RlLmMtMTEzLVxuZnMvaXNvZnMvaW5vZGUuYzoxMTQ6c3RhdGljIGludCBpc29mc19yZWNvbmZpZ3VyZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG5mcy9pc29mcy9pbm9kZS5jLTExNS17XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xMjEtXG5mcy9pc29mcy9pbm9kZS5jOjEyMjpzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaXNvZnNfc29wcyA9IHtcbmZzL2lzb2ZzL2lub2RlLmM6MTIzOlx0LmFsbG9jX2lub2RlXHQ9IGlzb2ZzX2FsbG9jX2lub2RlLFxuZnMvaXNvZnMvaW5vZGUuYzoxMjQ6XHQuZnJlZV9pbm9kZVx0PSBpc29mc19mcmVlX2lub2RlLFxuZnMvaXNvZnMvaW5vZGUuYzoxMjU6XHQucHV0X3N1cGVyXHQ9IGlzb2ZzX3B1dF9zdXBlcixcbmZzL2lzb2ZzL2lub2RlLmM6MTI2Olx0LnN0YXRmc1x0XHQ9IGlzb2ZzX3N0YXRmcyxcbmZzL2lzb2ZzL2lub2RlLmM6MTI3Olx0LnNob3dfb3B0aW9uc1x0PSBpc29mc19zaG93X29wdGlvbnMsXG5mcy9pc29mcy9pbm9kZS5jLTEyOC19O1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTMwLVxuZnMvaXNvZnMvaW5vZGUuYzoxMzE6c3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBpc29mc19kZW50cnlfb3BzW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTEzMi1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTMzOlx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaGksXG5mcy9pc29mcy9pbm9kZS5jOjEzNDpcdFx0LmRfY29tcGFyZVx0PSBpc29mc19kZW50cnlfY21waSxcbmZzL2lzb2ZzL2lub2RlLmMtMTM1LVx0fSxcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTEzNy1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTM4Olx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaF9tcyxcbmZzL2lzb2ZzL2lub2RlLmM6MTM5Olx0XHQuZF9jb21wYXJlXHQ9IGlzb2ZzX2RlbnRyeV9jbXBfbXMsXG5mcy9pc29mcy9pbm9kZS5jLTE0MC1cdH0sXG5mcy9pc29mcy9pbm9kZS5jLTE0MS1cdHtcbmZzL2lzb2ZzL2lub2RlLmM6MTQyOlx0XHQuZF9oYXNoXHRcdD0gaXNvZnNfaGFzaGlfbXMsXG5mcy9pc29mcy9pbm9kZS5jOjE0MzpcdFx0LmRfY29tcGFyZVx0PSBpc29mc19kZW50cnlfY21waV9tcyxcbmZzL2lzb2ZzL2lub2RlLmMtMTQ0LVx0fSxcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE0Ny1cbmZzL2lzb2ZzL2lub2RlLmM6MTQ4OnN0cnVjdCBpc29mc19vcHRpb25ze1xuZnMvaXNvZnMvaW5vZGUuYy0xNDktXHR1bnNpZ25lZCBpbnQgcm9jazoxO1xuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTcxLS8qXG5mcy9pc29mcy9pbm9kZS5jOjE3MjogKiBDb21wdXRlIHRoZSBoYXNoIGZvciB0aGUgaXNvZnMgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuXG5mcy9pc29mcy9pbm9kZS5jLTE3My0gKi9cbmZzL2lzb2ZzL2lub2RlLmM9MTc0PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6MTc1Omlzb2ZzX2hhc2hpX2NvbW1vbihjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyLCBpbnQgbXMpXG5mcy9pc29mcy9pbm9kZS5jLTE3Ni17XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xOTktLypcbmZzL2lzb2ZzL2lub2RlLmM6MjAwOiAqIENvbXBhcmUgb2YgdHdvIGlzb2ZzIG5hbWVzLlxuZnMvaXNvZnMvaW5vZGUuYy0yMDEtICovXG5mcy9pc29mcy9pbm9kZS5jOjIwMjpzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBfY29tbW9uKFxuZnMvaXNvZnMvaW5vZGUuYy0yMDMtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0cixcbi0tXG5mcy9pc29mcy9pbm9kZS5jPTIyOT1zdGF0aWMgaW50XG5mcy9pc29mcy9pbm9kZS5jOjIzMDppc29mc19oYXNoaShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKVxuZnMvaXNvZnMvaW5vZGUuYy0yMzEte1xuZnMvaXNvZnMvaW5vZGUuYzoyMzI6XHRyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMCk7XG5mcy9pc29mcy9pbm9kZS5jLTIzMy19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yMzU9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyMzY6aXNvZnNfZGVudHJ5X2NtcGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yMzctXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTIzOC17XG5mcy9pc29mcy9pbm9kZS5jOjIzOTpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMCwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI0MC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0yNDMtLypcbmZzL2lzb2ZzL2lub2RlLmM6MjQ0OiAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS5cbmZzL2lzb2ZzL2lub2RlLmMtMjQ1LSAqL1xuZnMvaXNvZnMvaW5vZGUuYz0yNDY9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyNDc6aXNvZnNfaGFzaF9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxuZnMvaXNvZnMvaW5vZGUuYy0yNDgte1xuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MjY0PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6MjY1Omlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcbmZzL2lzb2ZzL2lub2RlLmMtMjY2LXtcbmZzL2lzb2ZzL2lub2RlLmM6MjY3Olx0cmV0dXJuIGlzb2ZzX2hhc2hfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI2OC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yNzA9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyNzE6aXNvZnNfaGFzaGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcbmZzL2lzb2ZzL2lub2RlLmMtMjcyLXtcbmZzL2lzb2ZzL2lub2RlLmM6MjczOlx0cmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDEpO1xuZnMvaXNvZnMvaW5vZGUuYy0yNzQtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9Mjc2PXN0YXRpYyBpbnRcbmZzL2lzb2ZzL2lub2RlLmM6Mjc3Omlzb2ZzX2RlbnRyeV9jbXBfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yNzgtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTI3OS17XG5mcy9pc29mcy9pbm9kZS5jOjI4MDpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMCk7XG5mcy9pc29mcy9pbm9kZS5jLTI4MS19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yODM9c3RhdGljIGludFxuZnMvaXNvZnMvaW5vZGUuYzoyODQ6aXNvZnNfZGVudHJ5X2NtcGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuZnMvaXNvZnMvaW5vZGUuYy0yODUtXHRcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXG5mcy9pc29mcy9pbm9kZS5jLTI4Ni17XG5mcy9pc29mcy9pbm9kZS5jOjI4NzpcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMSk7XG5mcy9pc29mcy9pbm9kZS5jLTI4OC19XG4tLVxuZnMvaXNvZnMvaW5vZGUuYz0yOTE9ZW51bSB7XG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0yOTctXG5mcy9pc29mcy9pbm9kZS5jOjI5ODpzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN0YW50X3RhYmxlIGlzb2ZzX3BhcmFtX21hcFtdID0ge1xuZnMvaXNvZnMvaW5vZGUuYy0yOTktXHR7XCYjMzQ7YWNvcm5cJiMzNDssXHQmIzM5O2EmIzM5O30sXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0zMDctXG5mcy9pc29mcy9pbm9kZS5jOjMwODpzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnN0YW50X3RhYmxlIGlzb2ZzX3BhcmFtX2NoZWNrW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTMwOS1cdHtcJiMzNDtyZWxheGVkXCYjMzQ7LFx0JiMzOTtyJiMzOTt9LFxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMzE1LVxuZnMvaXNvZnMvaW5vZGUuYzozMTY6c3RhdGljIGNvbnN0IHN0cnVjdCBmc19wYXJhbWV0ZXJfc3BlYyBpc29mc19wYXJhbV9zcGVjW10gPSB7XG5mcy9pc29mcy9pbm9kZS5jLTMxNy1cdGZzcGFyYW1fZmxhZ1x0KFwmIzM0O25vcm9ja1wmIzM0OyxcdFx0T3B0X25vcm9jayksXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0zMjQtXHRmc3BhcmFtX3N0cmluZ1x0KFwmIzM0O2lvY2hhcnNldFwmIzM0OyxcdFx0T3B0X2lvY2hhcnNldCksXG5mcy9pc29mcy9pbm9kZS5jOjMyNTpcdGZzcGFyYW1fZW51bVx0KFwmIzM0O21hcFwmIzM0OyxcdFx0XHRPcHRfbWFwLCBpc29mc19wYXJhbV9tYXApLFxuZnMvaXNvZnMvaW5vZGUuYy0zMjYtXHRmc3BhcmFtX3UzMlx0KFwmIzM0O3Nlc3Npb25cJiMzNDssXHRcdE9wdF9zZXNzaW9uKSxcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MjEyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBoYXZpbmcgaXQ6CgoqKkRpZ2dpbmcgaW50byB0aGUgSVNPRlMgQ29uZmlndXJhdGlvbioqCgpSaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmVjaXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5IGZvciB0aGUgWklTT0ZTIGFuZCB0aGUgYnJvYWRlciBJU085NjYwIGZpbGUgc3lzdGVtIHN1cHBvcnQuIFRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0LCBhcyBhbHdheXMsIGlzIHRoZSBgS2NvbmZpZ2AgZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSYjMzk7cyBzb3VyY2UgZGlyZWN0b3J5LiBTcGVjaWZpY2FsbHksIGBmcy9pc29mcy9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBJJiMzOTtsbCBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgYFpJU09GU2AgYW5kIGBJU085NjYwX0ZTYCwgdGhlIGtleSB2YXJpYWJsZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBJJiMzOTtsbCBwb3JlIG92ZXIgdGhhdCB0byBnZXQgdGhlIGRlZmluaXRpdmUgcGljdHVyZSBvZiB3aGF0JiMzOTtzIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgd2hhdCB0aGUgZGVwZW5kZW5jaWVzIGFyZS4gSXQmIzM5O3MgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGJ1aWx0IGFuZCBjb25maWd1cmVkIGluIHRoaXMga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBJU085NjYwX0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtJU08gOTY2MCBDRFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0XCYjMzQ7XG4gICA0Olx0XHRzZWxlY3QgQlVGRkVSX0hFQURcbiAgIDU6XHRcdGhlbHBcbiAgIDY6XHRcdCAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gdXNlZCBvbiBDRC1ST01zLiAgSXQgd2FzIHByZXZpb3VzbHlcbiAgIDc6XHRcdCAga25vd24gYXMgXCYjMzQ7SGlnaCBTaWVycmEgRmlsZSBTeXN0ZW1cJiMzNDsgYW5kIGlzIGNhbGxlZCBcJiMzNDtoc2ZzXCYjMzQ7IG9uIG90aGVyXG4gICA4Olx0XHQgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvclxuICAgOTpcdFx0ICBsb25nIFVuaXggZmlsZW5hbWVzIGFuZCBzeW1ib2xpYyBsaW5rcyBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhpc1xuICAxMDpcdFx0ICBkcml2ZXIuICBJZiB5b3UgaGF2ZSBhIENELVJPTSBkcml2ZSBhbmQgd2FudCB0byBkbyBtb3JlIHdpdGggaXQgdGhhblxuICAxMTpcdFx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcbiAgMTI6XHRcdCAgXHUwMDNjZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnJzdFx1MDAzZSBhbmQgdGhlIENELVJPTS1IT1dUTyxcbiAgMTM6XHRcdCAgYXZhaWxhYmxlIGZyb20gXHUwMDNjaHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG9cdTAwM2UpLCB0aGVyZWJ5XG4gIDE0Olx0XHQgIGVubGFyZ2luZyB5b3VyIGtlcm5lbCBieSBhYm91dCAyNyBLQjsgb3RoZXJ3aXNlIHNheSBOLlxuICAxNTpcdFxuICAxNjpcdFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXG4gIDE3Olx0XHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cbiAgMTg6XHRcbiAgMTk6XHRjb25maWcgSk9MSUVUXG4gIDIwOlx0XHRib29sIFwmIzM0O01pY3Jvc29mdCBKb2xpZXQgQ0RST00gZXh0ZW5zaW9uc1wmIzM0O1xuICAyMTpcdFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXG4gIDIyOlx0XHRzZWxlY3QgTkxTXG4gIDIzOlx0XHRoZWxwXG4gIDI0Olx0XHQgIEpvbGlldCBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24gZm9yIHRoZSBJU08gOTY2MCBDRC1ST00gZmlsZSBzeXN0ZW1cbiAgMjU6XHRcdCAgd2hpY2ggYWxsb3dzIGZvciBsb25nIGZpbGVuYW1lcyBpbiB1bmljb2RlIGZvcm1hdCAodW5pY29kZSBpcyB0aGVcbiAgMjY6XHRcdCAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZVxuICAyNzpcdFx0ICBjaGFyYWN0ZXJzIG9mIGFsbW9zdCBhbGwgbGFuZ3VhZ2VzIG9mIHRoZSB3b3JsZDsgc2VlXG4gIDI4Olx0XHQgIFx1MDAzY2h0dHA6Ly93d3cudW5pY29kZS5vcmcvXHUwMDNlIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gIFNheSBZIGhlcmUgaWYgeW91XG4gIDI5Olx0XHQgIHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIEpvbGlldCBDRC1ST01zIHVuZGVyIExpbnV4LlxuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBaSVNPRlNcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBleHRlbnNpb25cJiMzNDtcbiAgMzM6XHRcdGRlcGVuZHMgb24gSVNPOTY2MF9GU1xuICAzNDpcdFx0c2VsZWN0IFpMSUJfSU5GTEFURVxuICAzNTpcdFx0aGVscFxuICAzNjpcdFx0ICBUaGlzIGlzIGEgTGludXgtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIFJvY2tSaWRnZSB3aGljaCBsZXRzIHlvdSBzdG9yZVxuICAzNzpcdFx0ICBkYXRhIGluIGNvbXByZXNzZWQgZm9ybSBvbiBhIENELVJPTSBhbmQgaGF2ZSBpdCB0cmFuc3BhcmVudGx5XG4gIDM4Olx0XHQgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWVcbiAgMzk6XHRcdCAgXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXHUwMDNlIGZvciB0aGUgdG9vbHNcbiAgNDA6XHRcdCAgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBzdWNoIGEgZmlsZXN5c3RlbS4gIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmVcbiAgNDE6XHRcdCAgYWJsZSB0byByZWFkIHN1Y2ggY29tcHJlc3NlZCBDRC1ST01zLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MTgxCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBJU085NjYwIENvbXByZXNzaW9uIENvZGUqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkgd2l0aCBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIEkmIzM5O20gc3RhcnRpbmcgYXQgdGhlIHRvcCwgcm91Z2hseSBsaW5lcyAxIHRvIDQwMC4gVGhhdCYjMzk7cyBhIGdvb2QgY2h1bmssIHByb2JhYmx5IHRoZSBpbml0aWFsIHNldHVwLCBkZWNsYXJhdGlvbnMsIGFuZCBtYXliZSBzb21lIGNvcmUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY29tcHJlc3Npb24uIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgaG93IHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzIGlzIG1hbmFnZWQgaW4gdGhlIElTTzk2NjAgZmlsZXN5c3RlbS4gVGhpbmdzIHRvIGxvb2sgZm9yIGltbWVkaWF0ZWx5IGFyZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBpdCBzdXBwb3J0cywgYW55IGRhdGEgc3RydWN0dXJlcyB1c2VkIHRvIGhvbGQgY29tcHJlc3NlZCBibG9ja3MsIGFuZCBob3cgdGhleSYjMzk7cmUgaWRlbnRpZmllZC4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlbnRyeSBwb2ludHMgZm9yIHRoZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiByb3V0aW5lcyDigJMgdGhlIG9uZXMgdGhhdCBhcmUgY2FsbGVkIHdoZW4gYSBmaWxlIGlzIHdyaXR0ZW4gb3IgcmVhZC4gQXJlIHRoZXkgZGlyZWN0IGNhbGxzIHRvIGxpYnJhcnkgcm91dGluZXMsIG9yIGFyZSB0aGVyZSBpbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9ucz8gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGNydWNpYWwgYml0cyBvZiBjb2RlIHRoYXQgZGVjaWRlIHdoZXRoZXIgY29tcHJlc3Npb24gaXMgZXZlbiAqYXR0ZW1wdGVkKiBvbiBhIHBhcnRpY3VsYXIgZmlsZSDigJMgcHJvYmFibHkgc29tZSBjaGVja3Mgb24gZmlsZSBhdHRyaWJ1dGVzIG9yIGV4dGVuc2lvbnMuIEhvcGVmdWxseSwgSSYjMzk7bGwgcXVpY2tseSBzcG90IGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGFyZWFzIHdoZXJlIGRhdGEgaW50ZWdyaXR5IG1pZ2h0IGJlIGF0IHJpc2suIFRoaXMgYXJlYSwgYXJvdW5kIGxpbmVzIDEtNDAwLCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBJU085NjYwIGltcGxlbWVudGF0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgZmluZCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbiAgIDI6XHQvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gICAzOlx0ICogICBcbiAgIDQ6XHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxuICAgNTpcdCAqXG4gICA2Olx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgIDc6XHRcbiAgIDg6XHQvKlxuICAgOTpcdCAqIGxpbnV4L2ZzL2lzb2ZzL2NvbXByZXNzLmNcbiAgMTA6XHQgKlxuICAxMTpcdCAqIFRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gb2YgZmlsZXMgb24gYW4gaXNvOTY2MCBmaWxlc3lzdGVtXG4gIDEyOlx0ICovXG4gIDEzOlx0XG4gIDE0Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiAgMTU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAgMTY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9iaW8uaFx1MDAzZVxuICAxNzpcdFxuICAxODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAxOTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFx1MDAzZVxuICAyMDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3psaWIuaFx1MDAzZVxuICAyMTpcdFxuICAyMjpcdCNpbmNsdWRlIFwmIzM0O2lzb2ZzLmhcJiMzNDtcbiAgMjM6XHQjaW5jbHVkZSBcJiMzNDt6aXNvZnMuaFwmIzM0O1xuICAyNDpcdFxuICAyNTpcdC8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbiAgMjY6XHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XG4gIDI3Olx0XG4gIDI4Olx0LypcbiAgMjk6XHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxuICAzMDpcdCAqIGFsbG9jYXRpb247IHRoaXMgYXZvaWRzIGZhaWx1cmVzIGF0IGJsb2NrLWRlY29tcHJlc3Npb24gdGltZS5cbiAgMzE6XHQgKi9cbiAgMzI6XHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuICAzMzpcdHN0YXRpYyBERUZJTkVfTVVURVgoemlzb2ZzX3psaWJfbG9jayk7XG4gIDM0Olx0XG4gIDM1Olx0LypcbiAgMzY6XHQgKiBSZWFkIGRhdGEgb2YgQGlub2RlIGZyb20gQGJsb2NrX3N0YXJ0IHRvIEBibG9ja19lbmQgYW5kIHVuY29tcHJlc3NcbiAgMzc6XHQgKiB0byBvbmUgemlzb2ZzIGJsb2NrLiBTdG9yZSB0aGUgZGF0YSBpbiB0aGUgQHBhZ2VzIGFycmF5IHdpdGggQHBjb3VudFxuICAzODpcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxuICAzOTpcdCAqL1xuICA0MDpcdHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuICA0MTpcdFx0XHRcdFx0ICAgICAgbG9mZl90IGJsb2NrX2VuZCwgaW50IHBjb3VudCxcbiAgNDI6XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gIDQzOlx0XHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4gIDQ0Olx0e1xuICA0NTpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gIDQ2Olx0XHR1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTtcbiAgNDc6XHRcdHVuc2lnbmVkIGludCBidWZzaGlmdCA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTtcbiAgNDg6XHRcdHVuc2lnbmVkIGludCBidWZtYXNrID0gYnVmc2l6ZSAtIDE7XG4gIDQ5Olx0XHRpbnQgaSwgYmxvY2tfc2l6ZSA9IGJsb2NrX2VuZCAtIGJsb2NrX3N0YXJ0O1xuICA1MDpcdFx0el9zdHJlYW0gc3RyZWFtID0geyAudG90YWxfb3V0ID0gMCxcbiAgNTE6XHRcdFx0XHQgICAgLmF2YWlsX2luID0gMCxcbiAgNTI6XHRcdFx0XHQgICAgLmF2YWlsX291dCA9IDAsIH07XG4gIDUzOlx0XHRpbnQgemVycjtcbiAgNTQ6XHRcdGludCBuZWVkYmxvY2tzID0gKGJsb2NrX3NpemUgJiM0MzsgKGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKSAmIzQzOyBidWZtYXNrKVxuICA1NTpcdFx0XHRcdFx0XHUwMDNlXHUwMDNlIGJ1ZnNoaWZ0O1xuICA1NjpcdFx0aW50IGhhdmVibG9ja3M7XG4gIDU3Olx0XHRibGtjbnRfdCBibG9ja251bTtcbiAgNTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcbiAgNTk6XHRcdGludCBjdXJiaCwgY3VycGFnZTtcbiAgNjA6XHRcbiAgNjE6XHRcdGlmIChibG9ja19zaXplIFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpKSB7XG4gIDYyOlx0XHRcdCplcnJwID0gLUVJTztcbiAgNjM6XHRcdFx0cmV0dXJuIDA7XG4gIDY0Olx0XHR9XG4gIDY1Olx0XHQvKiBFbXB0eSBibG9jaz8gKi9cbiAgNjY6XHRcdGlmIChibG9ja19zaXplID09IDApIHtcbiAgNjc6XHRcdFx0Zm9yICggaSA9IDAgOyBpIFx1MDAzYyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHtcbiAgNjg6XHRcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuICA2OTpcdFx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07XG4gIDcwOlx0XG4gIDcxOlx0XHRcdFx0aWYgKCFmb2xpbylcbiAgNzI6XHRcdFx0XHRcdGNvbnRpbnVlO1xuICA3MzpcdFx0XHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpO1xuICA3NDpcdFx0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuICA3NTpcdFx0XHR9XG4gIDc2Olx0XHRcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgLSBwb2Zmc2V0O1xuICA3NzpcdFx0fVxuICA3ODpcdFxuICA3OTpcdFx0LyogQmVjYXVzZSB6bGliIGlzIG5vdCB0aHJlYWQtc2FmZSwgZG8gYWxsIHRoZSBJL08gYXQgdGhlIHRvcC4gKi9cbiAgODA6XHRcdGJsb2NrbnVtID0gYmxvY2tfc3RhcnQgXHUwMDNlXHUwMDNlIGJ1ZnNoaWZ0O1xuICA4MTpcdFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgJiM0MzsgMSk7XG4gIDgyOlx0XHRpZiAoIWJocykge1xuICA4MzpcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gIDg0Olx0XHRcdHJldHVybiAwO1xuICA4NTpcdFx0fVxuICA4NjpcdFx0aGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrbnVtLCBiaHMsIG5lZWRibG9ja3MpO1xuICA4NzpcdFx0YmhfcmVhZF9iYXRjaChoYXZlYmxvY2tzLCBiaHMpO1xuICA4ODpcdFxuICA4OTpcdFx0Y3VyYmggPSAwO1xuICA5MDpcdFx0Y3VycGFnZSA9IDA7XG4gIDkxOlx0XHQvKlxuICA5MjpcdFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcbiAgOTM6XHRcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxuICA5NDpcdFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbiYjMzk7dCBob2xkIHRoZSB6bGliXG4gIDk1Olx0XHQgKiBtdXRleCBsb25nZXIgdGhhbiBuZWNlc3NhcnkuXG4gIDk2Olx0XHQgKi9cbiAgOTc6XHRcbiAgOTg6XHRcdGlmICghYmhzWzBdKVxuICA5OTpcdFx0XHRnb3RvIGJfZWlvO1xuIDEwMDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTYzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gYXMgaWYgdGhleSB3ZXJlIG15IG93bjoKCioqRGl2aW5nIEJhY2sgaW50byBjb21wcmVzcy5jKioKCkFscmlnaHQsIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byBjaXJjbGUgYmFjayB0byBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIEkgcmVtZW1iZXIgaGF2aW5nIGEgZmV3IG5hZ2dpbmcgcXVlc3Rpb25zIGFuZCBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIGlkZWFzIGx1cmtpbmcgYXJvdW5kIGFmdGVyIHRoZSBpbml0aWFsIHBhc3MuIExldCYjMzk7cyBzZWUgaWYgdGhvc2Ugc3RpbGwgaG9sZCB3YXRlci4gSSB3YW50IHRvIGNoZWNrIGZvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGdpdmVuIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBjYWNoaW5nIGxheWVyLiBBcmUgdGhlcmUgYW55IHNwb3RzIHdoZXJlIHdlJiMzOTtyZSBub3QgcHJvcGVybHkgaGFuZGxpbmcgbG9ja2luZyBvciBtZW1vcnkgbWFuYWdlbWVudCwgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgY29tcHJlc3Npb24gYnVmZmVycyBhbmQgYXNzb2NpYXRlZCBtZXRhZGF0YT8gSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIG92ZXJhbGwgYWxnb3JpdGhtJiMzOTtzIGVmZmljaWVuY3kuIENvdWxkIHdlIHNxdWVlemUgb3V0IGEgZmV3IG1vcmUgY3ljbGVzIHdpdGggYSBkaWZmZXJlbnQgc3RyYXRlZ3ksIG1heWJlIGNvbnNpZGVyaW5nIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxpYnJhcnkgYWx0b2dldGhlciBpZiB0aGUgcGVyZm9ybWFuY2UgZ2FpbnMgYXJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZSBjb2RlIGNodXJuPyBBbmQsIG9mIGNvdXJzZSwgSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBidWZmZXIgb3ZlcmZsb3dzIGJlaW5nIG15IG1haW4gY29uY2VybiwgYnV0IHJlYWxseSBhbnl0aGluZyB0aGF0IGNvdWxkIGFsbG93IGZvciBtYWxpY2lvdXMgbWFuaXB1bGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuIEl0JiMzOTtzIHRpbWUgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHNlZSB3aGF0IGluc2lnaHRzIEkmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTAxOlx0XHR3YWl0X29uX2J1ZmZlcihiaHNbMF0pO1xuIDEwMjpcdFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzWzBdKSkge1xuIDEwMzpcdFx0XHQqZXJycCA9IC1FSU87XG4gMTA0Olx0XHRcdGdvdG8gYl9laW87XG4gMTA1Olx0XHR9XG4gMTA2Olx0XG4gMTA3Olx0XHRzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuIDEwODpcdFx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbiAxMDk6XHRcdFx0XG4gMTEwOlx0XHR6ZXJyID0gemxpYl9pbmZsYXRlSW5pdChcdTAwMjZzdHJlYW0pO1xuIDExMTpcdFx0aWYgKHplcnIgIT0gWl9PSykge1xuIDExMjpcdFx0XHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcbiAxMTM6XHRcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gMTE0Olx0XHRcdGVsc2VcbiAxMTU6XHRcdFx0XHQqZXJycCA9IC1FSU87XG4gMTE2Olx0XHRcdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3ppc29mczogemlzb2ZzX2luZmxhdGVJbml0IHJldHVybmVkICVkXFxuXCYjMzQ7LFxuIDExNzpcdFx0XHRcdCAgICAgICB6ZXJyKTtcbiAxMTg6XHRcdFx0Z290byB6X2VpbztcbiAxMTk6XHRcdH1cbiAxMjA6XHRcbiAxMjE6XHRcdHdoaWxlIChjdXJwYWdlIFx1MDAzYyBwY291bnQgXHUwMDI2XHUwMDI2IGN1cmJoIFx1MDAzYyBoYXZlYmxvY2tzIFx1MDAyNlx1MDAyNlxuIDEyMjpcdFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XG4gMTIzOlx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4gMTI0Olx0XG4gMTI1Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIDEyNjpcdFx0XHRcdGlmIChmb2xpbykge1xuIDEyNzpcdFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XG4gMTI4Olx0XHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xuIDEyOTpcdFx0XHRcdFx0cG9mZnNldCA9IDA7XG4gMTMwOlx0XHRcdFx0fSBlbHNlIHtcbiAxMzE6XHRcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcbiAxMzI6XHRcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XG4gMTMzOlx0XHRcdFx0fVxuIDEzNDpcdFx0XHR9XG4gMTM1Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX2luKSB7XG4gMTM2Olx0XHRcdFx0d2FpdF9vbl9idWZmZXIoYmhzW2N1cmJoXSk7XG4gMTM3Olx0XHRcdFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzW2N1cmJoXSkpIHtcbiAxMzg6XHRcdFx0XHRcdCplcnJwID0gLUVJTztcbiAxMzk6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MDpcdFx0XHRcdH1cbiAxNDE6XHRcdFx0XHRzdHJlYW0ubmV4dF9pbiAgPSBiaHNbY3VyYmhdLVx1MDAzZWJfZGF0YSAmIzQzO1xuIDE0MjpcdFx0XHRcdFx0XHRcdChibG9ja19zdGFydCBcdTAwMjYgYnVmbWFzayk7XG4gMTQzOlx0XHRcdFx0c3RyZWFtLmF2YWlsX2luID0gbWluX3QodW5zaWduZWQsIGJ1ZnNpemUgLVxuIDE0NDpcdFx0XHRcdFx0XHRcdChibG9ja19zdGFydCBcdTAwMjYgYnVmbWFzayksXG4gMTQ1Olx0XHRcdFx0XHRcdFx0YmxvY2tfc2l6ZSk7XG4gMTQ2Olx0XHRcdFx0YmxvY2tfc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47XG4gMTQ3Olx0XHRcdFx0YmxvY2tfc3RhcnQgPSAwO1xuIDE0ODpcdFx0XHR9XG4gMTQ5Olx0XG4gMTUwOlx0XHRcdHdoaWxlIChzdHJlYW0uYXZhaWxfb3V0IFx1MDAyNlx1MDAyNiBzdHJlYW0uYXZhaWxfaW4pIHtcbiAxNTE6XHRcdFx0XHR6ZXJyID0gemxpYl9pbmZsYXRlKFx1MDAyNnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTtcbiAxNTI6XHRcdFx0XHRpZiAoemVyciA9PSBaX0JVRl9FUlJPUiBcdTAwMjZcdTAwMjYgc3RyZWFtLmF2YWlsX2luID09IDApXG4gMTUzOlx0XHRcdFx0XHRicmVhaztcbiAxNTQ6XHRcdFx0XHRpZiAoemVyciA9PSBaX1NUUkVBTV9FTkQpXG4gMTU1Olx0XHRcdFx0XHRicmVhaztcbiAxNTY6XHRcdFx0XHRpZiAoemVyciAhPSBaX09LKSB7XG4gMTU3Olx0XHRcdFx0XHQvKiBFT0YsIGVycm9yLCBvciB0cnlpbmcgdG8gcmVhZCBiZXlvbmQgZW5kIG9mIGlucHV0ICovXG4gMTU4Olx0XHRcdFx0XHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcbiAxNTk6XHRcdFx0XHRcdFx0KmVycnAgPSAtRU5PTUVNO1xuIDE2MDpcdFx0XHRcdFx0ZWxzZSB7XG4gMTYxOlx0XHRcdFx0XHRcdHByaW50ayhLRVJOX0RFQlVHXG4gMTYyOlx0XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG4gMTYzOlx0XHRcdFx0XHRcdCAgICAgICBcJiMzNDsgJWQsIGlub2RlID0gJWxsdSxcJiMzNDtcbiAxNjQ6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBwYWdlIGlkeCA9ICVkLCBiaCBpZHggPSAlZCxcJiMzNDtcbiAxNjU6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBhdmFpbF9pbiA9ICVsZCxcJiMzNDtcbiAxNjY6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyBhdmFpbF9vdXQgPSAlbGRcXG5cJiMzNDssXG4gMTY3Olx0XHRcdFx0XHRcdCAgICAgICB6ZXJyLCBpbm9kZS1cdTAwM2VpX2lubywgY3VycGFnZSxcbiAxNjg6XHRcdFx0XHRcdFx0ICAgICAgIGN1cmJoLCBzdHJlYW0uYXZhaWxfaW4sXG4gMTY5Olx0XHRcdFx0XHRcdCAgICAgICBzdHJlYW0uYXZhaWxfb3V0KTtcbiAxNzA6XHRcdFx0XHRcdFx0KmVycnAgPSAtRUlPO1xuIDE3MTpcdFx0XHRcdFx0fVxuIDE3MjpcdFx0XHRcdFx0Z290byBpbmZsYXRlX291dDtcbiAxNzM6XHRcdFx0XHR9XG4gMTc0Olx0XHRcdH1cbiAxNzU6XHRcbiAxNzY6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gMTc3Olx0XHRcdFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xuIDE3ODpcdFx0XHRcdGlmIChmb2xpbykge1xuIDE3OTpcdFx0XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcbiAxODA6XHRcdFx0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIDE4MTpcdFx0XHRcdH1cbiAxODI6XHRcdFx0XHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xuIDE4MzpcdFx0XHRcdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4gMTg0Olx0XHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBOVUxMO1xuIDE4NTpcdFx0XHRcdH1cbiAxODY6XHRcdFx0XHRjdXJwYWdlJiM0MzsmIzQzOztcbiAxODc6XHRcdFx0fVxuIDE4ODpcdFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9pbilcbiAxODk6XHRcdFx0XHRjdXJiaCYjNDM7JiM0Mzs7XG4gMTkwOlx0XHR9XG4gMTkxOlx0aW5mbGF0ZV9vdXQ6XG4gMTkyOlx0XHR6bGliX2luZmxhdGVFbmQoXHUwMDI2c3RyZWFtKTtcbiAxOTM6XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG4gMTk0Olx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuIDE5NTpcdFxuIDE5NjpcdHpfZWlvOlxuIDE5NzpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnppc29mc196bGliX2xvY2spO1xuIDE5ODpcdFxuIDE5OTpcdGJfZWlvOlxuIDIwMDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaGF2ZWJsb2NrczsgaSYjNDM7JiM0MzspXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NzQ2CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUgd2UgZ28uLi4KCioqRGl2aW5nIGludG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBmaWxlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgSVNPRlMgY29tcHJlc3Npb24gaXMgaW1wbGVtZW50ZWQuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Jhc3Agb24gdGhlIGJyb2FkZXIgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIGFuZCB0aGUgSVNPIDk2NjAgc3RhbmRhcmQsIGJ1dCB0aGUgY29tcHJlc3Npb24gYXNwZWN0IGlzIHNvbWV0aGluZyBJIG5lZWQgdG8gcmVmcmVzaC4gV2hhdCBzcGVjaWZpYyBhbGdvcml0aG1zIGFyZSBpbiB1c2U/IEhvdyBhcmUgdGhleSBpbnRlZ3JhdGVkIHdpdGhpbiB0aGUgSS9PIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MgSSBzaG91bGQgYmUgYXdhcmUgb2YsIG9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gYXJlYXM/IEkgd2FudCB0byBzZWUgaG93IHRoZSBjb21wcmVzc2lvbiBhZmZlY3RzIHJlYWQgYW5kIHdyaXRlIHBhdGhzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGRlL2NvbXByZXNzaW9uLCBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSYjMzk7cyBtZXRhZGF0YSBpcyBtb2RpZmllZCB0byBzdG9yZSBjb21wcmVzc2VkIGRhdGEuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZmlsZSBzeXN0ZW0gcHJlc2VudHMgdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdXNlci4gSSYjMzk7bGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgc3RydWN0dXJlcyBvciBmbGFncyB1c2VkIHRvIGluZGljYXRlIGEgZmlsZSYjMzk7cyBjb21wcmVzc2VkIHN0YXRlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaW50ZXJlc3RpbmcgdGVjaG5pcXVlcyB0aGUgZGV2ZWxvcGVycyB1dGlsaXplZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjAxOlx0XHRcdGJyZWxzZShiaHNbaV0pO1xuIDIwMjpcdFx0a2ZyZWUoYmhzKTtcbiAyMDM6XHRcdHJldHVybiBzdHJlYW0udG90YWxfb3V0O1xuIDIwNDpcdH1cbiAyMDU6XHRcbiAyMDY6XHQvKlxuIDIwNzpcdCAqIFVuY29tcHJlc3MgZGF0YSBzbyB0aGF0IHBhZ2VzW2Z1bGxfcGFnZV0gaXMgZnVsbHkgdXB0b2RhdGUgYW5kIHBvc3NpYmx5XG4gMjA4Olx0ICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxuIDIwOTpcdCAqL1xuIDIxMDpcdHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiAyMTE6XHRcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiAyMTI6XHR7XG4gMjEzOlx0XHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIDIxNDpcdFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG4gMjE1Olx0XHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuIDIxNjpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gMjE3Olx0XHR1bnNpZ25lZCBpbnQgYmxvY2twdHI7XG4gMjE4Olx0XHRsb2ZmX3QgcG9mZnNldCA9IDA7XG4gMjE5Olx0XHRibGtjbnRfdCBjc3RhcnRfYmxvY2ssIGNlbmRfYmxvY2s7XG4gMjIwOlx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDIyMTpcdFx0dW5zaWduZWQgaW50IGJsa2JpdHMgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XG4gMjIyOlx0XHR1bnNpZ25lZCBpbnQgYmxrc2l6ZSA9IDEgXHUwMDNjXHUwMDNjIGJsa2JpdHM7XG4gMjIzOlx0XHRpbnQgZXJyO1xuIDIyNDpcdFx0bG9mZl90IHJldDtcbiAyMjU6XHRcbiAyMjY6XHRcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xuIDIyNzpcdFxuIDIyODpcdFx0LypcbiAyMjk6XHRcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAmIzM5O2Z1bGxfcGFnZSYjMzk7IHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xuIDIzMDpcdFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xuIDIzMTpcdFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxuIDIzMjpcdFx0ICovXG4gMjMzOlx0XHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xuIDIzNDpcdFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICYjNDM7IFBBR0VfU0laRSwgaW5vZGUtXHUwMDNlaV9zaXplKTtcbiAyMzU6XHRcbiAyMzY6XHRcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcdTAwM2VcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xuIDIzNzpcdFx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbiAyMzg6XHRcdFx0XHRcdTAwM2VcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xuIDIzOTpcdFxuIDI0MDpcdFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuIDI0MTpcdFx0XHQoKGNzdGFydF9ibG9jayBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSBcdTAwMjYgUEFHRV9NQVNLKSk7XG4gMjQyOlx0XG4gMjQzOlx0XHQvKiBGaW5kIHRoZSBwb2ludGVyIHRvIHRoaXMgc3BlY2lmaWMgY2h1bmsgKi9cbiAyNDQ6XHRcdC8qIE5vdGU6IHdlJiMzOTtyZSBub3QgdXNpbmcgaXNvbnVtXzczMSgpIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBrbm93biBhbGlnbmVkICovXG4gMjQ1Olx0XHQvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovXG4gMjQ2Olx0XHRibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSAmIzQzOyBjc3RhcnRfYmxvY2spIFx1MDAzY1x1MDAzYyAyO1xuIDI0NzpcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuIDI0ODpcdFx0aWYgKCFiaClcbiAyNDk6XHRcdFx0cmV0dXJuIC1FSU87XG4gMjUwOlx0XHRibG9ja19zdGFydCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopXG4gMjUxOlx0XHRcdFx0XHQoYmgtXHUwMDNlYl9kYXRhICYjNDM7IChibG9ja3B0ciBcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcbiAyNTI6XHRcbiAyNTM6XHRcdHdoaWxlIChjc3RhcnRfYmxvY2sgXHUwMDNjIGNlbmRfYmxvY2sgXHUwMDI2XHUwMDI2IHBjb3VudCBcdTAwM2UgMCkge1xuIDI1NDpcdFx0XHQvKiBMb2FkIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBibG9jayBpbiB0aGUgZmlsZSAqL1xuIDI1NTpcdFx0XHRibG9ja3B0ciAmIzQzOz0gNDtcbiAyNTY6XHRcdFx0LyogVHJhdmVyc2VkIHRvIG5leHQgYmxvY2s/ICovXG4gMjU3Olx0XHRcdGlmICghKGJsb2NrcHRyIFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkge1xuIDI1ODpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjU5Olx0XG4gMjYwOlx0XHRcdFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXHUwMDNlXHUwMDNlIGJsa2JpdHMpO1xuIDI2MTpcdFx0XHRcdGlmICghYmgpXG4gMjYyOlx0XHRcdFx0XHRyZXR1cm4gLUVJTztcbiAyNjM6XHRcdFx0fVxuIDI2NDpcdFx0XHRibG9ja19lbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxuIDI2NTpcdFx0XHRcdFx0KGJoLVx1MDAzZWJfZGF0YSAmIzQzOyAoYmxvY2twdHIgXHUwMDI2IChibGtzaXplIC0gMSkpKSk7XG4gMjY2Olx0XHRcdGlmIChibG9ja19zdGFydCBcdTAwM2UgYmxvY2tfZW5kKSB7XG4gMjY3Olx0XHRcdFx0YnJlbHNlKGJoKTtcbiAyNjg6XHRcdFx0XHRyZXR1cm4gLUVJTztcbiAyNjk6XHRcdFx0fVxuIDI3MDpcdFx0XHRlcnIgPSAwO1xuIDI3MTpcdFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbiAyNzI6XHRcdFx0XHRcdFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFx1MDAyNmVycik7XG4gMjczOlx0XHRcdHBvZmZzZXQgJiM0Mzs9IHJldDtcbiAyNzQ6XHRcdFx0Zm9saW9zICYjNDM7PSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDI3NTpcdFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiAyNzY6XHRcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc3Olx0XHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuIDI3ODpcdFxuIDI3OTpcdFx0XHRpZiAoZXJyKSB7XG4gMjgwOlx0XHRcdFx0YnJlbHNlKGJoKTtcbiAyODE6XHRcdFx0XHQvKlxuIDI4MjpcdFx0XHRcdCAqIERpZCB3ZSBmaW5pc2ggcmVhZGluZyB0aGUgcGFnZSB3ZSByZWFsbHkgd2FudGVkXG4gMjgzOlx0XHRcdFx0ICogdG8gcmVhZD9cbiAyODQ6XHRcdFx0XHQgKi9cbiAyODU6XHRcdFx0XHRpZiAoZnVsbF9wYWdlIFx1MDAzYyAwKVxuIDI4NjpcdFx0XHRcdFx0cmV0dXJuIDA7XG4gMjg3Olx0XHRcdFx0cmV0dXJuIGVycjtcbiAyODg6XHRcdFx0fVxuIDI4OTpcdFxuIDI5MDpcdFx0XHRibG9ja19zdGFydCA9IGJsb2NrX2VuZDtcbiAyOTE6XHRcdFx0Y3N0YXJ0X2Jsb2NrJiM0MzsmIzQzOztcbiAyOTI6XHRcdH1cbiAyOTM6XHRcbiAyOTQ6XHRcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4gMjk1Olx0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xuIDI5NjpcdFxuIDI5NzpcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuIDI5ODpcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiAyOTk6XHRcdH1cbiAzMDA6XHRcdGJyZWxzZShiaCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNjAyCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgSVNPRlMgQ29tcHJlc3Npb24gQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIHplcm8gaW4gb24gYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBJU09GUyBjb21wcmVzc2lvbiBsb2dpYyDigJMgSSYjMzk7bSB0aGlua2luZyBsaW5lcyAzMDEgdGhyb3VnaCA0MDAgd2l0aGluIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgKG9yIHBvdGVudGlhbCBoZWFkYWNoZSkgaGFwcGVucy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGV5JiMzOTtyZSBoYW5kbGluZyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHNwZWNpZmljYWxseSBpbiB0aGlzIG1vZHVsZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY2x1ZXMgYXJvdW5kIHRoZSBjaG9pY2Ugb2YgYWxnb3JpdGhtLCBlcnJvciBoYW5kbGluZywgYnVmZmVyIG1hbmFnZW1lbnQuLi4gYWxsIHRoZSB1c3VhbCBzdXNwZWN0cy4gSSB3YW50IHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnl0aGluZyBzdWJ0bHkgb2ZmLCBvciBtYXliZSBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gSSBtaXNzZWQgcHJldmlvdXNseS4gSXQmIzM5O3MgYSBrZXkgcGFydCBvZiB0aGUgSVNPRlMgaW1wbGVtZW50YXRpb24sIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgaXQmIzM5O3Mgcm9idXN0IGFuZCBlZmZpY2llbnQuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyB3aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzMDE6XHRcdHJldHVybiAwO1xuIDMwMjpcdH1cbiAzMDM6XHRcbiAzMDQ6XHQvKlxuIDMwNTpcdCAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2VcbiAzMDY6XHQgKiBwZXIgcmVmZXJlbmNlLiAgV2UgaW5qZWN0IHRoZSBhZGRpdGlvbmFsIHBhZ2VzIGludG8gdGhlIHBhZ2VcbiAzMDc6XHQgKiBjYWNoZSBhcyBhIGZvcm0gb2YgcmVhZGFoZWFkLlxuIDMwODpcdCAqL1xuIDMwOTpcdHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gMzEwOlx0e1xuIDMxMTpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4gMzEyOlx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiAzMTM6XHRcdGludCBlcnI7XG4gMzE0Olx0XHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XG4gMzE1Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbiAzMTY6XHRcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG4gMzE3Olx0XHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuIDMxODpcdFx0XHQoMSBcdTAwM2NcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XG4gMzE5Olx0XHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4gMzIwOlx0XHRwZ29mZl90IGluZGV4ID0gZm9saW8tXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcbiAzMjE6XHRcbiAzMjI6XHRcdGVuZF9pbmRleCA9IChpbm9kZS1cdTAwM2VpX3NpemUgJiM0MzsgUEFHRV9TSVpFIC0gMSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMzIzOlx0XHQvKlxuIDMyNDpcdFx0ICogSWYgdGhpcyBmb2xpbyBpcyB3aG9sbHkgb3V0c2lkZSBpX3NpemUgd2UganVzdCByZXR1cm4gemVybztcbiAzMjU6XHRcdCAqIGRvX2dlbmVyaWNfZmlsZV9yZWFkKCkgd2lsbCBoYW5kbGUgdGhpcyBmb3IgdXNcbiAzMjY6XHRcdCAqL1xuIDMyNzpcdFx0aWYgKGluZGV4IFx1MDAzZT0gZW5kX2luZGV4KSB7XG4gMzI4Olx0XHRcdGZvbGlvX2VuZF9yZWFkKGZvbGlvLCB0cnVlKTtcbiAzMjk6XHRcdFx0cmV0dXJuIDA7XG4gMzMwOlx0XHR9XG4gMzMxOlx0XG4gMzMyOlx0XHRpZiAoUEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCkge1xuIDMzMzpcdFx0XHQvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lXG4gMzM0Olx0XHRcdCAgIHdlIG11c3QgZG8uICovXG4gMzM1Olx0XHRcdGZ1bGxfcGFnZSA9IGluZGV4IFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcbiAzMzY6XHRcdFx0cGNvdW50ID0gbWluX3QoaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayxcbiAzMzc6XHRcdFx0XHRlbmRfaW5kZXggLSAoaW5kZXggXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xuIDMzODpcdFx0XHRpbmRleCAtPSBmdWxsX3BhZ2U7XG4gMzM5Olx0XHR9IGVsc2Uge1xuIDM0MDpcdFx0XHRmdWxsX3BhZ2UgPSAwO1xuIDM0MTpcdFx0XHRwY291bnQgPSAxO1xuIDM0MjpcdFx0fVxuIDM0MzpcdFx0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXG4gMzQ0Olx0XHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuIDM0NTpcdFx0aWYgKCFmb2xpb3MpIHtcbiAzNDY6XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiAzNDc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzQ4Olx0XHR9XG4gMzQ5Olx0XHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIDM1MDpcdFxuIDM1MTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOywgaW5kZXgmIzQzOyYjNDM7KSB7XG4gMzUyOlx0XHRcdGlmIChpID09IGZ1bGxfcGFnZSlcbiAzNTM6XHRcdFx0XHRjb250aW51ZTtcbiAzNTQ6XHRcdFx0Zm9saW9zW2ldID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBpbmRleCxcbiAzNTU6XHRcdFx0XHRcdEZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCxcbiAzNTY6XHRcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuIDM1NzpcdFx0XHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXG4gMzU4Olx0XHRcdFx0Zm9saW9zW2ldID0gTlVMTDtcbiAzNTk6XHRcdH1cbiAzNjA6XHRcbiAzNjE6XHRcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTtcbiAzNjI6XHRcbiAzNjM6XHRcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xuIDM2NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpJiM0MzsmIzQzOykge1xuIDM2NTpcdFx0XHRpZiAoZm9saW9zW2ldKSB7XG4gMzY2Olx0XHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4gMzY3Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XG4gMzY4Olx0XHRcdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuIDM2OTpcdFx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XG4gMzcwOlx0XHRcdH1cbiAzNzE6XHRcdH1cbiAzNzI6XHRcbiAzNzM6XHRcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcJiMzNDtjcml0aWNhbFwmIzM0OyBwYWdlICovXG4gMzc0Olx0XHRrZnJlZShmb2xpb3MpO1xuIDM3NTpcdFx0cmV0dXJuIGVycjtcbiAzNzY6XHR9XG4gMzc3Olx0XG4gMzc4Olx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcbiAzNzk6XHRcdC5yZWFkX2ZvbGlvID0gemlzb2ZzX3JlYWRfZm9saW8sXG4gMzgwOlx0XHQvKiBObyBibWFwIG9wZXJhdGlvbiBzdXBwb3J0ZWQgKi9cbiAzODE6XHR9O1xuIDM4MjpcdFxuIDM4MzpcdGludCBfX2luaXQgemlzb2ZzX2luaXQodm9pZClcbiAzODQ6XHR7XG4gMzg1Olx0XHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xuIDM4NjpcdFx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcbiAzODc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzg4Olx0XG4gMzg5Olx0XHRyZXR1cm4gMDtcbiAzOTA6XHR9XG4gMzkxOlx0XG4gMzkyOlx0dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxuIDM5MzpcdHtcbiAzOTQ6XHRcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XG4gMzk1Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzI5NQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBaSVNPRlMgRGF0YSBBY2Nlc3MqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEgYWNjZXNzIHBhdGggZm9yIFpJU09GUyB3aXRoaW4gdGhlIGtlcm5lbC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGVpdGhlciBgemlzb2ZzX2FvcHNgIG9yIGB6aXNvZnNfcmVhZF9mb2xpb2AuIFRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IHRoZSBjb21wcmVzc2VkIElTTyA5NjYwIGZpbGVzeXN0ZW0gaGFuZGxlcyBkYXRhIHJlYWRzLiBTaW5jZSBJJiMzOTttIGZhbWlsaWFyIHdpdGggdGhlIGBmcy9pc29mcy9gIGRpcmVjdG9yeSwgdGhhdCYjMzk7cyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBteSBpbnZlc3RpZ2F0aW9uLiBJJiMzOTttIGVzc2VudGlhbGx5IHBpbnBvaW50aW5nIHRoZSBrZXkgZnVuY3Rpb24gY2FsbHMgaW52b2x2ZWQgaW4gZ2V0dGluZyBkYXRhIG9mZiBvZiB0aGUgY29tcHJlc3NlZCBkaXNrIGltYWdlLiBJJiMzOTtsbCBuZWVkIHRvIGtub3cgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBhcmUgYXNzaWduZWQsIGhvdyB0aGUgcmVhZCBvcGVyYXRpb25zIGFyZSB0cmlnZ2VyZWQsIGFuZCBob3cgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGVzeXN0ZW0mIzM5O3Mgb3BlcmF0aW9ucy4gVGhpcyBzaG91bGQgaGlnaGxpZ2h0IHRoZSBjcml0aWNhbCBwYXRoIGZvciBJL08uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ppc29mc18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9pc29mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjY6c3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX1NJWkVdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0yNy1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxLSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMjpzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNC1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzo0MDpzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNDEtXHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtNDQte1xuZnMvaXNvZnMvY29tcHJlc3MuYzo0NTpcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuZnMvaXNvZnMvY29tcHJlc3MuYy00Ni1cdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjAtXG5mcy9pc29mcy9jb21wcmVzcy5jOjYxOlx0aWYgKGJsb2NrX3NpemUgXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjItXHRcdCplcnJwID0gLUVJTztcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwNi1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3Olx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA4Olx0bXV0ZXhfbG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA5LVx0XHRcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cdFx0XHQqZXJycCA9IC1FSU87XG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNy1cdFx0XHQgICAgICAgemVycik7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXHRcdFx0fSBlbHNlIHtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTMxOlx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzItXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTYxLVx0XHRcdFx0XHRwcmludGsoS0VSTl9ERUJVR1xuZnMvaXNvZnMvY29tcHJlc3MuYzoxNjI6XHRcdFx0XHRcdCAgICAgICBcJiMzNDt6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXCYjMzQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVx0XHRcdH1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTgyOlx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVx0emxpYl9pbmZsYXRlRW5kKFx1MDAyNnN0cmVhbSk7XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcdGlmIChzdHJlYW0ubmV4dF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTYtel9laW86XG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcdG11dGV4X3VubG9jayhcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjA5LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzBdO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM3Olx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICYjNDM7ICgxIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM4Olx0XHRcdFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5mcy9pc29mcy9jb21wcmVzcy5jLTIzOS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAhPVxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XHRcdCgoY3N0YXJ0X2Jsb2NrIFx1MDAzY1x1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFx1MDAyNiBQQUdFX01BU0spKTtcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjcwLVx0XHRlcnIgPSAwO1xuZnMvaXNvZnMvY29tcHJlc3MuYzoyNzE6XHRcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzItXHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzA4LSAqL1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMDk6c3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTMxNC1cdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzE1Olx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNjpcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG5mcy9pc29mcy9jb21wcmVzcy5jOjMxODpcdFx0KDEgXHUwMDNjXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4tLVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzMjpcdGlmIChQQUdFX1NISUZUIFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XG5mcy9pc29mcy9jb21wcmVzcy5jLTMzMy1cdFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzQtXHRcdCAgIHdlIG11c3QgZG8uICovXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNTpcdFx0ZnVsbF9wYWdlID0gaW5kZXggXHUwMDI2ICh6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozMzY6XHRcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNzpcdFx0XHRlbmRfaW5kZXggLSAoaW5kZXggXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzgtXHRcdGluZGV4IC09IGZ1bGxfcGFnZTtcbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0My1cdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNDQ6XHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zNDUtXHRpZiAoIWZvbGlvcykge1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYwLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG5mcy9pc29mcy9jb21wcmVzcy5jLTM2Mi1cbi0tXG5mcy9pc29mcy9jb21wcmVzcy5jLTM3Ny1cbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzc4OmNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcdC5yZWFkX2ZvbGlvID0gemlzb2ZzX3JlYWRfZm9saW8sXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4MC1cdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgyLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODQte1xuZnMvaXNvZnMvY29tcHJlc3MuYzozODU6XHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xuZnMvaXNvZnMvY29tcHJlc3MuYzozODY6XHRpZiAoICF6aXNvZnNfemxpYl93b3Jrc3BhY2UgKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXHRcdHJldHVybiAtRU5PTUVNO1xuLS1cbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzkxLVxuZnMvaXNvZnMvY29tcHJlc3MuYzozOTI6dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xuZnMvaXNvZnMvY29tcHJlc3MuYzozOTQ6XHR2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpO1xuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTI3MD1zdGF0aWMgaW50IGlzb2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHJlbG9jYXRlZClcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE0MzQtXHRcdGNhc2UgaXNvZnNfZmlsZV9jb21wcmVzc2VkOlxuZnMvaXNvZnMvaW5vZGUuYzoxNDM1Olx0XHRcdGlub2RlLVx1MDAzZWlfZGF0YS5hX29wcyA9IFx1MDAyNnppc29mc19hb3BzO1xuZnMvaXNvZnMvaW5vZGUuYy0xNDM2LVx0XHRcdGJyZWFrO1xuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTYwMT1zdGF0aWMgaW50IF9faW5pdCBpbml0X2lzbzk2NjBfZnModm9pZClcbi0tXG5mcy9pc29mcy9pbm9kZS5jLTE2MDYtI2lmZGVmIENPTkZJR19aSVNPRlNcbmZzL2lzb2ZzL2lub2RlLmM6MTYwNzpcdGVyciA9IHppc29mc19pbml0KCk7XG5mcy9pc29mcy9pbm9kZS5jLTE2MDgtXHRpZiAoZXJyKVxuLS1cbmZzL2lzb2ZzL2lub2RlLmMtMTYxNi0jaWZkZWYgQ09ORklHX1pJU09GU1xuZnMvaXNvZnMvaW5vZGUuYzoxNjE3Olx0emlzb2ZzX2NsZWFudXAoKTtcbmZzL2lzb2ZzL2lub2RlLmMtMTYxOC1vdXQxOlxuLS1cbmZzL2lzb2ZzL2lub2RlLmM9MTYyNT1zdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9pc285NjYwX2ZzKHZvaWQpXG4tLVxuZnMvaXNvZnMvaW5vZGUuYy0xNjI4LSNpZmRlZiBDT05GSUdfWklTT0ZTXG5mcy9pc29mcy9pbm9kZS5jOjE2Mjk6XHR6aXNvZnNfY2xlYW51cCgpO1xuZnMvaXNvZnMvaW5vZGUuYy0xNjMwLSNlbmRpZlxuLS1cbmZzL2lzb2ZzL3ppc29mcy5oLTEyLSNpZmRlZiBDT05GSUdfWklTT0ZTXG5mcy9pc29mcy96aXNvZnMuaDoxMzpleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcztcbmZzL2lzb2ZzL3ppc29mcy5oOjE0OmV4dGVybiBpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpO1xuZnMvaXNvZnMvemlzb2ZzLmg6MTU6ZXh0ZXJuIHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZCk7XG5mcy9pc29mcy96aXNvZnMuaC0xNi0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYzNDcKCQkJCQkJCW91dHB1dDogMTQ1CgkJCQkJCQl0aG91Z2h0czogMTA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgWmlzb2ZzIEZvbGlvIENvbnZlcnNpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UgaGF2ZSBhIHBhdGNoIHRoYXQmIzM5O3MgY29udmVydGluZyB0aGUgemlzb2ZzIGRlY29tcHJlc3Npb24gY29kZSB3aXRoaW4gdGhlIElTT0ZTIGZpbGVzeXN0ZW0gKGBmcy9pc29mcy9jb21wcmVzcy5jYCkgZnJvbSB1c2luZyBwYWdlLWJhc2VkIEFQSXMgdG8gZm9saW8tYmFzZWQgb25lcy4gVGhpcyBpcyBhIGNvbW1vbiBhbmQgb2Z0ZW4gYnVnLXByb25lIGFyZWEg4oCTIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBwYWdlIGNhY2hlIHJlZmFjdG9yaW5nIGluIGZpbGVzeXN0ZW1zIGlzIGFsd2F5cyB3b3J0aCBhIGNsb3NlIGxvb2suCgpGaXJzdCwgcmVhY2hhYmlsaXR5LiBDYW4gd2UgYWN0dWFsbHkgKmhpdCogdGhpcyBjb2RlIGluIGEgZnV6emluZyBlbnZpcm9ubWVudD8gQWJzb2x1dGVseS4gSVNPRlMgKGlzbzk2NjApIGlzIGVhc2lseSBtb3VudGVkIHZpYSBsb29wYmFjayBvciBzdGFuZGFyZCB2aXJ0dWFsIGJsb2NrIGRldmljZXMsIGxpa2UgdGhlIGVtdWxhdGVkIENELVJPTXMgaW4gUUVNVSBvciBHQ0UuICBTeXprYWxsZXIgY2FuIGV2ZW4gbW91bnQgaW50ZW50aW9uYWxseSBjb3JydXB0ZWQgSVNPIGltYWdlcyB3aXRoIHppc29mcyBjb21wcmVzc2lvbiwgd2hpY2ggaXMgYSBrZXkgYWR2YW50YWdlLiBUaGlzIGNvZGUgaXMgYWxzbyBwYXJ0IG9mIGEgY29yZSBWRlMvZmlsZXN5c3RlbSBkcml2ZXIsIGBpc29mc2AsIGFuZCBnZXRzIGJ1aWx0IHdoZW4gYENPTkZJR19JU085NjYwX0ZTYCBhbmQgYENPTkZJR19aSVNPRlNgIGFyZSBlbmFibGVkLgoKTmV4dCwgaXMgdGhpcyAqd29ydGgqIGZ1enppbmc/IFllcywgd2l0aG91dCBhIGRvdWJ0LiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIHJlYWNoYWJsZSwgZXhlY3V0YWJsZSBjb2RlIGluIHRoZSBmaWxlc3lzdGVtIGRlY29tcHJlc3Npb24gbG9naWMuIFRoaXMgcGF0Y2ggaW52b2x2ZXMgcGFnZSBjYWNoZSBsb29rdXBzLCBtYXBwaW5ncywgemVyb2luZywgYW5kIGJ1ZmZlciBoYW5kbGluZywgbm93IHVzaW5nIGZvbGlvIGVxdWl2YWxlbnRzLiBUaGUgcG90ZW50aWFsIGZvciBidWdzIGlzIGhpZ2gsIGNvbnNpZGVyaW5nIHRoZSByZWZhY3RvcmluZy4gIFRoaW5rIHJlZmNvdW50aW5nLCBsb2NraW5nLCB1bm1hcHBpbmcsIGFuZCByYWNlIGNvbmRpdGlvbnMg4oCTIGFsbCBjbGFzc2ljIGZpbGVzeXN0ZW0gdnVsbmVyYWJpbGl0eSBwb2ludHMuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogZm9jdXMgc3ltYm9scy4gIFdoYXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBtb2RpZmllZD8gVGhlIHBhdGNoIHRvdWNoZXMgYHppc29mc191bmNvbXByZXNzX2Jsb2NrYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfcmVhZF9mb2xpb2AuICBJIGNvbmZpcm1lZCB0aGF0IGB6aXNvZnNfcmVhZF9mb2xpb2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGluIGB6aXNvZnNfYW9wc2AsIG1ha2luZyBpdCBhIHRhcmdldCwgYW5kIGB6aXNvZnNfZmlsbF9wYWdlc2AgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaW4gYSBDIGZpbGUgYXJlIHVzdWFsbHkgZGlzdGluY3Qgc3ltYm9scywgd2hpY2ggaGVscHMgd2l0aCB0YXJnZXRlZCBmdXp6aW5nLiBTbywgdGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBleGNlbGxlbnQgdGFyZ2V0cy4KCkxldCYjMzk7cyBjaGVjayB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIFdlIG5lZWQgYElTTzk2NjBfRlNgICgmIzM0O0lTTyA5NjYwIENEUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQmIzM0Oykgd2hpY2ggaXMgdHJpc3RhdGUsIGFuZCBgWklTT0ZTYCAoJiMzNDtUcmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIGV4dGVuc2lvbiYjMzQ7KSB3aGljaCBkZXBlbmRzIG9uIHRoZSBmb3JtZXIgYW5kIHNlbGVjdHMgYFpMSUJfSU5GTEFURWAuIEkgZG91YmxlLWNoZWNrZWQgdGhlIGBmcy9pc29mcy9LY29uZmlnYCB0byBiZSBzdXJlLiBJdCYjMzk7cyB0aG9zZSB0d28uCgpGaW5hbGx5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgbGV0JiMzOTtzIHJldmlzaXQgdGhlIGNoYW5nZXMgYWdhaW4uIEl0JiMzOTtzIHRob3NlIHNhbWUgdGhyZWUgc3ltYm9sczogYHppc29mc19yZWFkX2ZvbGlvYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIE5vIG90aGVyIHNpZ25pZmljYW50IGNoYW5nZXMuIEFsbCB0aHJlZSBhcmUgc3BlY2lmaWMgdG8gemlzb2ZzLgoKU28sIHN1bW1pbmcgdXA6IFdvcnRoRnV6emluZyBpcyB0cnVlLiBGb2N1c1N5bWJvbHMgYXJlIFsmIzM0O3ppc29mc19yZWFkX2ZvbGlvJiMzNDssICYjMzQ7emlzb2ZzX2ZpbGxfcGFnZXMmIzM0OywgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7XS4gRW5hYmxlQ29uZmlncyBhcmUgWyYjMzQ7SVNPOTY2MF9GUyYjMzQ7LCAmIzM0O1pJU09GUyYjMzQ7XS4gV2UgaGF2ZSBhIGNvbmNpc2UgZXhwbGFuYXRpb24uIFRpbWUgdG8gbW92ZSBvbiBhbmQgc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVNPOTY2MF9GUyYjMzQ7LAogICAgJiMzNDtaSVNPRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6aXNvZnNfcmVhZF9mb2xpbyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfZmlsbF9wYWdlcyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVNPOTY2MF9GUyYjMzQ7LAogICAgJiMzNDtaSVNPRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6aXNvZnNfcmVhZF9mb2xpbyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfZmlsbF9wYWdlcyYjMzQ7LAogICAgJiMzNDt6aXNvZnNfdW5jb21wcmVzc19ibG9jayYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbnZlcnRzIGBmcy9pc29mcy9jb21wcmVzcy5jYCBmcm9tIGBzdHJ1Y3QgcGFnZWAgQVBJcyB0byBgc3RydWN0IGZvbGlvYCBBUElzICh1c2luZyBga21hcF9sb2NhbF9mb2xpb2AsIGBmb2xpb196ZXJvX3JhbmdlYCwgYGZvbGlvX21hcmtfdXB0b2RhdGVgLCBgX19maWxlbWFwX2dldF9mb2xpb2AsIGV0Yy4pLiBcblxuVGhlIGFycmF5IGhvbGRpbmcgZm9saW8gcG9pbnRlcnMgaXMgemVyby1hbGxvY2F0ZWQgdmlhIGBremFsbG9jX29ianNgLCBhbmQgZm9saW8gY29udGVudHMgYXJlIGVpdGhlciB1bmNvbXByZXNzZWQgYnkgemxpYiBvciB6ZXJvZWQgdmlhIGBmb2xpb196ZXJvX3JhbmdlYCBiZWZvcmUgYmVpbmcgbWFya2VkIHVwdG9kYXRlLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGluZm8tbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgYnJhbmNoZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBmb2xpbyByZWZlcmVuY2UgY291bnRzLCBsb2Nrcywgb3Igb2Zmc2V0cyBhcmUgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTi9MT0NLREVQL3BhZ2UgZGVidWdnaW5nIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDM1MDMxZjY5NzVkM2UzNWQ4YzI2NDgxOGJlODUxMzllMTEyM2I5MGIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDE5OjI1OjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmMKaW5kZXggZjk4NjlkNjJiODUwOS4uMmQyM2FiYWViODc0MiAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvY29tcHJlc3MuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pc29mcy9jb21wcmVzcy5jCkBAIC0zOSw3ICYjNDM7MzksNyBAQCBzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spOwogICovCiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKIAkJCQkgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LAotCQkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIHBvZmZzZXQsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsCiAJCQkJICAgICAgaW50ICplcnJwKQogewogCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS0mZ3Q7aV9mb3JtYXRfcGFybVsxXTsKQEAgLTY2LDExICYjNDM7NjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAJaWYgKGJsb2NrX3NpemUgPT0gMCkgewogCQlmb3IgKCBpID0gMCA7IGkgJmx0OyBwY291bnQgOyBpJiM0MzsmIzQzOyApIHsKIAkJCXVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7CiYjNDM7CQkJc3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTsKIAotCQkJaWYgKCFwYWdlc1tpXSkKJiM0MzsJCQlpZiAoIWZvbGlvKQogCQkJCWNvbnRpbnVlOwotCQkJbWVtemVyb19wYWdlKHBhZ2VzW2ldLCBvZmYsIFBBR0VfU0laRSAtIG9mZik7Ci0JCQlTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pOwomIzQzOwkJCWZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpOwomIzQzOwkJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCQl9CiAJCXJldHVybiAoKChsb2ZmX3QpcGNvdW50KSAmbHQ7Jmx0OyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7CiAJfQpAQCAtMTE5LDExICYjNDM7MTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCiAJd2hpbGUgKGN1cnBhZ2UgJmx0OyBwY291bnQgJmFtcDsmYW1wOyBjdXJiaCAmbHQ7IGhhdmVibG9ja3MgJmFtcDsmYW1wOwogCSAgICAgICB6ZXJyICE9IFpfU1RSRUFNX0VORCkgewomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTsKJiM0MzsKIAkJaWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7Ci0JCQlpZiAocGFnZXNbY3VycGFnZV0pIHsKLQkJCQlzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX3BhZ2UocGFnZXNbY3VycGFnZV0pCi0JCQkJCQkmIzQzOyBwb2Zmc2V0OwotCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0OwomIzQzOwkJCWlmIChmb2xpbykgewomIzQzOwkJCQlzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTsKJiM0MzsJCQkJc3RyZWFtLmF2YWlsX291dCA9IGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldDsKIAkJCQlwb2Zmc2V0ID0gMDsKIAkJCX0gZWxzZSB7CiAJCQkJc3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKikmYW1wO3ppc29mc19zaW5rX3BhZ2U7CkBAIC0xNzMsOSAmIzQzOzE3NSw5IEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAogCiAJCWlmICghc3RyZWFtLmF2YWlsX291dCkgewogCQkJLyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqLwotCQkJaWYgKHBhZ2VzW2N1cnBhZ2VdKSB7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pOwotCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7CiYjNDM7CQkJaWYgKGZvbGlvKSB7CiYjNDM7CQkJCWZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7CiYjNDM7CQkJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCQkJfQogCQkJaWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHsKIAkJCQlrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTsKQEAgLTIwNiw3ICYjNDM7MjA4LDcgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsCiAgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uCiAgKi8KIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKLQkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcykKJiM0MzsJCQkgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcykKIHsKIAlsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmOwogCWxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kOwpAQCAtMjIxLDE0ICYjNDM7MjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKIAlpbnQgZXJyOwogCWxvZmZfdCByZXQ7CiAKLQlCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pOwomIzQzOwlCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTsKIAogCS8qCiAJICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICYjMzk7ZnVsbF9wYWdlJiMzOTsgcGFnZS4gQmVjYXVzZSB3ZSBoYXZlIHRvCiAJICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZwogCSAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi4KIAkgKi8KLQlzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTsKJiM0MzsJc3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTsKIAllbmRfb2ZmID0gbWluX3QobG9mZl90LCBzdGFydF9vZmYgJiM0MzsgUEFHRV9TSVpFLCBpbm9kZS0mZ3Q7aV9zaXplKTsKIAogCWNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiAmZ3Q7Jmd0OyB6aXNvZnNfYmxvY2tfc2hpZnQ7CkBAIC0yNjcsOSAmIzQzOzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKIAkJfQogCQllcnIgPSAwOwogCQlyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCwKLQkJCQkJICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgJmFtcDtlcnIpOwomIzQzOwkJCQkJICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsICZhbXA7ZXJyKTsKIAkJcG9mZnNldCAmIzQzOz0gcmV0OwotCQlwYWdlcyAmIzQzOz0gcG9mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJZm9saW9zICYjNDM7PSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXBjb3VudCAtPSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCWZ1bGxfcGFnZSAtPSBwb2Zmc2V0ICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXBvZmZzZXQgJmFtcDs9IH5QQUdFX01BU0s7CkBAIC0yODksOSAmIzQzOzI5MSwxMSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCiAJCWNzdGFydF9ibG9jayYjNDM7JiM0Mzs7CiAJfQogCi0JaWYgKHBvZmZzZXQgJmFtcDsmYW1wOyAqcGFnZXMpIHsKLQkJbWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7Ci0JCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOwomIzQzOwlpZiAocG9mZnNldCAmYW1wOyZhbXA7ICpmb2xpb3MpIHsKJiM0MzsJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zOwomIzQzOwomIzQzOwkJZm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTsKJiM0MzsJCWZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pOwogCX0KIAlicmVsc2UoYmgpOwogCXJldHVybiAwOwpAQCAtMzEyLDcgJiM0MzszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9CiAJCVBBR0VfU0hJRlQgJmx0Oz0gemlzb2ZzX2Jsb2NrX3NoaWZ0ID8KIAkJKDEgJmx0OyZsdDsgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKJiM0MzsJc3RydWN0IGZvbGlvICoqZm9saW9zOwogCXBnb2ZmX3QgaW5kZXggPSBmb2xpby0mZ3Q7aW5kZXgsIGVuZF9pbmRleDsKIAogCWVuZF9pbmRleCA9IChpbm9kZS0mZ3Q7aV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CkBAIC0zMzYsMzMgJiM0MzszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAkJZnVsbF9wYWdlID0gMDsKIAkJcGNvdW50ID0gMTsKIAl9Ci0JcGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLAotCQkJICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7Ci0JaWYgKCFwYWdlcykgewomIzQzOwlmb2xpb3MgPSBremFsbG9jX29ianMoKmZvbGlvcywKJiM0MzsJCQkgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7CiYjNDM7CWlmICghZm9saW9zKSB7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwYWdlc1tmdWxsX3BhZ2VdID0gJmFtcDtmb2xpby0mZ3Q7cGFnZTsKJiM0MzsJZm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbzsKIAogCWZvciAoaSA9IDA7IGkgJmx0OyBwY291bnQ7IGkmIzQzOyYjNDM7LCBpbmRleCYjNDM7JiM0MzspIHsKLQkJaWYgKGkgIT0gZnVsbF9wYWdlKQotCQkJcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIGluZGV4KTsKJiM0MzsJCWlmIChpID09IGZ1bGxfcGFnZSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsCiYjNDM7CQkJCUZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCwKJiM0MzsJCQkJbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7CiYjNDM7CQlpZiAoSVNfRVJSKGZvbGlvc1tpXSkpCiYjNDM7CQkJZm9saW9zW2ldID0gTlVMTDsKIAl9CiAKLQllcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIHBhZ2VzKTsKJiM0MzsJZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpOwogCi0JLyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi8KJiM0MzsJLyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovCiAJZm9yIChpID0gMDsgaSAmbHQ7IHBjb3VudDsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VzW2ldKSB7Ci0JCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CiYjNDM7CQlpZiAoZm9saW9zW2ldKSB7CiYjNDM7CQkJZmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7CiYjNDM7CQkJZm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7CiAJCQlpZiAoaSAhPSBmdWxsX3BhZ2UpCi0JCQkJcHV0X3BhZ2UocGFnZXNbaV0pOwomIzQzOwkJCQlmb2xpb19wdXQoZm9saW9zW2ldKTsKIAkJfQotCX0JCQkKJiM0MzsJfQogCiAJLyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlICYjMzQ7Y3JpdGljYWwmIzM0OyBwYWdlICovCi0Ja2ZyZWUocGFnZXMpOwomIzQzOwlrZnJlZShmb2xpb3MpOwogCXJldHVybiBlcnI7CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQyMzMKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAxMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB6aXNvZnMgRm9saW8gQ29udmVyc2lvbioqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgcHJlY2lzZWx5IGhvdyB0aGlzIGNvbnZlcnNpb24gZnJvbSBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gIGluIGBmcy9pc29mcy9jb21wcmVzcy5jYCBpbXBhY3RzIHRoZSB6aXNvZnMgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgcG90ZW50aWFsbHkgY3JpdGljYWwgY2hhbmdlLCBzbyBJJiMzOTttIGdvaW5nIHRvIHNjcnV0aW5pemUgdGhlIGNvZGUgbWV0aWN1bG91c2x5LgoKRmlyc3QsIEkgbmVlZCB0byByZWFkIGBmcy9pc29mcy9jb21wcmVzcy5jYCwgZm9jdXNpbmcgcGFydGljdWxhcmx5IG9uIHRoZSBhcmVhcyBhcm91bmQgdGhlIGxpbmVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGUgcHJpbWFyeSBjb25jZXJuIGhlcmUgaXMgc2FmZXR5OyBJIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhpcyBpcyBhIHB1cmUgZm9saW8gY29udmVyc2lvbi4gVGhlcmUmIzM5O3MgYWx3YXlzIHRoZSByaXNrLCBob3dldmVyIHNtYWxsLCBvZiBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgYSBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhayBkdXJpbmcgc3VjaCBhIHJlZmFjdG9yaW5nLCBzbyBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgdmlnaWxhbnQgaW4gc2VhcmNoaW5nIGZvciB0aG9zZSBraW5kcyBvZiBpc3N1ZXMuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBjaGFuZ2VkIGFuZCBjb25maXJtIHRoYXQgbm90aGluZyBoYXMgYmVlbiBtaXNzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvY29tcHJlc3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuICAgMjpcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAgIDM6XHQgKiAgIFxuICAgNDpcdCAqICAgQ29weXJpZ2h0IDIwMDEgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkXG4gICA1Olx0ICpcbiAgIDY6XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgNzpcdFxuICAgODpcdC8qXG4gICA5Olx0ICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuY1xuICAxMDpcdCAqXG4gIDExOlx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cbiAgMTI6XHQgKi9cbiAgMTM6XHRcbiAgMTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuICAxNjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jpby5oXHUwMDNlXG4gIDE3Olx0XG4gIDE4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gIDE5Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvdm1hbGxvYy5oXHUwMDNlXG4gIDIwOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvemxpYi5oXHUwMDNlXG4gIDIxOlx0XG4gIDIyOlx0I2luY2x1ZGUgXCYjMzQ7aXNvZnMuaFwmIzM0O1xuICAyMzpcdCNpbmNsdWRlIFwmIzM0O3ppc29mcy5oXCYjMzQ7XG4gIDI0Olx0XG4gIDI1Olx0LyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZ2xvYmFsLiAqL1xuICAyNjpcdHN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcbiAgMjc6XHRcbiAgMjg6XHQvKlxuICAyOTpcdCAqIFRoaXMgY29udGFpbnMgdGhlIHpsaWIgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHRoZSBtdXRleCBmb3IgdGhlXG4gIDMwOlx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxuICAzMTpcdCAqL1xuICAzMjpcdHN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XG4gIDMzOlx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgMzQ6XHRcbiAgMzU6XHQvKlxuICAzNjpcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xuICAzNzpcdCAqIHRvIG9uZSB6aXNvZnMgYmxvY2suIFN0b3JlIHRoZSBkYXRhIGluIHRoZSBAcGFnZXMgYXJyYXkgd2l0aCBAcGNvdW50XG4gIDM4Olx0ICogZW50cmllcy4gU3RhcnQgc3RvcmluZyBhdCBvZmZzZXQgQHBvZmZzZXQgb2YgdGhlIGZpcnN0IHBhZ2UuXG4gIDM5Olx0ICovXG4gIDQwOlx0c3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gIDQxOlx0XHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuICA0MjpcdFx0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zLCB1bnNpZ25lZCBpbnQgcG9mZnNldCxcbiAgNDM6XHRcdFx0XHRcdCAgICAgIGludCAqZXJycClcbiAgNDQ6XHR7XG4gIDQ1Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbiAgNDY6XHRcdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xuICA0NzpcdFx0dW5zaWduZWQgaW50IGJ1ZnNoaWZ0ID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpO1xuICA0ODpcdFx0dW5zaWduZWQgaW50IGJ1Zm1hc2sgPSBidWZzaXplIC0gMTtcbiAgNDk6XHRcdGludCBpLCBibG9ja19zaXplID0gYmxvY2tfZW5kIC0gYmxvY2tfc3RhcnQ7XG4gIDUwOlx0XHR6X3N0cmVhbSBzdHJlYW0gPSB7IC50b3RhbF9vdXQgPSAwLFxuICA1MTpcdFx0XHRcdCAgICAuYXZhaWxfaW4gPSAwLFxuICA1MjpcdFx0XHRcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcbiAgNTM6XHRcdGludCB6ZXJyO1xuICA1NDpcdFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSAmIzQzOyAoYmxvY2tfc3RhcnQgXHUwMDI2IGJ1Zm1hc2spICYjNDM7IGJ1Zm1hc2spXG4gIDU1Olx0XHRcdFx0XHRcdTAwM2VcdTAwM2UgYnVmc2hpZnQ7XG4gIDU2Olx0XHRpbnQgaGF2ZWJsb2NrcztcbiAgNTc6XHRcdGJsa2NudF90IGJsb2NrbnVtO1xuICA1ODpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzO1xuICA1OTpcdFx0aW50IGN1cmJoLCBjdXJwYWdlO1xuICA2MDpcdFxuICA2MTpcdFx0aWYgKGJsb2NrX3NpemUgXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcbiAgNjI6XHRcdFx0KmVycnAgPSAtRUlPO1xuICA2MzpcdFx0XHRyZXR1cm4gMDtcbiAgNjQ6XHRcdH1cbiAgNjU6XHRcdC8qIEVtcHR5IGJsb2NrPyAqL1xuICA2NjpcdFx0aWYgKGJsb2NrX3NpemUgPT0gMCkge1xuICA2NzpcdFx0XHRmb3IgKCBpID0gMCA7IGkgXHUwMDNjIHBjb3VudCA7IGkmIzQzOyYjNDM7ICkge1xuICA2ODpcdFx0XHRcdHVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7XG4gIDY5Olx0XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcbiAgNzA6XHRcbiAgNzE6XHRcdFx0XHRpZiAoIWZvbGlvKVxuICA3MjpcdFx0XHRcdFx0Y29udGludWU7XG4gIDczOlx0XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XG4gIDc0Olx0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gIDc1Olx0XHRcdH1cbiAgNzY6XHRcdFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XG4gIDc3Olx0XHR9XG4gIDc4Olx0XG4gIDc5Olx0XHQvKiBCZWNhdXNlIHpsaWIgaXMgbm90IHRocmVhZC1zYWZlLCBkbyBhbGwgdGhlIEkvTyBhdCB0aGUgdG9wLiAqL1xuICA4MDpcdFx0YmxvY2tudW0gPSBibG9ja19zdGFydCBcdTAwM2VcdTAwM2UgYnVmc2hpZnQ7XG4gIDgxOlx0XHRiaHMgPSBremFsbG9jX29ianMoKmJocywgbmVlZGJsb2NrcyAmIzQzOyAxKTtcbiAgODI6XHRcdGlmICghYmhzKSB7XG4gIDgzOlx0XHRcdCplcnJwID0gLUVOT01FTTtcbiAgODQ6XHRcdFx0cmV0dXJuIDA7XG4gIDg1Olx0XHR9XG4gIDg2Olx0XHRoYXZlYmxvY2tzID0gaXNvZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2tudW0sIGJocywgbmVlZGJsb2Nrcyk7XG4gIDg3Olx0XHRiaF9yZWFkX2JhdGNoKGhhdmVibG9ja3MsIGJocyk7XG4gIDg4Olx0XG4gIDg5Olx0XHRjdXJiaCA9IDA7XG4gIDkwOlx0XHRjdXJwYWdlID0gMDtcbiAgOTE6XHRcdC8qXG4gIDkyOlx0XHQgKiBGaXJzdCBibG9jayBpcyBzcGVjaWFsIHNpbmNlIGl0IG1heSBiZSBmcmFjdGlvbmFsLiAgV2UgYWxzbyB3YWl0IGZvclxuICA5MzpcdFx0ICogaXQgYmVmb3JlIGdyYWJiaW5nIHRoZSB6bGliIG11dGV4OyBvZGRzIGFyZSB0aGF0IHRoZSBzdWJzZXF1ZW50XG4gIDk0Olx0XHQgKiBibG9ja3MgYXJlIGdvaW5nIHRvIGNvbWUgaW4gaW4gc2hvcnQgb3JkZXIgc28gd2UgZG9uJiMzOTt0IGhvbGQgdGhlIHpsaWJcbiAgOTU6XHRcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cbiAgOTY6XHRcdCAqL1xuICA5NzpcdFxuICA5ODpcdFx0aWYgKCFiaHNbMF0pXG4gIDk5Olx0XHRcdGdvdG8gYl9laW87XG4gMTAwOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDYwMDgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSB3ZSBnby4uLgoKKipEaXZpbmcgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGlzIGZpbGUuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBJU09GUyBjb21wcmVzc2lvbiBpcyBpbXBsZW1lbnRlZC4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBncmFzcCBvbiB0aGUgYnJvYWRlciBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUgYW5kIHRoZSBJU08gOTY2MCBzdGFuZGFyZCwgYnV0IHRoZSBjb21wcmVzc2lvbiBhc3BlY3QgaXMgc29tZXRoaW5nIEkgbmVlZCB0byByZWZyZXNoLiBXaGF0IHNwZWNpZmljIGFsZ29yaXRobXMgYXJlIGluIHVzZT8gSG93IGFyZSB0aGV5IGludGVncmF0ZWQgd2l0aGluIHRoZSBJL08gb3BlcmF0aW9ucz8gQXJlIHRoZXJlIGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgb3IgcG90ZW50aWFsIG9wdGltaXphdGlvbiBhcmVhcz8gSSB3YW50IHRvIHNlZSBob3cgdGhlIGNvbXByZXNzaW9uIGFmZmVjdHMgcmVhZCBhbmQgd3JpdGUgcGF0aHMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgZGUvY29tcHJlc3Npb24sIGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtJiMzOTtzIG1ldGFkYXRhIGlzIG1vZGlmaWVkIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBwcmVzZW50cyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB1c2VyLiBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpYyBzdHJ1Y3R1cmVzIG9yIGZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgYSBmaWxlJiMzOTtzIGNvbXByZXNzZWQgc3RhdGUuIExldCYjMzk7cyBzZWUgd2hhdCBpbnRlcmVzdGluZyB0ZWNobmlxdWVzIHRoZSBkZXZlbG9wZXJzIHV0aWxpemVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lzb2ZzL2NvbXByZXNzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDE6XHRcdHdhaXRfb25fYnVmZmVyKGJoc1swXSk7XG4gMTAyOlx0XHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbMF0pKSB7XG4gMTAzOlx0XHRcdCplcnJwID0gLUVJTztcbiAxMDQ6XHRcdFx0Z290byBiX2VpbztcbiAxMDU6XHRcdH1cbiAxMDY6XHRcbiAxMDc6XHRcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XG4gMTA4Olx0XHRtdXRleF9sb2NrKFx1MDAyNnppc29mc196bGliX2xvY2spO1xuIDEwOTpcdFx0XHRcbiAxMTA6XHRcdHplcnIgPSB6bGliX2luZmxhdGVJbml0KFx1MDAyNnN0cmVhbSk7XG4gMTExOlx0XHRpZiAoemVyciAhPSBaX09LKSB7XG4gMTEyOlx0XHRcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxuIDExMzpcdFx0XHRcdCplcnJwID0gLUVOT01FTTtcbiAxMTQ6XHRcdFx0ZWxzZVxuIDExNTpcdFx0XHRcdCplcnJwID0gLUVJTztcbiAxMTY6XHRcdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7emlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXG5cJiMzNDssXG4gMTE3Olx0XHRcdFx0ICAgICAgIHplcnIpO1xuIDExODpcdFx0XHRnb3RvIHpfZWlvO1xuIDExOTpcdFx0fVxuIDEyMDpcdFxuIDEyMTpcdFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gMTIyOlx0XHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbiAxMjM6XHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcbiAxMjQ6XHRcbiAxMjU6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gMTI2Olx0XHRcdFx0aWYgKGZvbGlvKSB7XG4gMTI3Olx0XHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTtcbiAxMjg6XHRcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gMTI5Olx0XHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiAxMzA6XHRcdFx0XHR9IGVsc2Uge1xuIDEzMTpcdFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuIDEzMjpcdFx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRTtcbiAxMzM6XHRcdFx0XHR9XG4gMTM0Olx0XHRcdH1cbiAxMzU6XHRcdFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pIHtcbiAxMzY6XHRcdFx0XHR3YWl0X29uX2J1ZmZlcihiaHNbY3VyYmhdKTtcbiAxMzc6XHRcdFx0XHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbY3VyYmhdKSkge1xuIDEzODpcdFx0XHRcdFx0KmVycnAgPSAtRUlPO1xuIDEzOTpcdFx0XHRcdFx0YnJlYWs7XG4gMTQwOlx0XHRcdFx0fVxuIDE0MTpcdFx0XHRcdHN0cmVhbS5uZXh0X2luICA9IGJoc1tjdXJiaF0tXHUwMDNlYl9kYXRhICYjNDM7XG4gMTQyOlx0XHRcdFx0XHRcdFx0KGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKTtcbiAxNDM6XHRcdFx0XHRzdHJlYW0uYXZhaWxfaW4gPSBtaW5fdCh1bnNpZ25lZCwgYnVmc2l6ZSAtXG4gMTQ0Olx0XHRcdFx0XHRcdFx0KGJsb2NrX3N0YXJ0IFx1MDAyNiBidWZtYXNrKSxcbiAxNDU6XHRcdFx0XHRcdFx0XHRibG9ja19zaXplKTtcbiAxNDY6XHRcdFx0XHRibG9ja19zaXplIC09IHN0cmVhbS5hdmFpbF9pbjtcbiAxNDc6XHRcdFx0XHRibG9ja19zdGFydCA9IDA7XG4gMTQ4Olx0XHRcdH1cbiAxNDk6XHRcbiAxNTA6XHRcdFx0d2hpbGUgKHN0cmVhbS5hdmFpbF9vdXQgXHUwMDI2XHUwMDI2IHN0cmVhbS5hdmFpbF9pbikge1xuIDE1MTpcdFx0XHRcdHplcnIgPSB6bGliX2luZmxhdGUoXHUwMDI2c3RyZWFtLCBaX1NZTkNfRkxVU0gpO1xuIDE1MjpcdFx0XHRcdGlmICh6ZXJyID09IFpfQlVGX0VSUk9SIFx1MDAyNlx1MDAyNiBzdHJlYW0uYXZhaWxfaW4gPT0gMClcbiAxNTM6XHRcdFx0XHRcdGJyZWFrO1xuIDE1NDpcdFx0XHRcdGlmICh6ZXJyID09IFpfU1RSRUFNX0VORClcbiAxNTU6XHRcdFx0XHRcdGJyZWFrO1xuIDE1NjpcdFx0XHRcdGlmICh6ZXJyICE9IFpfT0spIHtcbiAxNTc6XHRcdFx0XHRcdC8qIEVPRiwgZXJyb3IsIG9yIHRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXQgKi9cbiAxNTg6XHRcdFx0XHRcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxuIDE1OTpcdFx0XHRcdFx0XHQqZXJycCA9IC1FTk9NRU07XG4gMTYwOlx0XHRcdFx0XHRlbHNlIHtcbiAxNjE6XHRcdFx0XHRcdFx0cHJpbnRrKEtFUk5fREVCVUdcbiAxNjI6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0O3ppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcJiMzNDtcbiAxNjM6XHRcdFx0XHRcdFx0ICAgICAgIFwmIzM0OyAlZCwgaW5vZGUgPSAlbGx1LFwmIzM0O1xuIDE2NDpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IHBhZ2UgaWR4ID0gJWQsIGJoIGlkeCA9ICVkLFwmIzM0O1xuIDE2NTpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IGF2YWlsX2luID0gJWxkLFwmIzM0O1xuIDE2NjpcdFx0XHRcdFx0XHQgICAgICAgXCYjMzQ7IGF2YWlsX291dCA9ICVsZFxcblwmIzM0OyxcbiAxNjc6XHRcdFx0XHRcdFx0ICAgICAgIHplcnIsIGlub2RlLVx1MDAzZWlfaW5vLCBjdXJwYWdlLFxuIDE2ODpcdFx0XHRcdFx0XHQgICAgICAgY3VyYmgsIHN0cmVhbS5hdmFpbF9pbixcbiAxNjk6XHRcdFx0XHRcdFx0ICAgICAgIHN0cmVhbS5hdmFpbF9vdXQpO1xuIDE3MDpcdFx0XHRcdFx0XHQqZXJycCA9IC1FSU87XG4gMTcxOlx0XHRcdFx0XHR9XG4gMTcyOlx0XHRcdFx0XHRnb3RvIGluZmxhdGVfb3V0O1xuIDE3MzpcdFx0XHRcdH1cbiAxNzQ6XHRcdFx0fVxuIDE3NTpcdFxuIDE3NjpcdFx0XHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcbiAxNzc6XHRcdFx0XHQvKiBUaGlzIHBhZ2UgY29tcGxldGVkICovXG4gMTc4Olx0XHRcdFx0aWYgKGZvbGlvKSB7XG4gMTc5Olx0XHRcdFx0XHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xuIDE4MDpcdFx0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gMTgxOlx0XHRcdFx0fVxuIDE4MjpcdFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gMTgzOlx0XHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbiAxODQ6XHRcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9IE5VTEw7XG4gMTg1Olx0XHRcdFx0fVxuIDE4NjpcdFx0XHRcdGN1cnBhZ2UmIzQzOyYjNDM7O1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XHRcdGlmICghc3RyZWFtLmF2YWlsX2luKVxuIDE4OTpcdFx0XHRcdGN1cmJoJiM0MzsmIzQzOztcbiAxOTA6XHRcdH1cbiAxOTE6XHRpbmZsYXRlX291dDpcbiAxOTI6XHRcdHpsaWJfaW5mbGF0ZUVuZChcdTAwMjZzdHJlYW0pO1xuIDE5MzpcdFx0aWYgKHN0cmVhbS5uZXh0X291dCBcdTAwMjZcdTAwMjYgc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSlcbiAxOTQ6XHRcdFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XG4gMTk1Olx0XG4gMTk2Olx0el9laW86XG4gMTk3Olx0XHRtdXRleF91bmxvY2soXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XG4gMTk4Olx0XG4gMTk5Olx0Yl9laW86XG4gMjAwOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBoYXZlYmxvY2tzOyBpJiM0MzsmIzQzOylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc3MQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIHRoZSBzdW1tYXJ5LCByZW5kZXJlZCBhcyBpZiBJJiMzOTttIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkRpZ2dpbmcgRGVlcGVyIGludG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgKioKCkFscmlnaHQsIEkmIzM5O3ZlIGdvdCBhIGhhbmRsZSBvbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoaXMgZmlsZSwgYnV0IHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gZXhwYW5kIG15IHNjb3BlLiBMZXQmIzM5O3Mgbm90IGp1c3QgYXNzdW1lIEkmIzM5O3ZlIHNlZW4gZW5vdWdoLCBldmVuIGlmIEkgKnRoaW5rKiBJJiMzOTttIGdldHRpbmcgdGhlIGdpc3Qgb2YgdGhpbmdzLiBJJiMzOTttIGFuIGV4cGVydCwgeWVzLCBidXQgZXhwZXJ0aXNlIG1lYW5zIGtub3dpbmcgd2hlcmUgdG8gbG9vayBhbmQgd2hhdCB0byBjb25zaWRlciwgbm90IG5lY2Vzc2FyaWx5IHJ1c2hpbmcgdG8ganVkZ2VtZW50LiBJIG5lZWQgYSBwcm9wZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZW50aXJlIGZpbGUuIFNvLCBJIG5lZWQgdG8gbW92ZSBwYXN0IHRoZSBpbml0aWFsIHNlY3Rpb24sIGFuZCByZWFsbHkgYW5hbHl6ZSB0aGUgcmVzdCBvZiBgZnMvaXNvZnMvY29tcHJlc3MuY2AuIFRoaXMgaXNuJiMzOTt0IGp1c3QgYWJvdXQgcmVhZGluZyBjb2RlOyBpdCYjMzk7cyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaW4gdGhlIElTT0ZTIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZ1bmN0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0IGVsc2UgdGhpcyBzZWN0aW9uIG1pZ2h0IGhvbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE5OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvaXNvZnMvY29tcHJlc3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIwMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDIwMTpcdFx0XHRicmVsc2UoYmhzW2ldKTtcbiAyMDI6XHRcdGtmcmVlKGJocyk7XG4gMjAzOlx0XHRyZXR1cm4gc3RyZWFtLnRvdGFsX291dDtcbiAyMDQ6XHR9XG4gMjA1Olx0XG4gMjA2Olx0LypcbiAyMDc6XHQgKiBVbmNvbXByZXNzIGRhdGEgc28gdGhhdCBwYWdlc1tmdWxsX3BhZ2VdIGlzIGZ1bGx5IHVwdG9kYXRlIGFuZCBwb3NzaWJseVxuIDIwODpcdCAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cbiAyMDk6XHQgKi9cbiAyMTA6XHRzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXG4gMjExOlx0XHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4gMjEyOlx0e1xuIDIxMzpcdFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcbiAyMTQ6XHRcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xuIDIxNTpcdFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcbiAyMTY6XHRcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xuIDIxNzpcdFx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xuIDIxODpcdFx0bG9mZl90IHBvZmZzZXQgPSAwO1xuIDIxOTpcdFx0YmxrY250X3QgY3N0YXJ0X2Jsb2NrLCBjZW5kX2Jsb2NrO1xuIDIyMDpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAyMjE6XHRcdHVuc2lnbmVkIGludCBibGtiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpO1xuIDIyMjpcdFx0dW5zaWduZWQgaW50IGJsa3NpemUgPSAxIFx1MDAzY1x1MDAzYyBibGtiaXRzO1xuIDIyMzpcdFx0aW50IGVycjtcbiAyMjQ6XHRcdGxvZmZfdCByZXQ7XG4gMjI1Olx0XG4gMjI2Olx0XHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcbiAyMjc6XHRcbiAyMjg6XHRcdC8qXG4gMjI5Olx0XHQgKiBXZSB3YW50IHRvIHJlYWQgYXQgbGVhc3QgJiMzOTtmdWxsX3BhZ2UmIzM5OyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiAyMzA6XHRcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiAyMzE6XHRcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiAyMzI6XHRcdCAqL1xuIDIzMzpcdFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcbiAyMzQ6XHRcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiAmIzQzOyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gMjM1Olx0XG4gMjM2Olx0XHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbiAyMzc6XHRcdGNlbmRfYmxvY2sgPSAoZW5kX29mZiAmIzQzOyAoMSBcdTAwM2NcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSAtIDEpXG4gMjM4Olx0XHRcdFx0XHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbiAyMzk6XHRcbiAyNDA6XHRcdFdBUk5fT04oc3RhcnRfb2ZmIC0gKGZ1bGxfcGFnZSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgIT1cbiAyNDE6XHRcdFx0KChjc3RhcnRfYmxvY2sgXHUwMDNjXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXHUwMDI2IFBBR0VfTUFTSykpO1xuIDI0MjpcdFxuIDI0MzpcdFx0LyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovXG4gMjQ0Olx0XHQvKiBOb3RlOiB3ZSYjMzk7cmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqL1xuIDI0NTpcdFx0LyogTm90ZTogaGVhZGVyX3NpemUgaXMgaW4gMzItYml0IHdvcmRzICg0IGJ5dGVzKSAqL1xuIDI0NjpcdFx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgJiM0MzsgY3N0YXJ0X2Jsb2NrKSBcdTAwM2NcdTAwM2MgMjtcbiAyNDc6XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFx1MDAzZVx1MDAzZSBibGtiaXRzKTtcbiAyNDg6XHRcdGlmICghYmgpXG4gMjQ5Olx0XHRcdHJldHVybiAtRUlPO1xuIDI1MDpcdFx0YmxvY2tfc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxuIDI1MTpcdFx0XHRcdFx0KGJoLVx1MDAzZWJfZGF0YSAmIzQzOyAoYmxvY2twdHIgXHUwMDI2IChibGtzaXplIC0gMSkpKSk7XG4gMjUyOlx0XG4gMjUzOlx0XHR3aGlsZSAoY3N0YXJ0X2Jsb2NrIFx1MDAzYyBjZW5kX2Jsb2NrIFx1MDAyNlx1MDAyNiBwY291bnQgXHUwMDNlIDApIHtcbiAyNTQ6XHRcdFx0LyogTG9hZCBlbmQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgaW4gdGhlIGZpbGUgKi9cbiAyNTU6XHRcdFx0YmxvY2twdHIgJiM0Mzs9IDQ7XG4gMjU2Olx0XHRcdC8qIFRyYXZlcnNlZCB0byBuZXh0IGJsb2NrPyAqL1xuIDI1NzpcdFx0XHRpZiAoIShibG9ja3B0ciBcdTAwMjYgKGJsa3NpemUgLSAxKSkpIHtcbiAyNTg6XHRcdFx0XHRicmVsc2UoYmgpO1xuIDI1OTpcdFxuIDI2MDpcdFx0XHRcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFx1MDAzZVx1MDAzZSBibGtiaXRzKTtcbiAyNjE6XHRcdFx0XHRpZiAoIWJoKVxuIDI2MjpcdFx0XHRcdFx0cmV0dXJuIC1FSU87XG4gMjYzOlx0XHRcdH1cbiAyNjQ6XHRcdFx0YmxvY2tfZW5kID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcbiAyNjU6XHRcdFx0XHRcdChiaC1cdTAwM2ViX2RhdGEgJiM0MzsgKGJsb2NrcHRyIFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xuIDI2NjpcdFx0XHRpZiAoYmxvY2tfc3RhcnQgXHUwMDNlIGJsb2NrX2VuZCkge1xuIDI2NzpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjY4Olx0XHRcdFx0cmV0dXJuIC1FSU87XG4gMjY5Olx0XHRcdH1cbiAyNzA6XHRcdFx0ZXJyID0gMDtcbiAyNzE6XHRcdFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXG4gMjcyOlx0XHRcdFx0XHRcdCAgICAgIHBjb3VudCwgZm9saW9zLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuIDI3MzpcdFx0XHRwb2Zmc2V0ICYjNDM7PSByZXQ7XG4gMjc0Olx0XHRcdGZvbGlvcyAmIzQzOz0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiAyNzU6XHRcdFx0cGNvdW50IC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc2Olx0XHRcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDI3NzpcdFx0XHRwb2Zmc2V0IFx1MDAyNj0gflBBR0VfTUFTSztcbiAyNzg6XHRcbiAyNzk6XHRcdFx0aWYgKGVycikge1xuIDI4MDpcdFx0XHRcdGJyZWxzZShiaCk7XG4gMjgxOlx0XHRcdFx0LypcbiAyODI6XHRcdFx0XHQgKiBEaWQgd2UgZmluaXNoIHJlYWRpbmcgdGhlIHBhZ2Ugd2UgcmVhbGx5IHdhbnRlZFxuIDI4MzpcdFx0XHRcdCAqIHRvIHJlYWQ/XG4gMjg0Olx0XHRcdFx0ICovXG4gMjg1Olx0XHRcdFx0aWYgKGZ1bGxfcGFnZSBcdTAwM2MgMClcbiAyODY6XHRcdFx0XHRcdHJldHVybiAwO1xuIDI4NzpcdFx0XHRcdHJldHVybiBlcnI7XG4gMjg4Olx0XHRcdH1cbiAyODk6XHRcbiAyOTA6XHRcdFx0YmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7XG4gMjkxOlx0XHRcdGNzdGFydF9ibG9jayYjNDM7JiM0Mzs7XG4gMjkyOlx0XHR9XG4gMjkzOlx0XG4gMjk0Olx0XHRpZiAocG9mZnNldCBcdTAwMjZcdTAwMjYgKmZvbGlvcykge1xuIDI5NTpcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcbiAyOTY6XHRcbiAyOTc6XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcbiAyOTg6XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gMjk5Olx0XHR9XG4gMzAwOlx0XHRicmVsc2UoYmgpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxOToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjE5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQsIGdlYXJlZCB0b3dhcmQgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgRmlsZSBTZWN0aW9uIC0gTGluZXMgMzAxIHRvIEVuZCoqCgpBbHJpZ2h0LCBJJiMzOTttIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIHRhaWwgZW5kIG9mIHRoaXMgZmlsZSwgc3BlY2lmaWNhbGx5IGZyb20gbGluZSAzMDEgb253YXJkLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHJhcGlkbHkgc2NhbiB0aGlzIHNlY3Rpb24uIEdpdmVuIHdoYXQgSSYjMzk7dmUgc2VlbiBpbiB0aGUgZWFybGllciBwYXJ0cywgSSBoYXZlIGEgZmV3IGltbWVkaWF0ZSBoeXBvdGhlc2VzIHRoYXQgSSB3YW50IHRvIHRlc3QuIElzIHRoaXMgdGhlIGNvbmNsdWRpbmcgc2VjdGlvbiB3aGVyZSB0aGUgY29yZSBsb2dpYyBpcyBiZWluZyBleGVjdXRlZD8gT3IgbWF5YmUgdGhpcyBpcyB3aGVyZSBzb21lIHBvc3QtcHJvY2Vzc2luZyBoYXBwZW5zPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcmVkIGZsYWdzIGxpa2UgdW5leHBlY3RlZCBqdW1wcywgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgcmVjdXJzaXZlIGNhbGxzIHRoYXQgd2VyZW4mIzM5O3Qgb2J2aW91cyBhdCBmaXJzdCBnbGFuY2U/CgpJ4oCZbSBwYXJ0aWN1bGFybHkgbG9va2luZyBmb3IgYW55IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY29uY2VwdHMgSSB3YXMgdGhpbmtpbmcgYWJvdXQgZWFybGllci4gSXQgaXMgbGlrZWx5IHRoYXQgdGhpcyBzZWN0aW9uIGNvbmZpcm1zIG9yIGVsaW1pbmF0ZXMgcHJldmlvdXMgaHlwb3RoZXNlcy4gSSBoYXZlIG15IG1lbnRhbCBjaGVja2xpc3Qgb2Yga2V5IHZhcmlhYmxlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGluIG1pbmQuIEkgd2FudCB0byBzZWUgaG93IHRob3NlIGFyZSBiZWluZyBtYW5pcHVsYXRlZCBoZXJlLCBpZiBhdCBhbGwuIEFyZSB0aGVyZSBhbnkgY2FsbHMgdG8gZXh0ZXJuYWwgbGlicmFyaWVzLCBhbmQgaWYgc28sIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhvc2UgY2FsbHMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgZnVuY3Rpb25hbGl0eT8KCkl04oCZcyBjcnVjaWFsIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBvZiBpbmVmZmljaWVuY3kuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHNlY3Rpb25zIHRoYXQgYXBwZWFyIHRvIGJlIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUsIHBhcnRpY3VsYXJseSBpZiB0aGV5IGFyZSBpbnNpZGUgbG9vcHMuIElmIHRoaXMgaXMgYSBsYXJnZSBmaWxlLCB0aGUgbGFzdCBwYXJ0IGlzIG1vcmUgdGhhbiBsaWtlbHkga2V5IHRvIHRoZSBmdW5jdGlvbi4gTm93IHRvIGRpdmUgaW4gYW5kIGdldCBhIGdyaXAgb24gd2hhdCB0aGlzIHBhcnQgYWN0dWFsbHkgZG9lcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9pc29mcy9jb21wcmVzcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzAxOlx0XHRyZXR1cm4gMDtcbiAzMDI6XHR9XG4gMzAzOlx0XG4gMzA0Olx0LypcbiAzMDU6XHQgKiBXaGVuIGRlY29tcHJlc3NpbmcsIHdlIHR5cGljYWxseSBvYnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlXG4gMzA2Olx0ICogcGVyIHJlZmVyZW5jZS4gIFdlIGluamVjdCB0aGUgYWRkaXRpb25hbCBwYWdlcyBpbnRvIHRoZSBwYWdlXG4gMzA3Olx0ICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC5cbiAzMDg6XHQgKi9cbiAzMDk6XHRzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIDMxMDpcdHtcbiAzMTE6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDMxMjpcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cdTAwM2VpX21hcHBpbmc7XG4gMzEzOlx0XHRpbnQgZXJyO1xuIDMxNDpcdFx0aW50IGksIHBjb3VudCwgZnVsbF9wYWdlO1xuIDMxNTpcdFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG4gMzE2Olx0XHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxuIDMxNzpcdFx0XHRQQUdFX1NISUZUIFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0ID9cbiAzMTg6XHRcdFx0KDEgXHUwMDNjXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xuIDMxOTpcdFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIDMyMDpcdFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gMzIxOlx0XG4gMzIyOlx0XHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICYjNDM7IFBBR0VfU0laRSAtIDEpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDMyMzpcdFx0LypcbiAzMjQ6XHRcdCAqIElmIHRoaXMgZm9saW8gaXMgd2hvbGx5IG91dHNpZGUgaV9zaXplIHdlIGp1c3QgcmV0dXJuIHplcm87XG4gMzI1Olx0XHQgKiBkb19nZW5lcmljX2ZpbGVfcmVhZCgpIHdpbGwgaGFuZGxlIHRoaXMgZm9yIHVzXG4gMzI2Olx0XHQgKi9cbiAzMjc6XHRcdGlmIChpbmRleCBcdTAwM2U9IGVuZF9pbmRleCkge1xuIDMyODpcdFx0XHRmb2xpb19lbmRfcmVhZChmb2xpbywgdHJ1ZSk7XG4gMzI5Olx0XHRcdHJldHVybiAwO1xuIDMzMDpcdFx0fVxuIDMzMTpcdFxuIDMzMjpcdFx0aWYgKFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQpIHtcbiAzMzM6XHRcdFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxuIDMzNDpcdFx0XHQgICB3ZSBtdXN0IGRvLiAqL1xuIDMzNTpcdFx0XHRmdWxsX3BhZ2UgPSBpbmRleCBcdTAwMjYgKHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSk7XG4gMzM2Olx0XHRcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXG4gMzM3Olx0XHRcdFx0ZW5kX2luZGV4IC0gKGluZGV4IFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcbiAzMzg6XHRcdFx0aW5kZXggLT0gZnVsbF9wYWdlO1xuIDMzOTpcdFx0fSBlbHNlIHtcbiAzNDA6XHRcdFx0ZnVsbF9wYWdlID0gMDtcbiAzNDE6XHRcdFx0cGNvdW50ID0gMTtcbiAzNDI6XHRcdH1cbiAzNDM6XHRcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuIDM0NDpcdFx0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbiAzNDU6XHRcdGlmICghZm9saW9zKSB7XG4gMzQ2Olx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gMzQ3Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDM0ODpcdFx0fVxuIDM0OTpcdFx0Zm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbztcbiAzNTA6XHRcbiAzNTE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzssIGluZGV4JiM0MzsmIzQzOykge1xuIDM1MjpcdFx0XHRpZiAoaSA9PSBmdWxsX3BhZ2UpXG4gMzUzOlx0XHRcdFx0Y29udGludWU7XG4gMzU0Olx0XHRcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXG4gMzU1Olx0XHRcdFx0XHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXG4gMzU2Olx0XHRcdFx0XHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcbiAzNTc6XHRcdFx0aWYgKElTX0VSUihmb2xpb3NbaV0pKVxuIDM1ODpcdFx0XHRcdGZvbGlvc1tpXSA9IE5VTEw7XG4gMzU5Olx0XHR9XG4gMzYwOlx0XG4gMzYxOlx0XHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG4gMzYyOlx0XG4gMzYzOlx0XHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cbiAzNjQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiAzNjU6XHRcdFx0aWYgKGZvbGlvc1tpXSkge1xuIDM2NjpcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xuIDM2NzpcdFx0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIDM2ODpcdFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbiAzNjk6XHRcdFx0XHRcdGZvbGlvX3B1dChmb2xpb3NbaV0pO1xuIDM3MDpcdFx0XHR9XG4gMzcxOlx0XHR9XG4gMzcyOlx0XG4gMzczOlx0XHQvKiBBdCB0aGlzIHBvaW50LCBlcnIgY29udGFpbnMgMCBvciAtRUlPIGRlcGVuZGluZyBvbiB0aGUgXCYjMzQ7Y3JpdGljYWxcJiMzNDsgcGFnZSAqL1xuIDM3NDpcdFx0a2ZyZWUoZm9saW9zKTtcbiAzNzU6XHRcdHJldHVybiBlcnI7XG4gMzc2Olx0fVxuIDM3NzpcdFxuIDM3ODpcdGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XG4gMzc5Olx0XHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxuIDM4MDpcdFx0LyogTm8gYm1hcCBvcGVyYXRpb24gc3VwcG9ydGVkICovXG4gMzgxOlx0fTtcbiAzODI6XHRcbiAzODM6XHRpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpXG4gMzg0Olx0e1xuIDM4NTpcdFx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcbiAzODY6XHRcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXG4gMzg3Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDM4ODpcdFxuIDM4OTpcdFx0cmV0dXJuIDA7XG4gMzkwOlx0fVxuIDM5MTpcdFxuIDM5MjpcdHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcbiAzOTM6XHR7XG4gMzk0Olx0XHR2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpO1xuIDM5NTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjkKCQkJCQkJCW91dHB1dDogMjAyCgkJCQkJCQl0aG91Z2h0czogOTAwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgaXNvZnMgUGF0Y2g6IEZvbGlvIE1pZ3JhdGlvbiBhbmQgS01TQU4gQXNzZXNzbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggY29udmVydGluZyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSB1c2luZyBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbGwgdGhlIG51YW5jZXMgb2YgdGhpcyBtaWdyYXRpb24gYW5kLCBjcml0aWNhbGx5LCBhc3Nlc3MgYW55IHBvdGVudGlhbCBLTVNBTiBpbXBsaWNhdGlvbnMuCgpJIHNlZSB0aGV5JiMzOTtyZSByZXBsYWNpbmcgdGhlIGBzdHJ1Y3QgcGFnZSAqKnBhZ2VzYCBhcmd1bWVudCB3aXRoIGBzdHJ1Y3QgZm9saW8gKipmb2xpb3NgIGluIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIEEgcXVpY2sgc2NhbiBzaG93cyB0aGUgZXhwZWN0ZWQgY29ycmVzcG9uZGluZyBjaGFuZ2VzOiB1c2luZyBgZm9saW9femVyb19yYW5nZWAgaW5zdGVhZCBvZiBgbWVtemVyb19wYWdlYCwgYGZvbGlvX21hcmtfdXB0b2RhdGVgIGluc3RlYWQgb2YgYFNldFBhZ2VVcHRvZGF0ZWAsIGBrbWFwX2xvY2FsX2ZvbGlvYCBmb3IgYGttYXBfbG9jYWxfcGFnZWAsIGFkanVzdGluZyBgc3RyZWFtLmF2YWlsX291dGAgdG8gcmVmbGVjdCBmb2xpbyBzaXplcywgYW5kIGBmbHVzaF9kY2FjaGVfZm9saW9gIGluc3RlYWQgb2YgYGZsdXNoX2RjYWNoZV9wYWdlYC4gSXQmIzM5O3MgYWxsIHZlcnkgbWV0aG9kaWNhbCwgd2hpY2ggaXMgZ29vZCB0byBzZWUuCgpTaW1pbGFybHksIGB6aXNvZnNfZmlsbF9wYWdlc2AgZ2V0cyB0aGUgZm9saW8gdHJlYXRtZW50LCBzd2FwcGluZyBgcGFnZV9vZmZzZXRgIGZvciBgZm9saW9fcG9zYCwgYW5kIHVwZGF0aW5nIHRoZSB6ZXJvaW5nIGFuZCB1cHRvZGF0ZSBtYXJraW5ncy4KCkluIGB6aXNvZnNfcmVhZF9mb2xpb2AsIHRoZSBgcGFnZXNgIGFycmF5IGFsbG9jYXRpb24gaXMgcmVwbGFjZWQgd2l0aCBga3phbGxvY19vYmpzYCwgd2hpY2ggaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBzYWZldHkuIFRoZSBgZ3JhYl9jYWNoZV9wYWdlX25vd2FpdGAgY2FsbCBpcyByZXBsYWNlZCB3aXRoIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYC4gVGhleSYjMzk7cmUgYWxzbyBtYWtpbmcgc3VyZSB0byBoYW5kbGUgdGhlIGBJU19FUlJgIGNhc2UsIHNldHRpbmcgdGhlIGZvbGlvIHRvIGBOVUxMYCBvbiBmYWlsdXJlLCB3aGljaCBpcyByZXNwb25zaWJsZS4gVGhlIGNsZWFudXAgbG9naWMgYXQgdGhlIGVuZCBpcyBhbHNvIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9saW8gcGFyYWRpZ20sIHVzaW5nIGBmbHVzaF9kY2FjaGVfZm9saW9gLCBgZm9saW9fdW5sb2NrYCwgYW5kIGBmb2xpb19wdXRgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSBuZXcgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2U/IExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKKiAgIFRoZSBgZm9saW9zYCBhcnJheSBpdHNlbGYgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29ianNgLCBzbyB0aGF0JiMzOTtzIGluaXRpYWxpemVkIHRvIHplcm8gcmlnaHQgb2ZmIHRoZSBiYXQuCiogICBUaGUgZm9saW9zIHRoZW1zZWx2ZXMgYXJlICpwYWdlIGNhY2hlIGZvbGlvcyosIGFuZCB0aGUgZGF0YSBpcyBlaXRoZXIgcG9wdWxhdGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIChmcm9tIHRoZSB6bGliIHN0cmVhbSkgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAuIElmIHpsaWIgZG9lc24mIzM5O3QgZmlsbCB0aGUgZm9saW8sIHRoZW4gYGZvbGlvX3plcm9fcmFuZ2VgIG1ha2VzIHN1cmUgb2YgaXQuCiogICBFcnJvciBwYXRocyAqZG9uJiMzOTt0KiBtYXJrIGZvbGlvcyBhcyB1cHRvZGF0ZSwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCiogICBOb3RoaW5nIGhlcmUgaXMgY29weWluZyBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIHRvIHVzZXJzcGFjZSwgd2hpY2ggaXMgYSBtYWpvciB3aW4uCiogICBUaGVyZSBhcmVuJiMzOTt0IGFueSB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMgb3IgcGFkZGluZyBhdCBwbGF5LgoqICAgSSBkb24mIzM5O3Qgc2VlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB1c2VkIGluIGJyYW5jaGluZyBsb2dpYy4KCk9rYXksIGxldCYjMzk7cyBjb25jcmV0ZWx5IGFzc2VzcyB3aGV0aGVyIHRoaXMgY2hhbmdlIGludHJvZHVjZXMgYW55ICpLTVNBTi1zcGVjaWZpYyogcmlza3M6IEkmIzM5O20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHdvdWxkIHNsaXAgYnkgYSBzdGFuZGFyZCBjb2RlIHJldmlldy4gVGhpcyBsb29rcyBzYWZlLiBUaGUgc29ydHMgb2YgYnVncyBpbnRyb2R1Y2VkIHdvdWxkIGJlIHBhZ2UgY2FjaGUgb3IgZm9saW8gcmVmZXJlbmNlIGNvdW50aW5nIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1ZSB0byBpbmNvcnJlY3Qgc2l6ZXMsIHdoaWNoIG90aGVyIHRvb2xzIGxpa2UgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgcGFnZSBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUgc2hvdWxkIGNhdGNoLgoKTGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBmb3VyIEtNU0FOIGNyaXRlcmlhOgoKMS4gIE5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBzZW50IHRvIHVzZXJzcGFjZSB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuCjIuICBUaGVyZSYjMzk7cyBubyBjb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcy4KMy4gIFRoZXJlJiMzOTtzIG5vIGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlci4KNC4gIFRoZXJlIGFyZW4mIzM5O3QgYW55IGJvdW5kcyBjaGVja3Mgb3IgbG9naWMgdGhhdCB3b3VsZCBhbGxvdyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLgoKQWxyaWdodCwgSSYjMzk7bSByZWFkeSB0byBwcmVwYXJlIHRoZSB0b29sIGNhbGwgdG8gYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTk6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxuXG5UaGUgYXJyYXkgaG9sZGluZyBmb2xpbyBwb2ludGVycyBpcyB6ZXJvLWFsbG9jYXRlZCB2aWEgYGt6YWxsb2Nfb2Jqc2AsIGFuZCBmb2xpbyBjb250ZW50cyBhcmUgZWl0aGVyIHVuY29tcHJlc3NlZCBieSB6bGliIG9yIHplcm9lZCB2aWEgYGZvbGlvX3plcm9fcmFuZ2VgIGJlZm9yZSBiZWluZyBtYXJrZWQgdXB0b2RhdGUuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaW5mby1sZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBicmFuY2hlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGZvbGlvIHJlZmVyZW5jZSBjb3VudHMsIGxvY2tzLCBvciBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOL0xPQ0tERVAvcGFnZSBkZWJ1Z2dpbmcgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxuXG5UaGUgYXJyYXkgaG9sZGluZyBmb2xpbyBwb2ludGVycyBpcyB6ZXJvLWFsbG9jYXRlZCB2aWEgYGt6YWxsb2Nfb2Jqc2AsIGFuZCBmb2xpbyBjb250ZW50cyBhcmUgZWl0aGVyIHVuY29tcHJlc3NlZCBieSB6bGliIG9yIHplcm9lZCB2aWEgYGZvbGlvX3plcm9fcmFuZ2VgIGJlZm9yZSBiZWluZyBtYXJrZWQgdXB0b2RhdGUuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaW5mby1sZWFrcyB0byB1c2VyIHNwYWNlLCBvciB1bmluaXRpYWxpemVkIG1lbW9yeSBicmFuY2hlcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGZvbGlvIHJlZmVyZW5jZSBjb3VudHMsIGxvY2tzLCBvciBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIHNjb3BlIG9mIEtBU0FOL0xPQ0tERVAvcGFnZSBkZWJ1Z2dpbmcgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTozMS41ODI3OTI1NDJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Njc3OTEwOTE3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJU085NjYwX0ZTXCIsXG4gICAgXCJaSVNPRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6aXNvZnNfcmVhZF9mb2xpb1wiLFxuICAgIFwiemlzb2ZzX2ZpbGxfcGFnZXNcIixcbiAgICBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSBgc3RydWN0IHBhZ2VgIEFQSXMgdG8gYHN0cnVjdCBmb2xpb2AgQVBJcyAodXNpbmcgYGttYXBfbG9jYWxfZm9saW9gLCBgZm9saW9femVyb19yYW5nZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCwgYF9fZmlsZW1hcF9nZXRfZm9saW9gLCBldGMuKS4gXFxuXFxuVGhlIGFycmF5IGhvbGRpbmcgZm9saW8gcG9pbnRlcnMgaXMgemVyby1hbGxvY2F0ZWQgdmlhIGBremFsbG9jX29ianNgLCBhbmQgZm9saW8gY29udGVudHMgYXJlIGVpdGhlciB1bmNvbXByZXNzZWQgYnkgemxpYiBvciB6ZXJvZWQgdmlhIGBmb2xpb196ZXJvX3JhbmdlYCBiZWZvcmUgYmVpbmcgbWFya2VkIHVwdG9kYXRlLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGluZm8tbGVha3MgdG8gdXNlciBzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgYnJhbmNoZXMgaW50cm9kdWNlZCBvciBtb2RpZmllZC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBmb2xpbyByZWZlcmVuY2UgY291bnRzLCBsb2Nrcywgb3Igb2Zmc2V0cyBhcmUgd2l0aGluIHRoZSBzY29wZSBvZiBLQVNBTi9MT0NLREVQL3BhZ2UgZGVidWdnaW5nIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6MzEuNTgyNzk2ODIyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTcxMTYyMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvaXNvZnMvY29tcHJlc3MuYyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG5pbmRleCBmOTg2OWQ2MmI4NTA5Li4yZDIzYWJhZWI4NzQyIDEwMDY0NFxcbi0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG4rKysgYi9mcy9pc29mcy9jb21wcmVzcy5jXFxuQEAgLTM5LDcgKzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gICovXFxuIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxcbiBcXHRcXHRcXHRcXHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxcbi1cXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiBcXHRcXHRcXHRcXHQgICAgICBpbnQgKmVycnApXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbkBAIC02NiwxMSArNjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuIFxcdGlmIChibG9ja19zaXplID09IDApIHtcXG4gXFx0XFx0Zm9yICggaSA9IDAgOyBpIFxcdTAwM2MgcGNvdW50IDsgaSsrICkge1xcbiBcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbitcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2ldO1xcbiBcXG4tXFx0XFx0XFx0aWYgKCFwYWdlc1tpXSlcXG4rXFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gXFx0XFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdFxcdG1lbXplcm9fcGFnZShwYWdlc1tpXSwgb2ZmLCBQQUdFX1NJWkUgLSBvZmYpO1xcbi1cXHRcXHRcXHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xcbitcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcXG4rXFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0cmV0dXJuICgoKGxvZmZfdClwY291bnQpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpIC0gcG9mZnNldDtcXG4gXFx0fVxcbkBAIC0xMTksMTEgKzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gXFxuIFxcdHdoaWxlIChjdXJwYWdlIFxcdTAwM2MgcGNvdW50IFxcdTAwMjZcXHUwMDI2IGN1cmJoIFxcdTAwM2MgaGF2ZWJsb2NrcyBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcXG4rXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcXG4rXFxuIFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xcbi1cXHRcXHRcXHRpZiAocGFnZXNbY3VycGFnZV0pIHtcXG4tXFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHQrIHBvZmZzZXQ7XFxuLVxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0O1xcbitcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4rXFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XFxuK1xcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XFxuIFxcdFxcdFxcdFxcdHBvZmZzZXQgPSAwO1xcbiBcXHRcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKVxcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xcbkBAIC0xNzMsOSArMTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuIFxcbiBcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gXFx0XFx0XFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xcbi1cXHRcXHRcXHRpZiAocGFnZXNbY3VycGFnZV0pIHtcXG4tXFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pO1xcbi1cXHRcXHRcXHRcXHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbY3VycGFnZV0pO1xcbitcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4rXFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcXG4rXFx0XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG4gXFx0XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuQEAgLTIwNiw3ICsyMDgsNyBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxcbiAgKi9cXG4gc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbi1cXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbiB7XFxuIFxcdGxvZmZfdCBzdGFydF9vZmYsIGVuZF9vZmY7XFxuIFxcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xcbkBAIC0yMjEsMTQgKzIyMywxNCBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdGludCBlcnI7XFxuIFxcdGxvZmZfdCByZXQ7XFxuIFxcbi1cXHRCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pO1xcbitcXHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cXG4gXFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xcbiBcXHQgKiBwYWdlcyB3aXRoIHRoZSBkYXRhIHdlIGhhdmUgYW55d2F5Li4uXFxuIFxcdCAqL1xcbi1cXHRzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTtcXG4rXFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gXFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cXHUwMDNlaV9zaXplKTtcXG4gXFxuIFxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuQEAgLTI2Nyw5ICsyNjksOSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdFxcdH1cXG4gXFx0XFx0ZXJyID0gMDtcXG4gXFx0XFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgIHBjb3VudCwgcGFnZXMsIHBvZmZzZXQsIFxcdTAwMjZlcnIpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuIFxcdFxcdHBvZmZzZXQgKz0gcmV0O1xcbi1cXHRcXHRwYWdlcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGZvbGlvcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdHBjb3VudCAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIFxcdFxcdHBvZmZzZXQgXFx1MDAyNj0gflBBR0VfTUFTSztcXG5AQCAtMjg5LDkgKzI5MSwxMSBAQCBzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuIFxcdFxcdGNzdGFydF9ibG9jaysrO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqcGFnZXMpIHtcXG4tXFx0XFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XFxuLVxcdFxcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xcbitcXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqZm9saW9zKSB7XFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xcbitcXG4rXFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcXG4rXFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIFxcdH1cXG4gXFx0YnJlbHNlKGJoKTtcXG4gXFx0cmV0dXJuIDA7XFxuQEAgLTMxMiw3ICszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxcbiBcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuIFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX1NISUZUKSkgOiAwO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XFxuIFxcdHBnb2ZmX3QgaW5kZXggPSBmb2xpby1cXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcXG4gXFxuIFxcdGVuZF9pbmRleCA9IChpbm9kZS1cXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG5AQCAtMzM2LDMzICszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0ZnVsbF9wYWdlID0gMDtcXG4gXFx0XFx0cGNvdW50ID0gMTtcXG4gXFx0fVxcbi1cXHRwYWdlcyA9IGt6YWxsb2Nfb2JqcygqcGFnZXMsXFxuLVxcdFxcdFxcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xcbi1cXHRpZiAoIXBhZ2VzKSB7XFxuK1xcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbitcXHRcXHRcXHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XFxuK1xcdGlmICghZm9saW9zKSB7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXHR9XFxuLVxcdHBhZ2VzW2Z1bGxfcGFnZV0gPSBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2U7XFxuK1xcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcGNvdW50OyBpKyssIGluZGV4KyspIHtcXG4tXFx0XFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxcbi1cXHRcXHRcXHRwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgaW5kZXgpO1xcbitcXHRcXHRpZiAoaSA9PSBmdWxsX3BhZ2UpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxcbitcXHRcXHRcXHRcXHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXFxuK1xcdFxcdFxcdFxcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXFxuK1xcdFxcdFxcdGZvbGlvc1tpXSA9IE5VTEw7XFxuIFxcdH1cXG4gXFxuLVxcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgcGFnZXMpO1xcbitcXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XFxuIFxcbi1cXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqL1xcbitcXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBmb2xpb3MsIGRvIG5vdCBtYXJrIHRoZW0gdXB0b2RhdGUgKi9cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrKSB7XFxuLVxcdFxcdGlmIChwYWdlc1tpXSkge1xcbi1cXHRcXHRcXHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7XFxuLVxcdFxcdFxcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcXG4rXFx0XFx0aWYgKGZvbGlvc1tpXSkge1xcbitcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW9zW2ldKTtcXG4rXFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XFxuIFxcdFxcdFxcdGlmIChpICE9IGZ1bGxfcGFnZSlcXG4tXFx0XFx0XFx0XFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xcbitcXHRcXHRcXHRcXHRmb2xpb19wdXQoZm9saW9zW2ldKTtcXG4gXFx0XFx0fVxcbi1cXHR9XFx0XFx0XFx0XFxuK1xcdH1cXG4gXFxuIFxcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcXFwiY3JpdGljYWxcXFwiIHBhZ2UgKi9cXG4tXFx0a2ZyZWUocGFnZXMpO1xcbitcXHRrZnJlZShmb2xpb3MpO1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTozMi4xMDA2MTQ2NDRaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjM5NzE5ODUyODIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklTTzk2NjBfRlNcIixcbiAgICBcIlpJU09GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInppc29mc19yZWFkX2ZvbGlvXCIsXG4gICAgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLFxuICAgIFwiemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNTAzMWY2OTc1ZDNlMzVkOGMyNjQ4MThiZTg1MTM5ZTExMjNiOTBiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAxOToyNTozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMgYi9mcy9pc29mcy9jb21wcmVzcy5jXG5pbmRleCBmOTg2OWQ2MmI4NTA5Li4yZDIzYWJhZWI4NzQyIDEwMDY0NFxuLS0tIGEvZnMvaXNvZnMvY29tcHJlc3MuY1xuKysrIGIvZnMvaXNvZnMvY29tcHJlc3MuY1xuQEAgLTM5LDcgKzM5LDcgQEAgc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcbiAgKi9cbiBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcdFx0XHRcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwb2Zmc2V0LFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zLCB1bnNpZ25lZCBpbnQgcG9mZnNldCxcbiBcdFx0XHRcdCAgICAgIGludCAqZXJycClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcbkBAIC02NiwxMSArNjYsMTIgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XG4gXHRcdGZvciAoIGkgPSAwIDsgaSBcdTAwM2MgcGNvdW50IDsgaSsrICkge1xuIFx0XHRcdHVuc2lnbmVkIGludCBvZmYgPSBpID8gMCA6IHBvZmZzZXQ7XG4rXHRcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcbiBcbi1cdFx0XHRpZiAoIXBhZ2VzW2ldKVxuK1x0XHRcdGlmICghZm9saW8pXG4gXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRtZW16ZXJvX3BhZ2UocGFnZXNbaV0sIG9mZiwgUEFHRV9TSVpFIC0gb2ZmKTtcbi1cdFx0XHRTZXRQYWdlVXB0b2RhdGUocGFnZXNbaV0pO1xuK1x0XHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIG9mZiwgZm9saW9fc2l6ZShmb2xpbykgLSBvZmYpO1xuK1x0XHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIFx0XHR9XG4gXHRcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCkgLSBwb2Zmc2V0O1xuIFx0fVxuQEAgLTExOSwxMSArMTIwLDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFxuIFx0d2hpbGUgKGN1cnBhZ2UgXHUwMDNjIHBjb3VudCBcdTAwMjZcdTAwMjYgY3VyYmggXHUwMDNjIGhhdmVibG9ja3MgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHtcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcbitcbiBcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4tXHRcdFx0aWYgKHBhZ2VzW2N1cnBhZ2VdKSB7XG4tXHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX3BhZ2UocGFnZXNbY3VycGFnZV0pXG4tXHRcdFx0XHRcdFx0KyBwb2Zmc2V0O1xuLVx0XHRcdFx0c3RyZWFtLmF2YWlsX291dCA9IFBBR0VfU0laRSAtIHBvZmZzZXQ7XG4rXHRcdFx0aWYgKGZvbGlvKSB7XG4rXHRcdFx0XHRzdHJlYW0ubmV4dF9vdXQgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCBwb2Zmc2V0KTtcbitcdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQ7XG4gXHRcdFx0XHRwb2Zmc2V0ID0gMDtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xuQEAgLTE3Myw5ICsxNzUsOSBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcbiBcdFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XG4gXHRcdFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xuLVx0XHRcdGlmIChwYWdlc1tjdXJwYWdlXSkge1xuLVx0XHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pO1xuLVx0XHRcdFx0U2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2N1cnBhZ2VdKTtcbitcdFx0XHRpZiAoZm9saW8pIHtcbitcdFx0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpbyk7XG4rXHRcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdFx0XHR9XG4gXHRcdFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcbiBcdFx0XHRcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xuQEAgLTIwNiw3ICsyMDgsNyBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiAgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uXG4gICovXG4gc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuLVx0XHRcdCAgICAgc3RydWN0IHBhZ2UgKipwYWdlcylcbitcdFx0XHQgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcylcbiB7XG4gXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xuIFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XG5AQCAtMjIxLDE0ICsyMjMsMTQgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0aW50IGVycjtcbiBcdGxvZmZfdCByZXQ7XG4gXG4tXHRCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pO1xuK1x0QlVHX09OKCFmb2xpb3NbZnVsbF9wYWdlXSk7XG4gXG4gXHQvKlxuIFx0ICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICdmdWxsX3BhZ2UnIHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xuIFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xuIFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxuIFx0ICovXG4tXHRzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTtcbitcdHN0YXJ0X29mZiA9IGZvbGlvX3Bvcyhmb2xpb3NbZnVsbF9wYWdlXSk7XG4gXHRlbmRfb2ZmID0gbWluX3QobG9mZl90LCBzdGFydF9vZmYgKyBQQUdFX1NJWkUsIGlub2RlLVx1MDAzZWlfc2l6ZSk7XG4gXG4gXHRjc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgXHUwMDNlXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcbkBAIC0yNjcsOSArMjY5LDkgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0XHR9XG4gXHRcdGVyciA9IDA7XG4gXHRcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxuLVx0XHRcdFx0XHQgICAgICBwY291bnQsIHBhZ2VzLCBwb2Zmc2V0LCBcdTAwMjZlcnIpO1xuK1x0XHRcdFx0XHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbiBcdFx0cG9mZnNldCArPSByZXQ7XG4tXHRcdHBhZ2VzICs9IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRcdGZvbGlvcyArPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwY291bnQgLT0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHBvZmZzZXQgXHUwMDI2PSB+UEFHRV9NQVNLO1xuQEAgLTI4OSw5ICsyOTEsMTEgQEAgc3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxuIFx0XHRjc3RhcnRfYmxvY2srKztcbiBcdH1cbiBcbi1cdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqcGFnZXMpIHtcbi1cdFx0bWVtemVyb19wYWdlKCpwYWdlcywgcG9mZnNldCwgUEFHRV9TSVpFIC0gcG9mZnNldCk7XG4tXHRcdFNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpO1xuK1x0aWYgKHBvZmZzZXQgXHUwMDI2XHUwMDI2ICpmb2xpb3MpIHtcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9ICpmb2xpb3M7XG4rXG4rXHRcdGZvbGlvX3plcm9fcmFuZ2UoZm9saW8sIHBvZmZzZXQsIGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldCk7XG4rXHRcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuIFx0fVxuIFx0YnJlbHNlKGJoKTtcbiBcdHJldHVybiAwO1xuQEAgLTMxMiw3ICszMTYsNyBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cbiBcdFx0UEFHRV9TSElGVCBcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XG4gXHRcdCgxIFx1MDAzY1x1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcbi1cdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4rXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XG4gXHRwZ29mZl90IGluZGV4ID0gZm9saW8tXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcbiBcbiBcdGVuZF9pbmRleCA9IChpbm9kZS1cdTAwM2VpX3NpemUgKyBQQUdFX1NJWkUgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbkBAIC0zMzYsMzMgKzM0MCwzOCBAQCBzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRmdWxsX3BhZ2UgPSAwO1xuIFx0XHRwY291bnQgPSAxO1xuIFx0fVxuLVx0cGFnZXMgPSBremFsbG9jX29ianMoKnBhZ2VzLFxuLVx0XHRcdCAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuLVx0aWYgKCFwYWdlcykge1xuK1x0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXG4rXHRcdFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xuK1x0aWYgKCFmb2xpb3MpIHtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRwYWdlc1tmdWxsX3BhZ2VdID0gXHUwMDI2Zm9saW8tXHUwMDNlcGFnZTtcbitcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwY291bnQ7IGkrKywgaW5kZXgrKykge1xuLVx0XHRpZiAoaSAhPSBmdWxsX3BhZ2UpXG4tXHRcdFx0cGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIGluZGV4KTtcbitcdFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxuK1x0XHRcdFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxuK1x0XHRcdFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XG4rXHRcdGlmIChJU19FUlIoZm9saW9zW2ldKSlcbitcdFx0XHRmb2xpb3NbaV0gPSBOVUxMO1xuIFx0fVxuIFxuLVx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7XG4rXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XG4gXG4tXHQvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqL1xuK1x0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwY291bnQ7IGkrKykge1xuLVx0XHRpZiAocGFnZXNbaV0pIHtcbi1cdFx0XHRmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7XG4tXHRcdFx0dW5sb2NrX3BhZ2UocGFnZXNbaV0pO1xuK1x0XHRpZiAoZm9saW9zW2ldKSB7XG4rXHRcdFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvc1tpXSk7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XG4gXHRcdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuLVx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuK1x0XHRcdFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XG4gXHRcdH1cbi1cdH1cdFx0XHRcbitcdH1cbiBcbiBcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcImNyaXRpY2FsXCIgcGFnZSAqL1xuLVx0a2ZyZWUocGFnZXMpO1xuK1x0a2ZyZWUoZm9saW9zKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6MzIuMTAwNjE2MjM0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTM2MTQ4ODk5MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBMaW51eCBLZXJuZWwgUGF0Y2ggRXZhbHVhdGlvbiBSZXF1ZXN0KipcblxuT2theSwgc28gSSd2ZSBnb3QgYSByZXF1ZXN0IGhlcmUgdG8gZXZhbHVhdGUgYSBwYXRjaCBzZXJpZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwsIHNwZWNpZmljYWxseSB3aXRoaW4gYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBNeSBmaXJzdCBwcmlvcml0eSBpcyBhbHdheXMgc2FmZXR5LCBzbyBJJ20gaW1tZWRpYXRlbHkgcnVubmluZyBhIHF1aWNrIHJpc2sgYXNzZXNzbWVudC4gQmFzZWQgb24gdGhlIHVzZXIncyBmcmFtaW5nLCB0aGlzIGFwcGVhcnMgdG8gYmUgYSBzdGFuZGFyZCByZXF1ZXN0IOKAkyBjb2RlIHJldmlldywgc2VjdXJpdHkgUUEsIHR5cGljYWwgTGludXgga2VybmVsIG1haW50YWluZXIgYW5hbHlzaXMuIE5vIHJlZCBmbGFncyBzbyBmYXIuIFRoaXMgZmVlbHMgbGlrZSBhIGJlbmlnbiBRQSBvciBwYXRjaCBhbmFseXNpcyB0YXNrLiBNeSBqb2IgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNoYW5nZXMgYWN0dWFsbHkgbW9kaWZ5IHJlYWNoYWJsZSBjb2RlIHRoYXQncyB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFuZCBwb3RlbnRpYWwgZm9jdXMgc3ltYm9scyB0byBndWlkZSBteSBhbmFseXNpcy5cblxuTm93LCBsZXQncyBkaXZlIGludG8gdGhlIHNwZWNpZmljcy4gSSdsbCBzdGFydCBieSBleGFtaW5pbmcgdGhlIGNvZGUgaW4gYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGl0c2VsZi4gSSBuZWVkIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGF0IHdpdGggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMuIEknbGwgY2hlY2sgYm90aCBgZnMvaXNvZnMvS2NvbmZpZ2AgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBtb3JlIGdlbmVyYWwgYGZzL0tjb25maWdgIHRvIHVuZGVyc3RhbmQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY29udHJvbCB0aGUgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGNvZGUgaXMgYWN0dWFsbHkgdXNlZCBpbiBhIGZ1enphYmxlIGVudmlyb25tZW50LiBJJ20gcmVhZHkgdG8gYmVnaW4gdGhlIGRlZXAgZGl2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTAyMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ1LjcxNTUwODAzOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODIxMTU1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpc29mc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9pc29mc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJcXG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDkzOCBsaW5lcy5cXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXFxuXFxuZnMvaXNvZnMvS2NvbmZpZz0yPWNvbmZpZyBJU085NjYwX0ZTXFxuLS1cXG5mcy9pc29mcy9LY29uZmlnLTExLVxcdCAganVzdCBsaXN0ZW4gdG8gYXVkaW8gQ0RzIGFuZCB3YXRjaCBpdHMgTEVEcywgc2F5IFkgKGFuZCByZWFkXFxuZnMvaXNvZnMvS2NvbmZpZzoxMjpcXHQgIFxcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMucnN0XFx1MDAzZSBhbmQgdGhlIENELVJPTS1IT1dUTyxcXG5mcy9pc29mcy9LY29uZmlnLTEzLVxcdCAgYXZhaWxhYmxlIGZyb20gXFx1MDAzY2h0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvXFx1MDAzZSksIHRoZXJlYnlcXG4tLVxcbmZzL2lzb2ZzL0tjb25maWctMTYtXFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXFxuZnMvaXNvZnMvS2NvbmZpZzoxNzpcXHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cXG5mcy9pc29mcy9LY29uZmlnLTE4LVxcbi0tXFxuZnMvaXNvZnMvS2NvbmZpZz0zMT1jb25maWcgWklTT0ZTXFxuLS1cXG5mcy9pc29mcy9LY29uZmlnLTM4LVxcdCAgZGVjb21wcmVzc2VkIHdoZW4gdGhlIENELVJPTSBpcyBhY2Nlc3NlZC4gIFNlZVxcbmZzL2lzb2ZzL0tjb25maWc6Mzk6XFx0ICBcXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXFx1MDAzZSBmb3IgdGhlIHRvb2xzXFxuZnMvaXNvZnMvS2NvbmZpZy00MC1cXHQgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlXFxuLS1cXG5mcy9pc29mcy9NYWtlZmlsZS0yLSNcXG5mcy9pc29mcy9NYWtlZmlsZTozOiMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBpc29mcyBmaWxlc3lzdGVtIHJvdXRpbmVzLlxcbmZzL2lzb2ZzL01ha2VmaWxlLTQtI1xcbmZzL2lzb2ZzL01ha2VmaWxlLTUtXFxuZnMvaXNvZnMvTWFrZWZpbGU6NjpvYmotJChDT05GSUdfSVNPOTY2MF9GUykgKz0gaXNvZnMub1xcbmZzL2lzb2ZzL01ha2VmaWxlLTctXFxuZnMvaXNvZnMvTWFrZWZpbGU6ODppc29mcy15IFxcdFxcdDo9IG5hbWVpLm8gaW5vZGUubyBkaXIubyB1dGlsLm8gcm9jay5vIGV4cG9ydC5vXFxuZnMvaXNvZnMvTWFrZWZpbGU6OTppc29mcy0kKENPTkZJR19KT0xJRVQpXFx0Kz0gam9saWV0Lm9cXG5mcy9pc29mcy9NYWtlZmlsZToxMDppc29mcy0kKENPTkZJR19aSVNPRlMpXFx0Kz0gY29tcHJlc3Mub1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy04LS8qXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo5OiAqIGxpbnV4L2ZzL2lzb2ZzL2NvbXByZXNzLmNcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwLSAqXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIxLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjI6I2luY2x1ZGUgXFxcImlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzojaW5jbHVkZSBcXFwiemlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNC1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2OnN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMyOnN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM2LSAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzc6ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM4LSAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzktICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo0MDpzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTQxLVxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTQ0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjQ1OlxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTQ2LVxcdHVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy02MC1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjYxOlxcdGlmIChibG9ja19zaXplIFxcdTAwM2UgZGVmbGF0ZUJvdW5kKDFVTCBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpKSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy02Mi1cXHRcXHQqZXJycCA9IC1FSU87XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTg1LVxcdH1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjg2OlxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTg3LVxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTA2LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTA3OlxcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMDg6XFx0bXV0ZXhfbG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMDktXFx0XFx0XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTExNS1cXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMTY6XFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInppc29mczogemlzb2ZzX2luZmxhdGVJbml0IHJldHVybmVkICVkXFxcXG5cXFwiLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTE3LVxcdFxcdFxcdCAgICAgICB6ZXJyKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTMwLVxcdFxcdFxcdH0gZWxzZSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMzE6XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEzMi1cXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xNjEtXFx0XFx0XFx0XFx0XFx0cHJpbnRrKEtFUk5fREVCVUdcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE2MjpcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcXFwiXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xNjMtXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCIgJWQsIGlub2RlID0gJWxsdSxcXFwiXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE4MS1cXHRcXHRcXHR9XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxODI6XFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE4My1cXHRcXHRcXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTkyLVxcdHpsaWJfaW5mbGF0ZUVuZChcXHUwMDI2c3RyZWFtKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE5MzpcXHRpZiAoc3RyZWFtLm5leHRfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTQtXFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5Ni16X2VpbzpcXG5mcy9pc29mcy9jb21wcmVzcy5jOjE5NzpcXHRtdXRleF91bmxvY2soXFx1MDAyNnppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk4LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMDktICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTA6c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjExLVxcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTUtXFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMF07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjE3LVxcdHVuc2lnbmVkIGludCBibG9ja3B0cjtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM1LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjM2OlxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzc6XFx0Y2VuZF9ibG9jayA9IChlbmRfb2ZmICsgKDEgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSAtIDEpXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzg6XFx0XFx0XFx0XFx1MDAzZVxcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjM5LVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQwLVxcdFdBUk5fT04oc3RhcnRfb2ZmIC0gKGZ1bGxfcGFnZSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAhPVxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQxOlxcdFxcdCgoY3N0YXJ0X2Jsb2NrIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXFx1MDAyNiBQQUdFX01BU0spKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI0Mi1cXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ2LVxcdGJsb2NrcHRyID0gKGhlYWRlcl9zaXplICsgY3N0YXJ0X2Jsb2NrKSBcXHUwMDNjXFx1MDAzYyAyO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MjQ3OlxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQ4LVxcdGlmICghYmgpXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTI1OS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2MDpcXHRcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9ja3B0ciBcXHUwMDNlXFx1MDAzZSBibGtiaXRzKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI2MS1cXHRcXHRcXHRpZiAoIWJoKVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzAtXFx0XFx0ZXJyID0gMDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjI3MTpcXHRcXHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3Mi1cXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMwOTpzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE0LVxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXFx0XFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNjpcXHRcXHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM3OlxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQzLVxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0OlxcdFxcdFxcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0NS1cXHRpZiAoIWZvbGlvcykge1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XFx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNzg6Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgwLVxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODItXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM4NTpcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2OlxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjM5Mjp2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0OlxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMi0vKlxcbmZzL2lzb2ZzL2Rpci5jOjM6ICogIGxpbnV4L2ZzL2lzb2ZzL2Rpci5jXFxuZnMvaXNvZnMvZGlyLmMtNC0gKlxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMTEtICpcXG5mcy9pc29mcy9kaXIuYzoxMjogKiAgaXNvZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9uc1xcbmZzL2lzb2ZzL2Rpci5jLTEzLSAqL1xcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMTYtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG5mcy9pc29mcy9kaXIuYzoxNzojaW5jbHVkZSBcXFwiaXNvZnMuaFxcXCJcXG5mcy9pc29mcy9kaXIuYy0xOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvZmlsZWF0dHIuaFxcdTAwM2VcXG5mcy9pc29mcy9kaXIuYy0xOS1cXG5mcy9pc29mcy9kaXIuYzoyMDppbnQgaXNvZnNfbmFtZV90cmFuc2xhdGUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwgY2hhciAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2lzb2ZzL2Rpci5jLTIxLXtcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jPTUzPWludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSxcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTU3LVxcdHVuc2lnbmVkIGNoYXIgKmNocjtcXG5mcy9pc29mcy9kaXIuYzo1ODpcXHRpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTtcXG5mcy9pc29mcy9kaXIuYy01OS1cXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTg0LSAqL1xcbmZzL2lzb2ZzL2Rpci5jOjg1OnN0YXRpYyBpbnQgZG9faXNvZnNfcmVhZGRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSxcXG5mcy9pc29mcy9kaXIuYy04Ni1cXHRcXHRzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCxcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTk4LVxcdHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGU7XFxuZnMvaXNvZnMvZGlyLmM6OTk6XFx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGlub2RlLVxcdTAwM2VpX3NiKTtcXG5mcy9pc29mcy9kaXIuYy0xMDAtXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xMDctXFx0XFx0aWYgKCFiaCkge1xcbmZzL2lzb2ZzL2Rpci5jOjEwODpcXHRcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7XFxuZnMvaXNvZnMvZGlyLmMtMTA5LVxcdFxcdFxcdGlmICghYmgpXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xMzUtXFxuZnMvaXNvZnMvZGlyLmM6MTM2OlxcdFxcdGlmICghaXNvZnNfZGlyX3JlY29yZF92YWxpZChkZSwgb2Zmc2V0X3NhdmVkLCBidWZzaXplKSkge1xcbmZzL2lzb2ZzL2Rpci5jLTEzNy1cXHRcXHRcXHRwcmludGsoS0VSTl9OT1RJQ0UgXFxcImlzbzk2NjA6IENvcnJ1cHRlZCBkaXJlY3RvcnkgZW50cnlcXFwiXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0xNDQtXFx0XFx0aWYgKGZpcnN0X2RlKSB7XFxuZnMvaXNvZnMvZGlyLmM6MTQ1OlxcdFxcdFxcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLFxcbmZzL2lzb2ZzL2Rpci5jLTE0Ni1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YmxvY2tfc2F2ZWQsXFxuZnMvaXNvZnMvZGlyLmMtMTQ3LVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZvZmZzZXRfc2F2ZWQpO1xcbmZzL2lzb2ZzL2Rpci5jOjE0ODpcXHRcXHRcXHRpbm9kZV9udW1iZXIgPSBpc29mc19nZXRfaW5vKGJsb2NrX3NhdmVkLFxcbmZzL2lzb2ZzL2Rpci5jLTE0OS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRvZmZzZXRfc2F2ZWQsIGJ1ZmJpdHMpO1xcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMjEwLVxcdFxcdFxcdGlmIChzYmktXFx1MDAzZXNfbWFwcGluZyA9PSAnbicpIHtcXG5mcy9pc29mcy9kaXIuYzoyMTE6XFx0XFx0XFx0XFx0bGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHRtcG5hbWUsIGlub2RlKTtcXG5mcy9pc29mcy9kaXIuYy0yMTItXFx0XFx0XFx0XFx0cCA9IHRtcG5hbWU7XFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yMzEtICogaGFuZGxpbmcgc3BsaXQgZGlyZWN0b3J5IGVudHJpZXMuLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgYnlcXG5mcy9pc29mcy9kaXIuYzoyMzI6ICogXFxcImRvX2lzb2ZzX3JlYWRkaXIoKVxcXCIuXFxuZnMvaXNvZnMvZGlyLmMtMjMzLSAqL1xcbmZzL2lzb2ZzL2Rpci5jOjIzNDpzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbmZzL2lzb2ZzL2Rpci5jLTIzNS17XFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yNDMtXFxuZnMvaXNvZnMvZGlyLmM6MjQ0OlxcdHJlc3VsdCA9IGRvX2lzb2ZzX3JlYWRkaXIoaW5vZGUsIGZpbGUsIGN0eCwgdG1wbmFtZSk7XFxuZnMvaXNvZnMvZGlyLmMtMjQ1LVxcbi0tXFxuZnMvaXNvZnMvZGlyLmMtMjQ5LVxcbmZzL2lzb2ZzL2Rpci5jOjI1MDppbnQgaXNvZnNfZmlsZWF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGZpbGVfa2F0dHIgKmZhKVxcbmZzL2lzb2ZzL2Rpci5jLTI1MS17XFxuZnMvaXNvZnMvZGlyLmM6MjUyOlxcdHN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkZW50cnktXFx1MDAzZWRfc2IpO1xcbmZzL2lzb2ZzL2Rpci5jLTI1My1cXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTI2My1cXG5mcy9pc29mcy9kaXIuYzoyNjQ6Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpc29mc19kaXJfb3BlcmF0aW9ucyA9XFxuZnMvaXNvZnMvZGlyLmMtMjY1LXtcXG4tLVxcbmZzL2lzb2ZzL2Rpci5jLTI2Ny1cXHQucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsXFxuZnMvaXNvZnMvZGlyLmM6MjY4OlxcdC5pdGVyYXRlX3NoYXJlZCA9IGlzb2ZzX3JlYWRkaXIsXFxuZnMvaXNvZnMvZGlyLmMtMjY5LVxcdC5zZXRsZWFzZSA9IGdlbmVyaWNfc2V0bGVhc2UsXFxuLS1cXG5mcy9pc29mcy9kaXIuYy0yNzQtICovXFxuZnMvaXNvZnMvZGlyLmM6Mjc1OmNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID1cXG5mcy9pc29mcy9kaXIuYy0yNzYte1xcbmZzL2lzb2ZzL2Rpci5jOjI3NzpcXHQubG9va3VwID0gaXNvZnNfbG9va3VwLFxcbmZzL2lzb2ZzL2Rpci5jOjI3ODpcXHQuZmlsZWF0dHJfZ2V0ID0gaXNvZnNfZmlsZWF0dHJfZ2V0LFxcbmZzL2lzb2ZzL2Rpci5jLTI3OS19O1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMi0vKlxcbmZzL2lzb2ZzL2V4cG9ydC5jOjM6ICogZnMvaXNvZnMvZXhwb3J0LmNcXG5mcy9pc29mcy9leHBvcnQuYy00LSAqXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xNi1cXG5mcy9pc29mcy9leHBvcnQuYzoxNzojaW5jbHVkZSBcXFwiaXNvZnMuaFxcXCJcXG5mcy9pc29mcy9leHBvcnQuYy0xOC1cXG5mcy9pc29mcy9leHBvcnQuYz0xOT1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXFxuZnMvaXNvZnMvZXhwb3J0LmM6MjA6aXNvZnNfZXhwb3J0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG5mcy9pc29mcy9leHBvcnQuYy0yMS1cXHRcXHQgIHVuc2lnbmVkIGxvbmcgYmxvY2ssXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0yOC1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTtcXG5mcy9pc29mcy9leHBvcnQuYzoyOTpcXHRpbm9kZSA9IGlzb2ZzX2lnZXQoc2IsIGJsb2NrLCBvZmZzZXQpO1xcbmZzL2lzb2ZzL2V4cG9ydC5jLTMwLVxcdGlmIChJU19FUlIoaW5vZGUpKVxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtNDItICogYW5kIHJldHVybiB0aGUgdW5kZXJseWluZyBpbm9kZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yXFxuZnMvaXNvZnMvZXhwb3J0LmM6NDM6ICogaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoKS4gKi9cXG5mcy9pc29mcy9leHBvcnQuYzo0NDpzdGF0aWMgc3RydWN0IGRlbnRyeSAqaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpXFxuZnMvaXNvZnMvZXhwb3J0LmMtNDUte1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtNTUtXFx0aWYgKCFTX0lTRElSKGNoaWxkX2lub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6NTY6XFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJpc29mczogaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQoKTogXFxcIlxcbmZzL2lzb2ZzL2V4cG9ydC5jLTU3LVxcdFxcdCAgICAgICBcXFwiY2hpbGQgaXMgbm90IGEgZGlyZWN0b3J5IVxcXFxuXFxcIik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy02NS1cXHRpZiAoZV9jaGlsZF9pbm9kZS1cXHUwMDNlaV9pZ2V0NV9vZmZzZXQgIT0gMCkge1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjY2OlxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiaXNvZnM6IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KCk6IFxcXCJcXG5mcy9pc29mcy9leHBvcnQuYy02Ny1cXHRcXHQgICAgICAgXFxcImNoaWxkIGRpcmVjdG9yeSBub3Qgbm9ybWFsaXplZCFcXFxcblxcXCIpO1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtODUtXFx0ZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKiliaC1cXHUwMDNlYl9kYXRhO1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjg2OlxcdGlmICghaXNvZnNfZGlyX3JlY29yZF92YWxpZChkZSwgMCwgY2hpbGRfaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKSB8fFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTg3LVxcdCAgICBpc29udW1fNzExKGRlLVxcdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cXHUwMDNlbmFtZVswXSAhPSAwKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6ODg6XFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJpc29mczogVW5hYmxlIHRvIGZpbmQgdGhlIFxcXFxcXFwiLlxcXFxcXFwiIGRpcmVjdG9yeSBmb3IgTkZTLlxcXFxuXFxcIik7XFxuZnMvaXNvZnMvZXhwb3J0LmMtODktXFx0XFx0cnYgPSBFUlJfUFRSKC1FQUNDRVMpO1xcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtOTctXFx0LyogVmVyaWZ5IGl0IGlzIGluIGZhY3QgdGhlIFxcXCIuLlxcXCIgZW50cnkuICovXFxuZnMvaXNvZnMvZXhwb3J0LmM6OTg6XFx0aWYgKCFpc29mc19kaXJfcmVjb3JkX3ZhbGlkKGRlLCBwYXJlbnRfb2Zmc2V0LFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTk5LVxcdFxcdFxcdFxcdCAgICBjaGlsZF9pbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpIHx8XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTAwLVxcdCAgICBpc29udW1fNzExKGRlLVxcdTAwM2VuYW1lX2xlbikgIT0gMSB8fCBkZS1cXHUwMDNlbmFtZVswXSAhPSAxKSB7XFxuZnMvaXNvZnMvZXhwb3J0LmM6MTAxOlxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwiaXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcXFxcXFxcIi4uXFxcXFxcXCIgXFxcIlxcbmZzL2lzb2ZzL2V4cG9ydC5jLTEwMi1cXHRcXHQgICAgICAgXFxcImRpcmVjdG9yeSBmb3IgTkZTLlxcXFxuXFxcIik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xMDctXFx0LyogTm9ybWFsaXplICovXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTA4OlxcdGlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLCBcXHUwMDI2cGFyZW50X2Jsb2NrLCBcXHUwMDI2cGFyZW50X29mZnNldCk7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTA5LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjExMDpcXHRydiA9IGRfb2J0YWluX2FsaWFzKGlzb2ZzX2lnZXQoY2hpbGRfaW5vZGUtXFx1MDAzZWlfc2IsIHBhcmVudF9ibG9jayxcXG5mcy9pc29mcy9leHBvcnQuYy0xMTEtXFx0XFx0XFx0XFx0ICAgICBwYXJlbnRfb2Zmc2V0KSk7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYz0xMTg9c3RhdGljIGludFxcbmZzL2lzb2ZzL2V4cG9ydC5jOjExOTppc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTIwLVxcdFxcdCAgICAgICBfX3UzMiAqZmgzMixcXG4tLVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE2MC1cXG5mcy9pc29mcy9leHBvcnQuYzoxNjE6c3RydWN0IGlzb2ZzX2ZpZCB7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTYyLVxcdHUzMiBibG9jaztcXG4tLVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE2OS1cXG5mcy9pc29mcy9leHBvcnQuYzoxNzA6c3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2ZoX3RvX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3MS1cXHRzdHJ1Y3QgZmlkICpmaWQsIGludCBmaF9sZW4sIGludCBmaF90eXBlKVxcbmZzL2lzb2ZzL2V4cG9ydC5jLTE3Mi17XFxuZnMvaXNvZnMvZXhwb3J0LmM6MTczOlxcdHN0cnVjdCBpc29mc19maWQgKmlmaWQgPSAoc3RydWN0IGlzb2ZzX2ZpZCAqKWZpZDtcXG5mcy9pc29mcy9leHBvcnQuYy0xNzQtXFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xNzctXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTc4OlxcdHJldHVybiBpc29mc19leHBvcnRfaWdldChzYiwgaWZpZC1cXHUwMDNlYmxvY2ssIGlmaWQtXFx1MDAzZW9mZnNldCxcXG5mcy9pc29mcy9leHBvcnQuYy0xNzktXFx0XFx0XFx0aWZpZC1cXHUwMDNlZ2VuZXJhdGlvbik7XFxuLS1cXG5mcy9pc29mcy9leHBvcnQuYy0xODEtXFxuZnMvaXNvZnMvZXhwb3J0LmM6MTgyOnN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppc29mc19maF90b19wYXJlbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG5mcy9pc29mcy9leHBvcnQuYy0xODMtXFx0XFx0c3RydWN0IGZpZCAqZmlkLCBpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSlcXG5mcy9pc29mcy9leHBvcnQuYy0xODQte1xcbmZzL2lzb2ZzL2V4cG9ydC5jOjE4NTpcXHRzdHJ1Y3QgaXNvZnNfZmlkICppZmlkID0gKHN0cnVjdCBpc29mc19maWQgKilmaWQ7XFxuZnMvaXNvZnMvZXhwb3J0LmMtMTg2LVxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTg5LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5MDpcXHRyZXR1cm4gaXNvZnNfZXhwb3J0X2lnZXQoc2IsXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTkxLVxcdFxcdFxcdGZoX2xlbiBcXHUwMDNlIDMgPyBpZmlkLVxcdTAwM2VwYXJlbnRfYmxvY2sgOiAwLFxcbi0tXFxuZnMvaXNvZnMvZXhwb3J0LmMtMTk1LVxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5Njpjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgaXNvZnNfZXhwb3J0X29wcyA9IHtcXG5mcy9pc29mcy9leHBvcnQuYzoxOTc6XFx0LmVuY29kZV9maFxcdD0gaXNvZnNfZXhwb3J0X2VuY29kZV9maCxcXG5mcy9pc29mcy9leHBvcnQuYzoxOTg6XFx0LmZoX3RvX2RlbnRyeVxcdD0gaXNvZnNfZmhfdG9fZGVudHJ5LFxcbmZzL2lzb2ZzL2V4cG9ydC5jOjE5OTpcXHQuZmhfdG9fcGFyZW50XFx0PSBpc29mc19maF90b19wYXJlbnQsXFxuZnMvaXNvZnMvZXhwb3J0LmM6MjAwOlxcdC5nZXRfcGFyZW50ICAgICA9IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50LFxcbmZzL2lzb2ZzL2V4cG9ydC5jLTIwMS19O1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0yLS8qXFxuZnMvaXNvZnMvaW5vZGUuYzozOiAqICBsaW51eC9mcy9pc29mcy9pbm9kZS5jXFxuZnMvaXNvZnMvaW5vZGUuYy00LSAqXFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jLTMwLVxcbmZzL2lzb2ZzL2lub2RlLmM6MzE6I2luY2x1ZGUgXFxcImlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvaW5vZGUuYzozMjojaW5jbHVkZSBcXFwiemlzb2ZzLmhcXFwiXFxuZnMvaXNvZnMvaW5vZGUuYy0zMy1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzgtXFxuZnMvaXNvZnMvaW5vZGUuYzozOTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hpKGNvbnN0IHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpO1xcbmZzL2lzb2ZzL2lub2RlLmM6NDA6c3RhdGljIGludCBpc29mc19kZW50cnlfY21waShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvaXNvZnMvaW5vZGUuYy00MS1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtNDMtI2lmZGVmIENPTkZJR19KT0xJRVRcXG5mcy9pc29mcy9pbm9kZS5jOjQ0OnN0YXRpYyBpbnQgaXNvZnNfaGFzaGlfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XFxuZnMvaXNvZnMvaW5vZGUuYzo0NTpzdGF0aWMgaW50IGlzb2ZzX2hhc2hfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7XFxuZnMvaXNvZnMvaW5vZGUuYzo0NjpzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTQ3LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpO1xcbmZzL2lzb2ZzL2lub2RlLmM6NDg6c3RhdGljIGludCBpc29mc19kZW50cnlfY21wX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTQ5LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpO1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy01MS1cXG5mcy9pc29mcy9pbm9kZS5jOjUyOnN0YXRpYyB2b2lkIGlzb2ZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbmZzL2lzb2ZzL2lub2RlLmMtNTMte1xcbmZzL2lzb2ZzL2lub2RlLmM6NTQ6XFx0c3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKHNiKTtcXG5mcy9pc29mcy9pbm9kZS5jLTU1LVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy02NC1cXG5mcy9pc29mcy9pbm9kZS5jOjY1OnN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50IHJlbG9jYXRlZCk7XFxuZnMvaXNvZnMvaW5vZGUuYzo2NjpzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTtcXG5mcy9pc29mcy9pbm9kZS5jOjY3OnN0YXRpYyBpbnQgaXNvZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICopO1xcbmZzL2lzb2ZzL2lub2RlLmMtNjgtXFxuZnMvaXNvZnMvaW5vZGUuYzo2OTpzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlzb2ZzX2lub2RlX2NhY2hlcDtcXG5mcy9pc29mcy9pbm9kZS5jLTcwLVxcbmZzL2lzb2ZzL2lub2RlLmM6NzE6c3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG5mcy9pc29mcy9pbm9kZS5jLTcyLXtcXG5mcy9pc29mcy9pbm9kZS5jLTczLVxcdHN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWk7XFxuZnMvaXNvZnMvaW5vZGUuYzo3NDpcXHRlaSA9IGFsbG9jX2lub2RlX3NiKHNiLCBpc29mc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpO1xcbmZzL2lzb2ZzL2lub2RlLmMtNzUtXFx0aWYgKCFlaSlcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtNzktXFxuZnMvaXNvZnMvaW5vZGUuYzo4MDpzdGF0aWMgdm9pZCBpc29mc19mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvaXNvZnMvaW5vZGUuYy04MS17XFxuZnMvaXNvZnMvaW5vZGUuYzo4MjpcXHRrbWVtX2NhY2hlX2ZyZWUoaXNvZnNfaW5vZGVfY2FjaGVwLCBJU09GU19JKGlub2RlKSk7XFxuZnMvaXNvZnMvaW5vZGUuYy04My19XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTkyPXN0YXRpYyBpbnQgX19pbml0IGluaXRfaW5vZGVjYWNoZSh2b2lkKVxcbmZzL2lzb2ZzL2lub2RlLmMtOTMte1xcbmZzL2lzb2ZzL2lub2RlLmM6OTQ6XFx0aXNvZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoXFxcImlzb2ZzX2lub2RlX2NhY2hlXFxcIixcXG5mcy9pc29mcy9pbm9kZS5jLTk1LVxcdFxcdFxcdFxcdFxcdHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy05OC1cXHRcXHRcXHRcXHRcXHRpbml0X29uY2UpO1xcbmZzL2lzb2ZzL2lub2RlLmM6OTk6XFx0aWYgKCFpc29mc19pbm9kZV9jYWNoZXApXFxuZnMvaXNvZnMvaW5vZGUuYy0xMDAtXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTEwND1zdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZClcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTEwLVxcdHJjdV9iYXJyaWVyKCk7XFxuZnMvaXNvZnMvaW5vZGUuYzoxMTE6XFx0a21lbV9jYWNoZV9kZXN0cm95KGlzb2ZzX2lub2RlX2NhY2hlcCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xMTItfVxcbmZzL2lzb2ZzL2lub2RlLmMtMTEzLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTE0OnN0YXRpYyBpbnQgaXNvZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbmZzL2lzb2ZzL2lub2RlLmMtMTE1LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTIxLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTIyOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBpc29mc19zb3BzID0ge1xcbmZzL2lzb2ZzL2lub2RlLmM6MTIzOlxcdC5hbGxvY19pbm9kZVxcdD0gaXNvZnNfYWxsb2NfaW5vZGUsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMjQ6XFx0LmZyZWVfaW5vZGVcXHQ9IGlzb2ZzX2ZyZWVfaW5vZGUsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMjU6XFx0LnB1dF9zdXBlclxcdD0gaXNvZnNfcHV0X3N1cGVyLFxcbmZzL2lzb2ZzL2lub2RlLmM6MTI2OlxcdC5zdGF0ZnNcXHRcXHQ9IGlzb2ZzX3N0YXRmcyxcXG5mcy9pc29mcy9pbm9kZS5jOjEyNzpcXHQuc2hvd19vcHRpb25zXFx0PSBpc29mc19zaG93X29wdGlvbnMsXFxuZnMvaXNvZnMvaW5vZGUuYy0xMjgtfTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTMwLVxcbmZzL2lzb2ZzL2lub2RlLmM6MTMxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaXNvZnNfZGVudHJ5X29wc1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMTMyLVxcdHtcXG5mcy9pc29mcy9pbm9kZS5jOjEzMzpcXHRcXHQuZF9oYXNoXFx0XFx0PSBpc29mc19oYXNoaSxcXG5mcy9pc29mcy9pbm9kZS5jOjEzNDpcXHRcXHQuZF9jb21wYXJlXFx0PSBpc29mc19kZW50cnlfY21waSxcXG5mcy9pc29mcy9pbm9kZS5jLTEzNS1cXHR9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xMzctXFx0e1xcbmZzL2lzb2ZzL2lub2RlLmM6MTM4OlxcdFxcdC5kX2hhc2hcXHRcXHQ9IGlzb2ZzX2hhc2hfbXMsXFxuZnMvaXNvZnMvaW5vZGUuYzoxMzk6XFx0XFx0LmRfY29tcGFyZVxcdD0gaXNvZnNfZGVudHJ5X2NtcF9tcyxcXG5mcy9pc29mcy9pbm9kZS5jLTE0MC1cXHR9LFxcbmZzL2lzb2ZzL2lub2RlLmMtMTQxLVxcdHtcXG5mcy9pc29mcy9pbm9kZS5jOjE0MjpcXHRcXHQuZF9oYXNoXFx0XFx0PSBpc29mc19oYXNoaV9tcyxcXG5mcy9pc29mcy9pbm9kZS5jOjE0MzpcXHRcXHQuZF9jb21wYXJlXFx0PSBpc29mc19kZW50cnlfY21waV9tcyxcXG5mcy9pc29mcy9pbm9kZS5jLTE0NC1cXHR9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNDctXFxuZnMvaXNvZnMvaW5vZGUuYzoxNDg6c3RydWN0IGlzb2ZzX29wdGlvbnN7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNDktXFx0dW5zaWduZWQgaW50IHJvY2s6MTtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTcxLS8qXFxuZnMvaXNvZnMvaW5vZGUuYzoxNzI6ICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIGlzb2ZzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVudHJ5LlxcbmZzL2lzb2ZzL2lub2RlLmMtMTczLSAqL1xcbmZzL2lzb2ZzL2lub2RlLmM9MTc0PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjE3NTppc29mc19oYXNoaV9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxcbmZzL2lzb2ZzL2lub2RlLmMtMTc2LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTk5LS8qXFxuZnMvaXNvZnMvaW5vZGUuYzoyMDA6ICogQ29tcGFyZSBvZiB0d28gaXNvZnMgbmFtZXMuXFxuZnMvaXNvZnMvaW5vZGUuYy0yMDEtICovXFxuZnMvaXNvZnMvaW5vZGUuYzoyMDI6c3RhdGljIGludCBpc29mc19kZW50cnlfY21wX2NvbW1vbihcXG5mcy9pc29mcy9pbm9kZS5jLTIwMy1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsXFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTIyOT1zdGF0aWMgaW50XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzA6aXNvZnNfaGFzaGkoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cilcXG5mcy9pc29mcy9pbm9kZS5jLTIzMS17XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzI6XFx0cmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDApO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjMzLX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjM1PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjIzNjppc29mc19kZW50cnlfY21waShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvaXNvZnMvaW5vZGUuYy0yMzctXFx0XFx0dW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSlcXG5mcy9pc29mcy9pbm9kZS5jLTIzOC17XFxuZnMvaXNvZnMvaW5vZGUuYzoyMzk6XFx0cmV0dXJuIGlzb2ZzX2RlbnRyeV9jbXBfY29tbW9uKGxlbiwgc3RyLCBuYW1lLCAwLCAxKTtcXG5mcy9pc29mcy9pbm9kZS5jLTI0MC19XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jLTI0My0vKlxcbmZzL2lzb2ZzL2lub2RlLmM6MjQ0OiAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS5cXG5mcy9pc29mcy9pbm9kZS5jLTI0NS0gKi9cXG5mcy9pc29mcy9pbm9kZS5jPTI0Nj1zdGF0aWMgaW50XFxuZnMvaXNvZnMvaW5vZGUuYzoyNDc6aXNvZnNfaGFzaF9jb21tb24oY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjQ4LXtcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjY0PXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjI2NTppc29mc19oYXNoX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpXFxuZnMvaXNvZnMvaW5vZGUuYy0yNjYte1xcbmZzL2lzb2ZzL2lub2RlLmM6MjY3OlxcdHJldHVybiBpc29mc19oYXNoX2NvbW1vbihkZW50cnksIHFzdHIsIDEpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjY4LX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjcwPXN0YXRpYyBpbnRcXG5mcy9pc29mcy9pbm9kZS5jOjI3MTppc29mc19oYXNoaV9tcyhjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjcyLXtcXG5mcy9pc29mcy9pbm9kZS5jOjI3MzpcXHRyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7XFxuZnMvaXNvZnMvaW5vZGUuYy0yNzQtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0yNzY9c3RhdGljIGludFxcbmZzL2lzb2ZzL2lub2RlLmM6Mjc3Omlzb2ZzX2RlbnRyeV9jbXBfbXMoY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbmZzL2lzb2ZzL2lub2RlLmMtMjc4LVxcdFxcdHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpXFxuZnMvaXNvZnMvaW5vZGUuYy0yNzkte1xcbmZzL2lzb2ZzL2lub2RlLmM6MjgwOlxcdHJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihsZW4sIHN0ciwgbmFtZSwgMSwgMCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0yODEtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0yODM9c3RhdGljIGludFxcbmZzL2lzb2ZzL2lub2RlLmM6Mjg0Omlzb2ZzX2RlbnRyeV9jbXBpX21zKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9pc29mcy9pbm9kZS5jLTI4NS1cXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKVxcbmZzL2lzb2ZzL2lub2RlLmMtMjg2LXtcXG5mcy9pc29mcy9pbm9kZS5jOjI4NzpcXHRyZXR1cm4gaXNvZnNfZGVudHJ5X2NtcF9jb21tb24obGVuLCBzdHIsIG5hbWUsIDEsIDEpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMjg4LX1cXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MjkxPWVudW0ge1xcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0yOTctXFxuZnMvaXNvZnMvaW5vZGUuYzoyOTg6c3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdGFudF90YWJsZSBpc29mc19wYXJhbV9tYXBbXSA9IHtcXG5mcy9pc29mcy9pbm9kZS5jLTI5OS1cXHR7XFxcImFjb3JuXFxcIixcXHQnYSd9LFxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0zMDctXFxuZnMvaXNvZnMvaW5vZGUuYzozMDg6c3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdGFudF90YWJsZSBpc29mc19wYXJhbV9jaGVja1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMzA5LVxcdHtcXFwicmVsYXhlZFxcXCIsXFx0J3InfSxcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzE1LVxcbmZzL2lzb2ZzL2lub2RlLmM6MzE2OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNfcGFyYW1ldGVyX3NwZWMgaXNvZnNfcGFyYW1fc3BlY1tdID0ge1xcbmZzL2lzb2ZzL2lub2RlLmMtMzE3LVxcdGZzcGFyYW1fZmxhZ1xcdChcXFwibm9yb2NrXFxcIixcXHRcXHRPcHRfbm9yb2NrKSxcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMzI0LVxcdGZzcGFyYW1fc3RyaW5nXFx0KFxcXCJpb2NoYXJzZXRcXFwiLFxcdFxcdE9wdF9pb2NoYXJzZXQpLFxcbmZzL2lzb2ZzL2lub2RlLmM6MzI1OlxcdGZzcGFyYW1fZW51bVxcdChcXFwibWFwXFxcIixcXHRcXHRcXHRPcHRfbWFwLCBpc29mc19wYXJhbV9tYXApLFxcbmZzL2lzb2ZzL2lub2RlLmMtMzI2LVxcdGZzcGFyYW1fdTMyXFx0KFxcXCJzZXNzaW9uXFxcIixcXHRcXHRPcHRfc2Vzc2lvbiksXFxuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ1Ljc2MzcyMzk2OFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwODE1MTI2ODgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGhhdmluZyBpdDpcblxuKipEaWdnaW5nIGludG8gdGhlIElTT0ZTIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgdGltZSB0byBnZXQgZ3JhbnVsYXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwcmVjaXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5IGZvciB0aGUgWklTT0ZTIGFuZCB0aGUgYnJvYWRlciBJU085NjYwIGZpbGUgc3lzdGVtIHN1cHBvcnQuIFRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0LCBhcyBhbHdheXMsIGlzIHRoZSBgS2NvbmZpZ2AgZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSdzIHNvdXJjZSBkaXJlY3RvcnkuIFNwZWNpZmljYWxseSwgYGZzL2lzb2ZzL0tjb25maWdgLiBUaGF0J3Mgd2hlcmUgSSdsbCBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgYFpJU09GU2AgYW5kIGBJU085NjYwX0ZTYCwgdGhlIGtleSB2YXJpYWJsZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBJJ2xsIHBvcmUgb3ZlciB0aGF0IHRvIGdldCB0aGUgZGVmaW5pdGl2ZSBwaWN0dXJlIG9mIHdoYXQncyBlbmFibGVkLCBkaXNhYmxlZCwgYW5kIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuIEl0J3MgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGJ1aWx0IGFuZCBjb25maWd1cmVkIGluIHRoaXMga2VybmVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTIxMiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI1OjQ3Ljg0NTI0MDM2NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdGNvbmZpZyBJU085NjYwX0ZTXFxuICAgMzpcXHRcXHR0cmlzdGF0ZSBcXFwiSVNPIDk2NjAgQ0RST00gZmlsZSBzeXN0ZW0gc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbiAgIDU6XFx0XFx0aGVscFxcbiAgIDY6XFx0XFx0ICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBmaWxlIHN5c3RlbSB1c2VkIG9uIENELVJPTXMuICBJdCB3YXMgcHJldmlvdXNseVxcbiAgIDc6XFx0XFx0ICBrbm93biBhcyBcXFwiSGlnaCBTaWVycmEgRmlsZSBTeXN0ZW1cXFwiIGFuZCBpcyBjYWxsZWQgXFxcImhzZnNcXFwiIG9uIG90aGVyXFxuICAgODpcXHRcXHQgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvclxcbiAgIDk6XFx0XFx0ICBsb25nIFVuaXggZmlsZW5hbWVzIGFuZCBzeW1ib2xpYyBsaW5rcyBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhpc1xcbiAgMTA6XFx0XFx0ICBkcml2ZXIuICBJZiB5b3UgaGF2ZSBhIENELVJPTSBkcml2ZSBhbmQgd2FudCB0byBkbyBtb3JlIHdpdGggaXQgdGhhblxcbiAgMTE6XFx0XFx0ICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWRcXG4gIDEyOlxcdFxcdCAgXFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pc29mcy5yc3RcXHUwMDNlIGFuZCB0aGUgQ0QtUk9NLUhPV1RPLFxcbiAgMTM6XFx0XFx0ICBhdmFpbGFibGUgZnJvbSBcXHUwMDNjaHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG9cXHUwMDNlKSwgdGhlcmVieVxcbiAgMTQ6XFx0XFx0ICBlbmxhcmdpbmcgeW91ciBrZXJuZWwgYnkgYWJvdXQgMjcgS0I7IG90aGVyd2lzZSBzYXkgTi5cXG4gIDE1OlxcdFxcbiAgMTY6XFx0XFx0ICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlXFxuICAxNzpcXHRcXHQgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc29mcy5cXG4gIDE4OlxcdFxcbiAgMTk6XFx0Y29uZmlnIEpPTElFVFxcbiAgMjA6XFx0XFx0Ym9vbCBcXFwiTWljcm9zb2Z0IEpvbGlldCBDRFJPTSBleHRlbnNpb25zXFxcIlxcbiAgMjE6XFx0XFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXFxuICAyMjpcXHRcXHRzZWxlY3QgTkxTXFxuICAyMzpcXHRcXHRoZWxwXFxuICAyNDpcXHRcXHQgIEpvbGlldCBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24gZm9yIHRoZSBJU08gOTY2MCBDRC1ST00gZmlsZSBzeXN0ZW1cXG4gIDI1OlxcdFxcdCAgd2hpY2ggYWxsb3dzIGZvciBsb25nIGZpbGVuYW1lcyBpbiB1bmljb2RlIGZvcm1hdCAodW5pY29kZSBpcyB0aGVcXG4gIDI2OlxcdFxcdCAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZVxcbiAgMjc6XFx0XFx0ICBjaGFyYWN0ZXJzIG9mIGFsbW9zdCBhbGwgbGFuZ3VhZ2VzIG9mIHRoZSB3b3JsZDsgc2VlXFxuICAyODpcXHRcXHQgIFxcdTAwM2NodHRwOi8vd3d3LnVuaWNvZGUub3JnL1xcdTAwM2UgZm9yIG1vcmUgaW5mb3JtYXRpb24pLiAgU2F5IFkgaGVyZSBpZiB5b3VcXG4gIDI5OlxcdFxcdCAgd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgSm9saWV0IENELVJPTXMgdW5kZXIgTGludXguXFxuICAzMDpcXHRcXG4gIDMxOlxcdGNvbmZpZyBaSVNPRlNcXG4gIDMyOlxcdFxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gZXh0ZW5zaW9uXFxcIlxcbiAgMzM6XFx0XFx0ZGVwZW5kcyBvbiBJU085NjYwX0ZTXFxuICAzNDpcXHRcXHRzZWxlY3QgWkxJQl9JTkZMQVRFXFxuICAzNTpcXHRcXHRoZWxwXFxuICAzNjpcXHRcXHQgIFRoaXMgaXMgYSBMaW51eC1zcGVjaWZpYyBleHRlbnNpb24gdG8gUm9ja1JpZGdlIHdoaWNoIGxldHMgeW91IHN0b3JlXFxuICAzNzpcXHRcXHQgIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtIG9uIGEgQ0QtUk9NIGFuZCBoYXZlIGl0IHRyYW5zcGFyZW50bHlcXG4gIDM4OlxcdFxcdCAgZGVjb21wcmVzc2VkIHdoZW4gdGhlIENELVJPTSBpcyBhY2Nlc3NlZC4gIFNlZVxcbiAgMzk6XFx0XFx0ICBcXHUwMDNjaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy96aXNvZnMvXFx1MDAzZSBmb3IgdGhlIHRvb2xzXFxuICA0MDpcXHRcXHQgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlXFxuICA0MTpcXHRcXHQgIGFibGUgdG8gcmVhZCBzdWNoIGNvbXByZXNzZWQgQ0QtUk9Ncy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NDcuODQ1MzEwNDI2WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDAzMDAzODEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIElTTzk2NjAgQ29tcHJlc3Npb24gQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBJJ20gc3RhcnRpbmcgYXQgdGhlIHRvcCwgcm91Z2hseSBsaW5lcyAxIHRvIDQwMC4gVGhhdCdzIGEgZ29vZCBjaHVuaywgcHJvYmFibHkgdGhlIGluaXRpYWwgc2V0dXAsIGRlY2xhcmF0aW9ucywgYW5kIG1heWJlIHNvbWUgY29yZSBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb21wcmVzc2lvbi4gSSdtIGV4cGVjdGluZyB0byBzZWUgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyB0aGUgY29tcHJlc3Npb24gcHJvY2VzcyBpcyBtYW5hZ2VkIGluIHRoZSBJU085NjYwIGZpbGVzeXN0ZW0uIFRoaW5ncyB0byBsb29rIGZvciBpbW1lZGlhdGVseSBhcmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgaXQgc3VwcG9ydHMsIGFueSBkYXRhIHN0cnVjdHVyZXMgdXNlZCB0byBob2xkIGNvbXByZXNzZWQgYmxvY2tzLCBhbmQgaG93IHRoZXkncmUgaWRlbnRpZmllZC4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudHJ5IHBvaW50cyBmb3IgdGhlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIOKAkyB0aGUgb25lcyB0aGF0IGFyZSBjYWxsZWQgd2hlbiBhIGZpbGUgaXMgd3JpdHRlbiBvciByZWFkLiBBcmUgdGhleSBkaXJlY3QgY2FsbHMgdG8gbGlicmFyeSByb3V0aW5lcywgb3IgYXJlIHRoZXJlIGludGVybmFsIHdyYXBwZXIgZnVuY3Rpb25zPyBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGJpdHMgb2YgY29kZSB0aGF0IGRlY2lkZSB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGV2ZW4gKmF0dGVtcHRlZCogb24gYSBwYXJ0aWN1bGFyIGZpbGUg4oCTIHByb2JhYmx5IHNvbWUgY2hlY2tzIG9uIGZpbGUgYXR0cmlidXRlcyBvciBleHRlbnNpb25zLiBIb3BlZnVsbHksIEknbGwgcXVpY2tseSBzcG90IGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGFyZWFzIHdoZXJlIGRhdGEgaW50ZWdyaXR5IG1pZ2h0IGJlIGF0IHJpc2suIFRoaXMgYXJlYSwgYXJvdW5kIGxpbmVzIDEtNDAwLCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBJU085NjYwIGltcGxlbWVudGF0aW9uLiBMZXQncyBzZWUgd2hhdCB3ZSBmaW5kIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjE4MSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NTEuODc1MzUyNjQyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkyMzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcXG4gICAyOlxcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcXG4gICAzOlxcdCAqICAgXFxuICAgNDpcXHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXFxuICAgNzpcXHRcXG4gICA4OlxcdC8qXFxuICAgOTpcXHQgKiBsaW51eC9mcy9pc29mcy9jb21wcmVzcy5jXFxuICAxMDpcXHQgKlxcbiAgMTE6XFx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cXG4gIDEyOlxcdCAqL1xcbiAgMTM6XFx0XFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAgMTY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jpby5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgMTk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4gIDIwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC96bGliLmhcXHUwMDNlXFxuICAyMTpcXHRcXG4gIDIyOlxcdCNpbmNsdWRlIFxcXCJpc29mcy5oXFxcIlxcbiAgMjM6XFx0I2luY2x1ZGUgXFxcInppc29mcy5oXFxcIlxcbiAgMjQ6XFx0XFxuICAyNTpcXHQvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBnbG9iYWwuICovXFxuICAyNjpcXHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XFxuICAyNzpcXHRcXG4gIDI4OlxcdC8qXFxuICAyOTpcXHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxcbiAgMzA6XFx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxcbiAgMzE6XFx0ICovXFxuICAzMjpcXHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAgMzM6XFx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0LypcXG4gIDM2OlxcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbiAgMzc6XFx0ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG4gIDM4OlxcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbiAgMzk6XFx0ICovXFxuICA0MDpcXHRzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gIDQxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuICA0MjpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiAgNDM6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW50ICplcnJwKVxcbiAgNDQ6XFx0e1xcbiAgNDU6XFx0XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbiAgNDY6XFx0XFx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XFxuICA0NzpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuICA0ODpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmbWFzayA9IGJ1ZnNpemUgLSAxO1xcbiAgNDk6XFx0XFx0aW50IGksIGJsb2NrX3NpemUgPSBibG9ja19lbmQgLSBibG9ja19zdGFydDtcXG4gIDUwOlxcdFxcdHpfc3RyZWFtIHN0cmVhbSA9IHsgLnRvdGFsX291dCA9IDAsXFxuICA1MTpcXHRcXHRcXHRcXHQgICAgLmF2YWlsX2luID0gMCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcXG4gIDUzOlxcdFxcdGludCB6ZXJyO1xcbiAgNTQ6XFx0XFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSArIChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spICsgYnVmbWFzaylcXG4gIDU1OlxcdFxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgNTY6XFx0XFx0aW50IGhhdmVibG9ja3M7XFxuICA1NzpcXHRcXHRibGtjbnRfdCBibG9ja251bTtcXG4gIDU4OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcXG4gIDU5OlxcdFxcdGludCBjdXJiaCwgY3VycGFnZTtcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0aWYgKGJsb2NrX3NpemUgXFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcXG4gIDYyOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gIDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgNjQ6XFx0XFx0fVxcbiAgNjU6XFx0XFx0LyogRW1wdHkgYmxvY2s/ICovXFxuICA2NjpcXHRcXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XFxuICA2NzpcXHRcXHRcXHRmb3IgKCBpID0gMCA7IGkgXFx1MDAzYyBwY291bnQgOyBpKysgKSB7XFxuICA2ODpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbiAgNjk6XFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcXG4gIDcwOlxcdFxcbiAgNzE6XFx0XFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gIDcyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNzM6XFx0XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XFxuICA3NDpcXHRcXHRcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG4gIDc1OlxcdFxcdFxcdH1cXG4gIDc2OlxcdFxcdFxcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XFxuICA3NzpcXHRcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdFxcdC8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovXFxuICA4MDpcXHRcXHRibG9ja251bSA9IGJsb2NrX3N0YXJ0IFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgODE6XFx0XFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgKyAxKTtcXG4gIDgyOlxcdFxcdGlmICghYmhzKSB7XFxuICA4MzpcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuICA4NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDg1OlxcdFxcdH1cXG4gIDg2OlxcdFxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG4gIDg3OlxcdFxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0Y3VyYmggPSAwO1xcbiAgOTA6XFx0XFx0Y3VycGFnZSA9IDA7XFxuICA5MTpcXHRcXHQvKlxcbiAgOTI6XFx0XFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcXG4gIDkzOlxcdFxcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxcbiAgOTQ6XFx0XFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbid0IGhvbGQgdGhlIHpsaWJcXG4gIDk1OlxcdFxcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cXG4gIDk2OlxcdFxcdCAqL1xcbiAgOTc6XFx0XFxuICA5ODpcXHRcXHRpZiAoIWJoc1swXSlcXG4gIDk5OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwMDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjU6NTEuODc1NTQ3NjMyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM2NTIxNDM1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGFzIGlmIHRoZXkgd2VyZSBteSBvd246XG5cbioqRGl2aW5nIEJhY2sgaW50byBjb21wcmVzcy5jKipcblxuQWxyaWdodCwgSSdtIHRoaW5raW5nIHdlIG5lZWQgdG8gY2lyY2xlIGJhY2sgdG8gYGZzL2lzb2ZzL2NvbXByZXNzLmNgLiBJIHJlbWVtYmVyIGhhdmluZyBhIGZldyBuYWdnaW5nIHF1ZXN0aW9ucyBhbmQgcG90ZW50aWFsIG9wdGltaXphdGlvbiBpZGVhcyBsdXJraW5nIGFyb3VuZCBhZnRlciB0aGUgaW5pdGlhbCBwYXNzLiBMZXQncyBzZWUgaWYgdGhvc2Ugc3RpbGwgaG9sZCB3YXRlci4gSSB3YW50IHRvIGNoZWNrIGZvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGdpdmVuIGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBjYWNoaW5nIGxheWVyLiBBcmUgdGhlcmUgYW55IHNwb3RzIHdoZXJlIHdlJ3JlIG5vdCBwcm9wZXJseSBoYW5kbGluZyBsb2NraW5nIG9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRoZSBjb21wcmVzc2lvbiBidWZmZXJzIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhPyBJJ20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBvdmVyYWxsIGFsZ29yaXRobSdzIGVmZmljaWVuY3kuIENvdWxkIHdlIHNxdWVlemUgb3V0IGEgZmV3IG1vcmUgY3ljbGVzIHdpdGggYSBkaWZmZXJlbnQgc3RyYXRlZ3ksIG1heWJlIGNvbnNpZGVyaW5nIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxpYnJhcnkgYWx0b2dldGhlciBpZiB0aGUgcGVyZm9ybWFuY2UgZ2FpbnMgYXJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZSBjb2RlIGNodXJuPyBBbmQsIG9mIGNvdXJzZSwgSSBuZWVkIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBidWZmZXIgb3ZlcmZsb3dzIGJlaW5nIG15IG1haW4gY29uY2VybiwgYnV0IHJlYWxseSBhbnl0aGluZyB0aGF0IGNvdWxkIGFsbG93IGZvciBtYWxpY2lvdXMgbWFuaXB1bGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuIEl0J3MgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSd2ZSBnb3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3OTYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1NC4yNDA3NjU1OTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTQyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvaXNvZnMvY29tcHJlc3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTAxOlxcdFxcdHdhaXRfb25fYnVmZmVyKGJoc1swXSk7XFxuIDEwMjpcXHRcXHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbMF0pKSB7XFxuIDEwMzpcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDEwNDpcXHRcXHRcXHRnb3RvIGJfZWlvO1xcbiAxMDU6XFx0XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRcXHRzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAxMDg6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuIDEwOTpcXHRcXHRcXHRcXG4gMTEwOlxcdFxcdHplcnIgPSB6bGliX2luZmxhdGVJbml0KFxcdTAwMjZzdHJlYW0pO1xcbiAxMTE6XFx0XFx0aWYgKHplcnIgIT0gWl9PSykge1xcbiAxMTI6XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9NRU1fRVJST1IpXFxuIDExMzpcXHRcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuIDExNDpcXHRcXHRcXHRlbHNlXFxuIDExNTpcXHRcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDExNjpcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVRyBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXFxcblxcXCIsXFxuIDExNzpcXHRcXHRcXHRcXHQgICAgICAgemVycik7XFxuIDExODpcXHRcXHRcXHRnb3RvIHpfZWlvO1xcbiAxMTk6XFx0XFx0fVxcbiAxMjA6XFx0XFxuIDEyMTpcXHRcXHR3aGlsZSAoY3VycGFnZSBcXHUwMDNjIHBjb3VudCBcXHUwMDI2XFx1MDAyNiBjdXJiaCBcXHUwMDNjIGhhdmVibG9ja3MgXFx1MDAyNlxcdTAwMjZcXG4gMTIyOlxcdFxcdCAgICAgICB6ZXJyICE9IFpfU1RSRUFNX0VORCkge1xcbiAxMjM6XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tjdXJwYWdlXTtcXG4gMTI0OlxcdFxcbiAxMjU6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7XFxuIDEyNjpcXHRcXHRcXHRcXHRpZiAoZm9saW8pIHtcXG4gMTI3OlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5uZXh0X291dCA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIHBvZmZzZXQpO1xcbiAxMjg6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLmF2YWlsX291dCA9IGZvbGlvX3NpemUoZm9saW8pIC0gcG9mZnNldDtcXG4gMTI5OlxcdFxcdFxcdFxcdFxcdHBvZmZzZXQgPSAwO1xcbiAxMzA6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTMxOlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXFx1MDAyNnppc29mc19zaW5rX3BhZ2U7XFxuIDEzMjpcXHRcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9TSVpFO1xcbiAxMzM6XFx0XFx0XFx0XFx0fVxcbiAxMzQ6XFx0XFx0XFx0fVxcbiAxMzU6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pIHtcXG4gMTM2OlxcdFxcdFxcdFxcdHdhaXRfb25fYnVmZmVyKGJoc1tjdXJiaF0pO1xcbiAxMzc6XFx0XFx0XFx0XFx0aWYgKCFidWZmZXJfdXB0b2RhdGUoYmhzW2N1cmJoXSkpIHtcXG4gMTM4OlxcdFxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTM5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDA6XFx0XFx0XFx0XFx0fVxcbiAxNDE6XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfaW4gID0gYmhzW2N1cmJoXS1cXHUwMDNlYl9kYXRhICtcXG4gMTQyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spO1xcbiAxNDM6XFx0XFx0XFx0XFx0c3RyZWFtLmF2YWlsX2luID0gbWluX3QodW5zaWduZWQsIGJ1ZnNpemUgLVxcbiAxNDQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0KGJsb2NrX3N0YXJ0IFxcdTAwMjYgYnVmbWFzayksXFxuIDE0NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRibG9ja19zaXplKTtcXG4gMTQ2OlxcdFxcdFxcdFxcdGJsb2NrX3NpemUgLT0gc3RyZWFtLmF2YWlsX2luO1xcbiAxNDc6XFx0XFx0XFx0XFx0YmxvY2tfc3RhcnQgPSAwO1xcbiAxNDg6XFx0XFx0XFx0fVxcbiAxNDk6XFx0XFxuIDE1MDpcXHRcXHRcXHR3aGlsZSAoc3RyZWFtLmF2YWlsX291dCBcXHUwMDI2XFx1MDAyNiBzdHJlYW0uYXZhaWxfaW4pIHtcXG4gMTUxOlxcdFxcdFxcdFxcdHplcnIgPSB6bGliX2luZmxhdGUoXFx1MDAyNnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTtcXG4gMTUyOlxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfQlVGX0VSUk9SIFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5hdmFpbF9pbiA9PSAwKVxcbiAxNTM6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NDpcXHRcXHRcXHRcXHRpZiAoemVyciA9PSBaX1NUUkVBTV9FTkQpXFxuIDE1NTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU2OlxcdFxcdFxcdFxcdGlmICh6ZXJyICE9IFpfT0spIHtcXG4gMTU3OlxcdFxcdFxcdFxcdFxcdC8qIEVPRiwgZXJyb3IsIG9yIHRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXQgKi9cXG4gMTU4OlxcdFxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfTUVNX0VSUk9SKVxcbiAxNTk6XFx0XFx0XFx0XFx0XFx0XFx0KmVycnAgPSAtRU5PTUVNO1xcbiAxNjA6XFx0XFx0XFx0XFx0XFx0ZWxzZSB7XFxuIDE2MTpcXHRcXHRcXHRcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVR1xcbiAxNjI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCJ6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkXFxcIlxcbiAxNjM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcXCIgJWQsIGlub2RlID0gJWxsdSxcXFwiXFxuIDE2NDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBwYWdlIGlkeCA9ICVkLCBiaCBpZHggPSAlZCxcXFwiXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBhdmFpbF9pbiA9ICVsZCxcXFwiXFxuIDE2NjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiBhdmFpbF9vdXQgPSAlbGRcXFxcblxcXCIsXFxuIDE2NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgemVyciwgaW5vZGUtXFx1MDAzZWlfaW5vLCBjdXJwYWdlLFxcbiAxNjg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGN1cmJoLCBzdHJlYW0uYXZhaWxfaW4sXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RyZWFtLmF2YWlsX291dCk7XFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRcXHQqZXJycCA9IC1FSU87XFxuIDE3MTpcXHRcXHRcXHRcXHRcXHR9XFxuIDE3MjpcXHRcXHRcXHRcXHRcXHRnb3RvIGluZmxhdGVfb3V0O1xcbiAxNzM6XFx0XFx0XFx0XFx0fVxcbiAxNzQ6XFx0XFx0XFx0fVxcbiAxNzU6XFx0XFxuIDE3NjpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gMTc3OlxcdFxcdFxcdFxcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cXG4gMTc4OlxcdFxcdFxcdFxcdGlmIChmb2xpbykge1xcbiAxNzk6XFx0XFx0XFx0XFx0XFx0Zmx1c2hfZGNhY2hlX2ZvbGlvKGZvbGlvKTtcXG4gMTgwOlxcdFxcdFxcdFxcdFxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbiAxODE6XFx0XFx0XFx0XFx0fVxcbiAxODI6XFx0XFx0XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpIHtcXG4gMTgzOlxcdFxcdFxcdFxcdFxcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gTlVMTDtcXG4gMTg1OlxcdFxcdFxcdFxcdH1cXG4gMTg2OlxcdFxcdFxcdFxcdGN1cnBhZ2UrKztcXG4gMTg3OlxcdFxcdFxcdH1cXG4gMTg4OlxcdFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX2luKVxcbiAxODk6XFx0XFx0XFx0XFx0Y3VyYmgrKztcXG4gMTkwOlxcdFxcdH1cXG4gMTkxOlxcdGluZmxhdGVfb3V0OlxcbiAxOTI6XFx0XFx0emxpYl9pbmZsYXRlRW5kKFxcdTAwMjZzdHJlYW0pO1xcbiAxOTM6XFx0XFx0aWYgKHN0cmVhbS5uZXh0X291dCBcXHUwMDI2XFx1MDAyNiBzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKVxcbiAxOTQ6XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuIDE5NTpcXHRcXG4gMTk2OlxcdHpfZWlvOlxcbiAxOTc6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0Yl9laW86XFxuIDIwMDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaGF2ZWJsb2NrczsgaSsrKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1NC4yNDA4NjM0MDVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTA3MDQ2NDg2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSB3ZSBnby4uLlxuXG4qKkRpdmluZyBpbnRvIGBmcy9pc29mcy9jb21wcmVzcy5jYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBmaWxlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgSVNPRlMgY29tcHJlc3Npb24gaXMgaW1wbGVtZW50ZWQuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Jhc3Agb24gdGhlIGJyb2FkZXIgZmlsZSBzeXN0ZW0gc3RydWN0dXJlIGFuZCB0aGUgSVNPIDk2NjAgc3RhbmRhcmQsIGJ1dCB0aGUgY29tcHJlc3Npb24gYXNwZWN0IGlzIHNvbWV0aGluZyBJIG5lZWQgdG8gcmVmcmVzaC4gV2hhdCBzcGVjaWZpYyBhbGdvcml0aG1zIGFyZSBpbiB1c2U/IEhvdyBhcmUgdGhleSBpbnRlZ3JhdGVkIHdpdGhpbiB0aGUgSS9PIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MgSSBzaG91bGQgYmUgYXdhcmUgb2YsIG9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb24gYXJlYXM/IEkgd2FudCB0byBzZWUgaG93IHRoZSBjb21wcmVzc2lvbiBhZmZlY3RzIHJlYWQgYW5kIHdyaXRlIHBhdGhzLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgZGUvY29tcHJlc3Npb24sIGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtJ3MgbWV0YWRhdGEgaXMgbW9kaWZpZWQgdG8gc3RvcmUgY29tcHJlc3NlZCBkYXRhLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZpbGUgc3lzdGVtIHByZXNlbnRzIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIHVzZXIuIEknbGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgc3RydWN0dXJlcyBvciBmbGFncyB1c2VkIHRvIGluZGljYXRlIGEgZmlsZSdzIGNvbXByZXNzZWQgc3RhdGUuIExldCdzIHNlZSB3aGF0IGludGVyZXN0aW5nIHRlY2huaXF1ZXMgdGhlIGRldmVsb3BlcnMgdXRpbGl6ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzQ2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1OS4zMTEzMzE2OTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvaXNvZnMvY29tcHJlc3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjAxOlxcdFxcdFxcdGJyZWxzZShiaHNbaV0pO1xcbiAyMDI6XFx0XFx0a2ZyZWUoYmhzKTtcXG4gMjAzOlxcdFxcdHJldHVybiBzdHJlYW0udG90YWxfb3V0O1xcbiAyMDQ6XFx0fVxcbiAyMDU6XFx0XFxuIDIwNjpcXHQvKlxcbiAyMDc6XFx0ICogVW5jb21wcmVzcyBkYXRhIHNvIHRoYXQgcGFnZXNbZnVsbF9wYWdlXSBpcyBmdWxseSB1cHRvZGF0ZSBhbmQgcG9zc2libHlcXG4gMjA4OlxcdCAqIGZpbGxzIGluIG90aGVyIHBhZ2VzIGlmIHdlIGhhdmUgZGF0YSBmb3IgdGhlbS5cXG4gMjA5OlxcdCAqL1xcbiAyMTA6XFx0c3RhdGljIGludCB6aXNvZnNfZmlsbF9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZnVsbF9wYWdlLCBpbnQgcGNvdW50LFxcbiAyMTE6XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXFxuIDIxMjpcXHR7XFxuIDIxMzpcXHRcXHRsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmO1xcbiAyMTQ6XFx0XFx0bG9mZl90IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7XFxuIDIxNTpcXHRcXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcXG4gMjE2OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG4gMjE3OlxcdFxcdHVuc2lnbmVkIGludCBibG9ja3B0cjtcXG4gMjE4OlxcdFxcdGxvZmZfdCBwb2Zmc2V0ID0gMDtcXG4gMjE5OlxcdFxcdGJsa2NudF90IGNzdGFydF9ibG9jaywgY2VuZF9ibG9jaztcXG4gMjIwOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDIyMTpcXHRcXHR1bnNpZ25lZCBpbnQgYmxrYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTtcXG4gMjIyOlxcdFxcdHVuc2lnbmVkIGludCBibGtzaXplID0gMSBcXHUwMDNjXFx1MDAzYyBibGtiaXRzO1xcbiAyMjM6XFx0XFx0aW50IGVycjtcXG4gMjI0OlxcdFxcdGxvZmZfdCByZXQ7XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xcbiAyMjc6XFx0XFxuIDIyODpcXHRcXHQvKlxcbiAyMjk6XFx0XFx0ICogV2Ugd2FudCB0byByZWFkIGF0IGxlYXN0ICdmdWxsX3BhZ2UnIHBhZ2UuIEJlY2F1c2Ugd2UgaGF2ZSB0b1xcbiAyMzA6XFx0XFx0ICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZ1xcbiAyMzE6XFx0XFx0ICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLlxcbiAyMzI6XFx0XFx0ICovXFxuIDIzMzpcXHRcXHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xcbiAyMzQ6XFx0XFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cXHUwMDNlaV9zaXplKTtcXG4gMjM1OlxcdFxcbiAyMzY6XFx0XFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG4gMjM3OlxcdFxcdGNlbmRfYmxvY2sgPSAoZW5kX29mZiArICgxIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgLSAxKVxcbiAyMzg6XFx0XFx0XFx0XFx0XFx1MDAzZVxcdTAwM2Ugemlzb2ZzX2Jsb2NrX3NoaWZ0O1xcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRXQVJOX09OKHN0YXJ0X29mZiAtIChmdWxsX3BhZ2UgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkgIT1cXG4gMjQxOlxcdFxcdFxcdCgoY3N0YXJ0X2Jsb2NrIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkgXFx1MDAyNiBQQUdFX01BU0spKTtcXG4gMjQyOlxcdFxcbiAyNDM6XFx0XFx0LyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovXFxuIDI0NDpcXHRcXHQvKiBOb3RlOiB3ZSdyZSBub3QgdXNpbmcgaXNvbnVtXzczMSgpIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBrbm93biBhbGlnbmVkICovXFxuIDI0NTpcXHRcXHQvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovXFxuIDI0NjpcXHRcXHRibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSArIGNzdGFydF9ibG9jaykgXFx1MDAzY1xcdTAwM2MgMjtcXG4gMjQ3OlxcdFxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbiAyNDg6XFx0XFx0aWYgKCFiaClcXG4gMjQ5OlxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNTA6XFx0XFx0YmxvY2tfc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0KGJoLVxcdTAwM2ViX2RhdGEgKyAoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xcbiAyNTI6XFx0XFxuIDI1MzpcXHRcXHR3aGlsZSAoY3N0YXJ0X2Jsb2NrIFxcdTAwM2MgY2VuZF9ibG9jayBcXHUwMDI2XFx1MDAyNiBwY291bnQgXFx1MDAzZSAwKSB7XFxuIDI1NDpcXHRcXHRcXHQvKiBMb2FkIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBibG9jayBpbiB0aGUgZmlsZSAqL1xcbiAyNTU6XFx0XFx0XFx0YmxvY2twdHIgKz0gNDtcXG4gMjU2OlxcdFxcdFxcdC8qIFRyYXZlcnNlZCB0byBuZXh0IGJsb2NrPyAqL1xcbiAyNTc6XFx0XFx0XFx0aWYgKCEoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkge1xcbiAyNTg6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0XFx0XFx0YmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgXFx1MDAzZVxcdTAwM2UgYmxrYml0cyk7XFxuIDI2MTpcXHRcXHRcXHRcXHRpZiAoIWJoKVxcbiAyNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIDI2MzpcXHRcXHRcXHR9XFxuIDI2NDpcXHRcXHRcXHRibG9ja19lbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKVxcbiAyNjU6XFx0XFx0XFx0XFx0XFx0KGJoLVxcdTAwM2ViX2RhdGEgKyAoYmxvY2twdHIgXFx1MDAyNiAoYmxrc2l6ZSAtIDEpKSkpO1xcbiAyNjY6XFx0XFx0XFx0aWYgKGJsb2NrX3N0YXJ0IFxcdTAwM2UgYmxvY2tfZW5kKSB7XFxuIDI2NzpcXHRcXHRcXHRcXHRicmVsc2UoYmgpO1xcbiAyNjg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIDI2OTpcXHRcXHRcXHR9XFxuIDI3MDpcXHRcXHRcXHRlcnIgPSAwO1xcbiAyNzE6XFx0XFx0XFx0cmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsXFxuIDI3MjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuIDI3MzpcXHRcXHRcXHRwb2Zmc2V0ICs9IHJldDtcXG4gMjc0OlxcdFxcdFxcdGZvbGlvcyArPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDI3NTpcXHRcXHRcXHRwY291bnQgLT0gcG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzY6XFx0XFx0XFx0ZnVsbF9wYWdlIC09IHBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMjc3OlxcdFxcdFxcdHBvZmZzZXQgXFx1MDAyNj0gflBBR0VfTUFTSztcXG4gMjc4OlxcdFxcbiAyNzk6XFx0XFx0XFx0aWYgKGVycikge1xcbiAyODA6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjgxOlxcdFxcdFxcdFxcdC8qXFxuIDI4MjpcXHRcXHRcXHRcXHQgKiBEaWQgd2UgZmluaXNoIHJlYWRpbmcgdGhlIHBhZ2Ugd2UgcmVhbGx5IHdhbnRlZFxcbiAyODM6XFx0XFx0XFx0XFx0ICogdG8gcmVhZD9cXG4gMjg0OlxcdFxcdFxcdFxcdCAqL1xcbiAyODU6XFx0XFx0XFx0XFx0aWYgKGZ1bGxfcGFnZSBcXHUwMDNjIDApXFxuIDI4NjpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjg3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDI4ODpcXHRcXHRcXHR9XFxuIDI4OTpcXHRcXG4gMjkwOlxcdFxcdFxcdGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kO1xcbiAyOTE6XFx0XFx0XFx0Y3N0YXJ0X2Jsb2NrKys7XFxuIDI5MjpcXHRcXHR9XFxuIDI5MzpcXHRcXG4gMjk0OlxcdFxcdGlmIChwb2Zmc2V0IFxcdTAwMjZcXHUwMDI2ICpmb2xpb3MpIHtcXG4gMjk1OlxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xcbiAyOTY6XFx0XFxuIDI5NzpcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xcbiAyOTg6XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIDI5OTpcXHRcXHR9XFxuIDMwMDpcXHRcXHRicmVsc2UoYmgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNTo1OS4zMTE0Mjk5NDVaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjIwNDkwNDk3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byB0aGUgSVNPRlMgQ29tcHJlc3Npb24gQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBMZXQncyB6ZXJvIGluIG9uIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgSVNPRlMgY29tcHJlc3Npb24gbG9naWMg4oCTIEknbSB0aGlua2luZyBsaW5lcyAzMDEgdGhyb3VnaCA0MDAgd2l0aGluIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgKG9yIHBvdGVudGlhbCBoZWFkYWNoZSkgaGFwcGVucy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGV5J3JlIGhhbmRsaW5nIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gc3BlY2lmaWNhbGx5IGluIHRoaXMgbW9kdWxlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFyb3VuZCB0aGUgY2hvaWNlIG9mIGFsZ29yaXRobSwgZXJyb3IgaGFuZGxpbmcsIGJ1ZmZlciBtYW5hZ2VtZW50Li4uIGFsbCB0aGUgdXN1YWwgc3VzcGVjdHMuIEkgd2FudCB0byBzZWUgaWYgdGhlcmUncyBhbnl0aGluZyBzdWJ0bHkgb2ZmLCBvciBtYXliZSBhbiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gSSBtaXNzZWQgcHJldmlvdXNseS4gSXQncyBhIGtleSBwYXJ0IG9mIHRoZSBJU09GUyBpbXBsZW1lbnRhdGlvbiwgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCdzIHJvYnVzdCBhbmQgZWZmaWNpZW50LiBMZXQncyBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjAyLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjowMS41MTYzMzgwNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMDE6XFx0XFx0cmV0dXJuIDA7XFxuIDMwMjpcXHR9XFxuIDMwMzpcXHRcXG4gMzA0OlxcdC8qXFxuIDMwNTpcXHQgKiBXaGVuIGRlY29tcHJlc3NpbmcsIHdlIHR5cGljYWxseSBvYnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlXFxuIDMwNjpcXHQgKiBwZXIgcmVmZXJlbmNlLiAgV2UgaW5qZWN0IHRoZSBhZGRpdGlvbmFsIHBhZ2VzIGludG8gdGhlIHBhZ2VcXG4gMzA3OlxcdCAqIGNhY2hlIGFzIGEgZm9ybSBvZiByZWFkYWhlYWQuXFxuIDMwODpcXHQgKi9cXG4gMzA5OlxcdHN0YXRpYyBpbnQgemlzb2ZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIDMxMDpcXHR7XFxuIDMxMTpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gMzEyOlxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXFx1MDAzZWlfbWFwcGluZztcXG4gMzEzOlxcdFxcdGludCBlcnI7XFxuIDMxNDpcXHRcXHRpbnQgaSwgcGNvdW50LCBmdWxsX3BhZ2U7XFxuIDMxNTpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuIDMxNjpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPVxcbiAzMTc6XFx0XFx0XFx0UEFHRV9TSElGVCBcXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xcbiAzMTg6XFx0XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuIDMxOTpcXHRcXHRzdHJ1Y3QgZm9saW8gKipmb2xpb3M7XFxuIDMyMDpcXHRcXHRwZ29mZl90IGluZGV4ID0gZm9saW8tXFx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XFxuIDMyMTpcXHRcXG4gMzIyOlxcdFxcdGVuZF9pbmRleCA9IChpbm9kZS1cXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMzIzOlxcdFxcdC8qXFxuIDMyNDpcXHRcXHQgKiBJZiB0aGlzIGZvbGlvIGlzIHdob2xseSBvdXRzaWRlIGlfc2l6ZSB3ZSBqdXN0IHJldHVybiB6ZXJvO1xcbiAzMjU6XFx0XFx0ICogZG9fZ2VuZXJpY19maWxlX3JlYWQoKSB3aWxsIGhhbmRsZSB0aGlzIGZvciB1c1xcbiAzMjY6XFx0XFx0ICovXFxuIDMyNzpcXHRcXHRpZiAoaW5kZXggXFx1MDAzZT0gZW5kX2luZGV4KSB7XFxuIDMyODpcXHRcXHRcXHRmb2xpb19lbmRfcmVhZChmb2xpbywgdHJ1ZSk7XFxuIDMyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzMwOlxcdFxcdH1cXG4gMzMxOlxcdFxcbiAzMzI6XFx0XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuIDMzMzpcXHRcXHRcXHQvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lXFxuIDMzNDpcXHRcXHRcXHQgICB3ZSBtdXN0IGRvLiAqL1xcbiAzMzU6XFx0XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG4gMzM2OlxcdFxcdFxcdHBjb3VudCA9IG1pbl90KGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssXFxuIDMzNzpcXHRcXHRcXHRcXHRlbmRfaW5kZXggLSAoaW5kZXggXFx1MDAyNiB+KHppc29mc19wYWdlc19wZXJfY2Jsb2NrIC0gMSkpKTtcXG4gMzM4OlxcdFxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4gMzM5OlxcdFxcdH0gZWxzZSB7XFxuIDM0MDpcXHRcXHRcXHRmdWxsX3BhZ2UgPSAwO1xcbiAzNDE6XFx0XFx0XFx0cGNvdW50ID0gMTtcXG4gMzQyOlxcdFxcdH1cXG4gMzQzOlxcdFxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbiAzNDQ6XFx0XFx0XFx0XFx0ICAgICAgbWF4X3QodW5zaWduZWQgaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSkpO1xcbiAzNDU6XFx0XFx0aWYgKCFmb2xpb3MpIHtcXG4gMzQ2OlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDM0NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMzQ4OlxcdFxcdH1cXG4gMzQ5OlxcdFxcdGZvbGlvc1tmdWxsX3BhZ2VdID0gZm9saW87XFxuIDM1MDpcXHRcXG4gMzUxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwY291bnQ7IGkrKywgaW5kZXgrKykge1xcbiAzNTI6XFx0XFx0XFx0aWYgKGkgPT0gZnVsbF9wYWdlKVxcbiAzNTM6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDM1NDpcXHRcXHRcXHRmb2xpb3NbaV0gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGluZGV4LFxcbiAzNTU6XFx0XFx0XFx0XFx0XFx0RkdQX0xPQ0sgfCBGR1BfQ1JFQVQgfCBGR1BfTk9XQUlULFxcbiAzNTY6XFx0XFx0XFx0XFx0XFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XFxuIDM1NzpcXHRcXHRcXHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXFxuIDM1ODpcXHRcXHRcXHRcXHRmb2xpb3NbaV0gPSBOVUxMO1xcbiAzNTk6XFx0XFx0fVxcbiAzNjA6XFx0XFxuIDM2MTpcXHRcXHRlcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIGZvbGlvcyk7XFxuIDM2MjpcXHRcXG4gMzYzOlxcdFxcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xcbiAzNjQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrKSB7XFxuIDM2NTpcXHRcXHRcXHRpZiAoZm9saW9zW2ldKSB7XFxuIDM2NjpcXHRcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW9zW2ldKTtcXG4gMzY3OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xcbiAzNjg6XFx0XFx0XFx0XFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxcbiAzNjk6XFx0XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvc1tpXSk7XFxuIDM3MDpcXHRcXHRcXHR9XFxuIDM3MTpcXHRcXHR9XFxuIDM3MjpcXHRcXG4gMzczOlxcdFxcdC8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSBcXFwiY3JpdGljYWxcXFwiIHBhZ2UgKi9cXG4gMzc0OlxcdFxcdGtmcmVlKGZvbGlvcyk7XFxuIDM3NTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAzNzY6XFx0fVxcbiAzNzc6XFx0XFxuIDM3ODpcXHRjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHppc29mc19hb3BzID0ge1xcbiAzNzk6XFx0XFx0LnJlYWRfZm9saW8gPSB6aXNvZnNfcmVhZF9mb2xpbyxcXG4gMzgwOlxcdFxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbiAzODE6XFx0fTtcXG4gMzgyOlxcdFxcbiAzODM6XFx0aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0emlzb2ZzX3psaWJfd29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTtcXG4gMzg2OlxcdFxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuIDM4NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMzg4OlxcdFxcbiAzODk6XFx0XFx0cmV0dXJuIDA7XFxuIDM5MDpcXHR9XFxuIDM5MTpcXHRcXG4gMzkyOlxcdHZvaWQgemlzb2ZzX2NsZWFudXAodm9pZClcXG4gMzkzOlxcdHtcXG4gMzk0OlxcdFxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuIDM5NTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjAxLjUxNjQzNDJaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjAxMDM4MTk4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIFpJU09GUyBEYXRhIEFjY2VzcyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkYXRhIGFjY2VzcyBwYXRoIGZvciBaSVNPRlMgd2l0aGluIHRoZSBrZXJuZWwuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIHRoZSB1c2FnZSBvZiBlaXRoZXIgYHppc29mc19hb3BzYCBvciBgemlzb2ZzX3JlYWRfZm9saW9gLiBUaGUgZ29hbCBoZXJlIGlzIHRvIGdldCBhIHNvbGlkIGdyYXNwIG9mIGhvdyB0aGUgY29tcHJlc3NlZCBJU08gOTY2MCBmaWxlc3lzdGVtIGhhbmRsZXMgZGF0YSByZWFkcy4gU2luY2UgSSdtIGZhbWlsaWFyIHdpdGggdGhlIGBmcy9pc29mcy9gIGRpcmVjdG9yeSwgdGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IG15IGludmVzdGlnYXRpb24uIEknbSBlc3NlbnRpYWxseSBwaW5wb2ludGluZyB0aGUga2V5IGZ1bmN0aW9uIGNhbGxzIGludm9sdmVkIGluIGdldHRpbmcgZGF0YSBvZmYgb2YgdGhlIGNvbXByZXNzZWQgZGlzayBpbWFnZS4gSSdsbCBuZWVkIHRvIGtub3cgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBhcmUgYXNzaWduZWQsIGhvdyB0aGUgcmVhZCBvcGVyYXRpb25zIGFyZSB0cmlnZ2VyZWQsIGFuZCBob3cgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGVzeXN0ZW0ncyBvcGVyYXRpb25zLiBUaGlzIHNob3VsZCBoaWdobGlnaHQgdGhlIGNyaXRpY2FsIHBhdGggZm9yIEkvTy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjMyOTUsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjAzLjUyNjgxOTA3OFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY4ODAyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiemlzb2ZzX1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9pc29mc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jLTI1LS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGdsb2JhbC4gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjI2OnN0YXRpYyBjaGFyIHppc29mc19zaW5rX3BhZ2VbUEFHRV9TSVpFXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3LVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMyOnN0YXRpYyB2b2lkICp6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzpzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5LSAqL1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6NDA6c3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy00MS1cXHRcXHRcXHRcXHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy00NC17XFxuZnMvaXNvZnMvY29tcHJlc3MuYzo0NTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYy00Ni1cXHR1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzo2MTpcXHRpZiAoYmxvY2tfc2l6ZSBcXHUwMDNlIGRlZmxhdGVCb3VuZCgxVUwgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSkge1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtNjItXFx0XFx0KmVycnAgPSAtRUlPO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMDYtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoxMDc6XFx0c3RyZWFtLndvcmtzcGFjZSA9IHppc29mc196bGliX3dvcmtzcGFjZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjEwODpcXHRtdXRleF9sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTEwOS1cXHRcXHRcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTE1LVxcdFxcdFxcdCplcnJwID0gLUVJTztcXG5mcy9pc29mcy9jb21wcmVzcy5jOjExNjpcXHRcXHRwcmludGsoS0VSTl9ERUJVRyBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcXFxcblxcXCIsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMTctXFx0XFx0XFx0ICAgICAgIHplcnIpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xMzAtXFx0XFx0XFx0fSBlbHNlIHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjEzMTpcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKVxcdTAwMjZ6aXNvZnNfc2lua19wYWdlO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTMyLVxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTE2MS1cXHRcXHRcXHRcXHRcXHRwcmludGsoS0VSTl9ERUJVR1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTYyOlxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZSByZXR1cm5lZFxcXCJcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE2My1cXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiAlZCwgaW5vZGUgPSAlbGx1LFxcXCJcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgxLVxcdFxcdFxcdH1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjE4MjpcXHRcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTgzLVxcdFxcdFxcdFxcdGt1bm1hcF9sb2NhbChzdHJlYW0ubmV4dF9vdXQpO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTItXFx0emxpYl9pbmZsYXRlRW5kKFxcdTAwMjZzdHJlYW0pO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTkzOlxcdGlmIChzdHJlYW0ubmV4dF9vdXQgXFx1MDAyNlxcdTAwMjYgc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSlcXG5mcy9pc29mcy9jb21wcmVzcy5jLTE5NC1cXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMTk2LXpfZWlvOlxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MTk3OlxcdG11dGV4X3VubG9jayhcXHUwMDI2emlzb2ZzX3psaWJfbG9jayk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0xOTgtXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIwOS0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjIxMDpzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTEtXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTIxNS1cXHR1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVswXTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIxNjpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMTctXFx0dW5zaWduZWQgaW50IGJsb2NrcHRyO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMzUtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyMzY6XFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIzNzpcXHRjZW5kX2Jsb2NrID0gKGVuZF9vZmYgKyAoMSBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcXG5mcy9pc29mcy9jb21wcmVzcy5jOjIzODpcXHRcXHRcXHRcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yMzktXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNDAtXFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpICE9XFxuZnMvaXNvZnMvY29tcHJlc3MuYzoyNDE6XFx0XFx0KChjc3RhcnRfYmxvY2sgXFx1MDAzY1xcdTAwM2Mgemlzb2ZzX2Jsb2NrX3NoaWZ0KSBcXHUwMDI2IFBBR0VfTUFTSykpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMjQyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0yNzAtXFx0XFx0ZXJyID0gMDtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjI3MTpcXHRcXHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcXG5mcy9pc29mcy9jb21wcmVzcy5jLTI3Mi1cXHRcXHRcXHRcXHRcXHQgICAgICBwY291bnQsIGZvbGlvcywgcG9mZnNldCwgXFx1MDAyNmVycik7XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTMwOC0gKi9cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMwOTpzdGF0aWMgaW50IHppc29mc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzEwLXtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzE0LVxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNTpcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTY6XFx0dW5zaWduZWQgaW50IHppc29mc19wYWdlc19wZXJfY2Jsb2NrID1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjMxNzpcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMTg6XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMTktXFx0c3RydWN0IGZvbGlvICoqZm9saW9zO1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzEtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzI6XFx0aWYgKFBBR0VfU0hJRlQgXFx1MDAzYz0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zMzMtXFx0XFx0LyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM0LVxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozMzU6XFx0XFx0ZnVsbF9wYWdlID0gaW5kZXggXFx1MDAyNiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjMzNjpcXHRcXHRwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzM3OlxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzM4LVxcdFxcdGluZGV4IC09IGZ1bGxfcGFnZTtcXG4tLVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzQzLVxcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmM6MzQ0OlxcdFxcdFxcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcXG5mcy9pc29mcy9jb21wcmVzcy5jLTM0NS1cXHRpZiAoIWZvbGlvcykge1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNjAtXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNjE6XFx0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzYyLVxcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zNzctXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozNzg6Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcyA9IHtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM3OTpcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzgwLVxcdC8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqL1xcbi0tXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODItXFxuZnMvaXNvZnMvY29tcHJlc3MuYzozODM6aW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKVxcbmZzL2lzb2ZzL2NvbXByZXNzLmMtMzg0LXtcXG5mcy9pc29mcy9jb21wcmVzcy5jOjM4NTpcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzg2OlxcdGlmICggIXppc29mc196bGliX3dvcmtzcGFjZSApXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zODctXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5mcy9pc29mcy9jb21wcmVzcy5jLTM5MS1cXG5mcy9pc29mcy9jb21wcmVzcy5jOjM5Mjp2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpXFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTMte1xcbmZzL2lzb2ZzL2NvbXByZXNzLmM6Mzk0OlxcdHZmcmVlKHppc29mc196bGliX3dvcmtzcGFjZSk7XFxuZnMvaXNvZnMvY29tcHJlc3MuYy0zOTUtfVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYz0xMjcwPXN0YXRpYyBpbnQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcmVsb2NhdGVkKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNDM0LVxcdFxcdGNhc2UgaXNvZnNfZmlsZV9jb21wcmVzc2VkOlxcbmZzL2lzb2ZzL2lub2RlLmM6MTQzNTpcXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9kYXRhLmFfb3BzID0gXFx1MDAyNnppc29mc19hb3BzO1xcbmZzL2lzb2ZzL2lub2RlLmMtMTQzNi1cXHRcXHRcXHRicmVhaztcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmM9MTYwMT1zdGF0aWMgaW50IF9faW5pdCBpbml0X2lzbzk2NjBfZnModm9pZClcXG4tLVxcbmZzL2lzb2ZzL2lub2RlLmMtMTYwNi0jaWZkZWYgQ09ORklHX1pJU09GU1xcbmZzL2lzb2ZzL2lub2RlLmM6MTYwNzpcXHRlcnIgPSB6aXNvZnNfaW5pdCgpO1xcbmZzL2lzb2ZzL2lub2RlLmMtMTYwOC1cXHRpZiAoZXJyKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNjE2LSNpZmRlZiBDT05GSUdfWklTT0ZTXFxuZnMvaXNvZnMvaW5vZGUuYzoxNjE3OlxcdHppc29mc19jbGVhbnVwKCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNjE4LW91dDE6XFxuLS1cXG5mcy9pc29mcy9pbm9kZS5jPTE2MjU9c3RhdGljIHZvaWQgX19leGl0IGV4aXRfaXNvOTY2MF9mcyh2b2lkKVxcbi0tXFxuZnMvaXNvZnMvaW5vZGUuYy0xNjI4LSNpZmRlZiBDT05GSUdfWklTT0ZTXFxuZnMvaXNvZnMvaW5vZGUuYzoxNjI5OlxcdHppc29mc19jbGVhbnVwKCk7XFxuZnMvaXNvZnMvaW5vZGUuYy0xNjMwLSNlbmRpZlxcbi0tXFxuZnMvaXNvZnMvemlzb2ZzLmgtMTItI2lmZGVmIENPTkZJR19aSVNPRlNcXG5mcy9pc29mcy96aXNvZnMuaDoxMzpleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB6aXNvZnNfYW9wcztcXG5mcy9pc29mcy96aXNvZnMuaDoxNDpleHRlcm4gaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKTtcXG5mcy9pc29mcy96aXNvZnMuaDoxNTpleHRlcm4gdm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKTtcXG5mcy9pc29mcy96aXNvZnMuaC0xNi0jZW5kaWZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MDMuNTczNzA0NjM4WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjgxNjA5MDQ4MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFppc29mcyBGb2xpbyBDb252ZXJzaW9uIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSBoYXZlIGEgcGF0Y2ggdGhhdCdzIGNvbnZlcnRpbmcgdGhlIHppc29mcyBkZWNvbXByZXNzaW9uIGNvZGUgd2l0aGluIHRoZSBJU09GUyBmaWxlc3lzdGVtIChgZnMvaXNvZnMvY29tcHJlc3MuY2ApIGZyb20gdXNpbmcgcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIG9uZXMuIFRoaXMgaXMgYSBjb21tb24gYW5kIG9mdGVuIGJ1Zy1wcm9uZSBhcmVhIOKAkyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcGFnZSBjYWNoZSByZWZhY3RvcmluZyBpbiBmaWxlc3lzdGVtcyBpcyBhbHdheXMgd29ydGggYSBjbG9zZSBsb29rLlxuXG5GaXJzdCwgcmVhY2hhYmlsaXR5LiBDYW4gd2UgYWN0dWFsbHkgKmhpdCogdGhpcyBjb2RlIGluIGEgZnV6emluZyBlbnZpcm9ubWVudD8gQWJzb2x1dGVseS4gSVNPRlMgKGlzbzk2NjApIGlzIGVhc2lseSBtb3VudGVkIHZpYSBsb29wYmFjayBvciBzdGFuZGFyZCB2aXJ0dWFsIGJsb2NrIGRldmljZXMsIGxpa2UgdGhlIGVtdWxhdGVkIENELVJPTXMgaW4gUUVNVSBvciBHQ0UuICBTeXprYWxsZXIgY2FuIGV2ZW4gbW91bnQgaW50ZW50aW9uYWxseSBjb3JydXB0ZWQgSVNPIGltYWdlcyB3aXRoIHppc29mcyBjb21wcmVzc2lvbiwgd2hpY2ggaXMgYSBrZXkgYWR2YW50YWdlLiBUaGlzIGNvZGUgaXMgYWxzbyBwYXJ0IG9mIGEgY29yZSBWRlMvZmlsZXN5c3RlbSBkcml2ZXIsIGBpc29mc2AsIGFuZCBnZXRzIGJ1aWx0IHdoZW4gYENPTkZJR19JU085NjYwX0ZTYCBhbmQgYENPTkZJR19aSVNPRlNgIGFyZSBlbmFibGVkLlxuXG5OZXh0LCBpcyB0aGlzICp3b3J0aCogZnV6emluZz8gWWVzLCB3aXRob3V0IGEgZG91YnQuIFdlJ3JlIGRlYWxpbmcgd2l0aCByZWFjaGFibGUsIGV4ZWN1dGFibGUgY29kZSBpbiB0aGUgZmlsZXN5c3RlbSBkZWNvbXByZXNzaW9uIGxvZ2ljLiBUaGlzIHBhdGNoIGludm9sdmVzIHBhZ2UgY2FjaGUgbG9va3VwcywgbWFwcGluZ3MsIHplcm9pbmcsIGFuZCBidWZmZXIgaGFuZGxpbmcsIG5vdyB1c2luZyBmb2xpbyBlcXVpdmFsZW50cy4gVGhlIHBvdGVudGlhbCBmb3IgYnVncyBpcyBoaWdoLCBjb25zaWRlcmluZyB0aGUgcmVmYWN0b3JpbmcuICBUaGluayByZWZjb3VudGluZywgbG9ja2luZywgdW5tYXBwaW5nLCBhbmQgcmFjZSBjb25kaXRpb25zIOKAkyBhbGwgY2xhc3NpYyBmaWxlc3lzdGVtIHZ1bG5lcmFiaWxpdHkgcG9pbnRzLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcGFydDogZm9jdXMgc3ltYm9scy4gIFdoYXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBtb2RpZmllZD8gVGhlIHBhdGNoIHRvdWNoZXMgYHppc29mc191bmNvbXByZXNzX2Jsb2NrYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfcmVhZF9mb2xpb2AuICBJIGNvbmZpcm1lZCB0aGF0IGB6aXNvZnNfcmVhZF9mb2xpb2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGluIGB6aXNvZnNfYW9wc2AsIG1ha2luZyBpdCBhIHRhcmdldCwgYW5kIGB6aXNvZnNfZmlsbF9wYWdlc2AgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaW4gYSBDIGZpbGUgYXJlIHVzdWFsbHkgZGlzdGluY3Qgc3ltYm9scywgd2hpY2ggaGVscHMgd2l0aCB0YXJnZXRlZCBmdXp6aW5nLiBTbywgdGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBleGNlbGxlbnQgdGFyZ2V0cy5cblxuTGV0J3MgY2hlY2sgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBXZSBuZWVkIGBJU085NjYwX0ZTYCAoXCJJU08gOTY2MCBDRFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0XCIpIHdoaWNoIGlzIHRyaXN0YXRlLCBhbmQgYFpJU09GU2AgKFwiVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBleHRlbnNpb25cIikgd2hpY2ggZGVwZW5kcyBvbiB0aGUgZm9ybWVyIGFuZCBzZWxlY3RzIGBaTElCX0lORkxBVEVgLiBJIGRvdWJsZS1jaGVja2VkIHRoZSBgZnMvaXNvZnMvS2NvbmZpZ2AgdG8gYmUgc3VyZS4gSXQncyB0aG9zZSB0d28uXG5cbkZpbmFsbHksIGp1c3QgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBsZXQncyByZXZpc2l0IHRoZSBjaGFuZ2VzIGFnYWluLiBJdCdzIHRob3NlIHNhbWUgdGhyZWUgc3ltYm9sczogYHppc29mc19yZWFkX2ZvbGlvYCwgYHppc29mc19maWxsX3BhZ2VzYCwgYW5kIGB6aXNvZnNfdW5jb21wcmVzc19ibG9ja2AuIE5vIG90aGVyIHNpZ25pZmljYW50IGNoYW5nZXMuIEFsbCB0aHJlZSBhcmUgc3BlY2lmaWMgdG8gemlzb2ZzLlxuXG5Tbywgc3VtbWluZyB1cDogV29ydGhGdXp6aW5nIGlzIHRydWUuIEZvY3VzU3ltYm9scyBhcmUgW1wiemlzb2ZzX3JlYWRfZm9saW9cIiwgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLCBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJdLiBFbmFibGVDb25maWdzIGFyZSBbXCJJU085NjYwX0ZTXCIsIFwiWklTT0ZTXCJdLiBXZSBoYXZlIGEgY29uY2lzZSBleHBsYW5hdGlvbi4gVGltZSB0byBtb3ZlIG9uIGFuZCBzZXQgdGhlIHJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MzQ3LCJPdXRwdXRUb2tlbnMiOjE0NSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNDAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MTEuNzM0NjExOTg5WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODU4NTEwOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklTTzk2NjBfRlNcIixcbiAgICBcIlpJU09GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInppc29mc19yZWFkX2ZvbGlvXCIsXG4gICAgXCJ6aXNvZnNfZmlsbF9wYWdlc1wiLFxuICAgIFwiemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb252ZXJ0cyB6aXNvZnMgKHRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gc3VwcG9ydCBpbiBJU085NjYwIGZpbGVzeXN0ZW0pIGZyb20gcGFnZS1iYXNlZCBBUElzIHRvIGZvbGlvLWJhc2VkIEFQSXMgYWNyb3NzIHppc29mc19yZWFkX2ZvbGlvLCB6aXNvZnNfZmlsbF9wYWdlcywgYW5kIHppc29mc191bmNvbXByZXNzX2Jsb2NrLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIGFuZCBwYWdlIGNhY2hlIGRlY29tcHJlc3Npb24gbG9naWMgdGhhdCBjYW4gYmUgZXhlcmNpc2VkIGJ5IG1vdW50aW5nIGFuZCByZWFkaW5nIGNvbXByZXNzZWQgSVNPIGltYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJU085NjYwX0ZTXCIsXG4gICAgXCJaSVNPRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6aXNvZnNfcmVhZF9mb2xpb1wiLFxuICAgIFwiemlzb2ZzX2ZpbGxfcGFnZXNcIixcbiAgICBcInppc29mc191bmNvbXByZXNzX2Jsb2NrXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgemlzb2ZzICh0cmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaW4gSVNPOTY2MCBmaWxlc3lzdGVtKSBmcm9tIHBhZ2UtYmFzZWQgQVBJcyB0byBmb2xpby1iYXNlZCBBUElzIGFjcm9zcyB6aXNvZnNfcmVhZF9mb2xpbywgemlzb2ZzX2ZpbGxfcGFnZXMsIGFuZCB6aXNvZnNfdW5jb21wcmVzc19ibG9jay4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgZmlsZXN5c3RlbSBhbmQgcGFnZSBjYWNoZSBkZWNvbXByZXNzaW9uIGxvZ2ljIHRoYXQgY2FuIGJlIGV4ZXJjaXNlZCBieSBtb3VudGluZyBhbmQgcmVhZGluZyBjb21wcmVzc2VkIElTTyBpbWFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjExLjgyMDQ3MTk2OFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY1NDE0MjA0ODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoxMS44MjEwODEzNDhaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyNjU0MDgwNzMzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMzUwMzFmNjk3NWQzZTM1ZDhjMjY0ODE4YmU4NTEzOWUxMTIzYjkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTk6MjU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuY1xuaW5kZXggZjk4NjlkNjJiODUwOS4uMmQyM2FiYWViODc0MiAxMDA2NDRcbi0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbisrKyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmNcbkBAIC0zOSw3ICszOSw3IEBAIHN0YXRpYyBERUZJTkVfTVVURVgoemlzb2ZzX3psaWJfbG9jayk7XG4gICovXG4gc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXHRcdFx0XHQgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LFxuLVx0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgcG9mZnNldCxcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqKmZvbGlvcywgdW5zaWduZWQgaW50IHBvZmZzZXQsXG4gXHRcdFx0XHQgICAgICBpbnQgKmVycnApXG4ge1xuIFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XG5AQCAtNjYsMTEgKzY2LDEyIEBAIHN0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LFxuIFx0aWYgKGJsb2NrX3NpemUgPT0gMCkge1xuIFx0XHRmb3IgKCBpID0gMCA7IGkgXHUwMDNjIHBjb3VudCA7IGkrKyApIHtcbiBcdFx0XHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xuK1x0XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbaV07XG4gXG4tXHRcdFx0aWYgKCFwYWdlc1tpXSlcbitcdFx0XHRpZiAoIWZvbGlvKVxuIFx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0bWVtemVyb19wYWdlKHBhZ2VzW2ldLCBvZmYsIFBBR0VfU0laRSAtIG9mZik7XG4tXHRcdFx0U2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2ldKTtcbitcdFx0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmYsIGZvbGlvX3NpemUoZm9saW8pIC0gb2ZmKTtcbitcdFx0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdFx0fVxuIFx0XHRyZXR1cm4gKCgobG9mZl90KXBjb3VudCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpIC0gcG9mZnNldDtcbiBcdH1cbkBAIC0xMTksMTEgKzEyMCwxMiBAQCBzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcbiBcbiBcdHdoaWxlIChjdXJwYWdlIFx1MDAzYyBwY291bnQgXHUwMDI2XHUwMDI2IGN1cmJoIFx1MDAzYyBoYXZlYmxvY2tzIFx1MDAyNlx1MDAyNlxuIFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBmb2xpb3NbY3VycGFnZV07XG4rXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuLVx0XHRcdGlmIChwYWdlc1tjdXJwYWdlXSkge1xuLVx0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9wYWdlKHBhZ2VzW2N1cnBhZ2VdKVxuLVx0XHRcdFx0XHRcdCsgcG9mZnNldDtcbi1cdFx0XHRcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkUgLSBwb2Zmc2V0O1xuK1x0XHRcdGlmIChmb2xpbykge1xuK1x0XHRcdFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XG4rXHRcdFx0XHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xuIFx0XHRcdFx0cG9mZnNldCA9IDA7XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdHN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcbkBAIC0xNzMsOSArMTc1LDkgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gXG4gXHRcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xuIFx0XHRcdC8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi9cbi1cdFx0XHRpZiAocGFnZXNbY3VycGFnZV0pIHtcbi1cdFx0XHRcdGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2N1cnBhZ2VdKTtcbi1cdFx0XHRcdFNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7XG4rXHRcdFx0aWYgKGZvbGlvKSB7XG4rXHRcdFx0XHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xuK1x0XHRcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChzdHJlYW0ubmV4dF9vdXQgIT0gKHVuc2lnbmVkIGNoYXIgKil6aXNvZnNfc2lua19wYWdlKSB7XG4gXHRcdFx0XHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcbkBAIC0yMDYsNyArMjA4LDcgQEAgc3RhdGljIGxvZmZfdCB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYmxvY2tfc3RhcnQsXG4gICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLlxuICAqL1xuIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbi1cdFx0XHQgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpXG4rXHRcdFx0ICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MpXG4ge1xuIFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcbiBcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xuQEAgLTIyMSwxNCArMjIzLDE0IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdGludCBlcnI7XG4gXHRsb2ZmX3QgcmV0O1xuIFxuLVx0QlVHX09OKCFwYWdlc1tmdWxsX3BhZ2VdKTtcbitcdEJVR19PTighZm9saW9zW2Z1bGxfcGFnZV0pO1xuIFxuIFx0LypcbiBcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cbiBcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcbiBcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cbiBcdCAqL1xuLVx0c3RhcnRfb2ZmID0gcGFnZV9vZmZzZXQocGFnZXNbZnVsbF9wYWdlXSk7XG4rXHRzdGFydF9vZmYgPSBmb2xpb19wb3MoZm9saW9zW2Z1bGxfcGFnZV0pO1xuIFx0ZW5kX29mZiA9IG1pbl90KGxvZmZfdCwgc3RhcnRfb2ZmICsgUEFHRV9TSVpFLCBpbm9kZS1cdTAwM2VpX3NpemUpO1xuIFxuIFx0Y3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmIFx1MDAzZVx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XG5AQCAtMjY3LDkgKzI2OSw5IEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0fVxuIFx0XHRlcnIgPSAwO1xuIFx0XHRyZXQgPSB6aXNvZnNfdW5jb21wcmVzc19ibG9jayhpbm9kZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCxcbi1cdFx0XHRcdFx0ICAgICAgcGNvdW50LCBwYWdlcywgcG9mZnNldCwgXHUwMDI2ZXJyKTtcbitcdFx0XHRcdFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFx1MDAyNmVycik7XG4gXHRcdHBvZmZzZXQgKz0gcmV0O1xuLVx0XHRwYWdlcyArPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0XHRmb2xpb3MgKz0gcG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0cGNvdW50IC09IHBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRwb2Zmc2V0IFx1MDAyNj0gflBBR0VfTUFTSztcbkBAIC0yODksOSArMjkxLDExIEBAIHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcbiBcdFx0Y3N0YXJ0X2Jsb2NrKys7XG4gXHR9XG4gXG4tXHRpZiAocG9mZnNldCBcdTAwMjZcdTAwMjYgKnBhZ2VzKSB7XG4tXHRcdG1lbXplcm9fcGFnZSgqcGFnZXMsIHBvZmZzZXQsIFBBR0VfU0laRSAtIHBvZmZzZXQpO1xuLVx0XHRTZXRQYWdlVXB0b2RhdGUoKnBhZ2VzKTtcbitcdGlmIChwb2Zmc2V0IFx1MDAyNlx1MDAyNiAqZm9saW9zKSB7XG4rXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSAqZm9saW9zO1xuK1xuK1x0XHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBwb2Zmc2V0LCBmb2xpb19zaXplKGZvbGlvKSAtIHBvZmZzZXQpO1xuK1x0XHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbiBcdH1cbiBcdGJyZWxzZShiaCk7XG4gXHRyZXR1cm4gMDtcbkBAIC0zMTIsNyArMzE2LDcgQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XG4gXHRcdFBBR0VfU0hJRlQgXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQgP1xuIFx0XHQoMSBcdTAwM2NcdTAwM2MgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfU0hJRlQpKSA6IDA7XG4tXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuK1x0c3RydWN0IGZvbGlvICoqZm9saW9zO1xuIFx0cGdvZmZfdCBpbmRleCA9IGZvbGlvLVx1MDAzZWluZGV4LCBlbmRfaW5kZXg7XG4gXG4gXHRlbmRfaW5kZXggPSAoaW5vZGUtXHUwMDNlaV9zaXplICsgUEFHRV9TSVpFIC0gMSkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG5AQCAtMzM2LDMzICszNDAsMzggQEAgc3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0ZnVsbF9wYWdlID0gMDtcbiBcdFx0cGNvdW50ID0gMTtcbiBcdH1cbi1cdHBhZ2VzID0ga3phbGxvY19vYmpzKCpwYWdlcyxcbi1cdFx0XHQgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbi1cdGlmICghcGFnZXMpIHtcbitcdGZvbGlvcyA9IGt6YWxsb2Nfb2JqcygqZm9saW9zLFxuK1x0XHRcdCAgICAgIG1heF90KHVuc2lnbmVkIGludCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpKTtcbitcdGlmICghZm9saW9zKSB7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFx0fVxuLVx0cGFnZXNbZnVsbF9wYWdlXSA9IFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2U7XG4rXHRmb2xpb3NbZnVsbF9wYWdlXSA9IGZvbGlvO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpKyssIGluZGV4KyspIHtcbi1cdFx0aWYgKGkgIT0gZnVsbF9wYWdlKVxuLVx0XHRcdHBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChtYXBwaW5nLCBpbmRleCk7XG4rXHRcdGlmIChpID09IGZ1bGxfcGFnZSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9saW9zW2ldID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBpbmRleCxcbitcdFx0XHRcdEZHUF9MT0NLIHwgRkdQX0NSRUFUIHwgRkdQX05PV0FJVCxcbitcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuK1x0XHRpZiAoSVNfRVJSKGZvbGlvc1tpXSkpXG4rXHRcdFx0Zm9saW9zW2ldID0gTlVMTDtcbiBcdH1cbiBcbi1cdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgcGFnZXMpO1xuK1x0ZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBmb2xpb3MpO1xuIFxuLVx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgcGFnZXMsIGRvIG5vdCBTZXRQYWdlVXB0b2RhdGUgKi9cbitcdC8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIGZvbGlvcywgZG8gbm90IG1hcmsgdGhlbSB1cHRvZGF0ZSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcGNvdW50OyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VzW2ldKSB7XG4tXHRcdFx0Zmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pO1xuLVx0XHRcdHVubG9ja19wYWdlKHBhZ2VzW2ldKTtcbitcdFx0aWYgKGZvbGlvc1tpXSkge1xuK1x0XHRcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpb3NbaV0pO1xuIFx0XHRcdGlmIChpICE9IGZ1bGxfcGFnZSlcbi1cdFx0XHRcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcbitcdFx0XHRcdGZvbGlvX3B1dChmb2xpb3NbaV0pO1xuIFx0XHR9XG4tXHR9XHRcdFx0XG4rXHR9XG4gXG4gXHQvKiBBdCB0aGlzIHBvaW50LCBlcnIgY29udGFpbnMgMCBvciAtRUlPIGRlcGVuZGluZyBvbiB0aGUgXCJjcml0aWNhbFwiIHBhZ2UgKi9cbi1cdGtmcmVlKHBhZ2VzKTtcbitcdGtmcmVlKGZvbGlvcyk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjExLjgyMTA4MjY3N1oiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMDg1Mzk3MjEyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIHppc29mcyBGb2xpbyBDb252ZXJzaW9uKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgcHJlY2lzZWx5IGhvdyB0aGlzIGNvbnZlcnNpb24gZnJvbSBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gIGluIGBmcy9pc29mcy9jb21wcmVzcy5jYCBpbXBhY3RzIHRoZSB6aXNvZnMgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgcG90ZW50aWFsbHkgY3JpdGljYWwgY2hhbmdlLCBzbyBJJ20gZ29pbmcgdG8gc2NydXRpbml6ZSB0aGUgY29kZSBtZXRpY3Vsb3VzbHkuXG5cbkZpcnN0LCBJIG5lZWQgdG8gcmVhZCBgZnMvaXNvZnMvY29tcHJlc3MuY2AsIGZvY3VzaW5nIHBhcnRpY3VsYXJseSBvbiB0aGUgYXJlYXMgYXJvdW5kIHRoZSBsaW5lcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIHNhZmV0eTsgSSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgYSBwdXJlIGZvbGlvIGNvbnZlcnNpb24uIFRoZXJlJ3MgYWx3YXlzIHRoZSByaXNrLCBob3dldmVyIHNtYWxsLCBvZiBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgYSBwb3RlbnRpYWwgaW5mb3JtYXRpb24gbGVhayBkdXJpbmcgc3VjaCBhIHJlZmFjdG9yaW5nLCBzbyBJJ2xsIGJlIHBhcnRpY3VsYXJseSB2aWdpbGFudCBpbiBzZWFyY2hpbmcgZm9yIHRob3NlIGtpbmRzIG9mIGlzc3Vlcy4gTGV0J3Mgc2VlIHdoYXQncyBjaGFuZ2VkIGFuZCBjb25maXJtIHRoYXQgbm90aGluZyBoYXMgYmVlbiBtaXNzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyMzMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoyMi42NzUwNTg1NjZaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA4NDcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcXG4gICAyOlxcdC8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcXG4gICAzOlxcdCAqICAgXFxuICAgNDpcXHQgKiAgIENvcHlyaWdodCAyMDAxIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZFxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXFxuICAgNzpcXHRcXG4gICA4OlxcdC8qXFxuICAgOTpcXHQgKiBsaW51eC9mcy9pc29mcy9jb21wcmVzcy5jXFxuICAxMDpcXHQgKlxcbiAgMTE6XFx0ICogVHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBvbiBhbiBpc285NjYwIGZpbGVzeXN0ZW1cXG4gIDEyOlxcdCAqL1xcbiAgMTM6XFx0XFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAgMTY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jpby5oXFx1MDAzZVxcbiAgMTc6XFx0XFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgMTk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtYWxsb2MuaFxcdTAwM2VcXG4gIDIwOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC96bGliLmhcXHUwMDNlXFxuICAyMTpcXHRcXG4gIDIyOlxcdCNpbmNsdWRlIFxcXCJpc29mcy5oXFxcIlxcbiAgMjM6XFx0I2luY2x1ZGUgXFxcInppc29mcy5oXFxcIlxcbiAgMjQ6XFx0XFxuICAyNTpcXHQvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBnbG9iYWwuICovXFxuICAyNjpcXHRzdGF0aWMgY2hhciB6aXNvZnNfc2lua19wYWdlW1BBR0VfU0laRV07XFxuICAyNzpcXHRcXG4gIDI4OlxcdC8qXFxuICAyOTpcXHQgKiBUaGlzIGNvbnRhaW5zIHRoZSB6bGliIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0aGUgbXV0ZXggZm9yIHRoZVxcbiAgMzA6XFx0ICogYWxsb2NhdGlvbjsgdGhpcyBhdm9pZHMgZmFpbHVyZXMgYXQgYmxvY2stZGVjb21wcmVzc2lvbiB0aW1lLlxcbiAgMzE6XFx0ICovXFxuICAzMjpcXHRzdGF0aWMgdm9pZCAqemlzb2ZzX3psaWJfd29ya3NwYWNlO1xcbiAgMzM6XFx0c3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0LypcXG4gIDM2OlxcdCAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzc1xcbiAgMzc6XFx0ICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnRcXG4gIDM4OlxcdCAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLlxcbiAgMzk6XFx0ICovXFxuICA0MDpcXHRzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCxcXG4gIDQxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsXFxuICA0MjpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKipmb2xpb3MsIHVuc2lnbmVkIGludCBwb2Zmc2V0LFxcbiAgNDM6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW50ICplcnJwKVxcbiAgNDQ6XFx0e1xcbiAgNDU6XFx0XFx0dW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLVxcdTAwM2VpX2Zvcm1hdF9wYXJtWzFdO1xcbiAgNDY6XFx0XFx0dW5zaWduZWQgaW50IGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7XFxuICA0NzpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuICA0ODpcXHRcXHR1bnNpZ25lZCBpbnQgYnVmbWFzayA9IGJ1ZnNpemUgLSAxO1xcbiAgNDk6XFx0XFx0aW50IGksIGJsb2NrX3NpemUgPSBibG9ja19lbmQgLSBibG9ja19zdGFydDtcXG4gIDUwOlxcdFxcdHpfc3RyZWFtIHN0cmVhbSA9IHsgLnRvdGFsX291dCA9IDAsXFxuICA1MTpcXHRcXHRcXHRcXHQgICAgLmF2YWlsX2luID0gMCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgICAuYXZhaWxfb3V0ID0gMCwgfTtcXG4gIDUzOlxcdFxcdGludCB6ZXJyO1xcbiAgNTQ6XFx0XFx0aW50IG5lZWRibG9ja3MgPSAoYmxvY2tfc2l6ZSArIChibG9ja19zdGFydCBcXHUwMDI2IGJ1Zm1hc2spICsgYnVmbWFzaylcXG4gIDU1OlxcdFxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgNTY6XFx0XFx0aW50IGhhdmVibG9ja3M7XFxuICA1NzpcXHRcXHRibGtjbnRfdCBibG9ja251bTtcXG4gIDU4OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocztcXG4gIDU5OlxcdFxcdGludCBjdXJiaCwgY3VycGFnZTtcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0aWYgKGJsb2NrX3NpemUgXFx1MDAzZSBkZWZsYXRlQm91bmQoMVVMIFxcdTAwM2NcXHUwMDNjIHppc29mc19ibG9ja19zaGlmdCkpIHtcXG4gIDYyOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gIDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgNjQ6XFx0XFx0fVxcbiAgNjU6XFx0XFx0LyogRW1wdHkgYmxvY2s/ICovXFxuICA2NjpcXHRcXHRpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7XFxuICA2NzpcXHRcXHRcXHRmb3IgKCBpID0gMCA7IGkgXFx1MDAzYyBwY291bnQgOyBpKysgKSB7XFxuICA2ODpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgb2ZmID0gaSA/IDAgOiBwb2Zmc2V0O1xcbiAgNjk6XFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IGZvbGlvc1tpXTtcXG4gIDcwOlxcdFxcbiAgNzE6XFx0XFx0XFx0XFx0aWYgKCFmb2xpbylcXG4gIDcyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAgNzM6XFx0XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2ZmLCBmb2xpb19zaXplKGZvbGlvKSAtIG9mZik7XFxuICA3NDpcXHRcXHRcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG4gIDc1OlxcdFxcdFxcdH1cXG4gIDc2OlxcdFxcdFxcdHJldHVybiAoKChsb2ZmX3QpcGNvdW50KSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSAtIHBvZmZzZXQ7XFxuICA3NzpcXHRcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdFxcdC8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovXFxuICA4MDpcXHRcXHRibG9ja251bSA9IGJsb2NrX3N0YXJ0IFxcdTAwM2VcXHUwMDNlIGJ1ZnNoaWZ0O1xcbiAgODE6XFx0XFx0YmhzID0ga3phbGxvY19vYmpzKCpiaHMsIG5lZWRibG9ja3MgKyAxKTtcXG4gIDgyOlxcdFxcdGlmICghYmhzKSB7XFxuICA4MzpcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuICA4NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDg1OlxcdFxcdH1cXG4gIDg2OlxcdFxcdGhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTtcXG4gIDg3OlxcdFxcdGJoX3JlYWRfYmF0Y2goaGF2ZWJsb2NrcywgYmhzKTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0Y3VyYmggPSAwO1xcbiAgOTA6XFx0XFx0Y3VycGFnZSA9IDA7XFxuICA5MTpcXHRcXHQvKlxcbiAgOTI6XFx0XFx0ICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3JcXG4gIDkzOlxcdFxcdCAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudFxcbiAgOTQ6XFx0XFx0ICogYmxvY2tzIGFyZSBnb2luZyB0byBjb21lIGluIGluIHNob3J0IG9yZGVyIHNvIHdlIGRvbid0IGhvbGQgdGhlIHpsaWJcXG4gIDk1OlxcdFxcdCAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS5cXG4gIDk2OlxcdFxcdCAqL1xcbiAgOTc6XFx0XFxuICA5ODpcXHRcXHRpZiAoIWJoc1swXSlcXG4gIDk5OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwMDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjIuNjc1MTY5NTI2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMDc0MDc1NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUgd2UgZ28uLi5cblxuKipEaXZpbmcgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoaXMgZmlsZS4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIElTT0ZTIGNvbXByZXNzaW9uIGlzIGltcGxlbWVudGVkLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIGdyYXNwIG9uIHRoZSBicm9hZGVyIGZpbGUgc3lzdGVtIHN0cnVjdHVyZSBhbmQgdGhlIElTTyA5NjYwIHN0YW5kYXJkLCBidXQgdGhlIGNvbXByZXNzaW9uIGFzcGVjdCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIHJlZnJlc2guIFdoYXQgc3BlY2lmaWMgYWxnb3JpdGhtcyBhcmUgaW4gdXNlPyBIb3cgYXJlIHRoZXkgaW50ZWdyYXRlZCB3aXRoaW4gdGhlIEkvTyBvcGVyYXRpb25zPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIEkgc2hvdWxkIGJlIGF3YXJlIG9mLCBvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9uIGFyZWFzPyBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgY29tcHJlc3Npb24gYWZmZWN0cyByZWFkIGFuZCB3cml0ZSBwYXRocy4gSSdsbCBiZSBsb29raW5nIGZvciB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGRlL2NvbXByZXNzaW9uLCBhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSdzIG1ldGFkYXRhIGlzIG1vZGlmaWVkIHRvIHN0b3JlIGNvbXByZXNzZWQgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBmaWxlIHN5c3RlbSBwcmVzZW50cyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB1c2VyLiBJJ2xsIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIHN0cnVjdHVyZXMgb3IgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSBhIGZpbGUncyBjb21wcmVzc2VkIHN0YXRlLiBMZXQncyBzZWUgd2hhdCBpbnRlcmVzdGluZyB0ZWNobmlxdWVzIHRoZSBkZXZlbG9wZXJzIHV0aWxpemVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDA4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjoyNC45ODI1ODA1NloiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDMyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9pc29mcy9jb21wcmVzcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDE6XFx0XFx0d2FpdF9vbl9idWZmZXIoYmhzWzBdKTtcXG4gMTAyOlxcdFxcdGlmICghYnVmZmVyX3VwdG9kYXRlKGJoc1swXSkpIHtcXG4gMTAzOlxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTA0OlxcdFxcdFxcdGdvdG8gYl9laW87XFxuIDEwNTpcXHRcXHR9XFxuIDEwNjpcXHRcXG4gMTA3OlxcdFxcdHN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7XFxuIDEwODpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZ6aXNvZnNfemxpYl9sb2NrKTtcXG4gMTA5OlxcdFxcdFxcdFxcbiAxMTA6XFx0XFx0emVyciA9IHpsaWJfaW5mbGF0ZUluaXQoXFx1MDAyNnN0cmVhbSk7XFxuIDExMTpcXHRcXHRpZiAoemVyciAhPSBaX09LKSB7XFxuIDExMjpcXHRcXHRcXHRpZiAoemVyciA9PSBaX01FTV9FUlJPUilcXG4gMTEzOlxcdFxcdFxcdFxcdCplcnJwID0gLUVOT01FTTtcXG4gMTE0OlxcdFxcdFxcdGVsc2VcXG4gMTE1OlxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTE2OlxcdFxcdFxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxcXFxuXFxcIixcXG4gMTE3OlxcdFxcdFxcdFxcdCAgICAgICB6ZXJyKTtcXG4gMTE4OlxcdFxcdFxcdGdvdG8gel9laW87XFxuIDExOTpcXHRcXHR9XFxuIDEyMDpcXHRcXG4gMTIxOlxcdFxcdHdoaWxlIChjdXJwYWdlIFxcdTAwM2MgcGNvdW50IFxcdTAwMjZcXHUwMDI2IGN1cmJoIFxcdTAwM2MgaGF2ZWJsb2NrcyBcXHUwMDI2XFx1MDAyNlxcbiAxMjI6XFx0XFx0ICAgICAgIHplcnIgIT0gWl9TVFJFQU1fRU5EKSB7XFxuIDEyMzpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZm9saW9zW2N1cnBhZ2VdO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHtcXG4gMTI2OlxcdFxcdFxcdFxcdGlmIChmb2xpbykge1xcbiAxMjc6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgcG9mZnNldCk7XFxuIDEyODpcXHRcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfb3V0ID0gZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0O1xcbiAxMjk6XFx0XFx0XFx0XFx0XFx0cG9mZnNldCA9IDA7XFxuIDEzMDpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiAxMzE6XFx0XFx0XFx0XFx0XFx0c3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKilcXHUwMDI2emlzb2ZzX3NpbmtfcGFnZTtcXG4gMTMyOlxcdFxcdFxcdFxcdFxcdHN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX1NJWkU7XFxuIDEzMzpcXHRcXHRcXHRcXHR9XFxuIDEzNDpcXHRcXHRcXHR9XFxuIDEzNTpcXHRcXHRcXHRpZiAoIXN0cmVhbS5hdmFpbF9pbikge1xcbiAxMzY6XFx0XFx0XFx0XFx0d2FpdF9vbl9idWZmZXIoYmhzW2N1cmJoXSk7XFxuIDEzNzpcXHRcXHRcXHRcXHRpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbY3VyYmhdKSkge1xcbiAxMzg6XFx0XFx0XFx0XFx0XFx0KmVycnAgPSAtRUlPO1xcbiAxMzk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MDpcXHRcXHRcXHRcXHR9XFxuIDE0MTpcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9pbiAgPSBiaHNbY3VyYmhdLVxcdTAwM2ViX2RhdGEgK1xcbiAxNDI6XFx0XFx0XFx0XFx0XFx0XFx0XFx0KGJsb2NrX3N0YXJ0IFxcdTAwMjYgYnVmbWFzayk7XFxuIDE0MzpcXHRcXHRcXHRcXHRzdHJlYW0uYXZhaWxfaW4gPSBtaW5fdCh1bnNpZ25lZCwgYnVmc2l6ZSAtXFxuIDE0NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQoYmxvY2tfc3RhcnQgXFx1MDAyNiBidWZtYXNrKSxcXG4gMTQ1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGJsb2NrX3NpemUpO1xcbiAxNDY6XFx0XFx0XFx0XFx0YmxvY2tfc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47XFxuIDE0NzpcXHRcXHRcXHRcXHRibG9ja19zdGFydCA9IDA7XFxuIDE0ODpcXHRcXHRcXHR9XFxuIDE0OTpcXHRcXG4gMTUwOlxcdFxcdFxcdHdoaWxlIChzdHJlYW0uYXZhaWxfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5hdmFpbF9pbikge1xcbiAxNTE6XFx0XFx0XFx0XFx0emVyciA9IHpsaWJfaW5mbGF0ZShcXHUwMDI2c3RyZWFtLCBaX1NZTkNfRkxVU0gpO1xcbiAxNTI6XFx0XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9CVUZfRVJST1IgXFx1MDAyNlxcdTAwMjYgc3RyZWFtLmF2YWlsX2luID09IDApXFxuIDE1MzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU0OlxcdFxcdFxcdFxcdGlmICh6ZXJyID09IFpfU1RSRUFNX0VORClcXG4gMTU1OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTY6XFx0XFx0XFx0XFx0aWYgKHplcnIgIT0gWl9PSykge1xcbiAxNTc6XFx0XFx0XFx0XFx0XFx0LyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqL1xcbiAxNTg6XFx0XFx0XFx0XFx0XFx0aWYgKHplcnIgPT0gWl9NRU1fRVJST1IpXFxuIDE1OTpcXHRcXHRcXHRcXHRcXHRcXHQqZXJycCA9IC1FTk9NRU07XFxuIDE2MDpcXHRcXHRcXHRcXHRcXHRlbHNlIHtcXG4gMTYxOlxcdFxcdFxcdFxcdFxcdFxcdHByaW50ayhLRVJOX0RFQlVHXFxuIDE2MjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWRcXFwiXFxuIDE2MzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgXFxcIiAlZCwgaW5vZGUgPSAlbGx1LFxcXCJcXG4gMTY0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIHBhZ2UgaWR4ID0gJWQsIGJoIGlkeCA9ICVkLFxcXCJcXG4gMTY1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIGF2YWlsX2luID0gJWxkLFxcXCJcXG4gMTY2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXFwiIGF2YWlsX291dCA9ICVsZFxcXFxuXFxcIixcXG4gMTY3OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICB6ZXJyLCBpbm9kZS1cXHUwMDNlaV9pbm8sIGN1cnBhZ2UsXFxuIDE2ODpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgY3VyYmgsIHN0cmVhbS5hdmFpbF9pbixcXG4gMTY5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJlYW0uYXZhaWxfb3V0KTtcXG4gMTcwOlxcdFxcdFxcdFxcdFxcdFxcdCplcnJwID0gLUVJTztcXG4gMTcxOlxcdFxcdFxcdFxcdFxcdH1cXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGdvdG8gaW5mbGF0ZV9vdXQ7XFxuIDE3MzpcXHRcXHRcXHRcXHR9XFxuIDE3NDpcXHRcXHRcXHR9XFxuIDE3NTpcXHRcXG4gMTc2OlxcdFxcdFxcdGlmICghc3RyZWFtLmF2YWlsX291dCkge1xcbiAxNzc6XFx0XFx0XFx0XFx0LyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqL1xcbiAxNzg6XFx0XFx0XFx0XFx0aWYgKGZvbGlvKSB7XFxuIDE3OTpcXHRcXHRcXHRcXHRcXHRmbHVzaF9kY2FjaGVfZm9saW8oZm9saW8pO1xcbiAxODA6XFx0XFx0XFx0XFx0XFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XFxuIDE4MTpcXHRcXHRcXHRcXHR9XFxuIDE4MjpcXHRcXHRcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0ICE9ICh1bnNpZ25lZCBjaGFyICopemlzb2ZzX3NpbmtfcGFnZSkge1xcbiAxODM6XFx0XFx0XFx0XFx0XFx0a3VubWFwX2xvY2FsKHN0cmVhbS5uZXh0X291dCk7XFxuIDE4NDpcXHRcXHRcXHRcXHRcXHRzdHJlYW0ubmV4dF9vdXQgPSBOVUxMO1xcbiAxODU6XFx0XFx0XFx0XFx0fVxcbiAxODY6XFx0XFx0XFx0XFx0Y3VycGFnZSsrO1xcbiAxODc6XFx0XFx0XFx0fVxcbiAxODg6XFx0XFx0XFx0aWYgKCFzdHJlYW0uYXZhaWxfaW4pXFxuIDE4OTpcXHRcXHRcXHRcXHRjdXJiaCsrO1xcbiAxOTA6XFx0XFx0fVxcbiAxOTE6XFx0aW5mbGF0ZV9vdXQ6XFxuIDE5MjpcXHRcXHR6bGliX2luZmxhdGVFbmQoXFx1MDAyNnN0cmVhbSk7XFxuIDE5MzpcXHRcXHRpZiAoc3RyZWFtLm5leHRfb3V0IFxcdTAwMjZcXHUwMDI2IHN0cmVhbS5uZXh0X291dCAhPSAodW5zaWduZWQgY2hhciAqKXppc29mc19zaW5rX3BhZ2UpXFxuIDE5NDpcXHRcXHRcXHRrdW5tYXBfbG9jYWwoc3RyZWFtLm5leHRfb3V0KTtcXG4gMTk1OlxcdFxcbiAxOTY6XFx0el9laW86XFxuIDE5NzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnppc29mc196bGliX2xvY2spO1xcbiAxOTg6XFx0XFxuIDE5OTpcXHRiX2VpbzpcXG4gMjAwOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBoYXZlYmxvY2tzOyBpKyspXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjI0Ljk4MjY3NjkyWiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5MDAxMDcyODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyB0aGUgc3VtbWFyeSwgcmVuZGVyZWQgYXMgaWYgSSdtIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGlnZ2luZyBEZWVwZXIgaW50byBgZnMvaXNvZnMvY29tcHJlc3MuY2AqKlxuXG5BbHJpZ2h0LCBJJ3ZlIGdvdCBhIGhhbmRsZSBvbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoaXMgZmlsZSwgYnV0IHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gZXhwYW5kIG15IHNjb3BlLiBMZXQncyBub3QganVzdCBhc3N1bWUgSSd2ZSBzZWVuIGVub3VnaCwgZXZlbiBpZiBJICp0aGluayogSSdtIGdldHRpbmcgdGhlIGdpc3Qgb2YgdGhpbmdzLiBJJ20gYW4gZXhwZXJ0LCB5ZXMsIGJ1dCBleHBlcnRpc2UgbWVhbnMga25vd2luZyB3aGVyZSB0byBsb29rIGFuZCB3aGF0IHRvIGNvbnNpZGVyLCBub3QgbmVjZXNzYXJpbHkgcnVzaGluZyB0byBqdWRnZW1lbnQuIEkgbmVlZCBhIHByb3BlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBlbnRpcmUgZmlsZS4gU28sIEkgbmVlZCB0byBtb3ZlIHBhc3QgdGhlIGluaXRpYWwgc2VjdGlvbiwgYW5kIHJlYWxseSBhbmFseXplIHRoZSByZXN0IG9mIGBmcy9pc29mcy9jb21wcmVzcy5jYC4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgY29kZTsgaXQncyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaW4gdGhlIElTT0ZTIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZ1bmN0aW9ucy4gTGV0J3Mgc2VlIHdoYXQgZWxzZSB0aGlzIHNlY3Rpb24gbWlnaHQgaG9sZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc3MSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjYuODgyNzk2NzdaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIzNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIwMTpcXHRcXHRcXHRicmVsc2UoYmhzW2ldKTtcXG4gMjAyOlxcdFxcdGtmcmVlKGJocyk7XFxuIDIwMzpcXHRcXHRyZXR1cm4gc3RyZWFtLnRvdGFsX291dDtcXG4gMjA0OlxcdH1cXG4gMjA1OlxcdFxcbiAyMDY6XFx0LypcXG4gMjA3OlxcdCAqIFVuY29tcHJlc3MgZGF0YSBzbyB0aGF0IHBhZ2VzW2Z1bGxfcGFnZV0gaXMgZnVsbHkgdXB0b2RhdGUgYW5kIHBvc3NpYmx5XFxuIDIwODpcXHQgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uXFxuIDIwOTpcXHQgKi9cXG4gMjEwOlxcdHN0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCxcXG4gMjExOlxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGZvbGlvICoqZm9saW9zKVxcbiAyMTI6XFx0e1xcbiAyMTM6XFx0XFx0bG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjtcXG4gMjE0OlxcdFxcdGxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kO1xcbiAyMTU6XFx0XFx0dW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMF07XFxuIDIxNjpcXHRcXHR1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktXFx1MDAzZWlfZm9ybWF0X3Bhcm1bMV07XFxuIDIxNzpcXHRcXHR1bnNpZ25lZCBpbnQgYmxvY2twdHI7XFxuIDIxODpcXHRcXHRsb2ZmX3QgcG9mZnNldCA9IDA7XFxuIDIxOTpcXHRcXHRibGtjbnRfdCBjc3RhcnRfYmxvY2ssIGNlbmRfYmxvY2s7XFxuIDIyMDpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAyMjE6XFx0XFx0dW5zaWduZWQgaW50IGJsa2JpdHMgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7XFxuIDIyMjpcXHRcXHR1bnNpZ25lZCBpbnQgYmxrc2l6ZSA9IDEgXFx1MDAzY1xcdTAwM2MgYmxrYml0cztcXG4gMjIzOlxcdFxcdGludCBlcnI7XFxuIDIyNDpcXHRcXHRsb2ZmX3QgcmV0O1xcbiAyMjU6XFx0XFxuIDIyNjpcXHRcXHRCVUdfT04oIWZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gMjI3OlxcdFxcbiAyMjg6XFx0XFx0LypcXG4gMjI5OlxcdFxcdCAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG9cXG4gMjMwOlxcdFxcdCAqIHVuY29tcHJlc3MgdGhlIHdob2xlIGNvbXByZXNzaW9uIGJsb2NrIGFueXdheSwgZmlsbCB0aGUgc3Vycm91bmRpbmdcXG4gMjMxOlxcdFxcdCAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi5cXG4gMjMyOlxcdFxcdCAqL1xcbiAyMzM6XFx0XFx0c3RhcnRfb2ZmID0gZm9saW9fcG9zKGZvbGlvc1tmdWxsX3BhZ2VdKTtcXG4gMjM0OlxcdFxcdGVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiArIFBBR0VfU0laRSwgaW5vZGUtXFx1MDAzZWlfc2l6ZSk7XFxuIDIzNTpcXHRcXG4gMjM2OlxcdFxcdGNzdGFydF9ibG9jayA9IHN0YXJ0X29mZiBcXHUwMDNlXFx1MDAzZSB6aXNvZnNfYmxvY2tfc2hpZnQ7XFxuIDIzNzpcXHRcXHRjZW5kX2Jsb2NrID0gKGVuZF9vZmYgKyAoMSBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSlcXG4gMjM4OlxcdFxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIHppc29mc19ibG9ja19zaGlmdDtcXG4gMjM5OlxcdFxcbiAyNDA6XFx0XFx0V0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpICE9XFxuIDI0MTpcXHRcXHRcXHQoKGNzdGFydF9ibG9jayBcXHUwMDNjXFx1MDAzYyB6aXNvZnNfYmxvY2tfc2hpZnQpIFxcdTAwMjYgUEFHRV9NQVNLKSk7XFxuIDI0MjpcXHRcXG4gMjQzOlxcdFxcdC8qIEZpbmQgdGhlIHBvaW50ZXIgdG8gdGhpcyBzcGVjaWZpYyBjaHVuayAqL1xcbiAyNDQ6XFx0XFx0LyogTm90ZTogd2UncmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqL1xcbiAyNDU6XFx0XFx0LyogTm90ZTogaGVhZGVyX3NpemUgaXMgaW4gMzItYml0IHdvcmRzICg0IGJ5dGVzKSAqL1xcbiAyNDY6XFx0XFx0YmxvY2twdHIgPSAoaGVhZGVyX3NpemUgKyBjc3RhcnRfYmxvY2spIFxcdTAwM2NcXHUwMDNjIDI7XFxuIDI0NzpcXHRcXHRiaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9ja3B0ciBcXHUwMDNlXFx1MDAzZSBibGtiaXRzKTtcXG4gMjQ4OlxcdFxcdGlmICghYmgpXFxuIDI0OTpcXHRcXHRcXHRyZXR1cm4gLUVJTztcXG4gMjUwOlxcdFxcdGJsb2NrX3N0YXJ0ID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdChiaC1cXHUwMDNlYl9kYXRhICsgKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcXG4gMjUyOlxcdFxcbiAyNTM6XFx0XFx0d2hpbGUgKGNzdGFydF9ibG9jayBcXHUwMDNjIGNlbmRfYmxvY2sgXFx1MDAyNlxcdTAwMjYgcGNvdW50IFxcdTAwM2UgMCkge1xcbiAyNTQ6XFx0XFx0XFx0LyogTG9hZCBlbmQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgaW4gdGhlIGZpbGUgKi9cXG4gMjU1OlxcdFxcdFxcdGJsb2NrcHRyICs9IDQ7XFxuIDI1NjpcXHRcXHRcXHQvKiBUcmF2ZXJzZWQgdG8gbmV4dCBibG9jaz8gKi9cXG4gMjU3OlxcdFxcdFxcdGlmICghKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpIHtcXG4gMjU4OlxcdFxcdFxcdFxcdGJyZWxzZShiaCk7XFxuIDI1OTpcXHRcXG4gMjYwOlxcdFxcdFxcdFxcdGJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyIFxcdTAwM2VcXHUwMDNlIGJsa2JpdHMpO1xcbiAyNjE6XFx0XFx0XFx0XFx0aWYgKCFiaClcXG4gMjYyOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNjM6XFx0XFx0XFx0fVxcbiAyNjQ6XFx0XFx0XFx0YmxvY2tfZW5kID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilcXG4gMjY1OlxcdFxcdFxcdFxcdFxcdChiaC1cXHUwMDNlYl9kYXRhICsgKGJsb2NrcHRyIFxcdTAwMjYgKGJsa3NpemUgLSAxKSkpKTtcXG4gMjY2OlxcdFxcdFxcdGlmIChibG9ja19zdGFydCBcXHUwMDNlIGJsb2NrX2VuZCkge1xcbiAyNjc6XFx0XFx0XFx0XFx0YnJlbHNlKGJoKTtcXG4gMjY4OlxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiAyNjk6XFx0XFx0XFx0fVxcbiAyNzA6XFx0XFx0XFx0ZXJyID0gMDtcXG4gMjcxOlxcdFxcdFxcdHJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLFxcbiAyNzI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgcGNvdW50LCBmb2xpb3MsIHBvZmZzZXQsIFxcdTAwMjZlcnIpO1xcbiAyNzM6XFx0XFx0XFx0cG9mZnNldCArPSByZXQ7XFxuIDI3NDpcXHRcXHRcXHRmb2xpb3MgKz0gcG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzU6XFx0XFx0XFx0cGNvdW50IC09IHBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gMjc2OlxcdFxcdFxcdGZ1bGxfcGFnZSAtPSBwb2Zmc2V0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDI3NzpcXHRcXHRcXHRwb2Zmc2V0IFxcdTAwMjY9IH5QQUdFX01BU0s7XFxuIDI3ODpcXHRcXG4gMjc5OlxcdFxcdFxcdGlmIChlcnIpIHtcXG4gMjgwOlxcdFxcdFxcdFxcdGJyZWxzZShiaCk7XFxuIDI4MTpcXHRcXHRcXHRcXHQvKlxcbiAyODI6XFx0XFx0XFx0XFx0ICogRGlkIHdlIGZpbmlzaCByZWFkaW5nIHRoZSBwYWdlIHdlIHJlYWxseSB3YW50ZWRcXG4gMjgzOlxcdFxcdFxcdFxcdCAqIHRvIHJlYWQ/XFxuIDI4NDpcXHRcXHRcXHRcXHQgKi9cXG4gMjg1OlxcdFxcdFxcdFxcdGlmIChmdWxsX3BhZ2UgXFx1MDAzYyAwKVxcbiAyODY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDI4NzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAyODg6XFx0XFx0XFx0fVxcbiAyODk6XFx0XFxuIDI5MDpcXHRcXHRcXHRibG9ja19zdGFydCA9IGJsb2NrX2VuZDtcXG4gMjkxOlxcdFxcdFxcdGNzdGFydF9ibG9jaysrO1xcbiAyOTI6XFx0XFx0fVxcbiAyOTM6XFx0XFxuIDI5NDpcXHRcXHRpZiAocG9mZnNldCBcXHUwMDI2XFx1MDAyNiAqZm9saW9zKSB7XFxuIDI5NTpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gKmZvbGlvcztcXG4gMjk2OlxcdFxcbiAyOTc6XFx0XFx0XFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgcG9mZnNldCwgZm9saW9fc2l6ZShmb2xpbykgLSBwb2Zmc2V0KTtcXG4gMjk4OlxcdFxcdFxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbiAyOTk6XFx0XFx0fVxcbiAzMDA6XFx0XFx0YnJlbHNlKGJoKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MjYuODgyOTIyMTVaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDE1NDI2ODMwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkLCBnZWFyZWQgdG93YXJkIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgRmlsZSBTZWN0aW9uIC0gTGluZXMgMzAxIHRvIEVuZCoqXG5cbkFscmlnaHQsIEknbSBhdCB0aGUgcG9pbnQgd2hlcmUgSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IHRoZSB0YWlsIGVuZCBvZiB0aGlzIGZpbGUsIHNwZWNpZmljYWxseSBmcm9tIGxpbmUgMzAxIG9ud2FyZC4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byByYXBpZGx5IHNjYW4gdGhpcyBzZWN0aW9uLiBHaXZlbiB3aGF0IEkndmUgc2VlbiBpbiB0aGUgZWFybGllciBwYXJ0cywgSSBoYXZlIGEgZmV3IGltbWVkaWF0ZSBoeXBvdGhlc2VzIHRoYXQgSSB3YW50IHRvIHRlc3QuIElzIHRoaXMgdGhlIGNvbmNsdWRpbmcgc2VjdGlvbiB3aGVyZSB0aGUgY29yZSBsb2dpYyBpcyBiZWluZyBleGVjdXRlZD8gT3IgbWF5YmUgdGhpcyBpcyB3aGVyZSBzb21lIHBvc3QtcHJvY2Vzc2luZyBoYXBwZW5zPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcmVkIGZsYWdzIGxpa2UgdW5leHBlY3RlZCBqdW1wcywgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgcmVjdXJzaXZlIGNhbGxzIHRoYXQgd2VyZW4ndCBvYnZpb3VzIGF0IGZpcnN0IGdsYW5jZT9cblxuSeKAmW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIGFueSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGNvbmNlcHRzIEkgd2FzIHRoaW5raW5nIGFib3V0IGVhcmxpZXIuIEl0IGlzIGxpa2VseSB0aGF0IHRoaXMgc2VjdGlvbiBjb25maXJtcyBvciBlbGltaW5hdGVzIHByZXZpb3VzIGh5cG90aGVzZXMuIEkgaGF2ZSBteSBtZW50YWwgY2hlY2tsaXN0IG9mIGtleSB2YXJpYWJsZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBpbiBtaW5kLiBJIHdhbnQgdG8gc2VlIGhvdyB0aG9zZSBhcmUgYmVpbmcgbWFuaXB1bGF0ZWQgaGVyZSwgaWYgYXQgYWxsLiBBcmUgdGhlcmUgYW55IGNhbGxzIHRvIGV4dGVybmFsIGxpYnJhcmllcywgYW5kIGlmIHNvLCB3aGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIG9mIHRob3NlIGNhbGxzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvdmVyYWxsIGZ1bmN0aW9uYWxpdHk/XG5cbkl04oCZcyBjcnVjaWFsIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBvZiBpbmVmZmljaWVuY3kuIEknbGwgYmUgbG9va2luZyBmb3Igc2VjdGlvbnMgdGhhdCBhcHBlYXIgdG8gYmUgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSwgcGFydGljdWxhcmx5IGlmIHRoZXkgYXJlIGluc2lkZSBsb29wcy4gSWYgdGhpcyBpcyBhIGxhcmdlIGZpbGUsIHRoZSBsYXN0IHBhcnQgaXMgbW9yZSB0aGFuIGxpa2VseSBrZXkgdG8gdGhlIGZ1bmN0aW9uLiBOb3cgdG8gZGl2ZSBpbiBhbmQgZ2V0IGEgZ3JpcCBvbiB3aGF0IHRoaXMgcGFydCBhY3R1YWxseSBkb2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NjE5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxOToyNjozMS4wMzcxOTM2NzVaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMxOTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lzb2ZzL2NvbXByZXNzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMwMTpcXHRcXHRyZXR1cm4gMDtcXG4gMzAyOlxcdH1cXG4gMzAzOlxcdFxcbiAzMDQ6XFx0LypcXG4gMzA1OlxcdCAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2VcXG4gMzA2OlxcdCAqIHBlciByZWZlcmVuY2UuICBXZSBpbmplY3QgdGhlIGFkZGl0aW9uYWwgcGFnZXMgaW50byB0aGUgcGFnZVxcbiAzMDc6XFx0ICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC5cXG4gMzA4OlxcdCAqL1xcbiAzMDk6XFx0c3RhdGljIGludCB6aXNvZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gMzEwOlxcdHtcXG4gMzExOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xcbiAzMTI6XFx0XFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cXHUwMDNlaV9tYXBwaW5nO1xcbiAzMTM6XFx0XFx0aW50IGVycjtcXG4gMzE0OlxcdFxcdGludCBpLCBwY291bnQsIGZ1bGxfcGFnZTtcXG4gMzE1OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS1cXHUwMDNlaV9mb3JtYXRfcGFybVsxXTtcXG4gMzE2OlxcdFxcdHVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9XFxuIDMxNzpcXHRcXHRcXHRQQUdFX1NISUZUIFxcdTAwM2M9IHppc29mc19ibG9ja19zaGlmdCA/XFxuIDMxODpcXHRcXHRcXHQoMSBcXHUwMDNjXFx1MDAzYyAoemlzb2ZzX2Jsb2NrX3NoaWZ0IC0gUEFHRV9TSElGVCkpIDogMDtcXG4gMzE5OlxcdFxcdHN0cnVjdCBmb2xpbyAqKmZvbGlvcztcXG4gMzIwOlxcdFxcdHBnb2ZmX3QgaW5kZXggPSBmb2xpby1cXHUwMDNlaW5kZXgsIGVuZF9pbmRleDtcXG4gMzIxOlxcdFxcbiAzMjI6XFx0XFx0ZW5kX2luZGV4ID0gKGlub2RlLVxcdTAwM2VpX3NpemUgKyBQQUdFX1NJWkUgLSAxKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAzMjM6XFx0XFx0LypcXG4gMzI0OlxcdFxcdCAqIElmIHRoaXMgZm9saW8gaXMgd2hvbGx5IG91dHNpZGUgaV9zaXplIHdlIGp1c3QgcmV0dXJuIHplcm87XFxuIDMyNTpcXHRcXHQgKiBkb19nZW5lcmljX2ZpbGVfcmVhZCgpIHdpbGwgaGFuZGxlIHRoaXMgZm9yIHVzXFxuIDMyNjpcXHRcXHQgKi9cXG4gMzI3OlxcdFxcdGlmIChpbmRleCBcXHUwMDNlPSBlbmRfaW5kZXgpIHtcXG4gMzI4OlxcdFxcdFxcdGZvbGlvX2VuZF9yZWFkKGZvbGlvLCB0cnVlKTtcXG4gMzI5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAzMzA6XFx0XFx0fVxcbiAzMzE6XFx0XFxuIDMzMjpcXHRcXHRpZiAoUEFHRV9TSElGVCBcXHUwMDNjPSB6aXNvZnNfYmxvY2tfc2hpZnQpIHtcXG4gMzMzOlxcdFxcdFxcdC8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmVcXG4gMzM0OlxcdFxcdFxcdCAgIHdlIG11c3QgZG8uICovXFxuIDMzNTpcXHRcXHRcXHRmdWxsX3BhZ2UgPSBpbmRleCBcXHUwMDI2ICh6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpO1xcbiAzMzY6XFx0XFx0XFx0cGNvdW50ID0gbWluX3QoaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayxcXG4gMzM3OlxcdFxcdFxcdFxcdGVuZF9pbmRleCAtIChpbmRleCBcXHUwMDI2IH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpO1xcbiAzMzg6XFx0XFx0XFx0aW5kZXggLT0gZnVsbF9wYWdlO1xcbiAzMzk6XFx0XFx0fSBlbHNlIHtcXG4gMzQwOlxcdFxcdFxcdGZ1bGxfcGFnZSA9IDA7XFxuIDM0MTpcXHRcXHRcXHRwY291bnQgPSAxO1xcbiAzNDI6XFx0XFx0fVxcbiAzNDM6XFx0XFx0Zm9saW9zID0ga3phbGxvY19vYmpzKCpmb2xpb3MsXFxuIDM0NDpcXHRcXHRcXHRcXHQgICAgICBtYXhfdCh1bnNpZ25lZCBpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLCAxKSk7XFxuIDM0NTpcXHRcXHRpZiAoIWZvbGlvcykge1xcbiAzNDY6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gMzQ3OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzNDg6XFx0XFx0fVxcbiAzNDk6XFx0XFx0Zm9saW9zW2Z1bGxfcGFnZV0gPSBmb2xpbztcXG4gMzUwOlxcdFxcbiAzNTE6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBjb3VudDsgaSsrLCBpbmRleCsrKSB7XFxuIDM1MjpcXHRcXHRcXHRpZiAoaSA9PSBmdWxsX3BhZ2UpXFxuIDM1MzpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gMzU0OlxcdFxcdFxcdGZvbGlvc1tpXSA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgaW5kZXgsXFxuIDM1NTpcXHRcXHRcXHRcXHRcXHRGR1BfTE9DSyB8IEZHUF9DUkVBVCB8IEZHUF9OT1dBSVQsXFxuIDM1NjpcXHRcXHRcXHRcXHRcXHRtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTtcXG4gMzU3OlxcdFxcdFxcdGlmIChJU19FUlIoZm9saW9zW2ldKSlcXG4gMzU4OlxcdFxcdFxcdFxcdGZvbGlvc1tpXSA9IE5VTEw7XFxuIDM1OTpcXHRcXHR9XFxuIDM2MDpcXHRcXG4gMzYxOlxcdFxcdGVyciA9IHppc29mc19maWxsX3BhZ2VzKGlub2RlLCBmdWxsX3BhZ2UsIHBjb3VudCwgZm9saW9zKTtcXG4gMzYyOlxcdFxcbiAzNjM6XFx0XFx0LyogUmVsZWFzZSBhbnkgcmVzaWR1YWwgZm9saW9zLCBkbyBub3QgbWFyayB0aGVtIHVwdG9kYXRlICovXFxuIDM2NDpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcGNvdW50OyBpKyspIHtcXG4gMzY1OlxcdFxcdFxcdGlmIChmb2xpb3NbaV0pIHtcXG4gMzY2OlxcdFxcdFxcdFxcdGZsdXNoX2RjYWNoZV9mb2xpbyhmb2xpb3NbaV0pO1xcbiAzNjc6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvc1tpXSk7XFxuIDM2ODpcXHRcXHRcXHRcXHRpZiAoaSAhPSBmdWxsX3BhZ2UpXFxuIDM2OTpcXHRcXHRcXHRcXHRcXHRmb2xpb19wdXQoZm9saW9zW2ldKTtcXG4gMzcwOlxcdFxcdFxcdH1cXG4gMzcxOlxcdFxcdH1cXG4gMzcyOlxcdFxcbiAzNzM6XFx0XFx0LyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlIFxcXCJjcml0aWNhbFxcXCIgcGFnZSAqL1xcbiAzNzQ6XFx0XFx0a2ZyZWUoZm9saW9zKTtcXG4gMzc1OlxcdFxcdHJldHVybiBlcnI7XFxuIDM3NjpcXHR9XFxuIDM3NzpcXHRcXG4gMzc4OlxcdGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7XFxuIDM3OTpcXHRcXHQucmVhZF9mb2xpbyA9IHppc29mc19yZWFkX2ZvbGlvLFxcbiAzODA6XFx0XFx0LyogTm8gYm1hcCBvcGVyYXRpb24gc3VwcG9ydGVkICovXFxuIDM4MTpcXHR9O1xcbiAzODI6XFx0XFxuIDM4MzpcXHRpbnQgX19pbml0IHppc29mc19pbml0KHZvaWQpXFxuIDM4NDpcXHR7XFxuIDM4NTpcXHRcXHR6aXNvZnNfemxpYl93b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpO1xcbiAzODY6XFx0XFx0aWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlIClcXG4gMzg3OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzODg6XFx0XFxuIDM4OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzkwOlxcdH1cXG4gMzkxOlxcdFxcbiAzOTI6XFx0dm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKVxcbiAzOTM6XFx0e1xcbiAzOTQ6XFx0XFx0dmZyZWUoemlzb2ZzX3psaWJfd29ya3NwYWNlKTtcXG4gMzk1OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTk6MjY6MzEuMDM3MzI4MjU1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjczMjQ1MzQ0NzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBpc29mcyBQYXRjaDogRm9saW8gTWlncmF0aW9uIGFuZCBLTVNBTiBBc3Nlc3NtZW50KipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggY29udmVydGluZyBgZnMvaXNvZnMvY29tcHJlc3MuY2AgZnJvbSB1c2luZyBgc3RydWN0IHBhZ2VgIHRvIGBzdHJ1Y3QgZm9saW9gLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbGwgdGhlIG51YW5jZXMgb2YgdGhpcyBtaWdyYXRpb24gYW5kLCBjcml0aWNhbGx5LCBhc3Nlc3MgYW55IHBvdGVudGlhbCBLTVNBTiBpbXBsaWNhdGlvbnMuXG5cbkkgc2VlIHRoZXkncmUgcmVwbGFjaW5nIHRoZSBgc3RydWN0IHBhZ2UgKipwYWdlc2AgYXJndW1lbnQgd2l0aCBgc3RydWN0IGZvbGlvICoqZm9saW9zYCBpbiBgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2tgLiBBIHF1aWNrIHNjYW4gc2hvd3MgdGhlIGV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgY2hhbmdlczogdXNpbmcgYGZvbGlvX3plcm9fcmFuZ2VgIGluc3RlYWQgb2YgYG1lbXplcm9fcGFnZWAsIGBmb2xpb19tYXJrX3VwdG9kYXRlYCBpbnN0ZWFkIG9mIGBTZXRQYWdlVXB0b2RhdGVgLCBga21hcF9sb2NhbF9mb2xpb2AgZm9yIGBrbWFwX2xvY2FsX3BhZ2VgLCBhZGp1c3RpbmcgYHN0cmVhbS5hdmFpbF9vdXRgIHRvIHJlZmxlY3QgZm9saW8gc2l6ZXMsIGFuZCBgZmx1c2hfZGNhY2hlX2ZvbGlvYCBpbnN0ZWFkIG9mIGBmbHVzaF9kY2FjaGVfcGFnZWAuIEl0J3MgYWxsIHZlcnkgbWV0aG9kaWNhbCwgd2hpY2ggaXMgZ29vZCB0byBzZWUuXG5cblNpbWlsYXJseSwgYHppc29mc19maWxsX3BhZ2VzYCBnZXRzIHRoZSBmb2xpbyB0cmVhdG1lbnQsIHN3YXBwaW5nIGBwYWdlX29mZnNldGAgZm9yIGBmb2xpb19wb3NgLCBhbmQgdXBkYXRpbmcgdGhlIHplcm9pbmcgYW5kIHVwdG9kYXRlIG1hcmtpbmdzLlxuXG5JbiBgemlzb2ZzX3JlYWRfZm9saW9gLCB0aGUgYHBhZ2VzYCBhcnJheSBhbGxvY2F0aW9uIGlzIHJlcGxhY2VkIHdpdGggYGt6YWxsb2Nfb2Jqc2AsIHdoaWNoIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3Igc2FmZXR5LiBUaGUgYGdyYWJfY2FjaGVfcGFnZV9ub3dhaXRgIGNhbGwgaXMgcmVwbGFjZWQgd2l0aCBgX19maWxlbWFwX2dldF9mb2xpb2AuIFRoZXkncmUgYWxzbyBtYWtpbmcgc3VyZSB0byBoYW5kbGUgdGhlIGBJU19FUlJgIGNhc2UsIHNldHRpbmcgdGhlIGZvbGlvIHRvIGBOVUxMYCBvbiBmYWlsdXJlLCB3aGljaCBpcyByZXNwb25zaWJsZS4gVGhlIGNsZWFudXAgbG9naWMgYXQgdGhlIGVuZCBpcyBhbHNvIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9saW8gcGFyYWRpZ20sIHVzaW5nIGBmbHVzaF9kY2FjaGVfZm9saW9gLCBgZm9saW9fdW5sb2NrYCwgYW5kIGBmb2xpb19wdXRgLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBhcmUgdGhlcmUgYW55IG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuKiAgIFRoZSBgZm9saW9zYCBhcnJheSBpdHNlbGYgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29ianNgLCBzbyB0aGF0J3MgaW5pdGlhbGl6ZWQgdG8gemVybyByaWdodCBvZmYgdGhlIGJhdC5cbiogICBUaGUgZm9saW9zIHRoZW1zZWx2ZXMgYXJlICpwYWdlIGNhY2hlIGZvbGlvcyosIGFuZCB0aGUgZGF0YSBpcyBlaXRoZXIgcG9wdWxhdGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIChmcm9tIHRoZSB6bGliIHN0cmVhbSkgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAuIElmIHpsaWIgZG9lc24ndCBmaWxsIHRoZSBmb2xpbywgdGhlbiBgZm9saW9femVyb19yYW5nZWAgbWFrZXMgc3VyZSBvZiBpdC5cbiogICBFcnJvciBwYXRocyAqZG9uJ3QqIG1hcmsgZm9saW9zIGFzIHVwdG9kYXRlLCB3aGljaCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvci5cbiogICBOb3RoaW5nIGhlcmUgaXMgY29weWluZyBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIHRvIHVzZXJzcGFjZSwgd2hpY2ggaXMgYSBtYWpvciB3aW4uXG4qICAgVGhlcmUgYXJlbid0IGFueSB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMgb3IgcGFkZGluZyBhdCBwbGF5LlxuKiAgIEkgZG9uJ3Qgc2VlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB1c2VkIGluIGJyYW5jaGluZyBsb2dpYy5cblxuT2theSwgbGV0J3MgY29uY3JldGVseSBhc3Nlc3Mgd2hldGhlciB0aGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGFueSAqS01TQU4tc3BlY2lmaWMqIHJpc2tzOiBJJ20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHdvdWxkIHNsaXAgYnkgYSBzdGFuZGFyZCBjb2RlIHJldmlldy4gVGhpcyBsb29rcyBzYWZlLiBUaGUgc29ydHMgb2YgYnVncyBpbnRyb2R1Y2VkIHdvdWxkIGJlIHBhZ2UgY2FjaGUgb3IgZm9saW8gcmVmZXJlbmNlIGNvdW50aW5nIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1ZSB0byBpbmNvcnJlY3Qgc2l6ZXMsIHdoaWNoIG90aGVyIHRvb2xzIGxpa2UgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgcGFnZSBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUgc2hvdWxkIGNhdGNoLlxuXG5MZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGZvdXIgS01TQU4gY3JpdGVyaWE6XG5cbjEuICBObyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgc2VudCB0byB1c2Vyc3BhY2Ugd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nLlxuMi4gIFRoZXJlJ3Mgbm8gY29uZGl0aW9uYWwgbG9naWMgdGhhdCBkZXBlbmRzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiAgVGhlcmUncyBubyBhbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXIuXG40LiAgVGhlcmUgYXJlbid0IGFueSBib3VuZHMgY2hlY2tzIG9yIGxvZ2ljIHRoYXQgd291bGQgYWxsb3cgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLlxuXG5BbHJpZ2h0LCBJJ20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNDI5LCJPdXRwdXRUb2tlbnMiOjIwMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkwMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE5OjI2OjM4LjM2MTg2NTU0OVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxOTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29udmVydHMgYGZzL2lzb2ZzL2NvbXByZXNzLmNgIGZyb20gYHN0cnVjdCBwYWdlYCBBUElzIHRvIGBzdHJ1Y3QgZm9saW9gIEFQSXMgKHVzaW5nIGBrbWFwX2xvY2FsX2ZvbGlvYCwgYGZvbGlvX3plcm9fcmFuZ2VgLCBgZm9saW9fbWFya191cHRvZGF0ZWAsIGBfX2ZpbGVtYXBfZ2V0X2ZvbGlvYCwgZXRjLikuIFxcblxcblRoZSBhcnJheSBob2xkaW5nIGZvbGlvIHBvaW50ZXJzIGlzIHplcm8tYWxsb2NhdGVkIHZpYSBga3phbGxvY19vYmpzYCwgYW5kIGZvbGlvIGNvbnRlbnRzIGFyZSBlaXRoZXIgdW5jb21wcmVzc2VkIGJ5IHpsaWIgb3IgemVyb2VkIHZpYSBgZm9saW9femVyb19yYW5nZWAgYmVmb3JlIGJlaW5nIG1hcmtlZCB1cHRvZGF0ZS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBpbmZvLWxlYWtzIHRvIHVzZXIgc3BhY2UsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJyYW5jaGVzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZm9saW8gcmVmZXJlbmNlIGNvdW50cywgbG9ja3MsIG9yIG9mZnNldHMgYXJlIHdpdGhpbiB0aGUgc2NvcGUgb2YgS0FTQU4vTE9DS0RFUC9wYWdlIGRlYnVnZ2luZyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow99qhf[1] Phase: Succeeded StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 19:26:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 19:26:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2] Phase: Succeeded StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 19:26:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-07 19:26:49 +0000 UTC FinishedAt: 2026-09-07 19:26:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1285067770/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-07 19:26:59 +0000 UTC FinishedAt: 2026-09-07 19:43:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-07 19:26:59 +0000 UTC FinishedAt: 2026-09-07 19:43:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*be7a5438-e8fc-46a3-bae8-a1674d85b338,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1285067770/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "5206cc45-6a1f-4f4c-b63f-2af61af48cf0", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3619841192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-07 19:26:59 +0000 UTC FinishedAt: 2026-09-07 19:43:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*be7a5438-e8fc-46a3-bae8-a1674d85b338,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1285067770/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "5206cc45-6a1f-4f4c-b63f-2af61af48cf0", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3619841192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-07 19:43:25 +0000 UTC FinishedAt: 2026-09-07 19:43:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-07 19:43:25 +0000 UTC FinishedAt: 2026-09-07 19:43:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-07 19:43:25 +0000 UTC FinishedAt: 2026-09-07 19:43:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-07 19:43:25 +0000 UTC FinishedAt: 2026-09-07 19:43:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1841850453/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-07 19:43:35 +0000 UTC FinishedAt: 2026-09-07 19:45:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-07 19:43:35 +0000 UTC FinishedAt: 2026-09-07 19:45:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*5206cc45-6a1f-4f4c-b63f-2af61af48cf0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3619841192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-07 19:45:28 +0000 UTC FinishedAt: 2026-09-07 19:45:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-07 19:45:28 +0000 UTC FinishedAt: 2026-09-07 19:45:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-07 19:45:28 +0000 UTC FinishedAt: 2026-09-07 20:01:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-07 19:45:28 +0000 UTC FinishedAt: 2026-09-07 20:01:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*be7a5438-e8fc-46a3-bae8-a1674d85b338,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1841850453/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "dfa08b97-3805-4f3c-a6d6-959514bda5dc", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3417934305/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-07 19:45:28 +0000 UTC FinishedAt: 2026-09-07 20:01:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*be7a5438-e8fc-46a3-bae8-a1674d85b338,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-1841850453/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "dfa08b97-3805-4f3c-a6d6-959514bda5dc", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3417934305/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-07 20:01:46 +0000 UTC FinishedAt: 2026-09-07 20:01:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-07 20:01:46 +0000 UTC FinishedAt: 2026-09-07 20:01:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-07 20:01:46 +0000 UTC FinishedAt: 2026-09-07 20:03:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-07 20:01:46 +0000 UTC FinishedAt: 2026-09-07 20:03:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*dfa08b97-3805-4f3c-a6d6-959514bda5dc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3417934305/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*5206cc45-6a1f-4f4c-b63f-2af61af48cf0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*dfa08b97-3805-4f3c-a6d6-959514bda5dc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3619841192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3417934305/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:03:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:03:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-2553550906/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:03:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-07 20:03:41 +0000 UTC FinishedAt: 2026-09-07 20:03:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-07 20:03:42 +0000 UTC FinishedAt: 2026-09-07 20:03:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-07 20:03:52 +0000 UTC FinishedAt: 2026-09-07 20:50:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow99qhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["zisofs_read_folio","zisofs_fill_pages","zisofs_uncompress_block"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"df2908090cda368b01ff43709f51890076c56157","config_name":"upstream-apparmor-kasan.config","enable_configs":["ISO9660_FS","ZISOFS"],"series_id":"479c587b-60a9-4be2-a0df-b2ce37eaa157","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-07 20:03:52 +0000 UTC FinishedAt: 2026-09-07 20:50:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*5206cc45-6a1f-4f4c-b63f-2af61af48cf0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*dfa08b97-3805-4f3c-a6d6-959514bda5dc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3619841192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-build-action-3417934305/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow99qhf/series-workflow99qhf-convert-artifact-2553550906/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}