Name: series-workflow8j5hc Phase: Succeeded StartedAt: 2026-06-25 05:55:28 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[0] Phase: Succeeded StartedAt: 2026-06-25 05:55:29 +0000 UTC FinishedAt: 2026-06-25 06:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[0].run-triage Phase: Succeeded StartedAt: 2026-06-25 05:55:29 +0000 UTC FinishedAt: 2026-06-25 06:09:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "840ef6c78e6a2f694b578ecb9063241c992aaa9e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "LIVEUPDATE", "LIVEUPDATE_EVENTFD", "EVENTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "840ef6c78e6a2f694b578ecb9063241c992aaa9e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "LIVEUPDATE", "LIVEUPDATE_EVENTFD", "EVENTFD" ], "series_id": "f3834abc-6aa9-43fe-85bd-63cc8ac29ef7" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "eventfd_luo_preserve", "eventfd_luo_freeze", "eventfd_luo_unpreserve", "eventfd_luo_retrieve", "eventfd_luo_finish", "eventfd_luo_can_preserve", "eventfd_luo_get_state", "eventfd_create" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0xJVkVVUERBVEUmIzM0OywKICAgICYjMzQ7TElWRVVQREFURV9FVkVOVEZEJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtldmVudGZkX2x1b19wcmVzZXJ2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19mcmVlemUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19yZXRyaWV2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19maW5pc2gmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2dldF9zdGF0ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2NyZWF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjUgMDY6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyMjFhZmQzMzk4ODc1ZWIxNGQ5YjdkN2QyYTAxOWM0MWJlOTRjOTBiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdW4gMjUgMDY6MDc6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxuaW5kZXggODlhOGE5ZDIwN2QxYzUuLjM2ZDU2OGU2Y2ZjNzNlIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL01ha2VmaWxlXG5AQCAtMjcsNiAmIzQzOzI3LDcgQEAgb2JqLXlcdFx0XHRcdCYjNDM7PSBhbm9uX2lub2Rlcy5vXG4gb2JqLSQoQ09ORklHX1NJR05BTEZEKVx0XHQmIzQzOz0gc2lnbmFsZmQub1xuIG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQmIzQzOz0gdGltZXJmZC5vXG4gb2JqLSQoQ09ORklHX0VWRU5URkQpXHRcdCYjNDM7PSBldmVudGZkLm9cbiYjNDM7b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkmIzQzOz0gZXZlbnRmZF9sdW8ub1xuIG9iai0kKENPTkZJR19BSU8pICAgICAgICAgICAgICAgJiM0Mzs9IGFpby5vXG4gb2JqLSQoQ09ORklHX0ZTX0RBWClcdFx0JiM0Mzs9IGRheC5vXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXHQmIzQzOz0gY3J5cHRvL1xuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmQuYyBiL2ZzL2V2ZW50ZmQuY1xuaW5kZXggOWQzM2EwMjc1N2Q1MmIuLjliNzZjZjA2MTM1YTg2IDEwMDY0NFxuLS0tIGEvZnMvZXZlbnRmZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkLmNcbkBAIC0zNzYsNiAmIzQzOzM3Niw0MCBAQCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmRfY3R4X2ZpbGVnZXQoc3RydWN0IGZpbGUgKmZpbGUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xuIFxuJiM0MzsvKipcbiYjNDM7ICogZXZlbnRmZF9sdW9fZ2V0X3N0YXRlIC0gR2V0IGV2ZW50ZmQgc3RhdGUgKGNvdW50IGFuZCBmbGFncykgZm9yIExVT1xuJiM0MzsgKiBAZmlsZTogRXZlbnRmZCBmaWxlXG4mIzQzOyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWVcbiYjNDM7ICogQGZsYWdzOiBPdXRwdXQgcGFyYW1ldGVyIGZvciBmbGFncyB2YWx1ZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuXG4mIzQzOyAqIFNpbmNlIHN0cnVjdCBldmVudGZkX2N0eCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSwgd2UgY2FuIGFjY2VzcyBpdHNcbiYjNDM7ICogbWVtYmVycyBkaXJlY3RseSBoZXJlLiBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgd2FpdCBxdWV1ZSBsb2NrIHRvIGVuc3VyZVxuJiM0MzsgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7aW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7XG4mIzQzO1xuJiM0MztcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4mIzQzO1x0aWYgKElTX0VSUihjdHgpKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIoY3R4KTtcbiYjNDM7XG4mIzQzO1x0LyogUmVhZCBjb3VudCB3aXRoIGxvY2sgKGZsYWdzIGRvbiYjMzk7dCBuZWVkIGxvY2spICovXG4mIzQzO1x0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2Y3R4LVx1MDAzZXdxaC5sb2NrLCBpcnFfZmxhZ3MpO1xuJiM0MztcdCpjb3VudCA9IGN0eC1cdTAwM2Vjb3VudDtcbiYjNDM7XHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNmN0eC1cdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0KmZsYWdzID0gY3R4LVx1MDAzZWZsYWdzO1xuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuJiM0MztcbiBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHggX19mcmVlKGtmcmVlKSA9IE5VTEw7XG5AQCAtNDExLDYgJiM0Mzs0NDUsMTIgQEAgc3RhdGljIGludCBkb19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCwgaW50IGZsYWdzKVxuIFx0cmV0dXJuIGZkX3B1Ymxpc2goZmRmKTtcbiB9XG4gXG4mIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2NyZWF0ZSk7XG4mIzQzO1xuIFNZU0NBTExfREVGSU5FMihldmVudGZkMiwgdW5zaWduZWQgaW50LCBjb3VudCwgaW50LCBmbGFncylcbiB7XG4gXHRyZXR1cm4gZG9fZXZlbnRmZChjb3VudCwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmRfbHVvLmMgYi9mcy9ldmVudGZkX2x1by5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjc4MWQ5MDYzNWM1MmFlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkX2x1by5jXG5AQCAtMCwwICYjNDM7MSwyNTAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuIFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXHUwMDNlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIERPQzogRXZlbnRmZCBQcmVzZXJ2YXRpb24gdmlhIExVT1xuJiM0MzsgKlxuJiM0MzsgKiBPdmVydmlld1xuJiM0MzsgKiA9PT09PT09PVxuJiM0MzsgKlxuJiM0MzsgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZVxuJiM0MzsgKiBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIGZpbGUgcHJlc2VydmF0aW9uLiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgYXBwbGljYXRpb25zXG4mIzQzOyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXG4mIzQzOyAqIHVwZGF0ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcbiYjNDM7ICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC5cbiYjNDM7ICogVGhlIHByZXNlcnZhdGlvbiBlbnN1cmVzIHRoYXQgcGVuZGluZyBldmVudHMgYW5kIGNvbmZpZ3VyYXRpb24gYXJlIG5vdCBsb3N0XG4mIzQzOyAqIGR1cmluZyBrZXhlYy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHByZXNlcnZhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdHJhbnNwYXJlbnQuIE9ubHkgc2VsZWN0IHByb3BlcnRpZXMgb2ZcbiYjNDM7ICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxuJiM0MzsgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuXG4mIzQzOyAqXG4mIzQzOyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXG4mIzQzOyAqID09PT09PT09PT09PT09PT09PT09XG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcbiYjNDM7ICpcbiYjNDM7ICogQ291bnRlciBWYWx1ZVxuJiM0MzsgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xuJiM0MzsgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLlxuJiM0MzsgKlxuJiM0MzsgKiBGaWxlIEZsYWdzXG4mIzQzOyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLlxuJiM0MzsgKiAgIFRoZXNlIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBhbmQgZmlsZSBkZXNjcmlwdG9yXG4mIzQzOyAqICAgaW5oZXJpdGFuY2UuXG4mIzQzOyAqXG4mIzQzOyAqIE5vbi1QcmVzZXJ2ZWQgUHJvcGVydGllc1xuJiM0MzsgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7ICpcbiYjNDM7ICogQWxsIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcmVzZXJ2ZWQgbXVzdCBiZSBhc3N1bWVkIHRvIGJlIHJlc2V0IHRvXG4mIzQzOyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXG4mIzQzOyAqIG5vdGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcbiYjNDM7ICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlXG4mIzQzOyAqICAgZXZlbnRmZCB3aWxsIGJlIGFzc2lnbmVkIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBudW1iZXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBXYWl0IFF1ZXVlIFN0YXRlXG4mIzQzOyAqICAgQW55IHByb2Nlc3NlcyBjdXJyZW50bHkgYmxvY2tlZCBvbiByZWFkKCkgb3BlcmF0aW9ucyB3aWxsIGJlIHdva2VuIHVwIGFuZFxuJiM0MzsgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEZpbGUgUG9zaXRpb25cbiYjNDM7ICogICBFdmVudGZkIGZpbGVzIGRvbiYjMzk7dCBoYXZlIGEgdHJhZGl0aW9uYWwgZmlsZSBwb3NpdGlvbiwgYnV0IGFueSBpbnRlcm5hbFxuJiM0MzsgKiAgIHN0YXRlIHJlbGF0ZWQgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBpcyByZXNldC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXhlY19oYW5kb3Zlci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpdmV1cGRhdGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYW5vbl9pbm9kZXMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pZHIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tyZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9mZHRhYmxlLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuJiM0MztcdHU2NCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIEdldCBldmVudGZkIHN0YXRlIHNhZmVseSAqL1xuJiM0MztcdGVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLVx1MDAzZWZpbGUsIFx1MDAyNmNvdW50LCBcdTAwMjZmbGFncyk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBnZXQgZXZlbnRmZCBzdGF0ZTogJWRcXG5cJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7XG4mIzQzO1x0aWYgKElTX0VSUihzZXIpKSB7XG4mIzQzO1x0XHRlcnIgPSBQVFJfRVJSKHNlcik7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIHByZXNlcnZlIG1lbW9yeTogJWRcXG5cJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXG4mIzQzO1x0c2VyLVx1MDAzZWNvdW50ID0gY291bnQ7XG4mIzQzO1x0c2VyLVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4mIzQzO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O1ByZXNlcnZlZCBldmVudGZkOiBjb3VudD0lbGx1LCBmbGFncz0weCV4XFxuXCYjMzQ7LFxuJiM0MztcdFx0c2VyLVx1MDAzZWNvdW50LCBzZXItXHUwMDNlZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKiBSZXR1cm4gcGh5c2ljYWwgYWRkcmVzcyBvZiBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZSAqL1xuJiM0MztcdGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhID0gdmlydF90b19waHlzKHNlcik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX2ZyZWV6ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4mIzQzO1x0dTY0IGNvdW50O1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XG4mIzQzO1x0LyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovXG4mIzQzO1x0ZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtXHUwMDNlZmlsZSwgXHUwMDI2Y291bnQsIFx1MDAyNmZsYWdzKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlci1cdTAwM2Vjb3VudCAhPSBjb3VudCkge1xuJiM0MztcdFx0cHJfZGVidWcoXCYjMzQ7V0FSTklORzogQ291bnQgY2hhbmdlZCBkdXJpbmcgcHJlc2VydmUtXHUwMDNlZnJlZXplISBvbGQ9JWxsdSwgbmV3PSVsbHVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCBzZXItXHUwMDNlY291bnQsIGNvdW50KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNlci1cdTAwM2Vjb3VudCA9IGNvdW50O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XHRraG9fdW5wcmVzZXJ2ZV9mcmVlKHNlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcmV0cmlldmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqY3R4O1xuJiM0MztcdHN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDtcbiYjNDM7XHRpbnQgZXZlbnRmZDtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XHRpZiAoIXNlcilcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBDcmVhdGUgYSBuZXcgZXZlbnRmZCB3aXRoIHRoZSBwcmVzZXJ2ZWQgY291bnQgYW5kIGZsYWdzICovXG4mIzQzO1x0ZXZlbnRmZCA9IGV2ZW50ZmRfY3JlYXRlKHNlci1cdTAwM2Vjb3VudCwgc2VyLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRpZiAoZXZlbnRmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBjcmVhdGUgZXZlbnRmZDogJWRcXG5cJiMzNDssIGV2ZW50ZmQpO1xuJiM0MztcdFx0cmV0dXJuIGV2ZW50ZmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmaWxlID0gZmdldChldmVudGZkKTtcbiYjNDM7XHRpZiAoIWZpbGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gZ2V0IGZpbGUgZnJvbSBmZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZV9mZChldmVudGZkKTtcbiYjNDM7XHRcdHJldHVybiAtRUJBREY7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjbG9zZV9mZChldmVudGZkKTtcbiYjNDM7XG4mIzQzO1x0LyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi9cbiYjNDM7XHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuJiM0MztcdGlmIChJU19FUlIoY3R4KSkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBnZXQgY29udGV4dCBmcm9tIGZpbGVcXG5cJiMzNDspO1xuJiM0MztcdFx0ZnB1dChmaWxlKTtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XG4mIzQzO1x0YXJncy1cdTAwM2VmaWxlID0gZmlsZTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fZmluaXNoKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcbiYjNDM7XG4mIzQzO1x0aWYgKGFyZ3MtXHUwMDNlcmV0cmlldmVfc3RhdHVzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xuJiM0MztcdGlmICghc2VyKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRraG9fcmVzdG9yZV9mcmVlKHNlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqY3R4O1xuJiM0MztcbiYjNDM7XHRpZiAoIWZpbGUtXHUwMDNlZl9vcClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IHRvIGdldCBldmVudGZkIGNvbnRleHQgLSB0aGlzIHdpbGwgZmFpbCBpZiBub3QgYW4gZXZlbnRmZCAqL1xuJiM0MztcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4mIzQzO1x0aWYgKElTX0VSUihjdHgpKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xuJiM0MztcdC5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3ByZXNlcnZlLFxuJiM0MztcdC51bnByZXNlcnZlID0gZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSxcbiYjNDM7XHQuZnJlZXplID0gZXZlbnRmZF9sdW9fZnJlZXplLFxuJiM0MztcdC5yZXRyaWV2ZSA9IGV2ZW50ZmRfbHVvX3JldHJpZXZlLFxuJiM0MztcdC5maW5pc2ggPSBldmVudGZkX2x1b19maW5pc2gsXG4mIzQzO1x0LmNhbl9wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZSxcbiYjNDM7XHQub3duZXIgPSBUSElTX01PRFVMRSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcbiYjNDM7XHQub3BzID0gXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXG4mIzQzO1x0LmNvbXBhdGlibGUgPSBFVkVOVEZEX0xVT19GSF9DT01QQVRJQkxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xuJiM0MztcbiYjNDM7XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVPUE5PVFNVUFApIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIEVSUl9QVFIoZXJyKSk7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7bGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXG5pbmRleCBlMzJiZWU0MzQ1ZmI5Zi4uNzAzZTFhMTI2YzRkNDAgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmhcbkBAIC0zNSw2ICYjNDM7MzUsOCBAQCB2b2lkIGV2ZW50ZmRfY3R4X3B1dChzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCk7XG4gc3RydWN0IGZpbGUgKmV2ZW50ZmRfZmdldChpbnQgZmQpO1xuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmRnZXQoaW50IGZkKTtcbiBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmRfY3R4X2ZpbGVnZXQoc3RydWN0IGZpbGUgKmZpbGUpO1xuJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpO1xuJiM0MztpbnQgZXZlbnRmZF9jcmVhdGUoX191NjQgY291bnQsIHVuc2lnbmVkIGludCBmbGFncyk7XG4gdm9pZCBldmVudGZkX3NpZ25hbF9tYXNrKHN0cnVjdCBldmVudGZkX2N0eCAqY3R4LCBfX3BvbGxfdCBtYXNrKTtcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcbiBcdFx0XHRcdCAgX191NjQgKmNudCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTQ4YmVhYzZiY2M3NjBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbkBAIC0wLDAgJiM0MzsxLDM5IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXG4mIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcdTAwM2NkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jblx1MDAzZVxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4mIzQzOyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFdmVudGZkIExpdmUgVXBkYXRlIEFCSVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBBQkkgZm9yIHByZXNlcnZpbmcgZXZlbnRmZCBzdGF0ZSBhY3Jvc3Mga2V4ZWMuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYFxuJiM0MzsgKiB3aGljaCBpcyBoYW5kZWQgb3ZlciB0byB0aGUgbmV4dCBrZXJuZWwgdmlhIHRoZSBLSE8gbWVjaGFuaXNtLlxuJiM0MzsgKlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkXG4mIzQzOyAqIEBjb3VudDogVGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZVxuJiM0MzsgKiBAZmxhZ3M6IEZpbGUgZmxhZ3MgKEVGRF9TRU1BUEhPUkUsIEVGRF9DTE9FWEVDLCBFRkRfTk9OQkxPQ0spXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBtaW5pbWFsIHN0YXRlIG5lZWRlZCB0byByZXN0b3JlIGFuIGV2ZW50ZmRcbiYjNDM7ICogYWZ0ZXIga2V4ZWMuIFRoZSBjb3VudCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBldmVudCBjb3VudGVyLFxuJiM0MzsgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IGV2ZW50ZmRfbHVvX3NlciB7XG4mIzQzO1x0X191NjQgY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgaW50ICBmbGFncztcbiYjNDM7fSBfX3BhY2tlZDtcbiYjNDM7XG4mIzQzOy8qIFRoZSBjb21wYXRpYmlsaXR5IHN0cmluZyBmb3IgZXZlbnRmZCBmaWxlIGhhbmRsZXIgKi9cbiYjNDM7I2RlZmluZSBFVkVOVEZEX0xVT19GSF9DT01QQVRJQkxFXHRcJiMzNDtldmVudGZkLXYxXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbkBAIC04Niw0ICYjNDM7ODYsMjAgQEAgY29uZmlnIExJVkVVUERBVEVfTUVNRkRcbiBcbiBcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiBcbiYjNDM7Y29uZmlnIExJVkVVUERBVEVfRVZFTlRGRFxuJiM0MztcdGJvb2wgXCYjMzQ7RXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydFwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gRVZFTlRGRFxuJiM0MztcdGRlcGVuZHMgb24gTElWRVVQREFURVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIEVuYWJsZSBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydCBmb3IgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3JzLlxuJiM0MztcdCAgVGhpcyBhbGxvd3MgZXZlbnRmZCBmaWxlcyB0byBiZSBwcmVzZXJ2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBrZXhlY1xuJiM0MztcdCAgb3BlcmF0aW9ucywgbWFpbnRhaW5pbmcgdGhlaXIgY291bnRlciB2YWx1ZXMgYW5kIGZsYWdzLlxuJiM0MztcbiYjNDM7XHQgIEV2ZW50ZmQgZmlsZXMgYXJlIGNvbW1vbmx5IHVzZWQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiBiZXR3ZWVuXG4mIzQzO1x0ICB1c2Vyc3BhY2UgcHJvY2Vzc2VzIG9yIGJldHdlZW4gdXNlcnNwYWNlIGFuZCBrZXJuZWwuIFdpdGggdGhpc1xuJiM0MztcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxuJiM0MztcdCAgZHVyaW5nIGxpdmUgdXBkYXRlIG9wZXJhdGlvbnMuXG4mIzQzO1xuJiM0MztcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiYjNDM7XG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG5pbmRleCAzMDY4OWQyMmNiMDIxNi4uZTA5MmUzOGZhNmY2YzQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG5AQCAtOCw2ICYjNDM7OCw3IEBAIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fa2V4ZWNfc2ltcGxlXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgJiM0Mzs9IGx1b19tdWx0aV9zZXNzaW9uXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgJiM0Mzs9IGx1b19zdHJlc3Nfc2Vzc2lvbnNcbiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3N0cmVzc19maWxlc1xuJiM0MztURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3Rlc3RfZXZlbnRmZFxuIFxuIFRFU1RfRklMRVMgJiM0Mzs9IGRvX2tleGVjLnNoXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZ1xuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXG5AQCAtOSwzICYjNDM7OSw1IEBAIENPTkZJR19MSVZFVVBEQVRFX1RFU1Q9eVxuIENPTkZJR19NRU1GRF9DUkVBVEU9eVxuIENPTkZJR19UTVBGUz15XG4gQ09ORklHX1NITUVNPXlcbiYjNDM7Q09ORklHX0VWRU5URkQ9eVxuJiM0MztDT05GSUdfTElWRVVQREFURV9FVkVOVEZEPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjk0ZWYzYmM2NmFkOTcxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuY1xuQEAgLTAsMCAmIzQzOzEsMzc2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuIFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXHUwMDNlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cbiYjNDM7ICpcbiYjNDM7ICogTW9kZWxlZCBhZnRlciBsdW9fbXVsdGlfc2Vzc2lvbi5jLlxuJiM0MzsgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxuJiM0MzsgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvZXZlbnRmZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtsdW9fdGVzdF91dGlscy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBTZXNzaW9uIG5hbWVzICovXG4mIzQzOyNkZWZpbmUgU0VTU0lPTl9FTVBUWSAgICAgXCYjMzQ7ZXZlbnRmZC1lbXB0eVwmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fREVGQVVMVCAgIFwmIzM0O2V2ZW50ZmQtZGVmYXVsdFwmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fU0VNICAgICAgIFwmIzM0O2V2ZW50ZmQtc2VtXCYjMzQ7XG4mIzQzOyNkZWZpbmUgU0VTU0lPTl9OT05CTE9DSyAgXCYjMzQ7ZXZlbnRmZC1ub25ibG9ja1wmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fTEFSR0UgICAgIFwmIzM0O2V2ZW50ZmQtbGFyZ2VcJiMzNDtcbiYjNDM7I2RlZmluZSBTRVNTSU9OX01PRElGSUVEICBcJiMzNDtldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBUb2tlbnMgKi9cbiYjNDM7I2RlZmluZSBUT0tFTl9ERUZBVUxUICAgICAgIDB4Q0FGRUJBQkVcbiYjNDM7I2RlZmluZSBUT0tFTl9TRU0gICAgICAgICAgIDB4REVBREJFRUZcbiYjNDM7I2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUZcbiYjNDM7I2RlZmluZSBUT0tFTl9MQVJHRSAgICAgICAgIDB4QkVFRkNBRkVcbiYjNDM7I2RlZmluZSBUT0tFTl9NT0RJRklFRCAgICAgIDB4QUJDRDEyMzRcbiYjNDM7XG4mIzQzOy8qIENvdW50cyAqL1xuJiM0MzsjZGVmaW5lIENPVU5UX0lOSVRJQUwgICA0MlxuJiM0MzsjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMFxuJiM0MzsjZGVmaW5lIENPVU5UX0VYUEVDVEVEICAoQ09VTlRfSU5JVElBTCAmIzQzOyBDT1VOVF9XUklURSkgLyogNTIgKi9cbiYjNDM7I2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxuJiM0MzsjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDBcbiYjNDM7I2RlZmluZSBDT1VOVF9MQVJHRSAgICAgKCh1bnNpZ25lZCBpbnQpLTEpIC8qIFVJTlRfTUFYICovXG4mIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XG4mIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OVxuJiM0MztcbiYjNDM7LyogU3RhdGUgdHJhY2tpbmcgKi9cbiYjNDM7I2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgXCYjMzQ7ZXZlbnRmZF9tdWx0aV9zdGF0ZVwmIzM0O1xuJiM0MzsjZGVmaW5lIFNUQVRFX1RPS0VOICAgICAgICA5OTdcbiYjNDM7XG4mIzQzOy8qIEV2ZW50ZmQgdmVyaWZpY2F0aW9uIG1vZGVzICovXG4mIzQzO2VudW0gdmVyaWZ5X21vZGUge1xuJiM0MztcdFZFUklGWV9GTEFHUywgICAgICAgIC8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovXG4mIzQzO1x0VkVSSUZZX09OQ0UsICAgICAgICAgLyogUmVhZCBvbmNlIGFuZCB2ZXJpZnkgY291bnQgKi9cbiYjNDM7XHRWRVJJRllfU0VNQVBIT1JFLCAgICAvKiBSZWFkIG11bHRpcGxlIHRpbWVzLCB2ZXJpZnkgcmV0dXJucyAxIGVhY2ggdGltZSAqL1xuJiM0MztcdFZFUklGWV9OT05CTE9DSywgICAgIC8qIFJlYWQgb25jZSBpbiBub25ibG9jayBtb2RlICovXG4mIzQzO1x0VkVSSUZZX0xBUkdFICAgICAgICAgLyogUmVhZCBvbmNlLCB2ZXJpZnkgbGFyZ2UgY291bnQgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9uICovXG4mIzQzO3N0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHtcbiYjNDM7XHRjb25zdCBjaGFyICpzZXNzaW9uX25hbWU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b2tlbjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZsYWdzO1xuJiM0MztcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XG4mIzQzO1x0Y29uc3QgY2hhciAqZGVzYztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9ucyAqL1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgdGVzdF9jb25maWdzW10gPSB7XG4mIzQzO1x0e1NFU1NJT05fRU1QVFksIDAsIDAsIDAsIFZFUklGWV9GTEFHUywgXCYjMzQ7RW1wdHlcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgXCYjMzQ7RGVmYXVsdFwmIzM0O30sXG4mIzQzO1x0e1NFU1NJT05fU0VNLCBUT0tFTl9TRU0sIENPVU5UX1NFTSwgRUZEX1NFTUFQSE9SRSwgVkVSSUZZX1NFTUFQSE9SRSwgXCYjMzQ7U2VtYXBob3JlXCYjMzQ7fSxcbiYjNDM7XHR7U0VTU0lPTl9OT05CTE9DSywgVE9LRU5fTk9OQkxPQ0ssIENPVU5UX05PTkJMT0NLLCBFRkRfTk9OQkxPQ0ssIFZFUklGWV9OT05CTE9DSywgXCYjMzQ7Tm9uYmxvY2tcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgXCYjMzQ7TGFyZ2UtY291bnRcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX01PRElGSUVELCBUT0tFTl9NT0RJRklFRCwgQ09VTlRfTU9ESUZJRUQgJiM0MzsgQ09VTlRfTU9ESUZZX0RFTFRBLCAwLCBWRVJJRllfT05DRSwgXCYjMzQ7TW9kaWZpZWQgYWZ0ZXIgcHJlc2VydmUgKGtleGVjIGhhbmRvdmVyKVwmIzM0O30sXG4mIzQzO307XG4mIzQzOyNkZWZpbmUgTlVNX1RFU1RfU0VTU0lPTlMgQVJSQVlfU0laRSh0ZXN0X2NvbmZpZ3MpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncywgY29uc3QgY2hhciAqZGVzYylcbiYjNDM7e1xuJiM0MztcdGludCBhY3R1YWxfZmxhZ3MgPSBmY250bChlZmQsIEZfR0VURkwpO1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XG4mIzQzO1x0aW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgXHUwMDI2IChFRkRfTk9OQkxPQ0sgfCBFRkRfQ0xPRVhFQyk7XG4mIzQzO1x0aW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyBcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0dWFsX2ZkX2ZsYWdzICE9IGV4cGVjdGVkX2ZkX2ZsYWdzKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDslczogZmxhZyBtaXNtYXRjaCAtIGV4cGVjdGVkIDB4JXgsIGdvdCAweCV4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MsIGFjdHVhbF9mZF9mbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyAgJXMgZXZlbnRmZCBmbGFncyBPSyAoMHgleClcXG5cJiMzNDssIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcbiYjNDM7XHRyZXR1cm4gYWN0dWFsX2ZsYWdzOyAvKiBSZXR1cm4gYWN0dWFsIGZsYWdzIGZvciBmdXJ0aGVyIHVzZSAqL1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGVuc3VyZV9ub25ibG9jayhpbnQgZWZkLCBpbnQgY3VycmVudF9mbGFncylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXG4mIzQzO3tcbiYjNDM7XHR1aW50NjRfdCB2YWw7XG4mIzQzO1xuJiM0MztcdGlmIChyZWFkKGVmZCwgXHUwMDI2dmFsLCBzaXplb2YodmFsKSkgIT0gc2l6ZW9mKHZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gLWVycm5vO1xuJiM0MztcbiYjNDM7XHRpZiAodmFsICE9ICh1aW50NjRfdClleHBlY3RlZF9jb3VudCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7JXM6IGV4cGVjdGVkICV1IGdvdCAlbGx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfY291bnQsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7ICAlcyBldmVudGZkIE9LOiAldVxcblwmIzM0OywgZGVzYywgZXhwZWN0ZWRfY291bnQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0dWludDY0X3QgdmFsO1xuJiM0MztcbiYjNDM7XHQvKiBSZWFkIGV4cGVjdGVkX2NvdW50IHRpbWVzLCBlYWNoIHNob3VsZCByZXR1cm4gMSAqL1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBleHBlY3RlZF9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChyZWFkKGVmZCwgXHUwMDI2dmFsLCBzaXplb2YodmFsKSkgIT0gc2l6ZW9mKHZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiAtZXJybm87XG4mIzQzO1xuJiM0MztcdFx0aWYgKHZhbCAhPSAxKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzOiBleHBlY3RlZCAxLCBnb3QgJWxsdSBhdCByZWFkICV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICBkZXNjLCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCwgaSAmIzQzOyAxKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDsgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcXG5cJiMzNDssIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICYjNDM7IDEpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogTmV4dCByZWFkIHNob3VsZCByZXR1cm4gRUFHQUlOIChubyBtb3JlIGV2ZW50cykgKi9cbiYjNDM7XHRpZiAocmVhZChlZmQsIFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpIFx1MDAzZT0gMCB8fCBlcnJubyAhPSBFQUdBSU4pIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzOiBleHBlY3RlZCBFQUdBSU4gYWZ0ZXIgJXUgcmVhZHNcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyAgJXMgZXZlbnRmZCBPSyAoJXUgcmVhZHMpXFxuXCYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVzdG9yZV9hbmRfdmVyaWZ5X2V2ZW50ZmRfZ2VuZXJpYyhpbnQgc2Vzc2lvbl9mZCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9rZW4sXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBlbnVtIHZlcmlmeV9tb2RlIG1vZGUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9yZXRyaWV2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbiYjNDM7XHRpbnQgZWZkLCByZXQgPSAwLCBhY3R1YWxfZmxhZ3M7XG4mIzQzO1xuJiM0MztcdGFyZy50b2tlbiA9IHRva2VuO1xuJiM0MztcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLWVycm5vO1xuJiM0MztcdGVmZCA9IGFyZy5mZDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChtb2RlKSB7XG4mIzQzO1x0Y2FzZSBWRVJJRllfRkxBR1M6XG4mIzQzO1x0XHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuJiM0MztcdFx0cmV0ID0gdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoZWZkLCBleHBlY3RlZF9mbGFncywgZGVzYyk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRjbG9zZShlZmQpO1xuJiM0MztcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG4mIzQzO1xuJiM0MztcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcbiYjNDM7XHRcdC8qIFZlcmlmeSBmbGFncyAmIzQzOyBzZW1hcGhvcmUgYmVoYXZpb3IgKi9cbiYjNDM7XHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuJiM0MztcdFx0aWYgKGFjdHVhbF9mbGFncyBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRyZXQgPSBhY3R1YWxfZmxhZ3M7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChlbnN1cmVfbm9uYmxvY2soZWZkLCBhY3R1YWxfZmxhZ3MpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRjYXNlIFZFUklGWV9PTkNFOlxuJiM0MztcdGNhc2UgVkVSSUZZX05PTkJMT0NLOlxuJiM0MztcdGNhc2UgVkVSSUZZX0xBUkdFOlxuJiM0MztcdFx0LyogVmVyaWZ5IGZsYWdzICYjNDM7IGNvdW50IGJlaGF2aW9yICovXG4mIzQzO1x0XHRhY3R1YWxfZmxhZ3MgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcbiYjNDM7XHRcdGlmIChhY3R1YWxfZmxhZ3MgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSB2ZXJpZnlfY291bnRfb25jZShlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRjbG9zZShlZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoaW50IHNlc3Npb25fZmQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgaW50ICplZmRfb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbiYjNDM7XHRpbnQgZWZkID0gZXZlbnRmZChjb3VudCwgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAoZWZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XG4mIzQzO1x0YXJnLmZkID0gZWZkO1xuJiM0MztcdGFyZy50b2tlbiA9IHRva2VuO1xuJiM0MztcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUFJFU0VSVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGludCByZXQgPSAtZXJybm87XG4mIzQzO1xuJiM0MztcdFx0Y2xvc2UoZWZkKTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZWZkX291dClcbiYjNDM7XHRcdCplZmRfb3V0ID0gZWZkO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNsb3NlKGVmZCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICAgY29uc3QgY2hhciAqZGVzYylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLCB0b2tlbiwgY291bnQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIGZsYWdzLCBkZXNjLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlc3Npb25fZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRmYWlsX2V4aXQoXCYjMzQ7bHVvX2NyZWF0ZV9zZXNzaW9uIGZvciAmIzM5OyVzJiMzOTtcJiMzNDssIHNlc3Npb25fbmFtZSk7XG4mIzQzO1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Vzc2lvbl9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGZhaWxfZXhpdChcJiMzNDtsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJiMzOTslcyYjMzk7XCYjMzQ7LCBzZXNzaW9uX25hbWUpO1xuJiM0MztcdHJldHVybiBzZXNzaW9uX2ZkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKGludCBzZXNzaW9uX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0ZmFpbF9leGl0KFwmIzM0O2x1b19zZXNzaW9uX2ZpbmlzaCBmb3IgJiMzOTslcyYjMzk7XCYjMzQ7LCBzZXNzaW9uX25hbWUpO1xuJiM0MztcdGNsb3NlKHNlc3Npb25fZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKHNlc3Npb25fZmQsIGNvbmZpZy1cdTAwM2V0b2tlbixcbiYjNDM7XHRcdFx0XHRcdFx0IGNvbmZpZy1cdTAwM2Vjb3VudCwgY29uZmlnLVx1MDAzZWZsYWdzLFxuJiM0MztcdFx0XHRcdFx0XHQgY29uZmlnLVx1MDAzZXZlcmlmeV9tb2RlLCBjb25maWctXHUwMDNlZGVzYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fc3RhZ2VfMShpbnQgbHVvX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDFdIFN0YXJ0aW5nIHByZS1rZXhlYyBzZXR1cCBmb3IgbXVsdGktZXZlbnRmZCB0ZXN0Li4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMV0gQ3JlYXRpbmcgc3RhdGUgZmlsZSBmb3IgbmV4dCBzdGFnZSAoMikuLi5cXG5cJiMzNDspO1xuJiM0MztcdGNyZWF0ZV9zdGF0ZV9maWxlKGx1b19mZCwgU1RBVEVfU0VTU0lPTl9OQU1FLCBTVEFURV9UT0tFTiwgMik7XG4mIzQzO1xuJiM0MztcdC8qIENyZWF0ZSBhbGwgdGVzdCBzZXNzaW9ucyAqL1xuJiM0MztcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV07XG4mIzQzO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDFdIENyZWF0aW5nIHNlc3Npb24gJiMzOTslcyYjMzk7Li4uXFxuXCYjMzQ7LCBjb25maWctXHUwMDNlc2Vzc2lvbl9uYW1lKTtcbiYjNDM7XHRcdGludCBzZXNzaW9uX2ZkID0gY3JlYXRlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIGNvbmZpZy1cdTAwM2VzZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIG1vZGlmaWVkIHNlc3Npb24gKHByZXNlcnZlIHRoZW4gbW9kaWZ5KSAqL1xuJiM0MztcdFx0aWYgKGNvbmZpZy1cdTAwM2V0b2tlbiA9PSBUT0tFTl9NT0RJRklFRCkge1xuJiM0MztcdFx0XHRpbnQgcHJlc2VydmVkX2VmZDtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZXRva2VuLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0Q09VTlRfTU9ESUZJRUQsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHRjb25maWctXHUwMDNlZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHRcJiMzNDttb2RpZmllZC1hZnRlci1wcmVzZXJ2ZVwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdFx0XHRcdFx1MDAyNnByZXNlcnZlZF9lZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZCBtb2RpZmllZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCYjMzk7cyBjb3VudCAqL1xuJiM0MztcdFx0XHR1aW50NjRfdCBtb2RpZnlfdmFsdWUgPSBDT1VOVF9NT0RJRllfREVMVEE7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgXHUwMDI2bW9kaWZ5X3ZhbHVlLFxuJiM0MztcdFx0XHQgICAgc2l6ZW9mKG1vZGlmeV92YWx1ZSkpICE9IHNpemVvZihtb2RpZnlfdmFsdWUpKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDt3cml0ZSB0byBwcmVzZXJ2ZWQgZXZlbnRmZCBhZnRlciBwcmVzZXJ2ZVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0XHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qIFN0YW5kYXJkIHNlc3Npb24gY3JlYXRpb24gKi9cbiYjNDM7XHRcdFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZChzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4mIzQzO1x0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWNvdW50LCBjb25maWctXHUwMDNlZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWRlc2MpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQgJXNcJiMzNDssIGNvbmZpZy1cdTAwM2VkZXNjKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNsb3NlKGx1b19mZCk7XG4mIzQzO1x0ZGFlbW9uaXplX2FuZF93YWl0KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8yKGludCBsdW9fZmQsIGludCBzdGF0ZV9zZXNzaW9uX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHNlc3Npb25fZmRzW05VTV9URVNUX1NFU1NJT05TXTtcbiYjNDM7XHRpbnQgc3RhZ2U7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBTdGFydGluZyBwb3N0LWtleGVjIHZlcmlmaWNhdGlvbi4uLlxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJlc3RvcmVfYW5kX3JlYWRfc3RhZ2Uoc3RhdGVfc2Vzc2lvbl9mZCwgU1RBVEVfVE9LRU4sIFx1MDAyNnN0YWdlKTtcbiYjNDM7XHRpZiAoc3RhZ2UgIT0gMilcbiYjNDM7XHRcdGZhaWxfZXhpdChcJiMzNDtFeHBlY3RlZCBzdGFnZSAyLCBidXQgc3RhdGUgZmlsZSBjb250YWlucyAlZFwmIzM0Oywgc3RhZ2UpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMl0gUmV0cmlldmluZyBhbGwgc2Vzc2lvbnMuLi5cXG5cJiMzNDspO1xuJiM0MztcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMl0gVmVyaWZ5aW5nIGV2ZW50ZmRzLi4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAodmVyaWZ5X2V2ZW50ZmRfY29uZmlnKHNlc3Npb25fZmRzW2ldLCBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV0pIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRmYWlsX2V4aXQoXCYjMzQ7dmVyaWZ5ICVzIGV2ZW50ZmRcJiMzNDssIHRlc3RfY29uZmlnc1tpXS5kZXNjKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBBbGwgZXZlbnRmZCBzZXNzaW9ucyB2ZXJpZmllZCBzdWNjZXNzZnVsbHkuXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDJdIEZpbmFsaXppbmcgYWxsIHNlc3Npb25zLi4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0ZmluaXNoX3Nlc3Npb25fY2hlY2tlZChzZXNzaW9uX2Zkc1tpXSwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBGaW5hbGl6aW5nIHN0YXRlIHNlc3Npb24uLi5cXG5cJiMzNDspO1xuJiM0MztcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXHUwMDNjIDApXG4mIzQzO1x0XHRmYWlsX2V4aXQoXCYjMzQ7bHVvX3Nlc3Npb25fZmluaXNoIGZvciBzdGF0ZSBzZXNzaW9uXCYjMzQ7KTtcbiYjNDM7XHRjbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuLS0tIEVWRU5URkRfTFVPIFRFU1QgUEFTU0VEIC0tLVxcblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbHVvX3Rlc3QoYXJnYywgYXJndiwgU1RBVEVfU0VTU0lPTl9OQU1FLFxuJiM0MztcdFx0XHRydW5fc3RhZ2VfMSwgcnVuX3N0YWdlXzIpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjUgMDY6MDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjIxYWZkMzM5ODg3NWViMTRkOWI3ZDdkMmEwMTljNDFiZTk0YzkwYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA4OWE4YTlkMjA3ZDFjNS4uMzZkNTY4ZTZjZmM3M2UgMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL01ha2VmaWxlCkBAIC0yNyw2ICYjNDM7MjcsNyBAQCBvYmoteQkJCQkmIzQzOz0gYW5vbl9pbm9kZXMubwogb2JqLSQoQ09ORklHX1NJR05BTEZEKQkJJiM0Mzs9IHNpZ25hbGZkLm8KIG9iai0kKENPTkZJR19USU1FUkZEKQkJJiM0Mzs9IHRpbWVyZmQubwogb2JqLSQoQ09ORklHX0VWRU5URkQpCQkmIzQzOz0gZXZlbnRmZC5vCiYjNDM7b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkmIzQzOz0gZXZlbnRmZF9sdW8ubwogb2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICAmIzQzOz0gYWlvLm8KIG9iai0kKENPTkZJR19GU19EQVgpCQkmIzQzOz0gZGF4Lm8KIG9iai0kKENPTkZJR19GU19FTkNSWVBUSU9OKQkmIzQzOz0gY3J5cHRvLwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRmZC5jIGIvZnMvZXZlbnRmZC5jCmluZGV4IDlkMzNhMDI3NTdkNTJiLi45Yjc2Y2YwNjEzNWE4NiAxMDA2NDQKLS0tIGEvZnMvZXZlbnRmZC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V2ZW50ZmQuYwpAQCAtMzc2LDYgJiM0MzszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKQogfQogRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jdHhfZmlsZWdldCk7CiAKJiM0MzsvKioKJiM0MzsgKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPCiYjNDM7ICogQGZpbGU6IEV2ZW50ZmQgZmlsZQomIzQzOyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWUKJiM0MzsgKiBAZmxhZ3M6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGZsYWdzIHZhbHVlCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuCiYjNDM7ICogU2luY2Ugc3RydWN0IGV2ZW50ZmRfY3R4IGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB3ZSBjYW4gYWNjZXNzIGl0cwomIzQzOyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmUKJiM0MzsgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiYjNDM7CiYjNDM7CWN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7CiYjNDM7CWlmIChJU19FUlIoY3R4KSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKGN0eCk7CiYjNDM7CiYjNDM7CS8qIFJlYWQgY291bnQgd2l0aCBsb2NrIChmbGFncyBkb24mIzM5O3QgbmVlZCBsb2NrKSAqLwomIzQzOwlzcGluX2xvY2tfaXJxc2F2ZSgmYW1wO2N0eC0mZ3Q7d3FoLmxvY2ssIGlycV9mbGFncyk7CiYjNDM7CSpjb3VudCA9IGN0eC0mZ3Q7Y291bnQ7CiYjNDM7CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtcDtjdHgtJmd0O3dxaC5sb2NrLCBpcnFfZmxhZ3MpOwomIzQzOwomIzQzOwkqZmxhZ3MgPSBjdHgtJmd0O2ZsYWdzOwomIzQzOwomIzQzOwlldmVudGZkX2N0eF9wdXQoY3R4KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSk7CiYjNDM7CiBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHggX19mcmVlKGtmcmVlKSA9IE5VTEw7CkBAIC00MTEsNiAmIzQzOzQ0NSwxMiBAQCBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpCiAJcmV0dXJuIGZkX3B1Ymxpc2goZmRmKTsKIH0KIAomIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jcmVhdGUpOwomIzQzOwogU1lTQ0FMTF9ERUZJTkUyKGV2ZW50ZmQyLCB1bnNpZ25lZCBpbnQsIGNvdW50LCBpbnQsIGZsYWdzKQogewogCXJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9ldmVudGZkX2x1by5jIGIvZnMvZXZlbnRmZF9sdW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNzgxZDkwNjM1YzUyYWUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkX2x1by5jCkBAIC0wLDAgJiM0MzsxLDI1MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLgomIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiAmbHQ7ZHVhbmNoZW5naGFvQGt5bGlub3MuY24mZ3Q7CiYjNDM7ICovCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogRE9DOiBFdmVudGZkIFByZXNlcnZhdGlvbiB2aWEgTFVPCiYjNDM7ICoKJiM0MzsgKiBPdmVydmlldwomIzQzOyAqID09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZQomIzQzOyAqIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgZmlsZSBwcmVzZXJ2YXRpb24uIFRoaXMgYWxsb3dzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMKJiM0MzsgKiB0aGF0IHVzZSBldmVudGZkIGZvciBldmVudCBub3RpZmljYXRpb24gdG8gbWFpbnRhaW4gdGhlaXIgc3RhdGUgYWNyb3NzIGtlcm5lbAomIzQzOyAqIHVwZGF0ZXMuCiYjNDM7ICoKJiM0MzsgKiBFdmVudGZkIGlzIGEgc2ltcGxlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdGhhdCB1c2VzIGEgNjQtYml0IGNvdW50ZXIgZm9yCiYjNDM7ICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4KJiM0MzsgKiBUaGUgcHJlc2VydmF0aW9uIGVuc3VyZXMgdGhhdCBwZW5kaW5nIGV2ZW50cyBhbmQgY29uZmlndXJhdGlvbiBhcmUgbm90IGxvc3QKJiM0MzsgKiBkdXJpbmcga2V4ZWMuCiYjNDM7ICoKJiM0MzsgKiBUaGUgcHJlc2VydmF0aW9uIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB0cmFuc3BhcmVudC4gT25seSBzZWxlY3QgcHJvcGVydGllcyBvZgomIzQzOyAqIHRoZSBldmVudGZkIGFyZSBwcmVzZXJ2ZWQuIEFsbCBvdGhlcnMgYXJlIHJlc2V0IHRvIGRlZmF1bHQuIFRoZSBwcmVzZXJ2ZWQKJiM0MzsgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuCiYjNDM7ICoKJiM0MzsgKiBQcmVzZXJ2ZWQgUHJvcGVydGllcwomIzQzOyAqID09PT09PT09PT09PT09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2YgdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWM6CiYjNDM7ICoKJiM0MzsgKiBDb3VudGVyIFZhbHVlCiYjNDM7ICogICBUaGUgY3VycmVudCA2NC1iaXQgY291bnRlciB2YWx1ZSBpcyBwcmVzZXJ2ZWQuIFRoaXMgaW5jbHVkZXMgYW55IHBlbmRpbmcKJiM0MzsgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLgomIzQzOyAqCiYjNDM7ICogRmlsZSBGbGFncwomIzQzOyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLgomIzQzOyAqICAgVGhlc2UgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgcmVhZC93cml0ZSBvcGVyYXRpb25zIGFuZCBmaWxlIGRlc2NyaXB0b3IKJiM0MzsgKiAgIGluaGVyaXRhbmNlLgomIzQzOyAqCiYjNDM7ICogTm9uLVByZXNlcnZlZCBQcm9wZXJ0aWVzCiYjNDM7ICogPT09PT09PT09PT09PT09PT09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBBbGwgcHJvcGVydGllcyB3aGljaCBhcmUgbm90IHByZXNlcnZlZCBtdXN0IGJlIGFzc3VtZWQgdG8gYmUgcmVzZXQgdG8KJiM0MzsgKiBkZWZhdWx0LiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgb2YgdGhvc2UgcHJvcGVydGllcyB3aGljaCBtYXkgYmUgbW9yZSBvZgomIzQzOyAqIG5vdGUuCiYjNDM7ICoKJiM0MzsgKiBGaWxlIERlc2NyaXB0b3IgTnVtYmVyCiYjNDM7ICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlCiYjNDM7ICogICBldmVudGZkIHdpbGwgYmUgYXNzaWduZWQgYSBuZXcgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MuCiYjNDM7ICoKJiM0MzsgKiBXYWl0IFF1ZXVlIFN0YXRlCiYjNDM7ICogICBBbnkgcHJvY2Vzc2VzIGN1cnJlbnRseSBibG9ja2VkIG9uIHJlYWQoKSBvcGVyYXRpb25zIHdpbGwgYmUgd29rZW4gdXAgYW5kCiYjNDM7ICogICBuZWVkIHRvIHJlLWVzdGFibGlzaCB0aGVpciBibG9ja2luZyBzdGF0ZSBpZiBkZXNpcmVkLgomIzQzOyAqCiYjNDM7ICogRmlsZSBQb3NpdGlvbgomIzQzOyAqICAgRXZlbnRmZCBmaWxlcyBkb24mIzM5O3QgaGF2ZSBhIHRyYWRpdGlvbmFsIGZpbGUgcG9zaXRpb24sIGJ1dCBhbnkgaW50ZXJuYWwKJiM0MzsgKiAgIHN0YXRlIHJlbGF0ZWQgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBpcyByZXNldC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2V4ZWNfaGFuZG92ZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2hvL2FiaS9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpdmV1cGRhdGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50ZmQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYW5vbl9pbm9kZXMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaWRyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9rcmVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZkdGFibGUuaCZndDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjsKJiM0MzsJdTY0IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwkvKiBHZXQgZXZlbnRmZCBzdGF0ZSBzYWZlbHkgKi8KJiM0MzsJZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtJmd0O2ZpbGUsICZhbXA7Y291bnQsICZhbXA7ZmxhZ3MpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZ2V0IGV2ZW50ZmQgc3RhdGU6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7CiYjNDM7CWlmIChJU19FUlIoc2VyKSkgewomIzQzOwkJZXJyID0gUFRSX0VSUihzZXIpOwomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIHByZXNlcnZlIG1lbW9yeTogJWRcbiYjMzQ7LCBlcnIpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTYXZlIGV2ZW50ZmQgc3RhdGUgKi8KJiM0MzsJc2VyLSZndDtjb3VudCA9IGNvdW50OwomIzQzOwlzZXItJmd0O2ZsYWdzID0gZmxhZ3M7CiYjNDM7CiYjNDM7CXByX2RlYnVnKCYjMzQ7UHJlc2VydmVkIGV2ZW50ZmQ6IGNvdW50PSVsbHUsIGZsYWdzPTB4JXhcbiYjMzQ7LAomIzQzOwkJc2VyLSZndDtjb3VudCwgc2VyLSZndDtmbGFncyk7CiYjNDM7CiYjNDM7CS8qIFJldHVybiBwaHlzaWNhbCBhZGRyZXNzIG9mIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlICovCiYjNDM7CWFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSA9IHZpcnRfdG9fcGh5cyhzZXIpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBldmVudGZkX2x1b19mcmVlemUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyOwomIzQzOwl1NjQgY291bnQ7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFnczsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKTsKJiM0MzsKJiM0MzsJLyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovCiYjNDM7CWVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLSZndDtmaWxlLCAmYW1wO2NvdW50LCAmYW1wO2ZsYWdzKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CWlmIChzZXItJmd0O2NvdW50ICE9IGNvdW50KSB7CiYjNDM7CQlwcl9kZWJ1ZygmIzM0O1dBUk5JTkc6IENvdW50IGNoYW5nZWQgZHVyaW5nIHByZXNlcnZlLSZndDtmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxuJiMzNDssCiYjNDM7CQkJIHNlci0mZ3Q7Y291bnQsIGNvdW50KTsKJiM0MzsJfQomIzQzOwomIzQzOwlzZXItJmd0O2NvdW50ID0gY291bnQ7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBldmVudGZkX2x1b191bnByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2VyID0gcGh5c190b192aXJ0KGFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSk7CiYjNDM7CWtob191bnByZXNlcnZlX2ZyZWUoc2VyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBldmVudGZkX2x1b19yZXRyaWV2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7CiYjNDM7CXN0cnVjdCBldmVudGZkX2N0eCAqY3R4OwomIzQzOwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CiYjNDM7CWludCBldmVudGZkOwomIzQzOwomIzQzOwlzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKTsKJiM0MzsJaWYgKCFzZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJLyogQ3JlYXRlIGEgbmV3IGV2ZW50ZmQgd2l0aCB0aGUgcHJlc2VydmVkIGNvdW50IGFuZCBmbGFncyAqLwomIzQzOwlldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLSZndDtjb3VudCwgc2VyLSZndDtmbGFncyk7CiYjNDM7CWlmIChldmVudGZkICZsdDsgMCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBldmVudGZkOiAlZFxuJiMzNDssIGV2ZW50ZmQpOwomIzQzOwkJcmV0dXJuIGV2ZW50ZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmlsZSA9IGZnZXQoZXZlbnRmZCk7CiYjNDM7CWlmICghZmlsZSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGdldCBmaWxlIGZyb20gZmRcbiYjMzQ7KTsKJiM0MzsJCWNsb3NlX2ZkKGV2ZW50ZmQpOwomIzQzOwkJcmV0dXJuIC1FQkFERjsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZV9mZChldmVudGZkKTsKJiM0MzsKJiM0MzsJLyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi8KJiM0MzsJY3R4ID0gZXZlbnRmZF9jdHhfZmlsZWdldChmaWxlKTsKJiM0MzsJaWYgKElTX0VSUihjdHgpKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZ2V0IGNvbnRleHQgZnJvbSBmaWxlXG4mIzM0Oyk7CiYjNDM7CQlmcHV0KGZpbGUpOwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKJiM0MzsJfQomIzQzOwomIzQzOwlldmVudGZkX2N0eF9wdXQoY3R4KTsKJiM0MzsKJiM0MzsJYXJncy0mZ3Q7ZmlsZSA9IGZpbGU7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyOwomIzQzOwomIzQzOwlpZiAoYXJncy0mZ3Q7cmV0cmlldmVfc3RhdHVzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAoIWFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2VyID0gcGh5c190b192aXJ0KGFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSk7CiYjNDM7CWlmICghc2VyKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlraG9fcmVzdG9yZV9mcmVlKHNlcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsCiYjNDM7CQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDsKJiM0MzsKJiM0MzsJaWYgKCFmaWxlLSZndDtmX29wKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUcnkgdG8gZ2V0IGV2ZW50ZmQgY29udGV4dCAtIHRoaXMgd2lsbCBmYWlsIGlmIG5vdCBhbiBldmVudGZkICovCiYjNDM7CWN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7CiYjNDM7CWlmIChJU19FUlIoY3R4KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZXZlbnRmZF9jdHhfcHV0KGN0eCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcHMgZXZlbnRmZF9sdW9fZmlsZV9vcHMgPSB7CiYjNDM7CS5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3ByZXNlcnZlLAomIzQzOwkudW5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3VucHJlc2VydmUsCiYjNDM7CS5mcmVlemUgPSBldmVudGZkX2x1b19mcmVlemUsCiYjNDM7CS5yZXRyaWV2ZSA9IGV2ZW50ZmRfbHVvX3JldHJpZXZlLAomIzQzOwkuZmluaXNoID0gZXZlbnRmZF9sdW9fZmluaXNoLAomIzQzOwkuY2FuX3ByZXNlcnZlID0gZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlLAomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHsKJiM0MzsJLm9wcyA9ICZhbXA7ZXZlbnRmZF9sdW9fZmlsZV9vcHMsCiYjNDM7CS5jb21wYXRpYmxlID0gRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnIgPSBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcigmYW1wO2V2ZW50ZmRfbHVvX2hhbmRsZXIpOwomIzQzOwomIzQzOwlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IC1FT1BOT1RTVVBQKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXG4mIzM0OywKJiM0MzsJCSAgICAgICBFUlJfUFRSKGVycikpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oIGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmgKaW5kZXggZTMyYmVlNDM0NWZiOWYuLjcwM2UxYTEyNmM0ZDQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaApAQCAtMzUsNiAmIzQzOzM1LDggQEAgdm9pZCBldmVudGZkX2N0eF9wdXQoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgpOwogc3RydWN0IGZpbGUgKmV2ZW50ZmRfZmdldChpbnQgZmQpOwogc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9mZGdldChpbnQgZmQpOwogc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKTsKJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpOwomIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKTsKIHZvaWQgZXZlbnRmZF9zaWduYWxfbWFzayhzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCwgX19wb2xsX3QgbWFzayk7CiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCwKIAkJCQkgIF9fdTY0ICpjbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE0OGJlYWM2YmNjNzYwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaApAQCAtMCwwICYjNDM7MSwzOSBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLgomIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiAmbHQ7ZHVhbmNoZW5naGFvQGt5bGlub3MuY24mZ3Q7CiYjNDM7ICovCiYjNDM7CiYjNDM7I2lmbmRlZiBfTElOVVhfS0hPX0FCSV9FVkVOVEZEX0gKJiM0MzsjZGVmaW5lIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRXZlbnRmZCBMaXZlIFVwZGF0ZSBBQkkKJiM0MzsgKgomIzQzOyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy4KJiM0MzsgKgomIzQzOyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYAomIzQzOyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uCiYjNDM7ICoKJiM0MzsgKi8KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkCiYjNDM7ICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlCiYjNDM7ICogQGZsYWdzOiBGaWxlIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKQomIzQzOyAqCiYjNDM7ICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZAomIzQzOyAqIGFmdGVyIGtleGVjLiBUaGUgY291bnQgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZXZlbnQgY291bnRlciwKJiM0MzsgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLgomIzQzOyAqLwomIzQzO3N0cnVjdCBldmVudGZkX2x1b19zZXIgewomIzQzOwlfX3U2NCBjb3VudDsKJiM0MzsJdW5zaWduZWQgaW50ICBmbGFnczsKJiM0Mzt9IF9fcGFja2VkOwomIzQzOwomIzQzOy8qIFRoZSBjb21wYXRpYmlsaXR5IHN0cmluZyBmb3IgZXZlbnRmZCBmaWxlIGhhbmRsZXIgKi8KJiM0MzsjZGVmaW5lIEVWRU5URkRfTFVPX0ZIX0NPTVBBVElCTEUJJiMzNDtldmVudGZkLXYxJiMzNDsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZwppbmRleCBjMTNhZjM4YmEyM2FiOC4uMTM2MWI1NzMzZjQxMmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZwpAQCAtODYsNCAmIzQzOzg2LDIwIEBAIGNvbmZpZyBMSVZFVVBEQVRFX01FTUZECiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKJiM0Mztjb25maWcgTElWRVVQREFURV9FVkVOVEZECiYjNDM7CWJvb2wgJiMzNDtFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0JiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBFVkVOVEZECiYjNDM7CWRlcGVuZHMgb24gTElWRVVQREFURQomIzQzOwloZWxwCiYjNDM7CSAgRW5hYmxlIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0IGZvciBldmVudGZkIGZpbGUgZGVzY3JpcHRvcnMuCiYjNDM7CSAgVGhpcyBhbGxvd3MgZXZlbnRmZCBmaWxlcyB0byBiZSBwcmVzZXJ2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBrZXhlYwomIzQzOwkgIG9wZXJhdGlvbnMsIG1haW50YWluaW5nIHRoZWlyIGNvdW50ZXIgdmFsdWVzIGFuZCBmbGFncy4KJiM0MzsKJiM0MzsJICBFdmVudGZkIGZpbGVzIGFyZSBjb21tb25seSB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb24gYmV0d2VlbgomIzQzOwkgIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4gV2l0aCB0aGlzCiYjNDM7CSAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbAomIzQzOwkgIGR1cmluZyBsaXZlIHVwZGF0ZSBvcGVyYXRpb25zLgomIzQzOwomIzQzOwkgIElmIHVuc3VyZSwgc2F5IE4uCiYjNDM7CiBlbmRtZW51CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZQppbmRleCAzMDY4OWQyMmNiMDIxNi4uZTA5MmUzOGZhNmY2YzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZQpAQCAtOCw2ICYjNDM7OCw3IEBAIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fa2V4ZWNfc2ltcGxlCiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX211bHRpX3Nlc3Npb24KIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fc3RyZXNzX3Nlc3Npb25zCiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3N0cmVzc19maWxlcwomIzQzO1RFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fdGVzdF9ldmVudGZkCiAKIFRFU1RfRklMRVMgJiM0Mzs9IGRvX2tleGVjLnNoCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcKaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZwpAQCAtOSwzICYjNDM7OSw1IEBAIENPTkZJR19MSVZFVVBEQVRFX1RFU1Q9eQogQ09ORklHX01FTUZEX0NSRUFURT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1NITUVNPXkKJiM0MztDT05GSUdfRVZFTlRGRD15CiYjNDM7Q09ORklHX0xJVkVVUERBVEVfRVZFTlRGRD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi45NGVmM2JjNjZhZDk3MQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jCkBAIC0wLDAgJiM0MzsxLDM3NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uCiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuICZsdDtkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jbiZndDsKJiM0MzsgKi8KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE11bHRpLXNlc3Npb24ga2V4ZWMgc2VsZnRlc3QgZm9yIGV2ZW50ZmQgTFVPIHN1cHBvcnQuCiYjNDM7ICoKJiM0MzsgKiBNb2RlbGVkIGFmdGVyIGx1b19tdWx0aV9zZXNzaW9uLmMuCiYjNDM7ICogSXQgY3JlYXRlcyBtdWx0aXBsZSBMVU8gc2Vzc2lvbnMsIGVhY2ggcHJlc2VydmluZyBkaWZmZXJlbnQgZXZlbnRmZCB0eXBlcywKJiM0MzsgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGludC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2x1b190ZXN0X3V0aWxzLmgmIzM0OwomIzQzOwomIzQzOy8qIFNlc3Npb24gbmFtZXMgKi8KJiM0MzsjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgICYjMzQ7ZXZlbnRmZC1lbXB0eSYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX0RFRkFVTFQgICAmIzM0O2V2ZW50ZmQtZGVmYXVsdCYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX1NFTSAgICAgICAmIzM0O2V2ZW50ZmQtc2VtJiMzNDsKJiM0MzsjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgICYjMzQ7ZXZlbnRmZC1ub25ibG9jayYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX0xBUkdFICAgICAmIzM0O2V2ZW50ZmQtbGFyZ2UmIzM0OwomIzQzOyNkZWZpbmUgU0VTU0lPTl9NT0RJRklFRCAgJiMzNDtldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlJiMzNDsKJiM0MzsKJiM0MzsvKiBUb2tlbnMgKi8KJiM0MzsjZGVmaW5lIFRPS0VOX0RFRkFVTFQgICAgICAgMHhDQUZFQkFCRQomIzQzOyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGCiYjNDM7I2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUYKJiM0MzsjZGVmaW5lIFRPS0VOX0xBUkdFICAgICAgICAgMHhCRUVGQ0FGRQomIzQzOyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0CiYjNDM7CiYjNDM7LyogQ291bnRzICovCiYjNDM7I2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDIKJiM0MzsjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMAomIzQzOyNkZWZpbmUgQ09VTlRfRVhQRUNURUQgIChDT1VOVF9JTklUSUFMICYjNDM7IENPVU5UX1dSSVRFKSAvKiA1MiAqLwomIzQzOyNkZWZpbmUgQ09VTlRfU0VNICAgICAgIDUKJiM0MzsjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDAKJiM0MzsjZGVmaW5lIENPVU5UX0xBUkdFICAgICAoKHVuc2lnbmVkIGludCktMSkgLyogVUlOVF9NQVggKi8KJiM0MzsjZGVmaW5lIENPVU5UX01PRElGSUVEICAyNQomIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OQomIzQzOwomIzQzOy8qIFN0YXRlIHRyYWNraW5nICovCiYjNDM7I2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgJiMzNDtldmVudGZkX211bHRpX3N0YXRlJiMzNDsKJiM0MzsjZGVmaW5lIFNUQVRFX1RPS0VOICAgICAgICA5OTcKJiM0MzsKJiM0MzsvKiBFdmVudGZkIHZlcmlmaWNhdGlvbiBtb2RlcyAqLwomIzQzO2VudW0gdmVyaWZ5X21vZGUgewomIzQzOwlWRVJJRllfRkxBR1MsICAgICAgICAvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqLwomIzQzOwlWRVJJRllfT05DRSwgICAgICAgICAvKiBSZWFkIG9uY2UgYW5kIHZlcmlmeSBjb3VudCAqLwomIzQzOwlWRVJJRllfU0VNQVBIT1JFLCAgICAvKiBSZWFkIG11bHRpcGxlIHRpbWVzLCB2ZXJpZnkgcmV0dXJucyAxIGVhY2ggdGltZSAqLwomIzQzOwlWRVJJRllfTk9OQkxPQ0ssICAgICAvKiBSZWFkIG9uY2UgaW4gbm9uYmxvY2sgbW9kZSAqLwomIzQzOwlWRVJJRllfTEFSR0UgICAgICAgICAvKiBSZWFkIG9uY2UsIHZlcmlmeSBsYXJnZSBjb3VudCAqLwomIzQzO307CiYjNDM7CiYjNDM7LyogVGVzdCBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gKi8KJiM0MztzdHJ1Y3QgdGVzdF9zZXNzaW9uX2NvbmZpZyB7CiYjNDM7CWNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b2tlbjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7CiYjNDM7CWNvbnN0IGNoYXIgKmRlc2M7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgdGVzdF9jb25maWdzW10gPSB7CiYjNDM7CXtTRVNTSU9OX0VNUFRZLCAwLCAwLCAwLCBWRVJJRllfRkxBR1MsICYjMzQ7RW1wdHkmIzM0O30sCiYjNDM7CXtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgJiMzNDtEZWZhdWx0JiMzNDt9LAomIzQzOwl7U0VTU0lPTl9TRU0sIFRPS0VOX1NFTSwgQ09VTlRfU0VNLCBFRkRfU0VNQVBIT1JFLCBWRVJJRllfU0VNQVBIT1JFLCAmIzM0O1NlbWFwaG9yZSYjMzQ7fSwKJiM0MzsJe1NFU1NJT05fTk9OQkxPQ0ssIFRPS0VOX05PTkJMT0NLLCBDT1VOVF9OT05CTE9DSywgRUZEX05PTkJMT0NLLCBWRVJJRllfTk9OQkxPQ0ssICYjMzQ7Tm9uYmxvY2smIzM0O30sCiYjNDM7CXtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgJiMzNDtMYXJnZS1jb3VudCYjMzQ7fSwKJiM0MzsJe1NFU1NJT05fTU9ESUZJRUQsIFRPS0VOX01PRElGSUVELCBDT1VOVF9NT0RJRklFRCAmIzQzOyBDT1VOVF9NT0RJRllfREVMVEEsIDAsIFZFUklGWV9PTkNFLCAmIzM0O01vZGlmaWVkIGFmdGVyIHByZXNlcnZlIChrZXhlYyBoYW5kb3ZlcikmIzM0O30sCiYjNDM7fTsKJiM0MzsjZGVmaW5lIE5VTV9URVNUX1NFU1NJT05TIEFSUkFZX1NJWkUodGVzdF9jb25maWdzKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJaW50IGFjdHVhbF9mbGFncyA9IGZjbnRsKGVmZCwgRl9HRVRGTCk7CiYjNDM7CiYjNDM7CWlmIChhY3R1YWxfZmxhZ3MgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC1lcnJubzsKJiM0MzsKJiM0MzsJaW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgJmFtcDsgKEVGRF9OT05CTE9DSyB8IEVGRF9DTE9FWEVDKTsKJiM0MzsJaW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyAmYW1wOyAoT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7CiYjNDM7CiYjNDM7CWlmIChhY3R1YWxfZmRfZmxhZ3MgIT0gZXhwZWN0ZWRfZmRfZmxhZ3MpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXM6IGZsYWcgbWlzbWF0Y2ggLSBleHBlY3RlZCAweCV4LCBnb3QgMHgleFxuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzLCBhY3R1YWxfZmRfZmxhZ3MpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDsgICVzIGV2ZW50ZmQgZmxhZ3MgT0sgKDB4JXgpXG4mIzM0OywgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MpOwomIzQzOwlyZXR1cm4gYWN0dWFsX2ZsYWdzOyAvKiBSZXR1cm4gYWN0dWFsIGZsYWdzIGZvciBmdXJ0aGVyIHVzZSAqLwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGVuc3VyZV9ub25ibG9jayhpbnQgZWZkLCBpbnQgY3VycmVudF9mbGFncykKJiM0Mzt7CiYjNDM7CXJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpCiYjNDM7ewomIzQzOwl1aW50NjRfdCB2YWw7CiYjNDM7CiYjNDM7CWlmIChyZWFkKGVmZCwgJmFtcDt2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSkKJiM0MzsJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CWlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0OyVzOiBleHBlY3RlZCAldSBnb3QgJWxsdVxuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50LCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0OyAgJXMgZXZlbnRmZCBPSzogJXVcbiYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJdWludDY0X3QgdmFsOwomIzQzOwomIzQzOwkvKiBSZWFkIGV4cGVjdGVkX2NvdW50IHRpbWVzLCBlYWNoIHNob3VsZCByZXR1cm4gMSAqLwomIzQzOwlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSAmbHQ7IGV4cGVjdGVkX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHJlYWQoZWZkLCAmYW1wO3ZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKQomIzQzOwkJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CQlpZiAodmFsICE9IDEpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0OyVzOiBleHBlY3RlZCAxLCBnb3QgJWxsdSBhdCByZWFkICV1XG4mIzM0OywKJiM0MzsJCQkJICAgICAgIGRlc2MsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsLCBpICYjNDM7IDEpOwomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDsgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcbiYjMzQ7LCBkZXNjLCAodW5zaWduZWQgaW50KXZhbCwgaSAmIzQzOyAxKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBOZXh0IHJlYWQgc2hvdWxkIHJldHVybiBFQUdBSU4gKG5vIG1vcmUgZXZlbnRzKSAqLwomIzQzOwlpZiAocmVhZChlZmQsICZhbXA7dmFsLCBzaXplb2YodmFsKSkgJmd0Oz0gMCB8fCBlcnJubyAhPSBFQUdBSU4pIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXM6IGV4cGVjdGVkIEVBR0FJTiBhZnRlciAldSByZWFkc1xuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50KTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7ICAlcyBldmVudGZkIE9LICgldSByZWFkcylcbiYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoaW50IHNlc3Npb25fZmQsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLAomIzQzOwkJCQkJICAgICAgZW51bSB2ZXJpZnlfbW9kZSBtb2RlLAomIzQzOwkJCQkJICAgICAgY29uc3QgY2hhciAqZGVzYykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXZldXBkYXRlX3Nlc3Npb25fcmV0cmlldmVfZmQgYXJnID0geyAuc2l6ZSA9IHNpemVvZihhcmcpIH07CiYjNDM7CWludCBlZmQsIHJldCA9IDAsIGFjdHVhbF9mbGFnczsKJiM0MzsKJiM0MzsJYXJnLnRva2VuID0gdG9rZW47CiYjNDM7CWlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsICZhbXA7YXJnKSAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwllZmQgPSBhcmcuZmQ7CiYjNDM7CiYjNDM7CXN3aXRjaCAobW9kZSkgewomIzQzOwljYXNlIFZFUklGWV9GTEFHUzoKJiM0MzsJCS8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovCiYjNDM7CQlyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWNsb3NlKGVmZCk7CiYjNDM7CQlyZXR1cm4gcmV0ICZsdDsgMCA/IHJldCA6IDA7CiYjNDM7CiYjNDM7CWNhc2UgVkVSSUZZX1NFTUFQSE9SRToKJiM0MzsJCS8qIFZlcmlmeSBmbGFncyAmIzQzOyBzZW1hcGhvcmUgYmVoYXZpb3IgKi8KJiM0MzsJCWFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpOwomIzQzOwkJaWYgKGFjdHVhbF9mbGFncyAmbHQ7IDApIHsKJiM0MzsJCQlyZXQgPSBhY3R1YWxfZmxhZ3M7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoZW5zdXJlX25vbmJsb2NrKGVmZCwgYWN0dWFsX2ZsYWdzKSAmbHQ7IDApIHsKJiM0MzsJCQlyZXQgPSAtZXJybm87CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlyZXQgPSB2ZXJpZnlfc2VtYXBob3JlX2JlaGF2aW9yKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWNhc2UgVkVSSUZZX09OQ0U6CiYjNDM7CWNhc2UgVkVSSUZZX05PTkJMT0NLOgomIzQzOwljYXNlIFZFUklGWV9MQVJHRToKJiM0MzsJCS8qIFZlcmlmeSBmbGFncyAmIzQzOyBjb3VudCBiZWhhdmlvciAqLwomIzQzOwkJYWN0dWFsX2ZsYWdzID0gdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoZWZkLCBleHBlY3RlZF9mbGFncywgZGVzYyk7CiYjNDM7CQlpZiAoYWN0dWFsX2ZsYWdzICZsdDsgMCkgewomIzQzOwkJCXJldCA9IGFjdHVhbF9mbGFnczsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXJldCA9IHZlcmlmeV9jb3VudF9vbmNlKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWNsb3NlKGVmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoaW50IHNlc3Npb25fZmQsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbiwKJiM0MzsJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsCiYjNDM7CQkJCQkgICAgICAgaW50ICplZmRfb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTsKJiM0MzsJaW50IGVmZCA9IGV2ZW50ZmQoY291bnQsIGZsYWdzKTsKJiM0MzsKJiM0MzsJaWYgKGVmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwomIzQzOwlhcmcuZmQgPSBlZmQ7CiYjNDM7CWFyZy50b2tlbiA9IHRva2VuOwomIzQzOwlpZiAoaW9jdGwoc2Vzc2lvbl9mZCwgTElWRVVQREFURV9TRVNTSU9OX1BSRVNFUlZFX0ZELCAmYW1wO2FyZykgJmx0OyAwKSB7CiYjNDM7CQlpbnQgcmV0ID0gLWVycm5vOwomIzQzOwomIzQzOwkJY2xvc2UoZWZkKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGVmZF9vdXQpCiYjNDM7CQkqZWZkX291dCA9IGVmZDsKJiM0MzsJZWxzZQomIzQzOwkJY2xvc2UoZWZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbiwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpCiYjNDM7ewomIzQzOwlyZXR1cm4gY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoc2Vzc2lvbl9mZCwgdG9rZW4sIGNvdW50LAomIzQzOwkJCQkJCSAgIGZsYWdzLCBkZXNjLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSkKJiM0Mzt7CiYjNDM7CWludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTsKJiM0MzsKJiM0MzsJaWYgKHNlc3Npb25fZmQgJmx0OyAwKQomIzQzOwkJZmFpbF9leGl0KCYjMzQ7bHVvX2NyZWF0ZV9zZXNzaW9uIGZvciAmIzM5OyVzJiMzOTsmIzM0Oywgc2Vzc2lvbl9uYW1lKTsKJiM0MzsJcmV0dXJuIHNlc3Npb25fZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSkKJiM0Mzt7CiYjNDM7CWludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwlpZiAoc2Vzc2lvbl9mZCAmbHQ7IDApCiYjNDM7CQlmYWlsX2V4aXQoJiMzNDtsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJiMzOTslcyYjMzk7JiMzNDssIHNlc3Npb25fbmFtZSk7CiYjNDM7CXJldHVybiBzZXNzaW9uX2ZkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKGludCBzZXNzaW9uX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpCiYjNDM7ewomIzQzOwlpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpICZsdDsgMCkKJiM0MzsJCWZhaWxfZXhpdCgmIzM0O2x1b19zZXNzaW9uX2ZpbmlzaCBmb3IgJiMzOTslcyYjMzk7JiMzNDssIHNlc3Npb25fbmFtZSk7CiYjNDM7CWNsb3NlKHNlc3Npb25fZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZykKJiM0Mzt7CiYjNDM7CXJldHVybiByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKHNlc3Npb25fZmQsIGNvbmZpZy0mZ3Q7dG9rZW4sCiYjNDM7CQkJCQkJIGNvbmZpZy0mZ3Q7Y291bnQsIGNvbmZpZy0mZ3Q7ZmxhZ3MsCiYjNDM7CQkJCQkJIGNvbmZpZy0mZ3Q7dmVyaWZ5X21vZGUsIGNvbmZpZy0mZ3Q7ZGVzYyk7CiYjNDM7fQomIzQzOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8xKGludCBsdW9fZmQpCiYjNDM7ewomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAxXSBTdGFydGluZyBwcmUta2V4ZWMgc2V0dXAgZm9yIG11bHRpLWV2ZW50ZmQgdGVzdC4uLlxuJiMzNDspOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAxXSBDcmVhdGluZyBzdGF0ZSBmaWxlIGZvciBuZXh0IHN0YWdlICgyKS4uLlxuJiMzNDspOwomIzQzOwljcmVhdGVfc3RhdGVfZmlsZShsdW9fZmQsIFNUQVRFX1NFU1NJT05fTkFNRSwgU1RBVEVfVE9LRU4sIDIpOwomIzQzOwomIzQzOwkvKiBDcmVhdGUgYWxsIHRlc3Qgc2Vzc2lvbnMgKi8KJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSAmYW1wO3Rlc3RfY29uZmlnc1tpXTsKJiM0MzsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDFdIENyZWF0aW5nIHNlc3Npb24gJiMzOTslcyYjMzk7Li4uXG4mIzM0OywgY29uZmlnLSZndDtzZXNzaW9uX25hbWUpOwomIzQzOwkJaW50IHNlc3Npb25fZmQgPSBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgY29uZmlnLSZndDtzZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovCiYjNDM7CQlpZiAoY29uZmlnLSZndDt0b2tlbiA9PSBUT0tFTl9NT0RJRklFRCkgewomIzQzOwkJCWludCBwcmVzZXJ2ZWRfZWZkOwomIzQzOwomIzQzOwkJCWlmIChjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLAomIzQzOwkJCQkJCQkJY29uZmlnLSZndDt0b2tlbiwKJiM0MzsJCQkJCQkJCUNPVU5UX01PRElGSUVELAomIzQzOwkJCQkJCQkJY29uZmlnLSZndDtmbGFncywKJiM0MzsJCQkJCQkJCSYjMzQ7bW9kaWZpZWQtYWZ0ZXItcHJlc2VydmUmIzM0OywKJiM0MzsJCQkJCQkJCSZhbXA7cHJlc2VydmVkX2VmZCkgJmx0OyAwKQomIzQzOwkJCQlmYWlsX2V4aXQoJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZCBtb2RpZmllZCYjMzQ7KTsKJiM0MzsKJiM0MzsJCQkvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCYjMzk7cyBjb3VudCAqLwomIzQzOwkJCXVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTsKJiM0MzsKJiM0MzsJCQlpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgJmFtcDttb2RpZnlfdmFsdWUsCiYjNDM7CQkJICAgIHNpemVvZihtb2RpZnlfdmFsdWUpKSAhPSBzaXplb2YobW9kaWZ5X3ZhbHVlKSkKJiM0MzsJCQkJZmFpbF9leGl0KCYjMzQ7d3JpdGUgdG8gcHJlc2VydmVkIGV2ZW50ZmQgYWZ0ZXIgcHJlc2VydmUmIzM0Oyk7CiYjNDM7CiYjNDM7CQkJY2xvc2UocHJlc2VydmVkX2VmZCk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qIFN0YW5kYXJkIHNlc3Npb24gY3JlYXRpb24gKi8KJiM0MzsJCQlpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKHNlc3Npb25fZmQsIGNvbmZpZy0mZ3Q7dG9rZW4sCiYjNDM7CQkJCQkJCWNvbmZpZy0mZ3Q7Y291bnQsIGNvbmZpZy0mZ3Q7ZmxhZ3MsCiYjNDM7CQkJCQkJCWNvbmZpZy0mZ3Q7ZGVzYykgJmx0OyAwKQomIzQzOwkJCQlmYWlsX2V4aXQoJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQgJXMmIzM0OywgY29uZmlnLSZndDtkZXNjKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsdW9fZmQpOwomIzQzOwlkYWVtb25pemVfYW5kX3dhaXQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnVuX3N0YWdlXzIoaW50IGx1b19mZCwgaW50IHN0YXRlX3Nlc3Npb25fZmQpCiYjNDM7ewomIzQzOwlpbnQgc2Vzc2lvbl9mZHNbTlVNX1RFU1RfU0VTU0lPTlNdOwomIzQzOwlpbnQgc3RhZ2U7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDJdIFN0YXJ0aW5nIHBvc3Qta2V4ZWMgdmVyaWZpY2F0aW9uLi4uXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXJlc3RvcmVfYW5kX3JlYWRfc3RhZ2Uoc3RhdGVfc2Vzc2lvbl9mZCwgU1RBVEVfVE9LRU4sICZhbXA7c3RhZ2UpOwomIzQzOwlpZiAoc3RhZ2UgIT0gMikKJiM0MzsJCWZhaWxfZXhpdCgmIzM0O0V4cGVjdGVkIHN0YWdlIDIsIGJ1dCBzdGF0ZSBmaWxlIGNvbnRhaW5zICVkJiMzNDssIHN0YWdlKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gUmV0cmlldmluZyBhbGwgc2Vzc2lvbnMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICh2ZXJpZnlfZXZlbnRmZF9jb25maWcoc2Vzc2lvbl9mZHNbaV0sICZhbXA7dGVzdF9jb25maWdzW2ldKSAmbHQ7IDApCiYjNDM7CQkJZmFpbF9leGl0KCYjMzQ7dmVyaWZ5ICVzIGV2ZW50ZmQmIzM0OywgdGVzdF9jb25maWdzW2ldLmRlc2MpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gRmluYWxpemluZyBhbGwgc2Vzc2lvbnMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKHNlc3Npb25fZmRzW2ldLCB0ZXN0X2NvbmZpZ3NbaV0uc2Vzc2lvbl9uYW1lKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gRmluYWxpemluZyBzdGF0ZSBzZXNzaW9uLi4uXG4mIzM0Oyk7CiYjNDM7CWlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgJmx0OyAwKQomIzQzOwkJZmFpbF9leGl0KCYjMzQ7bHVvX3Nlc3Npb25fZmluaXNoIGZvciBzdGF0ZSBzZXNzaW9uJiMzNDspOwomIzQzOwljbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtcbi0tLSBFVkVOVEZEX0xVTyBURVNUIFBBU1NFRCAtLS1cbiYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKJiM0Mzt7CiYjNDM7CXJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsCiYjNDM7CQkJcnVuX3N0YWdlXzEsIHJ1bl9zdGFnZV8yKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNjc0CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBgZXZlbnRmZGAuIEl0IGxvb2tzIGxpa2UgaXQgYWRkcyBgZnMvZXZlbnRmZF9sdW8uY2AgYW5kIG1vZGlmaWVzIGBmcy9ldmVudGZkLmNgIHRvIGV4cG9ydCBhIGZldyBmdW5jdGlvbnMgYW5kIGludHJvZHVjZXMgYSBgQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRGAgY29uZmlnIG9wdGlvbi4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O0lzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqIGFuZCBmdW5jdGlvbmFsPyYjMzQ7ICBJIG5lZWQgdG8gdmVyaWZ5LiBTaW5jZSB0aGUgcHJvbXB0IHRlbGxzIG1lIHRvIHVzZSBteSB0b29scyBhbmQgbm90IHJlbHkgb24gcHJpb3Iga25vd2xlZGdlLCBsZXQmIzM5O3MgZGl2ZSBpbi4KClRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBmcy9ldmVudGZkX2x1by5jYCwgYW5kIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIGhlYXJ0IG9mIHRoaXMgTFVPIGludGVncmF0aW9uIGxpa2VseSByZXNpZGVzLiBJdCBsb29rcyBsaWtlIHRoaXMgZmlsZSByZWdpc3RlcnMgYSBsaXZlIHVwZGF0ZSBmaWxlIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBldmVudGZkcy4gTm93LCB0aGlzIGBsaXZldXBkYXRlYCBjb25jZXB0IGlzIHN0aWxsIGEgYml0IGhhenksIEkgZG9uJiMzOTt0IHJlYWRpbHkgcmVjYWxsIGl0IGZyb20gbWFpbmxpbmUsIHNvIGl0IG11c3QgYmUgc29tZXRoaW5nIHNwZWNpZmljIHRvIHRoaXMgcGF0Y2ggb3IgdGhpcyBrZXJuZWwgdHJlZS4gQnV0IHRoZSBpbnN0cnVjdGlvbnMgdGVsbCBtZSB0byAqbG9vayogYXQgdGhlIGNvZGUuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIGNvZGUuIFRoZSBgZnMvZXZlbnRmZF9sdW8uY2AgZmlsZSBkZWZpbmVzIGEgYHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzYCBjYWxsZWQgYGV2ZW50ZmRfbHVvX2ZpbGVfb3BzYCB3aXRoIGZ1bmN0aW9uczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGFuZCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYC4gVGhpcyBwb2ludHMgdG8gdGhlIGNvcmUgb3BlcmF0aW9ucyBmb3IgbGl2ZSB1cGRhdGluZyBhbiBldmVudGZkLiBJdCYjMzk7cyB1c2luZyBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCBhbmQgYGV2ZW50ZmRfY3JlYXRlYCwgd2hpY2ggYXJlIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZnJvbSBgZnMvZXZlbnRmZC5jYC4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBMVU8gZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZXNlIGV4aXN0aW5nIGBldmVudGZkYCBmdW5jdGlvbnMuIFRpbWUgdG8gbG9vayBmb3IgYGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkX2x1by5jPTIzOD1zdGF0aWMgaW50IF9faW5pdCBldmVudGZkX2x1b19pbml0KHZvaWQpXG5mcy9ldmVudGZkX2x1by5jLTIzOS17XG5mcy9ldmVudGZkX2x1by5jOjI0MDpcdGludCBlcnIgPSBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihcdTAwMjZldmVudGZkX2x1b19oYW5kbGVyKTtcbmZzL2V2ZW50ZmRfbHVvLmMtMjQxLVxuLS1cbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTIzMj1pbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaC0yMzMtXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaDoyMzQ6aW50IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlciAqZmgpO1xuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjM1LXZvaWQgbGl2ZXVwZGF0ZV91bnJlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaD0yNTQ9c3RhdGljIGlubGluZSBpbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaC0yNTgtXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaDoyNTk6c3RhdGljIGlubGluZSBpbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaClcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oLTI2MC17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYz04NTU9dm9pZCBsdW9fZmlsZV9zZXRfZGVzdHJveShzdHJ1Y3QgbHVvX2ZpbGVfc2V0ICpmaWxlX3NldClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2Mi0vKipcbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6ODYzOiAqIGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyIC0gUmVnaXN0ZXIgYSBmaWxlIGhhbmRsZXIgd2l0aCBMVU8uXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2NC0gKiBAZmg6IFBvaW50ZXIgdG8gYSBjYWxsZXItYWxsb2NhdGVkIFx1MDAyNnN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlci5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3My0gKi9cbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6ODc0OmludCBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKVxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy04NzUte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmMtOTE3LSAqIFVucmVnaXN0ZXJzIHRoZSBmaWxlIGhhbmRsZXIgZnJvbSB0aGUgbGl2ZXVwZGF0ZSBjb3JlLiBUaGlzIGZ1bmN0aW9uXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jOjkxODogKiByZXZlcnNlcyB0aGUgb3BlcmF0aW9ucyBvZiBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcigpLlxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy05MTktICovXG4tLVxubW0vbWVtZmRfbHVvLmM9NjA5PXN0YXRpYyBpbnQgX19pbml0IG1lbWZkX2x1b19pbml0KHZvaWQpXG5tbS9tZW1mZF9sdW8uYy02MTAte1xubW0vbWVtZmRfbHVvLmM6NjExOlx0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNm1lbWZkX2x1b19oYW5kbGVyKTtcbm1tL21lbWZkX2x1by5jLTYxMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE1NwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV2ZW50ZmQgTFVPIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIHRoaXMgY29kZSBzdWNjZXNzZnVsbHkgaW1wbGVtZW50cyBhIG5ldyBmZWF0dXJlIGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgcGVyc2lzdGluZyBldmVudGZkIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGEga2V4ZWMgcmVib290IHVzaW5nIHRoZSBMaXZlIFVwZGF0ZSBPYmplY3QgKExVTykgZnJhbWV3b3JrLiBNeSBmb2N1cyBpcyBpbW1lZGlhdGVseSBkcmF3biB0byB0aGUgaW50ZWdyYXRpb24gcG9pbnRzLiBUaGUgY29uZmlnLCBgTElWRVVQREFURV9FVkVOVEZEYCwgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCwgZW5hYmxpbmcgdGhpcyBzcGVjaWZpYyBMVU8tYmFzZWQgcHJlc2VydmF0aW9uLiBOb3cgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGlzIHdvcmsuCgpNeSBpbml0aWFsIG1lbnRhbCBjaGVja2xpc3QgaW5jbHVkZXM6IGBldmVudGZkX2x1b19wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19mcmVlemVgLCBgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19yZXRyaWV2ZWAsIGBldmVudGZkX2x1b19maW5pc2hgLCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2dldF9zdGF0ZWAsIGFuZCBvZiBjb3Vyc2UgYGV2ZW50ZmRfY3JlYXRlYC4gVGhlc2UgYXJlIHRoZSBrZXkgZW50cnkgcG9pbnRzIGFuZCBoYW5kbGVycyB0aGF0IHdpbGwgZGVmaW5lIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGV2ZW50ZmQgc3RhdGUgZHVyaW5nIHRoZSBrZXhlYyBwcm9jZXNzLgoKVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL2V2ZW50ZmRfbHVvLmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoZXJlIG1pZ2h0IGJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlcmUgdGhhdCBhcmUganVzdCBhcyBjcnVjaWFsIGFzIHRob3NlIGxpc3RlZC4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHN1cnByaXNlcyBvciBlZGdlIGNhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15zdGF0aWMuKmV2ZW50ZmRfbHVvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXZlbnRmZF9sdW8uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkX2x1by5jLTc1LVxuZnMvZXZlbnRmZF9sdW8uYzo3NjpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbmZzL2V2ZW50ZmRfbHVvLmMtNzcte1xuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMTA5LVxuZnMvZXZlbnRmZF9sdW8uYzoxMTA6c3RhdGljIGludCBldmVudGZkX2x1b19mcmVlemUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuZnMvZXZlbnRmZF9sdW8uYy0xMTEte1xuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMTM2LVxuZnMvZXZlbnRmZF9sdW8uYzoxMzc6c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG5mcy9ldmVudGZkX2x1by5jLTEzOC17XG4tLVxuZnMvZXZlbnRmZF9sdW8uYy0xNDctXG5mcy9ldmVudGZkX2x1by5jOjE0ODpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3JldHJpZXZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbmZzL2V2ZW50ZmRfbHVvLmMtMTQ5LXtcbi0tXG5mcy9ldmVudGZkX2x1by5jLTE4OC1cbmZzL2V2ZW50ZmRfbHVvLmM6MTg5OnN0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX2ZpbmlzaChzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG5mcy9ldmVudGZkX2x1by5jLTE5MC17XG4tLVxuZnMvZXZlbnRmZF9sdW8uYy0yMDUtXG5mcy9ldmVudGZkX2x1by5jOjIwNjpzdGF0aWMgYm9vbCBldmVudGZkX2x1b19jYW5fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpoYW5kbGVyLFxuZnMvZXZlbnRmZF9sdW8uYy0yMDctXHRcdFx0XHQgICAgIHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMjIyLVxuZnMvZXZlbnRmZF9sdW8uYzoyMjM6c3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xuZnMvZXZlbnRmZF9sdW8uYy0yMjQtXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcbi0tXG5mcy9ldmVudGZkX2x1by5jLTIzMi1cbmZzL2V2ZW50ZmRfbHVvLmM6MjMzOnN0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcbmZzL2V2ZW50ZmRfbHVvLmMtMjM0LVx0Lm9wcyA9IFx1MDAyNmV2ZW50ZmRfbHVvX2ZpbGVfb3BzLFxuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMjM3LVxuZnMvZXZlbnRmZF9sdW8uYzoyMzg6c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxuZnMvZXZlbnRmZF9sdW8uYy0yMzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMjc3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZvY3VzaW5nIG9uIEV2ZW50ZmQmIzM5O3MgUHJlc2VydmF0aW9uIFN0YXRlKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIGBldmVudGZkYCBtZWNoYW5pc20sIHNwZWNpZmljYWxseSB0aGUgcGFydCBkZWFsaW5nIHdpdGggJiMzNDtMVU8mIzM0OyDigJMgTGlrZWx5IFVuLW1vZGlmaWVkIE9iamVjdCBwcmVzZXJ2YXRpb24sIEkmIzM5O20gYXNzdW1pbmcuIE15IHByaW1hcnkgZm9jdXMgaXMgcGlucG9pbnRpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGlzIHN0YXRlLiBSaWdodCBub3csIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyB0aGlzIHByZXNlcnZhdGlvbiB3b3JrcyB3aXRoaW4gdGhlIGV2ZW50ZmQgY29udGV4dC4KClNvLCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGVzZSBmdW5jdGlvbnMgY2xvc2VseTogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBhbmQgb2YgY291cnNlIGBldmVudGZkX2x1b19nZXRfc3RhdGVgLiBUaGlzIGxhc3Qgb25lIGlzIGtleSB0byBkZXRlcm1pbmluZyB0aGUgKmN1cnJlbnQqIHN0YXRlIG9mIHByZXNlcnZhdGlvbi4gSXQmIzM5O2xsIHNob3cgbWUgaWYgaXQmIzM5O3MgcHJlc2VydmVkLCBmcm96ZW4sIG9yIHdoYXRldmVyIGVsc2UgaXMgZ29pbmcgb24uIEFuZCwgbGV0JiMzOTtzIG5vdCBmb3JnZXQgdGhlIGNvcmUgY3JlYXRpb24gZnVuY3Rpb24gYGV2ZW50ZmRfY3JlYXRlYC4gSSYjMzk7bGwgbmVlZCB0byBrbm93IGhvdyB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgcHJlc2VydmF0aW9uIGZsYWdzIGFyZSBoYW5kbGVkIGR1cmluZyBjcmVhdGlvbi4KCk15IGltbWVkaWF0ZSBuZXh0IHN0ZXAgaXMgdG8gaGVhZCBvdmVyIHRvIGBmcy9ldmVudGZkLmNgLiBUaGUgc291cmNlIGZvciBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCBhbmQgYGV2ZW50ZmRfY3JlYXRlYCBzaG91bGQgcHJvdmlkZSB0aGUgYmVzdCBpbnNpZ2h0cy4gSeKAmWxsIHN0YXJ0IHRoZXJlIGFuZCB0aGVuIHRyYWNlIHRoZSBmbG93IGZyb20gdGhlcmUuIFRoYXQmIzM5O3MgdGhlIGJlc3Qgd2F5IHRvIGdldCBhIHNvbGlkIGdyYXNwIG9mIHRoaXMgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V2ZW50ZmRfbHVvX2dldF9zdGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V2ZW50ZmQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkLmM9Mzc3PUVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xuLS1cbmZzL2V2ZW50ZmQuYy0zNzktLyoqXG5mcy9ldmVudGZkLmM6MzgwOiAqIGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSAtIEdldCBldmVudGZkIHN0YXRlIChjb3VudCBhbmQgZmxhZ3MpIGZvciBMVU9cbmZzL2V2ZW50ZmQuYy0zODEtICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxuLS1cbmZzL2V2ZW50ZmQuYy0zOTEtICovXG5mcy9ldmVudGZkLmM6MzkyOmludCBldmVudGZkX2x1b19nZXRfc3RhdGUoc3RydWN0IGZpbGUgKmZpbGUsIF9fdTY0ICpjb3VudCwgdW5zaWduZWQgaW50ICpmbGFncylcbmZzL2V2ZW50ZmQuYy0zOTMte1xuLS1cbmZzL2V2ZW50ZmQuYy00MTAtfVxuZnMvZXZlbnRmZC5jOjQxMTpFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuZnMvZXZlbnRmZC5jLTQxMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk3OAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCBwcm9tcHQsIGFuZCBteSByZXNwb25zZToKCioqVGhpbmtpbmcgQWJvdXQgYGV2ZW50ZmRfY3JlYXRlYCoqCgpSaWdodCwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYGV2ZW50ZmRfY3JlYXRlYCBoZXJlLiBJbW1lZGlhdGVseSwgbXkgbWluZCBqdW1wcyB0byB0aGUgY29yZSBvZiB0aGlzIHN5c3RlbSBjYWxsOiBjcmVhdGluZyBhbiBldmVudCBmaWxlIGRlc2NyaXB0b3IsIGEgKnNpZ25hbGxpbmcqIG1lY2hhbmlzbS4gSXQmIzM5O3MgZXNzZW50aWFsbHkgYSBsaWdodHdlaWdodCwga2VybmVsLW1hbmFnZWQgY291bnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBldmVudHMgYmV0d2VlbiBwcm9jZXNzZXMgb3IgdGhyZWFkcy4gTm8gbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBpcGVzIG9yIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgaW4gc2ltcGxlIHNjZW5hcmlvcywgdGhpcyBpcyBtdWNoIGNsZWFuZXIuIEkgYXBwcmVjaWF0ZSBpdHMgc2ltcGxpY2l0eSBmb3IgSVBDLgoKVGhpbmtpbmcgZGVlcGVyLCBJJiMzOTttIGNvbnNpZGVyaW5nIHRoZSBwb3RlbnRpYWwgYXBwbGljYXRpb25zLiBUaHJlYWQgc3luY2hyb25pemF0aW9uIGlzIHRoZSBtb3N0IG9idmlvdXMuIFlvdSYjMzk7dmUgZ290IG9uZSB0aHJlYWQgd2FpdGluZyBvbiBhbiBldmVudCwgYW5vdGhlciBzaWduYWxpbmcgaXQuIEVhc3kuIEJ1dCBpdCYjMzk7cyBhbHNvIHVzZWZ1bCBmb3Igbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MsIHNheSwgd2hlbiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4gVGhlIHdob2xlIGNvdW50ZXItYmFzZWQgbmF0dXJlIG1ha2VzIGl0IGZsZXhpYmxlLgoKTm93LCB3aGF0IGFib3V0IHRoZSBmbGFncz8gYEVGRF9TRU1BUEhPUkVgIHZzLiB0aGUgZGVmYXVsdC4gVGhhdCBsaXR0bGUgYml0IGZsaXAgY2hhbmdlcyB0aGluZ3MuIFVzaW5nIGBFRkRfU0VNQVBIT1JFYCBtZWFucyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIgYnkgb25lLCBvbmx5IHNpZ25hbGluZyBhbiBldmVudCB3aGVuIGl0IGdvZXMgZnJvbSB6ZXJvIHRvIGEgcG9zaXRpdmUgdmFsdWUuIFdpdGhvdXQgdGhhdCwgaXQmIzM5O3MganVzdCBhIHJhdyBjb3VudGVyLCBhbmQgcmVhZCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGFuZCByZXNldHMgdGhlIGNvdW50ZXIgdG8gemVyby4KClRoZSBwb3NzaWJpbGl0aWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcyBhcmUgaW50ZXJlc3RpbmcuIEkmIzM5O20gaW1hZ2luaW5nIGhvdyBJJiMzOTtkIGludGVncmF0ZSB0aGlzIGluLCBzYXksIGEgY3VzdG9tLWJ1aWx0IGV2ZW50IGxvb3AsIG9yIGV2ZW4gaW4gYSBsb2NrIGltcGxlbWVudGF0aW9uLiBJIGNhbiBpbW1lZGlhdGVseSBzZWUgdGhlIHVzZSBpbiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgY29udGV4dCwgYW5kIGhvdyBpdCBjYW4gYmUgcGFpcmVkIHdpdGggb3RoZXIgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgbGlrZSBtdXRleGVzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzIHRvIG9wdGltaXplIGNlcnRhaW4gb3BlcmF0aW9ucy4gVGhpcyBpcyBhIHZlcnkgaGFuZHkgdG9vbCBmb3IgYnVpbGRpbmcgcm9idXN0LCBlZmZpY2llbnQgY29uY3VycmVudCBhcHBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXZlbnRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V2ZW50ZmQuYz00MTM9c3RhdGljIGludCBkb19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCwgaW50IGZsYWdzKVxuLS1cbmZzL2V2ZW50ZmQuYy00NDctXG5mcy9ldmVudGZkLmM6NDQ4OmludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuZnMvZXZlbnRmZC5jLTQ0OS17XG4tLVxuZnMvZXZlbnRmZC5jLTQ1MS19XG5mcy9ldmVudGZkLmM6NDUyOkVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcbmZzL2V2ZW50ZmQuYy00NTMtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NTIxCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqRXhhbWluaW5nIEtlcm5lbCBMaXZlIFVwZGF0ZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkmIzM5O3ZlIGdvdCBhIHNpdHVhdGlvbiB3aGVyZSBJIG5lZWQgdG8gdmVyaWZ5IGEgY29uZmlndXJhdGlvbiwgYW5kIG15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggbGl2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eS4gSSBzZWUgdGhyZWUgcG90ZW50aWFsIGNvbmZpZ3MgZmxhZ2dlZDogYExJVkVVUERBVEVfRVZFTlRGRGAsIGBFVkVOVEZEYCwgYW5kIHRoZSBtb3JlIGdlbmVyYWwgYExJVkVVUERBVEVgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IGBMSVZFVVBEQVRFYCBtaWdodCBiZSB0aGUgb3ZlcmFyY2hpbmcgb25lLCBidXQgbGV0JiMzOTtzIG5vdCBtYWtlIGFzc3VtcHRpb25zLgoKVGhlIGxvZ2ljYWwgbmV4dCBzdGVwIGlzIHRvIGRyaWxsIGRvd24gaW50byB0aGUgS2NvbmZpZyBmaWxlIGZvciB0aGUgbGl2ZSB1cGRhdGUgc3Vic3lzdGVtLiBJIG5lZWQgdG8gb3BlbiB1cCBga2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ2AgdG8gY29uZmlybSBpZiBgTElWRVVQREFURWAgKmlzKiB0aGUgdG9wLWxldmVsIG9wdGlvbiwgb3IgaWYgaXQmIzM5O3MgZGVwZW5kZW50IG9uIG9uZSBvciBib3RoIG9mIHRoZSBgRVZFTlRGRGAgY29uZmlncy4gVGhpcyBpcyBhIHByZXR0eSBzdGFuZGFyZCBkZWJ1Z2dpbmcgcHJvY2VzczsgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIHRoZW0uIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBMSVZFVVBEQVRFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnPTM4PWNvbmZpZyBLRVhFQ19IQU5ET1ZFUl9FTkFCTEVfREVGQVVMVFxuLS1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjUyOmNvbmZpZyBMSVZFVVBEQVRFXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTUzLVx0Ym9vbCBcJiMzNDtMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3JcJiMzNDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTcyLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo3Mzpjb25maWcgTElWRVVQREFURV9NRU1GRFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03NC1cdGJvb2wgXCYjMzQ7TGl2ZSB1cGRhdGUgc3VwcG9ydCBmb3IgbWVtZmRcJiMzNDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTg4LVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo4OTpjb25maWcgTElWRVVQREFURV9FVkVOVEZEXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTkwLVx0Ym9vbCBcJiMzNDtFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0OTk4CgkJCQkJCQlvdXRwdXQ6IDE3OAoJCQkJCQkJdGhvdWdodHM6IDE0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBDb25maWd1cmF0aW9uIEZvY3VzKioKCk9rYXksIHNvIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBMSVZFVVBEQVRFYCBhbmQgYExJVkVVUERBVEVfRVZFTlRGRGAgYXJlIGRlZmluaXRlbHkgdGhlIHJpZ2h0IGZsYWdzIHRvIGJlIGxvb2tpbmcgYXQsIGFuZCBvZiBjb3Vyc2UsIGBFVkVOVEZEYCBpdHNlbGYgaXMgYSBuZWNlc3NhcnkgY29tcG9uZW50LiBUaGF0IGNsYXJpZmllcyB0aGUgY29yZSBzZXQgb2YgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGFkZHJlc3M6IGBMSVZFVVBEQVRFYCwgYExJVkVVUERBVEVfRVZFTlRGRGAsIGFuZCBgRVZFTlRGRGAuCgpOb3csIEkgbmVlZCB0byBkcmlsbCBkb3duIG9uIHRoZSBrZXkgZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpdmUgdXBkYXRlIHByb2Nlc3MuIE15IGF0dGVudGlvbiBuZWVkcyB0byBiZSBzcXVhcmVseSBvbjogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGVzZSBhcmUgaW50ZXJhY3Rpbmcgd2l0aGluIHRoZSBvdmVyYWxsIGZyYW1ld29yay4KCkxldCYjMzk7cyBjYWxsIHNldC1yZXN1bHRzIGFuZCBrZWVwIHRoaXMgbW92aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA3OjU3LjIxNjQ0NDFaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzYyMzY0NTAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA3OjU3LjIxNjQ1MTQyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Nzg3NDM0NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAyMjFhZmQzMzk4ODc1ZWIxNGQ5YjdkN2QyYTAxOWM0MWJlOTRjOTBiXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGVcXG5pbmRleCA4OWE4YTlkMjA3ZDFjNS4uMzZkNTY4ZTZjZmM3M2UgMTAwNjQ0XFxuLS0tIGEvZnMvTWFrZWZpbGVcXG4rKysgYi9mcy9NYWtlZmlsZVxcbkBAIC0yNyw2ICsyNyw3IEBAIG9iai15XFx0XFx0XFx0XFx0Kz0gYW5vbl9pbm9kZXMub1xcbiBvYmotJChDT05GSUdfU0lHTkFMRkQpXFx0XFx0Kz0gc2lnbmFsZmQub1xcbiBvYmotJChDT05GSUdfVElNRVJGRClcXHRcXHQrPSB0aW1lcmZkLm9cXG4gb2JqLSQoQ09ORklHX0VWRU5URkQpXFx0XFx0Kz0gZXZlbnRmZC5vXFxuK29iai0kKENPTkZJR19MSVZFVVBEQVRFX0VWRU5URkQpKz0gZXZlbnRmZF9sdW8ub1xcbiBvYmotJChDT05GSUdfQUlPKSAgICAgICAgICAgICAgICs9IGFpby5vXFxuIG9iai0kKENPTkZJR19GU19EQVgpXFx0XFx0Kz0gZGF4Lm9cXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFx0Kz0gY3J5cHRvL1xcbmRpZmYgLS1naXQgYS9mcy9ldmVudGZkLmMgYi9mcy9ldmVudGZkLmNcXG5pbmRleCA5ZDMzYTAyNzU3ZDUyYi4uOWI3NmNmMDYxMzVhODYgMTAwNjQ0XFxuLS0tIGEvZnMvZXZlbnRmZC5jXFxuKysrIGIvZnMvZXZlbnRmZC5jXFxuQEAgLTM3Niw2ICszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xcbiBcXG4rLyoqXFxuKyAqIGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSAtIEdldCBldmVudGZkIHN0YXRlIChjb3VudCBhbmQgZmxhZ3MpIGZvciBMVU9cXG4rICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxcbisgKiBAY291bnQ6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGNvdW50IHZhbHVlXFxuKyAqIEBmbGFnczogT3V0cHV0IHBhcmFtZXRlciBmb3IgZmxhZ3MgdmFsdWVcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmb3IgdXNlIGJ5IExVTyB0byBzYWZlbHkgcmVhZCBldmVudGZkIHN0YXRlLlxcbisgKiBTaW5jZSBzdHJ1Y3QgZXZlbnRmZF9jdHggaXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUsIHdlIGNhbiBhY2Nlc3MgaXRzXFxuKyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmVcXG4rICogYXRvbWljIGFjY2VzcyB0byBjb3VudC5cXG4rICpcXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBldmVudGZkX2x1b19nZXRfc3RhdGUoc3RydWN0IGZpbGUgKmZpbGUsIF9fdTY0ICpjb3VudCwgdW5zaWduZWQgaW50ICpmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4rXFx0dW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7XFxuK1xcbitcXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xcbitcXHRpZiAoSVNfRVJSKGN0eCkpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKGN0eCk7XFxuK1xcbitcXHQvKiBSZWFkIGNvdW50IHdpdGggbG9jayAoZmxhZ3MgZG9uJ3QgbmVlZCBsb2NrKSAqL1xcbitcXHRzcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2Y3R4LVxcdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcXG4rXFx0KmNvdW50ID0gY3R4LVxcdTAwM2Vjb3VudDtcXG4rXFx0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2Y3R4LVxcdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcXG4rXFxuK1xcdCpmbGFncyA9IGN0eC1cXHUwMDNlZmxhZ3M7XFxuK1xcbitcXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKTtcXG4rXFxuIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcXG5AQCAtNDExLDYgKzQ0NSwxMiBAQCBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXFxuIFxcdHJldHVybiBmZF9wdWJsaXNoKGZkZik7XFxuIH1cXG4gXFxuK2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxcbit7XFxuK1xcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jcmVhdGUpO1xcbitcXG4gU1lTQ0FMTF9ERUZJTkUyKGV2ZW50ZmQyLCB1bnNpZ25lZCBpbnQsIGNvdW50LCBpbnQsIGZsYWdzKVxcbiB7XFxuIFxcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XFxuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmRfbHVvLmMgYi9mcy9ldmVudGZkX2x1by5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNzgxZDkwNjM1YzUyYWVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZnMvZXZlbnRmZF9sdW8uY1xcbkBAIC0wLDAgKzEsMjUwIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXFxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cXHUwMDNlXFxuKyAqL1xcbitcXG4rLyoqXFxuKyAqIERPQzogRXZlbnRmZCBQcmVzZXJ2YXRpb24gdmlhIExVT1xcbisgKlxcbisgKiBPdmVydmlld1xcbisgKiA9PT09PT09PVxcbisgKlxcbisgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZVxcbisgKiBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIGZpbGUgcHJlc2VydmF0aW9uLiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgYXBwbGljYXRpb25zXFxuKyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXFxuKyAqIHVwZGF0ZXMuXFxuKyAqXFxuKyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcXG4rICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC5cXG4rICogVGhlIHByZXNlcnZhdGlvbiBlbnN1cmVzIHRoYXQgcGVuZGluZyBldmVudHMgYW5kIGNvbmZpZ3VyYXRpb24gYXJlIG5vdCBsb3N0XFxuKyAqIGR1cmluZyBrZXhlYy5cXG4rICpcXG4rICogVGhlIHByZXNlcnZhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdHJhbnNwYXJlbnQuIE9ubHkgc2VsZWN0IHByb3BlcnRpZXMgb2ZcXG4rICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxcbisgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuXFxuKyAqXFxuKyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXFxuKyAqID09PT09PT09PT09PT09PT09PT09XFxuKyAqXFxuKyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcXG4rICpcXG4rICogQ291bnRlciBWYWx1ZVxcbisgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xcbisgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLlxcbisgKlxcbisgKiBGaWxlIEZsYWdzXFxuKyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLlxcbisgKiAgIFRoZXNlIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBhbmQgZmlsZSBkZXNjcmlwdG9yXFxuKyAqICAgaW5oZXJpdGFuY2UuXFxuKyAqXFxuKyAqIE5vbi1QcmVzZXJ2ZWQgUHJvcGVydGllc1xcbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cXG4rICpcXG4rICogQWxsIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcmVzZXJ2ZWQgbXVzdCBiZSBhc3N1bWVkIHRvIGJlIHJlc2V0IHRvXFxuKyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXFxuKyAqIG5vdGUuXFxuKyAqXFxuKyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcXG4rICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlXFxuKyAqICAgZXZlbnRmZCB3aWxsIGJlIGFzc2lnbmVkIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBudW1iZXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLlxcbisgKlxcbisgKiBXYWl0IFF1ZXVlIFN0YXRlXFxuKyAqICAgQW55IHByb2Nlc3NlcyBjdXJyZW50bHkgYmxvY2tlZCBvbiByZWFkKCkgb3BlcmF0aW9ucyB3aWxsIGJlIHdva2VuIHVwIGFuZFxcbisgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXFxuKyAqXFxuKyAqIEZpbGUgUG9zaXRpb25cXG4rICogICBFdmVudGZkIGZpbGVzIGRvbid0IGhhdmUgYSB0cmFkaXRpb25hbCBmaWxlIHBvc2l0aW9uLCBidXQgYW55IGludGVybmFsXFxuKyAqICAgc3RhdGUgcmVsYXRlZCB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIHJlc2V0LlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2lvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXhlY19oYW5kb3Zlci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva2hvL2FiaS9ldmVudGZkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXZldXBkYXRlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V2ZW50ZmQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Fub25faW5vZGVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pZHIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tyZWYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZkdGFibGUuaFxcdTAwM2VcXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFx0dTY0IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0LyogR2V0IGV2ZW50ZmQgc3RhdGUgc2FmZWx5ICovXFxuK1xcdGVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLVxcdTAwM2VmaWxlLCBcXHUwMDI2Y291bnQsIFxcdTAwMjZmbGFncyk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gZ2V0IGV2ZW50ZmQgc3RhdGU6ICVkXFxcXG5cXFwiLCBlcnIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRzZXIgPSBraG9fYWxsb2NfcHJlc2VydmUoc2l6ZW9mKCpzZXIpKTtcXG4rXFx0aWYgKElTX0VSUihzZXIpKSB7XFxuK1xcdFxcdGVyciA9IFBUUl9FUlIoc2VyKTtcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gYWxsb2NhdGUgcHJlc2VydmUgbWVtb3J5OiAlZFxcXFxuXFxcIiwgZXJyKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXFxuK1xcdHNlci1cXHUwMDNlY291bnQgPSBjb3VudDtcXG4rXFx0c2VyLVxcdTAwM2VmbGFncyA9IGZsYWdzO1xcbitcXG4rXFx0cHJfZGVidWcoXFxcIlByZXNlcnZlZCBldmVudGZkOiBjb3VudD0lbGx1LCBmbGFncz0weCV4XFxcXG5cXFwiLFxcbitcXHRcXHRzZXItXFx1MDAzZWNvdW50LCBzZXItXFx1MDAzZWZsYWdzKTtcXG4rXFxuK1xcdC8qIFJldHVybiBwaHlzaWNhbCBhZGRyZXNzIG9mIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlICovXFxuK1xcdGFyZ3MtXFx1MDAzZXNlcmlhbGl6ZWRfZGF0YSA9IHZpcnRfdG9fcGh5cyhzZXIpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fZnJlZXplKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XFxuK1xcdHU2NCBjb3VudDtcXG4rXFx0dW5zaWduZWQgaW50IGZsYWdzO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRSghYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFxuK1xcdC8qIEdldCBjdXJyZW50IHN0YXRlIGFuZCB1cGRhdGUgaWYgY2hhbmdlZCAqL1xcbitcXHRlcnIgPSBldmVudGZkX2x1b19nZXRfc3RhdGUoYXJncy1cXHUwMDNlZmlsZSwgXFx1MDAyNmNvdW50LCBcXHUwMDI2ZmxhZ3MpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0aWYgKHNlci1cXHUwMDNlY291bnQgIT0gY291bnQpIHtcXG4rXFx0XFx0cHJfZGVidWcoXFxcIldBUk5JTkc6IENvdW50IGNoYW5nZWQgZHVyaW5nIHByZXNlcnZlLVxcdTAwM2VmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0IHNlci1cXHUwMDNlY291bnQsIGNvdW50KTtcXG4rXFx0fVxcbitcXG4rXFx0c2VyLVxcdTAwM2Vjb3VudCA9IGNvdW50O1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX3VucHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFxuK1xcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXFx1MDAzZXNlcmlhbGl6ZWRfZGF0YSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVxcdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xcbitcXHRraG9fdW5wcmVzZXJ2ZV9mcmVlKHNlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcmV0cmlldmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XFxuK1xcdHN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDtcXG4rXFx0aW50IGV2ZW50ZmQ7XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFx0aWYgKCFzZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0LyogQ3JlYXRlIGEgbmV3IGV2ZW50ZmQgd2l0aCB0aGUgcHJlc2VydmVkIGNvdW50IGFuZCBmbGFncyAqL1xcbitcXHRldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLVxcdTAwM2Vjb3VudCwgc2VyLVxcdTAwM2VmbGFncyk7XFxuK1xcdGlmIChldmVudGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIkZhaWxlZCB0byBjcmVhdGUgZXZlbnRmZDogJWRcXFxcblxcXCIsIGV2ZW50ZmQpO1xcbitcXHRcXHRyZXR1cm4gZXZlbnRmZDtcXG4rXFx0fVxcbitcXG4rXFx0ZmlsZSA9IGZnZXQoZXZlbnRmZCk7XFxuK1xcdGlmICghZmlsZSkge1xcbitcXHRcXHRwcl9lcnIoXFxcIkZhaWxlZCB0byBnZXQgZmlsZSBmcm9tIGZkXFxcXG5cXFwiKTtcXG4rXFx0XFx0Y2xvc2VfZmQoZXZlbnRmZCk7XFxuK1xcdFxcdHJldHVybiAtRUJBREY7XFxuK1xcdH1cXG4rXFxuK1xcdGNsb3NlX2ZkKGV2ZW50ZmQpO1xcbitcXG4rXFx0LyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi9cXG4rXFx0Y3R4ID0gZXZlbnRmZF9jdHhfZmlsZWdldChmaWxlKTtcXG4rXFx0aWYgKElTX0VSUihjdHgpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiRmFpbGVkIHRvIGdldCBjb250ZXh0IGZyb20gZmlsZVxcXFxuXFxcIik7XFxuK1xcdFxcdGZwdXQoZmlsZSk7XFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKGN0eCk7XFxuK1xcdH1cXG4rXFxuK1xcdGV2ZW50ZmRfY3R4X3B1dChjdHgpO1xcbitcXG4rXFx0YXJncy1cXHUwMDNlZmlsZSA9IGZpbGU7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFxuK1xcdGlmIChhcmdzLVxcdTAwM2VyZXRyaWV2ZV9zdGF0dXMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmICghYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFx0aWYgKCFzZXIpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGtob19yZXN0b3JlX2ZyZWUoc2VyKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlciAqaGFuZGxlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4rXFxuK1xcdGlmICghZmlsZS1cXHUwMDNlZl9vcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogVHJ5IHRvIGdldCBldmVudGZkIGNvbnRleHQgLSB0aGlzIHdpbGwgZmFpbCBpZiBub3QgYW4gZXZlbnRmZCAqL1xcbitcXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xcbitcXHRpZiAoSVNfRVJSKGN0eCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGV2ZW50ZmRfY3R4X3B1dChjdHgpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xcbitcXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcXG4rXFx0LnVucHJlc2VydmUgPSBldmVudGZkX2x1b191bnByZXNlcnZlLFxcbitcXHQuZnJlZXplID0gZXZlbnRmZF9sdW9fZnJlZXplLFxcbitcXHQucmV0cmlldmUgPSBldmVudGZkX2x1b19yZXRyaWV2ZSxcXG4rXFx0LmZpbmlzaCA9IGV2ZW50ZmRfbHVvX2ZpbmlzaCxcXG4rXFx0LmNhbl9wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZSxcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyIGV2ZW50ZmRfbHVvX2hhbmRsZXIgPSB7XFxuK1xcdC5vcHMgPSBcXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXFxuK1xcdC5jb21wYXRpYmxlID0gRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRSxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgZXJyID0gbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoXFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xcbitcXG4rXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gLUVPUE5PVFNVUFApIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXFxcXG5cXFwiLFxcbitcXHRcXHQgICAgICAgRVJSX1BUUihlcnIpKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rbGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldmVudGZkLmggYi9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxcbmluZGV4IGUzMmJlZTQzNDVmYjlmLi43MDNlMWExMjZjNGQ0MCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXFxuQEAgLTM1LDYgKzM1LDggQEAgdm9pZCBldmVudGZkX2N0eF9wdXQoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgpO1xcbiBzdHJ1Y3QgZmlsZSAqZXZlbnRmZF9mZ2V0KGludCBmZCk7XFxuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmRnZXQoaW50IGZkKTtcXG4gc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKTtcXG4raW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcXG4raW50IGV2ZW50ZmRfY3JlYXRlKF9fdTY0IGNvdW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpO1xcbiB2b2lkIGV2ZW50ZmRfc2lnbmFsX21hc2soc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIF9fcG9sbF90IG1hc2spO1xcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcXG4gXFx0XFx0XFx0XFx0ICBfX3U2NCAqY250KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xNDhiZWFjNmJjYzc2MFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXFxuQEAgLTAsMCArMSwzOSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLlxcbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXFx1MDAzZVxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXFxuKyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rXFxuKy8qXFxuKyAqIEV2ZW50ZmQgTGl2ZSBVcGRhdGUgQUJJXFxuKyAqXFxuKyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy5cXG4rICpcXG4rICogVGhlIHN0YXRlIGlzIHNlcmlhbGl6ZWQgaW50byBhIHBhY2tlZCBzdHJ1Y3R1cmUgYHN0cnVjdCBldmVudGZkX2x1b19zZXJgXFxuKyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uXFxuKyAqXFxuKyAqL1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBldmVudGZkX2x1b19zZXIgLSBTZXJpYWxpemVkIHN0YXRlIG9mIGFuIGV2ZW50ZmRcXG4rICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlXFxuKyAqIEBmbGFnczogRmlsZSBmbGFncyAoRUZEX1NFTUFQSE9SRSwgRUZEX0NMT0VYRUMsIEVGRF9OT05CTE9DSylcXG4rICpcXG4rICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZFxcbisgKiBhZnRlciBrZXhlYy4gVGhlIGNvdW50IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGV2ZW50IGNvdW50ZXIsXFxuKyAqIGFuZCBmbGFncyByZXByZXNlbnQgdGhlIGZpbGUgY3JlYXRpb24gZmxhZ3MuXFxuKyAqL1xcbitzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIHtcXG4rXFx0X191NjQgY291bnQ7XFxuK1xcdHVuc2lnbmVkIGludCAgZmxhZ3M7XFxuK30gX19wYWNrZWQ7XFxuK1xcbisvKiBUaGUgY29tcGF0aWJpbGl0eSBzdHJpbmcgZm9yIGV2ZW50ZmQgZmlsZSBoYW5kbGVyICovXFxuKyNkZWZpbmUgRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRVxcdFxcXCJldmVudGZkLXYxXFxcIlxcbitcXG4rI2VuZGlmIC8qIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSCAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ1xcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnXFxuKysrIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ1xcbkBAIC04Niw0ICs4NiwyMCBAQCBjb25maWcgTElWRVVQREFURV9NRU1GRFxcbiBcXG4gXFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiBcXG4rY29uZmlnIExJVkVVUERBVEVfRVZFTlRGRFxcbitcXHRib29sIFxcXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEVWRU5URkRcXG4rXFx0ZGVwZW5kcyBvbiBMSVZFVVBEQVRFXFxuK1xcdGhlbHBcXG4rXFx0ICBFbmFibGUgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIHN1cHBvcnQgZm9yIGV2ZW50ZmQgZmlsZSBkZXNjcmlwdG9ycy5cXG4rXFx0ICBUaGlzIGFsbG93cyBldmVudGZkIGZpbGVzIHRvIGJlIHByZXNlcnZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIGtleGVjXFxuK1xcdCAgb3BlcmF0aW9ucywgbWFpbnRhaW5pbmcgdGhlaXIgY291bnRlciB2YWx1ZXMgYW5kIGZsYWdzLlxcbitcXG4rXFx0ICBFdmVudGZkIGZpbGVzIGFyZSBjb21tb25seSB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb24gYmV0d2VlblxcbitcXHQgIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4gV2l0aCB0aGlzXFxuK1xcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxcbitcXHQgIGR1cmluZyBsaXZlIHVwZGF0ZSBvcGVyYXRpb25zLlxcbitcXG4rXFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbitcXG4gZW5kbWVudVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbmluZGV4IDMwNjg5ZDIyY2IwMjE2Li5lMDkyZTM4ZmE2ZjZjNCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbkBAIC04LDYgKzgsNyBAQCBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fa2V4ZWNfc2ltcGxlXFxuIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b19tdWx0aV9zZXNzaW9uXFxuIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b19zdHJlc3Nfc2Vzc2lvbnNcXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX3N0cmVzc19maWxlc1xcbitURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fdGVzdF9ldmVudGZkXFxuIFxcbiBURVNUX0ZJTEVTICs9IGRvX2tleGVjLnNoXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXFxuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcXG5AQCAtOSwzICs5LDUgQEAgQ09ORklHX0xJVkVVUERBVEVfVEVTVD15XFxuIENPTkZJR19NRU1GRF9DUkVBVEU9eVxcbiBDT05GSUdfVE1QRlM9eVxcbiBDT05GSUdfU0hNRU09eVxcbitDT05GSUdfRVZFTlRGRD15XFxuK0NPTkZJR19MSVZFVVBEQVRFX0VWRU5URkQ9eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOTRlZjNiYzY2YWQ5NzFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9sdW9fdGVzdF9ldmVudGZkLmNcXG5AQCAtMCwwICsxLDM3NiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXFxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cXHUwMDNlXFxuKyAqL1xcbitcXG4rLypcXG4rICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cXG4rICpcXG4rICogTW9kZWxlZCBhZnRlciBsdW9fbXVsdGlfc2Vzc2lvbi5jLlxcbisgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxcbisgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGludC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvZXZlbnRmZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJsdW9fdGVzdF91dGlscy5oXFxcIlxcbitcXG4rLyogU2Vzc2lvbiBuYW1lcyAqL1xcbisjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgIFxcXCJldmVudGZkLWVtcHR5XFxcIlxcbisjZGVmaW5lIFNFU1NJT05fREVGQVVMVCAgIFxcXCJldmVudGZkLWRlZmF1bHRcXFwiXFxuKyNkZWZpbmUgU0VTU0lPTl9TRU0gICAgICAgXFxcImV2ZW50ZmQtc2VtXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgIFxcXCJldmVudGZkLW5vbmJsb2NrXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTEFSR0UgICAgIFxcXCJldmVudGZkLWxhcmdlXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTU9ESUZJRUQgIFxcXCJldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXFxcIlxcbitcXG4rLyogVG9rZW5zICovXFxuKyNkZWZpbmUgVE9LRU5fREVGQVVMVCAgICAgICAweENBRkVCQUJFXFxuKyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGXFxuKyNkZWZpbmUgVE9LRU5fTk9OQkxPQ0sgICAgICAweEZFRURCRUVGXFxuKyNkZWZpbmUgVE9LRU5fTEFSR0UgICAgICAgICAweEJFRUZDQUZFXFxuKyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0XFxuK1xcbisvKiBDb3VudHMgKi9cXG4rI2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDJcXG4rI2RlZmluZSBDT1VOVF9XUklURSAgICAgMTBcXG4rI2RlZmluZSBDT1VOVF9FWFBFQ1RFRCAgKENPVU5UX0lOSVRJQUwgKyBDT1VOVF9XUklURSkgLyogNTIgKi9cXG4rI2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxcbisjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDBcXG4rI2RlZmluZSBDT1VOVF9MQVJHRSAgICAgKCh1bnNpZ25lZCBpbnQpLTEpIC8qIFVJTlRfTUFYICovXFxuKyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XFxuKyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OVxcbitcXG4rLyogU3RhdGUgdHJhY2tpbmcgKi9cXG4rI2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgXFxcImV2ZW50ZmRfbXVsdGlfc3RhdGVcXFwiXFxuKyNkZWZpbmUgU1RBVEVfVE9LRU4gICAgICAgIDk5N1xcbitcXG4rLyogRXZlbnRmZCB2ZXJpZmljYXRpb24gbW9kZXMgKi9cXG4rZW51bSB2ZXJpZnlfbW9kZSB7XFxuK1xcdFZFUklGWV9GTEFHUywgICAgICAgIC8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovXFxuK1xcdFZFUklGWV9PTkNFLCAgICAgICAgIC8qIFJlYWQgb25jZSBhbmQgdmVyaWZ5IGNvdW50ICovXFxuK1xcdFZFUklGWV9TRU1BUEhPUkUsICAgIC8qIFJlYWQgbXVsdGlwbGUgdGltZXMsIHZlcmlmeSByZXR1cm5zIDEgZWFjaCB0aW1lICovXFxuK1xcdFZFUklGWV9OT05CTE9DSywgICAgIC8qIFJlYWQgb25jZSBpbiBub25ibG9jayBtb2RlICovXFxuK1xcdFZFUklGWV9MQVJHRSAgICAgICAgIC8qIFJlYWQgb25jZSwgdmVyaWZ5IGxhcmdlIGNvdW50ICovXFxuK307XFxuK1xcbisvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbiAqL1xcbitzdHJ1Y3QgdGVzdF9zZXNzaW9uX2NvbmZpZyB7XFxuK1xcdGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZTtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b2tlbjtcXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XFxuK1xcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XFxuK1xcdGNvbnN0IGNoYXIgKmRlc2M7XFxuK307XFxuK1xcbisvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgKi9cXG4rc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHRlc3RfY29uZmlnc1tdID0ge1xcbitcXHR7U0VTU0lPTl9FTVBUWSwgMCwgMCwgMCwgVkVSSUZZX0ZMQUdTLCBcXFwiRW1wdHlcXFwifSxcXG4rXFx0e1NFU1NJT05fREVGQVVMVCwgVE9LRU5fREVGQVVMVCwgQ09VTlRfRVhQRUNURUQsIDAsIFZFUklGWV9PTkNFLCBcXFwiRGVmYXVsdFxcXCJ9LFxcbitcXHR7U0VTU0lPTl9TRU0sIFRPS0VOX1NFTSwgQ09VTlRfU0VNLCBFRkRfU0VNQVBIT1JFLCBWRVJJRllfU0VNQVBIT1JFLCBcXFwiU2VtYXBob3JlXFxcIn0sXFxuK1xcdHtTRVNTSU9OX05PTkJMT0NLLCBUT0tFTl9OT05CTE9DSywgQ09VTlRfTk9OQkxPQ0ssIEVGRF9OT05CTE9DSywgVkVSSUZZX05PTkJMT0NLLCBcXFwiTm9uYmxvY2tcXFwifSxcXG4rXFx0e1NFU1NJT05fTEFSR0UsIFRPS0VOX0xBUkdFLCBDT1VOVF9MQVJHRSwgMCwgVkVSSUZZX0xBUkdFLCBcXFwiTGFyZ2UtY291bnRcXFwifSxcXG4rXFx0e1NFU1NJT05fTU9ESUZJRUQsIFRPS0VOX01PRElGSUVELCBDT1VOVF9NT0RJRklFRCArIENPVU5UX01PRElGWV9ERUxUQSwgMCwgVkVSSUZZX09OQ0UsIFxcXCJNb2RpZmllZCBhZnRlciBwcmVzZXJ2ZSAoa2V4ZWMgaGFuZG92ZXIpXFxcIn0sXFxuK307XFxuKyNkZWZpbmUgTlVNX1RFU1RfU0VTU0lPTlMgQVJSQVlfU0laRSh0ZXN0X2NvbmZpZ3MpXFxuK1xcbitzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncywgY29uc3QgY2hhciAqZGVzYylcXG4re1xcbitcXHRpbnQgYWN0dWFsX2ZsYWdzID0gZmNudGwoZWZkLCBGX0dFVEZMKTtcXG4rXFxuK1xcdGlmIChhY3R1YWxfZmxhZ3MgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0aW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgXFx1MDAyNiAoRUZEX05PTkJMT0NLIHwgRUZEX0NMT0VYRUMpO1xcbitcXHRpbnQgYWN0dWFsX2ZkX2ZsYWdzID0gYWN0dWFsX2ZsYWdzIFxcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xcbitcXG4rXFx0aWYgKGFjdHVhbF9mZF9mbGFncyAhPSBleHBlY3RlZF9mZF9mbGFncykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiJXM6IGZsYWcgbWlzbWF0Y2ggLSBleHBlY3RlZCAweCV4LCBnb3QgMHgleFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzLCBhY3R1YWxfZmRfZmxhZ3MpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBmbGFncyBPSyAoMHgleClcXFxcblxcXCIsIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcXG4rXFx0cmV0dXJuIGFjdHVhbF9mbGFnczsgLyogUmV0dXJuIGFjdHVhbCBmbGFncyBmb3IgZnVydGhlciB1c2UgKi9cXG4rfVxcbitcXG4rc3RhdGljIGludCBlbnN1cmVfbm9uYmxvY2soaW50IGVmZCwgaW50IGN1cnJlbnRfZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIGZjbnRsKGVmZCwgRl9TRVRGTCwgY3VycmVudF9mbGFncyB8IE9fTk9OQkxPQ0spO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHZlcmlmeV9jb3VudF9vbmNlKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9jb3VudCwgY29uc3QgY2hhciAqZGVzYylcXG4re1xcbitcXHR1aW50NjRfdCB2YWw7XFxuK1xcbitcXHRpZiAocmVhZChlZmQsIFxcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSlcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFxuK1xcdGlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgJXUgZ290ICVsbHVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2YWwpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBPSzogJXVcXFxcblxcXCIsIGRlc2MsIGV4cGVjdGVkX2NvdW50KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0dWludDY0X3QgdmFsO1xcbitcXG4rXFx0LyogUmVhZCBleHBlY3RlZF9jb3VudCB0aW1lcywgZWFjaCBzaG91bGQgcmV0dXJuIDEgKi9cXG4rXFx0Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgXFx1MDAzYyBleHBlY3RlZF9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdGlmIChyZWFkKGVmZCwgXFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKVxcbitcXHRcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0XFx0aWYgKHZhbCAhPSAxKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgMSwgZ290ICVsbHUgYXQgcmVhZCAldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGRlc2MsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsLCBpICsgMSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcXFxcblxcXCIsIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICsgMSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5leHQgcmVhZCBzaG91bGQgcmV0dXJuIEVBR0FJTiAobm8gbW9yZSBldmVudHMpICovXFxuK1xcdGlmIChyZWFkKGVmZCwgXFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpIFxcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUFHQUlOKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgRUFHQUlOIGFmdGVyICV1IHJlYWRzXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgZGVzYywgZXhwZWN0ZWRfY291bnQpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBPSyAoJXUgcmVhZHMpXFxcXG5cXFwiLCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoaW50IHNlc3Npb25fZmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9jb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBlbnVtIHZlcmlmeV9tb2RlIG1vZGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9yZXRyaWV2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcXG4rXFx0aW50IGVmZCwgcmV0ID0gMCwgYWN0dWFsX2ZsYWdzO1xcbitcXG4rXFx0YXJnLnRva2VuID0gdG9rZW47XFxuK1xcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFxcdTAwMjZhcmcpIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFx0ZWZkID0gYXJnLmZkO1xcbitcXG4rXFx0c3dpdGNoIChtb2RlKSB7XFxuK1xcdGNhc2UgVkVSSUZZX0ZMQUdTOlxcbitcXHRcXHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xcbitcXHRcXHRyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGNsb3NlKGVmZCk7XFxuK1xcdFxcdHJldHVybiByZXQgXFx1MDAzYyAwID8gcmV0IDogMDtcXG4rXFxuK1xcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcXG4rXFx0XFx0LyogVmVyaWZ5IGZsYWdzICsgc2VtYXBob3JlIGJlaGF2aW9yICovXFxuK1xcdFxcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xcbitcXHRcXHRpZiAoYWN0dWFsX2ZsYWdzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRyZXQgPSBhY3R1YWxfZmxhZ3M7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoZW5zdXJlX25vbmJsb2NrKGVmZCwgYWN0dWFsX2ZsYWdzKSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0cmV0ID0gLWVycm5vO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0cmV0ID0gdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRjYXNlIFZFUklGWV9PTkNFOlxcbitcXHRjYXNlIFZFUklGWV9OT05CTE9DSzpcXG4rXFx0Y2FzZSBWRVJJRllfTEFSR0U6XFxuK1xcdFxcdC8qIFZlcmlmeSBmbGFncyArIGNvdW50IGJlaGF2aW9yICovXFxuK1xcdFxcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xcbitcXHRcXHRpZiAoYWN0dWFsX2ZsYWdzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRyZXQgPSBhY3R1YWxfZmxhZ3M7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRyZXQgPSB2ZXJpZnlfY291bnRfb25jZShlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHRjbG9zZShlZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKGludCBzZXNzaW9uX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpbnQgKmVmZF9vdXQpXFxuK3tcXG4rXFx0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcXG4rXFx0aW50IGVmZCA9IGV2ZW50ZmQoY291bnQsIGZsYWdzKTtcXG4rXFxuK1xcdGlmIChlZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0YXJnLmZkID0gZWZkO1xcbitcXHRhcmcudG9rZW4gPSB0b2tlbjtcXG4rXFx0aWYgKGlvY3RsKHNlc3Npb25fZmQsIExJVkVVUERBVEVfU0VTU0lPTl9QUkVTRVJWRV9GRCwgXFx1MDAyNmFyZykgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGludCByZXQgPSAtZXJybm87XFxuK1xcbitcXHRcXHRjbG9zZShlZmQpO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZWZkX291dClcXG4rXFx0XFx0KmVmZF9vdXQgPSBlZmQ7XFxuK1xcdGVsc2VcXG4rXFx0XFx0Y2xvc2UoZWZkKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0cmV0dXJuIGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsIHRva2VuLCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgZmxhZ3MsIGRlc2MsIE5VTEwpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNyZWF0ZV9zZXNzaW9uX2NoZWNrZWQoaW50IGx1b19mZCwgY29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcXG4rXFxuK1xcdGlmIChzZXNzaW9uX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0ZmFpbF9leGl0KFxcXCJsdW9fY3JlYXRlX3Nlc3Npb24gZm9yICclcydcXFwiLCBzZXNzaW9uX25hbWUpO1xcbitcXHRyZXR1cm4gc2Vzc2lvbl9mZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCByZXRyaWV2ZV9zZXNzaW9uX2NoZWNrZWQoaW50IGx1b19mZCwgY29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0aWYgKHNlc3Npb25fZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRmYWlsX2V4aXQoXFxcImx1b19yZXRyaWV2ZV9zZXNzaW9uIGZvciAnJXMnXFxcIiwgc2Vzc2lvbl9uYW1lKTtcXG4rXFx0cmV0dXJuIHNlc3Npb25fZmQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGZpbmlzaF9zZXNzaW9uX2NoZWNrZWQoaW50IHNlc3Npb25fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcXG4re1xcbitcXHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFxcdTAwM2MgMClcXG4rXFx0XFx0ZmFpbF9leGl0KFxcXCJsdW9fc2Vzc2lvbl9maW5pc2ggZm9yICclcydcXFwiLCBzZXNzaW9uX25hbWUpO1xcbitcXHRjbG9zZShzZXNzaW9uX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCB2ZXJpZnlfZXZlbnRmZF9jb25maWcoaW50IHNlc3Npb25fZmQsIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcpXFxuK3tcXG4rXFx0cmV0dXJuIHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoc2Vzc2lvbl9mZCwgY29uZmlnLVxcdTAwM2V0b2tlbixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IGNvbmZpZy1cXHUwMDNlY291bnQsIGNvbmZpZy1cXHUwMDNlZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBjb25maWctXFx1MDAzZXZlcmlmeV9tb2RlLCBjb25maWctXFx1MDAzZWRlc2MpO1xcbit9XFxuK1xcbitcXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzEoaW50IGx1b19mZClcXG4re1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDFdIFN0YXJ0aW5nIHByZS1rZXhlYyBzZXR1cCBmb3IgbXVsdGktZXZlbnRmZCB0ZXN0Li4uXFxcXG5cXFwiKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAxXSBDcmVhdGluZyBzdGF0ZSBmaWxlIGZvciBuZXh0IHN0YWdlICgyKS4uLlxcXFxuXFxcIik7XFxuK1xcdGNyZWF0ZV9zdGF0ZV9maWxlKGx1b19mZCwgU1RBVEVfU0VTU0lPTl9OQU1FLCBTVEFURV9UT0tFTiwgMik7XFxuK1xcbitcXHQvKiBDcmVhdGUgYWxsIHRlc3Qgc2Vzc2lvbnMgKi9cXG4rXFx0Zm9yIChzaXplX3QgaSA9IDA7IGkgXFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKSB7XFxuK1xcdFxcdGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSBcXHUwMDI2dGVzdF9jb25maWdzW2ldO1xcbitcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAxXSBDcmVhdGluZyBzZXNzaW9uICclcycuLi5cXFxcblxcXCIsIGNvbmZpZy1cXHUwMDNlc2Vzc2lvbl9uYW1lKTtcXG4rXFx0XFx0aW50IHNlc3Npb25fZmQgPSBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgY29uZmlnLVxcdTAwM2VzZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0XFx0LyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovXFxuK1xcdFxcdGlmIChjb25maWctXFx1MDAzZXRva2VuID09IFRPS0VOX01PRElGSUVEKSB7XFxuK1xcdFxcdFxcdGludCBwcmVzZXJ2ZWRfZWZkO1xcbitcXG4rXFx0XFx0XFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNldG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdENPVU5UX01PRElGSUVELFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRjb25maWctXFx1MDAzZWZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFwibW9kaWZpZWQtYWZ0ZXItcHJlc2VydmVcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2cHJlc2VydmVkX2VmZCkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkIG1vZGlmaWVkXFxcIik7XFxuK1xcbitcXHRcXHRcXHQvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCdzIGNvdW50ICovXFxuK1xcdFxcdFxcdHVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTtcXG4rXFxuK1xcdFxcdFxcdGlmICh3cml0ZShwcmVzZXJ2ZWRfZWZkLCBcXHUwMDI2bW9kaWZ5X3ZhbHVlLFxcbitcXHRcXHRcXHQgICAgc2l6ZW9mKG1vZGlmeV92YWx1ZSkpICE9IHNpemVvZihtb2RpZnlfdmFsdWUpKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcIndyaXRlIHRvIHByZXNlcnZlZCBldmVudGZkIGFmdGVyIHByZXNlcnZlXFxcIik7XFxuK1xcbitcXHRcXHRcXHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0LyogU3RhbmRhcmQgc2Vzc2lvbiBjcmVhdGlvbiAqL1xcbitcXHRcXHRcXHRpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKHNlc3Npb25fZmQsIGNvbmZpZy1cXHUwMDNldG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNlY291bnQsIGNvbmZpZy1cXHUwMDNlZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNlZGVzYykgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZCAlc1xcXCIsIGNvbmZpZy1cXHUwMDNlZGVzYyk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2UobHVvX2ZkKTtcXG4rXFx0ZGFlbW9uaXplX2FuZF93YWl0KCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8yKGludCBsdW9fZmQsIGludCBzdGF0ZV9zZXNzaW9uX2ZkKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2Zkc1tOVU1fVEVTVF9TRVNTSU9OU107XFxuK1xcdGludCBzdGFnZTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJbU1RBR0UgMl0gU3RhcnRpbmcgcG9zdC1rZXhlYyB2ZXJpZmljYXRpb24uLi5cXFxcblxcXCIpO1xcbitcXG4rXFx0cmVzdG9yZV9hbmRfcmVhZF9zdGFnZShzdGF0ZV9zZXNzaW9uX2ZkLCBTVEFURV9UT0tFTiwgXFx1MDAyNnN0YWdlKTtcXG4rXFx0aWYgKHN0YWdlICE9IDIpXFxuK1xcdFxcdGZhaWxfZXhpdChcXFwiRXhwZWN0ZWQgc3RhZ2UgMiwgYnV0IHN0YXRlIGZpbGUgY29udGFpbnMgJWRcXFwiLCBzdGFnZSk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIFJldHJpZXZpbmcgYWxsIHNlc3Npb25zLi4uXFxcXG5cXFwiKTtcXG4rXFx0Zm9yIChzaXplX3QgaSA9IDA7IGkgXFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKVxcbitcXHRcXHRzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cXFxcblxcXCIpO1xcbitcXHRmb3IgKHNpemVfdCBpID0gMDsgaSBcXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspIHtcXG4rXFx0XFx0aWYgKHZlcmlmeV9ldmVudGZkX2NvbmZpZyhzZXNzaW9uX2Zkc1tpXSwgXFx1MDAyNnRlc3RfY29uZmlnc1tpXSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRmYWlsX2V4aXQoXFxcInZlcmlmeSAlcyBldmVudGZkXFxcIiwgdGVzdF9jb25maWdzW2ldLmRlc2MpO1xcbitcXHR9XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cXFxcblxcXCIpO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAyXSBGaW5hbGl6aW5nIGFsbCBzZXNzaW9ucy4uLlxcXFxuXFxcIik7XFxuK1xcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFxcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkrKylcXG4rXFx0XFx0ZmluaXNoX3Nlc3Npb25fY2hlY2tlZChzZXNzaW9uX2Zkc1tpXSwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIEZpbmFsaXppbmcgc3RhdGUgc2Vzc2lvbi4uLlxcXFxuXFxcIik7XFxuK1xcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXFx1MDAzYyAwKVxcbitcXHRcXHRmYWlsX2V4aXQoXFxcImx1b19zZXNzaW9uX2ZpbmlzaCBmb3Igc3RhdGUgc2Vzc2lvblxcXCIpO1xcbitcXHRjbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbi0tLSBFVkVOVEZEX0xVTyBURVNUIFBBU1NFRCAtLS1cXFxcblxcXCIpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxcbit7XFxuK1xcdHJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsXFxuK1xcdFxcdFxcdHJ1bl9zdGFnZV8xLCBydW5fc3RhZ2VfMik7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDc6NTcuNjk2NjAwNTg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzE0MzQ3NzM2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjIxYWZkMzM5ODg3NWViMTRkOWI3ZDdkMmEwMTljNDFiZTk0YzkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxuaW5kZXggODlhOGE5ZDIwN2QxYzUuLjM2ZDU2OGU2Y2ZjNzNlIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbisrKyBiL2ZzL01ha2VmaWxlXG5AQCAtMjcsNiArMjcsNyBAQCBvYmoteVx0XHRcdFx0Kz0gYW5vbl9pbm9kZXMub1xuIG9iai0kKENPTkZJR19TSUdOQUxGRClcdFx0Kz0gc2lnbmFsZmQub1xuIG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQrPSB0aW1lcmZkLm9cbiBvYmotJChDT05GSUdfRVZFTlRGRClcdFx0Kz0gZXZlbnRmZC5vXG4rb2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkrPSBldmVudGZkX2x1by5vXG4gb2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICArPSBhaW8ub1xuIG9iai0kKENPTkZJR19GU19EQVgpXHRcdCs9IGRheC5vXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXHQrPSBjcnlwdG8vXG5kaWZmIC0tZ2l0IGEvZnMvZXZlbnRmZC5jIGIvZnMvZXZlbnRmZC5jXG5pbmRleCA5ZDMzYTAyNzU3ZDUyYi4uOWI3NmNmMDYxMzVhODYgMTAwNjQ0XG4tLS0gYS9mcy9ldmVudGZkLmNcbisrKyBiL2ZzL2V2ZW50ZmQuY1xuQEAgLTM3Niw2ICszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2N0eF9maWxlZ2V0KTtcbiBcbisvKipcbisgKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPXG4rICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxuKyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWVcbisgKiBAZmxhZ3M6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGZsYWdzIHZhbHVlXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuXG4rICogU2luY2Ugc3RydWN0IGV2ZW50ZmRfY3R4IGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB3ZSBjYW4gYWNjZXNzIGl0c1xuKyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmVcbisgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LlxuKyAqXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbisgKi9cbitpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4rXHR1bnNpZ25lZCBsb25nIGlycV9mbGFncztcbitcbitcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4rXHRpZiAoSVNfRVJSKGN0eCkpXG4rXHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4rXG4rXHQvKiBSZWFkIGNvdW50IHdpdGggbG9jayAoZmxhZ3MgZG9uJ3QgbmVlZCBsb2NrKSAqL1xuK1x0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2Y3R4LVx1MDAzZXdxaC5sb2NrLCBpcnFfZmxhZ3MpO1xuK1x0KmNvdW50ID0gY3R4LVx1MDAzZWNvdW50O1xuK1x0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZjdHgtXHUwMDNld3FoLmxvY2ssIGlycV9mbGFncyk7XG4rXG4rXHQqZmxhZ3MgPSBjdHgtXHUwMDNlZmxhZ3M7XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuK1xuIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcbiB7XG4gXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbkBAIC00MTEsNiArNDQ1LDEyIEBAIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcbiBcdHJldHVybiBmZF9wdWJsaXNoKGZkZik7XG4gfVxuIFxuK2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcbitcbiBTWVNDQUxMX0RFRklORTIoZXZlbnRmZDIsIHVuc2lnbmVkIGludCwgY291bnQsIGludCwgZmxhZ3MpXG4ge1xuIFx0cmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTtcbmRpZmYgLS1naXQgYS9mcy9ldmVudGZkX2x1by5jIGIvZnMvZXZlbnRmZF9sdW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43ODFkOTA2MzVjNTJhZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZnMvZXZlbnRmZF9sdW8uY1xuQEAgLTAsMCArMSwyNTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cdTAwM2VcbisgKi9cbitcbisvKipcbisgKiBET0M6IEV2ZW50ZmQgUHJlc2VydmF0aW9uIHZpYSBMVU9cbisgKlxuKyAqIE92ZXJ2aWV3XG4rICogPT09PT09PT1cbisgKlxuKyAqIEV2ZW50IGZpbGUgZGVzY3JpcHRvcnMgKGV2ZW50ZmQpIGNhbiBiZSBwcmVzZXJ2ZWQgb3ZlciBhIGtleGVjIHVzaW5nIHRoZSBMaXZlXG4rICogVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBmaWxlIHByZXNlcnZhdGlvbi4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGFwcGxpY2F0aW9uc1xuKyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXG4rICogdXBkYXRlcy5cbisgKlxuKyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcbisgKiBzaWduYWxpbmcgZXZlbnRzIGJldHdlZW4gdXNlcnNwYWNlIHByb2Nlc3NlcyBvciBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLlxuKyAqIFRoZSBwcmVzZXJ2YXRpb24gZW5zdXJlcyB0aGF0IHBlbmRpbmcgZXZlbnRzIGFuZCBjb25maWd1cmF0aW9uIGFyZSBub3QgbG9zdFxuKyAqIGR1cmluZyBrZXhlYy5cbisgKlxuKyAqIFRoZSBwcmVzZXJ2YXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHRyYW5zcGFyZW50LiBPbmx5IHNlbGVjdCBwcm9wZXJ0aWVzIG9mXG4rICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxuKyAqIHByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy5cbisgKlxuKyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXG4rICogPT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcbisgKlxuKyAqIENvdW50ZXIgVmFsdWVcbisgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xuKyAqICAgZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNpZ25hbGVkIGJ1dCBub3QgeWV0IGNvbnN1bWVkIGJ5IHJlYWRlcnMuXG4rICpcbisgKiBGaWxlIEZsYWdzXG4rICogICBUaGUgY3JlYXRpb24gZmxhZ3MgKEVGRF9TRU1BUEhPUkUsIEVGRF9DTE9FWEVDLCBFRkRfTk9OQkxPQ0spIGFyZSBwcmVzZXJ2ZWQuXG4rICogICBUaGVzZSBjb250cm9sIHRoZSBiZWhhdmlvciBvZiByZWFkL3dyaXRlIG9wZXJhdGlvbnMgYW5kIGZpbGUgZGVzY3JpcHRvclxuKyAqICAgaW5oZXJpdGFuY2UuXG4rICpcbisgKiBOb24tUHJlc2VydmVkIFByb3BlcnRpZXNcbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIEFsbCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBub3QgcHJlc2VydmVkIG11c3QgYmUgYXNzdW1lZCB0byBiZSByZXNldCB0b1xuKyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXG4rICogbm90ZS5cbisgKlxuKyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcbisgKiAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGl0c2VsZiBpcyBub3QgcHJlc2VydmVkLiBBZnRlciByZXN0b3JlLCB0aGVcbisgKiAgIGV2ZW50ZmQgd2lsbCBiZSBhc3NpZ25lZCBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGluIHRoZSB0YXJnZXQgcHJvY2Vzcy5cbisgKlxuKyAqIFdhaXQgUXVldWUgU3RhdGVcbisgKiAgIEFueSBwcm9jZXNzZXMgY3VycmVudGx5IGJsb2NrZWQgb24gcmVhZCgpIG9wZXJhdGlvbnMgd2lsbCBiZSB3b2tlbiB1cCBhbmRcbisgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXG4rICpcbisgKiBGaWxlIFBvc2l0aW9uXG4rICogICBFdmVudGZkIGZpbGVzIGRvbid0IGhhdmUgYSB0cmFkaXRpb25hbCBmaWxlIHBvc2l0aW9uLCBidXQgYW55IGludGVybmFsXG4rICogICBzdGF0ZSByZWxhdGVkIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgcmVzZXQuXG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgva2V4ZWNfaGFuZG92ZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGl2ZXVwZGF0ZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hbm9uX2lub2Rlcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaWRyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rcmVmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9mZHRhYmxlLmhcdTAwM2VcbitcbitzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4rXHR1NjQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4rXHRpbnQgZXJyID0gMDtcbitcbitcdC8qIEdldCBldmVudGZkIHN0YXRlIHNhZmVseSAqL1xuK1x0ZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtXHUwMDNlZmlsZSwgXHUwMDI2Y291bnQsIFx1MDAyNmZsYWdzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGdldCBldmVudGZkIHN0YXRlOiAlZFxcblwiLCBlcnIpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0c2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7XG4rXHRpZiAoSVNfRVJSKHNlcikpIHtcbitcdFx0ZXJyID0gUFRSX0VSUihzZXIpO1xuK1x0XHRwcl9lcnIoXCJGYWlsZWQgdG8gYWxsb2NhdGUgcHJlc2VydmUgbWVtb3J5OiAlZFxcblwiLCBlcnIpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXG4rXHRzZXItXHUwMDNlY291bnQgPSBjb3VudDtcbitcdHNlci1cdTAwM2VmbGFncyA9IGZsYWdzO1xuK1xuK1x0cHJfZGVidWcoXCJQcmVzZXJ2ZWQgZXZlbnRmZDogY291bnQ9JWxsdSwgZmxhZ3M9MHgleFxcblwiLFxuK1x0XHRzZXItXHUwMDNlY291bnQsIHNlci1cdTAwM2VmbGFncyk7XG4rXG4rXHQvKiBSZXR1cm4gcGh5c2ljYWwgYWRkcmVzcyBvZiBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZSAqL1xuK1x0YXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEgPSB2aXJ0X3RvX3BoeXMoc2VyKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX2ZyZWV6ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuK1x0dTY0IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGZsYWdzO1xuK1x0aW50IGVycjtcbitcbitcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xuK1xuK1x0LyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovXG4rXHRlcnIgPSBldmVudGZkX2x1b19nZXRfc3RhdGUoYXJncy1cdTAwM2VmaWxlLCBcdTAwMjZjb3VudCwgXHUwMDI2ZmxhZ3MpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmIChzZXItXHUwMDNlY291bnQgIT0gY291bnQpIHtcbitcdFx0cHJfZGVidWcoXCJXQVJOSU5HOiBDb3VudCBjaGFuZ2VkIGR1cmluZyBwcmVzZXJ2ZS1cdTAwM2VmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxcblwiLFxuK1x0XHRcdCBzZXItXHUwMDNlY291bnQsIGNvdW50KTtcbitcdH1cbitcbitcdHNlci1cdTAwM2Vjb3VudCA9IGNvdW50O1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX3VucHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuK3tcbitcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcbitcbitcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbitcdGtob191bnByZXNlcnZlX2ZyZWUoc2VyKTtcbit9XG4rXG4rc3RhdGljIGludCBldmVudGZkX2x1b19yZXRyaWV2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4rXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7XG4rXHRpbnQgZXZlbnRmZDtcbitcbitcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSk7XG4rXHRpZiAoIXNlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBDcmVhdGUgYSBuZXcgZXZlbnRmZCB3aXRoIHRoZSBwcmVzZXJ2ZWQgY291bnQgYW5kIGZsYWdzICovXG4rXHRldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLVx1MDAzZWNvdW50LCBzZXItXHUwMDNlZmxhZ3MpO1xuK1x0aWYgKGV2ZW50ZmQgXHUwMDNjIDApIHtcbitcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGNyZWF0ZSBldmVudGZkOiAlZFxcblwiLCBldmVudGZkKTtcbitcdFx0cmV0dXJuIGV2ZW50ZmQ7XG4rXHR9XG4rXG4rXHRmaWxlID0gZmdldChldmVudGZkKTtcbitcdGlmICghZmlsZSkge1xuK1x0XHRwcl9lcnIoXCJGYWlsZWQgdG8gZ2V0IGZpbGUgZnJvbSBmZFxcblwiKTtcbitcdFx0Y2xvc2VfZmQoZXZlbnRmZCk7XG4rXHRcdHJldHVybiAtRUJBREY7XG4rXHR9XG4rXG4rXHRjbG9zZV9mZChldmVudGZkKTtcbitcbitcdC8qIFZlcmlmeSB0aGUgY3JlYXRlZCBmaWxlIGhhcyBjb3JyZWN0IGludGVybmFsIHN0YXRlICovXG4rXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuK1x0aWYgKElTX0VSUihjdHgpKSB7XG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBnZXQgY29udGV4dCBmcm9tIGZpbGVcXG5cIik7XG4rXHRcdGZwdXQoZmlsZSk7XG4rXHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4rXHR9XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcbitcdGFyZ3MtXHUwMDNlZmlsZSA9IGZpbGU7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fZmluaXNoKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4rXG4rXHRpZiAoYXJncy1cdTAwM2VyZXRyaWV2ZV9zdGF0dXMpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpXG4rXHRcdHJldHVybjtcbitcbitcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSk7XG4rXHRpZiAoIXNlcilcbitcdFx0cmV0dXJuO1xuK1xuK1x0a2hvX3Jlc3RvcmVfZnJlZShzZXIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBldmVudGZkX2x1b19jYW5fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpoYW5kbGVyLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcbitcbitcdGlmICghZmlsZS1cdTAwM2VmX29wKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHQvKiBUcnkgdG8gZ2V0IGV2ZW50ZmQgY29udGV4dCAtIHRoaXMgd2lsbCBmYWlsIGlmIG5vdCBhbiBldmVudGZkICovXG4rXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuK1x0aWYgKElTX0VSUihjdHgpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcHMgZXZlbnRmZF9sdW9fZmlsZV9vcHMgPSB7XG4rXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcbitcdC51bnByZXNlcnZlID0gZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSxcbitcdC5mcmVlemUgPSBldmVudGZkX2x1b19mcmVlemUsXG4rXHQucmV0cmlldmUgPSBldmVudGZkX2x1b19yZXRyaWV2ZSxcbitcdC5maW5pc2ggPSBldmVudGZkX2x1b19maW5pc2gsXG4rXHQuY2FuX3ByZXNlcnZlID0gZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlLFxuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyIGV2ZW50ZmRfbHVvX2hhbmRsZXIgPSB7XG4rXHQub3BzID0gXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXG4rXHQuY29tcGF0aWJsZSA9IEVWRU5URkRfTFVPX0ZIX0NPTVBBVElCTEUsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBldmVudGZkX2x1b19pbml0KHZvaWQpXG4re1xuK1x0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xuK1xuK1x0aWYgKGVyciBcdTAwMjZcdTAwMjYgZXJyICE9IC1FT1BOT1RTVVBQKSB7XG4rXHRcdHByX2VycihcIkNvdWxkIG5vdCByZWdpc3RlciBldmVudGZkIExVTyBoYW5kbGVyOiAlcGVcXG5cIixcbitcdFx0ICAgICAgIEVSUl9QVFIoZXJyKSk7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rbGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXG5pbmRleCBlMzJiZWU0MzQ1ZmI5Zi4uNzAzZTFhMTI2YzRkNDAgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmhcbkBAIC0zNSw2ICszNSw4IEBAIHZvaWQgZXZlbnRmZF9jdHhfcHV0KHN0cnVjdCBldmVudGZkX2N0eCAqY3R4KTtcbiBzdHJ1Y3QgZmlsZSAqZXZlbnRmZF9mZ2V0KGludCBmZCk7XG4gc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9mZGdldChpbnQgZmQpO1xuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmlsZWdldChzdHJ1Y3QgZmlsZSAqZmlsZSk7XG4raW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcbitpbnQgZXZlbnRmZF9jcmVhdGUoX191NjQgY291bnQsIHVuc2lnbmVkIGludCBmbGFncyk7XG4gdm9pZCBldmVudGZkX3NpZ25hbF9tYXNrKHN0cnVjdCBldmVudGZkX2N0eCAqY3R4LCBfX3BvbGxfdCBtYXNrKTtcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcbiBcdFx0XHRcdCAgX191NjQgKmNudCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTQ4YmVhYzZiY2M3NjBcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbkBAIC0wLDAgKzEsMzkgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cdTAwM2VcbisgKi9cbitcbisjaWZuZGVmIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSFxuKyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRXZlbnRmZCBMaXZlIFVwZGF0ZSBBQklcbisgKlxuKyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy5cbisgKlxuKyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYFxuKyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uXG4rICpcbisgKi9cbitcbisvKipcbisgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkXG4rICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlXG4rICogQGZsYWdzOiBGaWxlIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKVxuKyAqXG4rICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZFxuKyAqIGFmdGVyIGtleGVjLiBUaGUgY291bnQgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZXZlbnQgY291bnRlcixcbisgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLlxuKyAqL1xuK3N0cnVjdCBldmVudGZkX2x1b19zZXIge1xuK1x0X191NjQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQgIGZsYWdzO1xuK30gX19wYWNrZWQ7XG4rXG4rLyogVGhlIGNvbXBhdGliaWxpdHkgc3RyaW5nIGZvciBldmVudGZkIGZpbGUgaGFuZGxlciAqL1xuKyNkZWZpbmUgRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRVx0XCJldmVudGZkLXYxXCJcbitcbisjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbisrKyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbkBAIC04Niw0ICs4NiwyMCBAQCBjb25maWcgTElWRVVQREFURV9NRU1GRFxuIFxuIFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIFxuK2NvbmZpZyBMSVZFVVBEQVRFX0VWRU5URkRcbitcdGJvb2wgXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XCJcbitcdGRlcGVuZHMgb24gRVZFTlRGRFxuK1x0ZGVwZW5kcyBvbiBMSVZFVVBEQVRFXG4rXHRoZWxwXG4rXHQgIEVuYWJsZSBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydCBmb3IgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3JzLlxuK1x0ICBUaGlzIGFsbG93cyBldmVudGZkIGZpbGVzIHRvIGJlIHByZXNlcnZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIGtleGVjXG4rXHQgIG9wZXJhdGlvbnMsIG1haW50YWluaW5nIHRoZWlyIGNvdW50ZXIgdmFsdWVzIGFuZCBmbGFncy5cbitcbitcdCAgRXZlbnRmZCBmaWxlcyBhcmUgY29tbW9ubHkgdXNlZCBmb3IgZXZlbnQgbm90aWZpY2F0aW9uIGJldHdlZW5cbitcdCAgdXNlcnNwYWNlIHByb2Nlc3NlcyBvciBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLiBXaXRoIHRoaXNcbitcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxuK1x0ICBkdXJpbmcgbGl2ZSB1cGRhdGUgb3BlcmF0aW9ucy5cbitcbitcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbitcbiBlbmRtZW51XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbmluZGV4IDMwNjg5ZDIyY2IwMjE2Li5lMDkyZTM4ZmE2ZjZjNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbkBAIC04LDYgKzgsNyBAQCBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fa2V4ZWNfc2ltcGxlXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX211bHRpX3Nlc3Npb25cbiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fc3RyZXNzX3Nlc3Npb25zXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX3N0cmVzc19maWxlc1xuK1RFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b190ZXN0X2V2ZW50ZmRcbiBcbiBURVNUX0ZJTEVTICs9IGRvX2tleGVjLnNoXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZ1xuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXG5AQCAtOSwzICs5LDUgQEAgQ09ORklHX0xJVkVVUERBVEVfVEVTVD15XG4gQ09ORklHX01FTUZEX0NSRUFURT15XG4gQ09ORklHX1RNUEZTPXlcbiBDT05GSUdfU0hNRU09eVxuK0NPTkZJR19FVkVOVEZEPXlcbitDT05GSUdfTElWRVVQREFURV9FVkVOVEZEPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjk0ZWYzYmM2NmFkOTcxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuY1xuQEAgLTAsMCArMSwzNzYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLlxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcdTAwM2NkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jblx1MDAzZVxuKyAqL1xuK1xuKy8qXG4rICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cbisgKlxuKyAqIE1vZGVsZWQgYWZ0ZXIgbHVvX211bHRpX3Nlc3Npb24uYy5cbisgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxuKyAqIGFuZCB2ZXJpZmllcyB0aGVtIGFmdGVyIGtleGVjLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2V2ZW50ZmQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImx1b190ZXN0X3V0aWxzLmhcIlxuK1xuKy8qIFNlc3Npb24gbmFtZXMgKi9cbisjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgIFwiZXZlbnRmZC1lbXB0eVwiXG4rI2RlZmluZSBTRVNTSU9OX0RFRkFVTFQgICBcImV2ZW50ZmQtZGVmYXVsdFwiXG4rI2RlZmluZSBTRVNTSU9OX1NFTSAgICAgICBcImV2ZW50ZmQtc2VtXCJcbisjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgIFwiZXZlbnRmZC1ub25ibG9ja1wiXG4rI2RlZmluZSBTRVNTSU9OX0xBUkdFICAgICBcImV2ZW50ZmQtbGFyZ2VcIlxuKyNkZWZpbmUgU0VTU0lPTl9NT0RJRklFRCAgXCJldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCJcbitcbisvKiBUb2tlbnMgKi9cbisjZGVmaW5lIFRPS0VOX0RFRkFVTFQgICAgICAgMHhDQUZFQkFCRVxuKyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGXG4rI2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUZcbisjZGVmaW5lIFRPS0VOX0xBUkdFICAgICAgICAgMHhCRUVGQ0FGRVxuKyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0XG4rXG4rLyogQ291bnRzICovXG4rI2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDJcbisjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMFxuKyNkZWZpbmUgQ09VTlRfRVhQRUNURUQgIChDT1VOVF9JTklUSUFMICsgQ09VTlRfV1JJVEUpIC8qIDUyICovXG4rI2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxuKyNkZWZpbmUgQ09VTlRfTk9OQkxPQ0sgIDEwMFxuKyNkZWZpbmUgQ09VTlRfTEFSR0UgICAgICgodW5zaWduZWQgaW50KS0xKSAvKiBVSU5UX01BWCAqL1xuKyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XG4rI2RlZmluZSBDT1VOVF9NT0RJRllfREVMVEEgIDk5XG4rXG4rLyogU3RhdGUgdHJhY2tpbmcgKi9cbisjZGVmaW5lIFNUQVRFX1NFU1NJT05fTkFNRSBcImV2ZW50ZmRfbXVsdGlfc3RhdGVcIlxuKyNkZWZpbmUgU1RBVEVfVE9LRU4gICAgICAgIDk5N1xuK1xuKy8qIEV2ZW50ZmQgdmVyaWZpY2F0aW9uIG1vZGVzICovXG4rZW51bSB2ZXJpZnlfbW9kZSB7XG4rXHRWRVJJRllfRkxBR1MsICAgICAgICAvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuK1x0VkVSSUZZX09OQ0UsICAgICAgICAgLyogUmVhZCBvbmNlIGFuZCB2ZXJpZnkgY291bnQgKi9cbitcdFZFUklGWV9TRU1BUEhPUkUsICAgIC8qIFJlYWQgbXVsdGlwbGUgdGltZXMsIHZlcmlmeSByZXR1cm5zIDEgZWFjaCB0aW1lICovXG4rXHRWRVJJRllfTk9OQkxPQ0ssICAgICAvKiBSZWFkIG9uY2UgaW4gbm9uYmxvY2sgbW9kZSAqL1xuK1x0VkVSSUZZX0xBUkdFICAgICAgICAgLyogUmVhZCBvbmNlLCB2ZXJpZnkgbGFyZ2UgY291bnQgKi9cbit9O1xuK1xuKy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9uICovXG4rc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcge1xuK1x0Y29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lO1xuK1x0dW5zaWduZWQgbG9uZyB0b2tlbjtcbitcdHVuc2lnbmVkIGludCBjb3VudDtcbitcdHVuc2lnbmVkIGludCBmbGFncztcbitcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XG4rXHRjb25zdCBjaGFyICpkZXNjO1xuK307XG4rXG4rLyogVGVzdCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zICovXG4rc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHRlc3RfY29uZmlnc1tdID0ge1xuK1x0e1NFU1NJT05fRU1QVFksIDAsIDAsIDAsIFZFUklGWV9GTEFHUywgXCJFbXB0eVwifSxcbitcdHtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgXCJEZWZhdWx0XCJ9LFxuK1x0e1NFU1NJT05fU0VNLCBUT0tFTl9TRU0sIENPVU5UX1NFTSwgRUZEX1NFTUFQSE9SRSwgVkVSSUZZX1NFTUFQSE9SRSwgXCJTZW1hcGhvcmVcIn0sXG4rXHR7U0VTU0lPTl9OT05CTE9DSywgVE9LRU5fTk9OQkxPQ0ssIENPVU5UX05PTkJMT0NLLCBFRkRfTk9OQkxPQ0ssIFZFUklGWV9OT05CTE9DSywgXCJOb25ibG9ja1wifSxcbitcdHtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgXCJMYXJnZS1jb3VudFwifSxcbitcdHtTRVNTSU9OX01PRElGSUVELCBUT0tFTl9NT0RJRklFRCwgQ09VTlRfTU9ESUZJRUQgKyBDT1VOVF9NT0RJRllfREVMVEEsIDAsIFZFUklGWV9PTkNFLCBcIk1vZGlmaWVkIGFmdGVyIHByZXNlcnZlIChrZXhlYyBoYW5kb3ZlcilcIn0sXG4rfTtcbisjZGVmaW5lIE5VTV9URVNUX1NFU1NJT05TIEFSUkFZX1NJWkUodGVzdF9jb25maWdzKVxuK1xuK3N0YXRpYyBpbnQgdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdGludCBhY3R1YWxfZmxhZ3MgPSBmY250bChlZmQsIEZfR0VURkwpO1xuK1xuK1x0aWYgKGFjdHVhbF9mbGFncyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC1lcnJubztcbitcbitcdGludCBleHBlY3RlZF9mZF9mbGFncyA9IGV4cGVjdGVkX2ZsYWdzIFx1MDAyNiAoRUZEX05PTkJMT0NLIHwgRUZEX0NMT0VYRUMpO1xuK1x0aW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyBcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0aWYgKGFjdHVhbF9mZF9mbGFncyAhPSBleHBlY3RlZF9mZF9mbGFncykge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIiVzOiBmbGFnIG1pc21hdGNoIC0gZXhwZWN0ZWQgMHgleCwgZ290IDB4JXhcXG5cIixcbitcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MsIGFjdHVhbF9mZF9mbGFncyk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgZmxhZ3MgT0sgKDB4JXgpXFxuXCIsIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcbitcdHJldHVybiBhY3R1YWxfZmxhZ3M7IC8qIFJldHVybiBhY3R1YWwgZmxhZ3MgZm9yIGZ1cnRoZXIgdXNlICovXG4rfVxuK1xuK3N0YXRpYyBpbnQgZW5zdXJlX25vbmJsb2NrKGludCBlZmQsIGludCBjdXJyZW50X2ZsYWdzKVxuK3tcbitcdHJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTtcbit9XG4rXG4rc3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXG4re1xuK1x0dWludDY0X3QgdmFsO1xuK1xuK1x0aWYgKHJlYWQoZWZkLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSlcbitcdFx0cmV0dXJuIC1lcnJubztcbitcbitcdGlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkICV1IGdvdCAlbGx1XFxuXCIsXG4rXHRcdFx0ICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50LCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgT0s6ICV1XFxuXCIsIGRlc2MsIGV4cGVjdGVkX2NvdW50KTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHVpbnQ2NF90IHZhbDtcbitcbitcdC8qIFJlYWQgZXhwZWN0ZWRfY291bnQgdGltZXMsIGVhY2ggc2hvdWxkIHJldHVybiAxICovXG4rXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcdTAwM2MgZXhwZWN0ZWRfY291bnQ7IGkrKykge1xuK1x0XHRpZiAocmVhZChlZmQsIFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKVxuK1x0XHRcdHJldHVybiAtZXJybm87XG4rXG4rXHRcdGlmICh2YWwgIT0gMSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkIDEsIGdvdCAlbGx1IGF0IHJlYWQgJXVcXG5cIixcbitcdFx0XHRcdCAgICAgICBkZXNjLCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCwgaSArIDEpO1xuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiICAlcyBldmVudGZkIE9LOiAldSBhdCByZWFkICV1XFxuXCIsIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICsgMSk7XG4rXHR9XG4rXG4rXHQvKiBOZXh0IHJlYWQgc2hvdWxkIHJldHVybiBFQUdBSU4gKG5vIG1vcmUgZXZlbnRzKSAqL1xuK1x0aWYgKHJlYWQoZWZkLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSBcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUFHQUlOKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkIEVBR0FJTiBhZnRlciAldSByZWFkc1xcblwiLFxuK1x0XHRcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgT0sgKCV1IHJlYWRzKVxcblwiLCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKGludCBzZXNzaW9uX2ZkLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncyxcbitcdFx0XHRcdFx0ICAgICAgZW51bSB2ZXJpZnlfbW9kZSBtb2RlLFxuK1x0XHRcdFx0XHQgICAgICBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHN0cnVjdCBsaXZldXBkYXRlX3Nlc3Npb25fcmV0cmlldmVfZmQgYXJnID0geyAuc2l6ZSA9IHNpemVvZihhcmcpIH07XG4rXHRpbnQgZWZkLCByZXQgPSAwLCBhY3R1YWxfZmxhZ3M7XG4rXG4rXHRhcmcudG9rZW4gPSB0b2tlbjtcbitcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtZXJybm87XG4rXHRlZmQgPSBhcmcuZmQ7XG4rXG4rXHRzd2l0Y2ggKG1vZGUpIHtcbitcdGNhc2UgVkVSSUZZX0ZMQUdTOlxuK1x0XHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuK1x0XHRyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRjbG9zZShlZmQpO1xuK1x0XHRyZXR1cm4gcmV0IFx1MDAzYyAwID8gcmV0IDogMDtcbitcbitcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcbitcdFx0LyogVmVyaWZ5IGZsYWdzICsgc2VtYXBob3JlIGJlaGF2aW9yICovXG4rXHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuK1x0XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGlmIChlbnN1cmVfbm9uYmxvY2soZWZkLCBhY3R1YWxfZmxhZ3MpIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gLWVycm5vO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdHJldCA9IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoZWZkLCBleHBlY3RlZF9jb3VudCwgZGVzYyk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBWRVJJRllfT05DRTpcbitcdGNhc2UgVkVSSUZZX05PTkJMT0NLOlxuK1x0Y2FzZSBWRVJJRllfTEFSR0U6XG4rXHRcdC8qIFZlcmlmeSBmbGFncyArIGNvdW50IGJlaGF2aW9yICovXG4rXHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuK1x0XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdHJldCA9IHZlcmlmeV9jb3VudF9vbmNlKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpO1xuK1x0XHRicmVhaztcbitcbitcdGRlZmF1bHQ6XG4rXHRcdHJldCA9IC1FSU5WQUw7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1xuK291dDpcbitcdGNsb3NlKGVmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKGludCBzZXNzaW9uX2ZkLFxuK1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXG4rXHRcdFx0XHRcdCAgICAgICBpbnQgKmVmZF9vdXQpXG4re1xuK1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbitcdGludCBlZmQgPSBldmVudGZkKGNvdW50LCBmbGFncyk7XG4rXG4rXHRpZiAoZWZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLWVycm5vO1xuK1xuK1x0YXJnLmZkID0gZWZkO1xuK1x0YXJnLnRva2VuID0gdG9rZW47XG4rXHRpZiAoaW9jdGwoc2Vzc2lvbl9mZCwgTElWRVVQREFURV9TRVNTSU9OX1BSRVNFUlZFX0ZELCBcdTAwMjZhcmcpIFx1MDAzYyAwKSB7XG4rXHRcdGludCByZXQgPSAtZXJybm87XG4rXG4rXHRcdGNsb3NlKGVmZCk7XG4rXHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRpZiAoZWZkX291dClcbitcdFx0KmVmZF9vdXQgPSBlZmQ7XG4rXHRlbHNlXG4rXHRcdGNsb3NlKGVmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQoaW50IHNlc3Npb25fZmQsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXG4re1xuK1x0cmV0dXJuIGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsIHRva2VuLCBjb3VudCxcbitcdFx0XHRcdFx0XHQgICBmbGFncywgZGVzYywgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX3Nlc3Npb25fY2hlY2tlZChpbnQgbHVvX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpXG4re1xuK1x0aW50IHNlc3Npb25fZmQgPSBsdW9fY3JlYXRlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xuK1xuK1x0aWYgKHNlc3Npb25fZmQgXHUwMDNjIDApXG4rXHRcdGZhaWxfZXhpdChcImx1b19jcmVhdGVfc2Vzc2lvbiBmb3IgJyVzJ1wiLCBzZXNzaW9uX25hbWUpO1xuK1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbit7XG4rXHRpbnQgc2Vzc2lvbl9mZCA9IGx1b19yZXRyaWV2ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcbitcbitcdGlmIChzZXNzaW9uX2ZkIFx1MDAzYyAwKVxuK1x0XHRmYWlsX2V4aXQoXCJsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJyVzJ1wiLCBzZXNzaW9uX25hbWUpO1xuK1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbmlzaF9zZXNzaW9uX2NoZWNrZWQoaW50IHNlc3Npb25fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbit7XG4rXHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFx1MDAzYyAwKVxuK1x0XHRmYWlsX2V4aXQoXCJsdW9fc2Vzc2lvbl9maW5pc2ggZm9yICclcydcIiwgc2Vzc2lvbl9uYW1lKTtcbitcdGNsb3NlKHNlc3Npb25fZmQpO1xuK31cbitcbitzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZylcbit7XG4rXHRyZXR1cm4gcmVzdG9yZV9hbmRfdmVyaWZ5X2V2ZW50ZmRfZ2VuZXJpYyhzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4rXHRcdFx0XHRcdFx0IGNvbmZpZy1cdTAwM2Vjb3VudCwgY29uZmlnLVx1MDAzZWZsYWdzLFxuK1x0XHRcdFx0XHRcdCBjb25maWctXHUwMDNldmVyaWZ5X21vZGUsIGNvbmZpZy1cdTAwM2VkZXNjKTtcbit9XG4rXG4rXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzEoaW50IGx1b19mZClcbit7XG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAxXSBTdGFydGluZyBwcmUta2V4ZWMgc2V0dXAgZm9yIG11bHRpLWV2ZW50ZmQgdGVzdC4uLlxcblwiKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDFdIENyZWF0aW5nIHN0YXRlIGZpbGUgZm9yIG5leHQgc3RhZ2UgKDIpLi4uXFxuXCIpO1xuK1x0Y3JlYXRlX3N0YXRlX2ZpbGUobHVvX2ZkLCBTVEFURV9TRVNTSU9OX05BTUUsIFNUQVRFX1RPS0VOLCAyKTtcbitcbitcdC8qIENyZWF0ZSBhbGwgdGVzdCBzZXNzaW9ucyAqL1xuK1x0Zm9yIChzaXplX3QgaSA9IDA7IGkgXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspIHtcbitcdFx0Y29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZyA9IFx1MDAyNnRlc3RfY29uZmlnc1tpXTtcbitcbitcdFx0a3NmdF9wcmludF9tc2coXCJbU1RBR0UgMV0gQ3JlYXRpbmcgc2Vzc2lvbiAnJXMnLi4uXFxuXCIsIGNvbmZpZy1cdTAwM2VzZXNzaW9uX25hbWUpO1xuK1x0XHRpbnQgc2Vzc2lvbl9mZCA9IGNyZWF0ZV9zZXNzaW9uX2NoZWNrZWQobHVvX2ZkLCBjb25maWctXHUwMDNlc2Vzc2lvbl9uYW1lKTtcbitcbitcdFx0LyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovXG4rXHRcdGlmIChjb25maWctXHUwMDNldG9rZW4gPT0gVE9LRU5fTU9ESUZJRUQpIHtcbitcdFx0XHRpbnQgcHJlc2VydmVkX2VmZDtcbitcbitcdFx0XHRpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoc2Vzc2lvbl9mZCxcbitcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZXRva2VuLFxuK1x0XHRcdFx0XHRcdFx0XHRDT1VOVF9NT0RJRklFRCxcbitcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWZsYWdzLFxuK1x0XHRcdFx0XHRcdFx0XHRcIm1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCIsXG4rXHRcdFx0XHRcdFx0XHRcdFx1MDAyNnByZXNlcnZlZF9lZmQpIFx1MDAzYyAwKVxuK1x0XHRcdFx0ZmFpbF9leGl0KFwiY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQgbW9kaWZpZWRcIik7XG4rXG4rXHRcdFx0LyogTm93IG1vZGlmeSB0aGUgcHJlc2VydmVkIGV2ZW50ZmQncyBjb3VudCAqL1xuK1x0XHRcdHVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTtcbitcbitcdFx0XHRpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgXHUwMDI2bW9kaWZ5X3ZhbHVlLFxuK1x0XHRcdCAgICBzaXplb2YobW9kaWZ5X3ZhbHVlKSkgIT0gc2l6ZW9mKG1vZGlmeV92YWx1ZSkpXG4rXHRcdFx0XHRmYWlsX2V4aXQoXCJ3cml0ZSB0byBwcmVzZXJ2ZWQgZXZlbnRmZCBhZnRlciBwcmVzZXJ2ZVwiKTtcbitcbitcdFx0XHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKiBTdGFuZGFyZCBzZXNzaW9uIGNyZWF0aW9uICovXG4rXHRcdFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZChzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4rXHRcdFx0XHRcdFx0XHRjb25maWctXHUwMDNlY291bnQsIGNvbmZpZy1cdTAwM2VmbGFncyxcbitcdFx0XHRcdFx0XHRcdGNvbmZpZy1cdTAwM2VkZXNjKSBcdTAwM2MgMClcbitcdFx0XHRcdGZhaWxfZXhpdChcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZCAlc1wiLCBjb25maWctXHUwMDNlZGVzYyk7XG4rXHRcdH1cbitcdH1cbitcbitcdGNsb3NlKGx1b19mZCk7XG4rXHRkYWVtb25pemVfYW5kX3dhaXQoKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzIoaW50IGx1b19mZCwgaW50IHN0YXRlX3Nlc3Npb25fZmQpXG4re1xuK1x0aW50IHNlc3Npb25fZmRzW05VTV9URVNUX1NFU1NJT05TXTtcbitcdGludCBzdGFnZTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIFN0YXJ0aW5nIHBvc3Qta2V4ZWMgdmVyaWZpY2F0aW9uLi4uXFxuXCIpO1xuK1xuK1x0cmVzdG9yZV9hbmRfcmVhZF9zdGFnZShzdGF0ZV9zZXNzaW9uX2ZkLCBTVEFURV9UT0tFTiwgXHUwMDI2c3RhZ2UpO1xuK1x0aWYgKHN0YWdlICE9IDIpXG4rXHRcdGZhaWxfZXhpdChcIkV4cGVjdGVkIHN0YWdlIDIsIGJ1dCBzdGF0ZSBmaWxlIGNvbnRhaW5zICVkXCIsIHN0YWdlKTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIFJldHJpZXZpbmcgYWxsIHNlc3Npb25zLi4uXFxuXCIpO1xuK1x0Zm9yIChzaXplX3QgaSA9IDA7IGkgXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspXG4rXHRcdHNlc3Npb25fZmRzW2ldID0gcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cXG5cIik7XG4rXHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkrKykge1xuK1x0XHRpZiAodmVyaWZ5X2V2ZW50ZmRfY29uZmlnKHNlc3Npb25fZmRzW2ldLCBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV0pIFx1MDAzYyAwKVxuK1x0XHRcdGZhaWxfZXhpdChcInZlcmlmeSAlcyBldmVudGZkXCIsIHRlc3RfY29uZmlnc1tpXS5kZXNjKTtcbitcdH1cbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cXG5cIik7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAyXSBGaW5hbGl6aW5nIGFsbCBzZXNzaW9ucy4uLlxcblwiKTtcbitcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKVxuK1x0XHRmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKHNlc3Npb25fZmRzW2ldLCB0ZXN0X2NvbmZpZ3NbaV0uc2Vzc2lvbl9uYW1lKTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIEZpbmFsaXppbmcgc3RhdGUgc2Vzc2lvbi4uLlxcblwiKTtcbitcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXHUwMDNjIDApXG4rXHRcdGZhaWxfZXhpdChcImx1b19zZXNzaW9uX2ZpbmlzaCBmb3Igc3RhdGUgc2Vzc2lvblwiKTtcbitcdGNsb3NlKHN0YXRlX3Nlc3Npb25fZmQpO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJcXG4tLS0gRVZFTlRGRF9MVU8gVEVTVCBQQVNTRUQgLS0tXFxuXCIpO1xuK31cbitcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuK3tcbitcdHJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsXG4rXHRcdFx0cnVuX3N0YWdlXzEsIHJ1bl9zdGFnZV8yKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowNzo1Ny42OTY2MDMxMDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NjMzODkyNzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgRXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgc3VwcG9ydCBmb3IgYGV2ZW50ZmRgLiBJdCBsb29rcyBsaWtlIGl0IGFkZHMgYGZzL2V2ZW50ZmRfbHVvLmNgIGFuZCBtb2RpZmllcyBgZnMvZXZlbnRmZC5jYCB0byBleHBvcnQgYSBmZXcgZnVuY3Rpb25zIGFuZCBpbnRyb2R1Y2VzIGEgYENPTkZJR19MSVZFVVBEQVRFX0VWRU5URkRgIGNvbmZpZyBvcHRpb24uXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIklzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqIGFuZCBmdW5jdGlvbmFsP1wiICBJIG5lZWQgdG8gdmVyaWZ5LiBTaW5jZSB0aGUgcHJvbXB0IHRlbGxzIG1lIHRvIHVzZSBteSB0b29scyBhbmQgbm90IHJlbHkgb24gcHJpb3Iga25vd2xlZGdlLCBsZXQncyBkaXZlIGluLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBgZnMvZXZlbnRmZF9sdW8uY2AsIGFuZCB0aGF0J3Mgd2hlcmUgdGhlIGhlYXJ0IG9mIHRoaXMgTFVPIGludGVncmF0aW9uIGxpa2VseSByZXNpZGVzLiBJdCBsb29rcyBsaWtlIHRoaXMgZmlsZSByZWdpc3RlcnMgYSBsaXZlIHVwZGF0ZSBmaWxlIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBldmVudGZkcy4gTm93LCB0aGlzIGBsaXZldXBkYXRlYCBjb25jZXB0IGlzIHN0aWxsIGEgYml0IGhhenksIEkgZG9uJ3QgcmVhZGlseSByZWNhbGwgaXQgZnJvbSBtYWlubGluZSwgc28gaXQgbXVzdCBiZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gdGhpcyBwYXRjaCBvciB0aGlzIGtlcm5lbCB0cmVlLiBCdXQgdGhlIGluc3RydWN0aW9ucyB0ZWxsIG1lIHRvICpsb29rKiBhdCB0aGUgY29kZS5cblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIGNvZGUuIFRoZSBgZnMvZXZlbnRmZF9sdW8uY2AgZmlsZSBkZWZpbmVzIGEgYHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzYCBjYWxsZWQgYGV2ZW50ZmRfbHVvX2ZpbGVfb3BzYCB3aXRoIGZ1bmN0aW9uczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGFuZCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYC4gVGhpcyBwb2ludHMgdG8gdGhlIGNvcmUgb3BlcmF0aW9ucyBmb3IgbGl2ZSB1cGRhdGluZyBhbiBldmVudGZkLiBJdCdzIHVzaW5nIGBldmVudGZkX2x1b19nZXRfc3RhdGVgIGFuZCBgZXZlbnRmZF9jcmVhdGVgLCB3aGljaCBhcmUgZXhwbGljaXRseSBleHBvcnRlZCBmcm9tIGBmcy9ldmVudGZkLmNgLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIExVTyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlc2UgZXhpc3RpbmcgYGV2ZW50ZmRgIGZ1bmN0aW9ucy4gVGltZSB0byBsb29rIGZvciBgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXJgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDY3NCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjA1LjMzMDQ5ODcwOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjI5NTMyNDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V2ZW50ZmRfbHVvLmM9MjM4PXN0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZClcXG5mcy9ldmVudGZkX2x1by5jLTIzOS17XFxuZnMvZXZlbnRmZF9sdW8uYzoyNDA6XFx0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFxcdTAwMjZldmVudGZkX2x1b19oYW5kbGVyKTtcXG5mcy9ldmVudGZkX2x1by5jLTI0MS1cXG4tLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTIzMj1pbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZCk7XFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjMzLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oOjIzNDppbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaCk7XFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjM1LXZvaWQgbGl2ZXVwZGF0ZV91bnJlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTI1ND1zdGF0aWMgaW5saW5lIGludCBsaXZldXBkYXRlX3JlYm9vdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjU4LVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oOjI1OTpzdGF0aWMgaW5saW5lIGludCBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oLTI2MC17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jPTg1NT12b2lkIGx1b19maWxlX3NldF9kZXN0cm95KHN0cnVjdCBsdW9fZmlsZV9zZXQgKmZpbGVfc2V0KVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy04NjItLyoqXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYzo4NjM6ICogbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIgLSBSZWdpc3RlciBhIGZpbGUgaGFuZGxlciB3aXRoIExVTy5cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2NC0gKiBAZmg6IFBvaW50ZXIgdG8gYSBjYWxsZXItYWxsb2NhdGVkIFxcdTAwMjZzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIuXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3My0gKi9cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jOjg3NDppbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaClcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3NS17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTkxNy0gKiBVbnJlZ2lzdGVycyB0aGUgZmlsZSBoYW5kbGVyIGZyb20gdGhlIGxpdmV1cGRhdGUgY29yZS4gVGhpcyBmdW5jdGlvblxcbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6OTE4OiAqIHJldmVyc2VzIHRoZSBvcGVyYXRpb25zIG9mIGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKCkuXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy05MTktICovXFxuLS1cXG5tbS9tZW1mZF9sdW8uYz02MDk9c3RhdGljIGludCBfX2luaXQgbWVtZmRfbHVvX2luaXQodm9pZClcXG5tbS9tZW1mZF9sdW8uYy02MTAte1xcbm1tL21lbWZkX2x1by5jOjYxMTpcXHRpbnQgZXJyID0gbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoXFx1MDAyNm1lbWZkX2x1b19oYW5kbGVyKTtcXG5tbS9tZW1mZF9sdW8uYy02MTItXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjA3Ljk2MDA1MjEzOVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3Njk1MjU0NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFdmVudGZkIExVTyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIHRoaXMgY29kZSBzdWNjZXNzZnVsbHkgaW1wbGVtZW50cyBhIG5ldyBmZWF0dXJlIGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgcGVyc2lzdGluZyBldmVudGZkIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGEga2V4ZWMgcmVib290IHVzaW5nIHRoZSBMaXZlIFVwZGF0ZSBPYmplY3QgKExVTykgZnJhbWV3b3JrLiBNeSBmb2N1cyBpcyBpbW1lZGlhdGVseSBkcmF3biB0byB0aGUgaW50ZWdyYXRpb24gcG9pbnRzLiBUaGUgY29uZmlnLCBgTElWRVVQREFURV9FVkVOVEZEYCwgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCwgZW5hYmxpbmcgdGhpcyBzcGVjaWZpYyBMVU8tYmFzZWQgcHJlc2VydmF0aW9uLiBOb3cgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGlzIHdvcmsuXG5cbk15IGluaXRpYWwgbWVudGFsIGNoZWNrbGlzdCBpbmNsdWRlczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBUaGVzZSBhcmUgdGhlIGtleSBlbnRyeSBwb2ludHMgYW5kIGhhbmRsZXJzIHRoYXQgd2lsbCBkZWZpbmUgdGhlIGxpZmVjeWNsZSBvZiB0aGUgZXZlbnRmZCBzdGF0ZSBkdXJpbmcgdGhlIGtleGVjIHByb2Nlc3MuXG5cblRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJJ2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL2V2ZW50ZmRfbHVvLmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoZXJlIG1pZ2h0IGJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlcmUgdGhhdCBhcmUganVzdCBhcyBjcnVjaWFsIGFzIHRob3NlIGxpc3RlZC4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgc3VycHJpc2VzIG9yIGVkZ2UgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMTU3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjEyLjcyOTU3OTUzOVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTM3NDM2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJec3RhdGljLipldmVudGZkX2x1b1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkX2x1by5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V2ZW50ZmRfbHVvLmMtNzUtXFxuZnMvZXZlbnRmZF9sdW8uYzo3NjpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTc3LXtcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMTA5LVxcbmZzL2V2ZW50ZmRfbHVvLmM6MTEwOnN0YXRpYyBpbnQgZXZlbnRmZF9sdW9fZnJlZXplKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTExMS17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTEzNi1cXG5mcy9ldmVudGZkX2x1by5jOjEzNzpzdGF0aWMgdm9pZCBldmVudGZkX2x1b191bnByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTEzOC17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTE0Ny1cXG5mcy9ldmVudGZkX2x1by5jOjE0ODpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3JldHJpZXZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTE0OS17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTE4OC1cXG5mcy9ldmVudGZkX2x1by5jOjE4OTpzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbmZzL2V2ZW50ZmRfbHVvLmMtMTkwLXtcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjA1LVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjA2OnN0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvZXZlbnRmZF9sdW8uYy0yMDctXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjIyLVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjIzOnN0YXRpYyBjb25zdCBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wcyBldmVudGZkX2x1b19maWxlX29wcyA9IHtcXG5mcy9ldmVudGZkX2x1by5jLTIyNC1cXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjMyLVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjMzOnN0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcXG5mcy9ldmVudGZkX2x1by5jLTIzNC1cXHQub3BzID0gXFx1MDAyNmV2ZW50ZmRfbHVvX2ZpbGVfb3BzLFxcbi0tXFxuZnMvZXZlbnRmZF9sdW8uYy0yMzctXFxuZnMvZXZlbnRmZF9sdW8uYzoyMzg6c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjM5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MTIuNzkwOTU5NzA3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTEzNDE3MDQ4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGb2N1c2luZyBvbiBFdmVudGZkJ3MgUHJlc2VydmF0aW9uIFN0YXRlKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBgZXZlbnRmZGAgbWVjaGFuaXNtLCBzcGVjaWZpY2FsbHkgdGhlIHBhcnQgZGVhbGluZyB3aXRoIFwiTFVPXCIg4oCTIExpa2VseSBVbi1tb2RpZmllZCBPYmplY3QgcHJlc2VydmF0aW9uLCBJJ20gYXNzdW1pbmcuIE15IHByaW1hcnkgZm9jdXMgaXMgcGlucG9pbnRpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGlzIHN0YXRlLiBSaWdodCBub3csIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyB0aGlzIHByZXNlcnZhdGlvbiB3b3JrcyB3aXRoaW4gdGhlIGV2ZW50ZmQgY29udGV4dC5cblxuU28sIEknbSB0aGlua2luZyBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlc2UgZnVuY3Rpb25zIGNsb3NlbHk6IGBldmVudGZkX2x1b19wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19mcmVlemVgLCBgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19yZXRyaWV2ZWAsIGBldmVudGZkX2x1b19maW5pc2hgLCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYC4gVGhpcyBsYXN0IG9uZSBpcyBrZXkgdG8gZGV0ZXJtaW5pbmcgdGhlICpjdXJyZW50KiBzdGF0ZSBvZiBwcmVzZXJ2YXRpb24uIEl0J2xsIHNob3cgbWUgaWYgaXQncyBwcmVzZXJ2ZWQsIGZyb3plbiwgb3Igd2hhdGV2ZXIgZWxzZSBpcyBnb2luZyBvbi4gQW5kLCBsZXQncyBub3QgZm9yZ2V0IHRoZSBjb3JlIGNyZWF0aW9uIGZ1bmN0aW9uIGBldmVudGZkX2NyZWF0ZWAuIEknbGwgbmVlZCB0byBrbm93IGhvdyB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgcHJlc2VydmF0aW9uIGZsYWdzIGFyZSBoYW5kbGVkIGR1cmluZyBjcmVhdGlvbi5cblxuTXkgaW1tZWRpYXRlIG5leHQgc3RlcCBpcyB0byBoZWFkIG92ZXIgdG8gYGZzL2V2ZW50ZmQuY2AuIFRoZSBzb3VyY2UgZm9yIGBldmVudGZkX2x1b19nZXRfc3RhdGVgIGFuZCBgZXZlbnRmZF9jcmVhdGVgIHNob3VsZCBwcm92aWRlIHRoZSBiZXN0IGluc2lnaHRzLiBJ4oCZbGwgc3RhcnQgdGhlcmUgYW5kIHRoZW4gdHJhY2UgdGhlIGZsb3cgZnJvbSB0aGVyZS4gVGhhdCdzIHRoZSBiZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiB0aGlzIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyNzcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MTcuOTI1MTMzMDg1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU4NjY1NDQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXZlbnRmZC5jPTM3Nz1FWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2N0eF9maWxlZ2V0KTtcXG4tLVxcbmZzL2V2ZW50ZmQuYy0zNzktLyoqXFxuZnMvZXZlbnRmZC5jOjM4MDogKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPXFxuZnMvZXZlbnRmZC5jLTM4MS0gKiBAZmlsZTogRXZlbnRmZCBmaWxlXFxuLS1cXG5mcy9ldmVudGZkLmMtMzkxLSAqL1xcbmZzL2V2ZW50ZmQuYzozOTI6aW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKVxcbmZzL2V2ZW50ZmQuYy0zOTMte1xcbi0tXFxuZnMvZXZlbnRmZC5jLTQxMC19XFxuZnMvZXZlbnRmZC5jOjQxMTpFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xcbmZzL2V2ZW50ZmQuYy00MTItXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjE3Ljk4MzgwNDg1M1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjQ0MjIxNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHByb21wdCwgYW5kIG15IHJlc3BvbnNlOlxuXG4qKlRoaW5raW5nIEFib3V0IGBldmVudGZkX2NyZWF0ZWAqKlxuXG5SaWdodCwgc28gd2UncmUgdGFsa2luZyBhYm91dCBgZXZlbnRmZF9jcmVhdGVgIGhlcmUuIEltbWVkaWF0ZWx5LCBteSBtaW5kIGp1bXBzIHRvIHRoZSBjb3JlIG9mIHRoaXMgc3lzdGVtIGNhbGw6IGNyZWF0aW5nIGFuIGV2ZW50IGZpbGUgZGVzY3JpcHRvciwgYSAqc2lnbmFsbGluZyogbWVjaGFuaXNtLiBJdCdzIGVzc2VudGlhbGx5IGEgbGlnaHR3ZWlnaHQsIGtlcm5lbC1tYW5hZ2VkIGNvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduYWwgZXZlbnRzIGJldHdlZW4gcHJvY2Vzc2VzIG9yIHRocmVhZHMuIE5vIG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwaXBlcyBvciBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGluIHNpbXBsZSBzY2VuYXJpb3MsIHRoaXMgaXMgbXVjaCBjbGVhbmVyLiBJIGFwcHJlY2lhdGUgaXRzIHNpbXBsaWNpdHkgZm9yIElQQy5cblxuVGhpbmtpbmcgZGVlcGVyLCBJJ20gY29uc2lkZXJpbmcgdGhlIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMuIFRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgdGhlIG1vc3Qgb2J2aW91cy4gWW91J3ZlIGdvdCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gYW4gZXZlbnQsIGFub3RoZXIgc2lnbmFsaW5nIGl0LiBFYXN5LiBCdXQgaXQncyBhbHNvIHVzZWZ1bCBmb3Igbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MsIHNheSwgd2hlbiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4gVGhlIHdob2xlIGNvdW50ZXItYmFzZWQgbmF0dXJlIG1ha2VzIGl0IGZsZXhpYmxlLlxuXG5Ob3csIHdoYXQgYWJvdXQgdGhlIGZsYWdzPyBgRUZEX1NFTUFQSE9SRWAgdnMuIHRoZSBkZWZhdWx0LiBUaGF0IGxpdHRsZSBiaXQgZmxpcCBjaGFuZ2VzIHRoaW5ncy4gVXNpbmcgYEVGRF9TRU1BUEhPUkVgIG1lYW5zIHRoYXQgdGhlIHJlYWQgb3BlcmF0aW9uIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgZGVjcmVtZW50cyB0aGUgY291bnRlciBieSBvbmUsIG9ubHkgc2lnbmFsaW5nIGFuIGV2ZW50IHdoZW4gaXQgZ29lcyBmcm9tIHplcm8gdG8gYSBwb3NpdGl2ZSB2YWx1ZS4gV2l0aG91dCB0aGF0LCBpdCdzIGp1c3QgYSByYXcgY291bnRlciwgYW5kIHJlYWQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmVzZXRzIHRoZSBjb3VudGVyIHRvIHplcm8uXG5cblRoZSBwb3NzaWJpbGl0aWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcyBhcmUgaW50ZXJlc3RpbmcuIEknbSBpbWFnaW5pbmcgaG93IEknZCBpbnRlZ3JhdGUgdGhpcyBpbiwgc2F5LCBhIGN1c3RvbS1idWlsdCBldmVudCBsb29wLCBvciBldmVuIGluIGEgbG9jayBpbXBsZW1lbnRhdGlvbi4gSSBjYW4gaW1tZWRpYXRlbHkgc2VlIHRoZSB1c2UgaW4gYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGNvbnRleHQsIGFuZCBob3cgaXQgY2FuIGJlIHBhaXJlZCB3aXRoIG90aGVyIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGxpa2UgbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyB0byBvcHRpbWl6ZSBjZXJ0YWluIG9wZXJhdGlvbnMuIFRoaXMgaXMgYSB2ZXJ5IGhhbmR5IHRvb2wgZm9yIGJ1aWxkaW5nIHJvYnVzdCwgZWZmaWNpZW50IGNvbmN1cnJlbnQgYXBwbGljYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk3OCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MjMuMDA4MjI5MjAzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzQ2OTkyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldmVudGZkX2NyZWF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXZlbnRmZC5jPTQxMz1zdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9ldmVudGZkLmMtNDQ3LVxcbmZzL2V2ZW50ZmQuYzo0NDg6aW50IGV2ZW50ZmRfY3JlYXRlKF9fdTY0IGNvdW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuZnMvZXZlbnRmZC5jLTQ0OS17XFxuLS1cXG5mcy9ldmVudGZkLmMtNDUxLX1cXG5mcy9ldmVudGZkLmM6NDUyOkVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcXG5mcy9ldmVudGZkLmMtNDUzLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyMy4wNzE3MDgxMjJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA0NDcwNDY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6XG5cbioqRXhhbWluaW5nIEtlcm5lbCBMaXZlIFVwZGF0ZSBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ3ZlIGdvdCBhIHNpdHVhdGlvbiB3aGVyZSBJIG5lZWQgdG8gdmVyaWZ5IGEgY29uZmlndXJhdGlvbiwgYW5kIG15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggbGl2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eS4gSSBzZWUgdGhyZWUgcG90ZW50aWFsIGNvbmZpZ3MgZmxhZ2dlZDogYExJVkVVUERBVEVfRVZFTlRGRGAsIGBFVkVOVEZEYCwgYW5kIHRoZSBtb3JlIGdlbmVyYWwgYExJVkVVUERBVEVgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IGBMSVZFVVBEQVRFYCBtaWdodCBiZSB0aGUgb3ZlcmFyY2hpbmcgb25lLCBidXQgbGV0J3Mgbm90IG1ha2UgYXNzdW1wdGlvbnMuXG5cblRoZSBsb2dpY2FsIG5leHQgc3RlcCBpcyB0byBkcmlsbCBkb3duIGludG8gdGhlIEtjb25maWcgZmlsZSBmb3IgdGhlIGxpdmUgdXBkYXRlIHN1YnN5c3RlbS4gSSBuZWVkIHRvIG9wZW4gdXAgYGtlcm5lbC9saXZldXBkYXRlL0tjb25maWdgIHRvIGNvbmZpcm0gaWYgYExJVkVVUERBVEVgICppcyogdGhlIHRvcC1sZXZlbCBvcHRpb24sIG9yIGlmIGl0J3MgZGVwZW5kZW50IG9uIG9uZSBvciBib3RoIG9mIHRoZSBgRVZFTlRGRGAgY29uZmlncy4gVGhpcyBpcyBhIHByZXR0eSBzdGFuZGFyZCBkZWJ1Z2dpbmcgcHJvY2VzczsgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIHRoZW0uIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1MjEsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyNy4xMTY0MTQ1MTFaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMDI0NTI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBMSVZFVVBEQVRFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9saXZldXBkYXRlL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZz0zOD1jb25maWcgS0VYRUNfSEFORE9WRVJfRU5BQkxFX0RFRkFVTFRcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTEtXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo1Mjpjb25maWcgTElWRVVQREFURVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTMtXFx0Ym9vbCBcXFwiTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yXFxcIlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjczOmNvbmZpZyBMSVZFVVBEQVRFX01FTUZEXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03NC1cXHRib29sIFxcXCJMaXZlIHVwZGF0ZSBzdXBwb3J0IGZvciBtZW1mZFxcXCJcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctODgtXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo4OTpjb25maWcgTElWRVVQREFURV9FVkVOVEZEXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy05MC1cXHRib29sIFxcXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyNy4xNzg0NDc2MzlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzU2ODc5MjgwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBDb25maWd1cmF0aW9uIEZvY3VzKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCBgTElWRVVQREFURWAgYW5kIGBMSVZFVVBEQVRFX0VWRU5URkRgIGFyZSBkZWZpbml0ZWx5IHRoZSByaWdodCBmbGFncyB0byBiZSBsb29raW5nIGF0LCBhbmQgb2YgY291cnNlLCBgRVZFTlRGRGAgaXRzZWxmIGlzIGEgbmVjZXNzYXJ5IGNvbXBvbmVudC4gVGhhdCBjbGFyaWZpZXMgdGhlIGNvcmUgc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEkgbmVlZCB0byBhZGRyZXNzOiBgTElWRVVQREFURWAsIGBMSVZFVVBEQVRFX0VWRU5URkRgLCBhbmQgYEVWRU5URkRgLlxuXG5Ob3csIEkgbmVlZCB0byBkcmlsbCBkb3duIG9uIHRoZSBrZXkgZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpdmUgdXBkYXRlIHByb2Nlc3MuIE15IGF0dGVudGlvbiBuZWVkcyB0byBiZSBzcXVhcmVseSBvbjogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGVzZSBhcmUgaW50ZXJhY3Rpbmcgd2l0aGluIHRoZSBvdmVyYWxsIGZyYW1ld29yay5cblxuTGV0J3MgY2FsbCBzZXQtcmVzdWx0cyBhbmQga2VlcCB0aGlzIG1vdmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ5OTgsIk91dHB1dFRva2VucyI6MTc4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjM0Ljc0NzI0MzY2M1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkyODI4NTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTElWRVVQREFURVwiLFxuICAgIFwiTElWRVVQREFURV9FVkVOVEZEXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXZlbnRmZF9sdW9fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2ZyZWV6ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fcmV0cmlldmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2ZpbmlzaFwiLFxuICAgIFwiZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19nZXRfc3RhdGVcIixcbiAgICBcImV2ZW50ZmRfY3JlYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgc3VwcG9ydCBmb3IgZXZlbnRmZCwgYWxsb3dpbmcgZXZlbnRmZCBzdGF0ZSB0byBiZSBwcmVzZXJ2ZWQgYWNyb3NzIGtleGVjLiBUaGlzIGludHJvZHVjZXMgbmV3IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgZm9yIHByZXNlcnZpbmcgYW5kIHJlc3RvcmluZyBldmVudGZkIHN0YXRlLCB3aGljaCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[0].run-triage(0) Phase: Succeeded StartedAt: 2026-06-25 05:55:29 +0000 UTC FinishedAt: 2026-06-25 06:08:36 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "840ef6c78e6a2f694b578ecb9063241c992aaa9e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "LIVEUPDATE", "LIVEUPDATE_EVENTFD", "EVENTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "840ef6c78e6a2f694b578ecb9063241c992aaa9e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "LIVEUPDATE", "LIVEUPDATE_EVENTFD", "EVENTFD" ], "series_id": "f3834abc-6aa9-43fe-85bd-63cc8ac29ef7" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "eventfd_luo_preserve", "eventfd_luo_freeze", "eventfd_luo_unpreserve", "eventfd_luo_retrieve", "eventfd_luo_finish", "eventfd_luo_can_preserve", "eventfd_luo_get_state", "eventfd_create" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0xJVkVVUERBVEUmIzM0OywKICAgICYjMzQ7TElWRVVQREFURV9FVkVOVEZEJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtldmVudGZkX2x1b19wcmVzZXJ2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19mcmVlemUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19yZXRyaWV2ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19maW5pc2gmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2dldF9zdGF0ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2NyZWF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjUgMDY6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyMjFhZmQzMzk4ODc1ZWIxNGQ5YjdkN2QyYTAxOWM0MWJlOTRjOTBiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdW4gMjUgMDY6MDc6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxuaW5kZXggODlhOGE5ZDIwN2QxYzUuLjM2ZDU2OGU2Y2ZjNzNlIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL01ha2VmaWxlXG5AQCAtMjcsNiAmIzQzOzI3LDcgQEAgb2JqLXlcdFx0XHRcdCYjNDM7PSBhbm9uX2lub2Rlcy5vXG4gb2JqLSQoQ09ORklHX1NJR05BTEZEKVx0XHQmIzQzOz0gc2lnbmFsZmQub1xuIG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQmIzQzOz0gdGltZXJmZC5vXG4gb2JqLSQoQ09ORklHX0VWRU5URkQpXHRcdCYjNDM7PSBldmVudGZkLm9cbiYjNDM7b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkmIzQzOz0gZXZlbnRmZF9sdW8ub1xuIG9iai0kKENPTkZJR19BSU8pICAgICAgICAgICAgICAgJiM0Mzs9IGFpby5vXG4gb2JqLSQoQ09ORklHX0ZTX0RBWClcdFx0JiM0Mzs9IGRheC5vXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXHQmIzQzOz0gY3J5cHRvL1xuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmQuYyBiL2ZzL2V2ZW50ZmQuY1xuaW5kZXggOWQzM2EwMjc1N2Q1MmIuLjliNzZjZjA2MTM1YTg2IDEwMDY0NFxuLS0tIGEvZnMvZXZlbnRmZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkLmNcbkBAIC0zNzYsNiAmIzQzOzM3Niw0MCBAQCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmRfY3R4X2ZpbGVnZXQoc3RydWN0IGZpbGUgKmZpbGUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xuIFxuJiM0MzsvKipcbiYjNDM7ICogZXZlbnRmZF9sdW9fZ2V0X3N0YXRlIC0gR2V0IGV2ZW50ZmQgc3RhdGUgKGNvdW50IGFuZCBmbGFncykgZm9yIExVT1xuJiM0MzsgKiBAZmlsZTogRXZlbnRmZCBmaWxlXG4mIzQzOyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWVcbiYjNDM7ICogQGZsYWdzOiBPdXRwdXQgcGFyYW1ldGVyIGZvciBmbGFncyB2YWx1ZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuXG4mIzQzOyAqIFNpbmNlIHN0cnVjdCBldmVudGZkX2N0eCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSwgd2UgY2FuIGFjY2VzcyBpdHNcbiYjNDM7ICogbWVtYmVycyBkaXJlY3RseSBoZXJlLiBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgd2FpdCBxdWV1ZSBsb2NrIHRvIGVuc3VyZVxuJiM0MzsgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7aW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7XG4mIzQzO1xuJiM0MztcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4mIzQzO1x0aWYgKElTX0VSUihjdHgpKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIoY3R4KTtcbiYjNDM7XG4mIzQzO1x0LyogUmVhZCBjb3VudCB3aXRoIGxvY2sgKGZsYWdzIGRvbiYjMzk7dCBuZWVkIGxvY2spICovXG4mIzQzO1x0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2Y3R4LVx1MDAzZXdxaC5sb2NrLCBpcnFfZmxhZ3MpO1xuJiM0MztcdCpjb3VudCA9IGN0eC1cdTAwM2Vjb3VudDtcbiYjNDM7XHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNmN0eC1cdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0KmZsYWdzID0gY3R4LVx1MDAzZWZsYWdzO1xuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuJiM0MztcbiBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHggX19mcmVlKGtmcmVlKSA9IE5VTEw7XG5AQCAtNDExLDYgJiM0Mzs0NDUsMTIgQEAgc3RhdGljIGludCBkb19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCwgaW50IGZsYWdzKVxuIFx0cmV0dXJuIGZkX3B1Ymxpc2goZmRmKTtcbiB9XG4gXG4mIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2NyZWF0ZSk7XG4mIzQzO1xuIFNZU0NBTExfREVGSU5FMihldmVudGZkMiwgdW5zaWduZWQgaW50LCBjb3VudCwgaW50LCBmbGFncylcbiB7XG4gXHRyZXR1cm4gZG9fZXZlbnRmZChjb3VudCwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmRfbHVvLmMgYi9mcy9ldmVudGZkX2x1by5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjc4MWQ5MDYzNWM1MmFlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkX2x1by5jXG5AQCAtMCwwICYjNDM7MSwyNTAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuIFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXHUwMDNlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIERPQzogRXZlbnRmZCBQcmVzZXJ2YXRpb24gdmlhIExVT1xuJiM0MzsgKlxuJiM0MzsgKiBPdmVydmlld1xuJiM0MzsgKiA9PT09PT09PVxuJiM0MzsgKlxuJiM0MzsgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZVxuJiM0MzsgKiBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIGZpbGUgcHJlc2VydmF0aW9uLiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgYXBwbGljYXRpb25zXG4mIzQzOyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXG4mIzQzOyAqIHVwZGF0ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcbiYjNDM7ICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC5cbiYjNDM7ICogVGhlIHByZXNlcnZhdGlvbiBlbnN1cmVzIHRoYXQgcGVuZGluZyBldmVudHMgYW5kIGNvbmZpZ3VyYXRpb24gYXJlIG5vdCBsb3N0XG4mIzQzOyAqIGR1cmluZyBrZXhlYy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHByZXNlcnZhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdHJhbnNwYXJlbnQuIE9ubHkgc2VsZWN0IHByb3BlcnRpZXMgb2ZcbiYjNDM7ICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxuJiM0MzsgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuXG4mIzQzOyAqXG4mIzQzOyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXG4mIzQzOyAqID09PT09PT09PT09PT09PT09PT09XG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcbiYjNDM7ICpcbiYjNDM7ICogQ291bnRlciBWYWx1ZVxuJiM0MzsgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xuJiM0MzsgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLlxuJiM0MzsgKlxuJiM0MzsgKiBGaWxlIEZsYWdzXG4mIzQzOyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLlxuJiM0MzsgKiAgIFRoZXNlIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBhbmQgZmlsZSBkZXNjcmlwdG9yXG4mIzQzOyAqICAgaW5oZXJpdGFuY2UuXG4mIzQzOyAqXG4mIzQzOyAqIE5vbi1QcmVzZXJ2ZWQgUHJvcGVydGllc1xuJiM0MzsgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7ICpcbiYjNDM7ICogQWxsIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcmVzZXJ2ZWQgbXVzdCBiZSBhc3N1bWVkIHRvIGJlIHJlc2V0IHRvXG4mIzQzOyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXG4mIzQzOyAqIG5vdGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcbiYjNDM7ICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlXG4mIzQzOyAqICAgZXZlbnRmZCB3aWxsIGJlIGFzc2lnbmVkIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBudW1iZXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBXYWl0IFF1ZXVlIFN0YXRlXG4mIzQzOyAqICAgQW55IHByb2Nlc3NlcyBjdXJyZW50bHkgYmxvY2tlZCBvbiByZWFkKCkgb3BlcmF0aW9ucyB3aWxsIGJlIHdva2VuIHVwIGFuZFxuJiM0MzsgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEZpbGUgUG9zaXRpb25cbiYjNDM7ICogICBFdmVudGZkIGZpbGVzIGRvbiYjMzk7dCBoYXZlIGEgdHJhZGl0aW9uYWwgZmlsZSBwb3NpdGlvbiwgYnV0IGFueSBpbnRlcm5hbFxuJiM0MzsgKiAgIHN0YXRlIHJlbGF0ZWQgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBpcyByZXNldC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXhlY19oYW5kb3Zlci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpdmV1cGRhdGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYW5vbl9pbm9kZXMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pZHIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tyZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9mZHRhYmxlLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuJiM0MztcdHU2NCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIEdldCBldmVudGZkIHN0YXRlIHNhZmVseSAqL1xuJiM0MztcdGVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLVx1MDAzZWZpbGUsIFx1MDAyNmNvdW50LCBcdTAwMjZmbGFncyk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBnZXQgZXZlbnRmZCBzdGF0ZTogJWRcXG5cJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7XG4mIzQzO1x0aWYgKElTX0VSUihzZXIpKSB7XG4mIzQzO1x0XHRlcnIgPSBQVFJfRVJSKHNlcik7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIHByZXNlcnZlIG1lbW9yeTogJWRcXG5cJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXG4mIzQzO1x0c2VyLVx1MDAzZWNvdW50ID0gY291bnQ7XG4mIzQzO1x0c2VyLVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4mIzQzO1xuJiM0MztcdHByX2RlYnVnKFwmIzM0O1ByZXNlcnZlZCBldmVudGZkOiBjb3VudD0lbGx1LCBmbGFncz0weCV4XFxuXCYjMzQ7LFxuJiM0MztcdFx0c2VyLVx1MDAzZWNvdW50LCBzZXItXHUwMDNlZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKiBSZXR1cm4gcGh5c2ljYWwgYWRkcmVzcyBvZiBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZSAqL1xuJiM0MztcdGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhID0gdmlydF90b19waHlzKHNlcik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX2ZyZWV6ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4mIzQzO1x0dTY0IGNvdW50O1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XG4mIzQzO1x0LyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovXG4mIzQzO1x0ZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtXHUwMDNlZmlsZSwgXHUwMDI2Y291bnQsIFx1MDAyNmZsYWdzKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlci1cdTAwM2Vjb3VudCAhPSBjb3VudCkge1xuJiM0MztcdFx0cHJfZGVidWcoXCYjMzQ7V0FSTklORzogQ291bnQgY2hhbmdlZCBkdXJpbmcgcHJlc2VydmUtXHUwMDNlZnJlZXplISBvbGQ9JWxsdSwgbmV3PSVsbHVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCBzZXItXHUwMDNlY291bnQsIGNvdW50KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNlci1cdTAwM2Vjb3VudCA9IGNvdW50O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XHRraG9fdW5wcmVzZXJ2ZV9mcmVlKHNlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcmV0cmlldmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqY3R4O1xuJiM0MztcdHN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDtcbiYjNDM7XHRpbnQgZXZlbnRmZDtcbiYjNDM7XG4mIzQzO1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbiYjNDM7XHRpZiAoIXNlcilcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBDcmVhdGUgYSBuZXcgZXZlbnRmZCB3aXRoIHRoZSBwcmVzZXJ2ZWQgY291bnQgYW5kIGZsYWdzICovXG4mIzQzO1x0ZXZlbnRmZCA9IGV2ZW50ZmRfY3JlYXRlKHNlci1cdTAwM2Vjb3VudCwgc2VyLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRpZiAoZXZlbnRmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBjcmVhdGUgZXZlbnRmZDogJWRcXG5cJiMzNDssIGV2ZW50ZmQpO1xuJiM0MztcdFx0cmV0dXJuIGV2ZW50ZmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmaWxlID0gZmdldChldmVudGZkKTtcbiYjNDM7XHRpZiAoIWZpbGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gZ2V0IGZpbGUgZnJvbSBmZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZV9mZChldmVudGZkKTtcbiYjNDM7XHRcdHJldHVybiAtRUJBREY7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjbG9zZV9mZChldmVudGZkKTtcbiYjNDM7XG4mIzQzO1x0LyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi9cbiYjNDM7XHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuJiM0MztcdGlmIChJU19FUlIoY3R4KSkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O0ZhaWxlZCB0byBnZXQgY29udGV4dCBmcm9tIGZpbGVcXG5cJiMzNDspO1xuJiM0MztcdFx0ZnB1dChmaWxlKTtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XG4mIzQzO1x0YXJncy1cdTAwM2VmaWxlID0gZmlsZTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fZmluaXNoKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcbiYjNDM7XG4mIzQzO1x0aWYgKGFyZ3MtXHUwMDNlcmV0cmlldmVfc3RhdHVzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xuJiM0MztcdGlmICghc2VyKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRraG9fcmVzdG9yZV9mcmVlKHNlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqY3R4O1xuJiM0MztcbiYjNDM7XHRpZiAoIWZpbGUtXHUwMDNlZl9vcClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IHRvIGdldCBldmVudGZkIGNvbnRleHQgLSB0aGlzIHdpbGwgZmFpbCBpZiBub3QgYW4gZXZlbnRmZCAqL1xuJiM0MztcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4mIzQzO1x0aWYgKElTX0VSUihjdHgpKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xuJiM0MztcdC5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3ByZXNlcnZlLFxuJiM0MztcdC51bnByZXNlcnZlID0gZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSxcbiYjNDM7XHQuZnJlZXplID0gZXZlbnRmZF9sdW9fZnJlZXplLFxuJiM0MztcdC5yZXRyaWV2ZSA9IGV2ZW50ZmRfbHVvX3JldHJpZXZlLFxuJiM0MztcdC5maW5pc2ggPSBldmVudGZkX2x1b19maW5pc2gsXG4mIzQzO1x0LmNhbl9wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZSxcbiYjNDM7XHQub3duZXIgPSBUSElTX01PRFVMRSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcbiYjNDM7XHQub3BzID0gXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXG4mIzQzO1x0LmNvbXBhdGlibGUgPSBFVkVOVEZEX0xVT19GSF9DT01QQVRJQkxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xuJiM0MztcbiYjNDM7XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVPUE5PVFNVUFApIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIEVSUl9QVFIoZXJyKSk7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7bGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXG5pbmRleCBlMzJiZWU0MzQ1ZmI5Zi4uNzAzZTFhMTI2YzRkNDAgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmhcbkBAIC0zNSw2ICYjNDM7MzUsOCBAQCB2b2lkIGV2ZW50ZmRfY3R4X3B1dChzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCk7XG4gc3RydWN0IGZpbGUgKmV2ZW50ZmRfZmdldChpbnQgZmQpO1xuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmRnZXQoaW50IGZkKTtcbiBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmRfY3R4X2ZpbGVnZXQoc3RydWN0IGZpbGUgKmZpbGUpO1xuJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpO1xuJiM0MztpbnQgZXZlbnRmZF9jcmVhdGUoX191NjQgY291bnQsIHVuc2lnbmVkIGludCBmbGFncyk7XG4gdm9pZCBldmVudGZkX3NpZ25hbF9tYXNrKHN0cnVjdCBldmVudGZkX2N0eCAqY3R4LCBfX3BvbGxfdCBtYXNrKTtcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcbiBcdFx0XHRcdCAgX191NjQgKmNudCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTQ4YmVhYzZiY2M3NjBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbkBAIC0wLDAgJiM0MzsxLDM5IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXG4mIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcdTAwM2NkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jblx1MDAzZVxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4mIzQzOyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFdmVudGZkIExpdmUgVXBkYXRlIEFCSVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBBQkkgZm9yIHByZXNlcnZpbmcgZXZlbnRmZCBzdGF0ZSBhY3Jvc3Mga2V4ZWMuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYFxuJiM0MzsgKiB3aGljaCBpcyBoYW5kZWQgb3ZlciB0byB0aGUgbmV4dCBrZXJuZWwgdmlhIHRoZSBLSE8gbWVjaGFuaXNtLlxuJiM0MzsgKlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkXG4mIzQzOyAqIEBjb3VudDogVGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZVxuJiM0MzsgKiBAZmxhZ3M6IEZpbGUgZmxhZ3MgKEVGRF9TRU1BUEhPUkUsIEVGRF9DTE9FWEVDLCBFRkRfTk9OQkxPQ0spXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBtaW5pbWFsIHN0YXRlIG5lZWRlZCB0byByZXN0b3JlIGFuIGV2ZW50ZmRcbiYjNDM7ICogYWZ0ZXIga2V4ZWMuIFRoZSBjb3VudCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBldmVudCBjb3VudGVyLFxuJiM0MzsgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IGV2ZW50ZmRfbHVvX3NlciB7XG4mIzQzO1x0X191NjQgY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgaW50ICBmbGFncztcbiYjNDM7fSBfX3BhY2tlZDtcbiYjNDM7XG4mIzQzOy8qIFRoZSBjb21wYXRpYmlsaXR5IHN0cmluZyBmb3IgZXZlbnRmZCBmaWxlIGhhbmRsZXIgKi9cbiYjNDM7I2RlZmluZSBFVkVOVEZEX0xVT19GSF9DT01QQVRJQkxFXHRcJiMzNDtldmVudGZkLXYxXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbkBAIC04Niw0ICYjNDM7ODYsMjAgQEAgY29uZmlnIExJVkVVUERBVEVfTUVNRkRcbiBcbiBcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiBcbiYjNDM7Y29uZmlnIExJVkVVUERBVEVfRVZFTlRGRFxuJiM0MztcdGJvb2wgXCYjMzQ7RXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydFwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gRVZFTlRGRFxuJiM0MztcdGRlcGVuZHMgb24gTElWRVVQREFURVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIEVuYWJsZSBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydCBmb3IgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3JzLlxuJiM0MztcdCAgVGhpcyBhbGxvd3MgZXZlbnRmZCBmaWxlcyB0byBiZSBwcmVzZXJ2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBrZXhlY1xuJiM0MztcdCAgb3BlcmF0aW9ucywgbWFpbnRhaW5pbmcgdGhlaXIgY291bnRlciB2YWx1ZXMgYW5kIGZsYWdzLlxuJiM0MztcbiYjNDM7XHQgIEV2ZW50ZmQgZmlsZXMgYXJlIGNvbW1vbmx5IHVzZWQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiBiZXR3ZWVuXG4mIzQzO1x0ICB1c2Vyc3BhY2UgcHJvY2Vzc2VzIG9yIGJldHdlZW4gdXNlcnNwYWNlIGFuZCBrZXJuZWwuIFdpdGggdGhpc1xuJiM0MztcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxuJiM0MztcdCAgZHVyaW5nIGxpdmUgdXBkYXRlIG9wZXJhdGlvbnMuXG4mIzQzO1xuJiM0MztcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiYjNDM7XG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG5pbmRleCAzMDY4OWQyMmNiMDIxNi4uZTA5MmUzOGZhNmY2YzQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXG5AQCAtOCw2ICYjNDM7OCw3IEBAIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fa2V4ZWNfc2ltcGxlXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgJiM0Mzs9IGx1b19tdWx0aV9zZXNzaW9uXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgJiM0Mzs9IGx1b19zdHJlc3Nfc2Vzc2lvbnNcbiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3N0cmVzc19maWxlc1xuJiM0MztURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3Rlc3RfZXZlbnRmZFxuIFxuIFRFU1RfRklMRVMgJiM0Mzs9IGRvX2tleGVjLnNoXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZ1xuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXG5AQCAtOSwzICYjNDM7OSw1IEBAIENPTkZJR19MSVZFVVBEQVRFX1RFU1Q9eVxuIENPTkZJR19NRU1GRF9DUkVBVEU9eVxuIENPTkZJR19UTVBGUz15XG4gQ09ORklHX1NITUVNPXlcbiYjNDM7Q09ORklHX0VWRU5URkQ9eVxuJiM0MztDT05GSUdfTElWRVVQREFURV9FVkVOVEZEPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjk0ZWYzYmM2NmFkOTcxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuY1xuQEAgLTAsMCAmIzQzOzEsMzc2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuIFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXHUwMDNlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cbiYjNDM7ICpcbiYjNDM7ICogTW9kZWxlZCBhZnRlciBsdW9fbXVsdGlfc2Vzc2lvbi5jLlxuJiM0MzsgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxuJiM0MzsgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvZXZlbnRmZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtsdW9fdGVzdF91dGlscy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBTZXNzaW9uIG5hbWVzICovXG4mIzQzOyNkZWZpbmUgU0VTU0lPTl9FTVBUWSAgICAgXCYjMzQ7ZXZlbnRmZC1lbXB0eVwmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fREVGQVVMVCAgIFwmIzM0O2V2ZW50ZmQtZGVmYXVsdFwmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fU0VNICAgICAgIFwmIzM0O2V2ZW50ZmQtc2VtXCYjMzQ7XG4mIzQzOyNkZWZpbmUgU0VTU0lPTl9OT05CTE9DSyAgXCYjMzQ7ZXZlbnRmZC1ub25ibG9ja1wmIzM0O1xuJiM0MzsjZGVmaW5lIFNFU1NJT05fTEFSR0UgICAgIFwmIzM0O2V2ZW50ZmQtbGFyZ2VcJiMzNDtcbiYjNDM7I2RlZmluZSBTRVNTSU9OX01PRElGSUVEICBcJiMzNDtldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBUb2tlbnMgKi9cbiYjNDM7I2RlZmluZSBUT0tFTl9ERUZBVUxUICAgICAgIDB4Q0FGRUJBQkVcbiYjNDM7I2RlZmluZSBUT0tFTl9TRU0gICAgICAgICAgIDB4REVBREJFRUZcbiYjNDM7I2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUZcbiYjNDM7I2RlZmluZSBUT0tFTl9MQVJHRSAgICAgICAgIDB4QkVFRkNBRkVcbiYjNDM7I2RlZmluZSBUT0tFTl9NT0RJRklFRCAgICAgIDB4QUJDRDEyMzRcbiYjNDM7XG4mIzQzOy8qIENvdW50cyAqL1xuJiM0MzsjZGVmaW5lIENPVU5UX0lOSVRJQUwgICA0MlxuJiM0MzsjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMFxuJiM0MzsjZGVmaW5lIENPVU5UX0VYUEVDVEVEICAoQ09VTlRfSU5JVElBTCAmIzQzOyBDT1VOVF9XUklURSkgLyogNTIgKi9cbiYjNDM7I2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxuJiM0MzsjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDBcbiYjNDM7I2RlZmluZSBDT1VOVF9MQVJHRSAgICAgKCh1bnNpZ25lZCBpbnQpLTEpIC8qIFVJTlRfTUFYICovXG4mIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XG4mIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OVxuJiM0MztcbiYjNDM7LyogU3RhdGUgdHJhY2tpbmcgKi9cbiYjNDM7I2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgXCYjMzQ7ZXZlbnRmZF9tdWx0aV9zdGF0ZVwmIzM0O1xuJiM0MzsjZGVmaW5lIFNUQVRFX1RPS0VOICAgICAgICA5OTdcbiYjNDM7XG4mIzQzOy8qIEV2ZW50ZmQgdmVyaWZpY2F0aW9uIG1vZGVzICovXG4mIzQzO2VudW0gdmVyaWZ5X21vZGUge1xuJiM0MztcdFZFUklGWV9GTEFHUywgICAgICAgIC8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovXG4mIzQzO1x0VkVSSUZZX09OQ0UsICAgICAgICAgLyogUmVhZCBvbmNlIGFuZCB2ZXJpZnkgY291bnQgKi9cbiYjNDM7XHRWRVJJRllfU0VNQVBIT1JFLCAgICAvKiBSZWFkIG11bHRpcGxlIHRpbWVzLCB2ZXJpZnkgcmV0dXJucyAxIGVhY2ggdGltZSAqL1xuJiM0MztcdFZFUklGWV9OT05CTE9DSywgICAgIC8qIFJlYWQgb25jZSBpbiBub25ibG9jayBtb2RlICovXG4mIzQzO1x0VkVSSUZZX0xBUkdFICAgICAgICAgLyogUmVhZCBvbmNlLCB2ZXJpZnkgbGFyZ2UgY291bnQgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9uICovXG4mIzQzO3N0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHtcbiYjNDM7XHRjb25zdCBjaGFyICpzZXNzaW9uX25hbWU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b2tlbjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZsYWdzO1xuJiM0MztcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XG4mIzQzO1x0Y29uc3QgY2hhciAqZGVzYztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9ucyAqL1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgdGVzdF9jb25maWdzW10gPSB7XG4mIzQzO1x0e1NFU1NJT05fRU1QVFksIDAsIDAsIDAsIFZFUklGWV9GTEFHUywgXCYjMzQ7RW1wdHlcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgXCYjMzQ7RGVmYXVsdFwmIzM0O30sXG4mIzQzO1x0e1NFU1NJT05fU0VNLCBUT0tFTl9TRU0sIENPVU5UX1NFTSwgRUZEX1NFTUFQSE9SRSwgVkVSSUZZX1NFTUFQSE9SRSwgXCYjMzQ7U2VtYXBob3JlXCYjMzQ7fSxcbiYjNDM7XHR7U0VTU0lPTl9OT05CTE9DSywgVE9LRU5fTk9OQkxPQ0ssIENPVU5UX05PTkJMT0NLLCBFRkRfTk9OQkxPQ0ssIFZFUklGWV9OT05CTE9DSywgXCYjMzQ7Tm9uYmxvY2tcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgXCYjMzQ7TGFyZ2UtY291bnRcJiMzNDt9LFxuJiM0MztcdHtTRVNTSU9OX01PRElGSUVELCBUT0tFTl9NT0RJRklFRCwgQ09VTlRfTU9ESUZJRUQgJiM0MzsgQ09VTlRfTU9ESUZZX0RFTFRBLCAwLCBWRVJJRllfT05DRSwgXCYjMzQ7TW9kaWZpZWQgYWZ0ZXIgcHJlc2VydmUgKGtleGVjIGhhbmRvdmVyKVwmIzM0O30sXG4mIzQzO307XG4mIzQzOyNkZWZpbmUgTlVNX1RFU1RfU0VTU0lPTlMgQVJSQVlfU0laRSh0ZXN0X2NvbmZpZ3MpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncywgY29uc3QgY2hhciAqZGVzYylcbiYjNDM7e1xuJiM0MztcdGludCBhY3R1YWxfZmxhZ3MgPSBmY250bChlZmQsIEZfR0VURkwpO1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XG4mIzQzO1x0aW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgXHUwMDI2IChFRkRfTk9OQkxPQ0sgfCBFRkRfQ0xPRVhFQyk7XG4mIzQzO1x0aW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyBcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0dWFsX2ZkX2ZsYWdzICE9IGV4cGVjdGVkX2ZkX2ZsYWdzKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDslczogZmxhZyBtaXNtYXRjaCAtIGV4cGVjdGVkIDB4JXgsIGdvdCAweCV4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MsIGFjdHVhbF9mZF9mbGFncyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyAgJXMgZXZlbnRmZCBmbGFncyBPSyAoMHgleClcXG5cJiMzNDssIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcbiYjNDM7XHRyZXR1cm4gYWN0dWFsX2ZsYWdzOyAvKiBSZXR1cm4gYWN0dWFsIGZsYWdzIGZvciBmdXJ0aGVyIHVzZSAqL1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGVuc3VyZV9ub25ibG9jayhpbnQgZWZkLCBpbnQgY3VycmVudF9mbGFncylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXG4mIzQzO3tcbiYjNDM7XHR1aW50NjRfdCB2YWw7XG4mIzQzO1xuJiM0MztcdGlmIChyZWFkKGVmZCwgXHUwMDI2dmFsLCBzaXplb2YodmFsKSkgIT0gc2l6ZW9mKHZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gLWVycm5vO1xuJiM0MztcbiYjNDM7XHRpZiAodmFsICE9ICh1aW50NjRfdClleHBlY3RlZF9jb3VudCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7JXM6IGV4cGVjdGVkICV1IGdvdCAlbGx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfY291bnQsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7ICAlcyBldmVudGZkIE9LOiAldVxcblwmIzM0OywgZGVzYywgZXhwZWN0ZWRfY291bnQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0dWludDY0X3QgdmFsO1xuJiM0MztcbiYjNDM7XHQvKiBSZWFkIGV4cGVjdGVkX2NvdW50IHRpbWVzLCBlYWNoIHNob3VsZCByZXR1cm4gMSAqL1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBleHBlY3RlZF9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChyZWFkKGVmZCwgXHUwMDI2dmFsLCBzaXplb2YodmFsKSkgIT0gc2l6ZW9mKHZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiAtZXJybm87XG4mIzQzO1xuJiM0MztcdFx0aWYgKHZhbCAhPSAxKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzOiBleHBlY3RlZCAxLCBnb3QgJWxsdSBhdCByZWFkICV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICBkZXNjLCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCwgaSAmIzQzOyAxKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDsgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcXG5cJiMzNDssIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICYjNDM7IDEpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogTmV4dCByZWFkIHNob3VsZCByZXR1cm4gRUFHQUlOIChubyBtb3JlIGV2ZW50cykgKi9cbiYjNDM7XHRpZiAocmVhZChlZmQsIFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpIFx1MDAzZT0gMCB8fCBlcnJubyAhPSBFQUdBSU4pIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzOiBleHBlY3RlZCBFQUdBSU4gYWZ0ZXIgJXUgcmVhZHNcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyAgJXMgZXZlbnRmZCBPSyAoJXUgcmVhZHMpXFxuXCYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVzdG9yZV9hbmRfdmVyaWZ5X2V2ZW50ZmRfZ2VuZXJpYyhpbnQgc2Vzc2lvbl9mZCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9rZW4sXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBlbnVtIHZlcmlmeV9tb2RlIG1vZGUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjb25zdCBjaGFyICpkZXNjKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9yZXRyaWV2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbiYjNDM7XHRpbnQgZWZkLCByZXQgPSAwLCBhY3R1YWxfZmxhZ3M7XG4mIzQzO1xuJiM0MztcdGFyZy50b2tlbiA9IHRva2VuO1xuJiM0MztcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLWVycm5vO1xuJiM0MztcdGVmZCA9IGFyZy5mZDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChtb2RlKSB7XG4mIzQzO1x0Y2FzZSBWRVJJRllfRkxBR1M6XG4mIzQzO1x0XHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuJiM0MztcdFx0cmV0ID0gdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoZWZkLCBleHBlY3RlZF9mbGFncywgZGVzYyk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRjbG9zZShlZmQpO1xuJiM0MztcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG4mIzQzO1xuJiM0MztcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcbiYjNDM7XHRcdC8qIFZlcmlmeSBmbGFncyAmIzQzOyBzZW1hcGhvcmUgYmVoYXZpb3IgKi9cbiYjNDM7XHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuJiM0MztcdFx0aWYgKGFjdHVhbF9mbGFncyBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRyZXQgPSBhY3R1YWxfZmxhZ3M7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChlbnN1cmVfbm9uYmxvY2soZWZkLCBhY3R1YWxfZmxhZ3MpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRjYXNlIFZFUklGWV9PTkNFOlxuJiM0MztcdGNhc2UgVkVSSUZZX05PTkJMT0NLOlxuJiM0MztcdGNhc2UgVkVSSUZZX0xBUkdFOlxuJiM0MztcdFx0LyogVmVyaWZ5IGZsYWdzICYjNDM7IGNvdW50IGJlaGF2aW9yICovXG4mIzQzO1x0XHRhY3R1YWxfZmxhZ3MgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcbiYjNDM7XHRcdGlmIChhY3R1YWxfZmxhZ3MgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSB2ZXJpZnlfY291bnRfb25jZShlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0ID0gLUVJTlZBTDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRjbG9zZShlZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoaW50IHNlc3Npb25fZmQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgaW50ICplZmRfb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbiYjNDM7XHRpbnQgZWZkID0gZXZlbnRmZChjb3VudCwgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAoZWZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XG4mIzQzO1x0YXJnLmZkID0gZWZkO1xuJiM0MztcdGFyZy50b2tlbiA9IHRva2VuO1xuJiM0MztcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUFJFU0VSVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGludCByZXQgPSAtZXJybm87XG4mIzQzO1xuJiM0MztcdFx0Y2xvc2UoZWZkKTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZWZkX291dClcbiYjNDM7XHRcdCplZmRfb3V0ID0gZWZkO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNsb3NlKGVmZCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICAgY29uc3QgY2hhciAqZGVzYylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLCB0b2tlbiwgY291bnQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIGZsYWdzLCBkZXNjLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlc3Npb25fZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRmYWlsX2V4aXQoXCYjMzQ7bHVvX2NyZWF0ZV9zZXNzaW9uIGZvciAmIzM5OyVzJiMzOTtcJiMzNDssIHNlc3Npb25fbmFtZSk7XG4mIzQzO1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Vzc2lvbl9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGZhaWxfZXhpdChcJiMzNDtsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJiMzOTslcyYjMzk7XCYjMzQ7LCBzZXNzaW9uX25hbWUpO1xuJiM0MztcdHJldHVybiBzZXNzaW9uX2ZkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKGludCBzZXNzaW9uX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0ZmFpbF9leGl0KFwmIzM0O2x1b19zZXNzaW9uX2ZpbmlzaCBmb3IgJiMzOTslcyYjMzk7XCYjMzQ7LCBzZXNzaW9uX25hbWUpO1xuJiM0MztcdGNsb3NlKHNlc3Npb25fZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKHNlc3Npb25fZmQsIGNvbmZpZy1cdTAwM2V0b2tlbixcbiYjNDM7XHRcdFx0XHRcdFx0IGNvbmZpZy1cdTAwM2Vjb3VudCwgY29uZmlnLVx1MDAzZWZsYWdzLFxuJiM0MztcdFx0XHRcdFx0XHQgY29uZmlnLVx1MDAzZXZlcmlmeV9tb2RlLCBjb25maWctXHUwMDNlZGVzYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fc3RhZ2VfMShpbnQgbHVvX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDFdIFN0YXJ0aW5nIHByZS1rZXhlYyBzZXR1cCBmb3IgbXVsdGktZXZlbnRmZCB0ZXN0Li4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMV0gQ3JlYXRpbmcgc3RhdGUgZmlsZSBmb3IgbmV4dCBzdGFnZSAoMikuLi5cXG5cJiMzNDspO1xuJiM0MztcdGNyZWF0ZV9zdGF0ZV9maWxlKGx1b19mZCwgU1RBVEVfU0VTU0lPTl9OQU1FLCBTVEFURV9UT0tFTiwgMik7XG4mIzQzO1xuJiM0MztcdC8qIENyZWF0ZSBhbGwgdGVzdCBzZXNzaW9ucyAqL1xuJiM0MztcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV07XG4mIzQzO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDFdIENyZWF0aW5nIHNlc3Npb24gJiMzOTslcyYjMzk7Li4uXFxuXCYjMzQ7LCBjb25maWctXHUwMDNlc2Vzc2lvbl9uYW1lKTtcbiYjNDM7XHRcdGludCBzZXNzaW9uX2ZkID0gY3JlYXRlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIGNvbmZpZy1cdTAwM2VzZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIG1vZGlmaWVkIHNlc3Npb24gKHByZXNlcnZlIHRoZW4gbW9kaWZ5KSAqL1xuJiM0MztcdFx0aWYgKGNvbmZpZy1cdTAwM2V0b2tlbiA9PSBUT0tFTl9NT0RJRklFRCkge1xuJiM0MztcdFx0XHRpbnQgcHJlc2VydmVkX2VmZDtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZXRva2VuLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0Q09VTlRfTU9ESUZJRUQsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHRjb25maWctXHUwMDNlZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHRcJiMzNDttb2RpZmllZC1hZnRlci1wcmVzZXJ2ZVwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdFx0XHRcdFx1MDAyNnByZXNlcnZlZF9lZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZCBtb2RpZmllZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCYjMzk7cyBjb3VudCAqL1xuJiM0MztcdFx0XHR1aW50NjRfdCBtb2RpZnlfdmFsdWUgPSBDT1VOVF9NT0RJRllfREVMVEE7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgXHUwMDI2bW9kaWZ5X3ZhbHVlLFxuJiM0MztcdFx0XHQgICAgc2l6ZW9mKG1vZGlmeV92YWx1ZSkpICE9IHNpemVvZihtb2RpZnlfdmFsdWUpKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDt3cml0ZSB0byBwcmVzZXJ2ZWQgZXZlbnRmZCBhZnRlciBwcmVzZXJ2ZVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0XHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qIFN0YW5kYXJkIHNlc3Npb24gY3JlYXRpb24gKi9cbiYjNDM7XHRcdFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZChzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4mIzQzO1x0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWNvdW50LCBjb25maWctXHUwMDNlZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWRlc2MpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGZhaWxfZXhpdChcJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQgJXNcJiMzNDssIGNvbmZpZy1cdTAwM2VkZXNjKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNsb3NlKGx1b19mZCk7XG4mIzQzO1x0ZGFlbW9uaXplX2FuZF93YWl0KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8yKGludCBsdW9fZmQsIGludCBzdGF0ZV9zZXNzaW9uX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHNlc3Npb25fZmRzW05VTV9URVNUX1NFU1NJT05TXTtcbiYjNDM7XHRpbnQgc3RhZ2U7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBTdGFydGluZyBwb3N0LWtleGVjIHZlcmlmaWNhdGlvbi4uLlxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJlc3RvcmVfYW5kX3JlYWRfc3RhZ2Uoc3RhdGVfc2Vzc2lvbl9mZCwgU1RBVEVfVE9LRU4sIFx1MDAyNnN0YWdlKTtcbiYjNDM7XHRpZiAoc3RhZ2UgIT0gMilcbiYjNDM7XHRcdGZhaWxfZXhpdChcJiMzNDtFeHBlY3RlZCBzdGFnZSAyLCBidXQgc3RhdGUgZmlsZSBjb250YWlucyAlZFwmIzM0Oywgc3RhZ2UpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMl0gUmV0cmlldmluZyBhbGwgc2Vzc2lvbnMuLi5cXG5cJiMzNDspO1xuJiM0MztcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtbU1RBR0UgMl0gVmVyaWZ5aW5nIGV2ZW50ZmRzLi4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAodmVyaWZ5X2V2ZW50ZmRfY29uZmlnKHNlc3Npb25fZmRzW2ldLCBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV0pIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRmYWlsX2V4aXQoXCYjMzQ7dmVyaWZ5ICVzIGV2ZW50ZmRcJiMzNDssIHRlc3RfY29uZmlnc1tpXS5kZXNjKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBBbGwgZXZlbnRmZCBzZXNzaW9ucyB2ZXJpZmllZCBzdWNjZXNzZnVsbHkuXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7W1NUQUdFIDJdIEZpbmFsaXppbmcgYWxsIHNlc3Npb25zLi4uXFxuXCYjMzQ7KTtcbiYjNDM7XHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0ZmluaXNoX3Nlc3Npb25fY2hlY2tlZChzZXNzaW9uX2Zkc1tpXSwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1tTVEFHRSAyXSBGaW5hbGl6aW5nIHN0YXRlIHNlc3Npb24uLi5cXG5cJiMzNDspO1xuJiM0MztcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXHUwMDNjIDApXG4mIzQzO1x0XHRmYWlsX2V4aXQoXCYjMzQ7bHVvX3Nlc3Npb25fZmluaXNoIGZvciBzdGF0ZSBzZXNzaW9uXCYjMzQ7KTtcbiYjNDM7XHRjbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuLS0tIEVWRU5URkRfTFVPIFRFU1QgUEFTU0VEIC0tLVxcblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbHVvX3Rlc3QoYXJnYywgYXJndiwgU1RBVEVfU0VTU0lPTl9OQU1FLFxuJiM0MztcdFx0XHRydW5fc3RhZ2VfMSwgcnVuX3N0YWdlXzIpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjUgMDY6MDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjIxYWZkMzM5ODg3NWViMTRkOWI3ZDdkMmEwMTljNDFiZTk0YzkwYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA4OWE4YTlkMjA3ZDFjNS4uMzZkNTY4ZTZjZmM3M2UgMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL01ha2VmaWxlCkBAIC0yNyw2ICYjNDM7MjcsNyBAQCBvYmoteQkJCQkmIzQzOz0gYW5vbl9pbm9kZXMubwogb2JqLSQoQ09ORklHX1NJR05BTEZEKQkJJiM0Mzs9IHNpZ25hbGZkLm8KIG9iai0kKENPTkZJR19USU1FUkZEKQkJJiM0Mzs9IHRpbWVyZmQubwogb2JqLSQoQ09ORklHX0VWRU5URkQpCQkmIzQzOz0gZXZlbnRmZC5vCiYjNDM7b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkmIzQzOz0gZXZlbnRmZF9sdW8ubwogb2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICAmIzQzOz0gYWlvLm8KIG9iai0kKENPTkZJR19GU19EQVgpCQkmIzQzOz0gZGF4Lm8KIG9iai0kKENPTkZJR19GU19FTkNSWVBUSU9OKQkmIzQzOz0gY3J5cHRvLwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRmZC5jIGIvZnMvZXZlbnRmZC5jCmluZGV4IDlkMzNhMDI3NTdkNTJiLi45Yjc2Y2YwNjEzNWE4NiAxMDA2NDQKLS0tIGEvZnMvZXZlbnRmZC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V2ZW50ZmQuYwpAQCAtMzc2LDYgJiM0MzszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKQogfQogRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jdHhfZmlsZWdldCk7CiAKJiM0MzsvKioKJiM0MzsgKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPCiYjNDM7ICogQGZpbGU6IEV2ZW50ZmQgZmlsZQomIzQzOyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWUKJiM0MzsgKiBAZmxhZ3M6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGZsYWdzIHZhbHVlCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuCiYjNDM7ICogU2luY2Ugc3RydWN0IGV2ZW50ZmRfY3R4IGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB3ZSBjYW4gYWNjZXNzIGl0cwomIzQzOyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmUKJiM0MzsgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiYjNDM7CiYjNDM7CWN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7CiYjNDM7CWlmIChJU19FUlIoY3R4KSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKGN0eCk7CiYjNDM7CiYjNDM7CS8qIFJlYWQgY291bnQgd2l0aCBsb2NrIChmbGFncyBkb24mIzM5O3QgbmVlZCBsb2NrKSAqLwomIzQzOwlzcGluX2xvY2tfaXJxc2F2ZSgmYW1wO2N0eC0mZ3Q7d3FoLmxvY2ssIGlycV9mbGFncyk7CiYjNDM7CSpjb3VudCA9IGN0eC0mZ3Q7Y291bnQ7CiYjNDM7CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtcDtjdHgtJmd0O3dxaC5sb2NrLCBpcnFfZmxhZ3MpOwomIzQzOwomIzQzOwkqZmxhZ3MgPSBjdHgtJmd0O2ZsYWdzOwomIzQzOwomIzQzOwlldmVudGZkX2N0eF9wdXQoY3R4KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSk7CiYjNDM7CiBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHggX19mcmVlKGtmcmVlKSA9IE5VTEw7CkBAIC00MTEsNiAmIzQzOzQ0NSwxMiBAQCBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpCiAJcmV0dXJuIGZkX3B1Ymxpc2goZmRmKTsKIH0KIAomIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jcmVhdGUpOwomIzQzOwogU1lTQ0FMTF9ERUZJTkUyKGV2ZW50ZmQyLCB1bnNpZ25lZCBpbnQsIGNvdW50LCBpbnQsIGZsYWdzKQogewogCXJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9ldmVudGZkX2x1by5jIGIvZnMvZXZlbnRmZF9sdW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNzgxZDkwNjM1YzUyYWUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9mcy9ldmVudGZkX2x1by5jCkBAIC0wLDAgJiM0MzsxLDI1MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLgomIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiAmbHQ7ZHVhbmNoZW5naGFvQGt5bGlub3MuY24mZ3Q7CiYjNDM7ICovCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogRE9DOiBFdmVudGZkIFByZXNlcnZhdGlvbiB2aWEgTFVPCiYjNDM7ICoKJiM0MzsgKiBPdmVydmlldwomIzQzOyAqID09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZQomIzQzOyAqIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgZmlsZSBwcmVzZXJ2YXRpb24uIFRoaXMgYWxsb3dzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMKJiM0MzsgKiB0aGF0IHVzZSBldmVudGZkIGZvciBldmVudCBub3RpZmljYXRpb24gdG8gbWFpbnRhaW4gdGhlaXIgc3RhdGUgYWNyb3NzIGtlcm5lbAomIzQzOyAqIHVwZGF0ZXMuCiYjNDM7ICoKJiM0MzsgKiBFdmVudGZkIGlzIGEgc2ltcGxlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdGhhdCB1c2VzIGEgNjQtYml0IGNvdW50ZXIgZm9yCiYjNDM7ICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4KJiM0MzsgKiBUaGUgcHJlc2VydmF0aW9uIGVuc3VyZXMgdGhhdCBwZW5kaW5nIGV2ZW50cyBhbmQgY29uZmlndXJhdGlvbiBhcmUgbm90IGxvc3QKJiM0MzsgKiBkdXJpbmcga2V4ZWMuCiYjNDM7ICoKJiM0MzsgKiBUaGUgcHJlc2VydmF0aW9uIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB0cmFuc3BhcmVudC4gT25seSBzZWxlY3QgcHJvcGVydGllcyBvZgomIzQzOyAqIHRoZSBldmVudGZkIGFyZSBwcmVzZXJ2ZWQuIEFsbCBvdGhlcnMgYXJlIHJlc2V0IHRvIGRlZmF1bHQuIFRoZSBwcmVzZXJ2ZWQKJiM0MzsgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuCiYjNDM7ICoKJiM0MzsgKiBQcmVzZXJ2ZWQgUHJvcGVydGllcwomIzQzOyAqID09PT09PT09PT09PT09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2YgdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWM6CiYjNDM7ICoKJiM0MzsgKiBDb3VudGVyIFZhbHVlCiYjNDM7ICogICBUaGUgY3VycmVudCA2NC1iaXQgY291bnRlciB2YWx1ZSBpcyBwcmVzZXJ2ZWQuIFRoaXMgaW5jbHVkZXMgYW55IHBlbmRpbmcKJiM0MzsgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLgomIzQzOyAqCiYjNDM7ICogRmlsZSBGbGFncwomIzQzOyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLgomIzQzOyAqICAgVGhlc2UgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgcmVhZC93cml0ZSBvcGVyYXRpb25zIGFuZCBmaWxlIGRlc2NyaXB0b3IKJiM0MzsgKiAgIGluaGVyaXRhbmNlLgomIzQzOyAqCiYjNDM7ICogTm9uLVByZXNlcnZlZCBQcm9wZXJ0aWVzCiYjNDM7ICogPT09PT09PT09PT09PT09PT09PT09PT09CiYjNDM7ICoKJiM0MzsgKiBBbGwgcHJvcGVydGllcyB3aGljaCBhcmUgbm90IHByZXNlcnZlZCBtdXN0IGJlIGFzc3VtZWQgdG8gYmUgcmVzZXQgdG8KJiM0MzsgKiBkZWZhdWx0LiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgb2YgdGhvc2UgcHJvcGVydGllcyB3aGljaCBtYXkgYmUgbW9yZSBvZgomIzQzOyAqIG5vdGUuCiYjNDM7ICoKJiM0MzsgKiBGaWxlIERlc2NyaXB0b3IgTnVtYmVyCiYjNDM7ICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlCiYjNDM7ICogICBldmVudGZkIHdpbGwgYmUgYXNzaWduZWQgYSBuZXcgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MuCiYjNDM7ICoKJiM0MzsgKiBXYWl0IFF1ZXVlIFN0YXRlCiYjNDM7ICogICBBbnkgcHJvY2Vzc2VzIGN1cnJlbnRseSBibG9ja2VkIG9uIHJlYWQoKSBvcGVyYXRpb25zIHdpbGwgYmUgd29rZW4gdXAgYW5kCiYjNDM7ICogICBuZWVkIHRvIHJlLWVzdGFibGlzaCB0aGVpciBibG9ja2luZyBzdGF0ZSBpZiBkZXNpcmVkLgomIzQzOyAqCiYjNDM7ICogRmlsZSBQb3NpdGlvbgomIzQzOyAqICAgRXZlbnRmZCBmaWxlcyBkb24mIzM5O3QgaGF2ZSBhIHRyYWRpdGlvbmFsIGZpbGUgcG9zaXRpb24sIGJ1dCBhbnkgaW50ZXJuYWwKJiM0MzsgKiAgIHN0YXRlIHJlbGF0ZWQgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBpcyByZXNldC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZpbGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2V4ZWNfaGFuZG92ZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2hvL2FiaS9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpdmV1cGRhdGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50ZmQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYW5vbl9pbm9kZXMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaWRyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9rcmVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2ZkdGFibGUuaCZndDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjsKJiM0MzsJdTY0IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwkvKiBHZXQgZXZlbnRmZCBzdGF0ZSBzYWZlbHkgKi8KJiM0MzsJZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtJmd0O2ZpbGUsICZhbXA7Y291bnQsICZhbXA7ZmxhZ3MpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZ2V0IGV2ZW50ZmQgc3RhdGU6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7CiYjNDM7CWlmIChJU19FUlIoc2VyKSkgewomIzQzOwkJZXJyID0gUFRSX0VSUihzZXIpOwomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGFsbG9jYXRlIHByZXNlcnZlIG1lbW9yeTogJWRcbiYjMzQ7LCBlcnIpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTYXZlIGV2ZW50ZmQgc3RhdGUgKi8KJiM0MzsJc2VyLSZndDtjb3VudCA9IGNvdW50OwomIzQzOwlzZXItJmd0O2ZsYWdzID0gZmxhZ3M7CiYjNDM7CiYjNDM7CXByX2RlYnVnKCYjMzQ7UHJlc2VydmVkIGV2ZW50ZmQ6IGNvdW50PSVsbHUsIGZsYWdzPTB4JXhcbiYjMzQ7LAomIzQzOwkJc2VyLSZndDtjb3VudCwgc2VyLSZndDtmbGFncyk7CiYjNDM7CiYjNDM7CS8qIFJldHVybiBwaHlzaWNhbCBhZGRyZXNzIG9mIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlICovCiYjNDM7CWFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSA9IHZpcnRfdG9fcGh5cyhzZXIpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBldmVudGZkX2x1b19mcmVlemUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyOwomIzQzOwl1NjQgY291bnQ7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFnczsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKTsKJiM0MzsKJiM0MzsJLyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovCiYjNDM7CWVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLSZndDtmaWxlLCAmYW1wO2NvdW50LCAmYW1wO2ZsYWdzKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CWlmIChzZXItJmd0O2NvdW50ICE9IGNvdW50KSB7CiYjNDM7CQlwcl9kZWJ1ZygmIzM0O1dBUk5JTkc6IENvdW50IGNoYW5nZWQgZHVyaW5nIHByZXNlcnZlLSZndDtmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxuJiMzNDssCiYjNDM7CQkJIHNlci0mZ3Q7Y291bnQsIGNvdW50KTsKJiM0MzsJfQomIzQzOwomIzQzOwlzZXItJmd0O2NvdW50ID0gY291bnQ7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBldmVudGZkX2x1b191bnByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2VyID0gcGh5c190b192aXJ0KGFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSk7CiYjNDM7CWtob191bnByZXNlcnZlX2ZyZWUoc2VyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBldmVudGZkX2x1b19yZXRyaWV2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7CiYjNDM7CXN0cnVjdCBldmVudGZkX2N0eCAqY3R4OwomIzQzOwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CiYjNDM7CWludCBldmVudGZkOwomIzQzOwomIzQzOwlzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy0mZ3Q7c2VyaWFsaXplZF9kYXRhKTsKJiM0MzsJaWYgKCFzZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJLyogQ3JlYXRlIGEgbmV3IGV2ZW50ZmQgd2l0aCB0aGUgcHJlc2VydmVkIGNvdW50IGFuZCBmbGFncyAqLwomIzQzOwlldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLSZndDtjb3VudCwgc2VyLSZndDtmbGFncyk7CiYjNDM7CWlmIChldmVudGZkICZsdDsgMCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBldmVudGZkOiAlZFxuJiMzNDssIGV2ZW50ZmQpOwomIzQzOwkJcmV0dXJuIGV2ZW50ZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmlsZSA9IGZnZXQoZXZlbnRmZCk7CiYjNDM7CWlmICghZmlsZSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGdldCBmaWxlIGZyb20gZmRcbiYjMzQ7KTsKJiM0MzsJCWNsb3NlX2ZkKGV2ZW50ZmQpOwomIzQzOwkJcmV0dXJuIC1FQkFERjsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZV9mZChldmVudGZkKTsKJiM0MzsKJiM0MzsJLyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi8KJiM0MzsJY3R4ID0gZXZlbnRmZF9jdHhfZmlsZWdldChmaWxlKTsKJiM0MzsJaWYgKElTX0VSUihjdHgpKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZ2V0IGNvbnRleHQgZnJvbSBmaWxlXG4mIzM0Oyk7CiYjNDM7CQlmcHV0KGZpbGUpOwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKJiM0MzsJfQomIzQzOwomIzQzOwlldmVudGZkX2N0eF9wdXQoY3R4KTsKJiM0MzsKJiM0MzsJYXJncy0mZ3Q7ZmlsZSA9IGZpbGU7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyOwomIzQzOwomIzQzOwlpZiAoYXJncy0mZ3Q7cmV0cmlldmVfc3RhdHVzKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAoIWFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2VyID0gcGh5c190b192aXJ0KGFyZ3MtJmd0O3NlcmlhbGl6ZWRfZGF0YSk7CiYjNDM7CWlmICghc2VyKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlraG9fcmVzdG9yZV9mcmVlKHNlcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsCiYjNDM7CQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDsKJiM0MzsKJiM0MzsJaWYgKCFmaWxlLSZndDtmX29wKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUcnkgdG8gZ2V0IGV2ZW50ZmQgY29udGV4dCAtIHRoaXMgd2lsbCBmYWlsIGlmIG5vdCBhbiBldmVudGZkICovCiYjNDM7CWN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7CiYjNDM7CWlmIChJU19FUlIoY3R4KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZXZlbnRmZF9jdHhfcHV0KGN0eCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcHMgZXZlbnRmZF9sdW9fZmlsZV9vcHMgPSB7CiYjNDM7CS5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3ByZXNlcnZlLAomIzQzOwkudW5wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX3VucHJlc2VydmUsCiYjNDM7CS5mcmVlemUgPSBldmVudGZkX2x1b19mcmVlemUsCiYjNDM7CS5yZXRyaWV2ZSA9IGV2ZW50ZmRfbHVvX3JldHJpZXZlLAomIzQzOwkuZmluaXNoID0gZXZlbnRmZF9sdW9fZmluaXNoLAomIzQzOwkuY2FuX3ByZXNlcnZlID0gZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlLAomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHsKJiM0MzsJLm9wcyA9ICZhbXA7ZXZlbnRmZF9sdW9fZmlsZV9vcHMsCiYjNDM7CS5jb21wYXRpYmxlID0gRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnIgPSBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcigmYW1wO2V2ZW50ZmRfbHVvX2hhbmRsZXIpOwomIzQzOwomIzQzOwlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IC1FT1BOT1RTVVBQKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXG4mIzM0OywKJiM0MzsJCSAgICAgICBFUlJfUFRSKGVycikpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oIGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmgKaW5kZXggZTMyYmVlNDM0NWZiOWYuLjcwM2UxYTEyNmM0ZDQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaApAQCAtMzUsNiAmIzQzOzM1LDggQEAgdm9pZCBldmVudGZkX2N0eF9wdXQoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgpOwogc3RydWN0IGZpbGUgKmV2ZW50ZmRfZmdldChpbnQgZmQpOwogc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9mZGdldChpbnQgZmQpOwogc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKTsKJiM0MztpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpOwomIzQzO2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKTsKIHZvaWQgZXZlbnRmZF9zaWduYWxfbWFzayhzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCwgX19wb2xsX3QgbWFzayk7CiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCwKIAkJCQkgIF9fdTY0ICpjbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE0OGJlYWM2YmNjNzYwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaApAQCAtMCwwICYjNDM7MSwzOSBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLgomIzQzOyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiAmbHQ7ZHVhbmNoZW5naGFvQGt5bGlub3MuY24mZ3Q7CiYjNDM7ICovCiYjNDM7CiYjNDM7I2lmbmRlZiBfTElOVVhfS0hPX0FCSV9FVkVOVEZEX0gKJiM0MzsjZGVmaW5lIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90eXBlcy5oJmd0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogRXZlbnRmZCBMaXZlIFVwZGF0ZSBBQkkKJiM0MzsgKgomIzQzOyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy4KJiM0MzsgKgomIzQzOyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYAomIzQzOyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uCiYjNDM7ICoKJiM0MzsgKi8KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkCiYjNDM7ICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlCiYjNDM7ICogQGZsYWdzOiBGaWxlIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKQomIzQzOyAqCiYjNDM7ICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZAomIzQzOyAqIGFmdGVyIGtleGVjLiBUaGUgY291bnQgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZXZlbnQgY291bnRlciwKJiM0MzsgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLgomIzQzOyAqLwomIzQzO3N0cnVjdCBldmVudGZkX2x1b19zZXIgewomIzQzOwlfX3U2NCBjb3VudDsKJiM0MzsJdW5zaWduZWQgaW50ICBmbGFnczsKJiM0Mzt9IF9fcGFja2VkOwomIzQzOwomIzQzOy8qIFRoZSBjb21wYXRpYmlsaXR5IHN0cmluZyBmb3IgZXZlbnRmZCBmaWxlIGhhbmRsZXIgKi8KJiM0MzsjZGVmaW5lIEVWRU5URkRfTFVPX0ZIX0NPTVBBVElCTEUJJiMzNDtldmVudGZkLXYxJiMzNDsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZwppbmRleCBjMTNhZjM4YmEyM2FiOC4uMTM2MWI1NzMzZjQxMmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZwpAQCAtODYsNCAmIzQzOzg2LDIwIEBAIGNvbmZpZyBMSVZFVVBEQVRFX01FTUZECiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKJiM0Mztjb25maWcgTElWRVVQREFURV9FVkVOVEZECiYjNDM7CWJvb2wgJiMzNDtFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0JiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBFVkVOVEZECiYjNDM7CWRlcGVuZHMgb24gTElWRVVQREFURQomIzQzOwloZWxwCiYjNDM7CSAgRW5hYmxlIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0IGZvciBldmVudGZkIGZpbGUgZGVzY3JpcHRvcnMuCiYjNDM7CSAgVGhpcyBhbGxvd3MgZXZlbnRmZCBmaWxlcyB0byBiZSBwcmVzZXJ2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBrZXhlYwomIzQzOwkgIG9wZXJhdGlvbnMsIG1haW50YWluaW5nIHRoZWlyIGNvdW50ZXIgdmFsdWVzIGFuZCBmbGFncy4KJiM0MzsKJiM0MzsJICBFdmVudGZkIGZpbGVzIGFyZSBjb21tb25seSB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb24gYmV0d2VlbgomIzQzOwkgIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4gV2l0aCB0aGlzCiYjNDM7CSAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbAomIzQzOwkgIGR1cmluZyBsaXZlIHVwZGF0ZSBvcGVyYXRpb25zLgomIzQzOwomIzQzOwkgIElmIHVuc3VyZSwgc2F5IE4uCiYjNDM7CiBlbmRtZW51CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZQppbmRleCAzMDY4OWQyMmNiMDIxNi4uZTA5MmUzOGZhNmY2YzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZQpAQCAtOCw2ICYjNDM7OCw3IEBAIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fa2V4ZWNfc2ltcGxlCiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX211bHRpX3Nlc3Npb24KIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fc3RyZXNzX3Nlc3Npb25zCiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCAmIzQzOz0gbHVvX3N0cmVzc19maWxlcwomIzQzO1RFU1RfR0VOX1BST0dTX0VYVEVOREVEICYjNDM7PSBsdW9fdGVzdF9ldmVudGZkCiAKIFRFU1RfRklMRVMgJiM0Mzs9IGRvX2tleGVjLnNoCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcKaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZwpAQCAtOSwzICYjNDM7OSw1IEBAIENPTkZJR19MSVZFVVBEQVRFX1RFU1Q9eQogQ09ORklHX01FTUZEX0NSRUFURT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1NITUVNPXkKJiM0MztDT05GSUdfRVZFTlRGRD15CiYjNDM7Q09ORklHX0xJVkVVUERBVEVfRVZFTlRGRD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi45NGVmM2JjNjZhZDk3MQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jCkBAIC0wLDAgJiM0MzsxLDM3NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uCiYjNDM7ICogQXV0aG9yOiBDaGVuZ2hhbyBEdWFuICZsdDtkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jbiZndDsKJiM0MzsgKi8KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE11bHRpLXNlc3Npb24ga2V4ZWMgc2VsZnRlc3QgZm9yIGV2ZW50ZmQgTFVPIHN1cHBvcnQuCiYjNDM7ICoKJiM0MzsgKiBNb2RlbGVkIGFmdGVyIGx1b19tdWx0aV9zZXNzaW9uLmMuCiYjNDM7ICogSXQgY3JlYXRlcyBtdWx0aXBsZSBMVU8gc2Vzc2lvbnMsIGVhY2ggcHJlc2VydmluZyBkaWZmZXJlbnQgZXZlbnRmZCB0eXBlcywKJiM0MzsgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGludC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2x1b190ZXN0X3V0aWxzLmgmIzM0OwomIzQzOwomIzQzOy8qIFNlc3Npb24gbmFtZXMgKi8KJiM0MzsjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgICYjMzQ7ZXZlbnRmZC1lbXB0eSYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX0RFRkFVTFQgICAmIzM0O2V2ZW50ZmQtZGVmYXVsdCYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX1NFTSAgICAgICAmIzM0O2V2ZW50ZmQtc2VtJiMzNDsKJiM0MzsjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgICYjMzQ7ZXZlbnRmZC1ub25ibG9jayYjMzQ7CiYjNDM7I2RlZmluZSBTRVNTSU9OX0xBUkdFICAgICAmIzM0O2V2ZW50ZmQtbGFyZ2UmIzM0OwomIzQzOyNkZWZpbmUgU0VTU0lPTl9NT0RJRklFRCAgJiMzNDtldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlJiMzNDsKJiM0MzsKJiM0MzsvKiBUb2tlbnMgKi8KJiM0MzsjZGVmaW5lIFRPS0VOX0RFRkFVTFQgICAgICAgMHhDQUZFQkFCRQomIzQzOyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGCiYjNDM7I2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUYKJiM0MzsjZGVmaW5lIFRPS0VOX0xBUkdFICAgICAgICAgMHhCRUVGQ0FGRQomIzQzOyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0CiYjNDM7CiYjNDM7LyogQ291bnRzICovCiYjNDM7I2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDIKJiM0MzsjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMAomIzQzOyNkZWZpbmUgQ09VTlRfRVhQRUNURUQgIChDT1VOVF9JTklUSUFMICYjNDM7IENPVU5UX1dSSVRFKSAvKiA1MiAqLwomIzQzOyNkZWZpbmUgQ09VTlRfU0VNICAgICAgIDUKJiM0MzsjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDAKJiM0MzsjZGVmaW5lIENPVU5UX0xBUkdFICAgICAoKHVuc2lnbmVkIGludCktMSkgLyogVUlOVF9NQVggKi8KJiM0MzsjZGVmaW5lIENPVU5UX01PRElGSUVEICAyNQomIzQzOyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OQomIzQzOwomIzQzOy8qIFN0YXRlIHRyYWNraW5nICovCiYjNDM7I2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgJiMzNDtldmVudGZkX211bHRpX3N0YXRlJiMzNDsKJiM0MzsjZGVmaW5lIFNUQVRFX1RPS0VOICAgICAgICA5OTcKJiM0MzsKJiM0MzsvKiBFdmVudGZkIHZlcmlmaWNhdGlvbiBtb2RlcyAqLwomIzQzO2VudW0gdmVyaWZ5X21vZGUgewomIzQzOwlWRVJJRllfRkxBR1MsICAgICAgICAvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqLwomIzQzOwlWRVJJRllfT05DRSwgICAgICAgICAvKiBSZWFkIG9uY2UgYW5kIHZlcmlmeSBjb3VudCAqLwomIzQzOwlWRVJJRllfU0VNQVBIT1JFLCAgICAvKiBSZWFkIG11bHRpcGxlIHRpbWVzLCB2ZXJpZnkgcmV0dXJucyAxIGVhY2ggdGltZSAqLwomIzQzOwlWRVJJRllfTk9OQkxPQ0ssICAgICAvKiBSZWFkIG9uY2UgaW4gbm9uYmxvY2sgbW9kZSAqLwomIzQzOwlWRVJJRllfTEFSR0UgICAgICAgICAvKiBSZWFkIG9uY2UsIHZlcmlmeSBsYXJnZSBjb3VudCAqLwomIzQzO307CiYjNDM7CiYjNDM7LyogVGVzdCBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gKi8KJiM0MztzdHJ1Y3QgdGVzdF9zZXNzaW9uX2NvbmZpZyB7CiYjNDM7CWNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b2tlbjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7CiYjNDM7CWNvbnN0IGNoYXIgKmRlc2M7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgdGVzdF9jb25maWdzW10gPSB7CiYjNDM7CXtTRVNTSU9OX0VNUFRZLCAwLCAwLCAwLCBWRVJJRllfRkxBR1MsICYjMzQ7RW1wdHkmIzM0O30sCiYjNDM7CXtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgJiMzNDtEZWZhdWx0JiMzNDt9LAomIzQzOwl7U0VTU0lPTl9TRU0sIFRPS0VOX1NFTSwgQ09VTlRfU0VNLCBFRkRfU0VNQVBIT1JFLCBWRVJJRllfU0VNQVBIT1JFLCAmIzM0O1NlbWFwaG9yZSYjMzQ7fSwKJiM0MzsJe1NFU1NJT05fTk9OQkxPQ0ssIFRPS0VOX05PTkJMT0NLLCBDT1VOVF9OT05CTE9DSywgRUZEX05PTkJMT0NLLCBWRVJJRllfTk9OQkxPQ0ssICYjMzQ7Tm9uYmxvY2smIzM0O30sCiYjNDM7CXtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgJiMzNDtMYXJnZS1jb3VudCYjMzQ7fSwKJiM0MzsJe1NFU1NJT05fTU9ESUZJRUQsIFRPS0VOX01PRElGSUVELCBDT1VOVF9NT0RJRklFRCAmIzQzOyBDT1VOVF9NT0RJRllfREVMVEEsIDAsIFZFUklGWV9PTkNFLCAmIzM0O01vZGlmaWVkIGFmdGVyIHByZXNlcnZlIChrZXhlYyBoYW5kb3ZlcikmIzM0O30sCiYjNDM7fTsKJiM0MzsjZGVmaW5lIE5VTV9URVNUX1NFU1NJT05TIEFSUkFZX1NJWkUodGVzdF9jb25maWdzKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJaW50IGFjdHVhbF9mbGFncyA9IGZjbnRsKGVmZCwgRl9HRVRGTCk7CiYjNDM7CiYjNDM7CWlmIChhY3R1YWxfZmxhZ3MgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC1lcnJubzsKJiM0MzsKJiM0MzsJaW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgJmFtcDsgKEVGRF9OT05CTE9DSyB8IEVGRF9DTE9FWEVDKTsKJiM0MzsJaW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyAmYW1wOyAoT19OT05CTE9DSyB8IE9fQ0xPRVhFQyk7CiYjNDM7CiYjNDM7CWlmIChhY3R1YWxfZmRfZmxhZ3MgIT0gZXhwZWN0ZWRfZmRfZmxhZ3MpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXM6IGZsYWcgbWlzbWF0Y2ggLSBleHBlY3RlZCAweCV4LCBnb3QgMHgleFxuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzLCBhY3R1YWxfZmRfZmxhZ3MpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDsgICVzIGV2ZW50ZmQgZmxhZ3MgT0sgKDB4JXgpXG4mIzM0OywgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MpOwomIzQzOwlyZXR1cm4gYWN0dWFsX2ZsYWdzOyAvKiBSZXR1cm4gYWN0dWFsIGZsYWdzIGZvciBmdXJ0aGVyIHVzZSAqLwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGVuc3VyZV9ub25ibG9jayhpbnQgZWZkLCBpbnQgY3VycmVudF9mbGFncykKJiM0Mzt7CiYjNDM7CXJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpCiYjNDM7ewomIzQzOwl1aW50NjRfdCB2YWw7CiYjNDM7CiYjNDM7CWlmIChyZWFkKGVmZCwgJmFtcDt2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSkKJiM0MzsJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CWlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0OyVzOiBleHBlY3RlZCAldSBnb3QgJWxsdVxuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50LCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0OyAgJXMgZXZlbnRmZCBPSzogJXVcbiYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKQomIzQzO3sKJiM0MzsJdWludDY0X3QgdmFsOwomIzQzOwomIzQzOwkvKiBSZWFkIGV4cGVjdGVkX2NvdW50IHRpbWVzLCBlYWNoIHNob3VsZCByZXR1cm4gMSAqLwomIzQzOwlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSAmbHQ7IGV4cGVjdGVkX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHJlYWQoZWZkLCAmYW1wO3ZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKQomIzQzOwkJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CQlpZiAodmFsICE9IDEpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0OyVzOiBleHBlY3RlZCAxLCBnb3QgJWxsdSBhdCByZWFkICV1XG4mIzM0OywKJiM0MzsJCQkJICAgICAgIGRlc2MsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsLCBpICYjNDM7IDEpOwomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDsgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcbiYjMzQ7LCBkZXNjLCAodW5zaWduZWQgaW50KXZhbCwgaSAmIzQzOyAxKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBOZXh0IHJlYWQgc2hvdWxkIHJldHVybiBFQUdBSU4gKG5vIG1vcmUgZXZlbnRzKSAqLwomIzQzOwlpZiAocmVhZChlZmQsICZhbXA7dmFsLCBzaXplb2YodmFsKSkgJmd0Oz0gMCB8fCBlcnJubyAhPSBFQUdBSU4pIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXM6IGV4cGVjdGVkIEVBR0FJTiBhZnRlciAldSByZWFkc1xuJiMzNDssCiYjNDM7CQkJICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50KTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7ICAlcyBldmVudGZkIE9LICgldSByZWFkcylcbiYjMzQ7LCBkZXNjLCBleHBlY3RlZF9jb3VudCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoaW50IHNlc3Npb25fZmQsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLAomIzQzOwkJCQkJICAgICAgZW51bSB2ZXJpZnlfbW9kZSBtb2RlLAomIzQzOwkJCQkJICAgICAgY29uc3QgY2hhciAqZGVzYykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXZldXBkYXRlX3Nlc3Npb25fcmV0cmlldmVfZmQgYXJnID0geyAuc2l6ZSA9IHNpemVvZihhcmcpIH07CiYjNDM7CWludCBlZmQsIHJldCA9IDAsIGFjdHVhbF9mbGFnczsKJiM0MzsKJiM0MzsJYXJnLnRva2VuID0gdG9rZW47CiYjNDM7CWlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsICZhbXA7YXJnKSAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwllZmQgPSBhcmcuZmQ7CiYjNDM7CiYjNDM7CXN3aXRjaCAobW9kZSkgewomIzQzOwljYXNlIFZFUklGWV9GTEFHUzoKJiM0MzsJCS8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovCiYjNDM7CQlyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWNsb3NlKGVmZCk7CiYjNDM7CQlyZXR1cm4gcmV0ICZsdDsgMCA/IHJldCA6IDA7CiYjNDM7CiYjNDM7CWNhc2UgVkVSSUZZX1NFTUFQSE9SRToKJiM0MzsJCS8qIFZlcmlmeSBmbGFncyAmIzQzOyBzZW1hcGhvcmUgYmVoYXZpb3IgKi8KJiM0MzsJCWFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpOwomIzQzOwkJaWYgKGFjdHVhbF9mbGFncyAmbHQ7IDApIHsKJiM0MzsJCQlyZXQgPSBhY3R1YWxfZmxhZ3M7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoZW5zdXJlX25vbmJsb2NrKGVmZCwgYWN0dWFsX2ZsYWdzKSAmbHQ7IDApIHsKJiM0MzsJCQlyZXQgPSAtZXJybm87CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlyZXQgPSB2ZXJpZnlfc2VtYXBob3JlX2JlaGF2aW9yKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWNhc2UgVkVSSUZZX09OQ0U6CiYjNDM7CWNhc2UgVkVSSUZZX05PTkJMT0NLOgomIzQzOwljYXNlIFZFUklGWV9MQVJHRToKJiM0MzsJCS8qIFZlcmlmeSBmbGFncyAmIzQzOyBjb3VudCBiZWhhdmlvciAqLwomIzQzOwkJYWN0dWFsX2ZsYWdzID0gdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoZWZkLCBleHBlY3RlZF9mbGFncywgZGVzYyk7CiYjNDM7CQlpZiAoYWN0dWFsX2ZsYWdzICZsdDsgMCkgewomIzQzOwkJCXJldCA9IGFjdHVhbF9mbGFnczsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXJldCA9IHZlcmlmeV9jb3VudF9vbmNlKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWNsb3NlKGVmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoaW50IHNlc3Npb25fZmQsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbiwKJiM0MzsJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsCiYjNDM7CQkJCQkgICAgICAgaW50ICplZmRfb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTsKJiM0MzsJaW50IGVmZCA9IGV2ZW50ZmQoY291bnQsIGZsYWdzKTsKJiM0MzsKJiM0MzsJaWYgKGVmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwomIzQzOwlhcmcuZmQgPSBlZmQ7CiYjNDM7CWFyZy50b2tlbiA9IHRva2VuOwomIzQzOwlpZiAoaW9jdGwoc2Vzc2lvbl9mZCwgTElWRVVQREFURV9TRVNTSU9OX1BSRVNFUlZFX0ZELCAmYW1wO2FyZykgJmx0OyAwKSB7CiYjNDM7CQlpbnQgcmV0ID0gLWVycm5vOwomIzQzOwomIzQzOwkJY2xvc2UoZWZkKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGVmZF9vdXQpCiYjNDM7CQkqZWZkX291dCA9IGVmZDsKJiM0MzsJZWxzZQomIzQzOwkJY2xvc2UoZWZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbiwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKJiM0MzsJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpCiYjNDM7ewomIzQzOwlyZXR1cm4gY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoc2Vzc2lvbl9mZCwgdG9rZW4sIGNvdW50LAomIzQzOwkJCQkJCSAgIGZsYWdzLCBkZXNjLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSkKJiM0Mzt7CiYjNDM7CWludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTsKJiM0MzsKJiM0MzsJaWYgKHNlc3Npb25fZmQgJmx0OyAwKQomIzQzOwkJZmFpbF9leGl0KCYjMzQ7bHVvX2NyZWF0ZV9zZXNzaW9uIGZvciAmIzM5OyVzJiMzOTsmIzM0Oywgc2Vzc2lvbl9uYW1lKTsKJiM0MzsJcmV0dXJuIHNlc3Npb25fZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSkKJiM0Mzt7CiYjNDM7CWludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwlpZiAoc2Vzc2lvbl9mZCAmbHQ7IDApCiYjNDM7CQlmYWlsX2V4aXQoJiMzNDtsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJiMzOTslcyYjMzk7JiMzNDssIHNlc3Npb25fbmFtZSk7CiYjNDM7CXJldHVybiBzZXNzaW9uX2ZkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKGludCBzZXNzaW9uX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpCiYjNDM7ewomIzQzOwlpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpICZsdDsgMCkKJiM0MzsJCWZhaWxfZXhpdCgmIzM0O2x1b19zZXNzaW9uX2ZpbmlzaCBmb3IgJiMzOTslcyYjMzk7JiMzNDssIHNlc3Npb25fbmFtZSk7CiYjNDM7CWNsb3NlKHNlc3Npb25fZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZykKJiM0Mzt7CiYjNDM7CXJldHVybiByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKHNlc3Npb25fZmQsIGNvbmZpZy0mZ3Q7dG9rZW4sCiYjNDM7CQkJCQkJIGNvbmZpZy0mZ3Q7Y291bnQsIGNvbmZpZy0mZ3Q7ZmxhZ3MsCiYjNDM7CQkJCQkJIGNvbmZpZy0mZ3Q7dmVyaWZ5X21vZGUsIGNvbmZpZy0mZ3Q7ZGVzYyk7CiYjNDM7fQomIzQzOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8xKGludCBsdW9fZmQpCiYjNDM7ewomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAxXSBTdGFydGluZyBwcmUta2V4ZWMgc2V0dXAgZm9yIG11bHRpLWV2ZW50ZmQgdGVzdC4uLlxuJiMzNDspOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAxXSBDcmVhdGluZyBzdGF0ZSBmaWxlIGZvciBuZXh0IHN0YWdlICgyKS4uLlxuJiMzNDspOwomIzQzOwljcmVhdGVfc3RhdGVfZmlsZShsdW9fZmQsIFNUQVRFX1NFU1NJT05fTkFNRSwgU1RBVEVfVE9LRU4sIDIpOwomIzQzOwomIzQzOwkvKiBDcmVhdGUgYWxsIHRlc3Qgc2Vzc2lvbnMgKi8KJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSAmYW1wO3Rlc3RfY29uZmlnc1tpXTsKJiM0MzsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDFdIENyZWF0aW5nIHNlc3Npb24gJiMzOTslcyYjMzk7Li4uXG4mIzM0OywgY29uZmlnLSZndDtzZXNzaW9uX25hbWUpOwomIzQzOwkJaW50IHNlc3Npb25fZmQgPSBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgY29uZmlnLSZndDtzZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovCiYjNDM7CQlpZiAoY29uZmlnLSZndDt0b2tlbiA9PSBUT0tFTl9NT0RJRklFRCkgewomIzQzOwkJCWludCBwcmVzZXJ2ZWRfZWZkOwomIzQzOwomIzQzOwkJCWlmIChjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZChzZXNzaW9uX2ZkLAomIzQzOwkJCQkJCQkJY29uZmlnLSZndDt0b2tlbiwKJiM0MzsJCQkJCQkJCUNPVU5UX01PRElGSUVELAomIzQzOwkJCQkJCQkJY29uZmlnLSZndDtmbGFncywKJiM0MzsJCQkJCQkJCSYjMzQ7bW9kaWZpZWQtYWZ0ZXItcHJlc2VydmUmIzM0OywKJiM0MzsJCQkJCQkJCSZhbXA7cHJlc2VydmVkX2VmZCkgJmx0OyAwKQomIzQzOwkJCQlmYWlsX2V4aXQoJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmRfa2VlcF9mZCBtb2RpZmllZCYjMzQ7KTsKJiM0MzsKJiM0MzsJCQkvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCYjMzk7cyBjb3VudCAqLwomIzQzOwkJCXVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTsKJiM0MzsKJiM0MzsJCQlpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgJmFtcDttb2RpZnlfdmFsdWUsCiYjNDM7CQkJICAgIHNpemVvZihtb2RpZnlfdmFsdWUpKSAhPSBzaXplb2YobW9kaWZ5X3ZhbHVlKSkKJiM0MzsJCQkJZmFpbF9leGl0KCYjMzQ7d3JpdGUgdG8gcHJlc2VydmVkIGV2ZW50ZmQgYWZ0ZXIgcHJlc2VydmUmIzM0Oyk7CiYjNDM7CiYjNDM7CQkJY2xvc2UocHJlc2VydmVkX2VmZCk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qIFN0YW5kYXJkIHNlc3Npb24gY3JlYXRpb24gKi8KJiM0MzsJCQlpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKHNlc3Npb25fZmQsIGNvbmZpZy0mZ3Q7dG9rZW4sCiYjNDM7CQkJCQkJCWNvbmZpZy0mZ3Q7Y291bnQsIGNvbmZpZy0mZ3Q7ZmxhZ3MsCiYjNDM7CQkJCQkJCWNvbmZpZy0mZ3Q7ZGVzYykgJmx0OyAwKQomIzQzOwkJCQlmYWlsX2V4aXQoJiMzNDtjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQgJXMmIzM0OywgY29uZmlnLSZndDtkZXNjKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsdW9fZmQpOwomIzQzOwlkYWVtb25pemVfYW5kX3dhaXQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnVuX3N0YWdlXzIoaW50IGx1b19mZCwgaW50IHN0YXRlX3Nlc3Npb25fZmQpCiYjNDM7ewomIzQzOwlpbnQgc2Vzc2lvbl9mZHNbTlVNX1RFU1RfU0VTU0lPTlNdOwomIzQzOwlpbnQgc3RhZ2U7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDJdIFN0YXJ0aW5nIHBvc3Qta2V4ZWMgdmVyaWZpY2F0aW9uLi4uXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXJlc3RvcmVfYW5kX3JlYWRfc3RhZ2Uoc3RhdGVfc2Vzc2lvbl9mZCwgU1RBVEVfVE9LRU4sICZhbXA7c3RhZ2UpOwomIzQzOwlpZiAoc3RhZ2UgIT0gMikKJiM0MzsJCWZhaWxfZXhpdCgmIzM0O0V4cGVjdGVkIHN0YWdlIDIsIGJ1dCBzdGF0ZSBmaWxlIGNvbnRhaW5zICVkJiMzNDssIHN0YWdlKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gUmV0cmlldmluZyBhbGwgc2Vzc2lvbnMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O1tTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICh2ZXJpZnlfZXZlbnRmZF9jb25maWcoc2Vzc2lvbl9mZHNbaV0sICZhbXA7dGVzdF9jb25maWdzW2ldKSAmbHQ7IDApCiYjNDM7CQkJZmFpbF9leGl0KCYjMzQ7dmVyaWZ5ICVzIGV2ZW50ZmQmIzM0OywgdGVzdF9jb25maWdzW2ldLmRlc2MpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7W1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gRmluYWxpemluZyBhbGwgc2Vzc2lvbnMuLi5cbiYjMzQ7KTsKJiM0MzsJZm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBOVU1fVEVTVF9TRVNTSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKHNlc3Npb25fZmRzW2ldLCB0ZXN0X2NvbmZpZ3NbaV0uc2Vzc2lvbl9uYW1lKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtbU1RBR0UgMl0gRmluYWxpemluZyBzdGF0ZSBzZXNzaW9uLi4uXG4mIzM0Oyk7CiYjNDM7CWlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgJmx0OyAwKQomIzQzOwkJZmFpbF9leGl0KCYjMzQ7bHVvX3Nlc3Npb25fZmluaXNoIGZvciBzdGF0ZSBzZXNzaW9uJiMzNDspOwomIzQzOwljbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtcbi0tLSBFVkVOVEZEX0xVTyBURVNUIFBBU1NFRCAtLS1cbiYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKJiM0Mzt7CiYjNDM7CXJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsCiYjNDM7CQkJcnVuX3N0YWdlXzEsIHJ1bl9zdGFnZV8yKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNjc0CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzUzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBgZXZlbnRmZGAuIEl0IGxvb2tzIGxpa2UgaXQgYWRkcyBgZnMvZXZlbnRmZF9sdW8uY2AgYW5kIG1vZGlmaWVzIGBmcy9ldmVudGZkLmNgIHRvIGV4cG9ydCBhIGZldyBmdW5jdGlvbnMgYW5kIGludHJvZHVjZXMgYSBgQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRGAgY29uZmlnIG9wdGlvbi4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O0lzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqIGFuZCBmdW5jdGlvbmFsPyYjMzQ7ICBJIG5lZWQgdG8gdmVyaWZ5LiBTaW5jZSB0aGUgcHJvbXB0IHRlbGxzIG1lIHRvIHVzZSBteSB0b29scyBhbmQgbm90IHJlbHkgb24gcHJpb3Iga25vd2xlZGdlLCBsZXQmIzM5O3MgZGl2ZSBpbi4KClRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBmcy9ldmVudGZkX2x1by5jYCwgYW5kIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIGhlYXJ0IG9mIHRoaXMgTFVPIGludGVncmF0aW9uIGxpa2VseSByZXNpZGVzLiBJdCBsb29rcyBsaWtlIHRoaXMgZmlsZSByZWdpc3RlcnMgYSBsaXZlIHVwZGF0ZSBmaWxlIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBldmVudGZkcy4gTm93LCB0aGlzIGBsaXZldXBkYXRlYCBjb25jZXB0IGlzIHN0aWxsIGEgYml0IGhhenksIEkgZG9uJiMzOTt0IHJlYWRpbHkgcmVjYWxsIGl0IGZyb20gbWFpbmxpbmUsIHNvIGl0IG11c3QgYmUgc29tZXRoaW5nIHNwZWNpZmljIHRvIHRoaXMgcGF0Y2ggb3IgdGhpcyBrZXJuZWwgdHJlZS4gQnV0IHRoZSBpbnN0cnVjdGlvbnMgdGVsbCBtZSB0byAqbG9vayogYXQgdGhlIGNvZGUuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIGNvZGUuIFRoZSBgZnMvZXZlbnRmZF9sdW8uY2AgZmlsZSBkZWZpbmVzIGEgYHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzYCBjYWxsZWQgYGV2ZW50ZmRfbHVvX2ZpbGVfb3BzYCB3aXRoIGZ1bmN0aW9uczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGFuZCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYC4gVGhpcyBwb2ludHMgdG8gdGhlIGNvcmUgb3BlcmF0aW9ucyBmb3IgbGl2ZSB1cGRhdGluZyBhbiBldmVudGZkLiBJdCYjMzk7cyB1c2luZyBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCBhbmQgYGV2ZW50ZmRfY3JlYXRlYCwgd2hpY2ggYXJlIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZnJvbSBgZnMvZXZlbnRmZC5jYC4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBMVU8gZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZXNlIGV4aXN0aW5nIGBldmVudGZkYCBmdW5jdGlvbnMuIFRpbWUgdG8gbG9vayBmb3IgYGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkX2x1by5jPTIzOD1zdGF0aWMgaW50IF9faW5pdCBldmVudGZkX2x1b19pbml0KHZvaWQpXG5mcy9ldmVudGZkX2x1by5jLTIzOS17XG5mcy9ldmVudGZkX2x1by5jOjI0MDpcdGludCBlcnIgPSBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihcdTAwMjZldmVudGZkX2x1b19oYW5kbGVyKTtcbmZzL2V2ZW50ZmRfbHVvLmMtMjQxLVxuLS1cbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTIzMj1pbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaC0yMzMtXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaDoyMzQ6aW50IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlciAqZmgpO1xuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjM1LXZvaWQgbGl2ZXVwZGF0ZV91bnJlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaD0yNTQ9c3RhdGljIGlubGluZSBpbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaC0yNTgtXG5pbmNsdWRlL2xpbnV4L2xpdmV1cGRhdGUuaDoyNTk6c3RhdGljIGlubGluZSBpbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaClcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oLTI2MC17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYz04NTU9dm9pZCBsdW9fZmlsZV9zZXRfZGVzdHJveShzdHJ1Y3QgbHVvX2ZpbGVfc2V0ICpmaWxlX3NldClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2Mi0vKipcbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6ODYzOiAqIGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyIC0gUmVnaXN0ZXIgYSBmaWxlIGhhbmRsZXIgd2l0aCBMVU8uXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2NC0gKiBAZmg6IFBvaW50ZXIgdG8gYSBjYWxsZXItYWxsb2NhdGVkIFx1MDAyNnN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlci5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3My0gKi9cbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6ODc0OmludCBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKVxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy04NzUte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmMtOTE3LSAqIFVucmVnaXN0ZXJzIHRoZSBmaWxlIGhhbmRsZXIgZnJvbSB0aGUgbGl2ZXVwZGF0ZSBjb3JlLiBUaGlzIGZ1bmN0aW9uXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jOjkxODogKiByZXZlcnNlcyB0aGUgb3BlcmF0aW9ucyBvZiBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcigpLlxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy05MTktICovXG4tLVxubW0vbWVtZmRfbHVvLmM9NjA5PXN0YXRpYyBpbnQgX19pbml0IG1lbWZkX2x1b19pbml0KHZvaWQpXG5tbS9tZW1mZF9sdW8uYy02MTAte1xubW0vbWVtZmRfbHVvLmM6NjExOlx0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNm1lbWZkX2x1b19oYW5kbGVyKTtcbm1tL21lbWZkX2x1by5jLTYxMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE1NwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV2ZW50ZmQgTFVPIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIHRoaXMgY29kZSBzdWNjZXNzZnVsbHkgaW1wbGVtZW50cyBhIG5ldyBmZWF0dXJlIGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgcGVyc2lzdGluZyBldmVudGZkIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGEga2V4ZWMgcmVib290IHVzaW5nIHRoZSBMaXZlIFVwZGF0ZSBPYmplY3QgKExVTykgZnJhbWV3b3JrLiBNeSBmb2N1cyBpcyBpbW1lZGlhdGVseSBkcmF3biB0byB0aGUgaW50ZWdyYXRpb24gcG9pbnRzLiBUaGUgY29uZmlnLCBgTElWRVVQREFURV9FVkVOVEZEYCwgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCwgZW5hYmxpbmcgdGhpcyBzcGVjaWZpYyBMVU8tYmFzZWQgcHJlc2VydmF0aW9uLiBOb3cgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGlzIHdvcmsuCgpNeSBpbml0aWFsIG1lbnRhbCBjaGVja2xpc3QgaW5jbHVkZXM6IGBldmVudGZkX2x1b19wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19mcmVlemVgLCBgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19yZXRyaWV2ZWAsIGBldmVudGZkX2x1b19maW5pc2hgLCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2dldF9zdGF0ZWAsIGFuZCBvZiBjb3Vyc2UgYGV2ZW50ZmRfY3JlYXRlYC4gVGhlc2UgYXJlIHRoZSBrZXkgZW50cnkgcG9pbnRzIGFuZCBoYW5kbGVycyB0aGF0IHdpbGwgZGVmaW5lIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGV2ZW50ZmQgc3RhdGUgZHVyaW5nIHRoZSBrZXhlYyBwcm9jZXNzLgoKVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL2V2ZW50ZmRfbHVvLmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoZXJlIG1pZ2h0IGJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlcmUgdGhhdCBhcmUganVzdCBhcyBjcnVjaWFsIGFzIHRob3NlIGxpc3RlZC4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHN1cnByaXNlcyBvciBlZGdlIGNhc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15zdGF0aWMuKmV2ZW50ZmRfbHVvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXZlbnRmZF9sdW8uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkX2x1by5jLTc1LVxuZnMvZXZlbnRmZF9sdW8uYzo3NjpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbmZzL2V2ZW50ZmRfbHVvLmMtNzcte1xuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMTA5LVxuZnMvZXZlbnRmZF9sdW8uYzoxMTA6c3RhdGljIGludCBldmVudGZkX2x1b19mcmVlemUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuZnMvZXZlbnRmZF9sdW8uYy0xMTEte1xuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMTM2LVxuZnMvZXZlbnRmZF9sdW8uYzoxMzc6c3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG5mcy9ldmVudGZkX2x1by5jLTEzOC17XG4tLVxuZnMvZXZlbnRmZF9sdW8uYy0xNDctXG5mcy9ldmVudGZkX2x1by5jOjE0ODpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3JldHJpZXZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbmZzL2V2ZW50ZmRfbHVvLmMtMTQ5LXtcbi0tXG5mcy9ldmVudGZkX2x1by5jLTE4OC1cbmZzL2V2ZW50ZmRfbHVvLmM6MTg5OnN0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX2ZpbmlzaChzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG5mcy9ldmVudGZkX2x1by5jLTE5MC17XG4tLVxuZnMvZXZlbnRmZF9sdW8uYy0yMDUtXG5mcy9ldmVudGZkX2x1by5jOjIwNjpzdGF0aWMgYm9vbCBldmVudGZkX2x1b19jYW5fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpoYW5kbGVyLFxuZnMvZXZlbnRmZF9sdW8uYy0yMDctXHRcdFx0XHQgICAgIHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMjIyLVxuZnMvZXZlbnRmZF9sdW8uYzoyMjM6c3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xuZnMvZXZlbnRmZF9sdW8uYy0yMjQtXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcbi0tXG5mcy9ldmVudGZkX2x1by5jLTIzMi1cbmZzL2V2ZW50ZmRfbHVvLmM6MjMzOnN0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcbmZzL2V2ZW50ZmRfbHVvLmMtMjM0LVx0Lm9wcyA9IFx1MDAyNmV2ZW50ZmRfbHVvX2ZpbGVfb3BzLFxuLS1cbmZzL2V2ZW50ZmRfbHVvLmMtMjM3LVxuZnMvZXZlbnRmZF9sdW8uYzoyMzg6c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxuZnMvZXZlbnRmZF9sdW8uYy0yMzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMjc3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZvY3VzaW5nIG9uIEV2ZW50ZmQmIzM5O3MgUHJlc2VydmF0aW9uIFN0YXRlKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIGBldmVudGZkYCBtZWNoYW5pc20sIHNwZWNpZmljYWxseSB0aGUgcGFydCBkZWFsaW5nIHdpdGggJiMzNDtMVU8mIzM0OyDigJMgTGlrZWx5IFVuLW1vZGlmaWVkIE9iamVjdCBwcmVzZXJ2YXRpb24sIEkmIzM5O20gYXNzdW1pbmcuIE15IHByaW1hcnkgZm9jdXMgaXMgcGlucG9pbnRpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGlzIHN0YXRlLiBSaWdodCBub3csIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyB0aGlzIHByZXNlcnZhdGlvbiB3b3JrcyB3aXRoaW4gdGhlIGV2ZW50ZmQgY29udGV4dC4KClNvLCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGVzZSBmdW5jdGlvbnMgY2xvc2VseTogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBhbmQgb2YgY291cnNlIGBldmVudGZkX2x1b19nZXRfc3RhdGVgLiBUaGlzIGxhc3Qgb25lIGlzIGtleSB0byBkZXRlcm1pbmluZyB0aGUgKmN1cnJlbnQqIHN0YXRlIG9mIHByZXNlcnZhdGlvbi4gSXQmIzM5O2xsIHNob3cgbWUgaWYgaXQmIzM5O3MgcHJlc2VydmVkLCBmcm96ZW4sIG9yIHdoYXRldmVyIGVsc2UgaXMgZ29pbmcgb24uIEFuZCwgbGV0JiMzOTtzIG5vdCBmb3JnZXQgdGhlIGNvcmUgY3JlYXRpb24gZnVuY3Rpb24gYGV2ZW50ZmRfY3JlYXRlYC4gSSYjMzk7bGwgbmVlZCB0byBrbm93IGhvdyB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgcHJlc2VydmF0aW9uIGZsYWdzIGFyZSBoYW5kbGVkIGR1cmluZyBjcmVhdGlvbi4KCk15IGltbWVkaWF0ZSBuZXh0IHN0ZXAgaXMgdG8gaGVhZCBvdmVyIHRvIGBmcy9ldmVudGZkLmNgLiBUaGUgc291cmNlIGZvciBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCBhbmQgYGV2ZW50ZmRfY3JlYXRlYCBzaG91bGQgcHJvdmlkZSB0aGUgYmVzdCBpbnNpZ2h0cy4gSeKAmWxsIHN0YXJ0IHRoZXJlIGFuZCB0aGVuIHRyYWNlIHRoZSBmbG93IGZyb20gdGhlcmUuIFRoYXQmIzM5O3MgdGhlIGJlc3Qgd2F5IHRvIGdldCBhIHNvbGlkIGdyYXNwIG9mIHRoaXMgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V2ZW50ZmRfbHVvX2dldF9zdGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V2ZW50ZmQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9ldmVudGZkLmM9Mzc3PUVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xuLS1cbmZzL2V2ZW50ZmQuYy0zNzktLyoqXG5mcy9ldmVudGZkLmM6MzgwOiAqIGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSAtIEdldCBldmVudGZkIHN0YXRlIChjb3VudCBhbmQgZmxhZ3MpIGZvciBMVU9cbmZzL2V2ZW50ZmQuYy0zODEtICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxuLS1cbmZzL2V2ZW50ZmQuYy0zOTEtICovXG5mcy9ldmVudGZkLmM6MzkyOmludCBldmVudGZkX2x1b19nZXRfc3RhdGUoc3RydWN0IGZpbGUgKmZpbGUsIF9fdTY0ICpjb3VudCwgdW5zaWduZWQgaW50ICpmbGFncylcbmZzL2V2ZW50ZmQuYy0zOTMte1xuLS1cbmZzL2V2ZW50ZmQuYy00MTAtfVxuZnMvZXZlbnRmZC5jOjQxMTpFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuZnMvZXZlbnRmZC5jLTQxMi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk3OAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCBwcm9tcHQsIGFuZCBteSByZXNwb25zZToKCioqVGhpbmtpbmcgQWJvdXQgYGV2ZW50ZmRfY3JlYXRlYCoqCgpSaWdodCwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYGV2ZW50ZmRfY3JlYXRlYCBoZXJlLiBJbW1lZGlhdGVseSwgbXkgbWluZCBqdW1wcyB0byB0aGUgY29yZSBvZiB0aGlzIHN5c3RlbSBjYWxsOiBjcmVhdGluZyBhbiBldmVudCBmaWxlIGRlc2NyaXB0b3IsIGEgKnNpZ25hbGxpbmcqIG1lY2hhbmlzbS4gSXQmIzM5O3MgZXNzZW50aWFsbHkgYSBsaWdodHdlaWdodCwga2VybmVsLW1hbmFnZWQgY291bnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBldmVudHMgYmV0d2VlbiBwcm9jZXNzZXMgb3IgdGhyZWFkcy4gTm8gbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBpcGVzIG9yIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgaW4gc2ltcGxlIHNjZW5hcmlvcywgdGhpcyBpcyBtdWNoIGNsZWFuZXIuIEkgYXBwcmVjaWF0ZSBpdHMgc2ltcGxpY2l0eSBmb3IgSVBDLgoKVGhpbmtpbmcgZGVlcGVyLCBJJiMzOTttIGNvbnNpZGVyaW5nIHRoZSBwb3RlbnRpYWwgYXBwbGljYXRpb25zLiBUaHJlYWQgc3luY2hyb25pemF0aW9uIGlzIHRoZSBtb3N0IG9idmlvdXMuIFlvdSYjMzk7dmUgZ290IG9uZSB0aHJlYWQgd2FpdGluZyBvbiBhbiBldmVudCwgYW5vdGhlciBzaWduYWxpbmcgaXQuIEVhc3kuIEJ1dCBpdCYjMzk7cyBhbHNvIHVzZWZ1bCBmb3Igbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MsIHNheSwgd2hlbiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4gVGhlIHdob2xlIGNvdW50ZXItYmFzZWQgbmF0dXJlIG1ha2VzIGl0IGZsZXhpYmxlLgoKTm93LCB3aGF0IGFib3V0IHRoZSBmbGFncz8gYEVGRF9TRU1BUEhPUkVgIHZzLiB0aGUgZGVmYXVsdC4gVGhhdCBsaXR0bGUgYml0IGZsaXAgY2hhbmdlcyB0aGluZ3MuIFVzaW5nIGBFRkRfU0VNQVBIT1JFYCBtZWFucyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIgYnkgb25lLCBvbmx5IHNpZ25hbGluZyBhbiBldmVudCB3aGVuIGl0IGdvZXMgZnJvbSB6ZXJvIHRvIGEgcG9zaXRpdmUgdmFsdWUuIFdpdGhvdXQgdGhhdCwgaXQmIzM5O3MganVzdCBhIHJhdyBjb3VudGVyLCBhbmQgcmVhZCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGFuZCByZXNldHMgdGhlIGNvdW50ZXIgdG8gemVyby4KClRoZSBwb3NzaWJpbGl0aWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcyBhcmUgaW50ZXJlc3RpbmcuIEkmIzM5O20gaW1hZ2luaW5nIGhvdyBJJiMzOTtkIGludGVncmF0ZSB0aGlzIGluLCBzYXksIGEgY3VzdG9tLWJ1aWx0IGV2ZW50IGxvb3AsIG9yIGV2ZW4gaW4gYSBsb2NrIGltcGxlbWVudGF0aW9uLiBJIGNhbiBpbW1lZGlhdGVseSBzZWUgdGhlIHVzZSBpbiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgY29udGV4dCwgYW5kIGhvdyBpdCBjYW4gYmUgcGFpcmVkIHdpdGggb3RoZXIgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgbGlrZSBtdXRleGVzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzIHRvIG9wdGltaXplIGNlcnRhaW4gb3BlcmF0aW9ucy4gVGhpcyBpcyBhIHZlcnkgaGFuZHkgdG9vbCBmb3IgYnVpbGRpbmcgcm9idXN0LCBlZmZpY2llbnQgY29uY3VycmVudCBhcHBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXZlbnRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V2ZW50ZmQuYz00MTM9c3RhdGljIGludCBkb19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCwgaW50IGZsYWdzKVxuLS1cbmZzL2V2ZW50ZmQuYy00NDctXG5mcy9ldmVudGZkLmM6NDQ4OmludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuZnMvZXZlbnRmZC5jLTQ0OS17XG4tLVxuZnMvZXZlbnRmZC5jLTQ1MS19XG5mcy9ldmVudGZkLmM6NDUyOkVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcbmZzL2V2ZW50ZmQuYy00NTMtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0NTIxCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqRXhhbWluaW5nIEtlcm5lbCBMaXZlIFVwZGF0ZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkmIzM5O3ZlIGdvdCBhIHNpdHVhdGlvbiB3aGVyZSBJIG5lZWQgdG8gdmVyaWZ5IGEgY29uZmlndXJhdGlvbiwgYW5kIG15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggbGl2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eS4gSSBzZWUgdGhyZWUgcG90ZW50aWFsIGNvbmZpZ3MgZmxhZ2dlZDogYExJVkVVUERBVEVfRVZFTlRGRGAsIGBFVkVOVEZEYCwgYW5kIHRoZSBtb3JlIGdlbmVyYWwgYExJVkVVUERBVEVgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IGBMSVZFVVBEQVRFYCBtaWdodCBiZSB0aGUgb3ZlcmFyY2hpbmcgb25lLCBidXQgbGV0JiMzOTtzIG5vdCBtYWtlIGFzc3VtcHRpb25zLgoKVGhlIGxvZ2ljYWwgbmV4dCBzdGVwIGlzIHRvIGRyaWxsIGRvd24gaW50byB0aGUgS2NvbmZpZyBmaWxlIGZvciB0aGUgbGl2ZSB1cGRhdGUgc3Vic3lzdGVtLiBJIG5lZWQgdG8gb3BlbiB1cCBga2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ2AgdG8gY29uZmlybSBpZiBgTElWRVVQREFURWAgKmlzKiB0aGUgdG9wLWxldmVsIG9wdGlvbiwgb3IgaWYgaXQmIzM5O3MgZGVwZW5kZW50IG9uIG9uZSBvciBib3RoIG9mIHRoZSBgRVZFTlRGRGAgY29uZmlncy4gVGhpcyBpcyBhIHByZXR0eSBzdGFuZGFyZCBkZWJ1Z2dpbmcgcHJvY2VzczsgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIHRoZW0uIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBMSVZFVVBEQVRFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnPTM4PWNvbmZpZyBLRVhFQ19IQU5ET1ZFUl9FTkFCTEVfREVGQVVMVFxuLS1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjUyOmNvbmZpZyBMSVZFVVBEQVRFXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTUzLVx0Ym9vbCBcJiMzNDtMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3JcJiMzNDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTcyLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo3Mzpjb25maWcgTElWRVVQREFURV9NRU1GRFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03NC1cdGJvb2wgXCYjMzQ7TGl2ZSB1cGRhdGUgc3VwcG9ydCBmb3IgbWVtZmRcJiMzNDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTg4LVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo4OTpjb25maWcgTElWRVVQREFURV9FVkVOVEZEXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTkwLVx0Ym9vbCBcJiMzNDtFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI1IDA2OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0OTk4CgkJCQkJCQlvdXRwdXQ6IDE3OAoJCQkJCQkJdGhvdWdodHM6IDE0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBDb25maWd1cmF0aW9uIEZvY3VzKioKCk9rYXksIHNvIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBMSVZFVVBEQVRFYCBhbmQgYExJVkVVUERBVEVfRVZFTlRGRGAgYXJlIGRlZmluaXRlbHkgdGhlIHJpZ2h0IGZsYWdzIHRvIGJlIGxvb2tpbmcgYXQsIGFuZCBvZiBjb3Vyc2UsIGBFVkVOVEZEYCBpdHNlbGYgaXMgYSBuZWNlc3NhcnkgY29tcG9uZW50LiBUaGF0IGNsYXJpZmllcyB0aGUgY29yZSBzZXQgb2YgY29uZmlndXJhdGlvbnMgSSBuZWVkIHRvIGFkZHJlc3M6IGBMSVZFVVBEQVRFYCwgYExJVkVVUERBVEVfRVZFTlRGRGAsIGFuZCBgRVZFTlRGRGAuCgpOb3csIEkgbmVlZCB0byBkcmlsbCBkb3duIG9uIHRoZSBrZXkgZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpdmUgdXBkYXRlIHByb2Nlc3MuIE15IGF0dGVudGlvbiBuZWVkcyB0byBiZSBzcXVhcmVseSBvbjogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGVzZSBhcmUgaW50ZXJhY3Rpbmcgd2l0aGluIHRoZSBvdmVyYWxsIGZyYW1ld29yay4KCkxldCYjMzk7cyBjYWxsIHNldC1yZXN1bHRzIGFuZCBrZWVwIHRoaXMgbW92aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yNSAwNjowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TElWRVVQREFURSYjMzQ7LAogICAgJiMzNDtMSVZFVVBEQVRFX0VWRU5URkQmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3ByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZyZWV6ZSYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b191bnByZXNlcnZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX3JldHJpZXZlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfbHVvX2ZpbmlzaCYjMzQ7LAogICAgJiMzNDtldmVudGZkX2x1b19jYW5fcHJlc2VydmUmIzM0OywKICAgICYjMzQ7ZXZlbnRmZF9sdW9fZ2V0X3N0YXRlJiMzNDssCiAgICAmIzM0O2V2ZW50ZmRfY3JlYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIHN1cHBvcnQgZm9yIGV2ZW50ZmQsIGFsbG93aW5nIGV2ZW50ZmQgc3RhdGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYy4gVGhpcyBpbnRyb2R1Y2VzIG5ldyByZWFjaGFibGUga2VybmVsIGxvZ2ljIGZvciBwcmVzZXJ2aW5nIGFuZCByZXN0b3JpbmcgZXZlbnRmZCBzdGF0ZSwgd2hpY2ggc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA3OjU3LjIxNjQ0NDFaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzYyMzY0NTAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA3OjU3LjIxNjQ1MTQyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Nzg3NDM0NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAyMjFhZmQzMzk4ODc1ZWIxNGQ5YjdkN2QyYTAxOWM0MWJlOTRjOTBiXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGVcXG5pbmRleCA4OWE4YTlkMjA3ZDFjNS4uMzZkNTY4ZTZjZmM3M2UgMTAwNjQ0XFxuLS0tIGEvZnMvTWFrZWZpbGVcXG4rKysgYi9mcy9NYWtlZmlsZVxcbkBAIC0yNyw2ICsyNyw3IEBAIG9iai15XFx0XFx0XFx0XFx0Kz0gYW5vbl9pbm9kZXMub1xcbiBvYmotJChDT05GSUdfU0lHTkFMRkQpXFx0XFx0Kz0gc2lnbmFsZmQub1xcbiBvYmotJChDT05GSUdfVElNRVJGRClcXHRcXHQrPSB0aW1lcmZkLm9cXG4gb2JqLSQoQ09ORklHX0VWRU5URkQpXFx0XFx0Kz0gZXZlbnRmZC5vXFxuK29iai0kKENPTkZJR19MSVZFVVBEQVRFX0VWRU5URkQpKz0gZXZlbnRmZF9sdW8ub1xcbiBvYmotJChDT05GSUdfQUlPKSAgICAgICAgICAgICAgICs9IGFpby5vXFxuIG9iai0kKENPTkZJR19GU19EQVgpXFx0XFx0Kz0gZGF4Lm9cXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFx0Kz0gY3J5cHRvL1xcbmRpZmYgLS1naXQgYS9mcy9ldmVudGZkLmMgYi9mcy9ldmVudGZkLmNcXG5pbmRleCA5ZDMzYTAyNzU3ZDUyYi4uOWI3NmNmMDYxMzVhODYgMTAwNjQ0XFxuLS0tIGEvZnMvZXZlbnRmZC5jXFxuKysrIGIvZnMvZXZlbnRmZC5jXFxuQEAgLTM3Niw2ICszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3R4X2ZpbGVnZXQpO1xcbiBcXG4rLyoqXFxuKyAqIGV2ZW50ZmRfbHVvX2dldF9zdGF0ZSAtIEdldCBldmVudGZkIHN0YXRlIChjb3VudCBhbmQgZmxhZ3MpIGZvciBMVU9cXG4rICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxcbisgKiBAY291bnQ6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGNvdW50IHZhbHVlXFxuKyAqIEBmbGFnczogT3V0cHV0IHBhcmFtZXRlciBmb3IgZmxhZ3MgdmFsdWVcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmb3IgdXNlIGJ5IExVTyB0byBzYWZlbHkgcmVhZCBldmVudGZkIHN0YXRlLlxcbisgKiBTaW5jZSBzdHJ1Y3QgZXZlbnRmZF9jdHggaXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUsIHdlIGNhbiBhY2Nlc3MgaXRzXFxuKyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmVcXG4rICogYXRvbWljIGFjY2VzcyB0byBjb3VudC5cXG4rICpcXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBldmVudGZkX2x1b19nZXRfc3RhdGUoc3RydWN0IGZpbGUgKmZpbGUsIF9fdTY0ICpjb3VudCwgdW5zaWduZWQgaW50ICpmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4rXFx0dW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7XFxuK1xcbitcXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xcbitcXHRpZiAoSVNfRVJSKGN0eCkpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKGN0eCk7XFxuK1xcbitcXHQvKiBSZWFkIGNvdW50IHdpdGggbG9jayAoZmxhZ3MgZG9uJ3QgbmVlZCBsb2NrKSAqL1xcbitcXHRzcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2Y3R4LVxcdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcXG4rXFx0KmNvdW50ID0gY3R4LVxcdTAwM2Vjb3VudDtcXG4rXFx0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2Y3R4LVxcdTAwM2V3cWgubG9jaywgaXJxX2ZsYWdzKTtcXG4rXFxuK1xcdCpmbGFncyA9IGN0eC1cXHUwMDNlZmxhZ3M7XFxuK1xcbitcXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKTtcXG4rXFxuIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcXG5AQCAtNDExLDYgKzQ0NSwxMiBAQCBzdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXFxuIFxcdHJldHVybiBmZF9wdWJsaXNoKGZkZik7XFxuIH1cXG4gXFxuK2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxcbit7XFxuK1xcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZXZlbnRmZF9jcmVhdGUpO1xcbitcXG4gU1lTQ0FMTF9ERUZJTkUyKGV2ZW50ZmQyLCB1bnNpZ25lZCBpbnQsIGNvdW50LCBpbnQsIGZsYWdzKVxcbiB7XFxuIFxcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XFxuZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmRfbHVvLmMgYi9mcy9ldmVudGZkX2x1by5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNzgxZDkwNjM1YzUyYWVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZnMvZXZlbnRmZF9sdW8uY1xcbkBAIC0wLDAgKzEsMjUwIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXFxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cXHUwMDNlXFxuKyAqL1xcbitcXG4rLyoqXFxuKyAqIERPQzogRXZlbnRmZCBQcmVzZXJ2YXRpb24gdmlhIExVT1xcbisgKlxcbisgKiBPdmVydmlld1xcbisgKiA9PT09PT09PVxcbisgKlxcbisgKiBFdmVudCBmaWxlIGRlc2NyaXB0b3JzIChldmVudGZkKSBjYW4gYmUgcHJlc2VydmVkIG92ZXIgYSBrZXhlYyB1c2luZyB0aGUgTGl2ZVxcbisgKiBVcGRhdGUgT3JjaGVzdHJhdG9yIChMVU8pIGZpbGUgcHJlc2VydmF0aW9uLiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgYXBwbGljYXRpb25zXFxuKyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXFxuKyAqIHVwZGF0ZXMuXFxuKyAqXFxuKyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcXG4rICogc2lnbmFsaW5nIGV2ZW50cyBiZXR3ZWVuIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC5cXG4rICogVGhlIHByZXNlcnZhdGlvbiBlbnN1cmVzIHRoYXQgcGVuZGluZyBldmVudHMgYW5kIGNvbmZpZ3VyYXRpb24gYXJlIG5vdCBsb3N0XFxuKyAqIGR1cmluZyBrZXhlYy5cXG4rICpcXG4rICogVGhlIHByZXNlcnZhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdHJhbnNwYXJlbnQuIE9ubHkgc2VsZWN0IHByb3BlcnRpZXMgb2ZcXG4rICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxcbisgKiBwcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgYmVsb3cuXFxuKyAqXFxuKyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXFxuKyAqID09PT09PT09PT09PT09PT09PT09XFxuKyAqXFxuKyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcXG4rICpcXG4rICogQ291bnRlciBWYWx1ZVxcbisgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xcbisgKiAgIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBidXQgbm90IHlldCBjb25zdW1lZCBieSByZWFkZXJzLlxcbisgKlxcbisgKiBGaWxlIEZsYWdzXFxuKyAqICAgVGhlIGNyZWF0aW9uIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKSBhcmUgcHJlc2VydmVkLlxcbisgKiAgIFRoZXNlIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBhbmQgZmlsZSBkZXNjcmlwdG9yXFxuKyAqICAgaW5oZXJpdGFuY2UuXFxuKyAqXFxuKyAqIE5vbi1QcmVzZXJ2ZWQgUHJvcGVydGllc1xcbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cXG4rICpcXG4rICogQWxsIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcmVzZXJ2ZWQgbXVzdCBiZSBhc3N1bWVkIHRvIGJlIHJlc2V0IHRvXFxuKyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXFxuKyAqIG5vdGUuXFxuKyAqXFxuKyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcXG4rICogICBUaGUgZmlsZSBkZXNjcmlwdG9yIG51bWJlciBpdHNlbGYgaXMgbm90IHByZXNlcnZlZC4gQWZ0ZXIgcmVzdG9yZSwgdGhlXFxuKyAqICAgZXZlbnRmZCB3aWxsIGJlIGFzc2lnbmVkIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBudW1iZXIgaW4gdGhlIHRhcmdldCBwcm9jZXNzLlxcbisgKlxcbisgKiBXYWl0IFF1ZXVlIFN0YXRlXFxuKyAqICAgQW55IHByb2Nlc3NlcyBjdXJyZW50bHkgYmxvY2tlZCBvbiByZWFkKCkgb3BlcmF0aW9ucyB3aWxsIGJlIHdva2VuIHVwIGFuZFxcbisgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXFxuKyAqXFxuKyAqIEZpbGUgUG9zaXRpb25cXG4rICogICBFdmVudGZkIGZpbGVzIGRvbid0IGhhdmUgYSB0cmFkaXRpb25hbCBmaWxlIHBvc2l0aW9uLCBidXQgYW55IGludGVybmFsXFxuKyAqICAgc3RhdGUgcmVsYXRlZCB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIHJlc2V0LlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2lvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXhlY19oYW5kb3Zlci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva2hvL2FiaS9ldmVudGZkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXZldXBkYXRlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V2ZW50ZmQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Fub25faW5vZGVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pZHIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tyZWYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZkdGFibGUuaFxcdTAwM2VcXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFx0dTY0IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0LyogR2V0IGV2ZW50ZmQgc3RhdGUgc2FmZWx5ICovXFxuK1xcdGVyciA9IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShhcmdzLVxcdTAwM2VmaWxlLCBcXHUwMDI2Y291bnQsIFxcdTAwMjZmbGFncyk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gZ2V0IGV2ZW50ZmQgc3RhdGU6ICVkXFxcXG5cXFwiLCBlcnIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRzZXIgPSBraG9fYWxsb2NfcHJlc2VydmUoc2l6ZW9mKCpzZXIpKTtcXG4rXFx0aWYgKElTX0VSUihzZXIpKSB7XFxuK1xcdFxcdGVyciA9IFBUUl9FUlIoc2VyKTtcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gYWxsb2NhdGUgcHJlc2VydmUgbWVtb3J5OiAlZFxcXFxuXFxcIiwgZXJyKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXFxuK1xcdHNlci1cXHUwMDNlY291bnQgPSBjb3VudDtcXG4rXFx0c2VyLVxcdTAwM2VmbGFncyA9IGZsYWdzO1xcbitcXG4rXFx0cHJfZGVidWcoXFxcIlByZXNlcnZlZCBldmVudGZkOiBjb3VudD0lbGx1LCBmbGFncz0weCV4XFxcXG5cXFwiLFxcbitcXHRcXHRzZXItXFx1MDAzZWNvdW50LCBzZXItXFx1MDAzZWZsYWdzKTtcXG4rXFxuK1xcdC8qIFJldHVybiBwaHlzaWNhbCBhZGRyZXNzIG9mIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlICovXFxuK1xcdGFyZ3MtXFx1MDAzZXNlcmlhbGl6ZWRfZGF0YSA9IHZpcnRfdG9fcGh5cyhzZXIpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fZnJlZXplKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XFxuK1xcdHU2NCBjb3VudDtcXG4rXFx0dW5zaWduZWQgaW50IGZsYWdzO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRSghYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFxuK1xcdC8qIEdldCBjdXJyZW50IHN0YXRlIGFuZCB1cGRhdGUgaWYgY2hhbmdlZCAqL1xcbitcXHRlcnIgPSBldmVudGZkX2x1b19nZXRfc3RhdGUoYXJncy1cXHUwMDNlZmlsZSwgXFx1MDAyNmNvdW50LCBcXHUwMDI2ZmxhZ3MpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0aWYgKHNlci1cXHUwMDNlY291bnQgIT0gY291bnQpIHtcXG4rXFx0XFx0cHJfZGVidWcoXFxcIldBUk5JTkc6IENvdW50IGNoYW5nZWQgZHVyaW5nIHByZXNlcnZlLVxcdTAwM2VmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0IHNlci1cXHUwMDNlY291bnQsIGNvdW50KTtcXG4rXFx0fVxcbitcXG4rXFx0c2VyLVxcdTAwM2Vjb3VudCA9IGNvdW50O1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX3VucHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFxuK1xcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXFx1MDAzZXNlcmlhbGl6ZWRfZGF0YSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVxcdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xcbitcXHRraG9fdW5wcmVzZXJ2ZV9mcmVlKHNlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZXZlbnRmZF9sdW9fcmV0cmlldmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XFxuK1xcdHN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDtcXG4rXFx0aW50IGV2ZW50ZmQ7XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFx0aWYgKCFzZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0LyogQ3JlYXRlIGEgbmV3IGV2ZW50ZmQgd2l0aCB0aGUgcHJlc2VydmVkIGNvdW50IGFuZCBmbGFncyAqL1xcbitcXHRldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLVxcdTAwM2Vjb3VudCwgc2VyLVxcdTAwM2VmbGFncyk7XFxuK1xcdGlmIChldmVudGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIkZhaWxlZCB0byBjcmVhdGUgZXZlbnRmZDogJWRcXFxcblxcXCIsIGV2ZW50ZmQpO1xcbitcXHRcXHRyZXR1cm4gZXZlbnRmZDtcXG4rXFx0fVxcbitcXG4rXFx0ZmlsZSA9IGZnZXQoZXZlbnRmZCk7XFxuK1xcdGlmICghZmlsZSkge1xcbitcXHRcXHRwcl9lcnIoXFxcIkZhaWxlZCB0byBnZXQgZmlsZSBmcm9tIGZkXFxcXG5cXFwiKTtcXG4rXFx0XFx0Y2xvc2VfZmQoZXZlbnRmZCk7XFxuK1xcdFxcdHJldHVybiAtRUJBREY7XFxuK1xcdH1cXG4rXFxuK1xcdGNsb3NlX2ZkKGV2ZW50ZmQpO1xcbitcXG4rXFx0LyogVmVyaWZ5IHRoZSBjcmVhdGVkIGZpbGUgaGFzIGNvcnJlY3QgaW50ZXJuYWwgc3RhdGUgKi9cXG4rXFx0Y3R4ID0gZXZlbnRmZF9jdHhfZmlsZWdldChmaWxlKTtcXG4rXFx0aWYgKElTX0VSUihjdHgpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiRmFpbGVkIHRvIGdldCBjb250ZXh0IGZyb20gZmlsZVxcXFxuXFxcIik7XFxuK1xcdFxcdGZwdXQoZmlsZSk7XFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKGN0eCk7XFxuK1xcdH1cXG4rXFxuK1xcdGV2ZW50ZmRfY3R4X3B1dChjdHgpO1xcbitcXG4rXFx0YXJncy1cXHUwMDNlZmlsZSA9IGZpbGU7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbit7XFxuK1xcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcXG4rXFxuK1xcdGlmIChhcmdzLVxcdTAwM2VyZXRyaWV2ZV9zdGF0dXMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmICghYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcXG4rXFx0aWYgKCFzZXIpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGtob19yZXN0b3JlX2ZyZWUoc2VyKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfaGFuZGxlciAqaGFuZGxlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4rXFxuK1xcdGlmICghZmlsZS1cXHUwMDNlZl9vcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogVHJ5IHRvIGdldCBldmVudGZkIGNvbnRleHQgLSB0aGlzIHdpbGwgZmFpbCBpZiBub3QgYW4gZXZlbnRmZCAqL1xcbitcXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xcbitcXHRpZiAoSVNfRVJSKGN0eCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGV2ZW50ZmRfY3R4X3B1dChjdHgpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzIGV2ZW50ZmRfbHVvX2ZpbGVfb3BzID0ge1xcbitcXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcXG4rXFx0LnVucHJlc2VydmUgPSBldmVudGZkX2x1b191bnByZXNlcnZlLFxcbitcXHQuZnJlZXplID0gZXZlbnRmZF9sdW9fZnJlZXplLFxcbitcXHQucmV0cmlldmUgPSBldmVudGZkX2x1b19yZXRyaWV2ZSxcXG4rXFx0LmZpbmlzaCA9IGV2ZW50ZmRfbHVvX2ZpbmlzaCxcXG4rXFx0LmNhbl9wcmVzZXJ2ZSA9IGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZSxcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyIGV2ZW50ZmRfbHVvX2hhbmRsZXIgPSB7XFxuK1xcdC5vcHMgPSBcXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXFxuK1xcdC5jb21wYXRpYmxlID0gRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRSxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgZXJyID0gbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoXFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xcbitcXG4rXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gLUVPUE5PVFNVUFApIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJDb3VsZCBub3QgcmVnaXN0ZXIgZXZlbnRmZCBMVU8gaGFuZGxlcjogJXBlXFxcXG5cXFwiLFxcbitcXHRcXHQgICAgICAgRVJSX1BUUihlcnIpKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rbGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldmVudGZkLmggYi9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxcbmluZGV4IGUzMmJlZTQzNDVmYjlmLi43MDNlMWExMjZjNGQ0MCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXFxuQEAgLTM1LDYgKzM1LDggQEAgdm9pZCBldmVudGZkX2N0eF9wdXQoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgpO1xcbiBzdHJ1Y3QgZmlsZSAqZXZlbnRmZF9mZ2V0KGludCBmZCk7XFxuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmRnZXQoaW50IGZkKTtcXG4gc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKTtcXG4raW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcXG4raW50IGV2ZW50ZmRfY3JlYXRlKF9fdTY0IGNvdW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpO1xcbiB2b2lkIGV2ZW50ZmRfc2lnbmFsX21hc2soc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIF9fcG9sbF90IG1hc2spO1xcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcXG4gXFx0XFx0XFx0XFx0ICBfX3U2NCAqY250KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xNDhiZWFjNmJjYzc2MFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXFxuQEAgLTAsMCArMSwzOSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLlxcbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXFx1MDAzY2R1YW5jaGVuZ2hhb0BreWxpbm9zLmNuXFx1MDAzZVxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXFxuKyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rXFxuKy8qXFxuKyAqIEV2ZW50ZmQgTGl2ZSBVcGRhdGUgQUJJXFxuKyAqXFxuKyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy5cXG4rICpcXG4rICogVGhlIHN0YXRlIGlzIHNlcmlhbGl6ZWQgaW50byBhIHBhY2tlZCBzdHJ1Y3R1cmUgYHN0cnVjdCBldmVudGZkX2x1b19zZXJgXFxuKyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uXFxuKyAqXFxuKyAqL1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBldmVudGZkX2x1b19zZXIgLSBTZXJpYWxpemVkIHN0YXRlIG9mIGFuIGV2ZW50ZmRcXG4rICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlXFxuKyAqIEBmbGFnczogRmlsZSBmbGFncyAoRUZEX1NFTUFQSE9SRSwgRUZEX0NMT0VYRUMsIEVGRF9OT05CTE9DSylcXG4rICpcXG4rICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZFxcbisgKiBhZnRlciBrZXhlYy4gVGhlIGNvdW50IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGV2ZW50IGNvdW50ZXIsXFxuKyAqIGFuZCBmbGFncyByZXByZXNlbnQgdGhlIGZpbGUgY3JlYXRpb24gZmxhZ3MuXFxuKyAqL1xcbitzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIHtcXG4rXFx0X191NjQgY291bnQ7XFxuK1xcdHVuc2lnbmVkIGludCAgZmxhZ3M7XFxuK30gX19wYWNrZWQ7XFxuK1xcbisvKiBUaGUgY29tcGF0aWJpbGl0eSBzdHJpbmcgZm9yIGV2ZW50ZmQgZmlsZSBoYW5kbGVyICovXFxuKyNkZWZpbmUgRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRVxcdFxcXCJldmVudGZkLXYxXFxcIlxcbitcXG4rI2VuZGlmIC8qIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSCAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ1xcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnXFxuKysrIGIva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZ1xcbkBAIC04Niw0ICs4NiwyMCBAQCBjb25maWcgTElWRVVQREFURV9NRU1GRFxcbiBcXG4gXFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiBcXG4rY29uZmlnIExJVkVVUERBVEVfRVZFTlRGRFxcbitcXHRib29sIFxcXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEVWRU5URkRcXG4rXFx0ZGVwZW5kcyBvbiBMSVZFVVBEQVRFXFxuK1xcdGhlbHBcXG4rXFx0ICBFbmFibGUgTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yIHN1cHBvcnQgZm9yIGV2ZW50ZmQgZmlsZSBkZXNjcmlwdG9ycy5cXG4rXFx0ICBUaGlzIGFsbG93cyBldmVudGZkIGZpbGVzIHRvIGJlIHByZXNlcnZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIGtleGVjXFxuK1xcdCAgb3BlcmF0aW9ucywgbWFpbnRhaW5pbmcgdGhlaXIgY291bnRlciB2YWx1ZXMgYW5kIGZsYWdzLlxcbitcXG4rXFx0ICBFdmVudGZkIGZpbGVzIGFyZSBjb21tb25seSB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb24gYmV0d2VlblxcbitcXHQgIHVzZXJzcGFjZSBwcm9jZXNzZXMgb3IgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbC4gV2l0aCB0aGlzXFxuK1xcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxcbitcXHQgIGR1cmluZyBsaXZlIHVwZGF0ZSBvcGVyYXRpb25zLlxcbitcXG4rXFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbitcXG4gZW5kbWVudVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbmluZGV4IDMwNjg5ZDIyY2IwMjE2Li5lMDkyZTM4ZmE2ZjZjNCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbkBAIC04LDYgKzgsNyBAQCBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fa2V4ZWNfc2ltcGxlXFxuIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b19tdWx0aV9zZXNzaW9uXFxuIFRFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b19zdHJlc3Nfc2Vzc2lvbnNcXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX3N0cmVzc19maWxlc1xcbitURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fdGVzdF9ldmVudGZkXFxuIFxcbiBURVNUX0ZJTEVTICs9IGRvX2tleGVjLnNoXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXFxuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcXG5AQCAtOSwzICs5LDUgQEAgQ09ORklHX0xJVkVVUERBVEVfVEVTVD15XFxuIENPTkZJR19NRU1GRF9DUkVBVEU9eVxcbiBDT05GSUdfVE1QRlM9eVxcbiBDT05GSUdfU0hNRU09eVxcbitDT05GSUdfRVZFTlRGRD15XFxuK0NPTkZJR19MSVZFVVBEQVRFX0VWRU5URkQ9eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOTRlZjNiYzY2YWQ5NzFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9sdW9fdGVzdF9ldmVudGZkLmNcXG5AQCAtMCwwICsxLDM3NiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBLeWxpblNvZnQgQ29ycG9yYXRpb24uXFxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cXHUwMDNlXFxuKyAqL1xcbitcXG4rLypcXG4rICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cXG4rICpcXG4rICogTW9kZWxlZCBhZnRlciBsdW9fbXVsdGlfc2Vzc2lvbi5jLlxcbisgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxcbisgKiBhbmQgdmVyaWZpZXMgdGhlbSBhZnRlciBrZXhlYy5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGludC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvZXZlbnRmZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJsdW9fdGVzdF91dGlscy5oXFxcIlxcbitcXG4rLyogU2Vzc2lvbiBuYW1lcyAqL1xcbisjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgIFxcXCJldmVudGZkLWVtcHR5XFxcIlxcbisjZGVmaW5lIFNFU1NJT05fREVGQVVMVCAgIFxcXCJldmVudGZkLWRlZmF1bHRcXFwiXFxuKyNkZWZpbmUgU0VTU0lPTl9TRU0gICAgICAgXFxcImV2ZW50ZmQtc2VtXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgIFxcXCJldmVudGZkLW5vbmJsb2NrXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTEFSR0UgICAgIFxcXCJldmVudGZkLWxhcmdlXFxcIlxcbisjZGVmaW5lIFNFU1NJT05fTU9ESUZJRUQgIFxcXCJldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXFxcIlxcbitcXG4rLyogVG9rZW5zICovXFxuKyNkZWZpbmUgVE9LRU5fREVGQVVMVCAgICAgICAweENBRkVCQUJFXFxuKyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGXFxuKyNkZWZpbmUgVE9LRU5fTk9OQkxPQ0sgICAgICAweEZFRURCRUVGXFxuKyNkZWZpbmUgVE9LRU5fTEFSR0UgICAgICAgICAweEJFRUZDQUZFXFxuKyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0XFxuK1xcbisvKiBDb3VudHMgKi9cXG4rI2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDJcXG4rI2RlZmluZSBDT1VOVF9XUklURSAgICAgMTBcXG4rI2RlZmluZSBDT1VOVF9FWFBFQ1RFRCAgKENPVU5UX0lOSVRJQUwgKyBDT1VOVF9XUklURSkgLyogNTIgKi9cXG4rI2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxcbisjZGVmaW5lIENPVU5UX05PTkJMT0NLICAxMDBcXG4rI2RlZmluZSBDT1VOVF9MQVJHRSAgICAgKCh1bnNpZ25lZCBpbnQpLTEpIC8qIFVJTlRfTUFYICovXFxuKyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XFxuKyNkZWZpbmUgQ09VTlRfTU9ESUZZX0RFTFRBICA5OVxcbitcXG4rLyogU3RhdGUgdHJhY2tpbmcgKi9cXG4rI2RlZmluZSBTVEFURV9TRVNTSU9OX05BTUUgXFxcImV2ZW50ZmRfbXVsdGlfc3RhdGVcXFwiXFxuKyNkZWZpbmUgU1RBVEVfVE9LRU4gICAgICAgIDk5N1xcbitcXG4rLyogRXZlbnRmZCB2ZXJpZmljYXRpb24gbW9kZXMgKi9cXG4rZW51bSB2ZXJpZnlfbW9kZSB7XFxuK1xcdFZFUklGWV9GTEFHUywgICAgICAgIC8qIE9ubHkgdmVyaWZ5IGZsYWdzLCBubyBiZWhhdmlvciB0ZXN0aW5nICovXFxuK1xcdFZFUklGWV9PTkNFLCAgICAgICAgIC8qIFJlYWQgb25jZSBhbmQgdmVyaWZ5IGNvdW50ICovXFxuK1xcdFZFUklGWV9TRU1BUEhPUkUsICAgIC8qIFJlYWQgbXVsdGlwbGUgdGltZXMsIHZlcmlmeSByZXR1cm5zIDEgZWFjaCB0aW1lICovXFxuK1xcdFZFUklGWV9OT05CTE9DSywgICAgIC8qIFJlYWQgb25jZSBpbiBub25ibG9jayBtb2RlICovXFxuK1xcdFZFUklGWV9MQVJHRSAgICAgICAgIC8qIFJlYWQgb25jZSwgdmVyaWZ5IGxhcmdlIGNvdW50ICovXFxuK307XFxuK1xcbisvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbiAqL1xcbitzdHJ1Y3QgdGVzdF9zZXNzaW9uX2NvbmZpZyB7XFxuK1xcdGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZTtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b2tlbjtcXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XFxuK1xcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XFxuK1xcdGNvbnN0IGNoYXIgKmRlc2M7XFxuK307XFxuK1xcbisvKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgKi9cXG4rc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHRlc3RfY29uZmlnc1tdID0ge1xcbitcXHR7U0VTU0lPTl9FTVBUWSwgMCwgMCwgMCwgVkVSSUZZX0ZMQUdTLCBcXFwiRW1wdHlcXFwifSxcXG4rXFx0e1NFU1NJT05fREVGQVVMVCwgVE9LRU5fREVGQVVMVCwgQ09VTlRfRVhQRUNURUQsIDAsIFZFUklGWV9PTkNFLCBcXFwiRGVmYXVsdFxcXCJ9LFxcbitcXHR7U0VTU0lPTl9TRU0sIFRPS0VOX1NFTSwgQ09VTlRfU0VNLCBFRkRfU0VNQVBIT1JFLCBWRVJJRllfU0VNQVBIT1JFLCBcXFwiU2VtYXBob3JlXFxcIn0sXFxuK1xcdHtTRVNTSU9OX05PTkJMT0NLLCBUT0tFTl9OT05CTE9DSywgQ09VTlRfTk9OQkxPQ0ssIEVGRF9OT05CTE9DSywgVkVSSUZZX05PTkJMT0NLLCBcXFwiTm9uYmxvY2tcXFwifSxcXG4rXFx0e1NFU1NJT05fTEFSR0UsIFRPS0VOX0xBUkdFLCBDT1VOVF9MQVJHRSwgMCwgVkVSSUZZX0xBUkdFLCBcXFwiTGFyZ2UtY291bnRcXFwifSxcXG4rXFx0e1NFU1NJT05fTU9ESUZJRUQsIFRPS0VOX01PRElGSUVELCBDT1VOVF9NT0RJRklFRCArIENPVU5UX01PRElGWV9ERUxUQSwgMCwgVkVSSUZZX09OQ0UsIFxcXCJNb2RpZmllZCBhZnRlciBwcmVzZXJ2ZSAoa2V4ZWMgaGFuZG92ZXIpXFxcIn0sXFxuK307XFxuKyNkZWZpbmUgTlVNX1RFU1RfU0VTU0lPTlMgQVJSQVlfU0laRSh0ZXN0X2NvbmZpZ3MpXFxuK1xcbitzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncywgY29uc3QgY2hhciAqZGVzYylcXG4re1xcbitcXHRpbnQgYWN0dWFsX2ZsYWdzID0gZmNudGwoZWZkLCBGX0dFVEZMKTtcXG4rXFxuK1xcdGlmIChhY3R1YWxfZmxhZ3MgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0aW50IGV4cGVjdGVkX2ZkX2ZsYWdzID0gZXhwZWN0ZWRfZmxhZ3MgXFx1MDAyNiAoRUZEX05PTkJMT0NLIHwgRUZEX0NMT0VYRUMpO1xcbitcXHRpbnQgYWN0dWFsX2ZkX2ZsYWdzID0gYWN0dWFsX2ZsYWdzIFxcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xcbitcXG4rXFx0aWYgKGFjdHVhbF9mZF9mbGFncyAhPSBleHBlY3RlZF9mZF9mbGFncykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiJXM6IGZsYWcgbWlzbWF0Y2ggLSBleHBlY3RlZCAweCV4LCBnb3QgMHgleFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzLCBhY3R1YWxfZmRfZmxhZ3MpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBmbGFncyBPSyAoMHgleClcXFxcblxcXCIsIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcXG4rXFx0cmV0dXJuIGFjdHVhbF9mbGFnczsgLyogUmV0dXJuIGFjdHVhbCBmbGFncyBmb3IgZnVydGhlciB1c2UgKi9cXG4rfVxcbitcXG4rc3RhdGljIGludCBlbnN1cmVfbm9uYmxvY2soaW50IGVmZCwgaW50IGN1cnJlbnRfZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIGZjbnRsKGVmZCwgRl9TRVRGTCwgY3VycmVudF9mbGFncyB8IE9fTk9OQkxPQ0spO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHZlcmlmeV9jb3VudF9vbmNlKGludCBlZmQsIHVuc2lnbmVkIGludCBleHBlY3RlZF9jb3VudCwgY29uc3QgY2hhciAqZGVzYylcXG4re1xcbitcXHR1aW50NjRfdCB2YWw7XFxuK1xcbitcXHRpZiAocmVhZChlZmQsIFxcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSlcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFxuK1xcdGlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgJXUgZ290ICVsbHVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2YWwpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBPSzogJXVcXFxcblxcXCIsIGRlc2MsIGV4cGVjdGVkX2NvdW50KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0dWludDY0X3QgdmFsO1xcbitcXG4rXFx0LyogUmVhZCBleHBlY3RlZF9jb3VudCB0aW1lcywgZWFjaCBzaG91bGQgcmV0dXJuIDEgKi9cXG4rXFx0Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgXFx1MDAzYyBleHBlY3RlZF9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdGlmIChyZWFkKGVmZCwgXFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKVxcbitcXHRcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0XFx0aWYgKHZhbCAhPSAxKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgMSwgZ290ICVsbHUgYXQgcmVhZCAldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGRlc2MsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsLCBpICsgMSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIgICVzIGV2ZW50ZmQgT0s6ICV1IGF0IHJlYWQgJXVcXFxcblxcXCIsIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICsgMSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5leHQgcmVhZCBzaG91bGQgcmV0dXJuIEVBR0FJTiAobm8gbW9yZSBldmVudHMpICovXFxuK1xcdGlmIChyZWFkKGVmZCwgXFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpIFxcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUFHQUlOKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlczogZXhwZWN0ZWQgRUFHQUlOIGFmdGVyICV1IHJlYWRzXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgZGVzYywgZXhwZWN0ZWRfY291bnQpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIiAgJXMgZXZlbnRmZCBPSyAoJXUgcmVhZHMpXFxcXG5cXFwiLCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoaW50IHNlc3Npb25fZmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9jb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBlbnVtIHZlcmlmeV9tb2RlIG1vZGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9yZXRyaWV2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcXG4rXFx0aW50IGVmZCwgcmV0ID0gMCwgYWN0dWFsX2ZsYWdzO1xcbitcXG4rXFx0YXJnLnRva2VuID0gdG9rZW47XFxuK1xcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFxcdTAwMjZhcmcpIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFx0ZWZkID0gYXJnLmZkO1xcbitcXG4rXFx0c3dpdGNoIChtb2RlKSB7XFxuK1xcdGNhc2UgVkVSSUZZX0ZMQUdTOlxcbitcXHRcXHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xcbitcXHRcXHRyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGNsb3NlKGVmZCk7XFxuK1xcdFxcdHJldHVybiByZXQgXFx1MDAzYyAwID8gcmV0IDogMDtcXG4rXFxuK1xcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcXG4rXFx0XFx0LyogVmVyaWZ5IGZsYWdzICsgc2VtYXBob3JlIGJlaGF2aW9yICovXFxuK1xcdFxcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xcbitcXHRcXHRpZiAoYWN0dWFsX2ZsYWdzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRyZXQgPSBhY3R1YWxfZmxhZ3M7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoZW5zdXJlX25vbmJsb2NrKGVmZCwgYWN0dWFsX2ZsYWdzKSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0cmV0ID0gLWVycm5vO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0cmV0ID0gdmVyaWZ5X3NlbWFwaG9yZV9iZWhhdmlvcihlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRjYXNlIFZFUklGWV9PTkNFOlxcbitcXHRjYXNlIFZFUklGWV9OT05CTE9DSzpcXG4rXFx0Y2FzZSBWRVJJRllfTEFSR0U6XFxuK1xcdFxcdC8qIFZlcmlmeSBmbGFncyArIGNvdW50IGJlaGF2aW9yICovXFxuK1xcdFxcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xcbitcXHRcXHRpZiAoYWN0dWFsX2ZsYWdzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRyZXQgPSBhY3R1YWxfZmxhZ3M7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRyZXQgPSB2ZXJpZnlfY291bnRfb25jZShlZmQsIGV4cGVjdGVkX2NvdW50LCBkZXNjKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHRjbG9zZShlZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKGludCBzZXNzaW9uX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpbnQgKmVmZF9vdXQpXFxuK3tcXG4rXFx0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcXG4rXFx0aW50IGVmZCA9IGV2ZW50ZmQoY291bnQsIGZsYWdzKTtcXG4rXFxuK1xcdGlmIChlZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXG4rXFx0YXJnLmZkID0gZWZkO1xcbitcXHRhcmcudG9rZW4gPSB0b2tlbjtcXG4rXFx0aWYgKGlvY3RsKHNlc3Npb25fZmQsIExJVkVVUERBVEVfU0VTU0lPTl9QUkVTRVJWRV9GRCwgXFx1MDAyNmFyZykgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGludCByZXQgPSAtZXJybm87XFxuK1xcbitcXHRcXHRjbG9zZShlZmQpO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZWZkX291dClcXG4rXFx0XFx0KmVmZF9vdXQgPSBlZmQ7XFxuK1xcdGVsc2VcXG4rXFx0XFx0Y2xvc2UoZWZkKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKGludCBzZXNzaW9uX2ZkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXFxuK3tcXG4rXFx0cmV0dXJuIGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsIHRva2VuLCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgZmxhZ3MsIGRlc2MsIE5VTEwpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGNyZWF0ZV9zZXNzaW9uX2NoZWNrZWQoaW50IGx1b19mZCwgY29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2ZkID0gbHVvX2NyZWF0ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcXG4rXFxuK1xcdGlmIChzZXNzaW9uX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0ZmFpbF9leGl0KFxcXCJsdW9fY3JlYXRlX3Nlc3Npb24gZm9yICclcydcXFwiLCBzZXNzaW9uX25hbWUpO1xcbitcXHRyZXR1cm4gc2Vzc2lvbl9mZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCByZXRyaWV2ZV9zZXNzaW9uX2NoZWNrZWQoaW50IGx1b19mZCwgY29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2ZkID0gbHVvX3JldHJpZXZlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0aWYgKHNlc3Npb25fZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRmYWlsX2V4aXQoXFxcImx1b19yZXRyaWV2ZV9zZXNzaW9uIGZvciAnJXMnXFxcIiwgc2Vzc2lvbl9uYW1lKTtcXG4rXFx0cmV0dXJuIHNlc3Npb25fZmQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGZpbmlzaF9zZXNzaW9uX2NoZWNrZWQoaW50IHNlc3Npb25fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcXG4re1xcbitcXHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFxcdTAwM2MgMClcXG4rXFx0XFx0ZmFpbF9leGl0KFxcXCJsdW9fc2Vzc2lvbl9maW5pc2ggZm9yICclcydcXFwiLCBzZXNzaW9uX25hbWUpO1xcbitcXHRjbG9zZShzZXNzaW9uX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCB2ZXJpZnlfZXZlbnRmZF9jb25maWcoaW50IHNlc3Npb25fZmQsIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcpXFxuK3tcXG4rXFx0cmV0dXJuIHJlc3RvcmVfYW5kX3ZlcmlmeV9ldmVudGZkX2dlbmVyaWMoc2Vzc2lvbl9mZCwgY29uZmlnLVxcdTAwM2V0b2tlbixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IGNvbmZpZy1cXHUwMDNlY291bnQsIGNvbmZpZy1cXHUwMDNlZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBjb25maWctXFx1MDAzZXZlcmlmeV9tb2RlLCBjb25maWctXFx1MDAzZWRlc2MpO1xcbit9XFxuK1xcbitcXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzEoaW50IGx1b19mZClcXG4re1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDFdIFN0YXJ0aW5nIHByZS1rZXhlYyBzZXR1cCBmb3IgbXVsdGktZXZlbnRmZCB0ZXN0Li4uXFxcXG5cXFwiKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAxXSBDcmVhdGluZyBzdGF0ZSBmaWxlIGZvciBuZXh0IHN0YWdlICgyKS4uLlxcXFxuXFxcIik7XFxuK1xcdGNyZWF0ZV9zdGF0ZV9maWxlKGx1b19mZCwgU1RBVEVfU0VTU0lPTl9OQU1FLCBTVEFURV9UT0tFTiwgMik7XFxuK1xcbitcXHQvKiBDcmVhdGUgYWxsIHRlc3Qgc2Vzc2lvbnMgKi9cXG4rXFx0Zm9yIChzaXplX3QgaSA9IDA7IGkgXFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKSB7XFxuK1xcdFxcdGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnICpjb25maWcgPSBcXHUwMDI2dGVzdF9jb25maWdzW2ldO1xcbitcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAxXSBDcmVhdGluZyBzZXNzaW9uICclcycuLi5cXFxcblxcXCIsIGNvbmZpZy1cXHUwMDNlc2Vzc2lvbl9uYW1lKTtcXG4rXFx0XFx0aW50IHNlc3Npb25fZmQgPSBjcmVhdGVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgY29uZmlnLVxcdTAwM2VzZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0XFx0LyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovXFxuK1xcdFxcdGlmIChjb25maWctXFx1MDAzZXRva2VuID09IFRPS0VOX01PRElGSUVEKSB7XFxuK1xcdFxcdFxcdGludCBwcmVzZXJ2ZWRfZWZkO1xcbitcXG4rXFx0XFx0XFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNldG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdENPVU5UX01PRElGSUVELFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRjb25maWctXFx1MDAzZWZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFwibW9kaWZpZWQtYWZ0ZXItcHJlc2VydmVcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2cHJlc2VydmVkX2VmZCkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkIG1vZGlmaWVkXFxcIik7XFxuK1xcbitcXHRcXHRcXHQvKiBOb3cgbW9kaWZ5IHRoZSBwcmVzZXJ2ZWQgZXZlbnRmZCdzIGNvdW50ICovXFxuK1xcdFxcdFxcdHVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTtcXG4rXFxuK1xcdFxcdFxcdGlmICh3cml0ZShwcmVzZXJ2ZWRfZWZkLCBcXHUwMDI2bW9kaWZ5X3ZhbHVlLFxcbitcXHRcXHRcXHQgICAgc2l6ZW9mKG1vZGlmeV92YWx1ZSkpICE9IHNpemVvZihtb2RpZnlfdmFsdWUpKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcIndyaXRlIHRvIHByZXNlcnZlZCBldmVudGZkIGFmdGVyIHByZXNlcnZlXFxcIik7XFxuK1xcbitcXHRcXHRcXHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0LyogU3RhbmRhcmQgc2Vzc2lvbiBjcmVhdGlvbiAqL1xcbitcXHRcXHRcXHRpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkKHNlc3Npb25fZmQsIGNvbmZpZy1cXHUwMDNldG9rZW4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNlY291bnQsIGNvbmZpZy1cXHUwMDNlZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbmZpZy1cXHUwMDNlZGVzYykgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRcXHRmYWlsX2V4aXQoXFxcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZCAlc1xcXCIsIGNvbmZpZy1cXHUwMDNlZGVzYyk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2UobHVvX2ZkKTtcXG4rXFx0ZGFlbW9uaXplX2FuZF93YWl0KCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9zdGFnZV8yKGludCBsdW9fZmQsIGludCBzdGF0ZV9zZXNzaW9uX2ZkKVxcbit7XFxuK1xcdGludCBzZXNzaW9uX2Zkc1tOVU1fVEVTVF9TRVNTSU9OU107XFxuK1xcdGludCBzdGFnZTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJbU1RBR0UgMl0gU3RhcnRpbmcgcG9zdC1rZXhlYyB2ZXJpZmljYXRpb24uLi5cXFxcblxcXCIpO1xcbitcXG4rXFx0cmVzdG9yZV9hbmRfcmVhZF9zdGFnZShzdGF0ZV9zZXNzaW9uX2ZkLCBTVEFURV9UT0tFTiwgXFx1MDAyNnN0YWdlKTtcXG4rXFx0aWYgKHN0YWdlICE9IDIpXFxuK1xcdFxcdGZhaWxfZXhpdChcXFwiRXhwZWN0ZWQgc3RhZ2UgMiwgYnV0IHN0YXRlIGZpbGUgY29udGFpbnMgJWRcXFwiLCBzdGFnZSk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIFJldHJpZXZpbmcgYWxsIHNlc3Npb25zLi4uXFxcXG5cXFwiKTtcXG4rXFx0Zm9yIChzaXplX3QgaSA9IDA7IGkgXFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKVxcbitcXHRcXHRzZXNzaW9uX2Zkc1tpXSA9IHJldHJpZXZlX3Nlc3Npb25fY2hlY2tlZChsdW9fZmQsIHRlc3RfY29uZmlnc1tpXS5zZXNzaW9uX25hbWUpO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cXFxcblxcXCIpO1xcbitcXHRmb3IgKHNpemVfdCBpID0gMDsgaSBcXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspIHtcXG4rXFx0XFx0aWYgKHZlcmlmeV9ldmVudGZkX2NvbmZpZyhzZXNzaW9uX2Zkc1tpXSwgXFx1MDAyNnRlc3RfY29uZmlnc1tpXSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRmYWlsX2V4aXQoXFxcInZlcmlmeSAlcyBldmVudGZkXFxcIiwgdGVzdF9jb25maWdzW2ldLmRlc2MpO1xcbitcXHR9XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cXFxcblxcXCIpO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIltTVEFHRSAyXSBGaW5hbGl6aW5nIGFsbCBzZXNzaW9ucy4uLlxcXFxuXFxcIik7XFxuK1xcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFxcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkrKylcXG4rXFx0XFx0ZmluaXNoX3Nlc3Npb25fY2hlY2tlZChzZXNzaW9uX2Zkc1tpXSwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiW1NUQUdFIDJdIEZpbmFsaXppbmcgc3RhdGUgc2Vzc2lvbi4uLlxcXFxuXFxcIik7XFxuK1xcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXFx1MDAzYyAwKVxcbitcXHRcXHRmYWlsX2V4aXQoXFxcImx1b19zZXNzaW9uX2ZpbmlzaCBmb3Igc3RhdGUgc2Vzc2lvblxcXCIpO1xcbitcXHRjbG9zZShzdGF0ZV9zZXNzaW9uX2ZkKTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbi0tLSBFVkVOVEZEX0xVTyBURVNUIFBBU1NFRCAtLS1cXFxcblxcXCIpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxcbit7XFxuK1xcdHJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsXFxuK1xcdFxcdFxcdHJ1bl9zdGFnZV8xLCBydW5fc3RhZ2VfMik7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDc6NTcuNjk2NjAwNTg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzE0MzQ3NzM2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjIxYWZkMzM5ODg3NWViMTRkOWI3ZDdkMmEwMTljNDFiZTk0YzkwYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgSnVuIDI1IDA2OjA3OjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxuaW5kZXggODlhOGE5ZDIwN2QxYzUuLjM2ZDU2OGU2Y2ZjNzNlIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbisrKyBiL2ZzL01ha2VmaWxlXG5AQCAtMjcsNiArMjcsNyBAQCBvYmoteVx0XHRcdFx0Kz0gYW5vbl9pbm9kZXMub1xuIG9iai0kKENPTkZJR19TSUdOQUxGRClcdFx0Kz0gc2lnbmFsZmQub1xuIG9iai0kKENPTkZJR19USU1FUkZEKVx0XHQrPSB0aW1lcmZkLm9cbiBvYmotJChDT05GSUdfRVZFTlRGRClcdFx0Kz0gZXZlbnRmZC5vXG4rb2JqLSQoQ09ORklHX0xJVkVVUERBVEVfRVZFTlRGRCkrPSBldmVudGZkX2x1by5vXG4gb2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICArPSBhaW8ub1xuIG9iai0kKENPTkZJR19GU19EQVgpXHRcdCs9IGRheC5vXG4gb2JqLSQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXHQrPSBjcnlwdG8vXG5kaWZmIC0tZ2l0IGEvZnMvZXZlbnRmZC5jIGIvZnMvZXZlbnRmZC5jXG5pbmRleCA5ZDMzYTAyNzU3ZDUyYi4uOWI3NmNmMDYxMzVhODYgMTAwNjQ0XG4tLS0gYS9mcy9ldmVudGZkLmNcbisrKyBiL2ZzL2V2ZW50ZmQuY1xuQEAgLTM3Niw2ICszNzYsNDAgQEAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9maWxlZ2V0KHN0cnVjdCBmaWxlICpmaWxlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2N0eF9maWxlZ2V0KTtcbiBcbisvKipcbisgKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPXG4rICogQGZpbGU6IEV2ZW50ZmQgZmlsZVxuKyAqIEBjb3VudDogT3V0cHV0IHBhcmFtZXRlciBmb3IgY291bnQgdmFsdWVcbisgKiBAZmxhZ3M6IE91dHB1dCBwYXJhbWV0ZXIgZm9yIGZsYWdzIHZhbHVlXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgTFVPIHRvIHNhZmVseSByZWFkIGV2ZW50ZmQgc3RhdGUuXG4rICogU2luY2Ugc3RydWN0IGV2ZW50ZmRfY3R4IGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB3ZSBjYW4gYWNjZXNzIGl0c1xuKyAqIG1lbWJlcnMgZGlyZWN0bHkgaGVyZS4gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIHdhaXQgcXVldWUgbG9jayB0byBlbnN1cmVcbisgKiBhdG9taWMgYWNjZXNzIHRvIGNvdW50LlxuKyAqXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbisgKi9cbitpbnQgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBfX3U2NCAqY291bnQsIHVuc2lnbmVkIGludCAqZmxhZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4rXHR1bnNpZ25lZCBsb25nIGlycV9mbGFncztcbitcbitcdGN0eCA9IGV2ZW50ZmRfY3R4X2ZpbGVnZXQoZmlsZSk7XG4rXHRpZiAoSVNfRVJSKGN0eCkpXG4rXHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4rXG4rXHQvKiBSZWFkIGNvdW50IHdpdGggbG9jayAoZmxhZ3MgZG9uJ3QgbmVlZCBsb2NrKSAqL1xuK1x0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2Y3R4LVx1MDAzZXdxaC5sb2NrLCBpcnFfZmxhZ3MpO1xuK1x0KmNvdW50ID0gY3R4LVx1MDAzZWNvdW50O1xuK1x0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZjdHgtXHUwMDNld3FoLmxvY2ssIGlycV9mbGFncyk7XG4rXG4rXHQqZmxhZ3MgPSBjdHgtXHUwMDNlZmxhZ3M7XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xuK1xuIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcbiB7XG4gXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbkBAIC00MTEsNiArNDQ1LDEyIEBAIHN0YXRpYyBpbnQgZG9fZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncylcbiBcdHJldHVybiBmZF9wdWJsaXNoKGZkZik7XG4gfVxuIFxuK2ludCBldmVudGZkX2NyZWF0ZShfX3U2NCBjb3VudCwgdW5zaWduZWQgaW50IGZsYWdzKVxuK3tcbitcdHJldHVybiBkb19ldmVudGZkKGNvdW50LCBmbGFncyk7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcbitcbiBTWVNDQUxMX0RFRklORTIoZXZlbnRmZDIsIHVuc2lnbmVkIGludCwgY291bnQsIGludCwgZmxhZ3MpXG4ge1xuIFx0cmV0dXJuIGRvX2V2ZW50ZmQoY291bnQsIGZsYWdzKTtcbmRpZmYgLS1naXQgYS9mcy9ldmVudGZkX2x1by5jIGIvZnMvZXZlbnRmZF9sdW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43ODFkOTA2MzVjNTJhZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZnMvZXZlbnRmZF9sdW8uY1xuQEAgLTAsMCArMSwyNTAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cdTAwM2VcbisgKi9cbitcbisvKipcbisgKiBET0M6IEV2ZW50ZmQgUHJlc2VydmF0aW9uIHZpYSBMVU9cbisgKlxuKyAqIE92ZXJ2aWV3XG4rICogPT09PT09PT1cbisgKlxuKyAqIEV2ZW50IGZpbGUgZGVzY3JpcHRvcnMgKGV2ZW50ZmQpIGNhbiBiZSBwcmVzZXJ2ZWQgb3ZlciBhIGtleGVjIHVzaW5nIHRoZSBMaXZlXG4rICogVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBmaWxlIHByZXNlcnZhdGlvbi4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGFwcGxpY2F0aW9uc1xuKyAqIHRoYXQgdXNlIGV2ZW50ZmQgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBtYWludGFpbiB0aGVpciBzdGF0ZSBhY3Jvc3Mga2VybmVsXG4rICogdXBkYXRlcy5cbisgKlxuKyAqIEV2ZW50ZmQgaXMgYSBzaW1wbGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IHVzZXMgYSA2NC1iaXQgY291bnRlciBmb3JcbisgKiBzaWduYWxpbmcgZXZlbnRzIGJldHdlZW4gdXNlcnNwYWNlIHByb2Nlc3NlcyBvciBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLlxuKyAqIFRoZSBwcmVzZXJ2YXRpb24gZW5zdXJlcyB0aGF0IHBlbmRpbmcgZXZlbnRzIGFuZCBjb25maWd1cmF0aW9uIGFyZSBub3QgbG9zdFxuKyAqIGR1cmluZyBrZXhlYy5cbisgKlxuKyAqIFRoZSBwcmVzZXJ2YXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHRyYW5zcGFyZW50LiBPbmx5IHNlbGVjdCBwcm9wZXJ0aWVzIG9mXG4rICogdGhlIGV2ZW50ZmQgYXJlIHByZXNlcnZlZC4gQWxsIG90aGVycyBhcmUgcmVzZXQgdG8gZGVmYXVsdC4gVGhlIHByZXNlcnZlZFxuKyAqIHByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy5cbisgKlxuKyAqIFByZXNlcnZlZCBQcm9wZXJ0aWVzXG4rICogPT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgZXZlbnRmZCBhcmUgcHJlc2VydmVkIGFjcm9zcyBrZXhlYzpcbisgKlxuKyAqIENvdW50ZXIgVmFsdWVcbisgKiAgIFRoZSBjdXJyZW50IDY0LWJpdCBjb3VudGVyIHZhbHVlIGlzIHByZXNlcnZlZC4gVGhpcyBpbmNsdWRlcyBhbnkgcGVuZGluZ1xuKyAqICAgZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNpZ25hbGVkIGJ1dCBub3QgeWV0IGNvbnN1bWVkIGJ5IHJlYWRlcnMuXG4rICpcbisgKiBGaWxlIEZsYWdzXG4rICogICBUaGUgY3JlYXRpb24gZmxhZ3MgKEVGRF9TRU1BUEhPUkUsIEVGRF9DTE9FWEVDLCBFRkRfTk9OQkxPQ0spIGFyZSBwcmVzZXJ2ZWQuXG4rICogICBUaGVzZSBjb250cm9sIHRoZSBiZWhhdmlvciBvZiByZWFkL3dyaXRlIG9wZXJhdGlvbnMgYW5kIGZpbGUgZGVzY3JpcHRvclxuKyAqICAgaW5oZXJpdGFuY2UuXG4rICpcbisgKiBOb24tUHJlc2VydmVkIFByb3BlcnRpZXNcbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIEFsbCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBub3QgcHJlc2VydmVkIG11c3QgYmUgYXNzdW1lZCB0byBiZSByZXNldCB0b1xuKyAqIGRlZmF1bHQuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZSBtb3JlIG9mXG4rICogbm90ZS5cbisgKlxuKyAqIEZpbGUgRGVzY3JpcHRvciBOdW1iZXJcbisgKiAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGl0c2VsZiBpcyBub3QgcHJlc2VydmVkLiBBZnRlciByZXN0b3JlLCB0aGVcbisgKiAgIGV2ZW50ZmQgd2lsbCBiZSBhc3NpZ25lZCBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGluIHRoZSB0YXJnZXQgcHJvY2Vzcy5cbisgKlxuKyAqIFdhaXQgUXVldWUgU3RhdGVcbisgKiAgIEFueSBwcm9jZXNzZXMgY3VycmVudGx5IGJsb2NrZWQgb24gcmVhZCgpIG9wZXJhdGlvbnMgd2lsbCBiZSB3b2tlbiB1cCBhbmRcbisgKiAgIG5lZWQgdG8gcmUtZXN0YWJsaXNoIHRoZWlyIGJsb2NraW5nIHN0YXRlIGlmIGRlc2lyZWQuXG4rICpcbisgKiBGaWxlIFBvc2l0aW9uXG4rICogICBFdmVudGZkIGZpbGVzIGRvbid0IGhhdmUgYSB0cmFkaXRpb25hbCBmaWxlIHBvc2l0aW9uLCBidXQgYW55IGludGVybmFsXG4rICogICBzdGF0ZSByZWxhdGVkIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgcmVzZXQuXG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgva2V4ZWNfaGFuZG92ZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2toby9hYmkvZXZlbnRmZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGl2ZXVwZGF0ZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hbm9uX2lub2Rlcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaWRyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rcmVmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9mZHRhYmxlLmhcdTAwM2VcbitcbitzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4rXHR1NjQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4rXHRpbnQgZXJyID0gMDtcbitcbitcdC8qIEdldCBldmVudGZkIHN0YXRlIHNhZmVseSAqL1xuK1x0ZXJyID0gZXZlbnRmZF9sdW9fZ2V0X3N0YXRlKGFyZ3MtXHUwMDNlZmlsZSwgXHUwMDI2Y291bnQsIFx1MDAyNmZsYWdzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGdldCBldmVudGZkIHN0YXRlOiAlZFxcblwiLCBlcnIpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0c2VyID0ga2hvX2FsbG9jX3ByZXNlcnZlKHNpemVvZigqc2VyKSk7XG4rXHRpZiAoSVNfRVJSKHNlcikpIHtcbitcdFx0ZXJyID0gUFRSX0VSUihzZXIpO1xuK1x0XHRwcl9lcnIoXCJGYWlsZWQgdG8gYWxsb2NhdGUgcHJlc2VydmUgbWVtb3J5OiAlZFxcblwiLCBlcnIpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0LyogU2F2ZSBldmVudGZkIHN0YXRlICovXG4rXHRzZXItXHUwMDNlY291bnQgPSBjb3VudDtcbitcdHNlci1cdTAwM2VmbGFncyA9IGZsYWdzO1xuK1xuK1x0cHJfZGVidWcoXCJQcmVzZXJ2ZWQgZXZlbnRmZDogY291bnQ9JWxsdSwgZmxhZ3M9MHgleFxcblwiLFxuK1x0XHRzZXItXHUwMDNlY291bnQsIHNlci1cdTAwM2VmbGFncyk7XG4rXG4rXHQvKiBSZXR1cm4gcGh5c2ljYWwgYWRkcmVzcyBvZiBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZSAqL1xuK1x0YXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEgPSB2aXJ0X3RvX3BoeXMoc2VyKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX2ZyZWV6ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuK1x0dTY0IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGZsYWdzO1xuK1x0aW50IGVycjtcbitcbitcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRzZXIgPSBwaHlzX3RvX3ZpcnQoYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpO1xuK1xuK1x0LyogR2V0IGN1cnJlbnQgc3RhdGUgYW5kIHVwZGF0ZSBpZiBjaGFuZ2VkICovXG4rXHRlcnIgPSBldmVudGZkX2x1b19nZXRfc3RhdGUoYXJncy1cdTAwM2VmaWxlLCBcdTAwMjZjb3VudCwgXHUwMDI2ZmxhZ3MpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmIChzZXItXHUwMDNlY291bnQgIT0gY291bnQpIHtcbitcdFx0cHJfZGVidWcoXCJXQVJOSU5HOiBDb3VudCBjaGFuZ2VkIGR1cmluZyBwcmVzZXJ2ZS1cdTAwM2VmcmVlemUhIG9sZD0lbGx1LCBuZXc9JWxsdVxcblwiLFxuK1x0XHRcdCBzZXItXHUwMDNlY291bnQsIGNvdW50KTtcbitcdH1cbitcbitcdHNlci1cdTAwM2Vjb3VudCA9IGNvdW50O1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV2ZW50ZmRfbHVvX3VucHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxuK3tcbitcdHN0cnVjdCBldmVudGZkX2x1b19zZXIgKnNlcjtcbitcbitcdGlmIChXQVJOX09OX09OQ0UoIWFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2VyID0gcGh5c190b192aXJ0KGFyZ3MtXHUwMDNlc2VyaWFsaXplZF9kYXRhKTtcbitcdGtob191bnByZXNlcnZlX2ZyZWUoc2VyKTtcbit9XG4rXG4rc3RhdGljIGludCBldmVudGZkX2x1b19yZXRyaWV2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wX2FyZ3MgKmFyZ3MpXG4re1xuK1x0c3RydWN0IGV2ZW50ZmRfbHVvX3NlciAqc2VyO1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4rXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7XG4rXHRpbnQgZXZlbnRmZDtcbitcbitcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSk7XG4rXHRpZiAoIXNlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBDcmVhdGUgYSBuZXcgZXZlbnRmZCB3aXRoIHRoZSBwcmVzZXJ2ZWQgY291bnQgYW5kIGZsYWdzICovXG4rXHRldmVudGZkID0gZXZlbnRmZF9jcmVhdGUoc2VyLVx1MDAzZWNvdW50LCBzZXItXHUwMDNlZmxhZ3MpO1xuK1x0aWYgKGV2ZW50ZmQgXHUwMDNjIDApIHtcbitcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGNyZWF0ZSBldmVudGZkOiAlZFxcblwiLCBldmVudGZkKTtcbitcdFx0cmV0dXJuIGV2ZW50ZmQ7XG4rXHR9XG4rXG4rXHRmaWxlID0gZmdldChldmVudGZkKTtcbitcdGlmICghZmlsZSkge1xuK1x0XHRwcl9lcnIoXCJGYWlsZWQgdG8gZ2V0IGZpbGUgZnJvbSBmZFxcblwiKTtcbitcdFx0Y2xvc2VfZmQoZXZlbnRmZCk7XG4rXHRcdHJldHVybiAtRUJBREY7XG4rXHR9XG4rXG4rXHRjbG9zZV9mZChldmVudGZkKTtcbitcbitcdC8qIFZlcmlmeSB0aGUgY3JlYXRlZCBmaWxlIGhhcyBjb3JyZWN0IGludGVybmFsIHN0YXRlICovXG4rXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuK1x0aWYgKElTX0VSUihjdHgpKSB7XG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBnZXQgY29udGV4dCBmcm9tIGZpbGVcXG5cIik7XG4rXHRcdGZwdXQoZmlsZSk7XG4rXHRcdHJldHVybiBQVFJfRVJSKGN0eCk7XG4rXHR9XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcbitcdGFyZ3MtXHUwMDNlZmlsZSA9IGZpbGU7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZXZlbnRmZF9sdW9fZmluaXNoKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyICpzZXI7XG4rXG4rXHRpZiAoYXJncy1cdTAwM2VyZXRyaWV2ZV9zdGF0dXMpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghYXJncy1cdTAwM2VzZXJpYWxpemVkX2RhdGEpXG4rXHRcdHJldHVybjtcbitcbitcdHNlciA9IHBoeXNfdG9fdmlydChhcmdzLVx1MDAzZXNlcmlhbGl6ZWRfZGF0YSk7XG4rXHRpZiAoIXNlcilcbitcdFx0cmV0dXJuO1xuK1xuK1x0a2hvX3Jlc3RvcmVfZnJlZShzZXIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBldmVudGZkX2x1b19jYW5fcHJlc2VydmUoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpoYW5kbGVyLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcbit7XG4rXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcbitcbitcdGlmICghZmlsZS1cdTAwM2VmX29wKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHQvKiBUcnkgdG8gZ2V0IGV2ZW50ZmQgY29udGV4dCAtIHRoaXMgd2lsbCBmYWlsIGlmIG5vdCBhbiBldmVudGZkICovXG4rXHRjdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGZpbGUpO1xuK1x0aWYgKElTX0VSUihjdHgpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRldmVudGZkX2N0eF9wdXQoY3R4KTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcHMgZXZlbnRmZF9sdW9fZmlsZV9vcHMgPSB7XG4rXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcbitcdC51bnByZXNlcnZlID0gZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZSxcbitcdC5mcmVlemUgPSBldmVudGZkX2x1b19mcmVlemUsXG4rXHQucmV0cmlldmUgPSBldmVudGZkX2x1b19yZXRyaWV2ZSxcbitcdC5maW5pc2ggPSBldmVudGZkX2x1b19maW5pc2gsXG4rXHQuY2FuX3ByZXNlcnZlID0gZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlLFxuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyIGV2ZW50ZmRfbHVvX2hhbmRsZXIgPSB7XG4rXHQub3BzID0gXHUwMDI2ZXZlbnRmZF9sdW9fZmlsZV9vcHMsXG4rXHQuY29tcGF0aWJsZSA9IEVWRU5URkRfTFVPX0ZIX0NPTVBBVElCTEUsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBldmVudGZkX2x1b19pbml0KHZvaWQpXG4re1xuK1x0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFx1MDAyNmV2ZW50ZmRfbHVvX2hhbmRsZXIpO1xuK1xuK1x0aWYgKGVyciBcdTAwMjZcdTAwMjYgZXJyICE9IC1FT1BOT1RTVVBQKSB7XG4rXHRcdHByX2VycihcIkNvdWxkIG5vdCByZWdpc3RlciBldmVudGZkIExVTyBoYW5kbGVyOiAlcGVcXG5cIixcbitcdFx0ICAgICAgIEVSUl9QVFIoZXJyKSk7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rbGF0ZV9pbml0Y2FsbChldmVudGZkX2x1b19pbml0KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oXG5pbmRleCBlMzJiZWU0MzQ1ZmI5Zi4uNzAzZTFhMTI2YzRkNDAgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2V2ZW50ZmQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmhcbkBAIC0zNSw2ICszNSw4IEBAIHZvaWQgZXZlbnRmZF9jdHhfcHV0KHN0cnVjdCBldmVudGZkX2N0eCAqY3R4KTtcbiBzdHJ1Y3QgZmlsZSAqZXZlbnRmZF9mZ2V0KGludCBmZCk7XG4gc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkX2N0eF9mZGdldChpbnQgZmQpO1xuIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZF9jdHhfZmlsZWdldChzdHJ1Y3QgZmlsZSAqZmlsZSk7XG4raW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcbitpbnQgZXZlbnRmZF9jcmVhdGUoX191NjQgY291bnQsIHVuc2lnbmVkIGludCBmbGFncyk7XG4gdm9pZCBldmVudGZkX3NpZ25hbF9tYXNrKHN0cnVjdCBldmVudGZkX2N0eCAqY3R4LCBfX3BvbGxfdCBtYXNrKTtcbiBpbnQgZXZlbnRmZF9jdHhfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHgsIHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcbiBcdFx0XHRcdCAgX191NjQgKmNudCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG8vYWJpL2V2ZW50ZmQuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTQ4YmVhYzZiY2M3NjBcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9ldmVudGZkLmhcbkBAIC0wLDAgKzEsMzkgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEt5bGluU29mdCBDb3Jwb3JhdGlvbi5cbisgKiBBdXRob3I6IENoZW5naGFvIER1YW4gXHUwMDNjZHVhbmNoZW5naGFvQGt5bGlub3MuY25cdTAwM2VcbisgKi9cbitcbisjaWZuZGVmIF9MSU5VWF9LSE9fQUJJX0VWRU5URkRfSFxuKyNkZWZpbmUgX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogRXZlbnRmZCBMaXZlIFVwZGF0ZSBBQklcbisgKlxuKyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEFCSSBmb3IgcHJlc2VydmluZyBldmVudGZkIHN0YXRlIGFjcm9zcyBrZXhlYy5cbisgKlxuKyAqIFRoZSBzdGF0ZSBpcyBzZXJpYWxpemVkIGludG8gYSBwYWNrZWQgc3RydWN0dXJlIGBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyYFxuKyAqIHdoaWNoIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBuZXh0IGtlcm5lbCB2aWEgdGhlIEtITyBtZWNoYW5pc20uXG4rICpcbisgKi9cbitcbisvKipcbisgKiBzdHJ1Y3QgZXZlbnRmZF9sdW9fc2VyIC0gU2VyaWFsaXplZCBzdGF0ZSBvZiBhbiBldmVudGZkXG4rICogQGNvdW50OiBUaGUgY3VycmVudCBjb3VudGVyIHZhbHVlXG4rICogQGZsYWdzOiBGaWxlIGZsYWdzIChFRkRfU0VNQVBIT1JFLCBFRkRfQ0xPRVhFQywgRUZEX05PTkJMT0NLKVxuKyAqXG4rICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1pbmltYWwgc3RhdGUgbmVlZGVkIHRvIHJlc3RvcmUgYW4gZXZlbnRmZFxuKyAqIGFmdGVyIGtleGVjLiBUaGUgY291bnQgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZXZlbnQgY291bnRlcixcbisgKiBhbmQgZmxhZ3MgcmVwcmVzZW50IHRoZSBmaWxlIGNyZWF0aW9uIGZsYWdzLlxuKyAqL1xuK3N0cnVjdCBldmVudGZkX2x1b19zZXIge1xuK1x0X191NjQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQgIGZsYWdzO1xuK30gX19wYWNrZWQ7XG4rXG4rLyogVGhlIGNvbXBhdGliaWxpdHkgc3RyaW5nIGZvciBldmVudGZkIGZpbGUgaGFuZGxlciAqL1xuKyNkZWZpbmUgRVZFTlRGRF9MVU9fRkhfQ09NUEFUSUJMRVx0XCJldmVudGZkLXYxXCJcbitcbisjZW5kaWYgLyogX0xJTlVYX0tIT19BQklfRVZFTlRGRF9IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbmluZGV4IGMxM2FmMzhiYTIzYWI4Li4xMzYxYjU3MzNmNDEyYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbisrKyBiL2tlcm5lbC9saXZldXBkYXRlL0tjb25maWdcbkBAIC04Niw0ICs4NiwyMCBAQCBjb25maWcgTElWRVVQREFURV9NRU1GRFxuIFxuIFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIFxuK2NvbmZpZyBMSVZFVVBEQVRFX0VWRU5URkRcbitcdGJvb2wgXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XCJcbitcdGRlcGVuZHMgb24gRVZFTlRGRFxuK1x0ZGVwZW5kcyBvbiBMSVZFVVBEQVRFXG4rXHRoZWxwXG4rXHQgIEVuYWJsZSBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3Igc3VwcG9ydCBmb3IgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3JzLlxuK1x0ICBUaGlzIGFsbG93cyBldmVudGZkIGZpbGVzIHRvIGJlIHByZXNlcnZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIGtleGVjXG4rXHQgIG9wZXJhdGlvbnMsIG1haW50YWluaW5nIHRoZWlyIGNvdW50ZXIgdmFsdWVzIGFuZCBmbGFncy5cbitcbitcdCAgRXZlbnRmZCBmaWxlcyBhcmUgY29tbW9ubHkgdXNlZCBmb3IgZXZlbnQgbm90aWZpY2F0aW9uIGJldHdlZW5cbitcdCAgdXNlcnNwYWNlIHByb2Nlc3NlcyBvciBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLiBXaXRoIHRoaXNcbitcdCAgb3B0aW9uIGVuYWJsZWQsIGV2ZW50ZmQgc3RhdGUgY2FuIGJlIGhhbmRlZCBvdmVyIHRvIGEgbmV3IGtlcm5lbFxuK1x0ICBkdXJpbmcgbGl2ZSB1cGRhdGUgb3BlcmF0aW9ucy5cbitcbitcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbitcbiBlbmRtZW51XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbmluZGV4IDMwNjg5ZDIyY2IwMjE2Li5lMDkyZTM4ZmE2ZjZjNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvTWFrZWZpbGVcbkBAIC04LDYgKzgsNyBAQCBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fa2V4ZWNfc2ltcGxlXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX211bHRpX3Nlc3Npb25cbiBURVNUX0dFTl9QUk9HU19FWFRFTkRFRCArPSBsdW9fc3RyZXNzX3Nlc3Npb25zXG4gVEVTVF9HRU5fUFJPR1NfRVhURU5ERUQgKz0gbHVvX3N0cmVzc19maWxlc1xuK1RFU1RfR0VOX1BST0dTX0VYVEVOREVEICs9IGx1b190ZXN0X2V2ZW50ZmRcbiBcbiBURVNUX0ZJTEVTICs9IGRvX2tleGVjLnNoXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2NvbmZpZ1xuaW5kZXggOTFkMDNmOWE2YTM5NTIuLmQzODhiZDc1NTI0NTc4IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGl2ZXVwZGF0ZS9jb25maWdcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvY29uZmlnXG5AQCAtOSwzICs5LDUgQEAgQ09ORklHX0xJVkVVUERBVEVfVEVTVD15XG4gQ09ORklHX01FTUZEX0NSRUFURT15XG4gQ09ORklHX1RNUEZTPXlcbiBDT05GSUdfU0hNRU09eVxuK0NPTkZJR19FVkVOVEZEPXlcbitDT05GSUdfTElWRVVQREFURV9FVkVOVEZEPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpdmV1cGRhdGUvbHVvX3Rlc3RfZXZlbnRmZC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjk0ZWYzYmM2NmFkOTcxXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saXZldXBkYXRlL2x1b190ZXN0X2V2ZW50ZmQuY1xuQEAgLTAsMCArMSwzNzYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgS3lsaW5Tb2Z0IENvcnBvcmF0aW9uLlxuKyAqIEF1dGhvcjogQ2hlbmdoYW8gRHVhbiBcdTAwM2NkdWFuY2hlbmdoYW9Aa3lsaW5vcy5jblx1MDAzZVxuKyAqL1xuK1xuKy8qXG4rICogTXVsdGktc2Vzc2lvbiBrZXhlYyBzZWxmdGVzdCBmb3IgZXZlbnRmZCBMVU8gc3VwcG9ydC5cbisgKlxuKyAqIE1vZGVsZWQgYWZ0ZXIgbHVvX211bHRpX3Nlc3Npb24uYy5cbisgKiBJdCBjcmVhdGVzIG11bHRpcGxlIExVTyBzZXNzaW9ucywgZWFjaCBwcmVzZXJ2aW5nIGRpZmZlcmVudCBldmVudGZkIHR5cGVzLFxuKyAqIGFuZCB2ZXJpZmllcyB0aGVtIGFmdGVyIGtleGVjLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2V2ZW50ZmQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImx1b190ZXN0X3V0aWxzLmhcIlxuK1xuKy8qIFNlc3Npb24gbmFtZXMgKi9cbisjZGVmaW5lIFNFU1NJT05fRU1QVFkgICAgIFwiZXZlbnRmZC1lbXB0eVwiXG4rI2RlZmluZSBTRVNTSU9OX0RFRkFVTFQgICBcImV2ZW50ZmQtZGVmYXVsdFwiXG4rI2RlZmluZSBTRVNTSU9OX1NFTSAgICAgICBcImV2ZW50ZmQtc2VtXCJcbisjZGVmaW5lIFNFU1NJT05fTk9OQkxPQ0sgIFwiZXZlbnRmZC1ub25ibG9ja1wiXG4rI2RlZmluZSBTRVNTSU9OX0xBUkdFICAgICBcImV2ZW50ZmQtbGFyZ2VcIlxuKyNkZWZpbmUgU0VTU0lPTl9NT0RJRklFRCAgXCJldmVudGZkLW1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCJcbitcbisvKiBUb2tlbnMgKi9cbisjZGVmaW5lIFRPS0VOX0RFRkFVTFQgICAgICAgMHhDQUZFQkFCRVxuKyNkZWZpbmUgVE9LRU5fU0VNICAgICAgICAgICAweERFQURCRUVGXG4rI2RlZmluZSBUT0tFTl9OT05CTE9DSyAgICAgIDB4RkVFREJFRUZcbisjZGVmaW5lIFRPS0VOX0xBUkdFICAgICAgICAgMHhCRUVGQ0FGRVxuKyNkZWZpbmUgVE9LRU5fTU9ESUZJRUQgICAgICAweEFCQ0QxMjM0XG4rXG4rLyogQ291bnRzICovXG4rI2RlZmluZSBDT1VOVF9JTklUSUFMICAgNDJcbisjZGVmaW5lIENPVU5UX1dSSVRFICAgICAxMFxuKyNkZWZpbmUgQ09VTlRfRVhQRUNURUQgIChDT1VOVF9JTklUSUFMICsgQ09VTlRfV1JJVEUpIC8qIDUyICovXG4rI2RlZmluZSBDT1VOVF9TRU0gICAgICAgNVxuKyNkZWZpbmUgQ09VTlRfTk9OQkxPQ0sgIDEwMFxuKyNkZWZpbmUgQ09VTlRfTEFSR0UgICAgICgodW5zaWduZWQgaW50KS0xKSAvKiBVSU5UX01BWCAqL1xuKyNkZWZpbmUgQ09VTlRfTU9ESUZJRUQgIDI1XG4rI2RlZmluZSBDT1VOVF9NT0RJRllfREVMVEEgIDk5XG4rXG4rLyogU3RhdGUgdHJhY2tpbmcgKi9cbisjZGVmaW5lIFNUQVRFX1NFU1NJT05fTkFNRSBcImV2ZW50ZmRfbXVsdGlfc3RhdGVcIlxuKyNkZWZpbmUgU1RBVEVfVE9LRU4gICAgICAgIDk5N1xuK1xuKy8qIEV2ZW50ZmQgdmVyaWZpY2F0aW9uIG1vZGVzICovXG4rZW51bSB2ZXJpZnlfbW9kZSB7XG4rXHRWRVJJRllfRkxBR1MsICAgICAgICAvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuK1x0VkVSSUZZX09OQ0UsICAgICAgICAgLyogUmVhZCBvbmNlIGFuZCB2ZXJpZnkgY291bnQgKi9cbitcdFZFUklGWV9TRU1BUEhPUkUsICAgIC8qIFJlYWQgbXVsdGlwbGUgdGltZXMsIHZlcmlmeSByZXR1cm5zIDEgZWFjaCB0aW1lICovXG4rXHRWRVJJRllfTk9OQkxPQ0ssICAgICAvKiBSZWFkIG9uY2UgaW4gbm9uYmxvY2sgbW9kZSAqL1xuK1x0VkVSSUZZX0xBUkdFICAgICAgICAgLyogUmVhZCBvbmNlLCB2ZXJpZnkgbGFyZ2UgY291bnQgKi9cbit9O1xuK1xuKy8qIFRlc3Qgc2Vzc2lvbiBjb25maWd1cmF0aW9uICovXG4rc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcge1xuK1x0Y29uc3QgY2hhciAqc2Vzc2lvbl9uYW1lO1xuK1x0dW5zaWduZWQgbG9uZyB0b2tlbjtcbitcdHVuc2lnbmVkIGludCBjb3VudDtcbitcdHVuc2lnbmVkIGludCBmbGFncztcbitcdGVudW0gdmVyaWZ5X21vZGUgdmVyaWZ5X21vZGU7XG4rXHRjb25zdCBjaGFyICpkZXNjO1xuK307XG4rXG4rLyogVGVzdCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zICovXG4rc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3Nlc3Npb25fY29uZmlnIHRlc3RfY29uZmlnc1tdID0ge1xuK1x0e1NFU1NJT05fRU1QVFksIDAsIDAsIDAsIFZFUklGWV9GTEFHUywgXCJFbXB0eVwifSxcbitcdHtTRVNTSU9OX0RFRkFVTFQsIFRPS0VOX0RFRkFVTFQsIENPVU5UX0VYUEVDVEVELCAwLCBWRVJJRllfT05DRSwgXCJEZWZhdWx0XCJ9LFxuK1x0e1NFU1NJT05fU0VNLCBUT0tFTl9TRU0sIENPVU5UX1NFTSwgRUZEX1NFTUFQSE9SRSwgVkVSSUZZX1NFTUFQSE9SRSwgXCJTZW1hcGhvcmVcIn0sXG4rXHR7U0VTU0lPTl9OT05CTE9DSywgVE9LRU5fTk9OQkxPQ0ssIENPVU5UX05PTkJMT0NLLCBFRkRfTk9OQkxPQ0ssIFZFUklGWV9OT05CTE9DSywgXCJOb25ibG9ja1wifSxcbitcdHtTRVNTSU9OX0xBUkdFLCBUT0tFTl9MQVJHRSwgQ09VTlRfTEFSR0UsIDAsIFZFUklGWV9MQVJHRSwgXCJMYXJnZS1jb3VudFwifSxcbitcdHtTRVNTSU9OX01PRElGSUVELCBUT0tFTl9NT0RJRklFRCwgQ09VTlRfTU9ESUZJRUQgKyBDT1VOVF9NT0RJRllfREVMVEEsIDAsIFZFUklGWV9PTkNFLCBcIk1vZGlmaWVkIGFmdGVyIHByZXNlcnZlIChrZXhlYyBoYW5kb3ZlcilcIn0sXG4rfTtcbisjZGVmaW5lIE5VTV9URVNUX1NFU1NJT05TIEFSUkFZX1NJWkUodGVzdF9jb25maWdzKVxuK1xuK3N0YXRpYyBpbnQgdmVyaWZ5X2V2ZW50ZmRfZmxhZ3MoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2ZsYWdzLCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdGludCBhY3R1YWxfZmxhZ3MgPSBmY250bChlZmQsIEZfR0VURkwpO1xuK1xuK1x0aWYgKGFjdHVhbF9mbGFncyBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC1lcnJubztcbitcbitcdGludCBleHBlY3RlZF9mZF9mbGFncyA9IGV4cGVjdGVkX2ZsYWdzIFx1MDAyNiAoRUZEX05PTkJMT0NLIHwgRUZEX0NMT0VYRUMpO1xuK1x0aW50IGFjdHVhbF9mZF9mbGFncyA9IGFjdHVhbF9mbGFncyBcdTAwMjYgKE9fTk9OQkxPQ0sgfCBPX0NMT0VYRUMpO1xuK1xuK1x0aWYgKGFjdHVhbF9mZF9mbGFncyAhPSBleHBlY3RlZF9mZF9mbGFncykge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIiVzOiBmbGFnIG1pc21hdGNoIC0gZXhwZWN0ZWQgMHgleCwgZ290IDB4JXhcXG5cIixcbitcdFx0XHQgICAgICAgZGVzYywgZXhwZWN0ZWRfZmRfZmxhZ3MsIGFjdHVhbF9mZF9mbGFncyk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgZmxhZ3MgT0sgKDB4JXgpXFxuXCIsIGRlc2MsIGV4cGVjdGVkX2ZkX2ZsYWdzKTtcbitcdHJldHVybiBhY3R1YWxfZmxhZ3M7IC8qIFJldHVybiBhY3R1YWwgZmxhZ3MgZm9yIGZ1cnRoZXIgdXNlICovXG4rfVxuK1xuK3N0YXRpYyBpbnQgZW5zdXJlX25vbmJsb2NrKGludCBlZmQsIGludCBjdXJyZW50X2ZsYWdzKVxuK3tcbitcdHJldHVybiBmY250bChlZmQsIEZfU0VURkwsIGN1cnJlbnRfZmxhZ3MgfCBPX05PTkJMT0NLKTtcbit9XG4rXG4rc3RhdGljIGludCB2ZXJpZnlfY291bnRfb25jZShpbnQgZWZkLCB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsIGNvbnN0IGNoYXIgKmRlc2MpXG4re1xuK1x0dWludDY0X3QgdmFsO1xuK1xuK1x0aWYgKHJlYWQoZWZkLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSAhPSBzaXplb2YodmFsKSlcbitcdFx0cmV0dXJuIC1lcnJubztcbitcbitcdGlmICh2YWwgIT0gKHVpbnQ2NF90KWV4cGVjdGVkX2NvdW50KSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkICV1IGdvdCAlbGx1XFxuXCIsXG4rXHRcdFx0ICAgICAgIGRlc2MsIGV4cGVjdGVkX2NvdW50LCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgT0s6ICV1XFxuXCIsIGRlc2MsIGV4cGVjdGVkX2NvdW50KTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoaW50IGVmZCwgdW5zaWduZWQgaW50IGV4cGVjdGVkX2NvdW50LCBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHVpbnQ2NF90IHZhbDtcbitcbitcdC8qIFJlYWQgZXhwZWN0ZWRfY291bnQgdGltZXMsIGVhY2ggc2hvdWxkIHJldHVybiAxICovXG4rXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcdTAwM2MgZXhwZWN0ZWRfY291bnQ7IGkrKykge1xuK1x0XHRpZiAocmVhZChlZmQsIFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpICE9IHNpemVvZih2YWwpKVxuK1x0XHRcdHJldHVybiAtZXJybm87XG4rXG4rXHRcdGlmICh2YWwgIT0gMSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkIDEsIGdvdCAlbGx1IGF0IHJlYWQgJXVcXG5cIixcbitcdFx0XHRcdCAgICAgICBkZXNjLCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCwgaSArIDEpO1xuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiICAlcyBldmVudGZkIE9LOiAldSBhdCByZWFkICV1XFxuXCIsIGRlc2MsICh1bnNpZ25lZCBpbnQpdmFsLCBpICsgMSk7XG4rXHR9XG4rXG4rXHQvKiBOZXh0IHJlYWQgc2hvdWxkIHJldHVybiBFQUdBSU4gKG5vIG1vcmUgZXZlbnRzKSAqL1xuK1x0aWYgKHJlYWQoZWZkLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKSBcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUFHQUlOKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiJXM6IGV4cGVjdGVkIEVBR0FJTiBhZnRlciAldSByZWFkc1xcblwiLFxuK1x0XHRcdCAgICAgICBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9tc2coXCIgICVzIGV2ZW50ZmQgT0sgKCV1IHJlYWRzKVxcblwiLCBkZXNjLCBleHBlY3RlZF9jb3VudCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCByZXN0b3JlX2FuZF92ZXJpZnlfZXZlbnRmZF9nZW5lcmljKGludCBzZXNzaW9uX2ZkLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRva2VuLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfY291bnQsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9mbGFncyxcbitcdFx0XHRcdFx0ICAgICAgZW51bSB2ZXJpZnlfbW9kZSBtb2RlLFxuK1x0XHRcdFx0XHQgICAgICBjb25zdCBjaGFyICpkZXNjKVxuK3tcbitcdHN0cnVjdCBsaXZldXBkYXRlX3Nlc3Npb25fcmV0cmlldmVfZmQgYXJnID0geyAuc2l6ZSA9IHNpemVvZihhcmcpIH07XG4rXHRpbnQgZWZkLCByZXQgPSAwLCBhY3R1YWxfZmxhZ3M7XG4rXG4rXHRhcmcudG9rZW4gPSB0b2tlbjtcbitcdGlmIChpb2N0bChzZXNzaW9uX2ZkLCBMSVZFVVBEQVRFX1NFU1NJT05fUkVUUklFVkVfRkQsIFx1MDAyNmFyZykgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtZXJybm87XG4rXHRlZmQgPSBhcmcuZmQ7XG4rXG4rXHRzd2l0Y2ggKG1vZGUpIHtcbitcdGNhc2UgVkVSSUZZX0ZMQUdTOlxuK1x0XHQvKiBPbmx5IHZlcmlmeSBmbGFncywgbm8gYmVoYXZpb3IgdGVzdGluZyAqL1xuK1x0XHRyZXQgPSB2ZXJpZnlfZXZlbnRmZF9mbGFncyhlZmQsIGV4cGVjdGVkX2ZsYWdzLCBkZXNjKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRjbG9zZShlZmQpO1xuK1x0XHRyZXR1cm4gcmV0IFx1MDAzYyAwID8gcmV0IDogMDtcbitcbitcdGNhc2UgVkVSSUZZX1NFTUFQSE9SRTpcbitcdFx0LyogVmVyaWZ5IGZsYWdzICsgc2VtYXBob3JlIGJlaGF2aW9yICovXG4rXHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuK1x0XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGlmIChlbnN1cmVfbm9uYmxvY2soZWZkLCBhY3R1YWxfZmxhZ3MpIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gLWVycm5vO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdHJldCA9IHZlcmlmeV9zZW1hcGhvcmVfYmVoYXZpb3IoZWZkLCBleHBlY3RlZF9jb3VudCwgZGVzYyk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBWRVJJRllfT05DRTpcbitcdGNhc2UgVkVSSUZZX05PTkJMT0NLOlxuK1x0Y2FzZSBWRVJJRllfTEFSR0U6XG4rXHRcdC8qIFZlcmlmeSBmbGFncyArIGNvdW50IGJlaGF2aW9yICovXG4rXHRcdGFjdHVhbF9mbGFncyA9IHZlcmlmeV9ldmVudGZkX2ZsYWdzKGVmZCwgZXhwZWN0ZWRfZmxhZ3MsIGRlc2MpO1xuK1x0XHRpZiAoYWN0dWFsX2ZsYWdzIFx1MDAzYyAwKSB7XG4rXHRcdFx0cmV0ID0gYWN0dWFsX2ZsYWdzO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdHJldCA9IHZlcmlmeV9jb3VudF9vbmNlKGVmZCwgZXhwZWN0ZWRfY291bnQsIGRlc2MpO1xuK1x0XHRicmVhaztcbitcbitcdGRlZmF1bHQ6XG4rXHRcdHJldCA9IC1FSU5WQUw7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1xuK291dDpcbitcdGNsb3NlKGVmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKGludCBzZXNzaW9uX2ZkLFxuK1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBjb3VudCxcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsXG4rXHRcdFx0XHRcdCAgICAgICBpbnQgKmVmZF9vdXQpXG4re1xuK1x0c3RydWN0IGxpdmV1cGRhdGVfc2Vzc2lvbl9wcmVzZXJ2ZV9mZCBhcmcgPSB7IC5zaXplID0gc2l6ZW9mKGFyZykgfTtcbitcdGludCBlZmQgPSBldmVudGZkKGNvdW50LCBmbGFncyk7XG4rXG4rXHRpZiAoZWZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLWVycm5vO1xuK1xuK1x0YXJnLmZkID0gZWZkO1xuK1x0YXJnLnRva2VuID0gdG9rZW47XG4rXHRpZiAoaW9jdGwoc2Vzc2lvbl9mZCwgTElWRVVQREFURV9TRVNTSU9OX1BSRVNFUlZFX0ZELCBcdTAwMjZhcmcpIFx1MDAzYyAwKSB7XG4rXHRcdGludCByZXQgPSAtZXJybm87XG4rXG4rXHRcdGNsb3NlKGVmZCk7XG4rXHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRpZiAoZWZkX291dClcbitcdFx0KmVmZF9vdXQgPSBlZmQ7XG4rXHRlbHNlXG4rXHRcdGNsb3NlKGVmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBjcmVhdGVfYW5kX3ByZXNlcnZlX2V2ZW50ZmQoaW50IHNlc3Npb25fZmQsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b2tlbixcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKmRlc2MpXG4re1xuK1x0cmV0dXJuIGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZF9rZWVwX2ZkKHNlc3Npb25fZmQsIHRva2VuLCBjb3VudCxcbitcdFx0XHRcdFx0XHQgICBmbGFncywgZGVzYywgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX3Nlc3Npb25fY2hlY2tlZChpbnQgbHVvX2ZkLCBjb25zdCBjaGFyICpzZXNzaW9uX25hbWUpXG4re1xuK1x0aW50IHNlc3Npb25fZmQgPSBsdW9fY3JlYXRlX3Nlc3Npb24obHVvX2ZkLCBzZXNzaW9uX25hbWUpO1xuK1xuK1x0aWYgKHNlc3Npb25fZmQgXHUwMDNjIDApXG4rXHRcdGZhaWxfZXhpdChcImx1b19jcmVhdGVfc2Vzc2lvbiBmb3IgJyVzJ1wiLCBzZXNzaW9uX25hbWUpO1xuK1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGludCBsdW9fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbit7XG4rXHRpbnQgc2Vzc2lvbl9mZCA9IGx1b19yZXRyaWV2ZV9zZXNzaW9uKGx1b19mZCwgc2Vzc2lvbl9uYW1lKTtcbitcbitcdGlmIChzZXNzaW9uX2ZkIFx1MDAzYyAwKVxuK1x0XHRmYWlsX2V4aXQoXCJsdW9fcmV0cmlldmVfc2Vzc2lvbiBmb3IgJyVzJ1wiLCBzZXNzaW9uX25hbWUpO1xuK1x0cmV0dXJuIHNlc3Npb25fZmQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbmlzaF9zZXNzaW9uX2NoZWNrZWQoaW50IHNlc3Npb25fZmQsIGNvbnN0IGNoYXIgKnNlc3Npb25fbmFtZSlcbit7XG4rXHRpZiAobHVvX3Nlc3Npb25fZmluaXNoKHNlc3Npb25fZmQpIFx1MDAzYyAwKVxuK1x0XHRmYWlsX2V4aXQoXCJsdW9fc2Vzc2lvbl9maW5pc2ggZm9yICclcydcIiwgc2Vzc2lvbl9uYW1lKTtcbitcdGNsb3NlKHNlc3Npb25fZmQpO1xuK31cbitcbitzdGF0aWMgaW50IHZlcmlmeV9ldmVudGZkX2NvbmZpZyhpbnQgc2Vzc2lvbl9mZCwgY29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZylcbit7XG4rXHRyZXR1cm4gcmVzdG9yZV9hbmRfdmVyaWZ5X2V2ZW50ZmRfZ2VuZXJpYyhzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4rXHRcdFx0XHRcdFx0IGNvbmZpZy1cdTAwM2Vjb3VudCwgY29uZmlnLVx1MDAzZWZsYWdzLFxuK1x0XHRcdFx0XHRcdCBjb25maWctXHUwMDNldmVyaWZ5X21vZGUsIGNvbmZpZy1cdTAwM2VkZXNjKTtcbit9XG4rXG4rXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzEoaW50IGx1b19mZClcbit7XG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAxXSBTdGFydGluZyBwcmUta2V4ZWMgc2V0dXAgZm9yIG11bHRpLWV2ZW50ZmQgdGVzdC4uLlxcblwiKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDFdIENyZWF0aW5nIHN0YXRlIGZpbGUgZm9yIG5leHQgc3RhZ2UgKDIpLi4uXFxuXCIpO1xuK1x0Y3JlYXRlX3N0YXRlX2ZpbGUobHVvX2ZkLCBTVEFURV9TRVNTSU9OX05BTUUsIFNUQVRFX1RPS0VOLCAyKTtcbitcbitcdC8qIENyZWF0ZSBhbGwgdGVzdCBzZXNzaW9ucyAqL1xuK1x0Zm9yIChzaXplX3QgaSA9IDA7IGkgXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspIHtcbitcdFx0Y29uc3Qgc3RydWN0IHRlc3Rfc2Vzc2lvbl9jb25maWcgKmNvbmZpZyA9IFx1MDAyNnRlc3RfY29uZmlnc1tpXTtcbitcbitcdFx0a3NmdF9wcmludF9tc2coXCJbU1RBR0UgMV0gQ3JlYXRpbmcgc2Vzc2lvbiAnJXMnLi4uXFxuXCIsIGNvbmZpZy1cdTAwM2VzZXNzaW9uX25hbWUpO1xuK1x0XHRpbnQgc2Vzc2lvbl9mZCA9IGNyZWF0ZV9zZXNzaW9uX2NoZWNrZWQobHVvX2ZkLCBjb25maWctXHUwMDNlc2Vzc2lvbl9uYW1lKTtcbitcbitcdFx0LyogU3BlY2lhbCBoYW5kbGluZyBmb3IgbW9kaWZpZWQgc2Vzc2lvbiAocHJlc2VydmUgdGhlbiBtb2RpZnkpICovXG4rXHRcdGlmIChjb25maWctXHUwMDNldG9rZW4gPT0gVE9LRU5fTU9ESUZJRUQpIHtcbitcdFx0XHRpbnQgcHJlc2VydmVkX2VmZDtcbitcbitcdFx0XHRpZiAoY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQoc2Vzc2lvbl9mZCxcbitcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZXRva2VuLFxuK1x0XHRcdFx0XHRcdFx0XHRDT1VOVF9NT0RJRklFRCxcbitcdFx0XHRcdFx0XHRcdFx0Y29uZmlnLVx1MDAzZWZsYWdzLFxuK1x0XHRcdFx0XHRcdFx0XHRcIm1vZGlmaWVkLWFmdGVyLXByZXNlcnZlXCIsXG4rXHRcdFx0XHRcdFx0XHRcdFx1MDAyNnByZXNlcnZlZF9lZmQpIFx1MDAzYyAwKVxuK1x0XHRcdFx0ZmFpbF9leGl0KFwiY3JlYXRlX2FuZF9wcmVzZXJ2ZV9ldmVudGZkX2tlZXBfZmQgbW9kaWZpZWRcIik7XG4rXG4rXHRcdFx0LyogTm93IG1vZGlmeSB0aGUgcHJlc2VydmVkIGV2ZW50ZmQncyBjb3VudCAqL1xuK1x0XHRcdHVpbnQ2NF90IG1vZGlmeV92YWx1ZSA9IENPVU5UX01PRElGWV9ERUxUQTtcbitcbitcdFx0XHRpZiAod3JpdGUocHJlc2VydmVkX2VmZCwgXHUwMDI2bW9kaWZ5X3ZhbHVlLFxuK1x0XHRcdCAgICBzaXplb2YobW9kaWZ5X3ZhbHVlKSkgIT0gc2l6ZW9mKG1vZGlmeV92YWx1ZSkpXG4rXHRcdFx0XHRmYWlsX2V4aXQoXCJ3cml0ZSB0byBwcmVzZXJ2ZWQgZXZlbnRmZCBhZnRlciBwcmVzZXJ2ZVwiKTtcbitcbitcdFx0XHRjbG9zZShwcmVzZXJ2ZWRfZWZkKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKiBTdGFuZGFyZCBzZXNzaW9uIGNyZWF0aW9uICovXG4rXHRcdFx0aWYgKGNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZChzZXNzaW9uX2ZkLCBjb25maWctXHUwMDNldG9rZW4sXG4rXHRcdFx0XHRcdFx0XHRjb25maWctXHUwMDNlY291bnQsIGNvbmZpZy1cdTAwM2VmbGFncyxcbitcdFx0XHRcdFx0XHRcdGNvbmZpZy1cdTAwM2VkZXNjKSBcdTAwM2MgMClcbitcdFx0XHRcdGZhaWxfZXhpdChcImNyZWF0ZV9hbmRfcHJlc2VydmVfZXZlbnRmZCAlc1wiLCBjb25maWctXHUwMDNlZGVzYyk7XG4rXHRcdH1cbitcdH1cbitcbitcdGNsb3NlKGx1b19mZCk7XG4rXHRkYWVtb25pemVfYW5kX3dhaXQoKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcnVuX3N0YWdlXzIoaW50IGx1b19mZCwgaW50IHN0YXRlX3Nlc3Npb25fZmQpXG4re1xuK1x0aW50IHNlc3Npb25fZmRzW05VTV9URVNUX1NFU1NJT05TXTtcbitcdGludCBzdGFnZTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIFN0YXJ0aW5nIHBvc3Qta2V4ZWMgdmVyaWZpY2F0aW9uLi4uXFxuXCIpO1xuK1xuK1x0cmVzdG9yZV9hbmRfcmVhZF9zdGFnZShzdGF0ZV9zZXNzaW9uX2ZkLCBTVEFURV9UT0tFTiwgXHUwMDI2c3RhZ2UpO1xuK1x0aWYgKHN0YWdlICE9IDIpXG4rXHRcdGZhaWxfZXhpdChcIkV4cGVjdGVkIHN0YWdlIDIsIGJ1dCBzdGF0ZSBmaWxlIGNvbnRhaW5zICVkXCIsIHN0YWdlKTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIFJldHJpZXZpbmcgYWxsIHNlc3Npb25zLi4uXFxuXCIpO1xuK1x0Zm9yIChzaXplX3QgaSA9IDA7IGkgXHUwMDNjIE5VTV9URVNUX1NFU1NJT05TOyBpKyspXG4rXHRcdHNlc3Npb25fZmRzW2ldID0gcmV0cmlldmVfc2Vzc2lvbl9jaGVja2VkKGx1b19mZCwgdGVzdF9jb25maWdzW2ldLnNlc3Npb25fbmFtZSk7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAyXSBWZXJpZnlpbmcgZXZlbnRmZHMuLi5cXG5cIik7XG4rXHRmb3IgKHNpemVfdCBpID0gMDsgaSBcdTAwM2MgTlVNX1RFU1RfU0VTU0lPTlM7IGkrKykge1xuK1x0XHRpZiAodmVyaWZ5X2V2ZW50ZmRfY29uZmlnKHNlc3Npb25fZmRzW2ldLCBcdTAwMjZ0ZXN0X2NvbmZpZ3NbaV0pIFx1MDAzYyAwKVxuK1x0XHRcdGZhaWxfZXhpdChcInZlcmlmeSAlcyBldmVudGZkXCIsIHRlc3RfY29uZmlnc1tpXS5kZXNjKTtcbitcdH1cbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIEFsbCBldmVudGZkIHNlc3Npb25zIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS5cXG5cIik7XG4rXG4rXHRrc2Z0X3ByaW50X21zZyhcIltTVEFHRSAyXSBGaW5hbGl6aW5nIGFsbCBzZXNzaW9ucy4uLlxcblwiKTtcbitcdGZvciAoc2l6ZV90IGkgPSAwOyBpIFx1MDAzYyBOVU1fVEVTVF9TRVNTSU9OUzsgaSsrKVxuK1x0XHRmaW5pc2hfc2Vzc2lvbl9jaGVja2VkKHNlc3Npb25fZmRzW2ldLCB0ZXN0X2NvbmZpZ3NbaV0uc2Vzc2lvbl9uYW1lKTtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiW1NUQUdFIDJdIEZpbmFsaXppbmcgc3RhdGUgc2Vzc2lvbi4uLlxcblwiKTtcbitcdGlmIChsdW9fc2Vzc2lvbl9maW5pc2goc3RhdGVfc2Vzc2lvbl9mZCkgXHUwMDNjIDApXG4rXHRcdGZhaWxfZXhpdChcImx1b19zZXNzaW9uX2ZpbmlzaCBmb3Igc3RhdGUgc2Vzc2lvblwiKTtcbitcdGNsb3NlKHN0YXRlX3Nlc3Npb25fZmQpO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJcXG4tLS0gRVZFTlRGRF9MVU8gVEVTVCBQQVNTRUQgLS0tXFxuXCIpO1xuK31cbitcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxuK3tcbitcdHJldHVybiBsdW9fdGVzdChhcmdjLCBhcmd2LCBTVEFURV9TRVNTSU9OX05BTUUsXG4rXHRcdFx0cnVuX3N0YWdlXzEsIHJ1bl9zdGFnZV8yKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowNzo1Ny42OTY2MDMxMDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NjMzODkyNzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgRXZlbnRmZCBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgc3VwcG9ydCBmb3IgYGV2ZW50ZmRgLiBJdCBsb29rcyBsaWtlIGl0IGFkZHMgYGZzL2V2ZW50ZmRfbHVvLmNgIGFuZCBtb2RpZmllcyBgZnMvZXZlbnRmZC5jYCB0byBleHBvcnQgYSBmZXcgZnVuY3Rpb25zIGFuZCBpbnRyb2R1Y2VzIGEgYENPTkZJR19MSVZFVVBEQVRFX0VWRU5URkRgIGNvbmZpZyBvcHRpb24uXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIklzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqIGFuZCBmdW5jdGlvbmFsP1wiICBJIG5lZWQgdG8gdmVyaWZ5LiBTaW5jZSB0aGUgcHJvbXB0IHRlbGxzIG1lIHRvIHVzZSBteSB0b29scyBhbmQgbm90IHJlbHkgb24gcHJpb3Iga25vd2xlZGdlLCBsZXQncyBkaXZlIGluLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBgZnMvZXZlbnRmZF9sdW8uY2AsIGFuZCB0aGF0J3Mgd2hlcmUgdGhlIGhlYXJ0IG9mIHRoaXMgTFVPIGludGVncmF0aW9uIGxpa2VseSByZXNpZGVzLiBJdCBsb29rcyBsaWtlIHRoaXMgZmlsZSByZWdpc3RlcnMgYSBsaXZlIHVwZGF0ZSBmaWxlIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBldmVudGZkcy4gTm93LCB0aGlzIGBsaXZldXBkYXRlYCBjb25jZXB0IGlzIHN0aWxsIGEgYml0IGhhenksIEkgZG9uJ3QgcmVhZGlseSByZWNhbGwgaXQgZnJvbSBtYWlubGluZSwgc28gaXQgbXVzdCBiZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gdGhpcyBwYXRjaCBvciB0aGlzIGtlcm5lbCB0cmVlLiBCdXQgdGhlIGluc3RydWN0aW9ucyB0ZWxsIG1lIHRvICpsb29rKiBhdCB0aGUgY29kZS5cblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIGNvZGUuIFRoZSBgZnMvZXZlbnRmZF9sdW8uY2AgZmlsZSBkZWZpbmVzIGEgYHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BzYCBjYWxsZWQgYGV2ZW50ZmRfbHVvX2ZpbGVfb3BzYCB3aXRoIGZ1bmN0aW9uczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGFuZCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYC4gVGhpcyBwb2ludHMgdG8gdGhlIGNvcmUgb3BlcmF0aW9ucyBmb3IgbGl2ZSB1cGRhdGluZyBhbiBldmVudGZkLiBJdCdzIHVzaW5nIGBldmVudGZkX2x1b19nZXRfc3RhdGVgIGFuZCBgZXZlbnRmZF9jcmVhdGVgLCB3aGljaCBhcmUgZXhwbGljaXRseSBleHBvcnRlZCBmcm9tIGBmcy9ldmVudGZkLmNgLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIExVTyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlc2UgZXhpc3RpbmcgYGV2ZW50ZmRgIGZ1bmN0aW9ucy4gVGltZSB0byBsb29rIGZvciBgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXJgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDY3NCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjA1LjMzMDQ5ODcwOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjI5NTMyNDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V2ZW50ZmRfbHVvLmM9MjM4PXN0YXRpYyBpbnQgX19pbml0IGV2ZW50ZmRfbHVvX2luaXQodm9pZClcXG5mcy9ldmVudGZkX2x1by5jLTIzOS17XFxuZnMvZXZlbnRmZF9sdW8uYzoyNDA6XFx0aW50IGVyciA9IGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKFxcdTAwMjZldmVudGZkX2x1b19oYW5kbGVyKTtcXG5mcy9ldmVudGZkX2x1by5jLTI0MS1cXG4tLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTIzMj1pbnQgbGl2ZXVwZGF0ZV9yZWJvb3Qodm9pZCk7XFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjMzLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oOjIzNDppbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaCk7XFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjM1LXZvaWQgbGl2ZXVwZGF0ZV91bnJlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oPTI1ND1zdGF0aWMgaW5saW5lIGludCBsaXZldXBkYXRlX3JlYm9vdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9saXZldXBkYXRlLmgtMjU4LVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oOjI1OTpzdGF0aWMgaW5saW5lIGludCBsaXZldXBkYXRlX3JlZ2lzdGVyX2ZpbGVfaGFuZGxlcihzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmZoKVxcbmluY2x1ZGUvbGludXgvbGl2ZXVwZGF0ZS5oLTI2MC17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jPTg1NT12b2lkIGx1b19maWxlX3NldF9kZXN0cm95KHN0cnVjdCBsdW9fZmlsZV9zZXQgKmZpbGVfc2V0KVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy04NjItLyoqXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYzo4NjM6ICogbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIgLSBSZWdpc3RlciBhIGZpbGUgaGFuZGxlciB3aXRoIExVTy5cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg2NC0gKiBAZmg6IFBvaW50ZXIgdG8gYSBjYWxsZXItYWxsb2NhdGVkIFxcdTAwMjZzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIuXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3My0gKi9cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jOjg3NDppbnQgbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9oYW5kbGVyICpmaClcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTg3NS17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9sdW9fZmlsZS5jLTkxNy0gKiBVbnJlZ2lzdGVycyB0aGUgZmlsZSBoYW5kbGVyIGZyb20gdGhlIGxpdmV1cGRhdGUgY29yZS4gVGhpcyBmdW5jdGlvblxcbmtlcm5lbC9saXZldXBkYXRlL2x1b19maWxlLmM6OTE4OiAqIHJldmVyc2VzIHRoZSBvcGVyYXRpb25zIG9mIGxpdmV1cGRhdGVfcmVnaXN0ZXJfZmlsZV9oYW5kbGVyKCkuXFxua2VybmVsL2xpdmV1cGRhdGUvbHVvX2ZpbGUuYy05MTktICovXFxuLS1cXG5tbS9tZW1mZF9sdW8uYz02MDk9c3RhdGljIGludCBfX2luaXQgbWVtZmRfbHVvX2luaXQodm9pZClcXG5tbS9tZW1mZF9sdW8uYy02MTAte1xcbm1tL21lbWZkX2x1by5jOjYxMTpcXHRpbnQgZXJyID0gbGl2ZXVwZGF0ZV9yZWdpc3Rlcl9maWxlX2hhbmRsZXIoXFx1MDAyNm1lbWZkX2x1b19oYW5kbGVyKTtcXG5tbS9tZW1mZF9sdW8uYy02MTItXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjA3Ljk2MDA1MjEzOVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3Njk1MjU0NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFdmVudGZkIExVTyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIHRoaXMgY29kZSBzdWNjZXNzZnVsbHkgaW1wbGVtZW50cyBhIG5ldyBmZWF0dXJlIGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgcGVyc2lzdGluZyBldmVudGZkIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGEga2V4ZWMgcmVib290IHVzaW5nIHRoZSBMaXZlIFVwZGF0ZSBPYmplY3QgKExVTykgZnJhbWV3b3JrLiBNeSBmb2N1cyBpcyBpbW1lZGlhdGVseSBkcmF3biB0byB0aGUgaW50ZWdyYXRpb24gcG9pbnRzLiBUaGUgY29uZmlnLCBgTElWRVVQREFURV9FVkVOVEZEYCwgc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaCwgZW5hYmxpbmcgdGhpcyBzcGVjaWZpYyBMVU8tYmFzZWQgcHJlc2VydmF0aW9uLiBOb3cgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGlzIHdvcmsuXG5cbk15IGluaXRpYWwgbWVudGFsIGNoZWNrbGlzdCBpbmNsdWRlczogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBUaGVzZSBhcmUgdGhlIGtleSBlbnRyeSBwb2ludHMgYW5kIGhhbmRsZXJzIHRoYXQgd2lsbCBkZWZpbmUgdGhlIGxpZmVjeWNsZSBvZiB0aGUgZXZlbnRmZCBzdGF0ZSBkdXJpbmcgdGhlIGtleGVjIHByb2Nlc3MuXG5cblRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJJ2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL2V2ZW50ZmRfbHVvLmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoZXJlIG1pZ2h0IGJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBvciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlcmUgdGhhdCBhcmUganVzdCBhcyBjcnVjaWFsIGFzIHRob3NlIGxpc3RlZC4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgc3VycHJpc2VzIG9yIGVkZ2UgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMTU3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjEyLjcyOTU3OTUzOVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTM3NDM2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJec3RhdGljLipldmVudGZkX2x1b1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkX2x1by5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V2ZW50ZmRfbHVvLmMtNzUtXFxuZnMvZXZlbnRmZF9sdW8uYzo3NjpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3ByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTc3LXtcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMTA5LVxcbmZzL2V2ZW50ZmRfbHVvLmM6MTEwOnN0YXRpYyBpbnQgZXZlbnRmZF9sdW9fZnJlZXplKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTExMS17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTEzNi1cXG5mcy9ldmVudGZkX2x1by5jOjEzNzpzdGF0aWMgdm9pZCBldmVudGZkX2x1b191bnByZXNlcnZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTEzOC17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTE0Ny1cXG5mcy9ldmVudGZkX2x1by5jOjE0ODpzdGF0aWMgaW50IGV2ZW50ZmRfbHVvX3JldHJpZXZlKHN0cnVjdCBsaXZldXBkYXRlX2ZpbGVfb3BfYXJncyAqYXJncylcXG5mcy9ldmVudGZkX2x1by5jLTE0OS17XFxuLS1cXG5mcy9ldmVudGZkX2x1by5jLTE4OC1cXG5mcy9ldmVudGZkX2x1by5jOjE4OTpzdGF0aWMgdm9pZCBldmVudGZkX2x1b19maW5pc2goc3RydWN0IGxpdmV1cGRhdGVfZmlsZV9vcF9hcmdzICphcmdzKVxcbmZzL2V2ZW50ZmRfbHVvLmMtMTkwLXtcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjA1LVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjA2OnN0YXRpYyBib29sIGV2ZW50ZmRfbHVvX2Nhbl9wcmVzZXJ2ZShzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgKmhhbmRsZXIsXFxuZnMvZXZlbnRmZF9sdW8uYy0yMDctXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjIyLVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjIzOnN0YXRpYyBjb25zdCBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX29wcyBldmVudGZkX2x1b19maWxlX29wcyA9IHtcXG5mcy9ldmVudGZkX2x1by5jLTIyNC1cXHQucHJlc2VydmUgPSBldmVudGZkX2x1b19wcmVzZXJ2ZSxcXG4tLVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjMyLVxcbmZzL2V2ZW50ZmRfbHVvLmM6MjMzOnN0YXRpYyBzdHJ1Y3QgbGl2ZXVwZGF0ZV9maWxlX2hhbmRsZXIgZXZlbnRmZF9sdW9faGFuZGxlciA9IHtcXG5mcy9ldmVudGZkX2x1by5jLTIzNC1cXHQub3BzID0gXFx1MDAyNmV2ZW50ZmRfbHVvX2ZpbGVfb3BzLFxcbi0tXFxuZnMvZXZlbnRmZF9sdW8uYy0yMzctXFxuZnMvZXZlbnRmZF9sdW8uYzoyMzg6c3RhdGljIGludCBfX2luaXQgZXZlbnRmZF9sdW9faW5pdCh2b2lkKVxcbmZzL2V2ZW50ZmRfbHVvLmMtMjM5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MTIuNzkwOTU5NzA3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTEzNDE3MDQ4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGb2N1c2luZyBvbiBFdmVudGZkJ3MgUHJlc2VydmF0aW9uIFN0YXRlKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBgZXZlbnRmZGAgbWVjaGFuaXNtLCBzcGVjaWZpY2FsbHkgdGhlIHBhcnQgZGVhbGluZyB3aXRoIFwiTFVPXCIg4oCTIExpa2VseSBVbi1tb2RpZmllZCBPYmplY3QgcHJlc2VydmF0aW9uLCBJJ20gYXNzdW1pbmcuIE15IHByaW1hcnkgZm9jdXMgaXMgcGlucG9pbnRpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGlzIHN0YXRlLiBSaWdodCBub3csIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyB0aGlzIHByZXNlcnZhdGlvbiB3b3JrcyB3aXRoaW4gdGhlIGV2ZW50ZmQgY29udGV4dC5cblxuU28sIEknbSB0aGlua2luZyBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlc2UgZnVuY3Rpb25zIGNsb3NlbHk6IGBldmVudGZkX2x1b19wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19mcmVlemVgLCBgZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZWAsIGBldmVudGZkX2x1b19yZXRyaWV2ZWAsIGBldmVudGZkX2x1b19maW5pc2hgLCBgZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYC4gVGhpcyBsYXN0IG9uZSBpcyBrZXkgdG8gZGV0ZXJtaW5pbmcgdGhlICpjdXJyZW50KiBzdGF0ZSBvZiBwcmVzZXJ2YXRpb24uIEl0J2xsIHNob3cgbWUgaWYgaXQncyBwcmVzZXJ2ZWQsIGZyb3plbiwgb3Igd2hhdGV2ZXIgZWxzZSBpcyBnb2luZyBvbi4gQW5kLCBsZXQncyBub3QgZm9yZ2V0IHRoZSBjb3JlIGNyZWF0aW9uIGZ1bmN0aW9uIGBldmVudGZkX2NyZWF0ZWAuIEknbGwgbmVlZCB0byBrbm93IGhvdyB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgcHJlc2VydmF0aW9uIGZsYWdzIGFyZSBoYW5kbGVkIGR1cmluZyBjcmVhdGlvbi5cblxuTXkgaW1tZWRpYXRlIG5leHQgc3RlcCBpcyB0byBoZWFkIG92ZXIgdG8gYGZzL2V2ZW50ZmQuY2AuIFRoZSBzb3VyY2UgZm9yIGBldmVudGZkX2x1b19nZXRfc3RhdGVgIGFuZCBgZXZlbnRmZF9jcmVhdGVgIHNob3VsZCBwcm92aWRlIHRoZSBiZXN0IGluc2lnaHRzLiBJ4oCZbGwgc3RhcnQgdGhlcmUgYW5kIHRoZW4gdHJhY2UgdGhlIGZsb3cgZnJvbSB0aGVyZS4gVGhhdCdzIHRoZSBiZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiB0aGlzIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyNzcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MTcuOTI1MTMzMDg1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU4NjY1NDQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXZlbnRmZC5jPTM3Nz1FWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2N0eF9maWxlZ2V0KTtcXG4tLVxcbmZzL2V2ZW50ZmQuYy0zNzktLyoqXFxuZnMvZXZlbnRmZC5jOjM4MDogKiBldmVudGZkX2x1b19nZXRfc3RhdGUgLSBHZXQgZXZlbnRmZCBzdGF0ZSAoY291bnQgYW5kIGZsYWdzKSBmb3IgTFVPXFxuZnMvZXZlbnRmZC5jLTM4MS0gKiBAZmlsZTogRXZlbnRmZCBmaWxlXFxuLS1cXG5mcy9ldmVudGZkLmMtMzkxLSAqL1xcbmZzL2V2ZW50ZmQuYzozOTI6aW50IGV2ZW50ZmRfbHVvX2dldF9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgX191NjQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKmZsYWdzKVxcbmZzL2V2ZW50ZmQuYy0zOTMte1xcbi0tXFxuZnMvZXZlbnRmZC5jLTQxMC19XFxuZnMvZXZlbnRmZC5jOjQxMTpFWFBPUlRfU1lNQk9MX0dQTChldmVudGZkX2x1b19nZXRfc3RhdGUpO1xcbmZzL2V2ZW50ZmQuYy00MTItXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjE3Ljk4MzgwNDg1M1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjQ0MjIxNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHByb21wdCwgYW5kIG15IHJlc3BvbnNlOlxuXG4qKlRoaW5raW5nIEFib3V0IGBldmVudGZkX2NyZWF0ZWAqKlxuXG5SaWdodCwgc28gd2UncmUgdGFsa2luZyBhYm91dCBgZXZlbnRmZF9jcmVhdGVgIGhlcmUuIEltbWVkaWF0ZWx5LCBteSBtaW5kIGp1bXBzIHRvIHRoZSBjb3JlIG9mIHRoaXMgc3lzdGVtIGNhbGw6IGNyZWF0aW5nIGFuIGV2ZW50IGZpbGUgZGVzY3JpcHRvciwgYSAqc2lnbmFsbGluZyogbWVjaGFuaXNtLiBJdCdzIGVzc2VudGlhbGx5IGEgbGlnaHR3ZWlnaHQsIGtlcm5lbC1tYW5hZ2VkIGNvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduYWwgZXZlbnRzIGJldHdlZW4gcHJvY2Vzc2VzIG9yIHRocmVhZHMuIE5vIG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwaXBlcyBvciBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGluIHNpbXBsZSBzY2VuYXJpb3MsIHRoaXMgaXMgbXVjaCBjbGVhbmVyLiBJIGFwcHJlY2lhdGUgaXRzIHNpbXBsaWNpdHkgZm9yIElQQy5cblxuVGhpbmtpbmcgZGVlcGVyLCBJJ20gY29uc2lkZXJpbmcgdGhlIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMuIFRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgdGhlIG1vc3Qgb2J2aW91cy4gWW91J3ZlIGdvdCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gYW4gZXZlbnQsIGFub3RoZXIgc2lnbmFsaW5nIGl0LiBFYXN5LiBCdXQgaXQncyBhbHNvIHVzZWZ1bCBmb3Igbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MsIHNheSwgd2hlbiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4gVGhlIHdob2xlIGNvdW50ZXItYmFzZWQgbmF0dXJlIG1ha2VzIGl0IGZsZXhpYmxlLlxuXG5Ob3csIHdoYXQgYWJvdXQgdGhlIGZsYWdzPyBgRUZEX1NFTUFQSE9SRWAgdnMuIHRoZSBkZWZhdWx0LiBUaGF0IGxpdHRsZSBiaXQgZmxpcCBjaGFuZ2VzIHRoaW5ncy4gVXNpbmcgYEVGRF9TRU1BUEhPUkVgIG1lYW5zIHRoYXQgdGhlIHJlYWQgb3BlcmF0aW9uIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgZGVjcmVtZW50cyB0aGUgY291bnRlciBieSBvbmUsIG9ubHkgc2lnbmFsaW5nIGFuIGV2ZW50IHdoZW4gaXQgZ29lcyBmcm9tIHplcm8gdG8gYSBwb3NpdGl2ZSB2YWx1ZS4gV2l0aG91dCB0aGF0LCBpdCdzIGp1c3QgYSByYXcgY291bnRlciwgYW5kIHJlYWQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmVzZXRzIHRoZSBjb3VudGVyIHRvIHplcm8uXG5cblRoZSBwb3NzaWJpbGl0aWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcyBhcmUgaW50ZXJlc3RpbmcuIEknbSBpbWFnaW5pbmcgaG93IEknZCBpbnRlZ3JhdGUgdGhpcyBpbiwgc2F5LCBhIGN1c3RvbS1idWlsdCBldmVudCBsb29wLCBvciBldmVuIGluIGEgbG9jayBpbXBsZW1lbnRhdGlvbi4gSSBjYW4gaW1tZWRpYXRlbHkgc2VlIHRoZSB1c2UgaW4gYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGNvbnRleHQsIGFuZCBob3cgaXQgY2FuIGJlIHBhaXJlZCB3aXRoIG90aGVyIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGxpa2UgbXV0ZXhlcyBhbmQgY29uZGl0aW9uIHZhcmlhYmxlcyB0byBvcHRpbWl6ZSBjZXJ0YWluIG9wZXJhdGlvbnMuIFRoaXMgaXMgYSB2ZXJ5IGhhbmR5IHRvb2wgZm9yIGJ1aWxkaW5nIHJvYnVzdCwgZWZmaWNpZW50IGNvbmN1cnJlbnQgYXBwbGljYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk3OCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjVUMDY6MDg6MjMuMDA4MjI5MjAzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzQ2OTkyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldmVudGZkX2NyZWF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9ldmVudGZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXZlbnRmZC5jPTQxMz1zdGF0aWMgaW50IGRvX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpXFxuLS1cXG5mcy9ldmVudGZkLmMtNDQ3LVxcbmZzL2V2ZW50ZmQuYzo0NDg6aW50IGV2ZW50ZmRfY3JlYXRlKF9fdTY0IGNvdW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuZnMvZXZlbnRmZC5jLTQ0OS17XFxuLS1cXG5mcy9ldmVudGZkLmMtNDUxLX1cXG5mcy9ldmVudGZkLmM6NDUyOkVYUE9SVF9TWU1CT0xfR1BMKGV2ZW50ZmRfY3JlYXRlKTtcXG5mcy9ldmVudGZkLmMtNDUzLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyMy4wNzE3MDgxMjJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA0NDcwNDY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6XG5cbioqRXhhbWluaW5nIEtlcm5lbCBMaXZlIFVwZGF0ZSBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ3ZlIGdvdCBhIHNpdHVhdGlvbiB3aGVyZSBJIG5lZWQgdG8gdmVyaWZ5IGEgY29uZmlndXJhdGlvbiwgYW5kIG15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggbGl2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eS4gSSBzZWUgdGhyZWUgcG90ZW50aWFsIGNvbmZpZ3MgZmxhZ2dlZDogYExJVkVVUERBVEVfRVZFTlRGRGAsIGBFVkVOVEZEYCwgYW5kIHRoZSBtb3JlIGdlbmVyYWwgYExJVkVVUERBVEVgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IGBMSVZFVVBEQVRFYCBtaWdodCBiZSB0aGUgb3ZlcmFyY2hpbmcgb25lLCBidXQgbGV0J3Mgbm90IG1ha2UgYXNzdW1wdGlvbnMuXG5cblRoZSBsb2dpY2FsIG5leHQgc3RlcCBpcyB0byBkcmlsbCBkb3duIGludG8gdGhlIEtjb25maWcgZmlsZSBmb3IgdGhlIGxpdmUgdXBkYXRlIHN1YnN5c3RlbS4gSSBuZWVkIHRvIG9wZW4gdXAgYGtlcm5lbC9saXZldXBkYXRlL0tjb25maWdgIHRvIGNvbmZpcm0gaWYgYExJVkVVUERBVEVgICppcyogdGhlIHRvcC1sZXZlbCBvcHRpb24sIG9yIGlmIGl0J3MgZGVwZW5kZW50IG9uIG9uZSBvciBib3RoIG9mIHRoZSBgRVZFTlRGRGAgY29uZmlncy4gVGhpcyBpcyBhIHByZXR0eSBzdGFuZGFyZCBkZWJ1Z2dpbmcgcHJvY2VzczsgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIHRoZW0uIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1MjEsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyNy4xMTY0MTQ1MTFaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMDI0NTI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBMSVZFVVBEQVRFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9saXZldXBkYXRlL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZz0zOD1jb25maWcgS0VYRUNfSEFORE9WRVJfRU5BQkxFX0RFRkFVTFRcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTEtXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo1Mjpjb25maWcgTElWRVVQREFURVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctNTMtXFx0Ym9vbCBcXFwiTGl2ZSBVcGRhdGUgT3JjaGVzdHJhdG9yXFxcIlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjczOmNvbmZpZyBMSVZFVVBEQVRFX01FTUZEXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy03NC1cXHRib29sIFxcXCJMaXZlIHVwZGF0ZSBzdXBwb3J0IGZvciBtZW1mZFxcXCJcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctODgtXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzo4OTpjb25maWcgTElWRVVQREFURV9FVkVOVEZEXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy05MC1cXHRib29sIFxcXCJFdmVudGZkIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yNVQwNjowODoyNy4xNzg0NDc2MzlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzU2ODc5MjgwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBDb25maWd1cmF0aW9uIEZvY3VzKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCBgTElWRVVQREFURWAgYW5kIGBMSVZFVVBEQVRFX0VWRU5URkRgIGFyZSBkZWZpbml0ZWx5IHRoZSByaWdodCBmbGFncyB0byBiZSBsb29raW5nIGF0LCBhbmQgb2YgY291cnNlLCBgRVZFTlRGRGAgaXRzZWxmIGlzIGEgbmVjZXNzYXJ5IGNvbXBvbmVudC4gVGhhdCBjbGFyaWZpZXMgdGhlIGNvcmUgc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEkgbmVlZCB0byBhZGRyZXNzOiBgTElWRVVQREFURWAsIGBMSVZFVVBEQVRFX0VWRU5URkRgLCBhbmQgYEVWRU5URkRgLlxuXG5Ob3csIEkgbmVlZCB0byBkcmlsbCBkb3duIG9uIHRoZSBrZXkgZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpdmUgdXBkYXRlIHByb2Nlc3MuIE15IGF0dGVudGlvbiBuZWVkcyB0byBiZSBzcXVhcmVseSBvbjogYGV2ZW50ZmRfbHVvX3ByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX2ZyZWV6ZWAsIGBldmVudGZkX2x1b191bnByZXNlcnZlYCwgYGV2ZW50ZmRfbHVvX3JldHJpZXZlYCwgYGV2ZW50ZmRfbHVvX2ZpbmlzaGAsIGBldmVudGZkX2x1b19jYW5fcHJlc2VydmVgLCBgZXZlbnRmZF9sdW9fZ2V0X3N0YXRlYCwgYW5kIG9mIGNvdXJzZSBgZXZlbnRmZF9jcmVhdGVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGVzZSBhcmUgaW50ZXJhY3Rpbmcgd2l0aGluIHRoZSBvdmVyYWxsIGZyYW1ld29yay5cblxuTGV0J3MgY2FsbCBzZXQtcmVzdWx0cyBhbmQga2VlcCB0aGlzIG1vdmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ5OTgsIk91dHB1dFRva2VucyI6MTc4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI1VDA2OjA4OjM0Ljc0NzI0MzY2M1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkyODI4NTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJMSVZFVVBEQVRFXCIsXG4gICAgXCJMSVZFVVBEQVRFX0VWRU5URkRcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJldmVudGZkX2x1b19wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZnJlZXplXCIsXG4gICAgXCJldmVudGZkX2x1b191bnByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19yZXRyaWV2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fZmluaXNoXCIsXG4gICAgXCJldmVudGZkX2x1b19jYW5fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2dldF9zdGF0ZVwiLFxuICAgIFwiZXZlbnRmZF9jcmVhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIExpdmUgVXBkYXRlIE9yY2hlc3RyYXRvciAoTFVPKSBzdXBwb3J0IGZvciBldmVudGZkLCBhbGxvd2luZyBldmVudGZkIHN0YXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3Mga2V4ZWMuIFRoaXMgaW50cm9kdWNlcyBuZXcgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBmb3IgcHJlc2VydmluZyBhbmQgcmVzdG9yaW5nIGV2ZW50ZmQgc3RhdGUsIHdoaWNoIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTElWRVVQREFURVwiLFxuICAgIFwiTElWRVVQREFURV9FVkVOVEZEXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXZlbnRmZF9sdW9fcHJlc2VydmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2ZyZWV6ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fdW5wcmVzZXJ2ZVwiLFxuICAgIFwiZXZlbnRmZF9sdW9fcmV0cmlldmVcIixcbiAgICBcImV2ZW50ZmRfbHVvX2ZpbmlzaFwiLFxuICAgIFwiZXZlbnRmZF9sdW9fY2FuX3ByZXNlcnZlXCIsXG4gICAgXCJldmVudGZkX2x1b19nZXRfc3RhdGVcIixcbiAgICBcImV2ZW50ZmRfY3JlYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBMaXZlIFVwZGF0ZSBPcmNoZXN0cmF0b3IgKExVTykgc3VwcG9ydCBmb3IgZXZlbnRmZCwgYWxsb3dpbmcgZXZlbnRmZCBzdGF0ZSB0byBiZSBwcmVzZXJ2ZWQgYWNyb3NzIGtleGVjLiBUaGlzIGludHJvZHVjZXMgbmV3IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgZm9yIHByZXNlcnZpbmcgYW5kIHJlc3RvcmluZyBldmVudGZkIHN0YXRlLCB3aGljaCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[1] Phase: Succeeded StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 06:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 06:09:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2] Phase: Succeeded StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 06:09:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-06-25 06:09:02 +0000 UTC FinishedAt: 2026-06-25 06:09:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflow8j5hc/series-workflow8j5hc-convert-artifact-3235663150/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-06-25 06:09:12 +0000 UTC FinishedAt: 2026-06-25 06:31:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-06-25 06:09:12 +0000 UTC FinishedAt: 2026-06-25 06:31:38 +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:*96132f89-811e-4e61-8441-33ca4818d32b,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-workflow8j5hc/series-workflow8j5hc-convert-artifact-3235663150/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": "a6f79c02-79b0-47e0-8d10-0f0eb9375e77", "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-workflow8j5hc/series-workflow8j5hc-build-action-569012372/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-06-25 06:09:12 +0000 UTC FinishedAt: 2026-06-25 06:31:00 +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:*96132f89-811e-4e61-8441-33ca4818d32b,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-workflow8j5hc/series-workflow8j5hc-convert-artifact-3235663150/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": "a6f79c02-79b0-47e0-8d10-0f0eb9375e77", "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-workflow8j5hc/series-workflow8j5hc-build-action-569012372/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-06-25 06:31:38 +0000 UTC FinishedAt: 2026-06-25 06:31:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-06-25 06:31:38 +0000 UTC FinishedAt: 2026-06-25 06:31:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-06-25 06:31:38 +0000 UTC FinishedAt: 2026-06-25 06:31:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-06-25 06:31:38 +0000 UTC FinishedAt: 2026-06-25 06:31:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflow8j5hc/series-workflow8j5hc-convert-artifact-2435591969/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-06-25 06:31:48 +0000 UTC FinishedAt: 2026-06-25 06:34:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-06-25 06:31:48 +0000 UTC FinishedAt: 2026-06-25 06:33:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6f79c02-79b0-47e0-8d10-0f0eb9375e77,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-workflow8j5hc/series-workflow8j5hc-build-action-569012372/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-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-06-25 06:34:00 +0000 UTC FinishedAt: 2026-06-25 06:34:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-06-25 06:34:00 +0000 UTC FinishedAt: 2026-06-25 06:34:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-06-25 06:34:00 +0000 UTC FinishedAt: 2026-06-25 07:05:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-06-25 06:34:00 +0000 UTC FinishedAt: 2026-06-25 07:05:26 +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:*96132f89-811e-4e61-8441-33ca4818d32b,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-workflow8j5hc/series-workflow8j5hc-convert-artifact-2435591969/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": "44622c64-b67f-42d5-a1d1-7a8534cd8043", "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-workflow8j5hc/series-workflow8j5hc-build-action-128342573/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-06-25 06:34:00 +0000 UTC FinishedAt: 2026-06-25 07:04:35 +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:*96132f89-811e-4e61-8441-33ca4818d32b,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-workflow8j5hc/series-workflow8j5hc-convert-artifact-2435591969/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": "44622c64-b67f-42d5-a1d1-7a8534cd8043", "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-workflow8j5hc/series-workflow8j5hc-build-action-128342573/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-06-25 07:05:26 +0000 UTC FinishedAt: 2026-06-25 07:05:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-06-25 07:05:26 +0000 UTC FinishedAt: 2026-06-25 07:05:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-06-25 07:05:26 +0000 UTC FinishedAt: 2026-06-25 07:07:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-06-25 07:05:26 +0000 UTC FinishedAt: 2026-06-25 07:07:30 +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:*44622c64-b67f-42d5-a1d1-7a8534cd8043,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-workflow8j5hc/series-workflow8j5hc-build-action-128342573/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-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},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:*a6f79c02-79b0-47e0-8d10-0f0eb9375e77,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*44622c64-b67f-42d5-a1d1-7a8534cd8043,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-workflow8j5hc/series-workflow8j5hc-build-action-569012372/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-workflow8j5hc/series-workflow8j5hc-build-action-128342573/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 07:08:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 07:08:01 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},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-workflow8j5hc/series-workflow8j5hc-convert-artifact-1915272374/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 07:07:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 07:07:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-06-25 07:07:40 +0000 UTC FinishedAt: 2026-06-25 07:07:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-06-25 07:08:08 +0000 UTC FinishedAt: 2026-06-25 10:09:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8j5hc[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["eventfd_luo_preserve","eventfd_luo_freeze","eventfd_luo_unpreserve","eventfd_luo_retrieve","eventfd_luo_finish","eventfd_luo_can_preserve","eventfd_luo_get_state","eventfd_create"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"840ef6c78e6a2f694b578ecb9063241c992aaa9e","config_name":"upstream-apparmor-kasan.config","enable_configs":["LIVEUPDATE","LIVEUPDATE_EVENTFD","EVENTFD"],"series_id":"f3834abc-6aa9-43fe-85bd-63cc8ac29ef7","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-06-25 07:08:08 +0000 UTC FinishedAt: 2026-06-25 10:09:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6f79c02-79b0-47e0-8d10-0f0eb9375e77,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*44622c64-b67f-42d5-a1d1-7a8534cd8043,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-workflow8j5hc/series-workflow8j5hc-build-action-569012372/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-workflow8j5hc/series-workflow8j5hc-build-action-128342573/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-workflow8j5hc/series-workflow8j5hc-convert-artifact-1915272374/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,}