Name: series-workflow5mgbp Phase: Succeeded StartedAt: 2026-09-10 03:46:05 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[0] Phase: Succeeded StartedAt: 2026-09-10 03:46:05 +0000 UTC FinishedAt: 2026-09-10 03:48:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[0].run-triage Phase: Succeeded StartedAt: 2026-09-10 03:46:05 +0000 UTC FinishedAt: 2026-09-10 03:48:56 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "ca532136-4f05-41fa-a842-2965978a3d56" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_ext_migrate", "update_extent_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2V4dF9taWdyYXRlJiMzNDssCiAgICAmIzM0O3VwZGF0ZV9leHRlbnRfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBsb2dpYyBpbiBmcy9leHQ0L21pZ3JhdGUuYyAodXBkYXRlX2V4dGVudF9yYW5nZSkgdG8gZW5zdXJlIGV4dGVudCBsZW5ndGhzIGRvIG5vdCBleGNlZWQgRVhUX0lOSVRfTUFYX0xFTi4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgRVhUNF9JT0NfTUlHUkFURSBpb2N0bHMgb24gZXh0NCBmaWxlc3lzdGVtcyBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAwMzo0NzoyOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jXG5pbmRleCA1ZDYwZWYxMGZlMTEwLi5kYmJkNTM3NzMxNTU2IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9taWdyYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jXG5AQCAtNzEsNyAmIzQzOzcxLDggQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHQgKi9cbiBcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgXHUwMDI2XHUwMDI2XG4gXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jayYjNDM7MSA9PSBwYmxvY2spIFx1MDAyNlx1MDAyNlxuLVx0XHQobGItXHUwMDNlbGFzdF9ibG9jayYjNDM7MSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSkge1xuJiM0MztcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gXHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuIFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiBcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OywKICAgICYjMzQ7dXBkYXRlX2V4dGVudF9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiZTE5ZGM5YjQzNzJiYmEzNWRmMmI1ZTYzYWMwMTI1YmVhMWJiNDUwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC03MSw3ICYjNDM7NzEsOCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkgKi8KIAlpZiAobGItJmd0O2ZpcnN0X3BibG9jayAmYW1wOyZhbXA7CiAJCShsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7Ci0JCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykpIHsKJiM0MzsJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwomIzQzOwkJKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKSkgewogCQlsYi0mZ3Q7bGFzdF9wYmxvY2sgPSBwYmxvY2s7CiAJCWxiLSZndDtsYXN0X2Jsb2NrID0gbGItJmd0O2N1cnJfYmxvY2s7CiAJCWxiLSZndDtjdXJyX2Jsb2NrJiM0MzsmIzQzOzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwNgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDM0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBOZWVkIGZvciBTeXprYWxsZXIgRnV6emluZyBvbiBhIEtlcm5lbCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBwYXRjaCB0byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgaXQgd2FycmFudCBiZWluZyBmdXp6ZWQgd2l0aCBzeXprYWxsZXI/IEZpcnN0LCBJIG5lZWQgdG8gZG8gYSBxdWljayByaXNrIGFzc2Vzc21lbnQuIFRoaXMgaXMgYSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHRhc2ssIGtlcm5lbCBtYWludGVuYW5jZSByZWFsbHkuIENvbnRleHQgYW5kIHNldmVyaXR5IHNlZW0gYmVuaWduLCBtZWFuaW5nIHRoZXJlJiMzOTtzIGxpa2VseSBubyByZWFsIGRhbmdlciBpbiBkaXZpbmcgaW50byB0aGlzLiBJdCBsb29rcyBzYWZlIHRvIGV2YWx1YXRlIGZ1bGx5LgoKTm93LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGNoYW5nZS4gU3BlY2lmaWNhbGx5LCBpdOKAmXMgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgd2l0aGluIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIExvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHRoZXJlJiMzOTtzIGEgbmV3IGNoZWNrIGFkZGVkOiBgbGItJmd0O2xhc3RfYmxvY2sgLSBsYi0mZ3Q7Zmlyc3RfYmxvY2sgJiM0MzsgMSAmbHQ7IEVYVF9JTklUX01BWF9MRU5gLiBUaGF0IGxvb2tzIGxpa2UgYSBsZW5ndGggY2hlY2ssIHBvdGVudGlhbGx5IHByZXZlbnRpbmcgc29tZSBraW5kIG9mIG92ZXJmbG93IG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGV4dGVudCBtaWdyYXRpb24uIE15IHNwaWRleS1zZW5zZSBpcyB0ZWxsaW5nIG1lIHRvIGludmVzdGlnYXRlIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93cyBhcyBhIGZpcnN0IHN0ZXAgaGVyZSwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBibG9jayBudW1iZXJzIGFuZCBzaXplcy4KClRvIGdldCBhIGJldHRlciBncmlwIG9uIHRoZSBmdWxsIHBpY3R1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgc3Vycm91bmRpbmcgY29kZSwgdGhlIGNhbGxlcnMgb2YgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhbmQgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLiBJ4oCZbGwgdXNlIGBncmVwcGVyYCBvciBtYXliZSBqdXN0IGByZWFkLWZpbGVgIHRvIHVuZGVyc3RhbmQgdGhlIGJpZ2dlciBwaWN0dXJlIG9mIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgZXh0NCBmaWxlIHN5c3RlbSYjMzk7cyBtaWdyYXRpb24gcHJvY2Vzcy4gVGhpcyB3aWxsIGhlbHAgbWUgZGV0ZXJtaW5lIGhvdyBjcml0aWNhbCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgYW5kIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvYnZpb3VzIHRhcmdldHMgZm9yIGZ1enppbmcgYmFzZWQgb24gdGhlIHBhdGNoJiMzOTtzIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcbiAgIDI6XHQvKlxuICAgMzpcdCAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDdcbiAgIDQ6XHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcdTAwM2NhbmVlc2gua3VtYXJAbGludXgudm5ldC5pYm0uY29tXHUwMDNlXG4gICA1Olx0ICpcbiAgIDY6XHQgKi9cbiAgIDc6XHRcbiAgIDg6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2piZDIuaFwmIzM0O1xuICAxMDpcdCNpbmNsdWRlIFwmIzM0O2V4dDRfZXh0ZW50cy5oXCYjMzQ7XG4gIDExOlx0XG4gIDEyOlx0LypcbiAgMTM6XHQgKiBUaGUgY29udGlndW91cyBibG9ja3MgZGV0YWlscyB3aGljaCBjYW4gYmVcbiAgMTQ6XHQgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcbiAgMTU6XHQgKi9cbiAgMTY6XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xuICAxNzpcdFx0ZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gIDE4Olx0XHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiAgMTk6XHR9O1xuICAyMDpcdFxuICAyMTpcdHN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDIyOlx0XHRcdFx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICAyMzpcdFxuICAyNDpcdHtcbiAgMjU6XHRcdGludCByZXR2YWwgPSAwLCBuZWVkZWQ7XG4gIDI2Olx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXh0O1xuICAyNzpcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGg7XG4gIDI4Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXG4gIDI5Olx0XHRcdHJldHVybiAwO1xuICAzMDpcdFxuICAzMTpcdFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXG4gIDMyOlx0XHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cdTAwM2VmaXJzdF9ibG9jayk7XG4gIDMzOlx0XHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSk7XG4gIDM0Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXh0LCBsYi1cdTAwM2VmaXJzdF9wYmxvY2spO1xuICAzNTpcdFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cbiAgMzY6XHRcdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiAgMzc6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XG4gIDM4Olx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4gIDM5Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDQwOlx0XHRcdGdvdG8gZXJyX291dDtcbiAgNDE6XHRcdH1cbiAgNDI6XHRcbiAgNDM6XHRcdC8qXG4gIDQ0Olx0XHQgKiBDYWxjdWxhdGUgdGhlIGNyZWRpdCBuZWVkZWQgdG8gaW5zZXJ0aW5nIHRoaXMgZXh0ZW50XG4gIDQ1Olx0XHQgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgdGhpcyBpbiBsb29wIHdlIG1heSBhY2N1bXVsYXRlIGV4dHJhXG4gIDQ2Olx0XHQgKiBjcmVkaXQuIEJ1dCBiZWxvdyB3ZSB0cnkgdG8gbm90IGFjY3VtdWxhdGUgdG9vIG11Y2hcbiAgNDc6XHRcdCAqIG9mIHRoZW0gYnkgcmVzdGFydGluZyB0aGUgam91cm5hbC5cbiAgNDg6XHRcdCAqL1xuICA0OTpcdFx0bmVlZGVkID0gZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KGlub2RlLFxuICA1MDpcdFx0XHQgICAgbGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEsIHBhdGgpO1xuICA1MTpcdFxuICA1MjpcdFx0cmV0dmFsID0gZXh0NF9kYXRhc2VtX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgaW5vZGUsIG5lZWRlZCwgbmVlZGVkLCAwKTtcbiAgNTM6XHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4gIDU0Olx0XHRcdGdvdG8gZXJyX291dDtcbiAgNTU6XHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4dCwgMCk7XG4gIDU2Olx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuICA1NzpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xuICA1ODpcdGVycl9vdXQ6XG4gIDU5Olx0XHR1cF93cml0ZSgoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKSk7XG4gIDYwOlx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG4gIDYxOlx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSAwO1xuICA2MjpcdFx0cmV0dXJuIHJldHZhbDtcbiAgNjM6XHR9XG4gIDY0Olx0XG4gIDY1Olx0c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDY2Olx0XHRcdFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDY3Olx0e1xuICA2ODpcdFx0aW50IHJldHZhbDtcbiAgNjk6XHRcdC8qXG4gIDcwOlx0XHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcbiAgNzE6XHRcdCAqL1xuICA3MjpcdFx0aWYgKGxiLVx1MDAzZWZpcnN0X3BibG9jayBcdTAwMjZcdTAwMjZcbiAgNzM6XHRcdFx0KGxiLVx1MDAzZWxhc3RfcGJsb2NrJiM0MzsxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG4gIDc0Olx0XHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrJiM0MzsxID09IGxiLVx1MDAzZWN1cnJfYmxvY2spIFx1MDAyNlx1MDAyNlxuICA3NTpcdFx0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gIDc2Olx0XHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuICA3NzpcdFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiAgNzg6XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gIDc5Olx0XHRcdHJldHVybiAwO1xuICA4MDpcdFx0fVxuICA4MTpcdFx0LypcbiAgODI6XHRcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxuICA4MzpcdFx0ICovXG4gIDg0Olx0XHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xuICA4NTpcdFx0bGItXHUwMDNlZmlyc3RfcGJsb2NrID0gbGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDg2Olx0XHRsYi1cdTAwM2VmaXJzdF9ibG9jayA9IGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4NzpcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gIDg4Olx0XHRyZXR1cm4gcmV0dmFsO1xuICA4OTpcdH1cbiAgOTA6XHRcbiAgOTE6XHRzdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDkyOlx0XHRcdFx0XHQgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuICA5MzpcdFx0XHRcdFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgOTQ6XHR7XG4gIDk1Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuICA5NjpcdFx0X19sZTMyICppX2RhdGE7XG4gIDk3Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAgOTg6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuICA5OTpcdFxuIDEwMDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTExOAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgZXh0NCBNaWdyYXRpb24gQ29kZSoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZW50cnkgcG9pbnRzIGFuZCBvdmVyYWxsIGZsb3cgZm9yIGV4dDQgbWlncmF0aW9uIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIFJpZ2h0IG5vdywgSSYjMzk7bSBmb2N1c2VkIG9uIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRvIGdldCBhIGNvbXBsZXRlIGdyYXNwIG9mIHRoaXMsIEkgbmVlZCB0byBsb29rIGF0IHRoZSByZXN0IG9mIHRoaXMgZmlsZS4gVGhlIGltcG9ydGFudCBwYXJ0IEkgbmVlZCBpcyB0aGUgaW5pdGlhbCBmdW5jdGlvbiBjYWxsIGFuZCBob3cgdGhpcyBlbnRpcmUgbWlncmF0aW9uIHByb2Nlc3MgaXMgdHJpZ2dlcmVkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBVbmRlcnN0YW5kaW5nIHRoZSBlbnRyeSBwb2ludHMgd2lsbCBnaXZlIG1lIHRoZSBob29rcyBJIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvIHRoZSBtZWNoYW5pY3Mgb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF9taWdyYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zMjU0PWludCBleHQ0X2ZvcmNlX3NodXRkb3duKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncyk7XG4tLVxuZnMvZXh0NC9leHQ0LmgtMzI1Ni0vKiBtaWdyYXRlLmMgKi9cbmZzL2V4dDQvZXh0NC5oOjMyNTc6ZXh0ZXJuIGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqKTtcbmZzL2V4dDQvZXh0NC5oLTMyNTgtZXh0ZXJuIGludCBleHQ0X2luZF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuLS1cbmZzL2V4dDQvaW9jdGwuYz01OTA9c3RhdGljIGludCBleHQ0X2lvY3RsX3NldGZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTcwNS1cdFx0aWYgKGZsYWdzIFx1MDAyNiBFWFQ0X0VYVEVOVFNfRkwpXG5mcy9leHQ0L2lvY3RsLmM6NzA2Olx0XHRcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xuZnMvZXh0NC9pb2N0bC5jLTcwNy1cdFx0ZWxzZVxuLS1cbmZzL2V4dDQvaW9jdGwuYz0xNTM4PXN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTE3MDEtXHRcdGlub2RlX2xvY2soKGlub2RlKSk7XG5mcy9leHQ0L2lvY3RsLmM6MTcwMjpcdFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XG5mcy9leHQ0L2lvY3RsLmMtMTcwMy1cdFx0aW5vZGVfdW5sb2NrKChpbm9kZSkpO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTM5MT1zdGF0aWMgaW50IGZyZWVfZXh0X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNDEwLVxuZnMvZXh0NC9taWdyYXRlLmM6NDExOmludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9leHQ0L21pZ3JhdGUuYy00MTIte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU3NTcKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCBmaWd1cmUgb3V0IGl0cyBLY29uZmlnIGRlcGVuZGVuY2llcy4gV2hlcmUgc2hvdWxkIEkgc3RhcnQ/IFRoZSBvYnZpb3VzIHBsYWNlcyBhcmUgdGhlIGBNYWtlZmlsZWAgYW5kIGBLY29uZmlnYCBmaWxlcyB3aXRoaW4gdGhlIGBmcy9leHQ0YCBkaXJlY3RvcnkuIEkmIzM5O2xsIGNoZWNrIHRob3NlIGZpcnN0LiBUaGV5IHNob3VsZCBleHBsaWNpdGx5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBpbmNsdXNpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGZpbGUsIGFuZCB0aGF0IHNob3VsZCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIE5vIG5lZWQgdG8gb3ZlcnRoaW5rIGl0OyB0aGUgYW5zd2VyIHNob3VsZCBiZSByaWdodCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttaWdyYXRlXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9NYWtlZmlsZT04PWV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGUtOS1cdFx0ZXh0ZW50c19zdGF0dXMubyBmaWxlLm8gZnNtYXAubyBmc3luYy5vIGhhc2gubyBpYWxsb2MubyBcXFxuZnMvZXh0NC9NYWtlZmlsZToxMDpcdFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxuZnMvZXh0NC9NYWtlZmlsZS0xMS1cdFx0bW1wLm8gbW92ZV9leHRlbnQubyBuYW1laS5vIHBhZ2UtaW8ubyByZWFkcGFnZS5vIHJlc2l6ZS5vIFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA5NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkV4dDQgTW9kdWxlIERlcGVuZGVuY2llcyoqCgpSaWdodCwgc28gYG1pZ3JhdGUub2AuLi4gdGhhdCYjMzk7cyBwYXJ0IG9mIHRoZSBgZXh0NC15YCBidWlsZCwgYW5kICp0aGF0KiBtZWFucyBpdCBnZXRzIGJ1aWx0IHdoZW5ldmVyIHRoZSBgQ09ORklHX0VYVDRfRlNgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2QgdG8ga25vdywgYW5kIGZyYW5rbHksIEkgc2hvdWxkIGhhdmUgcmVtZW1iZXJlZCB0aGF0IGZyb20gcmV2aWV3aW5nIHRoZSBidWlsZCBzeXN0ZW0gYmVmb3JlLiBJdCYjMzk7cyBhIGtleSBkZXBlbmRlbmN5LiBOb3csIEkgd2FudCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBhbGwgdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24ga25vYnMgYXNzb2NpYXRlZCB3aXRoIGV4dDQuIEkmIzM5O2xsIHRha2UgYSBsb29rIGF0IGBmcy9leHQ0L0tjb25maWdgIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQmIzM5O2xsIGJlIGludGVyZXN0aW5nIHRvIHNlZSBpZiBhbnkgbmV3IG9uZXMgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIG15IGxhc3QgZGV0YWlsZWQgcmV2aWV3LiBJIG1heSBhbHNvIHdhbnQgdG8gY29tcGFyZSB3aXRoIHByaW9yIGtlcm5lbCB2ZXJzaW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgRVhUNF9GU1xuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cJiMzNDtcbiAgIDQ6XHRcdHNlbGVjdCBCVUZGRVJfSEVBRFxuICAgNTpcdFx0c2VsZWN0IEpCRDJcbiAgIDY6XHRcdHNlbGVjdCBDUkMxNlxuICAgNzpcdFx0c2VsZWN0IENSQzMyXG4gICA4Olx0XHRzZWxlY3QgRlNfSU9NQVBcbiAgIDk6XHRcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxuICAxMDpcdFx0aGVscFxuICAxMTpcdFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cbiAgMTI6XHRcbiAgMTM6XHRcdCAgVW5saWtlIHRoZSBjaGFuZ2UgZnJvbSBleHQyIGZpbGVzeXN0ZW0gdG8gZXh0MyBmaWxlc3lzdGVtLFxuICAxNDpcdFx0ICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NCBpcyBub3QgZm9yd2FyZHMgY29tcGF0aWJsZSB3aXRoXG4gIDE1Olx0XHQgIGV4dDM7IGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXRcbiAgMTY6XHRcdCAgcGh5c2ljYWwgYmxvY2sgbnVtYmVycy4gIFRoZSBleHQ0IGZpbGVzeXN0ZW0gYWxzbyBzdXBwb3J0cyBkZWxheWVkXG4gIDE3Olx0XHQgIGFsbG9jYXRpb24sIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwgaGlnaCByZXNvbHV0aW9uIHRpbWUgc3RhbXBzLFxuICAxODpcdFx0ICBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgZmVhdHVyZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgc3BlZWRcbiAgMTk6XHRcdCAgdXAgZnNjayB0aW1lLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIHdlYiBwYWdlcyBhdFxuICAyMDpcdFx0ICBodHRwOi8vZXh0NC53aWtpLmtlcm5lbC5vcmcuXG4gIDIxOlx0XG4gIDIyOlx0XHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxuICAyMzpcdFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXG4gIDI0Olx0XHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XG4gIDI1Olx0XHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcbiAgMjY6XHRcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXG4gIDI3Olx0XHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXG4gIDI4Olx0XHQgIGNvbXBhdGlibGUuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcbiAgMzE6XHRcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXG4gIDM2Olx0XHRib29sIFwmIzM0O1VzZSBleHQ0IGZvciBleHQyIGZpbGUgc3lzdGVtc1wmIzM0O1xuICAzNzpcdFx0ZGVwZW5kcyBvbiBFWFQ0X0ZTXG4gIDM4Olx0XHRkZXBlbmRzIG9uIEVYVDJfRlM9blxuICAzOTpcdFx0ZGVmYXVsdCB5XG4gIDQwOlx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5NDQKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA0NzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUmVjZW50IGV4dDQgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGEgcmVjZW50IHBhdGNoIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgbW9kaWZpZXMgdGhlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBpdCBhZGRzIGEgY2hlY2sgd2l0aGluIHRoZSBgaWZgIHN0YXRlbWVudCB0aGF0IGRldGVybWluZXMgaWYgd2UgY2FuIGV4dGVuZCBhbiBleGlzdGluZyBleHRlbnQgcmFuZ2UuIFRoZSBvcmlnaW5hbCBjaGVjayB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogYChsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7IChsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaylgLiBOb3csIHRoZXJlJiMzOTtzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uOiBgKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKWAuCgpBaGEhIFRoaXMgcHJldmVudHMgdGhlIGNyZWF0aW9uIG9mIGFuIGV4dGVudCB0aGF0JiMzOTtzIGxvbmdlciB0aGFuIGBFWFRfSU5JVF9NQVhfTEVOYCwgd2hpY2ggaXMgY2xlYXJseSBhIHNhZmVndWFyZCB0byBwcmV2ZW50IG92ZXJmbG93aW5nIHRoZSAxNi1iaXQgYGVlX2xlbmAgZmllbGQgaW4gZXh0NCBleHRlbnRzLiBXaXRob3V0IHRoaXMgY2hlY2ssIHRoZSBvbGQgY29kZSBjb3VsZCBoYXZlIGFsbG93ZWQgYGVlX2xlbmAgdG8gd3JhcCBvciBleGNlZWQgdGhlIGludGVuZGVkIG1heGltdW0uCgpOb3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGlzIHJlYWNoYWJsZSBhbmQsIHRoZXJlZm9yZSwgd29ydGggZnV6emluZz8gQWJzb2x1dGVseSwgeWVzISBUaGlzIGlzIHJpZ2h0IGluIHRoZSBoZWFydCBvZiB0aGUgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljLiBXZSBoYXZlIG11bHRpcGxlIHdheXMgdG8gdHJpZ2dlciB0aGlzIGNvbmRpdGlvbiDigJMgdGhyb3VnaCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIGlvY3RsIG9yIHBvdGVudGlhbGx5IHVzaW5nIGBGU19JT0NfU0VURkxBR1NgIHdpdGggYEVYVDRfRVhURU5UU19GTGAgZmxhZyBvbiBhbiBleHQ0IGZpbGUgc3lzdGVtLCBwYXJ0aWN1bGFybHkgb25lIGVtcGxveWluZyBpbmRpcmVjdCBibG9ja3Mgb3IgZHVyaW5nIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IHRvIGV4dGVudC4gR2l2ZW4gU3l6a2FsbGVyJiMzOTtzIHByb2ZpY2llbmN5LCBpdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgdG8gdHJpZ2dlciB0aGVzZSBgRVhUNF9JT0NfTUlHUkFURWAgb3IgYEZTX0lPQ19TRVRGTEFHU2AgY2FsbHMsIG1ha2luZyB0aGlzIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBEZWZpbml0ZWx5IHdvcnRoRnV6emluZy4KCk5leHQsIEkgbmVlZCB0byBjaGVjayB0aGUgRm9jdXNTeW1ib2xzLCB3aGljaCBpcyBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBiZXR0ZXIsIEkgc2hvdWxkIGV4YW1pbmUgdGhlIGNhbGxpbmcgY29udGV4dCBhbmQgdGhlIG90aGVyIGZ1bmN0aW9ucyB3aXRoaW4gYG1pZ3JhdGUuY2AsIHNvIEkmIzM5O2xsIG5lZWQgdG8gcmVhZCB0aGUgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGZyb20gbGluZSAxMDAgdG8gdGhlIGVuZCwgdG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UgbW9yZSBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwMDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTAxOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMDI6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEwMzpcdFxuIDEwNDpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMDU6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEwNjpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTA3Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDEwODpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxMDk6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDExMDpcdFx0XHRcdFx0YnJlYWs7XG4gMTExOlx0XHRcdH0gZWxzZSB7XG4gMTEyOlx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gMTEzOlx0XHRcdH1cbiAxMTQ6XHRcdH1cbiAxMTU6XHRcdHB1dF9iaChiaCk7XG4gMTE2Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDExNzpcdFxuIDExODpcdH1cbiAxMTk6XHRcbiAxMjA6XHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDEyMTpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTIyOlx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxMjM6XHR7XG4gMTI0Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDEyNTpcdFx0X19sZTMyICppX2RhdGE7XG4gMTI2Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxMjc6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEyODpcdFxuIDEyOTpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTMwOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMzE6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEzMjpcdFxuIDEzMzpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMzQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEzNTpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTM2Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcbiAxMzc6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XG4gMTM4Olx0XHRcdFx0aWYgKHJldHZhbClcbiAxMzk6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MDpcdFx0XHR9IGVsc2Uge1xuIDE0MTpcdFx0XHRcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xuIDE0MjpcdFx0XHRcdGxiLVx1MDAzZWN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDE0MzpcdFx0XHR9XG4gMTQ0Olx0XHR9XG4gMTQ1Olx0XHRwdXRfYmgoYmgpO1xuIDE0NjpcdFx0cmV0dXJuIHJldHZhbDtcbiAxNDc6XHRcbiAxNDg6XHR9XG4gMTQ5Olx0XG4gMTUwOlx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxNTE6XHRcdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuIDE1MjpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gMTUzOlx0e1xuIDE1NDpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxNTU6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDE1NjpcdFx0aW50IGksIHJldHZhbCA9IDA7XG4gMTU3Olx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxNTg6XHRcbiAxNTk6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xuIDE2MDpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTYxOlx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxNjI6XHRcbiAxNjM6XHRcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTY0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxNjU6XHRcdFx0aWYgKGlfZGF0YVtpXSkge1xuIDE2NjpcdFx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE2NzpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNjg6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE2OTpcdFx0XHRcdFx0YnJlYWs7XG4gMTcwOlx0XHRcdH0gZWxzZSB7XG4gMTcxOlx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTcyOlx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcbiAxNzM6XHRcdFx0fVxuIDE3NDpcdFx0fVxuIDE3NTpcdFx0cHV0X2JoKGJoKTtcbiAxNzY6XHRcdHJldHVybiByZXR2YWw7XG4gMTc3Olx0XG4gMTc4Olx0fVxuIDE3OTpcdFxuIDE4MDpcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxuIDE4MTpcdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcbiAxODI6XHR7XG4gMTgzOlx0XHRpbnQgaTtcbiAxODQ6XHRcdF9fbGUzMiAqdG1wX2lkYXRhO1xuIDE4NTpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxODY6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIDE4NzpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTg4Olx0XHRpbnQgZXJyO1xuIDE4OTpcdFxuIDE5MDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcbiAxOTE6XHRcdGlmIChJU19FUlIoYmgpKVxuIDE5MjpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTkzOlx0XG4gMTk0Olx0XHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDE5NTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTk2Olx0XHRcdGlmICh0bXBfaWRhdGFbaV0pIHtcbiAxOTc6XHRcdFx0XHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxuIDE5ODpcdFx0XHRcdFx0RVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUyxcbiAxOTk6XHRcdFx0XHRcdGV4dDRfZnJlZV9tZXRhZGF0YV9yZXZva2VfY3JlZGl0cyhzYiwgMSkpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDQ4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgYGZzL2V4dDQvbWlncmF0ZS5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGhvdyB0aGlzIG1pZ3JhdGlvbiBwcm9jZXNzIHdvcmtzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJJiMzOTt2ZSBnb3QgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIGV4dGVudCBtYW5hZ2VtZW50IHNjaGVtZS4gSSBzaG91bGQgbWFwIG91dCB0aGUgY29udHJvbCBmbG93LgoKVG8gZG8gdGhhdCwgSSYjMzk7bSBnb2luZyB0byBsb29rIGNsb3NlbHkgYXQgdGhlIGZ1bmN0aW9uJiMzOTtzIGNhbGxlcnMuIEkgbmVlZCB0byBzZWUgKndobyogaXMgdHJpZ2dlcmluZyB0aGlzIG1pZ3JhdGlvbiwgYW5kICp3aHkqLiBXaGF0IHNjZW5hcmlvcyBhcmUgd2UgYWRkcmVzc2luZyB3aXRoIHRoaXMgZnVuY3Rpb25hbGl0eT8gVGhlbiwgSSBoYXZlIHRvIHRyYWNlIGhvdyBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgdXNlZCwgYXMgaXQgc2VlbXMgZnVuZGFtZW50YWwgdG8gdGhlIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBwcm9jZXNzLiBJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0JiMzOTtzIGNhbGxlZCBhbmQgd2hhdCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCB0byBmdWxseSBjb21wcmVoZW5kIGl0cyByb2xlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgaW1wYWN0IG9uIHRoZSBvbi1kaXNrIHN0cnVjdHVyZXMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiBob3cgZXh0ZW50cyBhcmUgYmVpbmcgbWFuYWdlZCBkdXJpbmcgdGhlIG1pZ3JhdGlvbiwgaW5jbHVkaW5nIHRoZSBpbXBhY3Qgb24gdGhlIGZpbGVzeXN0ZW0mIzM5O3MgbWV0YWRhdGEuIEkmIzM5O20gZ3Vlc3NpbmcgdGhhdCBJJiMzOTtsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGFjdHVhbCBjb2RlIG9mIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byB1bmRlcnN0YW5kIHRoaXMgcHJvY2VzcyBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdGVycl9vdXQ6XG4gMzUxOlx0XHRyZXR1cm4gcmV0dmFsO1xuIDM1MjpcdH1cbiAzNTM6XHRcbiAzNTQ6XHRzdGF0aWMgaW50IGZyZWVfZXh0X2lkeChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDM1NTpcdFx0XHRcdFx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeClcbiAzNTY6XHR7XG4gMzU3Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAzNTg6XHRcdGV4dDRfZnNibGtfdCBibG9jaztcbiAzNTk6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMzYwOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDtcbiAzNjE6XHRcbiAzNjI6XHRcdGJsb2NrID0gZXh0NF9pZHhfcGJsb2NrKGl4KTtcbiAzNjM6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBibG9jaywgMCk7XG4gMzY0Olx0XHRpZiAoSVNfRVJSKGJoKSlcbiAzNjU6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDM2NjpcdFxuIDM2NzpcdFx0ZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKWJoLVx1MDAzZWJfZGF0YTtcbiAzNjg6XHRcdGlmIChlaC1cdTAwM2VlaF9kZXB0aCAhPSAwKSB7XG4gMzY5Olx0XHRcdGl4ID0gRVhUX0ZJUlNUX0lOREVYKGVoKTtcbiAzNzA6XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcyk7IGkmIzQzOyYjNDM7LCBpeCYjNDM7JiM0MzspIHtcbiAzNzE6XHRcdFx0XHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xuIDM3MjpcdFx0XHRcdGlmIChyZXR2YWwpIHtcbiAzNzM6XHRcdFx0XHRcdHB1dF9iaChiaCk7XG4gMzc0Olx0XHRcdFx0XHRyZXR1cm4gcmV0dmFsO1xuIDM3NTpcdFx0XHRcdH1cbiAzNzY6XHRcdFx0fVxuIDM3NzpcdFx0fVxuIDM3ODpcdFx0cHV0X2JoKGJoKTtcbiAzNzk6XHRcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MsXG4gMzgwOlx0XHRcdFx0ZXh0NF9mcmVlX21ldGFkYXRhX3Jldm9rZV9jcmVkaXRzKGlub2RlLVx1MDAzZWlfc2IsIDEpKTtcbiAzODE6XHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4gMzgyOlx0XHRcdHJldHVybiByZXR2YWw7XG4gMzgzOlx0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrLCAxLFxuIDM4NDpcdFx0XHRcdCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBIHwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuIDM4NTpcdFx0cmV0dXJuIDA7XG4gMzg2Olx0fVxuIDM4NzpcdFxuIDM4ODpcdC8qXG4gMzg5Olx0ICogRnJlZSB0aGUgZXh0ZW50IG1ldGEgZGF0YSBibG9ja3Mgb25seVxuIDM5MDpcdCAqL1xuIDM5MTpcdHN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcbiAzOTI6XHR7XG4gMzkzOlx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAzOTQ6XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiAzOTU6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoID0gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKillaS1cdTAwM2VpX2RhdGE7XG4gMzk2Olx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeDtcbiAzOTc6XHRcdGlmIChlaC1cdTAwM2VlaF9kZXB0aCA9PSAwKVxuIDM5ODpcdFx0XHQvKlxuIDM5OTpcdFx0XHQgKiBObyBleHRyYSBibG9ja3MgYWxsb2NhdGVkIGZvciBleHRlbnQgbWV0YSBkYXRhXG4gNDAwOlx0XHRcdCAqL1xuIDQwMTpcdFx0XHRyZXR1cm4gMDtcbiA0MDI6XHRcdGl4ID0gRVhUX0ZJUlNUX0lOREVYKGVoKTtcbiA0MDM6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVx1MDAzZWVoX2VudHJpZXMpOyBpJiM0MzsmIzQzOywgaXgmIzQzOyYjNDM7KSB7XG4gNDA0Olx0XHRcdHJldHZhbCA9IGZyZWVfZXh0X2lkeChoYW5kbGUsIGlub2RlLCBpeCk7XG4gNDA1Olx0XHRcdGlmIChyZXR2YWwpXG4gNDA2Olx0XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0MDc6XHRcdH1cbiA0MDg6XHRcdHJldHVybiByZXR2YWw7XG4gNDA5Olx0fVxuIDQxMDpcdFxuIDQxMTpcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNDEyOlx0e1xuIDQxMzpcdFx0aGFuZGxlX3QgKmhhbmRsZTtcbiA0MTQ6XHRcdGludCByZXR2YWwgPSAwLCBpO1xuIDQxNTpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE2Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MTc6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MTg6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MTk6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIwOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyMTpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDIyOlx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyMzpcdFxuIDQyNDpcdFx0LypcbiA0MjU6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI2Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQyNzpcdFx0ICovXG4gNDI4Olx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQyOTpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMwOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzI6XHRcbiA0MzM6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM0Olx0XHRcdC8qXG4gNDM1Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzNjpcdFx0XHQgKi9cbiA0Mzc6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MDpcdFxuIDQ0MTpcdFx0LypcbiA0NDI6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDM6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ0Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NDc6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ0ODpcdFxuIDQ0OTpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMzM0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gUmlnaHQsIGl0JiMzOTtzIG1pZ3JhdGluZyBkYXRhIGV4dGVudHMuIFRoZSBiYXNpYyBmbG93IEkgbmVlZCB0byB1bmRlcnN0YW5kIGlzIGhvdyB0aGUgdXBkYXRlcyBhcmUgaGFuZGxlZC4gSXQgc2VlbXMgdGhhdCBgZXh0NF9leHRfbWlncmF0ZWAgcmVsaWVzIG9uIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBkbyB0aGUgaGVhdnkgbGlmdGluZy4gSW4gc29tZSBjYXNlcyAobGlrZSBkaXJlY3QgYmxvY2tzLCBJIGJlbGlldmUpLCBpdCBjYWxscyB0aGF0IGZ1bmN0aW9uIGRpcmVjdGx5LiBGb3IgaW5kaXJlY3QgYmxvY2tzIGFuZCBiZXlvbmQsIGl0IGFwcGVhcnMgd2UmIzM5O3JlIGdvaW5nIHRocm91Z2ggYSBoaWVyYXJjaHk6IGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAuIFRoYXQgbWFrZXMgc2Vuc2U7IGl0JiMzOTtzIGEgd2F5IHRvIGhhbmRsZSB0aGUgZGlmZmVyZW50IGxldmVscyBvZiBpbmRpcmVjdGlvbiBpbiB0aGUgaW5vZGUuCgpUbyByZWFsbHkgbmFpbCBkb3duIHRoZSBkZXRhaWxzLCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgbG9vayBhdCB0aGUgYWN0dWFsIGNvZGUuIExldCYjMzk7cyB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzZWN0aW9uOiBsaW5lcyA0NTAgdG8gNTIwIG9mIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiBob3cgdGhlIGRpZmZlcmVudCBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdmFyaWFudHMgYXJlIGNhbGxlZCBhbmQgd2hhdCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZC4gSSB3YW50IHRvIHNlZSBob3cgdGhlIG1ldGFkYXRhIGlzIHVwZGF0ZWQgYXQgZWFjaCBzdGFnZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA3MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDUwOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1MjpcdFx0fVxuIDQ1MzpcdFx0LypcbiA0NTQ6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1NTpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTY6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDU3Olx0XHQgKi9cbiA0NTg6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDU5Olx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYwOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjE6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDYyOlx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2MzpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0NjQ6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiA0NjU6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2NjpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDY3Olx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDY4Olx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDY5Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzA6XHRcdH1cbiA0NzE6XHRcdC8qXG4gNDcyOlx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3MzpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NDpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0NzU6XHRcdCAqL1xuIDQ3NjpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ3NzpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ3ODpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0Nzk6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgwOlx0XHQvKlxuIDQ4MTpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDgyOlx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4MzpcdFx0ICovXG4gNDg0Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0ODc6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDg4Olx0XG4gNDg5Olx0XHQvKlxuIDQ5MDpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiA0OTE6XHRcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxuIDQ5MjpcdFx0ICpcbiA0OTM6XHRcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXG4gNDk0Olx0XHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcbiA0OTU6XHRcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXG4gNDk2Olx0XHQgKi9cbiA0OTc6XHRcdC8qXG4gNDk4Olx0XHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXG4gNDk5Olx0XHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxuIDUwMDpcdFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXG4gNTAxOlx0XHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXG4gNTAyOlx0XHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXG4gNTAzOlx0XHQgKiBhbGxvY2F0aW9uLlxuIDUwNDpcdFx0ICovXG4gNTA1Olx0XHRkb3duX3JlYWQoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiA1MDY6XHRcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcbiA1MDc6XHRcdHVwX3JlYWQoKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSkpO1xuIDUwODpcdFxuIDUwOTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xuIDUxMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNTExOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA1MTI6XHRcdFx0Z290byBvdXRfdG1wX2lub2RlO1xuIDUxMzpcdFx0fVxuIDUxNDpcdFxuIDUxNTpcdFx0aV9kYXRhID0gZWktXHUwMDNlaV9kYXRhO1xuIDUxNjpcdFx0bWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcbiA1MTc6XHRcbiA1MTg6XHRcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cbiA1MTk6XHRcdG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5MzUKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIFRoYXQmIzM5O3MgdGhlIGVudHJ5IHBvaW50LCB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGtpY2tzIG9mZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBOb3csIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBsaXZpbmcgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEdvb2QsIHRoYXQgbWVhbnMgaXQmIzM5O3MgbG9jYWxpemVkIGFuZCB3ZSBoYXZlIGEgZ29vZCBncmFzcCBvZiBpdHMgc2NvcGUuIFJpZ2h0LCBsZXQmIzM5O3MgdmVyaWZ5IGlmIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBpbmxpbmVkIG9yIHN0YXRpYzsgeWVwIGl0JiMzOTtzIGRlY2xhcmVkIGBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoLi4uKWAuIFBlcmZlY3QuCgpNeSBrZXkgZm9jdXMgcG9pbnRzIGhlcmUgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIHRoZW4gdGhvc2UgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHZhcmlhbnRzLiBJbmNsdWRpbmcgYHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlYCwgYHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZWAsIGFuZCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aG9zZSBmaXQgdG9nZXRoZXIuCgpBcyBmb3IgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMsIEkmIzM5O20gcHJldHR5IHN1cmUgd2UgbmVlZCBgRVhUNF9GU2AuIEJ1dCBJIHNob3VsZCByZWFsbHkgZG91YmxlLWNoZWNrIGZvciBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzOyBpdCYjMzk7cyBhbHdheXMgZ29vZCB0byBiZSB0aG9yb3VnaC4gSSYjMzk7bGwgdGFrZSBhIHF1aWNrIHNjYW4gb2YgYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBsb29rIGZvciBhbnkgYCNpZmRlZmAgYmxvY2tzLiBUaGF0JiMzOTtsbCB0ZWxsIHVzIGlmIGFueSBvdGhlciBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9ucyBjb21lIGludG8gcGxheSBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0OyNpZiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM0NTQKCQkJCQkJCW91dHB1dDogMTIxCgkJCQkJCQl0aG91Z2h0czogMjUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIGBmcy9leHQ0L21pZ3JhdGUuY2AqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBmcy9leHQ0L21pZ3JhdGUuY2AgYW5kIGltbWVkaWF0ZWx5IG5vdGljZSB0aGVyZSBhcmUgbm8gYCNpZmRlZmAgZGlyZWN0aXZlcywgd2hpY2ggaXMgYSBnb29kIHNpZ24g4oCTIGxlc3MgdG8gd29ycnkgYWJvdXQgaW4gdGVybXMgb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gY29tcGxleGl0eS4gVGltZSB0byBpbnZlc3RpZ2F0ZSB0aGUgZGVwZW5kZW5jaWVzIHRocm91Z2ggS2NvbmZpZy4gTG9va3MgbGlrZSBgRVhUNF9GU2Agc2VsZWN0cyBgQlVGRkVSX0hFQURgLCBgSkJEMmAsIGBDUkMxNmAsIGBDUkMzMmAsIGFuZCBgRlNfSU9NQVBgLiBOb3RoaW5nIG92ZXJseSBleG90aWMgdGhlcmUsIG5vIHJlZCBmbGFncyBhYm91dCB0cmlja3kgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0dWZmIG9yIG9ic2N1cmUgaGFyZHdhcmUgZGVwZW5kZW5jaWVzIHRoYXQgd291bGQgY29tcGxpY2F0ZSBmdXp6aW5nLiBUaGlzIGlzIGFsbCBsb29raW5nIHByZXR0eSBzdHJhaWdodGZvcndhcmQgc28gZmFyLgoKTm93LCBsZXQmIzM5O3Mgcmlnb3JvdXNseSBnbyB0aHJvdWdoIHRoZSBjcml0ZXJpYSB0byBlbnN1cmUgdGhpcyBwYXRjaCBpcyBhIGdvb2QgdGFyZ2V0LiBGaXJzdCwgYFdvcnRoRnV6emluZ2A6IHRoZSBwYXRjaCBtb2RpZmllcyBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIHdpdGhpbiBgZnMvZXh0NC9taWdyYXRlLmNgLCBzcGVjaWZpY2FsbHkgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCB3aGljaCBpcyBnb29kLiBJdCYjMzk7cyBhbHNvIGNoYW5naW5nIHRoZSBydWxlcyBhcm91bmQgaG93IGV4dDQgZXh0ZW50IHJhbmdlcyBhcmUgZXh0ZW5kZWQgZHVyaW5nIG1pZ3JhdGlvbi4gVGhlIGNyaXRpY2FsIGNoYW5nZSBpcyB0aGUgbGltaXQgb24gZXh0ZW50IGxlbmd0aCBhdCBgRVhUX0lOSVRfTUFYX0xFTmAsIHRoYXQmIzM5O3MgYW4gaW50ZXJlc3RpbmcgY29uZGl0aW9uIHRvIHByb2JlLiAgQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgcGF0aCBpcyByZWFjaGFibGUgdmlhIGBpb2N0bChmZCwgRVhUNF9JT0NfTUlHUkFURSlgIG9yIGBpb2N0bChmZCwgRlNfSU9DX1NFVEZMQUdTLCAuLi4pYCDigJMgcGVyZmVjdCEgSSBjYW4gaGl0IGl0IGluIGEgdHlwaWNhbCBWTSBvciBzeXprYWxsZXIgc2V0dXAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IEkgd2FudC4gVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYC4KCk5leHQsIEkgbmVlZCB0byBkZWZpbmUgdGhlIHJlbGV2YW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIEJhc2VkIG9uIHRoZSBwYXRjaCBhbmQgdGhlIGFmZmVjdGVkIGZ1bmN0aW9ucywgdGhlIHR3byBrZXkgb25lcyBhcmUgYGV4dDRfZXh0X21pZ3JhdGVgIGFuZCB0aGUgbW9kaWZpZWQgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLiBUaGVzZSB3aWxsIGJlIG15IGBGb2N1c1N5bWJvbHNgLgoKRmluYWxseSwgZm9yIHRoZSBgRW5hYmxlQ29uZmlnc2AsIEkmIzM5O2xsIG5lZWQgYEVYVDRfRlNgLCB3aGljaCBzZWVtcyBvYnZpb3VzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGNvbmZpcm0uCgpBbHJpZ2h0LCB3aXRoIGFsbCB0aGF0IGNvbmZpcm1lZCwgSSYjMzk7bSByZWFkeSB0byBwcm9jZWVkLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gTGV0JiMzOTtzIGdldCB0aGlzIGZ1enppbmcgZ29pbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7LAogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBsb2dpYyBpbiBmcy9leHQ0L21pZ3JhdGUuYyAodXBkYXRlX2V4dGVudF9yYW5nZSkgdG8gZW5zdXJlIGV4dGVudCBsZW5ndGhzIGRvIG5vdCBleGNlZWQgRVhUX0lOSVRfTUFYX0xFTi4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgRVhUNF9JT0NfTUlHUkFURSBpb2N0bHMgb24gZXh0NCBmaWxlc3lzdGVtcyBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OywKICAgICYjMzQ7dXBkYXRlX2V4dGVudF9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiZTE5ZGM5YjQzNzJiYmEzNWRmMmI1ZTYzYWMwMTI1YmVhMWJiNDUwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC03MSw3ICYjNDM7NzEsOCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkgKi8KIAlpZiAobGItJmd0O2ZpcnN0X3BibG9jayAmYW1wOyZhbXA7CiAJCShsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7Ci0JCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykpIHsKJiM0MzsJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwomIzQzOwkJKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKSkgewogCQlsYi0mZ3Q7bGFzdF9wYmxvY2sgPSBwYmxvY2s7CiAJCWxiLSZndDtsYXN0X2Jsb2NrID0gbGItJmd0O2N1cnJfYmxvY2s7CiAJCWxiLSZndDtjdXJyX2Jsb2NrJiM0MzsmIzQzOzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMTgKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBkaWZmIHRhcmdldHMgYGZzL2V4dDQvbWlncmF0ZS5jYCwgc3BlY2lmaWNhbGx5IHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIEltbWVkaWF0ZWx5LCBJIHNlZSBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIHRyeWluZyB0byBvcHRpbWl6ZSBob3cgZXh0ZW50IHJhbmdlcyBhcmUgdXBkYXRlZCwgbGlrZWx5IGR1cmluZyBhIG1pZ3JhdGlvbiBvciBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgY29uZGl0aW9uIGl0c2VsZiwgd2hpY2ggY2hlY2tzIGZvciBjb25zZWN1dGl2ZSBibG9ja3MgYW5kIHBoeXNpY2FsIGJsb2NrcyB3aXRoaW4gYW4gZXh0ZW50LgoKVGhlIG9yaWdpbmFsIGNoZWNrLCBmcm9tIHdoYXQgSSBjYW4gc2VlIG9mIGl0LCB2ZXJpZmllcyBpZiBgbGItJmd0O2ZpcnN0X3BibG9ja2AgZXhpc3RzLCBpZiBgbGItJmd0O2xhc3RfcGJsb2NrICYjNDM7IDFgIGlzIGVxdWFsIHRvIGBwYmxvY2tgLCBhbmQgYGxiLSZndDtsYXN0X2Jsb2NrICYjNDM7IDFgIGlzIGVxdWFsIHRvIGBsYi0mZ3Q7Y3Vycl9ibG9ja2AuIE5vdywgdGhlIHBhdGNoIGFkZHMgYW5vdGhlciBjb25kaXRpb246IGBsYi0mZ3Q7bGFzdF9ibG9jayAtIGxiLSZndDtmaXJzdF9ibG9jayAmIzQzOyAxICZsdDsgRVhUX0lOSVRfTUFYX0xFTmAuIFRoaXMgaXMgY3J1Y2lhbC4gSXQgbG9va3MgbGlrZSB0aGV5JiMzOTtyZSBwcmV2ZW50aW5nIGFuIGV4dGVudCBmcm9tIGdyb3dpbmcgYmV5b25kIGl0cyBpbml0aWFsIG1heGltdW0gbGVuZ3RoIHdoZW4gcGVyZm9ybWluZyBtaWdyYXRpb24uIFRoaXMgd2lsbCBwcmV2ZW50IGEgcHJvYmxlbSwgc3VjaCBhcyBhbiBvdmVyZmxvdywgb3Igc29tZSBvdGhlciBiYWQgc3RhdGUuCgpCeSBjaGVja2luZyB0aGUgbWF4aW11bSBleHRlbnQgbGVuZ3RoIHRoaXMgcGF0Y2ggYWltcyB0byBhdm9pZCBhbnkgcHJvYmxlbXMgYXJpc2luZyBmcm9tIHRoZSBleHRlbnQgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIHBlcm1pdHRlZCBzaXplLiBUaGlzIHN1Z2dlc3RzIHRoZSBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgcG90ZW50aWFsIGlzc3VlIHdoZXJlIGV4dGVuZGluZyBhIHJhbmdlIGNvdWxkIGxlYWQgdG8gdW5kZXNpcmFibGUgYmVoYXZpb3IsIHByb2JhYmx5IHJlbGF0ZWQgdG8gbWV0YWRhdGEgbGltaXRhdGlvbnMgb3Igc29tZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgd2l0aGluIGV4dDQmIzM5O3MgZXh0ZW50IG1hbmFnZW1lbnQuIE15IGluaXRpYWwgdGhvdWdodCBpcyBpdCBpcyBhZGRyZXNzaW5nIGEgY29ybmVyIGNhc2Ugd2hlbiBtaWdyYXRpbmcgbGFyZ2UgZmlsZXMsIG9yIHNvbWUgYm91bmRhcnkgY29uZGl0aW9uLCB0byBlbnN1cmUgdGhlIGV4dGVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb25zaXN0ZW50LiBUaGUgYWRkaXRpb24gc2hvdWxkIGltcHJvdmUgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFx0LypcbiAgNzA6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3MTpcdFx0ICovXG4gIDcyOlx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3MzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzQ6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4gIDc1Olx0XHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcbiAgNzY6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDc3Olx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA3ODpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgNzk6XHRcdFx0cmV0dXJuIDA7XG4gIDgwOlx0XHR9XG4gIDgxOlx0XHQvKlxuICA4MjpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDgzOlx0XHQgKi9cbiAgODQ6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg1Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODY6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDg3Olx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODg6XHRcdHJldHVybiByZXR2YWw7XG4gIDg5Olx0fVxuICA5MDpcdFxuICA5MTpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTI6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDkzOlx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NDpcdHtcbiAgOTU6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk2Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAgOTc6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuICA5ODpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gIDk5Olx0XG4gMTAwOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMDE6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEwMjpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTAzOlx0XG4gMTA0Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEwNTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTA2Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMDc6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTA4Olx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDEwOTpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTEwOlx0XHRcdFx0XHRicmVhaztcbiAxMTE6XHRcdFx0fSBlbHNlIHtcbiAxMTI6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAxMTM6XHRcdFx0fVxuIDExNDpcdFx0fVxuIDExNTpcdFx0cHV0X2JoKGJoKTtcbiAxMTY6XHRcdHJldHVybiByZXR2YWw7XG4gMTE3Olx0XG4gMTE4Olx0fVxuIDExOTpcdFxuIDEyMDpcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gMTIxOlx0XHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbiAxMjI6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIDEyMzpcdHtcbiAxMjQ6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMTI1Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMjY6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEyNzpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTI4Olx0XG4gMTI5Olx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDM1NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIGlzIGFjdHVhbGx5IGNoYW5naW5nLiBSaWdodCwgaXQmIzM5O3MgYWJvdXQgdGhlIGBleHQ0X21pZ3JhdGVgIHByb2Nlc3MsIHNwZWNpZmljYWxseSB3aGVyZSB3ZSYjMzk7cmUgY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIG9uZXMgdXNpbmcgYEVYVDRfSU9DX01JR1JBVEVgLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgaG93IGV4dGVudHMgYXJlIGdlbmVyYXRlZCBmcm9tIGNvbnRpZ3VvdXMgYmxvY2sgcmFuZ2VzIGR1cmluZyB0aGlzIG1pZ3JhdGlvbi4KCkkga25vdyB0aGF0IGV4dDQgdXNlcyAxNi1iaXQgZmllbGRzIChgZWVfbGVuYCkgZm9yIGV4dGVudCBsZW5ndGhzLiBUaGUgdHJpY2t5IHBhcnQgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgZXh0ZW50cy4gVW5pbml0aWFsaXplZCBleHRlbnRzIG1hcmsgdGhlIE1TQiBpbiBgZWVfbGVuYCwgd2hpbGUgaW5pdGlhbGl6ZWQgZXh0ZW50cyBoYXZlIGBlZV9sZW5gIHNldCB0byBhIG1heGltdW0gdmFsdWUsIGBFWFRfSU5JVF9NQVhfTEVOYCwgd2hpY2ggaXMgMzI3NjguCgpUaGUgcG90ZW50aWFsIHByb2JsZW0gaXMgcHJldHR5IGNsZWFyOiBpZiB3ZSB0cnkgdG8gY3JlYXRlIGFuIGV4dGVudCBsYXJnZXIgdGhhbiBgRVhUX0lOSVRfTUFYX0xFTmAgZHVyaW5nIG1pZ3JhdGlvbiwgYGVlX2xlbmAgd2lsbCBlaXRoZXIgb3ZlcmZsb3cgb3IgYmUgaW52YWxpZCwgbGVhZGluZyB0byBhbGwgc29ydHMgb2YgbmFzdHkgY29uc2VxdWVuY2VzIOKAkyBkYXRhIGNvcnJ1cHRpb24gb3IgZXJyb3JzIGRvd24gdGhlIGxpbmUgZHVyaW5nIGV4dGVudCBpbnNlcnRpb24gb3IgZXZlbiB3aGVuIHJlYWRpbmcgdGhlIGRhdGEuIFNvIGl04oCZcyBhIGNsYXNzaWMgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZS4KCk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgcmVnYXJkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJIG5lZWQgdG8gc2NydXRpbml6ZSBob3cgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQuIFRoYXQmIzM5O3MgdGhlIGtleSB0byBmaWd1cmluZyBvdXQgdGhlIHBvdGVudGlhbCBmb3IgcHJvYmxlbXMgaGVyZS4gR290dGEgbG9vayBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgaG93IHRoZSBzaXplcyBhcmUgY2hlY2tlZCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpc3N1ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBMR1BMLTIuMVxuICAgMjpcdC8qXG4gICAzOlx0ICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwN1xuICAgNDpcdCAqIEF1dGhvciBBbmVlc2ggS3VtYXIgSy5WIFx1MDAzY2FuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb21cdTAwM2VcbiAgIDU6XHQgKlxuICAgNjpcdCAqL1xuICAgNzpcdFxuICAgODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAgOTpcdCNpbmNsdWRlIFwmIzM0O2V4dDRfamJkMi5oXCYjMzQ7XG4gIDEwOlx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiAgMTE6XHRcbiAgMTI6XHQvKlxuICAxMzpcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxuICAxNDpcdCAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxuICAxNTpcdCAqL1xuICAxNjpcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG4gIDE3Olx0XHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTE4CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUcmFjaW5nIHRoZSBJbnN0YW50aWF0aW9uIG9mIGBtaWdyYXRlX3N0cnVjdCBsYmAqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgYG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBiZWluZyB1c2VkLiBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIGl0cyBpbnN0YW50aWF0aW9ucy4gTm8gcG9pbnQgaW4gbWFraW5nIGFzc3VtcHRpb25zOyBJIG5lZWQgdG8gZm9sbG93IHRoZSBjb2RlJiMzOTtzIGJyZWFkY3J1bWJzIGRpcmVjdGx5LiBUaGlzIGxpa2VseSBtZWFucyBncmVwcGluZywgYnV0IEkmIzM5O2xsIHByb2JhYmx5IGFsc28gbmVlZCB0byBjb25zaWRlciBvdGhlciBmYWN0b3JzIGxpa2UgbWFjcm9zIG9yIHBvdGVudGlhbCBpbmRpcmVjdCBjYWxscyB0aGF0IG1pZ2h0IG9ic2N1cmUgdGhlIGRpcmVjdCBpbnN0YW50aWF0aW9uLiBJIG5lZWQgdG8gYmUgbWV0aG9kaWNhbCBoZXJlLCBtYXBwaW5nIG91dCB0aGUgY2FsbCBncmFwaCBmcm9tIHRoZSBwb2ludCBvZiBpbnN0YW50aWF0aW9uIHRvIHJlbGV2YW50IGZ1bmN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRoYXQgbWlnaHQgYWZmZWN0IGl0cyBhY3R1YWwgdXNhZ2UgaW4gZGlmZmVyZW50IGJ1aWxkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcXVpY2sgY29kZSBkaXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cbmZzL2V4dDQvbWlncmF0ZS5jOjE2OnN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG5mcy9leHQ0L21pZ3JhdGUuYy0xNy1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYzoyMjpcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0yMy1cbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jOjY2Olx0XHRcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtNjcte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTkxPXN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTkyLVx0XHRcdFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcbmZzL2V4dDQvbWlncmF0ZS5jOjkzOlx0XHRcdFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTk0LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0xMjA9c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTEyMS1cdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuZnMvZXh0NC9taWdyYXRlLmM6MTIyOlx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjMte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTE1MD1zdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9taWdyYXRlLmMtMTUxLVx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG5mcy9leHQ0L21pZ3JhdGUuYzoxNTI6XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTE1My17XG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NDExPWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNDE3LVx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xuZnMvZXh0NC9taWdyYXRlLmM6NDE4Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiO1xuZnMvZXh0NC9taWdyYXRlLmMtNDE5LVx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM0MQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoZXJlIHRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBkZWZpbmVkIGFuZCBpbml0aWFsaXplZC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdCByZWdpb24sIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIG1hZ2ljIHByb2JhYmx5IGhhcHBlbnMuIExldCYjMzk7cyBzdGFydCB3aXRoIHdoZXJlIGl0IGlzIGRlZmluZWQgYW5kIGluc3RhbnRpYXRlZC4gS25vd2luZyBob3cgaXQmIzM5O3Mgc2V0IHVwIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIGhhdmUgYSBmZWVsaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNvbnRleHQgZm9yIGludGVycHJldGluZyB0aGUgc3Vycm91bmRpbmcgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNTpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE2Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MTc6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MTg6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MTk6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIwOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyMTpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDIyOlx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyMzpcdFxuIDQyNDpcdFx0LypcbiA0MjU6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI2Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQyNzpcdFx0ICovXG4gNDI4Olx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQyOTpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMwOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzI6XHRcbiA0MzM6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM0Olx0XHRcdC8qXG4gNDM1Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzNjpcdFx0XHQgKi9cbiA0Mzc6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MDpcdFxuIDQ0MTpcdFx0LypcbiA0NDI6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDM6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ0Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NDc6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ0ODpcdFxuIDQ0OTpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNDUwOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1MjpcdFx0fVxuIDQ1MzpcdFx0LypcbiA0NTQ6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1NTpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTY6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDU3Olx0XHQgKi9cbiA0NTg6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDU5Olx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYwOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjE6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDYyOlx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2MzpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0NjQ6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQwMwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuIGV4cGVydDoKCioqRGVsdmluZyBpbnRvIGBleHQ0X2V4dF9taWdyYXRlYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkmIzM5O3ZlIGFscmVhZHkgZ290IGEgaGFuZGxlIG9uIHRoZSBvdmVyYWxsIGdvYWwg4oCTIGNvbnZlcnRpbmcgZXh0ZW50cyB0byBhIG1vcmUgZWZmaWNpZW50IGZvcm1hdC4gTm93LCBsZXQmIzM5O3Mgc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzICphY3R1YWxseSogZG9pbmcgaXQuIFdoYXQgYXJlIHRoZSBrZXkgc3RlcHM/IEFyZSB0aGVyZSBhbnkgY2xldmVyIG9wdGltaXphdGlvbnMgaW4gcGxheT8gQXJlIHRoZXkgY29uc2lkZXJpbmcgZnJhZ21lbnRhdGlvbiBvciB0cnlpbmcgdG8gbWluaW1pemUgZGF0YSBtb3ZlbWVudD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIHN0cmF0ZWd5OiBob3cgZG9lcyBpdCBoYW5kbGUgbWV0YWRhdGEgdXBkYXRlcywgZXJyb3IgY29uZGl0aW9ucywgYW5kIHRoZSBhY3R1YWwgY29weWluZy9yZXdyaXRpbmcgb2YgdGhlIGRhdGEgYmxvY2tzPyBJcyBpdCBzaW5nbGUtdGhyZWFkZWQgb3IgdXRpbGl6aW5nIHNvbWUgZm9ybSBvZiBjb25jdXJyZW5jeSBmb3IgdGhlc2UgcG90ZW50aWFsbHkgbGVuZ3RoeSBkYXRhIG1pZ3JhdGlvbnM/IEkmIzM5O2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkOiB0aGUgZXh0ZW50IHRyZWUsIHRoZSBibG9jayBncm91cHMsIHRoZSBpbm9kZSBzdHJ1Y3R1cmUg4oCTIGhvdyBhcmUgdGhlc2UgYmVpbmcgbWFuaXB1bGF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzPyBBbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3Vlcz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBmb3Igc3BhY2UgYWxsb2NhdGlvbiwgcGVyaGFwcyB0aGUgdXRpbGl6YXRpb24gb2YgYSBmcmVlIHNwYWNlIGJpdG1hcCBvciBibG9jayBncm91cCBkZXNjcmlwdG9ycywgYW5kIEkmIzM5O2xsIGxvb2sgZm9yIGFueSBzYWZlZ3VhcmRzIHRvIHByZXZlbnQgZGF0YSBjb3JydXB0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLiBVbHRpbWF0ZWx5LCBJJiMzOTttIHRyeWluZyB0byBnZXQgYSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcywgc3RlcCBieSBzdGVwLCBhbmQgYXNzZXNzIGl0cyByb2J1c3RuZXNzIGFuZCBlZmZpY2llbmN5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NjU6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2NjpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDY3Olx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDY4Olx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDY5Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzA6XHRcdH1cbiA0NzE6XHRcdC8qXG4gNDcyOlx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3MzpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NDpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0NzU6XHRcdCAqL1xuIDQ3NjpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ3NzpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ3ODpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0Nzk6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgwOlx0XHQvKlxuIDQ4MTpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDgyOlx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4MzpcdFx0ICovXG4gNDg0Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0ODc6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDg4Olx0XG4gNDg5Olx0XHQvKlxuIDQ5MDpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiA0OTE6XHRcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxuIDQ5MjpcdFx0ICpcbiA0OTM6XHRcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXG4gNDk0Olx0XHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcbiA0OTU6XHRcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXG4gNDk2Olx0XHQgKi9cbiA0OTc6XHRcdC8qXG4gNDk4Olx0XHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXG4gNDk5Olx0XHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxuIDUwMDpcdFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXG4gNTAxOlx0XHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXG4gNTAyOlx0XHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXG4gNTAzOlx0XHQgKiBhbGxvY2F0aW9uLlxuIDUwNDpcdFx0ICovXG4gNTA1Olx0XHRkb3duX3JlYWQoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiA1MDY6XHRcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcbiA1MDc6XHRcdHVwX3JlYWQoKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSkpO1xuIDUwODpcdFxuIDUwOTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xuIDUxMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNTExOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA1MTI6XHRcdFx0Z290byBvdXRfdG1wX2lub2RlO1xuIDUxMzpcdFx0fVxuIDUxNDpcdFxuIDUxNTpcdFx0aV9kYXRhID0gZWktXHUwMDNlaV9kYXRhO1xuIDUxNjpcdFx0bWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcbiA1MTc6XHRcbiA1MTg6XHRcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cbiA1MTk6XHRcdG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiA1MjA6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkmIzQzOyYjNDM7KSB7XG4gNTIxOlx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiA1MjI6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxuIDUyMzpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFx1MDAyNmxiKTtcbiA1MjQ6XHRcdFx0XHRpZiAocmV0dmFsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzExCgkJCQkJCQlvdXRwdXQ6IDIzMQoJCQkJCQkJdGhvdWdodHM6IDQwOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLTVNBTiBJbXBsaWNhdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhhdCBgbWVtc2V0KCZhbXA7bGIsIDAsIHNpemVvZihsYikpYCBhdCB0aGUgc3RhcnQgaXMga2V5IOKAkyBpdCYjMzk7cyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBzYWZldHkgb2YgdGhpcyBjaGFuZ2UuIEl0IG1lYW5zIGBsYmAgaXMgKmFsd2F5cyogaW5pdGlhbGl6ZWQsIGVsaW1pbmF0aW5nIHRoZSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHVzZWQuCgpUaGUgY2hlY2sgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzIHN0cmFpZ2h0Zm9yd2FyZDoKCmBgYGMKCWlmIChsYi0mZ3Q7Zmlyc3RfcGJsb2NrICZhbXA7JmFtcDsKCQkobGItJmd0O2xhc3RfcGJsb2NrJiM0MzsxID09IHBibG9jaykgJmFtcDsmYW1wOwoJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwoJCShsYi0mZ3Q7bGFzdF9ibG9jayAtIGxiLSZndDtmaXJzdF9ibG9jayAmIzQzOyAxICZsdDsgRVhUX0lOSVRfTUFYX0xFTikpIHsKYGBgCgpJdCBib2lscyBkb3duIHRvIGEgY29udGlndW91cyBleHRlbnQgbGVuZ3RoIGNoZWNrLiBJdOKAmXMgZW5zdXJpbmcgdGhhdCBpZiB3ZSYjMzk7cmUgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGV4dGVudCwgd2UgZG9uJiMzOTt0IGV4Y2VlZCBgRVhUX0lOSVRfTUFYX0xFTmAuIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHByZXZlbnQgZXhjZXNzaXZlbHkgbGFyZ2UgZXh0ZW50cyBmcm9tIGJlaW5nIGNyZWF0ZWQsIHdoaWNoIGlzIHJlbGF0ZWQgdG8gZmlsZSBzeXN0ZW0gbWlncmF0aW9uLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIHVzdWFsIEtNU0FOIGNvbmNlcm5zLiBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBmcm9tIGEgZmV3IGFuZ2xlczoKCjEuICAqKlVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBzZW50IHRvIHVzZXIgc3BhY2U6KiogTm90IGhlcmUuIGBsYmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBub3RoaW5nIHVuaW5pdGlhbGl6ZWQgaXMgbGVha2VkLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlczoqKiBOb3BlLiBBcyBtZW50aW9uZWQsIGBsYmAgaXMgemVyb2VkIG91dCwgYW5kIGFsbCB0aGUgZmllbGRzIGludm9sdmVkIGluIHRoZSBjb25kaXRpb25hbCBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCB2YWx1ZXMuCjMuICAqKkNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgcG90ZW50aWFsbHkgYmVpbmcgcmVhZDoqKiBBZ2Fpbiwgbm8uIFRoZSBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQuCjQuICAqKkJvdW5kcyBjaGVja3MgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk6KiogTm8uIFRoaXMgaXMgYWJvdXQgZXh0ZW50IGxlbmd0aCBsaW1pdHMsIG5vdCBhY2NpZGVudGFsbHkgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy4KCkJhc2ljYWxseSwgdGhpcyBwYXRjaCBpcyBvbmx5IGZvY3VzZWQgb24gY2hlY2tpbmcgZXh0ZW50IGJvdW5kYXJpZXMgYW5kIHByZXZlbnRpbmcgbGFyZ2UgZXh0ZW50cyBmcm9tIGJlaW5nIGNyZWF0ZWQsIHdoaWNoIG1pZ2h0IHJlbGF0ZSB0byBmaWxlIHN5c3RlbSBjb3JydXB0aW9uIG9yIHJlbGF0ZWQgaXNzdWVzLiBIb3dldmVyLCBpZiBzdWNoIGlzc3VlcyBhcmlzZSwgd2Ugd291bGQgZXhwZWN0IHRvIHNlZSB0aGUgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBvciBLQVNBTiBmbGFnIHRoZW0uIFRoaXMgcGF0Y2ggaXMgbm90IGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSBuZXcgd2F5cyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhlcmVmb3JlLCBnaXZlbiBteSB1bmRlcnN0YW5kaW5nLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGRlZmluaXRlbHkgYmUgYGZhbHNlYC4gTm93LCB0aW1lIGZvciBhIHF1aWNrIG5vdGUgb24gS0FTQU4gdnMuIEtNU0FOLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMwLjQ1Nzk3OTYxMVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczMzMyOTY5MjMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCIsXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEgXFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKWAgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBwcmV2ZW50IGFjY3VtdWxhdGluZyBjb250aWd1b3VzIGJsb2NrcyBpbnRvIGEgc2luZ2xlIGV4dGVudCBiZXlvbmQgdGhlIG1heGltdW0gYWxsb3dhYmxlIGluaXRpYWxpemVkIGV4dGVudCBsZW5ndGggKGBFWFRfSU5JVF9NQVhfTEVOYCA9IDMyNzY4KSBkdXJpbmcgaW5vZGUgbWlncmF0aW9uIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXFxuXFxuQWxsIGZpZWxkcyBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBhcmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBhdCB0aGUgc3RhcnQgb2YgYGV4dDRfZXh0X21pZ3JhdGUoKWAuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgZG9lcyBub3QgY29weSBhbnkga2VybmVsIGRhdGEgdG8gdXNlciBzcGFjZSwgYW5kIGRvZXMgbm90IGFsdGVyIG1lbW9yeSBpbml0aWFsaXphdGlvbiBsb2dpYy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBleHRlbnQgbGVuZ3RoIG92ZXJmbG93IG9yIGNvcnJ1cHRlZCBleHRlbnQgc3RydWN0dXJlcyBhcmUgZnVuY3Rpb25hbCBmaWxlc3lzdGVtIGJ1Z3Mgb3IgYm91bmRzIGlzc3VlcyBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOL1VCU0FOIGJ1aWxkcy4gQ29uc2VxdWVudGx5LCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMwLjQ1Nzk4NDI3MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NDc3MjkyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xcbmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9taWdyYXRlLmNcXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xcbkBAIC03MSw3ICs3MSw4IEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHQgKi9cXG4gXFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXFx1MDAzZWN1cnJfYmxvY2spKSB7XFxuK1xcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFxcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcXG4gXFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiBcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiBcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0NzozMi4wNTMzOTE0NzNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjUxMzE0OTIyMDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCIsXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljIGluIGZzL2V4dDQvbWlncmF0ZS5jICh1cGRhdGVfZXh0ZW50X3JhbmdlKSB0byBlbnN1cmUgZXh0ZW50IGxlbmd0aHMgZG8gbm90IGV4Y2VlZCBFWFRfSU5JVF9NQVhfTEVOLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RscyBvbiBleHQ0IGZpbGVzeXN0ZW1zIGFuZCB3YXJyYW50cyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAwMzo0NzoyOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC03MSw3ICs3MSw4IEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0ICovXG4gXHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuIFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2srMSA9PSBwYmxvY2spIFx1MDAyNlx1MDAyNlxuLVx0XHQobGItXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVx1MDAzZWN1cnJfYmxvY2spKSB7XG4rXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4rXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKSkge1xuIFx0XHRsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiBcdFx0bGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gXHRcdGxiLVx1MDAzZWN1cnJfYmxvY2srKztcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMyLjA1MzM5Mzk0M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE4NTU2MzY2NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgdGhlIE5lZWQgZm9yIFN5emthbGxlciBGdXp6aW5nIG9uIGEgS2VybmVsIFBhdGNoKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhpcyBwYXRjaCB0byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgaXQgd2FycmFudCBiZWluZyBmdXp6ZWQgd2l0aCBzeXprYWxsZXI/IEZpcnN0LCBJIG5lZWQgdG8gZG8gYSBxdWljayByaXNrIGFzc2Vzc21lbnQuIFRoaXMgaXMgYSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHRhc2ssIGtlcm5lbCBtYWludGVuYW5jZSByZWFsbHkuIENvbnRleHQgYW5kIHNldmVyaXR5IHNlZW0gYmVuaWduLCBtZWFuaW5nIHRoZXJlJ3MgbGlrZWx5IG5vIHJlYWwgZGFuZ2VyIGluIGRpdmluZyBpbnRvIHRoaXMuIEl0IGxvb2tzIHNhZmUgdG8gZXZhbHVhdGUgZnVsbHkuXG5cbk5vdywgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGNoYW5nZS4gU3BlY2lmaWNhbGx5LCBpdOKAmXMgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgd2l0aGluIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIExvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHRoZXJlJ3MgYSBuZXcgY2hlY2sgYWRkZWQ6IGBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOYC4gVGhhdCBsb29rcyBsaWtlIGEgbGVuZ3RoIGNoZWNrLCBwb3RlbnRpYWxseSBwcmV2ZW50aW5nIHNvbWUga2luZCBvZiBvdmVyZmxvdyBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyBleHRlbnQgbWlncmF0aW9uLiBNeSBzcGlkZXktc2Vuc2UgaXMgdGVsbGluZyBtZSB0byBpbnZlc3RpZ2F0ZSBwb3RlbnRpYWwgaW50ZWdlciBvdmVyZmxvd3MgYXMgYSBmaXJzdCBzdGVwIGhlcmUsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggYmxvY2sgbnVtYmVycyBhbmQgc2l6ZXMuXG5cblRvIGdldCBhIGJldHRlciBncmlwIG9uIHRoZSBmdWxsIHBpY3R1cmUsIEknbGwgbmVlZCB0byBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlLCB0aGUgY2FsbGVycyBvZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIGFuZCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuIEnigJlsbCB1c2UgYGdyZXBwZXJgIG9yIG1heWJlIGp1c3QgYHJlYWQtZmlsZWAgdG8gdW5kZXJzdGFuZCB0aGUgYmlnZ2VyIHBpY3R1cmUgb2YgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBleHQ0IGZpbGUgc3lzdGVtJ3MgbWlncmF0aW9uIHByb2Nlc3MuIFRoaXMgd2lsbCBoZWxwIG1lIGRldGVybWluZSBob3cgY3JpdGljYWwgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIGFuZCB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgb2J2aW91cyB0YXJnZXRzIGZvciBmdXp6aW5nIGJhc2VkIG9uIHRoZSBwYXRjaCdzIGNoYW5nZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNDQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1MC42MDk3NjI3NzVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NzI2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcXG4gICAyOlxcdC8qXFxuICAgMzpcXHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XFxuICAgNDpcXHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVxcdTAwM2VcXG4gICA1OlxcdCAqXFxuICAgNjpcXHQgKi9cXG4gICA3OlxcdFxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJleHQ0X2piZDIuaFxcXCJcXG4gIDEwOlxcdCNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gIDExOlxcdFxcbiAgMTI6XFx0LypcXG4gIDEzOlxcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxcbiAgMTQ6XFx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XFxuICAxNTpcXHQgKi9cXG4gIDE2OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuICAxNzpcXHRcXHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcXG4gIDE4OlxcdFxcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xcbiAgMTk6XFx0fTtcXG4gIDIwOlxcdFxcbiAgMjE6XFx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDIyOlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICAyMzpcXHRcXG4gIDI0OlxcdHtcXG4gIDI1OlxcdFxcdGludCByZXR2YWwgPSAwLCBuZWVkZWQ7XFxuICAyNjpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXh0O1xcbiAgMjc6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGg7XFxuICAyODpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayA9PSAwKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdC8qIEFkZCB0aGUgZXh0ZW50IHRvIHRlbXAgaW5vZGUqL1xcbiAgMzI6XFx0XFx0bmV3ZXh0LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobGItXFx1MDAzZWZpcnN0X2Jsb2NrKTtcXG4gIDMzOlxcdFxcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSk7XFxuICAzNDpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuICAzNTpcXHRcXHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xcbiAgMzY6XFx0XFx0ZG93bl93cml0ZShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuICAzNzpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbGItXFx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcXG4gIDM4OlxcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4gIDM5OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XFxuICA0MDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA0MTpcXHRcXHR9XFxuICA0MjpcXHRcXG4gIDQzOlxcdFxcdC8qXFxuICA0NDpcXHRcXHQgKiBDYWxjdWxhdGUgdGhlIGNyZWRpdCBuZWVkZWQgdG8gaW5zZXJ0aW5nIHRoaXMgZXh0ZW50XFxuICA0NTpcXHRcXHQgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgdGhpcyBpbiBsb29wIHdlIG1heSBhY2N1bXVsYXRlIGV4dHJhXFxuICA0NjpcXHRcXHQgKiBjcmVkaXQuIEJ1dCBiZWxvdyB3ZSB0cnkgdG8gbm90IGFjY3VtdWxhdGUgdG9vIG11Y2hcXG4gIDQ3OlxcdFxcdCAqIG9mIHRoZW0gYnkgcmVzdGFydGluZyB0aGUgam91cm5hbC5cXG4gIDQ4OlxcdFxcdCAqL1xcbiAgNDk6XFx0XFx0bmVlZGVkID0gZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KGlub2RlLFxcbiAgNTA6XFx0XFx0XFx0ICAgIGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSwgcGF0aCk7XFxuICA1MTpcXHRcXG4gIDUyOlxcdFxcdHJldHZhbCA9IGV4dDRfZGF0YXNlbV9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIGlub2RlLCBuZWVkZWQsIG5lZWRlZCwgMCk7XFxuICA1MzpcXHRcXHRpZiAocmV0dmFsIFxcdTAwM2MgMClcXG4gIDU0OlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gIDU1OlxcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleHQsIDApO1xcbiAgNTY6XFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG4gIDU3OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XFxuICA1ODpcXHRlcnJfb3V0OlxcbiAgNTk6XFx0XFx0dXBfd3JpdGUoKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKSk7XFxuICA2MDpcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuICA2MTpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID0gMDtcXG4gIDYyOlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA2MzpcXHR9XFxuICA2NDpcXHRcXG4gIDY1OlxcdHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgNjY6XFx0XFx0XFx0XFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA2NzpcXHR7XFxuICA2ODpcXHRcXHRpbnQgcmV0dmFsO1xcbiAgNjk6XFx0XFx0LypcXG4gIDcwOlxcdFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiAgNzE6XFx0XFx0ICovXFxuICA3MjpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayBcXHUwMDI2XFx1MDAyNlxcbiAgNzM6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc0OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbiAgNzU6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XFxuICA3NjpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA3NzpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgNzg6XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDc5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAgODA6XFx0XFx0fVxcbiAgODE6XFx0XFx0LypcXG4gIDgyOlxcdFxcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxcbiAgODM6XFx0XFx0ICovXFxuICA4NDpcXHRcXHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xcbiAgODU6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IGxiLVxcdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcXG4gIDg2OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9ibG9jayA9IGxiLVxcdTAwM2VsYXN0X2Jsb2NrID0gbGItXFx1MDAzZWN1cnJfYmxvY2s7XFxuICA4NzpcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAgODg6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDg5OlxcdH1cXG4gIDkwOlxcdFxcbiAgOTE6XFx0c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgOTI6XFx0XFx0XFx0XFx0XFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gIDkzOlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA5NDpcXHR7XFxuICA5NTpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAgOTY6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuICA5NzpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gIDk4OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gIDk5OlxcdFxcbiAxMDA6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1MC42MDk4NjE3ODVaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNjA4NTQyNTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZW50cnkgcG9pbnRzIGFuZCBvdmVyYWxsIGZsb3cgZm9yIGV4dDQgbWlncmF0aW9uIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIFJpZ2h0IG5vdywgSSdtIGZvY3VzZWQgb24gYGZzL2V4dDQvbWlncmF0ZS5jYC4gVG8gZ2V0IGEgY29tcGxldGUgZ3Jhc3Agb2YgdGhpcywgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlLiBUaGUgaW1wb3J0YW50IHBhcnQgSSBuZWVkIGlzIHRoZSBpbml0aWFsIGZ1bmN0aW9uIGNhbGwgYW5kIGhvdyB0aGlzIGVudGlyZSBtaWdyYXRpb24gcHJvY2VzcyBpcyB0cmlnZ2VyZWQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFVuZGVyc3RhbmRpbmcgdGhlIGVudHJ5IHBvaW50cyB3aWxsIGdpdmUgbWUgdGhlIGhvb2tzIEkgbmVlZCB0byByZWFsbHkgZGlnIGludG8gdGhlIG1lY2hhbmljcyBvZiB3aGF0J3MgaGFwcGVuaW5nLiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTExOCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTQuMjE4NDA2NDQyWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTgwNzYyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zMjU0PWludCBleHQ0X2ZvcmNlX3NodXRkb3duKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncyk7XFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0zMjU2LS8qIG1pZ3JhdGUuYyAqL1xcbmZzL2V4dDQvZXh0NC5oOjMyNTc6ZXh0ZXJuIGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqKTtcXG5mcy9leHQ0L2V4dDQuaC0zMjU4LWV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYz01OTA9c3RhdGljIGludCBleHQ0X2lvY3RsX3NldGZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmMtNzA1LVxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEVYVDRfRVhURU5UU19GTClcXG5mcy9leHQ0L2lvY3RsLmM6NzA2OlxcdFxcdFxcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xcbmZzL2V4dDQvaW9jdGwuYy03MDctXFx0XFx0ZWxzZVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTE1Mzg9c3RhdGljIGxvbmcgX19leHQ0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy0xNzAxLVxcdFxcdGlub2RlX2xvY2soKGlub2RlKSk7XFxuZnMvZXh0NC9pb2N0bC5jOjE3MDI6XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuZnMvZXh0NC9pb2N0bC5jLTE3MDMtXFx0XFx0aW5vZGVfdW5sb2NrKChpbm9kZSkpO1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MzkxPXN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxMC1cXG5mcy9leHQ0L21pZ3JhdGUuYzo0MTE6aW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG5mcy9leHQ0L21pZ3JhdGUuYy00MTIte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1NC4yNjU1OTQwMzRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjM1MjMzNjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhbmQgZmlndXJlIG91dCBpdHMgS2NvbmZpZyBkZXBlbmRlbmNpZXMuIFdoZXJlIHNob3VsZCBJIHN0YXJ0PyBUaGUgb2J2aW91cyBwbGFjZXMgYXJlIHRoZSBgTWFrZWZpbGVgIGFuZCBgS2NvbmZpZ2AgZmlsZXMgd2l0aGluIHRoZSBgZnMvZXh0NGAgZGlyZWN0b3J5LiBJJ2xsIGNoZWNrIHRob3NlIGZpcnN0LiBUaGV5IHNob3VsZCBleHBsaWNpdGx5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBpbmNsdXNpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGZpbGUsIGFuZCB0aGF0IHNob3VsZCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIE5vIG5lZWQgdG8gb3ZlcnRoaW5rIGl0OyB0aGUgYW5zd2VyIHNob3VsZCBiZSByaWdodCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTc1NywiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjU1LjkwMDgzMDIzWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MDE3NjkzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1pZ3JhdGVcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L01ha2VmaWxlPTg9ZXh0NC15XFx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGUtOS1cXHRcXHRleHRlbnRzX3N0YXR1cy5vIGZpbGUubyBmc21hcC5vIGZzeW5jLm8gaGFzaC5vIGlhbGxvYy5vIFxcXFxcXG5mcy9leHQ0L01ha2VmaWxlOjEwOlxcdFxcdGluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGUtMTEtXFx0XFx0bW1wLm8gbW92ZV9leHRlbnQubyBuYW1laS5vIHBhZ2UtaW8ubyByZWFkcGFnZS5vIHJlc2l6ZS5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTUuOTQ3ODUyNDkzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTkzNzI0OTg5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqRXh0NCBNb2R1bGUgRGVwZW5kZW5jaWVzKipcblxuUmlnaHQsIHNvIGBtaWdyYXRlLm9gLi4uIHRoYXQncyBwYXJ0IG9mIHRoZSBgZXh0NC15YCBidWlsZCwgYW5kICp0aGF0KiBtZWFucyBpdCBnZXRzIGJ1aWx0IHdoZW5ldmVyIHRoZSBgQ09ORklHX0VYVDRfRlNgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0J3MgZ29vZCB0byBrbm93LCBhbmQgZnJhbmtseSwgSSBzaG91bGQgaGF2ZSByZW1lbWJlcmVkIHRoYXQgZnJvbSByZXZpZXdpbmcgdGhlIGJ1aWxkIHN5c3RlbSBiZWZvcmUuIEl0J3MgYSBrZXkgZGVwZW5kZW5jeS4gTm93LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gYWxsIHRoZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGtub2JzIGFzc29jaWF0ZWQgd2l0aCBleHQ0LiBJJ2xsIHRha2UgYSBsb29rIGF0IGBmcy9leHQ0L0tjb25maWdgIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQnbGwgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGlmIGFueSBuZXcgb25lcyBoYXZlIGJlZW4gYWRkZWQgc2luY2UgbXkgbGFzdCBkZXRhaWxlZCByZXZpZXcuIEkgbWF5IGFsc28gd2FudCB0byBjb21wYXJlIHdpdGggcHJpb3Iga2VybmVsIHZlcnNpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDk2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTcuODg1MTA0NzVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODIyMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgRVhUNF9GU1xcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcbiAgIDQ6XFx0XFx0c2VsZWN0IEJVRkZFUl9IRUFEXFxuICAgNTpcXHRcXHRzZWxlY3QgSkJEMlxcbiAgIDY6XFx0XFx0c2VsZWN0IENSQzE2XFxuICAgNzpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gICA4OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDk6XFx0XFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXFxuICAxMDpcXHRcXHRoZWxwXFxuICAxMTpcXHRcXHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxcbiAgMTI6XFx0XFxuICAxMzpcXHRcXHQgIFVubGlrZSB0aGUgY2hhbmdlIGZyb20gZXh0MiBmaWxlc3lzdGVtIHRvIGV4dDMgZmlsZXN5c3RlbSxcXG4gIDE0OlxcdFxcdCAgdGhlIG9uLWRpc2sgZm9ybWF0IG9mIGV4dDQgaXMgbm90IGZvcndhcmRzIGNvbXBhdGlibGUgd2l0aFxcbiAgMTU6XFx0XFx0ICBleHQzOyBpdCBpcyBiYXNlZCBvbiBleHRlbnQgbWFwcyBhbmQgaXQgc3VwcG9ydHMgNDgtYml0XFxuICAxNjpcXHRcXHQgIHBoeXNpY2FsIGJsb2NrIG51bWJlcnMuICBUaGUgZXh0NCBmaWxlc3lzdGVtIGFsc28gc3VwcG9ydHMgZGVsYXllZFxcbiAgMTc6XFx0XFx0ICBhbGxvY2F0aW9uLCBwZXJzaXN0ZW50IHByZWFsbG9jYXRpb24sIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcyxcXG4gIDE4OlxcdFxcdCAgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHNwZWVkXFxuICAxOTpcXHRcXHQgIHVwIGZzY2sgdGltZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSB3ZWIgcGFnZXMgYXRcXG4gIDIwOlxcdFxcdCAgaHR0cDovL2V4dDQud2lraS5rZXJuZWwub3JnLlxcbiAgMjE6XFx0XFxuICAyMjpcXHRcXHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxcbiAgMjM6XFx0XFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXFxuICAyNDpcXHRcXHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XFxuICAyNTpcXHRcXHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcXG4gIDI2OlxcdFxcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXFxuICAyNzpcXHRcXHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXFxuICAyODpcXHRcXHQgIGNvbXBhdGlibGUuXFxuICAyOTpcXHRcXG4gIDMwOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxcbiAgMzE6XFx0XFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzQ6XFx0XFxuICAzNTpcXHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG4gIDM2OlxcdFxcdGJvb2wgXFxcIlVzZSBleHQ0IGZvciBleHQyIGZpbGUgc3lzdGVtc1xcXCJcXG4gIDM3OlxcdFxcdGRlcGVuZHMgb24gRVhUNF9GU1xcbiAgMzg6XFx0XFx0ZGVwZW5kcyBvbiBFWFQyX0ZTPW5cXG4gIDM5OlxcdFxcdGRlZmF1bHQgeVxcbiAgNDA6XFx0XFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1Ny44ODUxODkxNFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODkwOTEwOTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFJlY2VudCBleHQ0IFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIEl0IGxvb2tzIGxpa2UgYSByZWNlbnQgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCBtb2RpZmllcyB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLiBTcGVjaWZpY2FsbHksIGl0IGFkZHMgYSBjaGVjayB3aXRoaW4gdGhlIGBpZmAgc3RhdGVtZW50IHRoYXQgZGV0ZXJtaW5lcyBpZiB3ZSBjYW4gZXh0ZW5kIGFuIGV4aXN0aW5nIGV4dGVudCByYW5nZS4gVGhlIG9yaWdpbmFsIGNoZWNrIHdhcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBgKGxiLVx1MDAzZWxhc3RfcGJsb2NrKzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjYgKGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKWAuIE5vdywgdGhlcmUncyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbjogYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKWAuXG5cbkFoYSEgVGhpcyBwcmV2ZW50cyB0aGUgY3JlYXRpb24gb2YgYW4gZXh0ZW50IHRoYXQncyBsb25nZXIgdGhhbiBgRVhUX0lOSVRfTUFYX0xFTmAsIHdoaWNoIGlzIGNsZWFybHkgYSBzYWZlZ3VhcmQgdG8gcHJldmVudCBvdmVyZmxvd2luZyB0aGUgMTYtYml0IGBlZV9sZW5gIGZpZWxkIGluIGV4dDQgZXh0ZW50cy4gV2l0aG91dCB0aGlzIGNoZWNrLCB0aGUgb2xkIGNvZGUgY291bGQgaGF2ZSBhbGxvd2VkIGBlZV9sZW5gIHRvIHdyYXAgb3IgZXhjZWVkIHRoZSBpbnRlbmRlZCBtYXhpbXVtLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGlzIHJlYWNoYWJsZSBhbmQsIHRoZXJlZm9yZSwgd29ydGggZnV6emluZz8gQWJzb2x1dGVseSwgeWVzISBUaGlzIGlzIHJpZ2h0IGluIHRoZSBoZWFydCBvZiB0aGUgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljLiBXZSBoYXZlIG11bHRpcGxlIHdheXMgdG8gdHJpZ2dlciB0aGlzIGNvbmRpdGlvbiDigJMgdGhyb3VnaCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIGlvY3RsIG9yIHBvdGVudGlhbGx5IHVzaW5nIGBGU19JT0NfU0VURkxBR1NgIHdpdGggYEVYVDRfRVhURU5UU19GTGAgZmxhZyBvbiBhbiBleHQ0IGZpbGUgc3lzdGVtLCBwYXJ0aWN1bGFybHkgb25lIGVtcGxveWluZyBpbmRpcmVjdCBibG9ja3Mgb3IgZHVyaW5nIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IHRvIGV4dGVudC4gR2l2ZW4gU3l6a2FsbGVyJ3MgcHJvZmljaWVuY3ksIGl0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGBFWFQ0X0lPQ19NSUdSQVRFYCBvciBgRlNfSU9DX1NFVEZMQUdTYCBjYWxscywgbWFraW5nIHRoaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGhGdXp6aW5nLlxuXG5OZXh0LCBJIG5lZWQgdG8gY2hlY2sgdGhlIEZvY3VzU3ltYm9scywgd2hpY2ggaXMgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhIHN0YXRpYyBmdW5jdGlvbiBpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgYmV0dGVyLCBJIHNob3VsZCBleGFtaW5lIHRoZSBjYWxsaW5nIGNvbnRleHQgYW5kIHRoZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIGBtaWdyYXRlLmNgLCBzbyBJJ2xsIG5lZWQgdG8gcmVhZCB0aGUgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGZyb20gbGluZSAxMDAgdG8gdGhlIGVuZCwgdG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UgbW9yZSBmdWxseS5cblxuXG4iLCJJbnB1dFRva2VucyI6Njk0NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjAyLjc3NjEwMzM4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDA6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxMDE6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDEwMjpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDEwMzpcXHRcXG4gMTA0OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxMDU6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTA2OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTA3OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTA4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTA5OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDExMDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTExOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDExMjpcXHRcXHRcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAxMTM6XFx0XFx0XFx0fVxcbiAxMTQ6XFx0XFx0fVxcbiAxMTU6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTE2OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDExNzpcXHRcXG4gMTE4OlxcdH1cXG4gMTE5OlxcdFxcbiAxMjA6XFx0c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTIxOlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxMjI6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDEyMzpcXHR7XFxuIDEyNDpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxMjU6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDEyNjpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTI3OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTI4OlxcdFxcbiAxMjk6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxMzA6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDEzMTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDEzMjpcXHRcXG4gMTMzOlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxMzQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTM1OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTM2OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXFxuIDEzNzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XFxuIDEzODpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiAxMzk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MDpcXHRcXHRcXHR9IGVsc2Uge1xcbiAxNDE6XFx0XFx0XFx0XFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXFxuIDE0MjpcXHRcXHRcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztcXG4gMTQzOlxcdFxcdFxcdH1cXG4gMTQ0OlxcdFxcdH1cXG4gMTQ1OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE0NjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxNDc6XFx0XFxuIDE0ODpcXHR9XFxuIDE0OTpcXHRcXG4gMTUwOlxcdHN0YXRpYyBpbnQgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDE1MTpcXHRcXHRcXHRcXHRcXHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gMTUyOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAxNTM6XFx0e1xcbiAxNTQ6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTU1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxNTY6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuIDE1NzpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDE1ODpcXHRcXG4gMTU5OlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG4gMTYwOlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxNjE6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxNjI6XFx0XFxuIDE2MzpcXHRcXHRpX2RhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTY0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE2NTpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDE2NjpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTY3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTY4OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTcwOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE3MTpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTcyOlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7XFxuIDE3MzpcXHRcXHRcXHR9XFxuIDE3NDpcXHRcXHR9XFxuIDE3NTpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxNzY6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTc3OlxcdFxcbiAxNzg6XFx0fVxcbiAxNzk6XFx0XFxuIDE4MDpcXHRzdGF0aWMgaW50IGZyZWVfZGluZF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSxcXG4gMTgxOlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fbGUzMiBpX2RhdGEpXFxuIDE4MjpcXHR7XFxuIDE4MzpcXHRcXHRpbnQgaTtcXG4gMTg0OlxcdFxcdF9fbGUzMiAqdG1wX2lkYXRhO1xcbiAxODU6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTg2OlxcdFxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gMTg3OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTg4OlxcdFxcdGludCBlcnI7XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChzYiwgbGUzMl90b19jcHUoaV9kYXRhKSwgMCk7XFxuIDE5MTpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTkyOlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTkzOlxcdFxcbiAxOTQ6XFx0XFx0dG1wX2lkYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDE5NTpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxOTY6XFx0XFx0XFx0aWYgKHRtcF9pZGF0YVtpXSkge1xcbiAxOTc6XFx0XFx0XFx0XFx0ZXJyID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSxcXG4gMTk4OlxcdFxcdFxcdFxcdFxcdEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MsXFxuIDE5OTpcXHRcXHRcXHRcXHRcXHRleHQ0X2ZyZWVfbWV0YWRhdGFfcmV2b2tlX2NyZWRpdHMoc2IsIDEpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MDIuNzc2MjAyNzJaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjc4NDU2MjAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBNaWdyYXRpb24gTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgb24gdGhlIGBmcy9leHQ0L21pZ3JhdGUuY2AgZmlsZSBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgdGhpcyBtaWdyYXRpb24gcHJvY2VzcyB3b3JrcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSd2ZSBnb3QgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIGV4dGVudCBtYW5hZ2VtZW50IHNjaGVtZS4gSSBzaG91bGQgbWFwIG91dCB0aGUgY29udHJvbCBmbG93LlxuXG5UbyBkbyB0aGF0LCBJJ20gZ29pbmcgdG8gbG9vayBjbG9zZWx5IGF0IHRoZSBmdW5jdGlvbidzIGNhbGxlcnMuIEkgbmVlZCB0byBzZWUgKndobyogaXMgdHJpZ2dlcmluZyB0aGlzIG1pZ3JhdGlvbiwgYW5kICp3aHkqLiBXaGF0IHNjZW5hcmlvcyBhcmUgd2UgYWRkcmVzc2luZyB3aXRoIHRoaXMgZnVuY3Rpb25hbGl0eT8gVGhlbiwgSSBoYXZlIHRvIHRyYWNlIGhvdyBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgdXNlZCwgYXMgaXQgc2VlbXMgZnVuZGFtZW50YWwgdG8gdGhlIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBwcm9jZXNzLiBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBob3cgaXQncyBjYWxsZWQgYW5kIHdoYXQgYXJndW1lbnRzIGFyZSBiZWluZyBwYXNzZWQgdG8gZnVsbHkgY29tcHJlaGVuZCBpdHMgcm9sZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdCBvbiB0aGUgb24tZGlzayBzdHJ1Y3R1cmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IGV4dGVudHMgYXJlIGJlaW5nIG1hbmFnZWQgZHVyaW5nIHRoZSBtaWdyYXRpb24sIGluY2x1ZGluZyB0aGUgaW1wYWN0IG9uIHRoZSBmaWxlc3lzdGVtJ3MgbWV0YWRhdGEuIEknbSBndWVzc2luZyB0aGF0IEknbGwgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBhY3R1YWwgY29kZSBvZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdG8gdW5kZXJzdGFuZCB0aGlzIHByb2Nlc3MgZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk0NDgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjA1LjU2MDc2Njg5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNTA6XFx0ZXJyX291dDpcXG4gMzUxOlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDM1MjpcXHR9XFxuIDM1MzpcXHRcXG4gMzU0OlxcdHN0YXRpYyBpbnQgZnJlZV9leHRfaWR4KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDM1NTpcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeClcXG4gMzU2OlxcdHtcXG4gMzU3OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAzNTg6XFx0XFx0ZXh0NF9mc2Jsa190IGJsb2NrO1xcbiAzNTk6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMzYwOlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbiAzNjE6XFx0XFxuIDM2MjpcXHRcXHRibG9jayA9IGV4dDRfaWR4X3BibG9jayhpeCk7XFxuIDM2MzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIGJsb2NrLCAwKTtcXG4gMzY0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAzNjY6XFx0XFxuIDM2NzpcXHRcXHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMzY4OlxcdFxcdGlmIChlaC1cXHUwMDNlZWhfZGVwdGggIT0gMCkge1xcbiAzNjk6XFx0XFx0XFx0aXggPSBFWFRfRklSU1RfSU5ERVgoZWgpO1xcbiAzNzA6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVxcdTAwM2VlaF9lbnRyaWVzKTsgaSsrLCBpeCsrKSB7XFxuIDM3MTpcXHRcXHRcXHRcXHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xcbiAzNzI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbCkge1xcbiAzNzM6XFx0XFx0XFx0XFx0XFx0cHV0X2JoKGJoKTtcXG4gMzc0OlxcdFxcdFxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDM3NTpcXHRcXHRcXHRcXHR9XFxuIDM3NjpcXHRcXHRcXHR9XFxuIDM3NzpcXHRcXHR9XFxuIDM3ODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAzNzk6XFx0XFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUyxcXG4gMzgwOlxcdFxcdFxcdFxcdGV4dDRfZnJlZV9tZXRhZGF0YV9yZXZva2VfY3JlZGl0cyhpbm9kZS1cXHUwMDNlaV9zYiwgMSkpO1xcbiAzODE6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDM4MjpcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAzODM6XFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBibG9jaywgMSxcXG4gMzg0OlxcdFxcdFxcdFxcdCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBIHwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbiAzODU6XFx0XFx0cmV0dXJuIDA7XFxuIDM4NjpcXHR9XFxuIDM4NzpcXHRcXG4gMzg4OlxcdC8qXFxuIDM4OTpcXHQgKiBGcmVlIHRoZSBleHRlbnQgbWV0YSBkYXRhIGJsb2NrcyBvbmx5XFxuIDM5MDpcXHQgKi9cXG4gMzkxOlxcdHN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4gMzkyOlxcdHtcXG4gMzkzOlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAzOTQ6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xcbiAzOTU6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKWVpLVxcdTAwM2VpX2RhdGE7XFxuIDM5NjpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeDtcXG4gMzk3OlxcdFxcdGlmIChlaC1cXHUwMDNlZWhfZGVwdGggPT0gMClcXG4gMzk4OlxcdFxcdFxcdC8qXFxuIDM5OTpcXHRcXHRcXHQgKiBObyBleHRyYSBibG9ja3MgYWxsb2NhdGVkIGZvciBleHRlbnQgbWV0YSBkYXRhXFxuIDQwMDpcXHRcXHRcXHQgKi9cXG4gNDAxOlxcdFxcdFxcdHJldHVybiAwO1xcbiA0MDI6XFx0XFx0aXggPSBFWFRfRklSU1RfSU5ERVgoZWgpO1xcbiA0MDM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVxcdTAwM2VlaF9lbnRyaWVzKTsgaSsrLCBpeCsrKSB7XFxuIDQwNDpcXHRcXHRcXHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xcbiA0MDU6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNDA2OlxcdFxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQwNzpcXHRcXHR9XFxuIDQwODpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiA0MDk6XFx0fVxcbiA0MTA6XFx0XFxuIDQxMTpcXHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA0MTI6XFx0e1xcbiA0MTM6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4gNDE0OlxcdFxcdGludCByZXR2YWwgPSAwLCBpO1xcbiA0MTU6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDQxNjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcXG4gNDE3OlxcdFxcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcXG4gNDE4OlxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG4gNDE5OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuIDQyMDpcXHRcXHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xcbiA0MjE6XFx0XFx0dWlkX3Qgb3duZXJbMl07XFxuIDQyMjpcXHRcXHRpbnQgYWxsb2NfY3R4O1xcbiA0MjM6XFx0XFxuIDQyNDpcXHRcXHQvKlxcbiA0MjU6XFx0XFx0ICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBvciB0aGUgaW5vZGVcXG4gNDI2OlxcdFxcdCAqIGFscmVhZHkgaXMgZXh0ZW50LWJhc2VkLCBlcnJvciBvdXQuXFxuIDQyNzpcXHRcXHQgKi9cXG4gNDI4OlxcdFxcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSB8fFxcbiA0Mjk6XFx0XFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XFxuIDQzMDpcXHRcXHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbiA0MzE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzMjpcXHRcXG4gNDMzOlxcdFxcdGlmIChTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpIFxcdTAwMjZcXHUwMDI2IGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9PSAwKVxcbiA0MzQ6XFx0XFx0XFx0LypcXG4gNDM1OlxcdFxcdFxcdCAqIGRvbid0IG1pZ3JhdGUgZmFzdCBzeW1saW5rXFxuIDQzNjpcXHRcXHRcXHQgKi9cXG4gNDM3OlxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0LypcXG4gNDQyOlxcdFxcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcXG4gNDQzOlxcdFxcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XFxuIDQ0NDpcXHRcXHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxcbiA0NDU6XFx0XFx0ICovXFxuIDQ0NjpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcXG4gNDQ3OlxcdFxcdFxcdDMgKyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXFx1MDAzZWlfc2IpKTtcXG4gNDQ4OlxcdFxcbiA0NDk6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjA1LjU2MDg2NjFaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzAzOTYzNjM3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIGBleHQ0X2V4dF9taWdyYXRlYCBGdW5jdGlvbioqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gUmlnaHQsIGl0J3MgbWlncmF0aW5nIGRhdGEgZXh0ZW50cy4gVGhlIGJhc2ljIGZsb3cgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXMgaG93IHRoZSB1cGRhdGVzIGFyZSBoYW5kbGVkLiBJdCBzZWVtcyB0aGF0IGBleHQ0X2V4dF9taWdyYXRlYCByZWxpZXMgb24gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHRvIGRvIHRoZSBoZWF2eSBsaWZ0aW5nLiBJbiBzb21lIGNhc2VzIChsaWtlIGRpcmVjdCBibG9ja3MsIEkgYmVsaWV2ZSksIGl0IGNhbGxzIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuIEZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGJleW9uZCwgaXQgYXBwZWFycyB3ZSdyZSBnb2luZyB0aHJvdWdoIGEgaGllcmFyY2h5OiBgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlYCwgYW5kIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLiBUaGF0IG1ha2VzIHNlbnNlOyBpdCdzIGEgd2F5IHRvIGhhbmRsZSB0aGUgZGlmZmVyZW50IGxldmVscyBvZiBpbmRpcmVjdGlvbiBpbiB0aGUgaW5vZGUuXG5cblRvIHJlYWxseSBuYWlsIGRvd24gdGhlIGRldGFpbHMsIEkgc2hvdWxkIHByb2JhYmx5IHRha2UgYSBsb29rIGF0IHRoZSBhY3R1YWwgY29kZS4gTGV0J3MgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbjogbGluZXMgNDUwIHRvIDUyMCBvZiBgZnMvZXh0NC9taWdyYXRlLmNgLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBoYW5kbGUgb24gaG93IHRoZSBkaWZmZXJlbnQgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHZhcmlhbnRzIGFyZSBjYWxsZWQgYW5kIHdoYXQgYXJndW1lbnRzIGFyZSBiZWluZyBwYXNzZWQuIEkgd2FudCB0byBzZWUgaG93IHRoZSBtZXRhZGF0YSBpcyB1cGRhdGVkIGF0IGVhY2ggc3RhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzM0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODowOC42MDA1MDU1NzlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODg3MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDUwLFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDUwOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNDUxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDUyOlxcdFxcdH1cXG4gNDUzOlxcdFxcdC8qXFxuIDQ1NDpcXHRcXHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUncyBibG9jayBtYXBwaW5nIGxheW91dFxcbiA0NTU6XFx0XFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcXG4gNDU2OlxcdFxcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXFxuIDQ1NzpcXHRcXHQgKi9cXG4gNDU4OlxcdFxcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVxcdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xcbiA0NTk6XFx0XFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXFx1MDAzZWlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSAqXFxuIDQ2MDpcXHRcXHRcXHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSArIDE7XFxuIDQ2MTpcXHRcXHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xcbiA0NjI6XFx0XFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcXG4gNDYzOlxcdFxcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KSxcXG4gNDY0OlxcdFxcdFxcdFxcdFxcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcXG4gNDY1OlxcdFxcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xcbiA0NjY6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xcbiA0Njc6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDY4OlxcdFxcdFxcdHRtcF9pbm9kZSA9IE5VTEw7XFxuIDQ2OTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ3MDpcXHRcXHR9XFxuIDQ3MTpcXHRcXHQvKlxcbiA0NzI6XFx0XFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJ2lub2RlJykuICBUaGlzXFxuIDQ3MzpcXHRcXHQgKiBpcyBzbyB0aGF0IHRoZSBtZXRhZGF0YSBibG9ja3Mgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IGNoZWNrc3VtIGFmdGVyXFxuIDQ3NDpcXHRcXHQgKiB0aGUgbWlncmF0aW9uLlxcbiA0NzU6XFx0XFx0ICovXFxuIDQ3NjpcXHRcXHRlaSA9IEVYVDRfSShpbm9kZSk7XFxuIDQ3NzpcXHRcXHR0bXBfY3N1bV9zZWVkID0gRVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0Nzg6XFx0XFx0RVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkID0gZWktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0Nzk6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4gNDgwOlxcdFxcdC8qXFxuIDQ4MTpcXHRcXHQgKiBTZXQgdGhlIGlfbmxpbmsgdG8gemVybyBzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXJcXG4gNDgyOlxcdFxcdCAqIHdoZW4gd2UgZHJvcCBpbm9kZSByZWZlcmVuY2UuXFxuIDQ4MzpcXHRcXHQgKi9cXG4gNDg0OlxcdFxcdGNsZWFyX25saW5rKHRtcF9pbm9kZSk7XFxuIDQ4NTpcXHRcXG4gNDg2OlxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuIDQ4NzpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHQvKlxcbiA0OTA6XFx0XFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcXG4gNDkxOlxcdFxcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxcbiA0OTI6XFx0XFx0ICpcXG4gNDkzOlxcdFxcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXFxuIDQ5NDpcXHRcXHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcXG4gNDk1OlxcdFxcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXFxuIDQ5NjpcXHRcXHQgKi9cXG4gNDk3OlxcdFxcdC8qXFxuIDQ5ODpcXHRcXHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXFxuIDQ5OTpcXHRcXHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxcbiA1MDA6XFx0XFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXFxuIDUwMTpcXHRcXHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXFxuIDUwMjpcXHRcXHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXFxuIDUwMzpcXHRcXHQgKiBhbGxvY2F0aW9uLlxcbiA1MDQ6XFx0XFx0ICovXFxuIDUwNTpcXHRcXHRkb3duX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiA1MDY6XFx0XFx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUpO1xcbiA1MDc6XFx0XFx0dXBfcmVhZCgoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pKTtcXG4gNTA4OlxcdFxcbiA1MDk6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xcbiA1MTA6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDUxMTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDUxMjpcXHRcXHRcXHRnb3RvIG91dF90bXBfaW5vZGU7XFxuIDUxMzpcXHRcXHR9XFxuIDUxNDpcXHRcXG4gNTE1OlxcdFxcdGlfZGF0YSA9IGVpLVxcdTAwM2VpX2RhdGE7XFxuIDUxNjpcXHRcXHRtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcXG4gNTE3OlxcdFxcbiA1MTg6XFx0XFx0LyogMzIgYml0IGJsb2NrIGFkZHJlc3MgNCBieXRlcyAqL1xcbiA1MTk6XFx0XFx0bWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MDguNjAwNTk2MDA5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwNTI2NTAxMDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBDb2RlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLiBUaGF0J3MgdGhlIGVudHJ5IHBvaW50LCB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGtpY2tzIG9mZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBOb3csIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBsaXZpbmcgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEdvb2QsIHRoYXQgbWVhbnMgaXQncyBsb2NhbGl6ZWQgYW5kIHdlIGhhdmUgYSBnb29kIGdyYXNwIG9mIGl0cyBzY29wZS4gUmlnaHQsIGxldCdzIHZlcmlmeSBpZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgaW5saW5lZCBvciBzdGF0aWM7IHllcCBpdCdzIGRlY2xhcmVkIGBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoLi4uKWAuIFBlcmZlY3QuXG5cbk15IGtleSBmb2N1cyBwb2ludHMgaGVyZSBhcmUgZGVmaW5pdGVseSBnb2luZyB0byBiZSBgZXh0NF9leHRfbWlncmF0ZWAgaXRzZWxmLCBhbmQgdGhlbiB0aG9zZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdmFyaWFudHMuIEluY2x1ZGluZyBgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlYCwgYW5kIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhvc2UgZml0IHRvZ2V0aGVyLlxuXG5BcyBmb3IgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMsIEknbSBwcmV0dHkgc3VyZSB3ZSBuZWVkIGBFWFQ0X0ZTYC4gQnV0IEkgc2hvdWxkIHJlYWxseSBkb3VibGUtY2hlY2sgZm9yIGFueSBvdGhlciBkZXBlbmRlbmNpZXM7IGl0J3MgYWx3YXlzIGdvb2QgdG8gYmUgdGhvcm91Z2guIEknbGwgdGFrZSBhIHF1aWNrIHNjYW4gb2YgYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBsb29rIGZvciBhbnkgYCNpZmRlZmAgYmxvY2tzLiBUaGF0J2xsIHRlbGwgdXMgaWYgYW55IG90aGVyIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb25zIGNvbWUgaW50byBwbGF5IGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTM1LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MTEuNjUzMjQ5MDg1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDM4MzEzMjQsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIiNpZlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MTEuNzU3MDg5Nzk5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjExNTMyMDUyOTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIGBmcy9leHQ0L21pZ3JhdGUuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2UgdGhlcmUgYXJlIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMsIHdoaWNoIGlzIGEgZ29vZCBzaWduIOKAkyBsZXNzIHRvIHdvcnJ5IGFib3V0IGluIHRlcm1zIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNvbXBsZXhpdHkuIFRpbWUgdG8gaW52ZXN0aWdhdGUgdGhlIGRlcGVuZGVuY2llcyB0aHJvdWdoIEtjb25maWcuIExvb2tzIGxpa2UgYEVYVDRfRlNgIHNlbGVjdHMgYEJVRkZFUl9IRUFEYCwgYEpCRDJgLCBgQ1JDMTZgLCBgQ1JDMzJgLCBhbmQgYEZTX0lPTUFQYC4gTm90aGluZyBvdmVybHkgZXhvdGljIHRoZXJlLCBubyByZWQgZmxhZ3MgYWJvdXQgdHJpY2t5IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzdHVmZiBvciBvYnNjdXJlIGhhcmR3YXJlIGRlcGVuZGVuY2llcyB0aGF0IHdvdWxkIGNvbXBsaWNhdGUgZnV6emluZy4gVGhpcyBpcyBhbGwgbG9va2luZyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvIGZhci5cblxuTm93LCBsZXQncyByaWdvcm91c2x5IGdvIHRocm91Z2ggdGhlIGNyaXRlcmlhIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGlzIGEgZ29vZCB0YXJnZXQuIEZpcnN0LCBgV29ydGhGdXp6aW5nYDogdGhlIHBhdGNoIG1vZGlmaWVzIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHNwZWNpZmljYWxseSBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIHdoaWNoIGlzIGdvb2QuIEl0J3MgYWxzbyBjaGFuZ2luZyB0aGUgcnVsZXMgYXJvdW5kIGhvdyBleHQ0IGV4dGVudCByYW5nZXMgYXJlIGV4dGVuZGVkIGR1cmluZyBtaWdyYXRpb24uIFRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhlIGxpbWl0IG9uIGV4dGVudCBsZW5ndGggYXQgYEVYVF9JTklUX01BWF9MRU5gLCB0aGF0J3MgYW4gaW50ZXJlc3RpbmcgY29uZGl0aW9uIHRvIHByb2JlLiAgQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgcGF0aCBpcyByZWFjaGFibGUgdmlhIGBpb2N0bChmZCwgRVhUNF9JT0NfTUlHUkFURSlgIG9yIGBpb2N0bChmZCwgRlNfSU9DX1NFVEZMQUdTLCAuLi4pYCDigJMgcGVyZmVjdCEgSSBjYW4gaGl0IGl0IGluIGEgdHlwaWNhbCBWTSBvciBzeXprYWxsZXIgc2V0dXAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IEkgd2FudC4gVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYC5cblxuTmV4dCwgSSBuZWVkIHRvIGRlZmluZSB0aGUgcmVsZXZhbnQgc3ltYm9scyB0byBmb2N1cyBvbi4gQmFzZWQgb24gdGhlIHBhdGNoIGFuZCB0aGUgYWZmZWN0ZWQgZnVuY3Rpb25zLCB0aGUgdHdvIGtleSBvbmVzIGFyZSBgZXh0NF9leHRfbWlncmF0ZWAgYW5kIHRoZSBtb2RpZmllZCBgdXBkYXRlX2V4dGVudF9yYW5nZWAuIFRoZXNlIHdpbGwgYmUgbXkgYEZvY3VzU3ltYm9sc2AuXG5cbkZpbmFsbHksIGZvciB0aGUgYEVuYWJsZUNvbmZpZ3NgLCBJJ2xsIG5lZWQgYEVYVDRfRlNgLCB3aGljaCBzZWVtcyBvYnZpb3VzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGNvbmZpcm0uXG5cbkFscmlnaHQsIHdpdGggYWxsIHRoYXQgY29uZmlybWVkLCBJJ20gcmVhZHkgdG8gcHJvY2VlZC4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIExldCdzIGdldCB0aGlzIGZ1enppbmcgZ29pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDU0LCJPdXRwdXRUb2tlbnMiOjEyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODoyMy4yODkxNDQ4MTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTE2NTcxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjIzLjM2ODMxNzYyM1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA0MjI2MjMyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODoyMy4zNjg3Mzc5MjNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMDQyMjE5ODAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIGAobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFxcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcbkFsbCBmaWVsZHMgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgYXJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYmUxOWRjOWI0MzcyYmJhMzVkZjJiNWU2M2FjMDEyNWJlYTFiYjQ1MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDEwIDAzOjQ3OjI4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xuaW5kZXggNWQ2MGVmMTBmZTExMC4uZGJiZDUzNzczMTU1NiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xuQEAgLTcxLDcgKzcxLDggQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHQgKi9cbiBcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgXHUwMDI2XHUwMDI2XG4gXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG4tXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbitcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSBcdTAwMjZcdTAwMjZcbitcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayArIDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gXHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuIFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiBcdFx0bGItXHUwMDNlY3Vycl9ibG9jaysrO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjMuMzY4NzM4ODMzWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU3MTUzNDE0MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBUaGUgZGlmZiB0YXJnZXRzIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHNwZWNpZmljYWxseSB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLiBJbW1lZGlhdGVseSwgSSBzZWUgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdGhhdCdzIGJlaW5nIG1vZGlmaWVkLiBJdCBsb29rcyBsaWtlIGl0J3MgdHJ5aW5nIHRvIG9wdGltaXplIGhvdyBleHRlbnQgcmFuZ2VzIGFyZSB1cGRhdGVkLCBsaWtlbHkgZHVyaW5nIGEgbWlncmF0aW9uIG9yIGRlZnJhZ21lbnRhdGlvbiBwcm9jZXNzLiBJJ20gZm9jdXNpbmcgb24gdGhlIGNvbmRpdGlvbiBpdHNlbGYsIHdoaWNoIGNoZWNrcyBmb3IgY29uc2VjdXRpdmUgYmxvY2tzIGFuZCBwaHlzaWNhbCBibG9ja3Mgd2l0aGluIGFuIGV4dGVudC5cblxuVGhlIG9yaWdpbmFsIGNoZWNrLCBmcm9tIHdoYXQgSSBjYW4gc2VlIG9mIGl0LCB2ZXJpZmllcyBpZiBgbGItXHUwMDNlZmlyc3RfcGJsb2NrYCBleGlzdHMsIGlmIGBsYi1cdTAwM2VsYXN0X3BibG9jayArIDFgIGlzIGVxdWFsIHRvIGBwYmxvY2tgLCBhbmQgYGxiLVx1MDAzZWxhc3RfYmxvY2sgKyAxYCBpcyBlcXVhbCB0byBgbGItXHUwMDNlY3Vycl9ibG9ja2AuIE5vdywgdGhlIHBhdGNoIGFkZHMgYW5vdGhlciBjb25kaXRpb246IGBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOYC4gVGhpcyBpcyBjcnVjaWFsLiBJdCBsb29rcyBsaWtlIHRoZXkncmUgcHJldmVudGluZyBhbiBleHRlbnQgZnJvbSBncm93aW5nIGJleW9uZCBpdHMgaW5pdGlhbCBtYXhpbXVtIGxlbmd0aCB3aGVuIHBlcmZvcm1pbmcgbWlncmF0aW9uLiBUaGlzIHdpbGwgcHJldmVudCBhIHByb2JsZW0sIHN1Y2ggYXMgYW4gb3ZlcmZsb3csIG9yIHNvbWUgb3RoZXIgYmFkIHN0YXRlLlxuXG5CeSBjaGVja2luZyB0aGUgbWF4aW11bSBleHRlbnQgbGVuZ3RoIHRoaXMgcGF0Y2ggYWltcyB0byBhdm9pZCBhbnkgcHJvYmxlbXMgYXJpc2luZyBmcm9tIHRoZSBleHRlbnQgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIHBlcm1pdHRlZCBzaXplLiBUaGlzIHN1Z2dlc3RzIHRoZSBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgcG90ZW50aWFsIGlzc3VlIHdoZXJlIGV4dGVuZGluZyBhIHJhbmdlIGNvdWxkIGxlYWQgdG8gdW5kZXNpcmFibGUgYmVoYXZpb3IsIHByb2JhYmx5IHJlbGF0ZWQgdG8gbWV0YWRhdGEgbGltaXRhdGlvbnMgb3Igc29tZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgd2l0aGluIGV4dDQncyBleHRlbnQgbWFuYWdlbWVudC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0IGlzIGFkZHJlc3NpbmcgYSBjb3JuZXIgY2FzZSB3aGVuIG1pZ3JhdGluZyBsYXJnZSBmaWxlcywgb3Igc29tZSBib3VuZGFyeSBjb25kaXRpb24sIHRvIGVuc3VyZSB0aGUgZXh0ZW50IHN0cnVjdHVyZSByZW1haW5zIGNvbnNpc3RlbnQuIFRoZSBhZGRpdGlvbiBzaG91bGQgaW1wcm92ZSB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjkuMDg0MDg0MTg5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMDMyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMzA6XFx0XFxuICAzMTpcXHRcXHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cXG4gIDMyOlxcdFxcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVxcdTAwM2VmaXJzdF9ibG9jayk7XFxuICAzMzpcXHRcXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEpO1xcbiAgMzQ6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleHQsIGxiLVxcdTAwM2VmaXJzdF9wYmxvY2spO1xcbiAgMzU6XFx0XFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG4gIDM2OlxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiAgMzc6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVxcdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XFxuICAzODpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuICAzOTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNDA6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNDE6XFx0XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKlxcbiAgNDQ6XFx0XFx0ICogQ2FsY3VsYXRlIHRoZSBjcmVkaXQgbmVlZGVkIHRvIGluc2VydGluZyB0aGlzIGV4dGVudFxcbiAgNDU6XFx0XFx0ICogU2luY2Ugd2UgYXJlIGRvaW5nIHRoaXMgaW4gbG9vcCB3ZSBtYXkgYWNjdW11bGF0ZSBleHRyYVxcbiAgNDY6XFx0XFx0ICogY3JlZGl0LiBCdXQgYmVsb3cgd2UgdHJ5IHRvIG5vdCBhY2N1bXVsYXRlIHRvbyBtdWNoXFxuICA0NzpcXHRcXHQgKiBvZiB0aGVtIGJ5IHJlc3RhcnRpbmcgdGhlIGpvdXJuYWwuXFxuICA0ODpcXHRcXHQgKi9cXG4gIDQ5OlxcdFxcdG5lZWRlZCA9IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChpbm9kZSxcXG4gIDUwOlxcdFxcdFxcdCAgICBsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEsIHBhdGgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xcbiAgNTM6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuICA1NDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA1NTpcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXh0LCAwKTtcXG4gIDU2OlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuICA1NzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNTg6XFx0ZXJyX291dDpcXG4gIDU5OlxcdFxcdHVwX3dyaXRlKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiAgNjA6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbiAgNjE6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IDA7XFxuICA2MjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDY2OlxcdFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgNjc6XFx0e1xcbiAgNjg6XFx0XFx0aW50IHJldHZhbDtcXG4gIDY5OlxcdFxcdC8qXFxuICA3MDpcXHRcXHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcXG4gIDcxOlxcdFxcdCAqL1xcbiAgNzI6XFx0XFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgXFx1MDAyNlxcdTAwMjZcXG4gIDczOlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9wYmxvY2srMSA9PSBwYmxvY2spIFxcdTAwMjZcXHUwMDI2XFxuICA3NDpcXHRcXHRcXHQobGItXFx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cXHUwMDNlY3Vycl9ibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc1OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEgXFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKSkge1xcbiAgNzY6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiAgNzc6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cXHUwMDNlY3Vycl9ibG9jaztcXG4gIDc4OlxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuICA3OTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDgwOlxcdFxcdH1cXG4gIDgxOlxcdFxcdC8qXFxuICA4MjpcXHRcXHQgKiBTdGFydCBhIG5ldyByYW5nZS5cXG4gIDgzOlxcdFxcdCAqL1xcbiAgODQ6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTtcXG4gIDg1OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4NjpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgODc6XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDg4OlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA4OTpcXHR9XFxuICA5MDpcXHRcXG4gIDkxOlxcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDkyOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuICA5MzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgOTQ6XFx0e1xcbiAgOTU6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gIDk2OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAgOTc6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuICA5ODpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuICA5OTpcXHRcXG4gMTAwOlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG4gMTAxOlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxMDI6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxMDM6XFx0XFxuIDEwNDpcXHRcXHRpX2RhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTA1OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDEwNjpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDEwNzpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXFxuIDEwODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XFxuIDEwOTpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiAxMTA6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDExMTpcXHRcXHRcXHR9IGVsc2Uge1xcbiAxMTI6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gMTEzOlxcdFxcdFxcdH1cXG4gMTE0OlxcdFxcdH1cXG4gMTE1OlxcdFxcdHB1dF9iaChiaCk7XFxuIDExNjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxMTc6XFx0XFxuIDExODpcXHR9XFxuIDExOTpcXHRcXG4gMTIwOlxcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDEyMTpcXHRcXHRcXHRcXHRcXHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gMTIyOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTI1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxMjY6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuIDEyNzpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDEyODpcXHRcXG4gMTI5OlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjkuMDg0MTg2NTA5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1NTU3OTc2OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggaXMgYWN0dWFsbHkgY2hhbmdpbmcuIFJpZ2h0LCBpdCdzIGFib3V0IHRoZSBgZXh0NF9taWdyYXRlYCBwcm9jZXNzLCBzcGVjaWZpY2FsbHkgd2hlcmUgd2UncmUgY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIG9uZXMgdXNpbmcgYEVYVDRfSU9DX01JR1JBVEVgLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgaG93IGV4dGVudHMgYXJlIGdlbmVyYXRlZCBmcm9tIGNvbnRpZ3VvdXMgYmxvY2sgcmFuZ2VzIGR1cmluZyB0aGlzIG1pZ3JhdGlvbi5cblxuSSBrbm93IHRoYXQgZXh0NCB1c2VzIDE2LWJpdCBmaWVsZHMgKGBlZV9sZW5gKSBmb3IgZXh0ZW50IGxlbmd0aHMuIFRoZSB0cmlja3kgcGFydCBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBleHRlbnRzLiBVbmluaXRpYWxpemVkIGV4dGVudHMgbWFyayB0aGUgTVNCIGluIGBlZV9sZW5gLCB3aGlsZSBpbml0aWFsaXplZCBleHRlbnRzIGhhdmUgYGVlX2xlbmAgc2V0IHRvIGEgbWF4aW11bSB2YWx1ZSwgYEVYVF9JTklUX01BWF9MRU5gLCB3aGljaCBpcyAzMjc2OC5cblxuVGhlIHBvdGVudGlhbCBwcm9ibGVtIGlzIHByZXR0eSBjbGVhcjogaWYgd2UgdHJ5IHRvIGNyZWF0ZSBhbiBleHRlbnQgbGFyZ2VyIHRoYW4gYEVYVF9JTklUX01BWF9MRU5gIGR1cmluZyBtaWdyYXRpb24sIGBlZV9sZW5gIHdpbGwgZWl0aGVyIG92ZXJmbG93IG9yIGJlIGludmFsaWQsIGxlYWRpbmcgdG8gYWxsIHNvcnRzIG9mIG5hc3R5IGNvbnNlcXVlbmNlcyDigJMgZGF0YSBjb3JydXB0aW9uIG9yIGVycm9ycyBkb3duIHRoZSBsaW5lIGR1cmluZyBleHRlbnQgaW5zZXJ0aW9uIG9yIGV2ZW4gd2hlbiByZWFkaW5nIHRoZSBkYXRhLiBTbyBpdOKAmXMgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgaXNzdWUuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgcmVnYXJkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJIG5lZWQgdG8gc2NydXRpbml6ZSBob3cgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQuIFRoYXQncyB0aGUga2V5IHRvIGZpZ3VyaW5nIG91dCB0aGUgcG90ZW50aWFsIGZvciBwcm9ibGVtcyBoZXJlLiBHb3R0YSBsb29rIGF0IHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGFuZCBob3cgdGhlIHNpemVzIGFyZSBjaGVja2VkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGlzc3VlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MzU0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzIuNjM5OTg3NTQ1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBMR1BMLTIuMVxcbiAgIDI6XFx0LypcXG4gICAzOlxcdCAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDdcXG4gICA0OlxcdCAqIEF1dGhvciBBbmVlc2ggS3VtYXIgSy5WIFxcdTAwM2NhbmVlc2gua3VtYXJAbGludXgudm5ldC5pYm0uY29tXFx1MDAzZVxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqL1xcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgIDk6XFx0I2luY2x1ZGUgXFxcImV4dDRfamJkMi5oXFxcIlxcbiAgMTA6XFx0I2luY2x1ZGUgXFxcImV4dDRfZXh0ZW50cy5oXFxcIlxcbiAgMTE6XFx0XFxuICAxMjpcXHQvKlxcbiAgMTM6XFx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXFxuICAxNDpcXHQgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcXG4gIDE1OlxcdCAqL1xcbiAgMTY6XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcXG4gIDE3OlxcdFxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbiAgMTg6XFx0XFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XFxuICAxOTpcXHR9O1xcbiAgMjA6XFx0XFxuICAyMTpcXHRzdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMjI6XFx0XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0e1xcbiAgMjU6XFx0XFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcXG4gIDI2OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XFxuICAyNzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcXG4gIDI4OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXFxuICAyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMwOlxcdFxcbiAgMzE6XFx0XFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXFxuICAzMjpcXHRcXHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cXHUwMDNlZmlyc3RfYmxvY2spO1xcbiAgMzM6XFx0XFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG4gIDM0OlxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXh0LCBsYi1cXHUwMDNlZmlyc3RfcGJsb2NrKTtcXG4gIDM1OlxcdFxcdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXFxuICAzNjpcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gIDM3OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbiAgMzg6XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbiAgMzk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDQwOlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzIuNjQwMDk0NDM1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE3MDgxNDkwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgSW5zdGFudGlhdGlvbiBvZiBgbWlncmF0ZV9zdHJ1Y3QgbGJgKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgYG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBiZWluZyB1c2VkLiBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIGl0cyBpbnN0YW50aWF0aW9ucy4gTm8gcG9pbnQgaW4gbWFraW5nIGFzc3VtcHRpb25zOyBJIG5lZWQgdG8gZm9sbG93IHRoZSBjb2RlJ3MgYnJlYWRjcnVtYnMgZGlyZWN0bHkuIFRoaXMgbGlrZWx5IG1lYW5zIGdyZXBwaW5nLCBidXQgSSdsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgb3RoZXIgZmFjdG9ycyBsaWtlIG1hY3JvcyBvciBwb3RlbnRpYWwgaW5kaXJlY3QgY2FsbHMgdGhhdCBtaWdodCBvYnNjdXJlIHRoZSBkaXJlY3QgaW5zdGFudGlhdGlvbi4gSSBuZWVkIHRvIGJlIG1ldGhvZGljYWwgaGVyZSwgbWFwcGluZyBvdXQgdGhlIGNhbGwgZ3JhcGggZnJvbSB0aGUgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiB0byByZWxldmFudCBmdW5jdGlvbnMuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRoYXQgbWlnaHQgYWZmZWN0IGl0cyBhY3R1YWwgdXNhZ2UgaW4gZGlmZmVyZW50IGJ1aWxkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcXVpY2sgY29kZSBkaXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTE4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNC4zNDgyNDYxNjlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4NjI5NTEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBtaWdyYXRlX3N0cnVjdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzoxNjpzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbmZzL2V4dDQvbWlncmF0ZS5jLTE3LVxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MjE9c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYzoyMjpcXHRcXHRcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTIzLVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmM6NjY6XFx0XFx0XFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuZnMvZXh0NC9taWdyYXRlLmMtNjcte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9OTE9c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbWlncmF0ZS5jLTkyLVxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6OTM6XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy05NC17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0xMjA9c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjEtXFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6MTIyOlxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTEyMy17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0xNTA9c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTEtXFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6MTUyOlxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTE1My17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz00MTE9aW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxNy1cXHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XFxuZnMvZXh0NC9taWdyYXRlLmM6NDE4OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG5mcy9leHQ0L21pZ3JhdGUuYy00MTktXFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzQuMzk2ODc4ODQxWiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxMTU3MTk3MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGVyZSB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgaXMgZGVmaW5lZCBhbmQgaW5pdGlhbGl6ZWQuIEknbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdCByZWdpb24sIHRoYXQncyB3aGVyZSB0aGUgbWFnaWMgcHJvYmFibHkgaGFwcGVucy4gTGV0J3Mgc3RhcnQgd2l0aCB3aGVyZSBpdCBpcyBkZWZpbmVkIGFuZCBpbnN0YW50aWF0ZWQuIEtub3dpbmcgaG93IGl0J3Mgc2V0IHVwIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIGhhdmUgYSBmZWVsaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNvbnRleHQgZm9yIGludGVycHJldGluZyB0aGUgc3Vycm91bmRpbmcgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNDEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNi41MTI2MDExNjlaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTQ5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDE1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiA0MTY6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7XFxuIDQxNzpcXHRcXHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XFxuIDQxODpcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XFxuIDQxOTpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzO1xcbiA0MjA6XFx0XFx0X191MzIgZ29hbCwgdG1wX2NzdW1fc2VlZDtcXG4gNDIxOlxcdFxcdHVpZF90IG93bmVyWzJdO1xcbiA0MjI6XFx0XFx0aW50IGFsbG9jX2N0eDtcXG4gNDIzOlxcdFxcbiA0MjQ6XFx0XFx0LypcXG4gNDI1OlxcdFxcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXFxuIDQyNjpcXHRcXHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxcbiA0Mjc6XFx0XFx0ICovXFxuIDQyODpcXHRcXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cXHUwMDNlaV9zYikgfHxcXG4gNDI5OlxcdFxcdCAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSB8fFxcbiA0MzA6XFx0XFx0ICAgIGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4gNDMxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRpZiAoU19JU0xOSyhpbm9kZS1cXHUwMDNlaV9tb2RlKSBcXHUwMDI2XFx1MDAyNiBpbm9kZS1cXHUwMDNlaV9ibG9ja3MgPT0gMClcXG4gNDM0OlxcdFxcdFxcdC8qXFxuIDQzNTpcXHRcXHRcXHQgKiBkb24ndCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xcbiA0MzY6XFx0XFx0XFx0ICovXFxuIDQzNzpcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRhbGxvY19jdHggPSBleHQ0X3dyaXRlcGFnZXNfZG93bl93cml0ZShpbm9kZS1cXHUwMDNlaV9zYik7XFxuIDQ0MDpcXHRcXG4gNDQxOlxcdFxcdC8qXFxuIDQ0MjpcXHRcXHQgKiBXb3JzdCBjYXNlIHdlIGNhbiB0b3VjaCB0aGUgYWxsb2NhdGlvbiBiaXRtYXBzIGFuZCBhIGJsb2NrXFxuIDQ0MzpcXHRcXHQgKiBncm91cCBkZXNjcmlwdG9yIGJsb2NrLiAgV2UgZG8gbmVlZCB0byB3b3JyeSBhYm91dFxcbiA0NDQ6XFx0XFx0ICogY3JlZGl0cyBmb3IgbW9kaWZ5aW5nIHRoZSBxdW90YSBpbm9kZS5cXG4gNDQ1OlxcdFxcdCAqL1xcbiA0NDY6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsXFxuIDQ0NzpcXHRcXHRcXHQzICsgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLVxcdTAwM2VpX3NiKSk7XFxuIDQ0ODpcXHRcXG4gNDQ5OlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA0NTA6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihoYW5kbGUpO1xcbiA0NTE6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiA0NTI6XFx0XFx0fVxcbiA0NTM6XFx0XFx0LypcXG4gNDU0OlxcdFxcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSdzIGJsb2NrIG1hcHBpbmcgbGF5b3V0XFxuIDQ1NTpcXHRcXHQgKiAoaW5kaXJlY3QgdG8gZXh0ZW50cykgYW5kIGlzIG5vdCB0cmFja2VkIGluIHRoZSBmYXN0IGNvbW1pdFxcbiA0NTY6XFx0XFx0ICogbG9nLCBzbyBkaXNhYmxlIGZhc3QgY29tbWl0cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cXG4gNDU3OlxcdFxcdCAqL1xcbiA0NTg6XFx0XFx0ZXh0NF9mY19tYXJrX2luZWxpZ2libGUoaW5vZGUtXFx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XFxuIDQ1OTpcXHRcXHRnb2FsID0gKCgoKHUzMilpbm9kZS1cXHUwMDNlaV9pbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cXHUwMDNlaV9zYikpICpcXG4gNDYwOlxcdFxcdFxcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cXHUwMDNlaV9zYikpICsgMTtcXG4gNDYxOlxcdFxcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XFxuIDQ2MjpcXHRcXHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xcbiA0NjM6XFx0XFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX3Jvb3QpLFxcbiA0NjQ6XFx0XFx0XFx0XFx0XFx0ICAgU19JRlJFRywgTlVMTCwgZ29hbCwgb3duZXIsIDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNi41MTI2OTgwMzlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjMwNzAzNzY5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuIGV4cGVydDpcblxuKipEZWx2aW5nIGludG8gYGV4dDRfZXh0X21pZ3JhdGVgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkndmUgYWxyZWFkeSBnb3QgYSBoYW5kbGUgb24gdGhlIG92ZXJhbGwgZ29hbCDigJMgY29udmVydGluZyBleHRlbnRzIHRvIGEgbW9yZSBlZmZpY2llbnQgZm9ybWF0LiBOb3csIGxldCdzIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyAqYWN0dWFsbHkqIGRvaW5nIGl0LiBXaGF0IGFyZSB0aGUga2V5IHN0ZXBzPyBBcmUgdGhlcmUgYW55IGNsZXZlciBvcHRpbWl6YXRpb25zIGluIHBsYXk/IEFyZSB0aGV5IGNvbnNpZGVyaW5nIGZyYWdtZW50YXRpb24gb3IgdHJ5aW5nIHRvIG1pbmltaXplIGRhdGEgbW92ZW1lbnQ/IEkgbmVlZCB0byBhbmFseXplIGl0cyBzdHJhdGVneTogaG93IGRvZXMgaXQgaGFuZGxlIG1ldGFkYXRhIHVwZGF0ZXMsIGVycm9yIGNvbmRpdGlvbnMsIGFuZCB0aGUgYWN0dWFsIGNvcHlpbmcvcmV3cml0aW5nIG9mIHRoZSBkYXRhIGJsb2Nrcz8gSXMgaXQgc2luZ2xlLXRocmVhZGVkIG9yIHV0aWxpemluZyBzb21lIGZvcm0gb2YgY29uY3VycmVuY3kgZm9yIHRoZXNlIHBvdGVudGlhbGx5IGxlbmd0aHkgZGF0YSBtaWdyYXRpb25zPyBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkOiB0aGUgZXh0ZW50IHRyZWUsIHRoZSBibG9jayBncm91cHMsIHRoZSBpbm9kZSBzdHJ1Y3R1cmUg4oCTIGhvdyBhcmUgdGhlc2UgYmVpbmcgbWFuaXB1bGF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzPyBBbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3Vlcz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBmb3Igc3BhY2UgYWxsb2NhdGlvbiwgcGVyaGFwcyB0aGUgdXRpbGl6YXRpb24gb2YgYSBmcmVlIHNwYWNlIGJpdG1hcCBvciBibG9jayBncm91cCBkZXNjcmlwdG9ycywgYW5kIEknbGwgbG9vayBmb3IgYW55IHNhZmVndWFyZHMgdG8gcHJldmVudCBkYXRhIGNvcnJ1cHRpb24gaW4gY2FzZSBvZiBlcnJvcnMuIFVsdGltYXRlbHksIEknbSB0cnlpbmcgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZSBvZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIHN0ZXAgYnkgc3RlcCwgYW5kIGFzc2VzcyBpdHMgcm9idXN0bmVzcyBhbmQgZWZmaWNpZW5jeS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzQwMywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzguODE5NzM4Nzk2WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTI4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0NjUsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0NjU6XFx0XFx0aWYgKElTX0VSUih0bXBfaW5vZGUpKSB7XFxuIDQ2NjpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XFxuIDQ2NzpcXHRcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0Njg6XFx0XFx0XFx0dG1wX2lub2RlID0gTlVMTDtcXG4gNDY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDcwOlxcdFxcdH1cXG4gNDcxOlxcdFxcdC8qXFxuIDQ3MjpcXHRcXHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAnaW5vZGUnKS4gIFRoaXNcXG4gNDczOlxcdFxcdCAqIGlzIHNvIHRoYXQgdGhlIG1ldGFkYXRhIGJsb2NrcyB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgY2hlY2tzdW0gYWZ0ZXJcXG4gNDc0OlxcdFxcdCAqIHRoZSBtaWdyYXRpb24uXFxuIDQ3NTpcXHRcXHQgKi9cXG4gNDc2OlxcdFxcdGVpID0gRVhUNF9JKGlub2RlKTtcXG4gNDc3OlxcdFxcdHRtcF9jc3VtX3NlZWQgPSBFWFQ0X0kodG1wX2lub2RlKS1cXHUwMDNlaV9jc3VtX3NlZWQ7XFxuIDQ3ODpcXHRcXHRFWFQ0X0kodG1wX2lub2RlKS1cXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cXHUwMDNlaV9jc3VtX3NlZWQ7XFxuIDQ3OTpcXHRcXHRpX3NpemVfd3JpdGUodG1wX2lub2RlLCBpX3NpemVfcmVhZChpbm9kZSkpO1xcbiA0ODA6XFx0XFx0LypcXG4gNDgxOlxcdFxcdCAqIFNldCB0aGUgaV9ubGluayB0byB6ZXJvIHNvIGl0IHdpbGwgYmUgZGVsZXRlZCBsYXRlclxcbiA0ODI6XFx0XFx0ICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS5cXG4gNDgzOlxcdFxcdCAqL1xcbiA0ODQ6XFx0XFx0Y2xlYXJfbmxpbmsodG1wX2lub2RlKTtcXG4gNDg1OlxcdFxcbiA0ODY6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNDg3OlxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDQ4ODpcXHRcXG4gNDg5OlxcdFxcdC8qXFxuIDQ5MDpcXHRcXHQgKiBzdGFydCB3aXRoIG9uZSBjcmVkaXQgYWNjb3VudGVkIGZvclxcbiA0OTE6XFx0XFx0ICogc3VwZXJibG9jayBtb2RpZmljYXRpb24uXFxuIDQ5MjpcXHRcXHQgKlxcbiA0OTM6XFx0XFx0ICogRm9yIHRoZSB0bXBfaW5vZGUgd2UgYWxyZWFkeSBoYXZlIGNvbW1pdHRlZCB0aGVcXG4gNDk0OlxcdFxcdCAqIHRyYW5zYWN0aW9uIHRoYXQgY3JlYXRlZCB0aGUgaW5vZGUuIExhdGVyIGFzIGFuZFxcbiA0OTU6XFx0XFx0ICogd2hlbiB3ZSBhZGQgZXh0ZW50cyB3ZSBleHRlbnQgdGhlIGpvdXJuYWxcXG4gNDk2OlxcdFxcdCAqL1xcbiA0OTc6XFx0XFx0LypcXG4gNDk4OlxcdFxcdCAqIEV2ZW4gdGhvdWdoIHdlIHRha2UgaV9yd3NlbSB3ZSBjYW4gc3RpbGwgY2F1c2UgYmxvY2tcXG4gNDk5OlxcdFxcdCAqIGFsbG9jYXRpb24gdmlhIG1tYXAgd3JpdGUgdG8gaG9sZXMuIElmIHdlIGhhdmUgYWxsb2NhdGVkXFxuIDUwMDpcXHRcXHQgKiBuZXcgYmxvY2tzIHdlIGZhaWwgbWlncmF0ZS4gIE5ldyBibG9jayBhbGxvY2F0aW9uIHdpbGxcXG4gNTAxOlxcdFxcdCAqIGNsZWFyIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUgZmxhZy4gIFRoZSBmbGFnIGlzIHVwZGF0ZWRcXG4gNTAyOlxcdFxcdCAqIHdpdGggaV9kYXRhX3NlbSBoZWxkIHRvIHByZXZlbnQgcmFjaW5nIHdpdGggYmxvY2tcXG4gNTAzOlxcdFxcdCAqIGFsbG9jYXRpb24uXFxuIDUwNDpcXHRcXHQgKi9cXG4gNTA1OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuIDUwNjpcXHRcXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XFxuIDUwNzpcXHRcXHR1cF9yZWFkKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiA1MDg6XFx0XFxuIDUwOTpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSwgMSk7XFxuIDUxMDpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNTExOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNTEyOlxcdFxcdFxcdGdvdG8gb3V0X3RtcF9pbm9kZTtcXG4gNTEzOlxcdFxcdH1cXG4gNTE0OlxcdFxcbiA1MTU6XFx0XFx0aV9kYXRhID0gZWktXFx1MDAzZWlfZGF0YTtcXG4gNTE2OlxcdFxcdG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpO1xcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXFxuIDUxOTpcXHRcXHRtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiA1MjA6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkrKykge1xcbiA1MjE6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiA1MjI6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTIzOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFxcdTAwMjZsYik7XFxuIDUyNDpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozOC44MTk4NTEyOTZaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDk3MTA2NjYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLTVNBTiBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoYXQgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBpcyBrZXkg4oCTIGl0J3MgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgc2FmZXR5IG9mIHRoaXMgY2hhbmdlLiBJdCBtZWFucyBgbGJgIGlzICphbHdheXMqIGluaXRpYWxpemVkLCBlbGltaW5hdGluZyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkLlxuXG5UaGUgY2hlY2sgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzIHN0cmFpZ2h0Zm9yd2FyZDpcblxuYGBgY1xuXHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG5cdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSBcdTAwMjZcdTAwMjZcblx0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcbmBgYFxuXG5JdCBib2lscyBkb3duIHRvIGEgY29udGlndW91cyBleHRlbnQgbGVuZ3RoIGNoZWNrLiBJdOKAmXMgZW5zdXJpbmcgdGhhdCBpZiB3ZSdyZSBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgZXh0ZW50LCB3ZSBkb24ndCBleGNlZWQgYEVYVF9JTklUX01BWF9MRU5gLiBUaGlzIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZWx5IGxhcmdlIGV4dGVudHMgZnJvbSBiZWluZyBjcmVhdGVkLCB3aGljaCBpcyByZWxhdGVkIHRvIGZpbGUgc3lzdGVtIG1pZ3JhdGlvbi5cblxuTm93LCBsZXQncyBjb25zaWRlciB0aGUgdXN1YWwgS01TQU4gY29uY2VybnMuIEknbSBsb29raW5nIGF0IHRoaXMgZnJvbSBhIGZldyBhbmdsZXM6XG5cbjEuICAqKlVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBzZW50IHRvIHVzZXIgc3BhY2U6KiogTm90IGhlcmUuIGBsYmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBub3RoaW5nIHVuaW5pdGlhbGl6ZWQgaXMgbGVha2VkLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM6KiogTm9wZS4gQXMgbWVudGlvbmVkLCBgbGJgIGlzIHplcm9lZCBvdXQsIGFuZCBhbGwgdGhlIGZpZWxkcyBpbnZvbHZlZCBpbiB0aGUgY29uZGl0aW9uYWwgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgdmFsdWVzLlxuMy4gICoqQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBwb3RlbnRpYWxseSBiZWluZyByZWFkOioqIEFnYWluLCBuby4gVGhlIG1lbW9yeSBpcyBpbml0aWFsaXplZC5cbjQuICAqKkJvdW5kcyBjaGVja3MgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk6KiogTm8uIFRoaXMgaXMgYWJvdXQgZXh0ZW50IGxlbmd0aCBsaW1pdHMsIG5vdCBhY2NpZGVudGFsbHkgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy5cblxuQmFzaWNhbGx5LCB0aGlzIHBhdGNoIGlzIG9ubHkgZm9jdXNlZCBvbiBjaGVja2luZyBleHRlbnQgYm91bmRhcmllcyBhbmQgcHJldmVudGluZyBsYXJnZSBleHRlbnRzIGZyb20gYmVpbmcgY3JlYXRlZCwgd2hpY2ggbWlnaHQgcmVsYXRlIHRvIGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24gb3IgcmVsYXRlZCBpc3N1ZXMuIEhvd2V2ZXIsIGlmIHN1Y2ggaXNzdWVzIGFyaXNlLCB3ZSB3b3VsZCBleHBlY3QgdG8gc2VlIHRoZSBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIG9yIEtBU0FOIGZsYWcgdGhlbS4gVGhpcyBwYXRjaCBpcyBub3QgaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IG5ldyB3YXlzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZXJlZm9yZSwgZ2l2ZW4gbXkgdW5kZXJzdGFuZGluZywgYE5lZWRzS01TQU5gIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIE5vdywgdGltZSBmb3IgYSBxdWljayBub3RlIG9uIEtBU0FOIHZzLiBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODcxMSwiT3V0cHV0VG9rZW5zIjoyMzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODo0My43OTA5MjA4MTNaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayBgKGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIHRvIHByZXZlbnQgYWNjdW11bGF0aW5nIGNvbnRpZ3VvdXMgYmxvY2tzIGludG8gYSBzaW5nbGUgZXh0ZW50IGJleW9uZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgaW5pdGlhbGl6ZWQgZXh0ZW50IGxlbmd0aCAoYEVYVF9JTklUX01BWF9MRU5gID0gMzI3NjgpIGR1cmluZyBpbm9kZSBtaWdyYXRpb24gZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBvZiBgZXh0NF9leHRfbWlncmF0ZSgpYC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLCBhbmQgZG9lcyBub3QgYWx0ZXIgbWVtb3J5IGluaXRpYWxpemF0aW9uIGxvZ2ljLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGV4dGVudCBsZW5ndGggb3ZlcmZsb3cgb3IgY29ycnVwdGVkIGV4dGVudCBzdHJ1Y3R1cmVzIGFyZSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0gYnVncyBvciBib3VuZHMgaXNzdWVzIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4vVUJTQU4gYnVpbGRzLiBDb25zZXF1ZW50bHksIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayBgKGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIHRvIHByZXZlbnQgYWNjdW11bGF0aW5nIGNvbnRpZ3VvdXMgYmxvY2tzIGludG8gYSBzaW5nbGUgZXh0ZW50IGJleW9uZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgaW5pdGlhbGl6ZWQgZXh0ZW50IGxlbmd0aCAoYEVYVF9JTklUX01BWF9MRU5gID0gMzI3NjgpIGR1cmluZyBpbm9kZSBtaWdyYXRpb24gZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBvZiBgZXh0NF9leHRfbWlncmF0ZSgpYC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLCBhbmQgZG9lcyBub3QgYWx0ZXIgbWVtb3J5IGluaXRpYWxpemF0aW9uIGxvZ2ljLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGV4dGVudCBsZW5ndGggb3ZlcmZsb3cgb3IgY29ycnVwdGVkIGV4dGVudCBzdHJ1Y3R1cmVzIGFyZSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0gYnVncyBvciBib3VuZHMgaXNzdWVzIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4vVUJTQU4gYnVpbGRzLiBDb25zZXF1ZW50bHksIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-10 03:46:05 +0000 UTC FinishedAt: 2026-09-10 03:48:46 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "ca532136-4f05-41fa-a842-2965978a3d56" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_ext_migrate", "update_extent_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2V4dF9taWdyYXRlJiMzNDssCiAgICAmIzM0O3VwZGF0ZV9leHRlbnRfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBsb2dpYyBpbiBmcy9leHQ0L21pZ3JhdGUuYyAodXBkYXRlX2V4dGVudF9yYW5nZSkgdG8gZW5zdXJlIGV4dGVudCBsZW5ndGhzIGRvIG5vdCBleGNlZWQgRVhUX0lOSVRfTUFYX0xFTi4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgRVhUNF9JT0NfTUlHUkFURSBpb2N0bHMgb24gZXh0NCBmaWxlc3lzdGVtcyBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAwMzo0NzoyOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jXG5pbmRleCA1ZDYwZWYxMGZlMTEwLi5kYmJkNTM3NzMxNTU2IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9taWdyYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jXG5AQCAtNzEsNyAmIzQzOzcxLDggQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHQgKi9cbiBcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgXHUwMDI2XHUwMDI2XG4gXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jayYjNDM7MSA9PSBwYmxvY2spIFx1MDAyNlx1MDAyNlxuLVx0XHQobGItXHUwMDNlbGFzdF9ibG9jayYjNDM7MSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSkge1xuJiM0MztcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gXHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuIFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiBcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OywKICAgICYjMzQ7dXBkYXRlX2V4dGVudF9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiZTE5ZGM5YjQzNzJiYmEzNWRmMmI1ZTYzYWMwMTI1YmVhMWJiNDUwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC03MSw3ICYjNDM7NzEsOCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkgKi8KIAlpZiAobGItJmd0O2ZpcnN0X3BibG9jayAmYW1wOyZhbXA7CiAJCShsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7Ci0JCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykpIHsKJiM0MzsJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwomIzQzOwkJKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKSkgewogCQlsYi0mZ3Q7bGFzdF9wYmxvY2sgPSBwYmxvY2s7CiAJCWxiLSZndDtsYXN0X2Jsb2NrID0gbGItJmd0O2N1cnJfYmxvY2s7CiAJCWxiLSZndDtjdXJyX2Jsb2NrJiM0MzsmIzQzOzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwNgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDM0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBOZWVkIGZvciBTeXprYWxsZXIgRnV6emluZyBvbiBhIEtlcm5lbCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBwYXRjaCB0byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgaXQgd2FycmFudCBiZWluZyBmdXp6ZWQgd2l0aCBzeXprYWxsZXI/IEZpcnN0LCBJIG5lZWQgdG8gZG8gYSBxdWljayByaXNrIGFzc2Vzc21lbnQuIFRoaXMgaXMgYSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHRhc2ssIGtlcm5lbCBtYWludGVuYW5jZSByZWFsbHkuIENvbnRleHQgYW5kIHNldmVyaXR5IHNlZW0gYmVuaWduLCBtZWFuaW5nIHRoZXJlJiMzOTtzIGxpa2VseSBubyByZWFsIGRhbmdlciBpbiBkaXZpbmcgaW50byB0aGlzLiBJdCBsb29rcyBzYWZlIHRvIGV2YWx1YXRlIGZ1bGx5LgoKTm93LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGNoYW5nZS4gU3BlY2lmaWNhbGx5LCBpdOKAmXMgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgd2l0aGluIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIExvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHRoZXJlJiMzOTtzIGEgbmV3IGNoZWNrIGFkZGVkOiBgbGItJmd0O2xhc3RfYmxvY2sgLSBsYi0mZ3Q7Zmlyc3RfYmxvY2sgJiM0MzsgMSAmbHQ7IEVYVF9JTklUX01BWF9MRU5gLiBUaGF0IGxvb2tzIGxpa2UgYSBsZW5ndGggY2hlY2ssIHBvdGVudGlhbGx5IHByZXZlbnRpbmcgc29tZSBraW5kIG9mIG92ZXJmbG93IG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGV4dGVudCBtaWdyYXRpb24uIE15IHNwaWRleS1zZW5zZSBpcyB0ZWxsaW5nIG1lIHRvIGludmVzdGlnYXRlIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93cyBhcyBhIGZpcnN0IHN0ZXAgaGVyZSwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBibG9jayBudW1iZXJzIGFuZCBzaXplcy4KClRvIGdldCBhIGJldHRlciBncmlwIG9uIHRoZSBmdWxsIHBpY3R1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZXhhbWluZSB0aGUgc3Vycm91bmRpbmcgY29kZSwgdGhlIGNhbGxlcnMgb2YgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhbmQgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLiBJ4oCZbGwgdXNlIGBncmVwcGVyYCBvciBtYXliZSBqdXN0IGByZWFkLWZpbGVgIHRvIHVuZGVyc3RhbmQgdGhlIGJpZ2dlciBwaWN0dXJlIG9mIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgZXh0NCBmaWxlIHN5c3RlbSYjMzk7cyBtaWdyYXRpb24gcHJvY2Vzcy4gVGhpcyB3aWxsIGhlbHAgbWUgZGV0ZXJtaW5lIGhvdyBjcml0aWNhbCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgYW5kIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvYnZpb3VzIHRhcmdldHMgZm9yIGZ1enppbmcgYmFzZWQgb24gdGhlIHBhdGNoJiMzOTtzIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcbiAgIDI6XHQvKlxuICAgMzpcdCAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDdcbiAgIDQ6XHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcdTAwM2NhbmVlc2gua3VtYXJAbGludXgudm5ldC5pYm0uY29tXHUwMDNlXG4gICA1Olx0ICpcbiAgIDY6XHQgKi9cbiAgIDc6XHRcbiAgIDg6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2piZDIuaFwmIzM0O1xuICAxMDpcdCNpbmNsdWRlIFwmIzM0O2V4dDRfZXh0ZW50cy5oXCYjMzQ7XG4gIDExOlx0XG4gIDEyOlx0LypcbiAgMTM6XHQgKiBUaGUgY29udGlndW91cyBibG9ja3MgZGV0YWlscyB3aGljaCBjYW4gYmVcbiAgMTQ6XHQgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcbiAgMTU6XHQgKi9cbiAgMTY6XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xuICAxNzpcdFx0ZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gIDE4Olx0XHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiAgMTk6XHR9O1xuICAyMDpcdFxuICAyMTpcdHN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDIyOlx0XHRcdFx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICAyMzpcdFxuICAyNDpcdHtcbiAgMjU6XHRcdGludCByZXR2YWwgPSAwLCBuZWVkZWQ7XG4gIDI2Olx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXh0O1xuICAyNzpcdFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGg7XG4gIDI4Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXG4gIDI5Olx0XHRcdHJldHVybiAwO1xuICAzMDpcdFxuICAzMTpcdFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXG4gIDMyOlx0XHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cdTAwM2VmaXJzdF9ibG9jayk7XG4gIDMzOlx0XHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSk7XG4gIDM0Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXh0LCBsYi1cdTAwM2VmaXJzdF9wYmxvY2spO1xuICAzNTpcdFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cbiAgMzY6XHRcdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiAgMzc6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XG4gIDM4Olx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4gIDM5Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDQwOlx0XHRcdGdvdG8gZXJyX291dDtcbiAgNDE6XHRcdH1cbiAgNDI6XHRcbiAgNDM6XHRcdC8qXG4gIDQ0Olx0XHQgKiBDYWxjdWxhdGUgdGhlIGNyZWRpdCBuZWVkZWQgdG8gaW5zZXJ0aW5nIHRoaXMgZXh0ZW50XG4gIDQ1Olx0XHQgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgdGhpcyBpbiBsb29wIHdlIG1heSBhY2N1bXVsYXRlIGV4dHJhXG4gIDQ2Olx0XHQgKiBjcmVkaXQuIEJ1dCBiZWxvdyB3ZSB0cnkgdG8gbm90IGFjY3VtdWxhdGUgdG9vIG11Y2hcbiAgNDc6XHRcdCAqIG9mIHRoZW0gYnkgcmVzdGFydGluZyB0aGUgam91cm5hbC5cbiAgNDg6XHRcdCAqL1xuICA0OTpcdFx0bmVlZGVkID0gZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KGlub2RlLFxuICA1MDpcdFx0XHQgICAgbGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEsIHBhdGgpO1xuICA1MTpcdFxuICA1MjpcdFx0cmV0dmFsID0gZXh0NF9kYXRhc2VtX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgaW5vZGUsIG5lZWRlZCwgbmVlZGVkLCAwKTtcbiAgNTM6XHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4gIDU0Olx0XHRcdGdvdG8gZXJyX291dDtcbiAgNTU6XHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4dCwgMCk7XG4gIDU2Olx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuICA1NzpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xuICA1ODpcdGVycl9vdXQ6XG4gIDU5Olx0XHR1cF93cml0ZSgoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKSk7XG4gIDYwOlx0XHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG4gIDYxOlx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSAwO1xuICA2MjpcdFx0cmV0dXJuIHJldHZhbDtcbiAgNjM6XHR9XG4gIDY0Olx0XG4gIDY1Olx0c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDY2Olx0XHRcdFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDY3Olx0e1xuICA2ODpcdFx0aW50IHJldHZhbDtcbiAgNjk6XHRcdC8qXG4gIDcwOlx0XHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcbiAgNzE6XHRcdCAqL1xuICA3MjpcdFx0aWYgKGxiLVx1MDAzZWZpcnN0X3BibG9jayBcdTAwMjZcdTAwMjZcbiAgNzM6XHRcdFx0KGxiLVx1MDAzZWxhc3RfcGJsb2NrJiM0MzsxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG4gIDc0Olx0XHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrJiM0MzsxID09IGxiLVx1MDAzZWN1cnJfYmxvY2spIFx1MDAyNlx1MDAyNlxuICA3NTpcdFx0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICYjNDM7IDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gIDc2Olx0XHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuICA3NzpcdFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiAgNzg6XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gIDc5Olx0XHRcdHJldHVybiAwO1xuICA4MDpcdFx0fVxuICA4MTpcdFx0LypcbiAgODI6XHRcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxuICA4MzpcdFx0ICovXG4gIDg0Olx0XHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xuICA4NTpcdFx0bGItXHUwMDNlZmlyc3RfcGJsb2NrID0gbGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDg2Olx0XHRsYi1cdTAwM2VmaXJzdF9ibG9jayA9IGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4NzpcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gIDg4Olx0XHRyZXR1cm4gcmV0dmFsO1xuICA4OTpcdH1cbiAgOTA6XHRcbiAgOTE6XHRzdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gIDkyOlx0XHRcdFx0XHQgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuICA5MzpcdFx0XHRcdFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgOTQ6XHR7XG4gIDk1Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuICA5NjpcdFx0X19sZTMyICppX2RhdGE7XG4gIDk3Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAgOTg6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuICA5OTpcdFxuIDEwMDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTExOAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgZXh0NCBNaWdyYXRpb24gQ29kZSoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZW50cnkgcG9pbnRzIGFuZCBvdmVyYWxsIGZsb3cgZm9yIGV4dDQgbWlncmF0aW9uIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIFJpZ2h0IG5vdywgSSYjMzk7bSBmb2N1c2VkIG9uIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRvIGdldCBhIGNvbXBsZXRlIGdyYXNwIG9mIHRoaXMsIEkgbmVlZCB0byBsb29rIGF0IHRoZSByZXN0IG9mIHRoaXMgZmlsZS4gVGhlIGltcG9ydGFudCBwYXJ0IEkgbmVlZCBpcyB0aGUgaW5pdGlhbCBmdW5jdGlvbiBjYWxsIGFuZCBob3cgdGhpcyBlbnRpcmUgbWlncmF0aW9uIHByb2Nlc3MgaXMgdHJpZ2dlcmVkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBVbmRlcnN0YW5kaW5nIHRoZSBlbnRyeSBwb2ludHMgd2lsbCBnaXZlIG1lIHRoZSBob29rcyBJIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvIHRoZSBtZWNoYW5pY3Mgb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF9taWdyYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zMjU0PWludCBleHQ0X2ZvcmNlX3NodXRkb3duKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncyk7XG4tLVxuZnMvZXh0NC9leHQ0LmgtMzI1Ni0vKiBtaWdyYXRlLmMgKi9cbmZzL2V4dDQvZXh0NC5oOjMyNTc6ZXh0ZXJuIGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqKTtcbmZzL2V4dDQvZXh0NC5oLTMyNTgtZXh0ZXJuIGludCBleHQ0X2luZF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuLS1cbmZzL2V4dDQvaW9jdGwuYz01OTA9c3RhdGljIGludCBleHQ0X2lvY3RsX3NldGZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTcwNS1cdFx0aWYgKGZsYWdzIFx1MDAyNiBFWFQ0X0VYVEVOVFNfRkwpXG5mcy9leHQ0L2lvY3RsLmM6NzA2Olx0XHRcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xuZnMvZXh0NC9pb2N0bC5jLTcwNy1cdFx0ZWxzZVxuLS1cbmZzL2V4dDQvaW9jdGwuYz0xNTM4PXN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTE3MDEtXHRcdGlub2RlX2xvY2soKGlub2RlKSk7XG5mcy9leHQ0L2lvY3RsLmM6MTcwMjpcdFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XG5mcy9leHQ0L2lvY3RsLmMtMTcwMy1cdFx0aW5vZGVfdW5sb2NrKChpbm9kZSkpO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTM5MT1zdGF0aWMgaW50IGZyZWVfZXh0X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNDEwLVxuZnMvZXh0NC9taWdyYXRlLmM6NDExOmludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9leHQ0L21pZ3JhdGUuYy00MTIte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU3NTcKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCBmaWd1cmUgb3V0IGl0cyBLY29uZmlnIGRlcGVuZGVuY2llcy4gV2hlcmUgc2hvdWxkIEkgc3RhcnQ/IFRoZSBvYnZpb3VzIHBsYWNlcyBhcmUgdGhlIGBNYWtlZmlsZWAgYW5kIGBLY29uZmlnYCBmaWxlcyB3aXRoaW4gdGhlIGBmcy9leHQ0YCBkaXJlY3RvcnkuIEkmIzM5O2xsIGNoZWNrIHRob3NlIGZpcnN0LiBUaGV5IHNob3VsZCBleHBsaWNpdGx5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBpbmNsdXNpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGZpbGUsIGFuZCB0aGF0IHNob3VsZCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIE5vIG5lZWQgdG8gb3ZlcnRoaW5rIGl0OyB0aGUgYW5zd2VyIHNob3VsZCBiZSByaWdodCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttaWdyYXRlXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9NYWtlZmlsZT04PWV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGUtOS1cdFx0ZXh0ZW50c19zdGF0dXMubyBmaWxlLm8gZnNtYXAubyBmc3luYy5vIGhhc2gubyBpYWxsb2MubyBcXFxuZnMvZXh0NC9NYWtlZmlsZToxMDpcdFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxuZnMvZXh0NC9NYWtlZmlsZS0xMS1cdFx0bW1wLm8gbW92ZV9leHRlbnQubyBuYW1laS5vIHBhZ2UtaW8ubyByZWFkcGFnZS5vIHJlc2l6ZS5vIFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA5NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkV4dDQgTW9kdWxlIERlcGVuZGVuY2llcyoqCgpSaWdodCwgc28gYG1pZ3JhdGUub2AuLi4gdGhhdCYjMzk7cyBwYXJ0IG9mIHRoZSBgZXh0NC15YCBidWlsZCwgYW5kICp0aGF0KiBtZWFucyBpdCBnZXRzIGJ1aWx0IHdoZW5ldmVyIHRoZSBgQ09ORklHX0VYVDRfRlNgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2QgdG8ga25vdywgYW5kIGZyYW5rbHksIEkgc2hvdWxkIGhhdmUgcmVtZW1iZXJlZCB0aGF0IGZyb20gcmV2aWV3aW5nIHRoZSBidWlsZCBzeXN0ZW0gYmVmb3JlLiBJdCYjMzk7cyBhIGtleSBkZXBlbmRlbmN5LiBOb3csIEkgd2FudCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBhbGwgdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24ga25vYnMgYXNzb2NpYXRlZCB3aXRoIGV4dDQuIEkmIzM5O2xsIHRha2UgYSBsb29rIGF0IGBmcy9leHQ0L0tjb25maWdgIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQmIzM5O2xsIGJlIGludGVyZXN0aW5nIHRvIHNlZSBpZiBhbnkgbmV3IG9uZXMgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIG15IGxhc3QgZGV0YWlsZWQgcmV2aWV3LiBJIG1heSBhbHNvIHdhbnQgdG8gY29tcGFyZSB3aXRoIHByaW9yIGtlcm5lbCB2ZXJzaW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgRVhUNF9GU1xuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cJiMzNDtcbiAgIDQ6XHRcdHNlbGVjdCBCVUZGRVJfSEVBRFxuICAgNTpcdFx0c2VsZWN0IEpCRDJcbiAgIDY6XHRcdHNlbGVjdCBDUkMxNlxuICAgNzpcdFx0c2VsZWN0IENSQzMyXG4gICA4Olx0XHRzZWxlY3QgRlNfSU9NQVBcbiAgIDk6XHRcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxuICAxMDpcdFx0aGVscFxuICAxMTpcdFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cbiAgMTI6XHRcbiAgMTM6XHRcdCAgVW5saWtlIHRoZSBjaGFuZ2UgZnJvbSBleHQyIGZpbGVzeXN0ZW0gdG8gZXh0MyBmaWxlc3lzdGVtLFxuICAxNDpcdFx0ICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NCBpcyBub3QgZm9yd2FyZHMgY29tcGF0aWJsZSB3aXRoXG4gIDE1Olx0XHQgIGV4dDM7IGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXRcbiAgMTY6XHRcdCAgcGh5c2ljYWwgYmxvY2sgbnVtYmVycy4gIFRoZSBleHQ0IGZpbGVzeXN0ZW0gYWxzbyBzdXBwb3J0cyBkZWxheWVkXG4gIDE3Olx0XHQgIGFsbG9jYXRpb24sIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwgaGlnaCByZXNvbHV0aW9uIHRpbWUgc3RhbXBzLFxuICAxODpcdFx0ICBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgZmVhdHVyZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgc3BlZWRcbiAgMTk6XHRcdCAgdXAgZnNjayB0aW1lLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIHdlYiBwYWdlcyBhdFxuICAyMDpcdFx0ICBodHRwOi8vZXh0NC53aWtpLmtlcm5lbC5vcmcuXG4gIDIxOlx0XG4gIDIyOlx0XHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxuICAyMzpcdFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXG4gIDI0Olx0XHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XG4gIDI1Olx0XHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcbiAgMjY6XHRcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXG4gIDI3Olx0XHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXG4gIDI4Olx0XHQgIGNvbXBhdGlibGUuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcbiAgMzE6XHRcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXG4gIDM2Olx0XHRib29sIFwmIzM0O1VzZSBleHQ0IGZvciBleHQyIGZpbGUgc3lzdGVtc1wmIzM0O1xuICAzNzpcdFx0ZGVwZW5kcyBvbiBFWFQ0X0ZTXG4gIDM4Olx0XHRkZXBlbmRzIG9uIEVYVDJfRlM9blxuICAzOTpcdFx0ZGVmYXVsdCB5XG4gIDQwOlx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5NDQKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA0NzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUmVjZW50IGV4dDQgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGEgcmVjZW50IHBhdGNoIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgbW9kaWZpZXMgdGhlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBpdCBhZGRzIGEgY2hlY2sgd2l0aGluIHRoZSBgaWZgIHN0YXRlbWVudCB0aGF0IGRldGVybWluZXMgaWYgd2UgY2FuIGV4dGVuZCBhbiBleGlzdGluZyBleHRlbnQgcmFuZ2UuIFRoZSBvcmlnaW5hbCBjaGVjayB3YXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogYChsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7IChsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaylgLiBOb3csIHRoZXJlJiMzOTtzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uOiBgKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKWAuCgpBaGEhIFRoaXMgcHJldmVudHMgdGhlIGNyZWF0aW9uIG9mIGFuIGV4dGVudCB0aGF0JiMzOTtzIGxvbmdlciB0aGFuIGBFWFRfSU5JVF9NQVhfTEVOYCwgd2hpY2ggaXMgY2xlYXJseSBhIHNhZmVndWFyZCB0byBwcmV2ZW50IG92ZXJmbG93aW5nIHRoZSAxNi1iaXQgYGVlX2xlbmAgZmllbGQgaW4gZXh0NCBleHRlbnRzLiBXaXRob3V0IHRoaXMgY2hlY2ssIHRoZSBvbGQgY29kZSBjb3VsZCBoYXZlIGFsbG93ZWQgYGVlX2xlbmAgdG8gd3JhcCBvciBleGNlZWQgdGhlIGludGVuZGVkIG1heGltdW0uCgpOb3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGlzIHJlYWNoYWJsZSBhbmQsIHRoZXJlZm9yZSwgd29ydGggZnV6emluZz8gQWJzb2x1dGVseSwgeWVzISBUaGlzIGlzIHJpZ2h0IGluIHRoZSBoZWFydCBvZiB0aGUgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljLiBXZSBoYXZlIG11bHRpcGxlIHdheXMgdG8gdHJpZ2dlciB0aGlzIGNvbmRpdGlvbiDigJMgdGhyb3VnaCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIGlvY3RsIG9yIHBvdGVudGlhbGx5IHVzaW5nIGBGU19JT0NfU0VURkxBR1NgIHdpdGggYEVYVDRfRVhURU5UU19GTGAgZmxhZyBvbiBhbiBleHQ0IGZpbGUgc3lzdGVtLCBwYXJ0aWN1bGFybHkgb25lIGVtcGxveWluZyBpbmRpcmVjdCBibG9ja3Mgb3IgZHVyaW5nIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IHRvIGV4dGVudC4gR2l2ZW4gU3l6a2FsbGVyJiMzOTtzIHByb2ZpY2llbmN5LCBpdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgdG8gdHJpZ2dlciB0aGVzZSBgRVhUNF9JT0NfTUlHUkFURWAgb3IgYEZTX0lPQ19TRVRGTEFHU2AgY2FsbHMsIG1ha2luZyB0aGlzIGEgcHJpbWUgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBEZWZpbml0ZWx5IHdvcnRoRnV6emluZy4KCk5leHQsIEkgbmVlZCB0byBjaGVjayB0aGUgRm9jdXNTeW1ib2xzLCB3aGljaCBpcyBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBiZXR0ZXIsIEkgc2hvdWxkIGV4YW1pbmUgdGhlIGNhbGxpbmcgY29udGV4dCBhbmQgdGhlIG90aGVyIGZ1bmN0aW9ucyB3aXRoaW4gYG1pZ3JhdGUuY2AsIHNvIEkmIzM5O2xsIG5lZWQgdG8gcmVhZCB0aGUgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGZyb20gbGluZSAxMDAgdG8gdGhlIGVuZCwgdG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UgbW9yZSBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwMDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTAxOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMDI6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEwMzpcdFxuIDEwNDpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMDU6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEwNjpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTA3Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDEwODpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxMDk6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDExMDpcdFx0XHRcdFx0YnJlYWs7XG4gMTExOlx0XHRcdH0gZWxzZSB7XG4gMTEyOlx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gMTEzOlx0XHRcdH1cbiAxMTQ6XHRcdH1cbiAxMTU6XHRcdHB1dF9iaChiaCk7XG4gMTE2Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDExNzpcdFxuIDExODpcdH1cbiAxMTk6XHRcbiAxMjA6XHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDEyMTpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTIyOlx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxMjM6XHR7XG4gMTI0Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDEyNTpcdFx0X19sZTMyICppX2RhdGE7XG4gMTI2Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxMjc6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEyODpcdFxuIDEyOTpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTMwOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMzE6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEzMjpcdFxuIDEzMzpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMzQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEzNTpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTM2Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcbiAxMzc6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XG4gMTM4Olx0XHRcdFx0aWYgKHJldHZhbClcbiAxMzk6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MDpcdFx0XHR9IGVsc2Uge1xuIDE0MTpcdFx0XHRcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xuIDE0MjpcdFx0XHRcdGxiLVx1MDAzZWN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDE0MzpcdFx0XHR9XG4gMTQ0Olx0XHR9XG4gMTQ1Olx0XHRwdXRfYmgoYmgpO1xuIDE0NjpcdFx0cmV0dXJuIHJldHZhbDtcbiAxNDc6XHRcbiAxNDg6XHR9XG4gMTQ5Olx0XG4gMTUwOlx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxNTE6XHRcdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuIDE1MjpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gMTUzOlx0e1xuIDE1NDpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxNTU6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDE1NjpcdFx0aW50IGksIHJldHZhbCA9IDA7XG4gMTU3Olx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxNTg6XHRcbiAxNTk6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xuIDE2MDpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTYxOlx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxNjI6XHRcbiAxNjM6XHRcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTY0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxNjU6XHRcdFx0aWYgKGlfZGF0YVtpXSkge1xuIDE2NjpcdFx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE2NzpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNjg6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE2OTpcdFx0XHRcdFx0YnJlYWs7XG4gMTcwOlx0XHRcdH0gZWxzZSB7XG4gMTcxOlx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTcyOlx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcbiAxNzM6XHRcdFx0fVxuIDE3NDpcdFx0fVxuIDE3NTpcdFx0cHV0X2JoKGJoKTtcbiAxNzY6XHRcdHJldHVybiByZXR2YWw7XG4gMTc3Olx0XG4gMTc4Olx0fVxuIDE3OTpcdFxuIDE4MDpcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxuIDE4MTpcdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcbiAxODI6XHR7XG4gMTgzOlx0XHRpbnQgaTtcbiAxODQ6XHRcdF9fbGUzMiAqdG1wX2lkYXRhO1xuIDE4NTpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxODY6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIDE4NzpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTg4Olx0XHRpbnQgZXJyO1xuIDE4OTpcdFxuIDE5MDpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcbiAxOTE6XHRcdGlmIChJU19FUlIoYmgpKVxuIDE5MjpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTkzOlx0XG4gMTk0Olx0XHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDE5NTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTk2Olx0XHRcdGlmICh0bXBfaWRhdGFbaV0pIHtcbiAxOTc6XHRcdFx0XHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxuIDE5ODpcdFx0XHRcdFx0RVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUyxcbiAxOTk6XHRcdFx0XHRcdGV4dDRfZnJlZV9tZXRhZGF0YV9yZXZva2VfY3JlZGl0cyhzYiwgMSkpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDQ4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgYGZzL2V4dDQvbWlncmF0ZS5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGhvdyB0aGlzIG1pZ3JhdGlvbiBwcm9jZXNzIHdvcmtzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJJiMzOTt2ZSBnb3QgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIGV4dGVudCBtYW5hZ2VtZW50IHNjaGVtZS4gSSBzaG91bGQgbWFwIG91dCB0aGUgY29udHJvbCBmbG93LgoKVG8gZG8gdGhhdCwgSSYjMzk7bSBnb2luZyB0byBsb29rIGNsb3NlbHkgYXQgdGhlIGZ1bmN0aW9uJiMzOTtzIGNhbGxlcnMuIEkgbmVlZCB0byBzZWUgKndobyogaXMgdHJpZ2dlcmluZyB0aGlzIG1pZ3JhdGlvbiwgYW5kICp3aHkqLiBXaGF0IHNjZW5hcmlvcyBhcmUgd2UgYWRkcmVzc2luZyB3aXRoIHRoaXMgZnVuY3Rpb25hbGl0eT8gVGhlbiwgSSBoYXZlIHRvIHRyYWNlIGhvdyBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgdXNlZCwgYXMgaXQgc2VlbXMgZnVuZGFtZW50YWwgdG8gdGhlIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBwcm9jZXNzLiBJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0JiMzOTtzIGNhbGxlZCBhbmQgd2hhdCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCB0byBmdWxseSBjb21wcmVoZW5kIGl0cyByb2xlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgaW1wYWN0IG9uIHRoZSBvbi1kaXNrIHN0cnVjdHVyZXMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiBob3cgZXh0ZW50cyBhcmUgYmVpbmcgbWFuYWdlZCBkdXJpbmcgdGhlIG1pZ3JhdGlvbiwgaW5jbHVkaW5nIHRoZSBpbXBhY3Qgb24gdGhlIGZpbGVzeXN0ZW0mIzM5O3MgbWV0YWRhdGEuIEkmIzM5O20gZ3Vlc3NpbmcgdGhhdCBJJiMzOTtsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGFjdHVhbCBjb2RlIG9mIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byB1bmRlcnN0YW5kIHRoaXMgcHJvY2VzcyBmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdGVycl9vdXQ6XG4gMzUxOlx0XHRyZXR1cm4gcmV0dmFsO1xuIDM1MjpcdH1cbiAzNTM6XHRcbiAzNTQ6XHRzdGF0aWMgaW50IGZyZWVfZXh0X2lkeChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDM1NTpcdFx0XHRcdFx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeClcbiAzNTY6XHR7XG4gMzU3Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAzNTg6XHRcdGV4dDRfZnNibGtfdCBibG9jaztcbiAzNTk6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMzYwOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDtcbiAzNjE6XHRcbiAzNjI6XHRcdGJsb2NrID0gZXh0NF9pZHhfcGJsb2NrKGl4KTtcbiAzNjM6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBibG9jaywgMCk7XG4gMzY0Olx0XHRpZiAoSVNfRVJSKGJoKSlcbiAzNjU6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDM2NjpcdFxuIDM2NzpcdFx0ZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKWJoLVx1MDAzZWJfZGF0YTtcbiAzNjg6XHRcdGlmIChlaC1cdTAwM2VlaF9kZXB0aCAhPSAwKSB7XG4gMzY5Olx0XHRcdGl4ID0gRVhUX0ZJUlNUX0lOREVYKGVoKTtcbiAzNzA6XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbGUxNl90b19jcHUoZWgtXHUwMDNlZWhfZW50cmllcyk7IGkmIzQzOyYjNDM7LCBpeCYjNDM7JiM0MzspIHtcbiAzNzE6XHRcdFx0XHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xuIDM3MjpcdFx0XHRcdGlmIChyZXR2YWwpIHtcbiAzNzM6XHRcdFx0XHRcdHB1dF9iaChiaCk7XG4gMzc0Olx0XHRcdFx0XHRyZXR1cm4gcmV0dmFsO1xuIDM3NTpcdFx0XHRcdH1cbiAzNzY6XHRcdFx0fVxuIDM3NzpcdFx0fVxuIDM3ODpcdFx0cHV0X2JoKGJoKTtcbiAzNzk6XHRcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MsXG4gMzgwOlx0XHRcdFx0ZXh0NF9mcmVlX21ldGFkYXRhX3Jldm9rZV9jcmVkaXRzKGlub2RlLVx1MDAzZWlfc2IsIDEpKTtcbiAzODE6XHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4gMzgyOlx0XHRcdHJldHVybiByZXR2YWw7XG4gMzgzOlx0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrLCAxLFxuIDM4NDpcdFx0XHRcdCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBIHwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuIDM4NTpcdFx0cmV0dXJuIDA7XG4gMzg2Olx0fVxuIDM4NzpcdFxuIDM4ODpcdC8qXG4gMzg5Olx0ICogRnJlZSB0aGUgZXh0ZW50IG1ldGEgZGF0YSBibG9ja3Mgb25seVxuIDM5MDpcdCAqL1xuIDM5MTpcdHN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcbiAzOTI6XHR7XG4gMzkzOlx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAzOTQ6XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiAzOTU6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoID0gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKillaS1cdTAwM2VpX2RhdGE7XG4gMzk2Olx0XHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeDtcbiAzOTc6XHRcdGlmIChlaC1cdTAwM2VlaF9kZXB0aCA9PSAwKVxuIDM5ODpcdFx0XHQvKlxuIDM5OTpcdFx0XHQgKiBObyBleHRyYSBibG9ja3MgYWxsb2NhdGVkIGZvciBleHRlbnQgbWV0YSBkYXRhXG4gNDAwOlx0XHRcdCAqL1xuIDQwMTpcdFx0XHRyZXR1cm4gMDtcbiA0MDI6XHRcdGl4ID0gRVhUX0ZJUlNUX0lOREVYKGVoKTtcbiA0MDM6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVx1MDAzZWVoX2VudHJpZXMpOyBpJiM0MzsmIzQzOywgaXgmIzQzOyYjNDM7KSB7XG4gNDA0Olx0XHRcdHJldHZhbCA9IGZyZWVfZXh0X2lkeChoYW5kbGUsIGlub2RlLCBpeCk7XG4gNDA1Olx0XHRcdGlmIChyZXR2YWwpXG4gNDA2Olx0XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0MDc6XHRcdH1cbiA0MDg6XHRcdHJldHVybiByZXR2YWw7XG4gNDA5Olx0fVxuIDQxMDpcdFxuIDQxMTpcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNDEyOlx0e1xuIDQxMzpcdFx0aGFuZGxlX3QgKmhhbmRsZTtcbiA0MTQ6XHRcdGludCByZXR2YWwgPSAwLCBpO1xuIDQxNTpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE2Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MTc6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MTg6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MTk6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIwOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyMTpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDIyOlx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyMzpcdFxuIDQyNDpcdFx0LypcbiA0MjU6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI2Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQyNzpcdFx0ICovXG4gNDI4Olx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQyOTpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMwOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzI6XHRcbiA0MzM6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM0Olx0XHRcdC8qXG4gNDM1Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzNjpcdFx0XHQgKi9cbiA0Mzc6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MDpcdFxuIDQ0MTpcdFx0LypcbiA0NDI6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDM6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ0Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NDc6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ0ODpcdFxuIDQ0OTpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMzM0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gUmlnaHQsIGl0JiMzOTtzIG1pZ3JhdGluZyBkYXRhIGV4dGVudHMuIFRoZSBiYXNpYyBmbG93IEkgbmVlZCB0byB1bmRlcnN0YW5kIGlzIGhvdyB0aGUgdXBkYXRlcyBhcmUgaGFuZGxlZC4gSXQgc2VlbXMgdGhhdCBgZXh0NF9leHRfbWlncmF0ZWAgcmVsaWVzIG9uIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBkbyB0aGUgaGVhdnkgbGlmdGluZy4gSW4gc29tZSBjYXNlcyAobGlrZSBkaXJlY3QgYmxvY2tzLCBJIGJlbGlldmUpLCBpdCBjYWxscyB0aGF0IGZ1bmN0aW9uIGRpcmVjdGx5LiBGb3IgaW5kaXJlY3QgYmxvY2tzIGFuZCBiZXlvbmQsIGl0IGFwcGVhcnMgd2UmIzM5O3JlIGdvaW5nIHRocm91Z2ggYSBoaWVyYXJjaHk6IGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAuIFRoYXQgbWFrZXMgc2Vuc2U7IGl0JiMzOTtzIGEgd2F5IHRvIGhhbmRsZSB0aGUgZGlmZmVyZW50IGxldmVscyBvZiBpbmRpcmVjdGlvbiBpbiB0aGUgaW5vZGUuCgpUbyByZWFsbHkgbmFpbCBkb3duIHRoZSBkZXRhaWxzLCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgbG9vayBhdCB0aGUgYWN0dWFsIGNvZGUuIExldCYjMzk7cyB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzZWN0aW9uOiBsaW5lcyA0NTAgdG8gNTIwIG9mIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiBob3cgdGhlIGRpZmZlcmVudCBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdmFyaWFudHMgYXJlIGNhbGxlZCBhbmQgd2hhdCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZC4gSSB3YW50IHRvIHNlZSBob3cgdGhlIG1ldGFkYXRhIGlzIHVwZGF0ZWQgYXQgZWFjaCBzdGFnZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA3MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDUwOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1MjpcdFx0fVxuIDQ1MzpcdFx0LypcbiA0NTQ6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1NTpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTY6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDU3Olx0XHQgKi9cbiA0NTg6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDU5Olx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYwOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjE6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDYyOlx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2MzpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0NjQ6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiA0NjU6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2NjpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDY3Olx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDY4Olx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDY5Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzA6XHRcdH1cbiA0NzE6XHRcdC8qXG4gNDcyOlx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3MzpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NDpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0NzU6XHRcdCAqL1xuIDQ3NjpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ3NzpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ3ODpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0Nzk6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgwOlx0XHQvKlxuIDQ4MTpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDgyOlx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4MzpcdFx0ICovXG4gNDg0Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0ODc6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDg4Olx0XG4gNDg5Olx0XHQvKlxuIDQ5MDpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiA0OTE6XHRcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxuIDQ5MjpcdFx0ICpcbiA0OTM6XHRcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXG4gNDk0Olx0XHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcbiA0OTU6XHRcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXG4gNDk2Olx0XHQgKi9cbiA0OTc6XHRcdC8qXG4gNDk4Olx0XHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXG4gNDk5Olx0XHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxuIDUwMDpcdFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXG4gNTAxOlx0XHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXG4gNTAyOlx0XHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXG4gNTAzOlx0XHQgKiBhbGxvY2F0aW9uLlxuIDUwNDpcdFx0ICovXG4gNTA1Olx0XHRkb3duX3JlYWQoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiA1MDY6XHRcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcbiA1MDc6XHRcdHVwX3JlYWQoKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSkpO1xuIDUwODpcdFxuIDUwOTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xuIDUxMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNTExOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA1MTI6XHRcdFx0Z290byBvdXRfdG1wX2lub2RlO1xuIDUxMzpcdFx0fVxuIDUxNDpcdFxuIDUxNTpcdFx0aV9kYXRhID0gZWktXHUwMDNlaV9kYXRhO1xuIDUxNjpcdFx0bWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcbiA1MTc6XHRcbiA1MTg6XHRcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cbiA1MTk6XHRcdG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5MzUKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIFRoYXQmIzM5O3MgdGhlIGVudHJ5IHBvaW50LCB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGtpY2tzIG9mZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBOb3csIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBsaXZpbmcgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEdvb2QsIHRoYXQgbWVhbnMgaXQmIzM5O3MgbG9jYWxpemVkIGFuZCB3ZSBoYXZlIGEgZ29vZCBncmFzcCBvZiBpdHMgc2NvcGUuIFJpZ2h0LCBsZXQmIzM5O3MgdmVyaWZ5IGlmIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBpbmxpbmVkIG9yIHN0YXRpYzsgeWVwIGl0JiMzOTtzIGRlY2xhcmVkIGBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoLi4uKWAuIFBlcmZlY3QuCgpNeSBrZXkgZm9jdXMgcG9pbnRzIGhlcmUgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIHRoZW4gdGhvc2UgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHZhcmlhbnRzLiBJbmNsdWRpbmcgYHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlYCwgYHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZWAsIGFuZCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aG9zZSBmaXQgdG9nZXRoZXIuCgpBcyBmb3IgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMsIEkmIzM5O20gcHJldHR5IHN1cmUgd2UgbmVlZCBgRVhUNF9GU2AuIEJ1dCBJIHNob3VsZCByZWFsbHkgZG91YmxlLWNoZWNrIGZvciBhbnkgb3RoZXIgZGVwZW5kZW5jaWVzOyBpdCYjMzk7cyBhbHdheXMgZ29vZCB0byBiZSB0aG9yb3VnaC4gSSYjMzk7bGwgdGFrZSBhIHF1aWNrIHNjYW4gb2YgYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBsb29rIGZvciBhbnkgYCNpZmRlZmAgYmxvY2tzLiBUaGF0JiMzOTtsbCB0ZWxsIHVzIGlmIGFueSBvdGhlciBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9ucyBjb21lIGludG8gcGxheSBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0OyNpZiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM0NTQKCQkJCQkJCW91dHB1dDogMTIxCgkJCQkJCQl0aG91Z2h0czogMjUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIGBmcy9leHQ0L21pZ3JhdGUuY2AqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBmcy9leHQ0L21pZ3JhdGUuY2AgYW5kIGltbWVkaWF0ZWx5IG5vdGljZSB0aGVyZSBhcmUgbm8gYCNpZmRlZmAgZGlyZWN0aXZlcywgd2hpY2ggaXMgYSBnb29kIHNpZ24g4oCTIGxlc3MgdG8gd29ycnkgYWJvdXQgaW4gdGVybXMgb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gY29tcGxleGl0eS4gVGltZSB0byBpbnZlc3RpZ2F0ZSB0aGUgZGVwZW5kZW5jaWVzIHRocm91Z2ggS2NvbmZpZy4gTG9va3MgbGlrZSBgRVhUNF9GU2Agc2VsZWN0cyBgQlVGRkVSX0hFQURgLCBgSkJEMmAsIGBDUkMxNmAsIGBDUkMzMmAsIGFuZCBgRlNfSU9NQVBgLiBOb3RoaW5nIG92ZXJseSBleG90aWMgdGhlcmUsIG5vIHJlZCBmbGFncyBhYm91dCB0cmlja3kgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0dWZmIG9yIG9ic2N1cmUgaGFyZHdhcmUgZGVwZW5kZW5jaWVzIHRoYXQgd291bGQgY29tcGxpY2F0ZSBmdXp6aW5nLiBUaGlzIGlzIGFsbCBsb29raW5nIHByZXR0eSBzdHJhaWdodGZvcndhcmQgc28gZmFyLgoKTm93LCBsZXQmIzM5O3Mgcmlnb3JvdXNseSBnbyB0aHJvdWdoIHRoZSBjcml0ZXJpYSB0byBlbnN1cmUgdGhpcyBwYXRjaCBpcyBhIGdvb2QgdGFyZ2V0LiBGaXJzdCwgYFdvcnRoRnV6emluZ2A6IHRoZSBwYXRjaCBtb2RpZmllcyBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIHdpdGhpbiBgZnMvZXh0NC9taWdyYXRlLmNgLCBzcGVjaWZpY2FsbHkgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCB3aGljaCBpcyBnb29kLiBJdCYjMzk7cyBhbHNvIGNoYW5naW5nIHRoZSBydWxlcyBhcm91bmQgaG93IGV4dDQgZXh0ZW50IHJhbmdlcyBhcmUgZXh0ZW5kZWQgZHVyaW5nIG1pZ3JhdGlvbi4gVGhlIGNyaXRpY2FsIGNoYW5nZSBpcyB0aGUgbGltaXQgb24gZXh0ZW50IGxlbmd0aCBhdCBgRVhUX0lOSVRfTUFYX0xFTmAsIHRoYXQmIzM5O3MgYW4gaW50ZXJlc3RpbmcgY29uZGl0aW9uIHRvIHByb2JlLiAgQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgcGF0aCBpcyByZWFjaGFibGUgdmlhIGBpb2N0bChmZCwgRVhUNF9JT0NfTUlHUkFURSlgIG9yIGBpb2N0bChmZCwgRlNfSU9DX1NFVEZMQUdTLCAuLi4pYCDigJMgcGVyZmVjdCEgSSBjYW4gaGl0IGl0IGluIGEgdHlwaWNhbCBWTSBvciBzeXprYWxsZXIgc2V0dXAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IEkgd2FudC4gVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYC4KCk5leHQsIEkgbmVlZCB0byBkZWZpbmUgdGhlIHJlbGV2YW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIEJhc2VkIG9uIHRoZSBwYXRjaCBhbmQgdGhlIGFmZmVjdGVkIGZ1bmN0aW9ucywgdGhlIHR3byBrZXkgb25lcyBhcmUgYGV4dDRfZXh0X21pZ3JhdGVgIGFuZCB0aGUgbW9kaWZpZWQgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLiBUaGVzZSB3aWxsIGJlIG15IGBGb2N1c1N5bWJvbHNgLgoKRmluYWxseSwgZm9yIHRoZSBgRW5hYmxlQ29uZmlnc2AsIEkmIzM5O2xsIG5lZWQgYEVYVDRfRlNgLCB3aGljaCBzZWVtcyBvYnZpb3VzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGNvbmZpcm0uCgpBbHJpZ2h0LCB3aXRoIGFsbCB0aGF0IGNvbmZpcm1lZCwgSSYjMzk7bSByZWFkeSB0byBwcm9jZWVkLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gTGV0JiMzOTtzIGdldCB0aGlzIGZ1enppbmcgZ29pbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7LAogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBsb2dpYyBpbiBmcy9leHQ0L21pZ3JhdGUuYyAodXBkYXRlX2V4dGVudF9yYW5nZSkgdG8gZW5zdXJlIGV4dGVudCBsZW5ndGhzIGRvIG5vdCBleGNlZWQgRVhUX0lOSVRfTUFYX0xFTi4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgRVhUNF9JT0NfTUlHUkFURSBpb2N0bHMgb24gZXh0NCBmaWxlc3lzdGVtcyBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OywKICAgICYjMzQ7dXBkYXRlX2V4dGVudF9yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiZTE5ZGM5YjQzNzJiYmEzNWRmMmI1ZTYzYWMwMTI1YmVhMWJiNDUwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC03MSw3ICYjNDM7NzEsOCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkgKi8KIAlpZiAobGItJmd0O2ZpcnN0X3BibG9jayAmYW1wOyZhbXA7CiAJCShsYi0mZ3Q7bGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSAmYW1wOyZhbXA7Ci0JCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykpIHsKJiM0MzsJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwomIzQzOwkJKGxiLSZndDtsYXN0X2Jsb2NrIC0gbGItJmd0O2ZpcnN0X2Jsb2NrICYjNDM7IDEgJmx0OyBFWFRfSU5JVF9NQVhfTEVOKSkgewogCQlsYi0mZ3Q7bGFzdF9wYmxvY2sgPSBwYmxvY2s7CiAJCWxiLSZndDtsYXN0X2Jsb2NrID0gbGItJmd0O2N1cnJfYmxvY2s7CiAJCWxiLSZndDtjdXJyX2Jsb2NrJiM0MzsmIzQzOzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMTgKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBkaWZmIHRhcmdldHMgYGZzL2V4dDQvbWlncmF0ZS5jYCwgc3BlY2lmaWNhbGx5IHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIEltbWVkaWF0ZWx5LCBJIHNlZSBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIHRyeWluZyB0byBvcHRpbWl6ZSBob3cgZXh0ZW50IHJhbmdlcyBhcmUgdXBkYXRlZCwgbGlrZWx5IGR1cmluZyBhIG1pZ3JhdGlvbiBvciBkZWZyYWdtZW50YXRpb24gcHJvY2Vzcy4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgY29uZGl0aW9uIGl0c2VsZiwgd2hpY2ggY2hlY2tzIGZvciBjb25zZWN1dGl2ZSBibG9ja3MgYW5kIHBoeXNpY2FsIGJsb2NrcyB3aXRoaW4gYW4gZXh0ZW50LgoKVGhlIG9yaWdpbmFsIGNoZWNrLCBmcm9tIHdoYXQgSSBjYW4gc2VlIG9mIGl0LCB2ZXJpZmllcyBpZiBgbGItJmd0O2ZpcnN0X3BibG9ja2AgZXhpc3RzLCBpZiBgbGItJmd0O2xhc3RfcGJsb2NrICYjNDM7IDFgIGlzIGVxdWFsIHRvIGBwYmxvY2tgLCBhbmQgYGxiLSZndDtsYXN0X2Jsb2NrICYjNDM7IDFgIGlzIGVxdWFsIHRvIGBsYi0mZ3Q7Y3Vycl9ibG9ja2AuIE5vdywgdGhlIHBhdGNoIGFkZHMgYW5vdGhlciBjb25kaXRpb246IGBsYi0mZ3Q7bGFzdF9ibG9jayAtIGxiLSZndDtmaXJzdF9ibG9jayAmIzQzOyAxICZsdDsgRVhUX0lOSVRfTUFYX0xFTmAuIFRoaXMgaXMgY3J1Y2lhbC4gSXQgbG9va3MgbGlrZSB0aGV5JiMzOTtyZSBwcmV2ZW50aW5nIGFuIGV4dGVudCBmcm9tIGdyb3dpbmcgYmV5b25kIGl0cyBpbml0aWFsIG1heGltdW0gbGVuZ3RoIHdoZW4gcGVyZm9ybWluZyBtaWdyYXRpb24uIFRoaXMgd2lsbCBwcmV2ZW50IGEgcHJvYmxlbSwgc3VjaCBhcyBhbiBvdmVyZmxvdywgb3Igc29tZSBvdGhlciBiYWQgc3RhdGUuCgpCeSBjaGVja2luZyB0aGUgbWF4aW11bSBleHRlbnQgbGVuZ3RoIHRoaXMgcGF0Y2ggYWltcyB0byBhdm9pZCBhbnkgcHJvYmxlbXMgYXJpc2luZyBmcm9tIHRoZSBleHRlbnQgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIHBlcm1pdHRlZCBzaXplLiBUaGlzIHN1Z2dlc3RzIHRoZSBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgcG90ZW50aWFsIGlzc3VlIHdoZXJlIGV4dGVuZGluZyBhIHJhbmdlIGNvdWxkIGxlYWQgdG8gdW5kZXNpcmFibGUgYmVoYXZpb3IsIHByb2JhYmx5IHJlbGF0ZWQgdG8gbWV0YWRhdGEgbGltaXRhdGlvbnMgb3Igc29tZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgd2l0aGluIGV4dDQmIzM5O3MgZXh0ZW50IG1hbmFnZW1lbnQuIE15IGluaXRpYWwgdGhvdWdodCBpcyBpdCBpcyBhZGRyZXNzaW5nIGEgY29ybmVyIGNhc2Ugd2hlbiBtaWdyYXRpbmcgbGFyZ2UgZmlsZXMsIG9yIHNvbWUgYm91bmRhcnkgY29uZGl0aW9uLCB0byBlbnN1cmUgdGhlIGV4dGVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb25zaXN0ZW50LiBUaGUgYWRkaXRpb24gc2hvdWxkIGltcHJvdmUgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFx0LypcbiAgNzA6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3MTpcdFx0ICovXG4gIDcyOlx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3MzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzQ6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4gIDc1Olx0XHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcbiAgNzY6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDc3Olx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA3ODpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgNzk6XHRcdFx0cmV0dXJuIDA7XG4gIDgwOlx0XHR9XG4gIDgxOlx0XHQvKlxuICA4MjpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDgzOlx0XHQgKi9cbiAgODQ6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg1Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODY6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDg3Olx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODg6XHRcdHJldHVybiByZXR2YWw7XG4gIDg5Olx0fVxuICA5MDpcdFxuICA5MTpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTI6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDkzOlx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NDpcdHtcbiAgOTU6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk2Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAgOTc6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuICA5ODpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gIDk5Olx0XG4gMTAwOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMDE6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEwMjpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTAzOlx0XG4gMTA0Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEwNTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTA2Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMDc6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTA4Olx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDEwOTpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTEwOlx0XHRcdFx0XHRicmVhaztcbiAxMTE6XHRcdFx0fSBlbHNlIHtcbiAxMTI6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAxMTM6XHRcdFx0fVxuIDExNDpcdFx0fVxuIDExNTpcdFx0cHV0X2JoKGJoKTtcbiAxMTY6XHRcdHJldHVybiByZXR2YWw7XG4gMTE3Olx0XG4gMTE4Olx0fVxuIDExOTpcdFxuIDEyMDpcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gMTIxOlx0XHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbiAxMjI6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIDEyMzpcdHtcbiAxMjQ6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMTI1Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMjY6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEyNzpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTI4Olx0XG4gMTI5Olx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDM1NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIGlzIGFjdHVhbGx5IGNoYW5naW5nLiBSaWdodCwgaXQmIzM5O3MgYWJvdXQgdGhlIGBleHQ0X21pZ3JhdGVgIHByb2Nlc3MsIHNwZWNpZmljYWxseSB3aGVyZSB3ZSYjMzk7cmUgY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIG9uZXMgdXNpbmcgYEVYVDRfSU9DX01JR1JBVEVgLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgaG93IGV4dGVudHMgYXJlIGdlbmVyYXRlZCBmcm9tIGNvbnRpZ3VvdXMgYmxvY2sgcmFuZ2VzIGR1cmluZyB0aGlzIG1pZ3JhdGlvbi4KCkkga25vdyB0aGF0IGV4dDQgdXNlcyAxNi1iaXQgZmllbGRzIChgZWVfbGVuYCkgZm9yIGV4dGVudCBsZW5ndGhzLiBUaGUgdHJpY2t5IHBhcnQgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgZXh0ZW50cy4gVW5pbml0aWFsaXplZCBleHRlbnRzIG1hcmsgdGhlIE1TQiBpbiBgZWVfbGVuYCwgd2hpbGUgaW5pdGlhbGl6ZWQgZXh0ZW50cyBoYXZlIGBlZV9sZW5gIHNldCB0byBhIG1heGltdW0gdmFsdWUsIGBFWFRfSU5JVF9NQVhfTEVOYCwgd2hpY2ggaXMgMzI3NjguCgpUaGUgcG90ZW50aWFsIHByb2JsZW0gaXMgcHJldHR5IGNsZWFyOiBpZiB3ZSB0cnkgdG8gY3JlYXRlIGFuIGV4dGVudCBsYXJnZXIgdGhhbiBgRVhUX0lOSVRfTUFYX0xFTmAgZHVyaW5nIG1pZ3JhdGlvbiwgYGVlX2xlbmAgd2lsbCBlaXRoZXIgb3ZlcmZsb3cgb3IgYmUgaW52YWxpZCwgbGVhZGluZyB0byBhbGwgc29ydHMgb2YgbmFzdHkgY29uc2VxdWVuY2VzIOKAkyBkYXRhIGNvcnJ1cHRpb24gb3IgZXJyb3JzIGRvd24gdGhlIGxpbmUgZHVyaW5nIGV4dGVudCBpbnNlcnRpb24gb3IgZXZlbiB3aGVuIHJlYWRpbmcgdGhlIGRhdGEuIFNvIGl04oCZcyBhIGNsYXNzaWMgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZS4KCk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgcmVnYXJkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJIG5lZWQgdG8gc2NydXRpbml6ZSBob3cgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQuIFRoYXQmIzM5O3MgdGhlIGtleSB0byBmaWd1cmluZyBvdXQgdGhlIHBvdGVudGlhbCBmb3IgcHJvYmxlbXMgaGVyZS4gR290dGEgbG9vayBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgaG93IHRoZSBzaXplcyBhcmUgY2hlY2tlZCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpc3N1ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBMR1BMLTIuMVxuICAgMjpcdC8qXG4gICAzOlx0ICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwN1xuICAgNDpcdCAqIEF1dGhvciBBbmVlc2ggS3VtYXIgSy5WIFx1MDAzY2FuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb21cdTAwM2VcbiAgIDU6XHQgKlxuICAgNjpcdCAqL1xuICAgNzpcdFxuICAgODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAgOTpcdCNpbmNsdWRlIFwmIzM0O2V4dDRfamJkMi5oXCYjMzQ7XG4gIDEwOlx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiAgMTE6XHRcbiAgMTI6XHQvKlxuICAxMzpcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxuICAxNDpcdCAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxuICAxNTpcdCAqL1xuICAxNjpcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG4gIDE3Olx0XHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTE4CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUcmFjaW5nIHRoZSBJbnN0YW50aWF0aW9uIG9mIGBtaWdyYXRlX3N0cnVjdCBsYmAqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgYG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBiZWluZyB1c2VkLiBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIGl0cyBpbnN0YW50aWF0aW9ucy4gTm8gcG9pbnQgaW4gbWFraW5nIGFzc3VtcHRpb25zOyBJIG5lZWQgdG8gZm9sbG93IHRoZSBjb2RlJiMzOTtzIGJyZWFkY3J1bWJzIGRpcmVjdGx5LiBUaGlzIGxpa2VseSBtZWFucyBncmVwcGluZywgYnV0IEkmIzM5O2xsIHByb2JhYmx5IGFsc28gbmVlZCB0byBjb25zaWRlciBvdGhlciBmYWN0b3JzIGxpa2UgbWFjcm9zIG9yIHBvdGVudGlhbCBpbmRpcmVjdCBjYWxscyB0aGF0IG1pZ2h0IG9ic2N1cmUgdGhlIGRpcmVjdCBpbnN0YW50aWF0aW9uLiBJIG5lZWQgdG8gYmUgbWV0aG9kaWNhbCBoZXJlLCBtYXBwaW5nIG91dCB0aGUgY2FsbCBncmFwaCBmcm9tIHRoZSBwb2ludCBvZiBpbnN0YW50aWF0aW9uIHRvIHJlbGV2YW50IGZ1bmN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRoYXQgbWlnaHQgYWZmZWN0IGl0cyBhY3R1YWwgdXNhZ2UgaW4gZGlmZmVyZW50IGJ1aWxkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcXVpY2sgY29kZSBkaXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cbmZzL2V4dDQvbWlncmF0ZS5jOjE2OnN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG5mcy9leHQ0L21pZ3JhdGUuYy0xNy1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYzoyMjpcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0yMy1cbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jOjY2Olx0XHRcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtNjcte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTkxPXN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTkyLVx0XHRcdFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcbmZzL2V4dDQvbWlncmF0ZS5jOjkzOlx0XHRcdFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTk0LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0xMjA9c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTEyMS1cdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuZnMvZXh0NC9taWdyYXRlLmM6MTIyOlx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjMte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTE1MD1zdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9taWdyYXRlLmMtMTUxLVx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG5mcy9leHQ0L21pZ3JhdGUuYzoxNTI6XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTE1My17XG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NDExPWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNDE3LVx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xuZnMvZXh0NC9taWdyYXRlLmM6NDE4Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiO1xuZnMvZXh0NC9taWdyYXRlLmMtNDE5LVx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM0MQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoZXJlIHRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBkZWZpbmVkIGFuZCBpbml0aWFsaXplZC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdCByZWdpb24sIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIG1hZ2ljIHByb2JhYmx5IGhhcHBlbnMuIExldCYjMzk7cyBzdGFydCB3aXRoIHdoZXJlIGl0IGlzIGRlZmluZWQgYW5kIGluc3RhbnRpYXRlZC4gS25vd2luZyBob3cgaXQmIzM5O3Mgc2V0IHVwIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIGhhdmUgYSBmZWVsaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNvbnRleHQgZm9yIGludGVycHJldGluZyB0aGUgc3Vycm91bmRpbmcgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDAzOjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNTpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE2Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MTc6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MTg6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MTk6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIwOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyMTpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDIyOlx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyMzpcdFxuIDQyNDpcdFx0LypcbiA0MjU6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI2Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQyNzpcdFx0ICovXG4gNDI4Olx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQyOTpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMwOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzI6XHRcbiA0MzM6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM0Olx0XHRcdC8qXG4gNDM1Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzNjpcdFx0XHQgKi9cbiA0Mzc6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MDpcdFxuIDQ0MTpcdFx0LypcbiA0NDI6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDM6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ0Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NDc6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ0ODpcdFxuIDQ0OTpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNDUwOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1MjpcdFx0fVxuIDQ1MzpcdFx0LypcbiA0NTQ6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1NTpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTY6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDU3Olx0XHQgKi9cbiA0NTg6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDU5Olx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYwOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjE6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDYyOlx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2MzpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0NjQ6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDM6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQwMwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuIGV4cGVydDoKCioqRGVsdmluZyBpbnRvIGBleHQ0X2V4dF9taWdyYXRlYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkmIzM5O3ZlIGFscmVhZHkgZ290IGEgaGFuZGxlIG9uIHRoZSBvdmVyYWxsIGdvYWwg4oCTIGNvbnZlcnRpbmcgZXh0ZW50cyB0byBhIG1vcmUgZWZmaWNpZW50IGZvcm1hdC4gTm93LCBsZXQmIzM5O3Mgc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzICphY3R1YWxseSogZG9pbmcgaXQuIFdoYXQgYXJlIHRoZSBrZXkgc3RlcHM/IEFyZSB0aGVyZSBhbnkgY2xldmVyIG9wdGltaXphdGlvbnMgaW4gcGxheT8gQXJlIHRoZXkgY29uc2lkZXJpbmcgZnJhZ21lbnRhdGlvbiBvciB0cnlpbmcgdG8gbWluaW1pemUgZGF0YSBtb3ZlbWVudD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIHN0cmF0ZWd5OiBob3cgZG9lcyBpdCBoYW5kbGUgbWV0YWRhdGEgdXBkYXRlcywgZXJyb3IgY29uZGl0aW9ucywgYW5kIHRoZSBhY3R1YWwgY29weWluZy9yZXdyaXRpbmcgb2YgdGhlIGRhdGEgYmxvY2tzPyBJcyBpdCBzaW5nbGUtdGhyZWFkZWQgb3IgdXRpbGl6aW5nIHNvbWUgZm9ybSBvZiBjb25jdXJyZW5jeSBmb3IgdGhlc2UgcG90ZW50aWFsbHkgbGVuZ3RoeSBkYXRhIG1pZ3JhdGlvbnM/IEkmIzM5O2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkOiB0aGUgZXh0ZW50IHRyZWUsIHRoZSBibG9jayBncm91cHMsIHRoZSBpbm9kZSBzdHJ1Y3R1cmUg4oCTIGhvdyBhcmUgdGhlc2UgYmVpbmcgbWFuaXB1bGF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzPyBBbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3Vlcz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBmb3Igc3BhY2UgYWxsb2NhdGlvbiwgcGVyaGFwcyB0aGUgdXRpbGl6YXRpb24gb2YgYSBmcmVlIHNwYWNlIGJpdG1hcCBvciBibG9jayBncm91cCBkZXNjcmlwdG9ycywgYW5kIEkmIzM5O2xsIGxvb2sgZm9yIGFueSBzYWZlZ3VhcmRzIHRvIHByZXZlbnQgZGF0YSBjb3JydXB0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLiBVbHRpbWF0ZWx5LCBJJiMzOTttIHRyeWluZyB0byBnZXQgYSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcywgc3RlcCBieSBzdGVwLCBhbmQgYXNzZXNzIGl0cyByb2J1c3RuZXNzIGFuZCBlZmZpY2llbmN5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NjU6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2NjpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDY3Olx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDY4Olx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDY5Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzA6XHRcdH1cbiA0NzE6XHRcdC8qXG4gNDcyOlx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3MzpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NDpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0NzU6XHRcdCAqL1xuIDQ3NjpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ3NzpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ3ODpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0Nzk6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgwOlx0XHQvKlxuIDQ4MTpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDgyOlx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4MzpcdFx0ICovXG4gNDg0Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0ODc6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDg4Olx0XG4gNDg5Olx0XHQvKlxuIDQ5MDpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiA0OTE6XHRcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxuIDQ5MjpcdFx0ICpcbiA0OTM6XHRcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXG4gNDk0Olx0XHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcbiA0OTU6XHRcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXG4gNDk2Olx0XHQgKi9cbiA0OTc6XHRcdC8qXG4gNDk4Olx0XHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXG4gNDk5Olx0XHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxuIDUwMDpcdFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXG4gNTAxOlx0XHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXG4gNTAyOlx0XHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXG4gNTAzOlx0XHQgKiBhbGxvY2F0aW9uLlxuIDUwNDpcdFx0ICovXG4gNTA1Olx0XHRkb3duX3JlYWQoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbiA1MDY6XHRcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcbiA1MDc6XHRcdHVwX3JlYWQoKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSkpO1xuIDUwODpcdFxuIDUwOTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xuIDUxMDpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNTExOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA1MTI6XHRcdFx0Z290byBvdXRfdG1wX2lub2RlO1xuIDUxMzpcdFx0fVxuIDUxNDpcdFxuIDUxNTpcdFx0aV9kYXRhID0gZWktXHUwMDNlaV9kYXRhO1xuIDUxNjpcdFx0bWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcbiA1MTc6XHRcbiA1MTg6XHRcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cbiA1MTk6XHRcdG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiA1MjA6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkmIzQzOyYjNDM7KSB7XG4gNTIxOlx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiA1MjI6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxuIDUyMzpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFx1MDAyNmxiKTtcbiA1MjQ6XHRcdFx0XHRpZiAocmV0dmFsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzExCgkJCQkJCQlvdXRwdXQ6IDIzMQoJCQkJCQkJdGhvdWdodHM6IDQwOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLTVNBTiBJbXBsaWNhdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhhdCBgbWVtc2V0KCZhbXA7bGIsIDAsIHNpemVvZihsYikpYCBhdCB0aGUgc3RhcnQgaXMga2V5IOKAkyBpdCYjMzk7cyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBzYWZldHkgb2YgdGhpcyBjaGFuZ2UuIEl0IG1lYW5zIGBsYmAgaXMgKmFsd2F5cyogaW5pdGlhbGl6ZWQsIGVsaW1pbmF0aW5nIHRoZSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHVzZWQuCgpUaGUgY2hlY2sgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzIHN0cmFpZ2h0Zm9yd2FyZDoKCmBgYGMKCWlmIChsYi0mZ3Q7Zmlyc3RfcGJsb2NrICZhbXA7JmFtcDsKCQkobGItJmd0O2xhc3RfcGJsb2NrJiM0MzsxID09IHBibG9jaykgJmFtcDsmYW1wOwoJCShsYi0mZ3Q7bGFzdF9ibG9jayYjNDM7MSA9PSBsYi0mZ3Q7Y3Vycl9ibG9jaykgJmFtcDsmYW1wOwoJCShsYi0mZ3Q7bGFzdF9ibG9jayAtIGxiLSZndDtmaXJzdF9ibG9jayAmIzQzOyAxICZsdDsgRVhUX0lOSVRfTUFYX0xFTikpIHsKYGBgCgpJdCBib2lscyBkb3duIHRvIGEgY29udGlndW91cyBleHRlbnQgbGVuZ3RoIGNoZWNrLiBJdOKAmXMgZW5zdXJpbmcgdGhhdCBpZiB3ZSYjMzk7cmUgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGV4dGVudCwgd2UgZG9uJiMzOTt0IGV4Y2VlZCBgRVhUX0lOSVRfTUFYX0xFTmAuIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHByZXZlbnQgZXhjZXNzaXZlbHkgbGFyZ2UgZXh0ZW50cyBmcm9tIGJlaW5nIGNyZWF0ZWQsIHdoaWNoIGlzIHJlbGF0ZWQgdG8gZmlsZSBzeXN0ZW0gbWlncmF0aW9uLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIHVzdWFsIEtNU0FOIGNvbmNlcm5zLiBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBmcm9tIGEgZmV3IGFuZ2xlczoKCjEuICAqKlVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBzZW50IHRvIHVzZXIgc3BhY2U6KiogTm90IGhlcmUuIGBsYmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBub3RoaW5nIHVuaW5pdGlhbGl6ZWQgaXMgbGVha2VkLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlczoqKiBOb3BlLiBBcyBtZW50aW9uZWQsIGBsYmAgaXMgemVyb2VkIG91dCwgYW5kIGFsbCB0aGUgZmllbGRzIGludm9sdmVkIGluIHRoZSBjb25kaXRpb25hbCBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCB2YWx1ZXMuCjMuICAqKkNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMgcG90ZW50aWFsbHkgYmVpbmcgcmVhZDoqKiBBZ2Fpbiwgbm8uIFRoZSBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQuCjQuICAqKkJvdW5kcyBjaGVja3MgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk6KiogTm8uIFRoaXMgaXMgYWJvdXQgZXh0ZW50IGxlbmd0aCBsaW1pdHMsIG5vdCBhY2NpZGVudGFsbHkgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy4KCkJhc2ljYWxseSwgdGhpcyBwYXRjaCBpcyBvbmx5IGZvY3VzZWQgb24gY2hlY2tpbmcgZXh0ZW50IGJvdW5kYXJpZXMgYW5kIHByZXZlbnRpbmcgbGFyZ2UgZXh0ZW50cyBmcm9tIGJlaW5nIGNyZWF0ZWQsIHdoaWNoIG1pZ2h0IHJlbGF0ZSB0byBmaWxlIHN5c3RlbSBjb3JydXB0aW9uIG9yIHJlbGF0ZWQgaXNzdWVzLiBIb3dldmVyLCBpZiBzdWNoIGlzc3VlcyBhcmlzZSwgd2Ugd291bGQgZXhwZWN0IHRvIHNlZSB0aGUgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBvciBLQVNBTiBmbGFnIHRoZW0uIFRoaXMgcGF0Y2ggaXMgbm90IGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSBuZXcgd2F5cyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhlcmVmb3JlLCBnaXZlbiBteSB1bmRlcnN0YW5kaW5nLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGRlZmluaXRlbHkgYmUgYGZhbHNlYC4gTm93LCB0aW1lIGZvciBhIHF1aWNrIG5vdGUgb24gS0FTQU4gdnMuIEtNU0FOLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwMzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxuXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMwLjQ1Nzk3OTYxMVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczMzMyOTY5MjMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCIsXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgYChsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEgXFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKWAgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBwcmV2ZW50IGFjY3VtdWxhdGluZyBjb250aWd1b3VzIGJsb2NrcyBpbnRvIGEgc2luZ2xlIGV4dGVudCBiZXlvbmQgdGhlIG1heGltdW0gYWxsb3dhYmxlIGluaXRpYWxpemVkIGV4dGVudCBsZW5ndGggKGBFWFRfSU5JVF9NQVhfTEVOYCA9IDMyNzY4KSBkdXJpbmcgaW5vZGUgbWlncmF0aW9uIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXFxuXFxuQWxsIGZpZWxkcyBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBhcmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBhdCB0aGUgc3RhcnQgb2YgYGV4dDRfZXh0X21pZ3JhdGUoKWAuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgZG9lcyBub3QgY29weSBhbnkga2VybmVsIGRhdGEgdG8gdXNlciBzcGFjZSwgYW5kIGRvZXMgbm90IGFsdGVyIG1lbW9yeSBpbml0aWFsaXphdGlvbiBsb2dpYy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBleHRlbnQgbGVuZ3RoIG92ZXJmbG93IG9yIGNvcnJ1cHRlZCBleHRlbnQgc3RydWN0dXJlcyBhcmUgZnVuY3Rpb25hbCBmaWxlc3lzdGVtIGJ1Z3Mgb3IgYm91bmRzIGlzc3VlcyBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOL1VCU0FOIGJ1aWxkcy4gQ29uc2VxdWVudGx5LCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMwLjQ1Nzk4NDI3MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NDc3MjkyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMTAgMDM6NDc6MjggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xcbmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9taWdyYXRlLmNcXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xcbkBAIC03MSw3ICs3MSw4IEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHQgKi9cXG4gXFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXFx1MDAzZWN1cnJfYmxvY2spKSB7XFxuK1xcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFxcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcXG4gXFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiBcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiBcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0NzozMi4wNTMzOTE0NzNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjUxMzE0OTIyMDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCIsXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljIGluIGZzL2V4dDQvbWlncmF0ZS5jICh1cGRhdGVfZXh0ZW50X3JhbmdlKSB0byBlbnN1cmUgZXh0ZW50IGxlbmd0aHMgZG8gbm90IGV4Y2VlZCBFWFRfSU5JVF9NQVhfTEVOLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RscyBvbiBleHQ0IGZpbGVzeXN0ZW1zIGFuZCB3YXJyYW50cyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGJlMTlkYzliNDM3MmJiYTM1ZGYyYjVlNjNhYzAxMjViZWExYmI0NTBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAwMzo0NzoyOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLmRiYmQ1Mzc3MzE1NTYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC03MSw3ICs3MSw4IEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0ICovXG4gXHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuIFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2srMSA9PSBwYmxvY2spIFx1MDAyNlx1MDAyNlxuLVx0XHQobGItXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVx1MDAzZWN1cnJfYmxvY2spKSB7XG4rXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykgXHUwMDI2XHUwMDI2XG4rXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKSkge1xuIFx0XHRsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiBcdFx0bGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gXHRcdGxiLVx1MDAzZWN1cnJfYmxvY2srKztcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjMyLjA1MzM5Mzk0M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE4NTU2MzY2NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgdGhlIE5lZWQgZm9yIFN5emthbGxlciBGdXp6aW5nIG9uIGEgS2VybmVsIFBhdGNoKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhpcyBwYXRjaCB0byBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgaXQgd2FycmFudCBiZWluZyBmdXp6ZWQgd2l0aCBzeXprYWxsZXI/IEZpcnN0LCBJIG5lZWQgdG8gZG8gYSBxdWljayByaXNrIGFzc2Vzc21lbnQuIFRoaXMgaXMgYSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHRhc2ssIGtlcm5lbCBtYWludGVuYW5jZSByZWFsbHkuIENvbnRleHQgYW5kIHNldmVyaXR5IHNlZW0gYmVuaWduLCBtZWFuaW5nIHRoZXJlJ3MgbGlrZWx5IG5vIHJlYWwgZGFuZ2VyIGluIGRpdmluZyBpbnRvIHRoaXMuIEl0IGxvb2tzIHNhZmUgdG8gZXZhbHVhdGUgZnVsbHkuXG5cbk5vdywgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGNoYW5nZS4gU3BlY2lmaWNhbGx5LCBpdOKAmXMgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgd2l0aGluIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24uIExvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHRoZXJlJ3MgYSBuZXcgY2hlY2sgYWRkZWQ6IGBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOYC4gVGhhdCBsb29rcyBsaWtlIGEgbGVuZ3RoIGNoZWNrLCBwb3RlbnRpYWxseSBwcmV2ZW50aW5nIHNvbWUga2luZCBvZiBvdmVyZmxvdyBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyBleHRlbnQgbWlncmF0aW9uLiBNeSBzcGlkZXktc2Vuc2UgaXMgdGVsbGluZyBtZSB0byBpbnZlc3RpZ2F0ZSBwb3RlbnRpYWwgaW50ZWdlciBvdmVyZmxvd3MgYXMgYSBmaXJzdCBzdGVwIGhlcmUsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggYmxvY2sgbnVtYmVycyBhbmQgc2l6ZXMuXG5cblRvIGdldCBhIGJldHRlciBncmlwIG9uIHRoZSBmdWxsIHBpY3R1cmUsIEknbGwgbmVlZCB0byBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlLCB0aGUgY2FsbGVycyBvZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIGFuZCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuIEnigJlsbCB1c2UgYGdyZXBwZXJgIG9yIG1heWJlIGp1c3QgYHJlYWQtZmlsZWAgdG8gdW5kZXJzdGFuZCB0aGUgYmlnZ2VyIHBpY3R1cmUgb2YgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBleHQ0IGZpbGUgc3lzdGVtJ3MgbWlncmF0aW9uIHByb2Nlc3MuIFRoaXMgd2lsbCBoZWxwIG1lIGRldGVybWluZSBob3cgY3JpdGljYWwgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIGFuZCB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgb2J2aW91cyB0YXJnZXRzIGZvciBmdXp6aW5nIGJhc2VkIG9uIHRoZSBwYXRjaCdzIGNoYW5nZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNDQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1MC42MDk3NjI3NzVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NzI2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcXG4gICAyOlxcdC8qXFxuICAgMzpcXHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XFxuICAgNDpcXHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVxcdTAwM2VcXG4gICA1OlxcdCAqXFxuICAgNjpcXHQgKi9cXG4gICA3OlxcdFxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJleHQ0X2piZDIuaFxcXCJcXG4gIDEwOlxcdCNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gIDExOlxcdFxcbiAgMTI6XFx0LypcXG4gIDEzOlxcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxcbiAgMTQ6XFx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XFxuICAxNTpcXHQgKi9cXG4gIDE2OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuICAxNzpcXHRcXHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcXG4gIDE4OlxcdFxcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xcbiAgMTk6XFx0fTtcXG4gIDIwOlxcdFxcbiAgMjE6XFx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDIyOlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICAyMzpcXHRcXG4gIDI0OlxcdHtcXG4gIDI1OlxcdFxcdGludCByZXR2YWwgPSAwLCBuZWVkZWQ7XFxuICAyNjpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXh0O1xcbiAgMjc6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGg7XFxuICAyODpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayA9PSAwKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdC8qIEFkZCB0aGUgZXh0ZW50IHRvIHRlbXAgaW5vZGUqL1xcbiAgMzI6XFx0XFx0bmV3ZXh0LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobGItXFx1MDAzZWZpcnN0X2Jsb2NrKTtcXG4gIDMzOlxcdFxcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSk7XFxuICAzNDpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuICAzNTpcXHRcXHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xcbiAgMzY6XFx0XFx0ZG93bl93cml0ZShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuICAzNzpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbGItXFx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcXG4gIDM4OlxcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4gIDM5OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XFxuICA0MDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA0MTpcXHRcXHR9XFxuICA0MjpcXHRcXG4gIDQzOlxcdFxcdC8qXFxuICA0NDpcXHRcXHQgKiBDYWxjdWxhdGUgdGhlIGNyZWRpdCBuZWVkZWQgdG8gaW5zZXJ0aW5nIHRoaXMgZXh0ZW50XFxuICA0NTpcXHRcXHQgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgdGhpcyBpbiBsb29wIHdlIG1heSBhY2N1bXVsYXRlIGV4dHJhXFxuICA0NjpcXHRcXHQgKiBjcmVkaXQuIEJ1dCBiZWxvdyB3ZSB0cnkgdG8gbm90IGFjY3VtdWxhdGUgdG9vIG11Y2hcXG4gIDQ3OlxcdFxcdCAqIG9mIHRoZW0gYnkgcmVzdGFydGluZyB0aGUgam91cm5hbC5cXG4gIDQ4OlxcdFxcdCAqL1xcbiAgNDk6XFx0XFx0bmVlZGVkID0gZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KGlub2RlLFxcbiAgNTA6XFx0XFx0XFx0ICAgIGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSwgcGF0aCk7XFxuICA1MTpcXHRcXG4gIDUyOlxcdFxcdHJldHZhbCA9IGV4dDRfZGF0YXNlbV9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIGlub2RlLCBuZWVkZWQsIG5lZWRlZCwgMCk7XFxuICA1MzpcXHRcXHRpZiAocmV0dmFsIFxcdTAwM2MgMClcXG4gIDU0OlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gIDU1OlxcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleHQsIDApO1xcbiAgNTY6XFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG4gIDU3OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XFxuICA1ODpcXHRlcnJfb3V0OlxcbiAgNTk6XFx0XFx0dXBfd3JpdGUoKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKSk7XFxuICA2MDpcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuICA2MTpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID0gMDtcXG4gIDYyOlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA2MzpcXHR9XFxuICA2NDpcXHRcXG4gIDY1OlxcdHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgNjY6XFx0XFx0XFx0XFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA2NzpcXHR7XFxuICA2ODpcXHRcXHRpbnQgcmV0dmFsO1xcbiAgNjk6XFx0XFx0LypcXG4gIDcwOlxcdFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiAgNzE6XFx0XFx0ICovXFxuICA3MjpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayBcXHUwMDI2XFx1MDAyNlxcbiAgNzM6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc0OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbiAgNzU6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XFxuICA3NjpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA3NzpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgNzg6XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDc5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAgODA6XFx0XFx0fVxcbiAgODE6XFx0XFx0LypcXG4gIDgyOlxcdFxcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxcbiAgODM6XFx0XFx0ICovXFxuICA4NDpcXHRcXHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xcbiAgODU6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IGxiLVxcdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcXG4gIDg2OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9ibG9jayA9IGxiLVxcdTAwM2VsYXN0X2Jsb2NrID0gbGItXFx1MDAzZWN1cnJfYmxvY2s7XFxuICA4NzpcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAgODg6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDg5OlxcdH1cXG4gIDkwOlxcdFxcbiAgOTE6XFx0c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgOTI6XFx0XFx0XFx0XFx0XFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gIDkzOlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA5NDpcXHR7XFxuICA5NTpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAgOTY6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuICA5NzpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gIDk4OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gIDk5OlxcdFxcbiAxMDA6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1MC42MDk4NjE3ODVaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNjA4NTQyNTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZW50cnkgcG9pbnRzIGFuZCBvdmVyYWxsIGZsb3cgZm9yIGV4dDQgbWlncmF0aW9uIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIFJpZ2h0IG5vdywgSSdtIGZvY3VzZWQgb24gYGZzL2V4dDQvbWlncmF0ZS5jYC4gVG8gZ2V0IGEgY29tcGxldGUgZ3Jhc3Agb2YgdGhpcywgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlLiBUaGUgaW1wb3J0YW50IHBhcnQgSSBuZWVkIGlzIHRoZSBpbml0aWFsIGZ1bmN0aW9uIGNhbGwgYW5kIGhvdyB0aGlzIGVudGlyZSBtaWdyYXRpb24gcHJvY2VzcyBpcyB0cmlnZ2VyZWQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFVuZGVyc3RhbmRpbmcgdGhlIGVudHJ5IHBvaW50cyB3aWxsIGdpdmUgbWUgdGhlIGhvb2tzIEkgbmVlZCB0byByZWFsbHkgZGlnIGludG8gdGhlIG1lY2hhbmljcyBvZiB3aGF0J3MgaGFwcGVuaW5nLiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTExOCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTQuMjE4NDA2NDQyWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTgwNzYyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zMjU0PWludCBleHQ0X2ZvcmNlX3NodXRkb3duKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncyk7XFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0zMjU2LS8qIG1pZ3JhdGUuYyAqL1xcbmZzL2V4dDQvZXh0NC5oOjMyNTc6ZXh0ZXJuIGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqKTtcXG5mcy9leHQ0L2V4dDQuaC0zMjU4LWV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYz01OTA9c3RhdGljIGludCBleHQ0X2lvY3RsX3NldGZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmMtNzA1LVxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEVYVDRfRVhURU5UU19GTClcXG5mcy9leHQ0L2lvY3RsLmM6NzA2OlxcdFxcdFxcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xcbmZzL2V4dDQvaW9jdGwuYy03MDctXFx0XFx0ZWxzZVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTE1Mzg9c3RhdGljIGxvbmcgX19leHQ0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy0xNzAxLVxcdFxcdGlub2RlX2xvY2soKGlub2RlKSk7XFxuZnMvZXh0NC9pb2N0bC5jOjE3MDI6XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuZnMvZXh0NC9pb2N0bC5jLTE3MDMtXFx0XFx0aW5vZGVfdW5sb2NrKChpbm9kZSkpO1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MzkxPXN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxMC1cXG5mcy9leHQ0L21pZ3JhdGUuYzo0MTE6aW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG5mcy9leHQ0L21pZ3JhdGUuYy00MTIte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1NC4yNjU1OTQwMzRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjM1MjMzNjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhbmQgZmlndXJlIG91dCBpdHMgS2NvbmZpZyBkZXBlbmRlbmNpZXMuIFdoZXJlIHNob3VsZCBJIHN0YXJ0PyBUaGUgb2J2aW91cyBwbGFjZXMgYXJlIHRoZSBgTWFrZWZpbGVgIGFuZCBgS2NvbmZpZ2AgZmlsZXMgd2l0aGluIHRoZSBgZnMvZXh0NGAgZGlyZWN0b3J5LiBJJ2xsIGNoZWNrIHRob3NlIGZpcnN0LiBUaGV5IHNob3VsZCBleHBsaWNpdGx5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBpbmNsdXNpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGZpbGUsIGFuZCB0aGF0IHNob3VsZCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIE5vIG5lZWQgdG8gb3ZlcnRoaW5rIGl0OyB0aGUgYW5zd2VyIHNob3VsZCBiZSByaWdodCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTc1NywiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ3OjU1LjkwMDgzMDIzWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MDE3NjkzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1pZ3JhdGVcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L01ha2VmaWxlPTg9ZXh0NC15XFx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGUtOS1cXHRcXHRleHRlbnRzX3N0YXR1cy5vIGZpbGUubyBmc21hcC5vIGZzeW5jLm8gaGFzaC5vIGlhbGxvYy5vIFxcXFxcXG5mcy9leHQ0L01ha2VmaWxlOjEwOlxcdFxcdGluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGUtMTEtXFx0XFx0bW1wLm8gbW92ZV9leHRlbnQubyBuYW1laS5vIHBhZ2UtaW8ubyByZWFkcGFnZS5vIHJlc2l6ZS5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTUuOTQ3ODUyNDkzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTkzNzI0OTg5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqRXh0NCBNb2R1bGUgRGVwZW5kZW5jaWVzKipcblxuUmlnaHQsIHNvIGBtaWdyYXRlLm9gLi4uIHRoYXQncyBwYXJ0IG9mIHRoZSBgZXh0NC15YCBidWlsZCwgYW5kICp0aGF0KiBtZWFucyBpdCBnZXRzIGJ1aWx0IHdoZW5ldmVyIHRoZSBgQ09ORklHX0VYVDRfRlNgIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBUaGF0J3MgZ29vZCB0byBrbm93LCBhbmQgZnJhbmtseSwgSSBzaG91bGQgaGF2ZSByZW1lbWJlcmVkIHRoYXQgZnJvbSByZXZpZXdpbmcgdGhlIGJ1aWxkIHN5c3RlbSBiZWZvcmUuIEl0J3MgYSBrZXkgZGVwZW5kZW5jeS4gTm93LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gYWxsIHRoZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGtub2JzIGFzc29jaWF0ZWQgd2l0aCBleHQ0LiBJJ2xsIHRha2UgYSBsb29rIGF0IGBmcy9leHQ0L0tjb25maWdgIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gSXQnbGwgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGlmIGFueSBuZXcgb25lcyBoYXZlIGJlZW4gYWRkZWQgc2luY2UgbXkgbGFzdCBkZXRhaWxlZCByZXZpZXcuIEkgbWF5IGFsc28gd2FudCB0byBjb21wYXJlIHdpdGggcHJpb3Iga2VybmVsIHZlcnNpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDk2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDc6NTcuODg1MTA0NzVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODIyMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgRVhUNF9GU1xcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcbiAgIDQ6XFx0XFx0c2VsZWN0IEJVRkZFUl9IRUFEXFxuICAgNTpcXHRcXHRzZWxlY3QgSkJEMlxcbiAgIDY6XFx0XFx0c2VsZWN0IENSQzE2XFxuICAgNzpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gICA4OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDk6XFx0XFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXFxuICAxMDpcXHRcXHRoZWxwXFxuICAxMTpcXHRcXHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxcbiAgMTI6XFx0XFxuICAxMzpcXHRcXHQgIFVubGlrZSB0aGUgY2hhbmdlIGZyb20gZXh0MiBmaWxlc3lzdGVtIHRvIGV4dDMgZmlsZXN5c3RlbSxcXG4gIDE0OlxcdFxcdCAgdGhlIG9uLWRpc2sgZm9ybWF0IG9mIGV4dDQgaXMgbm90IGZvcndhcmRzIGNvbXBhdGlibGUgd2l0aFxcbiAgMTU6XFx0XFx0ICBleHQzOyBpdCBpcyBiYXNlZCBvbiBleHRlbnQgbWFwcyBhbmQgaXQgc3VwcG9ydHMgNDgtYml0XFxuICAxNjpcXHRcXHQgIHBoeXNpY2FsIGJsb2NrIG51bWJlcnMuICBUaGUgZXh0NCBmaWxlc3lzdGVtIGFsc28gc3VwcG9ydHMgZGVsYXllZFxcbiAgMTc6XFx0XFx0ICBhbGxvY2F0aW9uLCBwZXJzaXN0ZW50IHByZWFsbG9jYXRpb24sIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcyxcXG4gIDE4OlxcdFxcdCAgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHNwZWVkXFxuICAxOTpcXHRcXHQgIHVwIGZzY2sgdGltZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSB3ZWIgcGFnZXMgYXRcXG4gIDIwOlxcdFxcdCAgaHR0cDovL2V4dDQud2lraS5rZXJuZWwub3JnLlxcbiAgMjE6XFx0XFxuICAyMjpcXHRcXHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxcbiAgMjM6XFx0XFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXFxuICAyNDpcXHRcXHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XFxuICAyNTpcXHRcXHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcXG4gIDI2OlxcdFxcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXFxuICAyNzpcXHRcXHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXFxuICAyODpcXHRcXHQgIGNvbXBhdGlibGUuXFxuICAyOTpcXHRcXG4gIDMwOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxcbiAgMzE6XFx0XFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzQ6XFx0XFxuICAzNTpcXHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG4gIDM2OlxcdFxcdGJvb2wgXFxcIlVzZSBleHQ0IGZvciBleHQyIGZpbGUgc3lzdGVtc1xcXCJcXG4gIDM3OlxcdFxcdGRlcGVuZHMgb24gRVhUNF9GU1xcbiAgMzg6XFx0XFx0ZGVwZW5kcyBvbiBFWFQyX0ZTPW5cXG4gIDM5OlxcdFxcdGRlZmF1bHQgeVxcbiAgNDA6XFx0XFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0Nzo1Ny44ODUxODkxNFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODkwOTEwOTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFJlY2VudCBleHQ0IFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIEl0IGxvb2tzIGxpa2UgYSByZWNlbnQgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCBtb2RpZmllcyB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLiBTcGVjaWZpY2FsbHksIGl0IGFkZHMgYSBjaGVjayB3aXRoaW4gdGhlIGBpZmAgc3RhdGVtZW50IHRoYXQgZGV0ZXJtaW5lcyBpZiB3ZSBjYW4gZXh0ZW5kIGFuIGV4aXN0aW5nIGV4dGVudCByYW5nZS4gVGhlIG9yaWdpbmFsIGNoZWNrIHdhcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBgKGxiLVx1MDAzZWxhc3RfcGJsb2NrKzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjYgKGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKWAuIE5vdywgdGhlcmUncyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbjogYChsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKWAuXG5cbkFoYSEgVGhpcyBwcmV2ZW50cyB0aGUgY3JlYXRpb24gb2YgYW4gZXh0ZW50IHRoYXQncyBsb25nZXIgdGhhbiBgRVhUX0lOSVRfTUFYX0xFTmAsIHdoaWNoIGlzIGNsZWFybHkgYSBzYWZlZ3VhcmQgdG8gcHJldmVudCBvdmVyZmxvd2luZyB0aGUgMTYtYml0IGBlZV9sZW5gIGZpZWxkIGluIGV4dDQgZXh0ZW50cy4gV2l0aG91dCB0aGlzIGNoZWNrLCB0aGUgb2xkIGNvZGUgY291bGQgaGF2ZSBhbGxvd2VkIGBlZV9sZW5gIHRvIHdyYXAgb3IgZXhjZWVkIHRoZSBpbnRlbmRlZCBtYXhpbXVtLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyB0aGlzIHJlYWNoYWJsZSBhbmQsIHRoZXJlZm9yZSwgd29ydGggZnV6emluZz8gQWJzb2x1dGVseSwgeWVzISBUaGlzIGlzIHJpZ2h0IGluIHRoZSBoZWFydCBvZiB0aGUgZXh0NCBleHRlbnQgbWlncmF0aW9uIGxvZ2ljLiBXZSBoYXZlIG11bHRpcGxlIHdheXMgdG8gdHJpZ2dlciB0aGlzIGNvbmRpdGlvbiDigJMgdGhyb3VnaCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIGlvY3RsIG9yIHBvdGVudGlhbGx5IHVzaW5nIGBGU19JT0NfU0VURkxBR1NgIHdpdGggYEVYVDRfRVhURU5UU19GTGAgZmxhZyBvbiBhbiBleHQ0IGZpbGUgc3lzdGVtLCBwYXJ0aWN1bGFybHkgb25lIGVtcGxveWluZyBpbmRpcmVjdCBibG9ja3Mgb3IgZHVyaW5nIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IHRvIGV4dGVudC4gR2l2ZW4gU3l6a2FsbGVyJ3MgcHJvZmljaWVuY3ksIGl0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmlnZ2VyIHRoZXNlIGBFWFQ0X0lPQ19NSUdSQVRFYCBvciBgRlNfSU9DX1NFVEZMQUdTYCBjYWxscywgbWFraW5nIHRoaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGhGdXp6aW5nLlxuXG5OZXh0LCBJIG5lZWQgdG8gY2hlY2sgdGhlIEZvY3VzU3ltYm9scywgd2hpY2ggaXMgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhIHN0YXRpYyBmdW5jdGlvbiBpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgYmV0dGVyLCBJIHNob3VsZCBleGFtaW5lIHRoZSBjYWxsaW5nIGNvbnRleHQgYW5kIHRoZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIGBtaWdyYXRlLmNgLCBzbyBJJ2xsIG5lZWQgdG8gcmVhZCB0aGUgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGZyb20gbGluZSAxMDAgdG8gdGhlIGVuZCwgdG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UgbW9yZSBmdWxseS5cblxuXG4iLCJJbnB1dFRva2VucyI6Njk0NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjAyLjc3NjEwMzM4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDA6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxMDE6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDEwMjpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDEwMzpcXHRcXG4gMTA0OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxMDU6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTA2OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTA3OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTA4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTA5OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDExMDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTExOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDExMjpcXHRcXHRcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAxMTM6XFx0XFx0XFx0fVxcbiAxMTQ6XFx0XFx0fVxcbiAxMTU6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTE2OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDExNzpcXHRcXG4gMTE4OlxcdH1cXG4gMTE5OlxcdFxcbiAxMjA6XFx0c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTIxOlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxMjI6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDEyMzpcXHR7XFxuIDEyNDpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxMjU6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDEyNjpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTI3OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTI4OlxcdFxcbiAxMjk6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxMzA6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDEzMTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDEzMjpcXHRcXG4gMTMzOlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxMzQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTM1OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTM2OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXFxuIDEzNzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XFxuIDEzODpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiAxMzk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MDpcXHRcXHRcXHR9IGVsc2Uge1xcbiAxNDE6XFx0XFx0XFx0XFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXFxuIDE0MjpcXHRcXHRcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztcXG4gMTQzOlxcdFxcdFxcdH1cXG4gMTQ0OlxcdFxcdH1cXG4gMTQ1OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE0NjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxNDc6XFx0XFxuIDE0ODpcXHR9XFxuIDE0OTpcXHRcXG4gMTUwOlxcdHN0YXRpYyBpbnQgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDE1MTpcXHRcXHRcXHRcXHRcXHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gMTUyOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAxNTM6XFx0e1xcbiAxNTQ6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTU1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxNTY6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuIDE1NzpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDE1ODpcXHRcXG4gMTU5OlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG4gMTYwOlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxNjE6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxNjI6XFx0XFxuIDE2MzpcXHRcXHRpX2RhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTY0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE2NTpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDE2NjpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTY3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTY4OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTcwOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE3MTpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTcyOlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7XFxuIDE3MzpcXHRcXHRcXHR9XFxuIDE3NDpcXHRcXHR9XFxuIDE3NTpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxNzY6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTc3OlxcdFxcbiAxNzg6XFx0fVxcbiAxNzk6XFx0XFxuIDE4MDpcXHRzdGF0aWMgaW50IGZyZWVfZGluZF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSxcXG4gMTgxOlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fbGUzMiBpX2RhdGEpXFxuIDE4MjpcXHR7XFxuIDE4MzpcXHRcXHRpbnQgaTtcXG4gMTg0OlxcdFxcdF9fbGUzMiAqdG1wX2lkYXRhO1xcbiAxODU6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTg2OlxcdFxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gMTg3OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTg4OlxcdFxcdGludCBlcnI7XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChzYiwgbGUzMl90b19jcHUoaV9kYXRhKSwgMCk7XFxuIDE5MTpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTkyOlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTkzOlxcdFxcbiAxOTQ6XFx0XFx0dG1wX2lkYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDE5NTpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxOTY6XFx0XFx0XFx0aWYgKHRtcF9pZGF0YVtpXSkge1xcbiAxOTc6XFx0XFx0XFx0XFx0ZXJyID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSxcXG4gMTk4OlxcdFxcdFxcdFxcdFxcdEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MsXFxuIDE5OTpcXHRcXHRcXHRcXHRcXHRleHQ0X2ZyZWVfbWV0YWRhdGFfcmV2b2tlX2NyZWRpdHMoc2IsIDEpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MDIuNzc2MjAyNzJaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjc4NDU2MjAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBNaWdyYXRpb24gTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgb24gdGhlIGBmcy9leHQ0L21pZ3JhdGUuY2AgZmlsZSBhbmQgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgdGhpcyBtaWdyYXRpb24gcHJvY2VzcyB3b3JrcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSd2ZSBnb3QgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIGV4dGVudCBtYW5hZ2VtZW50IHNjaGVtZS4gSSBzaG91bGQgbWFwIG91dCB0aGUgY29udHJvbCBmbG93LlxuXG5UbyBkbyB0aGF0LCBJJ20gZ29pbmcgdG8gbG9vayBjbG9zZWx5IGF0IHRoZSBmdW5jdGlvbidzIGNhbGxlcnMuIEkgbmVlZCB0byBzZWUgKndobyogaXMgdHJpZ2dlcmluZyB0aGlzIG1pZ3JhdGlvbiwgYW5kICp3aHkqLiBXaGF0IHNjZW5hcmlvcyBhcmUgd2UgYWRkcmVzc2luZyB3aXRoIHRoaXMgZnVuY3Rpb25hbGl0eT8gVGhlbiwgSSBoYXZlIHRvIHRyYWNlIGhvdyBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgdXNlZCwgYXMgaXQgc2VlbXMgZnVuZGFtZW50YWwgdG8gdGhlIGV4dDQgZXh0ZW50IG1pZ3JhdGlvbiBwcm9jZXNzLiBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBob3cgaXQncyBjYWxsZWQgYW5kIHdoYXQgYXJndW1lbnRzIGFyZSBiZWluZyBwYXNzZWQgdG8gZnVsbHkgY29tcHJlaGVuZCBpdHMgcm9sZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdCBvbiB0aGUgb24tZGlzayBzdHJ1Y3R1cmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IGV4dGVudHMgYXJlIGJlaW5nIG1hbmFnZWQgZHVyaW5nIHRoZSBtaWdyYXRpb24sIGluY2x1ZGluZyB0aGUgaW1wYWN0IG9uIHRoZSBmaWxlc3lzdGVtJ3MgbWV0YWRhdGEuIEknbSBndWVzc2luZyB0aGF0IEknbGwgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBhY3R1YWwgY29kZSBvZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdG8gdW5kZXJzdGFuZCB0aGlzIHByb2Nlc3MgZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk0NDgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjA1LjU2MDc2Njg5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3OTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNTA6XFx0ZXJyX291dDpcXG4gMzUxOlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDM1MjpcXHR9XFxuIDM1MzpcXHRcXG4gMzU0OlxcdHN0YXRpYyBpbnQgZnJlZV9leHRfaWR4KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDM1NTpcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeClcXG4gMzU2OlxcdHtcXG4gMzU3OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAzNTg6XFx0XFx0ZXh0NF9mc2Jsa190IGJsb2NrO1xcbiAzNTk6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMzYwOlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbiAzNjE6XFx0XFxuIDM2MjpcXHRcXHRibG9jayA9IGV4dDRfaWR4X3BibG9jayhpeCk7XFxuIDM2MzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIGJsb2NrLCAwKTtcXG4gMzY0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAzNjY6XFx0XFxuIDM2NzpcXHRcXHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMzY4OlxcdFxcdGlmIChlaC1cXHUwMDNlZWhfZGVwdGggIT0gMCkge1xcbiAzNjk6XFx0XFx0XFx0aXggPSBFWFRfRklSU1RfSU5ERVgoZWgpO1xcbiAzNzA6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVxcdTAwM2VlaF9lbnRyaWVzKTsgaSsrLCBpeCsrKSB7XFxuIDM3MTpcXHRcXHRcXHRcXHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xcbiAzNzI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbCkge1xcbiAzNzM6XFx0XFx0XFx0XFx0XFx0cHV0X2JoKGJoKTtcXG4gMzc0OlxcdFxcdFxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDM3NTpcXHRcXHRcXHRcXHR9XFxuIDM3NjpcXHRcXHRcXHR9XFxuIDM3NzpcXHRcXHR9XFxuIDM3ODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAzNzk6XFx0XFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUyxcXG4gMzgwOlxcdFxcdFxcdFxcdGV4dDRfZnJlZV9tZXRhZGF0YV9yZXZva2VfY3JlZGl0cyhpbm9kZS1cXHUwMDNlaV9zYiwgMSkpO1xcbiAzODE6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDM4MjpcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAzODM6XFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBibG9jaywgMSxcXG4gMzg0OlxcdFxcdFxcdFxcdCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBIHwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbiAzODU6XFx0XFx0cmV0dXJuIDA7XFxuIDM4NjpcXHR9XFxuIDM4NzpcXHRcXG4gMzg4OlxcdC8qXFxuIDM4OTpcXHQgKiBGcmVlIHRoZSBleHRlbnQgbWV0YSBkYXRhIGJsb2NrcyBvbmx5XFxuIDM5MDpcXHQgKi9cXG4gMzkxOlxcdHN0YXRpYyBpbnQgZnJlZV9leHRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4gMzkyOlxcdHtcXG4gMzkzOlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAzOTQ6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xcbiAzOTU6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKWVpLVxcdTAwM2VpX2RhdGE7XFxuIDM5NjpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeDtcXG4gMzk3OlxcdFxcdGlmIChlaC1cXHUwMDNlZWhfZGVwdGggPT0gMClcXG4gMzk4OlxcdFxcdFxcdC8qXFxuIDM5OTpcXHRcXHRcXHQgKiBObyBleHRyYSBibG9ja3MgYWxsb2NhdGVkIGZvciBleHRlbnQgbWV0YSBkYXRhXFxuIDQwMDpcXHRcXHRcXHQgKi9cXG4gNDAxOlxcdFxcdFxcdHJldHVybiAwO1xcbiA0MDI6XFx0XFx0aXggPSBFWFRfRklSU1RfSU5ERVgoZWgpO1xcbiA0MDM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGxlMTZfdG9fY3B1KGVoLVxcdTAwM2VlaF9lbnRyaWVzKTsgaSsrLCBpeCsrKSB7XFxuIDQwNDpcXHRcXHRcXHRyZXR2YWwgPSBmcmVlX2V4dF9pZHgoaGFuZGxlLCBpbm9kZSwgaXgpO1xcbiA0MDU6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNDA2OlxcdFxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQwNzpcXHRcXHR9XFxuIDQwODpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiA0MDk6XFx0fVxcbiA0MTA6XFx0XFxuIDQxMTpcXHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA0MTI6XFx0e1xcbiA0MTM6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4gNDE0OlxcdFxcdGludCByZXR2YWwgPSAwLCBpO1xcbiA0MTU6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDQxNjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcXG4gNDE3OlxcdFxcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcXG4gNDE4OlxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG4gNDE5OlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuIDQyMDpcXHRcXHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xcbiA0MjE6XFx0XFx0dWlkX3Qgb3duZXJbMl07XFxuIDQyMjpcXHRcXHRpbnQgYWxsb2NfY3R4O1xcbiA0MjM6XFx0XFxuIDQyNDpcXHRcXHQvKlxcbiA0MjU6XFx0XFx0ICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBvciB0aGUgaW5vZGVcXG4gNDI2OlxcdFxcdCAqIGFscmVhZHkgaXMgZXh0ZW50LWJhc2VkLCBlcnJvciBvdXQuXFxuIDQyNzpcXHRcXHQgKi9cXG4gNDI4OlxcdFxcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSB8fFxcbiA0Mjk6XFx0XFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XFxuIDQzMDpcXHRcXHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbiA0MzE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzMjpcXHRcXG4gNDMzOlxcdFxcdGlmIChTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpIFxcdTAwMjZcXHUwMDI2IGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9PSAwKVxcbiA0MzQ6XFx0XFx0XFx0LypcXG4gNDM1OlxcdFxcdFxcdCAqIGRvbid0IG1pZ3JhdGUgZmFzdCBzeW1saW5rXFxuIDQzNjpcXHRcXHRcXHQgKi9cXG4gNDM3OlxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0LypcXG4gNDQyOlxcdFxcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcXG4gNDQzOlxcdFxcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XFxuIDQ0NDpcXHRcXHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxcbiA0NDU6XFx0XFx0ICovXFxuIDQ0NjpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcXG4gNDQ3OlxcdFxcdFxcdDMgKyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXFx1MDAzZWlfc2IpKTtcXG4gNDQ4OlxcdFxcbiA0NDk6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjA1LjU2MDg2NjFaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzAzOTYzNjM3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIGBleHQ0X2V4dF9taWdyYXRlYCBGdW5jdGlvbioqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gd3JhcCBteSBoZWFkIGFyb3VuZCB0aGlzIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbi4gUmlnaHQsIGl0J3MgbWlncmF0aW5nIGRhdGEgZXh0ZW50cy4gVGhlIGJhc2ljIGZsb3cgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXMgaG93IHRoZSB1cGRhdGVzIGFyZSBoYW5kbGVkLiBJdCBzZWVtcyB0aGF0IGBleHQ0X2V4dF9taWdyYXRlYCByZWxpZXMgb24gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHRvIGRvIHRoZSBoZWF2eSBsaWZ0aW5nLiBJbiBzb21lIGNhc2VzIChsaWtlIGRpcmVjdCBibG9ja3MsIEkgYmVsaWV2ZSksIGl0IGNhbGxzIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuIEZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGJleW9uZCwgaXQgYXBwZWFycyB3ZSdyZSBnb2luZyB0aHJvdWdoIGEgaGllcmFyY2h5OiBgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlYCwgYW5kIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLiBUaGF0IG1ha2VzIHNlbnNlOyBpdCdzIGEgd2F5IHRvIGhhbmRsZSB0aGUgZGlmZmVyZW50IGxldmVscyBvZiBpbmRpcmVjdGlvbiBpbiB0aGUgaW5vZGUuXG5cblRvIHJlYWxseSBuYWlsIGRvd24gdGhlIGRldGFpbHMsIEkgc2hvdWxkIHByb2JhYmx5IHRha2UgYSBsb29rIGF0IHRoZSBhY3R1YWwgY29kZS4gTGV0J3MgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbjogbGluZXMgNDUwIHRvIDUyMCBvZiBgZnMvZXh0NC9taWdyYXRlLmNgLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBoYW5kbGUgb24gaG93IHRoZSBkaWZmZXJlbnQgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHZhcmlhbnRzIGFyZSBjYWxsZWQgYW5kIHdoYXQgYXJndW1lbnRzIGFyZSBiZWluZyBwYXNzZWQuIEkgd2FudCB0byBzZWUgaG93IHRoZSBtZXRhZGF0YSBpcyB1cGRhdGVkIGF0IGVhY2ggc3RhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzM0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODowOC42MDA1MDU1NzlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODg3MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDUwLFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDUwOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNDUxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDUyOlxcdFxcdH1cXG4gNDUzOlxcdFxcdC8qXFxuIDQ1NDpcXHRcXHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUncyBibG9jayBtYXBwaW5nIGxheW91dFxcbiA0NTU6XFx0XFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcXG4gNDU2OlxcdFxcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXFxuIDQ1NzpcXHRcXHQgKi9cXG4gNDU4OlxcdFxcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVxcdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xcbiA0NTk6XFx0XFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXFx1MDAzZWlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSAqXFxuIDQ2MDpcXHRcXHRcXHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSArIDE7XFxuIDQ2MTpcXHRcXHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xcbiA0NjI6XFx0XFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcXG4gNDYzOlxcdFxcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KSxcXG4gNDY0OlxcdFxcdFxcdFxcdFxcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcXG4gNDY1OlxcdFxcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xcbiA0NjY6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xcbiA0Njc6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDY4OlxcdFxcdFxcdHRtcF9pbm9kZSA9IE5VTEw7XFxuIDQ2OTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ3MDpcXHRcXHR9XFxuIDQ3MTpcXHRcXHQvKlxcbiA0NzI6XFx0XFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJ2lub2RlJykuICBUaGlzXFxuIDQ3MzpcXHRcXHQgKiBpcyBzbyB0aGF0IHRoZSBtZXRhZGF0YSBibG9ja3Mgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IGNoZWNrc3VtIGFmdGVyXFxuIDQ3NDpcXHRcXHQgKiB0aGUgbWlncmF0aW9uLlxcbiA0NzU6XFx0XFx0ICovXFxuIDQ3NjpcXHRcXHRlaSA9IEVYVDRfSShpbm9kZSk7XFxuIDQ3NzpcXHRcXHR0bXBfY3N1bV9zZWVkID0gRVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0Nzg6XFx0XFx0RVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkID0gZWktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0Nzk6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4gNDgwOlxcdFxcdC8qXFxuIDQ4MTpcXHRcXHQgKiBTZXQgdGhlIGlfbmxpbmsgdG8gemVybyBzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXJcXG4gNDgyOlxcdFxcdCAqIHdoZW4gd2UgZHJvcCBpbm9kZSByZWZlcmVuY2UuXFxuIDQ4MzpcXHRcXHQgKi9cXG4gNDg0OlxcdFxcdGNsZWFyX25saW5rKHRtcF9pbm9kZSk7XFxuIDQ4NTpcXHRcXG4gNDg2OlxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuIDQ4NzpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHQvKlxcbiA0OTA6XFx0XFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcXG4gNDkxOlxcdFxcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxcbiA0OTI6XFx0XFx0ICpcXG4gNDkzOlxcdFxcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXFxuIDQ5NDpcXHRcXHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcXG4gNDk1OlxcdFxcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXFxuIDQ5NjpcXHRcXHQgKi9cXG4gNDk3OlxcdFxcdC8qXFxuIDQ5ODpcXHRcXHQgKiBFdmVuIHRob3VnaCB3ZSB0YWtlIGlfcndzZW0gd2UgY2FuIHN0aWxsIGNhdXNlIGJsb2NrXFxuIDQ5OTpcXHRcXHQgKiBhbGxvY2F0aW9uIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZFxcbiA1MDA6XFx0XFx0ICogbmV3IGJsb2NrcyB3ZSBmYWlsIG1pZ3JhdGUuICBOZXcgYmxvY2sgYWxsb2NhdGlvbiB3aWxsXFxuIDUwMTpcXHRcXHQgKiBjbGVhciBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFIGZsYWcuICBUaGUgZmxhZyBpcyB1cGRhdGVkXFxuIDUwMjpcXHRcXHQgKiB3aXRoIGlfZGF0YV9zZW0gaGVsZCB0byBwcmV2ZW50IHJhY2luZyB3aXRoIGJsb2NrXFxuIDUwMzpcXHRcXHQgKiBhbGxvY2F0aW9uLlxcbiA1MDQ6XFx0XFx0ICovXFxuIDUwNTpcXHRcXHRkb3duX3JlYWQoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiA1MDY6XFx0XFx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUpO1xcbiA1MDc6XFx0XFx0dXBfcmVhZCgoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pKTtcXG4gNTA4OlxcdFxcbiA1MDk6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsIDEpO1xcbiA1MTA6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDUxMTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDUxMjpcXHRcXHRcXHRnb3RvIG91dF90bXBfaW5vZGU7XFxuIDUxMzpcXHRcXHR9XFxuIDUxNDpcXHRcXG4gNTE1OlxcdFxcdGlfZGF0YSA9IGVpLVxcdTAwM2VpX2RhdGE7XFxuIDUxNjpcXHRcXHRtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKTtcXG4gNTE3OlxcdFxcbiA1MTg6XFx0XFx0LyogMzIgYml0IGJsb2NrIGFkZHJlc3MgNCBieXRlcyAqL1xcbiA1MTk6XFx0XFx0bWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MDguNjAwNTk2MDA5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwNTI2NTAxMDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBDb2RlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLiBUaGF0J3MgdGhlIGVudHJ5IHBvaW50LCB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGtpY2tzIG9mZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBOb3csIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBsaXZpbmcgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEdvb2QsIHRoYXQgbWVhbnMgaXQncyBsb2NhbGl6ZWQgYW5kIHdlIGhhdmUgYSBnb29kIGdyYXNwIG9mIGl0cyBzY29wZS4gUmlnaHQsIGxldCdzIHZlcmlmeSBpZiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXMgaW5saW5lZCBvciBzdGF0aWM7IHllcCBpdCdzIGRlY2xhcmVkIGBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoLi4uKWAuIFBlcmZlY3QuXG5cbk15IGtleSBmb2N1cyBwb2ludHMgaGVyZSBhcmUgZGVmaW5pdGVseSBnb2luZyB0byBiZSBgZXh0NF9leHRfbWlncmF0ZWAgaXRzZWxmLCBhbmQgdGhlbiB0aG9zZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgdmFyaWFudHMuIEluY2x1ZGluZyBgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlYCwgYW5kIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhvc2UgZml0IHRvZ2V0aGVyLlxuXG5BcyBmb3IgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMsIEknbSBwcmV0dHkgc3VyZSB3ZSBuZWVkIGBFWFQ0X0ZTYC4gQnV0IEkgc2hvdWxkIHJlYWxseSBkb3VibGUtY2hlY2sgZm9yIGFueSBvdGhlciBkZXBlbmRlbmNpZXM7IGl0J3MgYWx3YXlzIGdvb2QgdG8gYmUgdGhvcm91Z2guIEknbGwgdGFrZSBhIHF1aWNrIHNjYW4gb2YgYGZzL2V4dDQvbWlncmF0ZS5jYCB0byBsb29rIGZvciBhbnkgYCNpZmRlZmAgYmxvY2tzLiBUaGF0J2xsIHRlbGwgdXMgaWYgYW55IG90aGVyIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb25zIGNvbWUgaW50byBwbGF5IGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyOTM1LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MTEuNjUzMjQ5MDg1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDM4MzEzMjQsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIiNpZlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MTEuNzU3MDg5Nzk5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjExNTMyMDUyOTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIGBmcy9leHQ0L21pZ3JhdGUuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnMvZXh0NC9taWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2UgdGhlcmUgYXJlIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMsIHdoaWNoIGlzIGEgZ29vZCBzaWduIOKAkyBsZXNzIHRvIHdvcnJ5IGFib3V0IGluIHRlcm1zIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNvbXBsZXhpdHkuIFRpbWUgdG8gaW52ZXN0aWdhdGUgdGhlIGRlcGVuZGVuY2llcyB0aHJvdWdoIEtjb25maWcuIExvb2tzIGxpa2UgYEVYVDRfRlNgIHNlbGVjdHMgYEJVRkZFUl9IRUFEYCwgYEpCRDJgLCBgQ1JDMTZgLCBgQ1JDMzJgLCBhbmQgYEZTX0lPTUFQYC4gTm90aGluZyBvdmVybHkgZXhvdGljIHRoZXJlLCBubyByZWQgZmxhZ3MgYWJvdXQgdHJpY2t5IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzdHVmZiBvciBvYnNjdXJlIGhhcmR3YXJlIGRlcGVuZGVuY2llcyB0aGF0IHdvdWxkIGNvbXBsaWNhdGUgZnV6emluZy4gVGhpcyBpcyBhbGwgbG9va2luZyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHNvIGZhci5cblxuTm93LCBsZXQncyByaWdvcm91c2x5IGdvIHRocm91Z2ggdGhlIGNyaXRlcmlhIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGlzIGEgZ29vZCB0YXJnZXQuIEZpcnN0LCBgV29ydGhGdXp6aW5nYDogdGhlIHBhdGNoIG1vZGlmaWVzIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHNwZWNpZmljYWxseSBgdXBkYXRlX2V4dGVudF9yYW5nZWAsIHdoaWNoIGlzIGdvb2QuIEl0J3MgYWxzbyBjaGFuZ2luZyB0aGUgcnVsZXMgYXJvdW5kIGhvdyBleHQ0IGV4dGVudCByYW5nZXMgYXJlIGV4dGVuZGVkIGR1cmluZyBtaWdyYXRpb24uIFRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhlIGxpbWl0IG9uIGV4dGVudCBsZW5ndGggYXQgYEVYVF9JTklUX01BWF9MRU5gLCB0aGF0J3MgYW4gaW50ZXJlc3RpbmcgY29uZGl0aW9uIHRvIHByb2JlLiAgQ3J1Y2lhbGx5LCB0aGlzIGNvZGUgcGF0aCBpcyByZWFjaGFibGUgdmlhIGBpb2N0bChmZCwgRVhUNF9JT0NfTUlHUkFURSlgIG9yIGBpb2N0bChmZCwgRlNfSU9DX1NFVEZMQUdTLCAuLi4pYCDigJMgcGVyZmVjdCEgSSBjYW4gaGl0IGl0IGluIGEgdHlwaWNhbCBWTSBvciBzeXprYWxsZXIgc2V0dXAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IEkgd2FudC4gVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYC5cblxuTmV4dCwgSSBuZWVkIHRvIGRlZmluZSB0aGUgcmVsZXZhbnQgc3ltYm9scyB0byBmb2N1cyBvbi4gQmFzZWQgb24gdGhlIHBhdGNoIGFuZCB0aGUgYWZmZWN0ZWQgZnVuY3Rpb25zLCB0aGUgdHdvIGtleSBvbmVzIGFyZSBgZXh0NF9leHRfbWlncmF0ZWAgYW5kIHRoZSBtb2RpZmllZCBgdXBkYXRlX2V4dGVudF9yYW5nZWAuIFRoZXNlIHdpbGwgYmUgbXkgYEZvY3VzU3ltYm9sc2AuXG5cbkZpbmFsbHksIGZvciB0aGUgYEVuYWJsZUNvbmZpZ3NgLCBJJ2xsIG5lZWQgYEVYVDRfRlNgLCB3aGljaCBzZWVtcyBvYnZpb3VzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGNvbmZpcm0uXG5cbkFscmlnaHQsIHdpdGggYWxsIHRoYXQgY29uZmlybWVkLCBJJ20gcmVhZHkgdG8gcHJvY2VlZC4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIExldCdzIGdldCB0aGlzIGZ1enppbmcgZ29pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDU0LCJPdXRwdXRUb2tlbnMiOjEyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODoyMy4yODkxNDQ4MTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTE2NTcxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIixcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGV4dGVudCBtaWdyYXRpb24gbG9naWMgaW4gZnMvZXh0NC9taWdyYXRlLmMgKHVwZGF0ZV9leHRlbnRfcmFuZ2UpIHRvIGVuc3VyZSBleHRlbnQgbGVuZ3RocyBkbyBub3QgZXhjZWVkIEVYVF9JTklUX01BWF9MRU4uIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEVYVDRfSU9DX01JR1JBVEUgaW9jdGxzIG9uIGV4dDQgZmlsZXN5c3RlbXMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDAzOjQ4OjIzLjM2ODMxNzYyM1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA0MjI2MjMyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODoyMy4zNjg3Mzc5MjNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMDQyMjE5ODAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIGAobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFxcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTilgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AgdG8gcHJldmVudCBhY2N1bXVsYXRpbmcgY29udGlndW91cyBibG9ja3MgaW50byBhIHNpbmdsZSBleHRlbnQgYmV5b25kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBpbml0aWFsaXplZCBleHRlbnQgbGVuZ3RoIChgRVhUX0lOSVRfTUFYX0xFTmAgPSAzMjc2OCkgZHVyaW5nIGlub2RlIG1pZ3JhdGlvbiBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcbkFsbCBmaWVsZHMgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgYXJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYXQgdGhlIHN0YXJ0IG9mIGBleHQ0X2V4dF9taWdyYXRlKClgLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGRvZXMgbm90IGNvcHkgYW55IGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UsIGFuZCBkb2VzIG5vdCBhbHRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gbG9naWMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggZXh0ZW50IGxlbmd0aCBvdmVyZmxvdyBvciBjb3JydXB0ZWQgZXh0ZW50IHN0cnVjdHVyZXMgYXJlIGZ1bmN0aW9uYWwgZmlsZXN5c3RlbSBidWdzIG9yIGJvdW5kcyBpc3N1ZXMgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTi9VQlNBTiBidWlsZHMuIENvbnNlcXVlbnRseSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYmUxOWRjOWI0MzcyYmJhMzVkZjJiNWU2M2FjMDEyNWJlYTFiYjQ1MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDEwIDAzOjQ3OjI4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xuaW5kZXggNWQ2MGVmMTBmZTExMC4uZGJiZDUzNzczMTU1NiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xuQEAgLTcxLDcgKzcxLDggQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHQgKi9cbiBcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgXHUwMDI2XHUwMDI2XG4gXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG4tXHRcdChsYi1cdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbitcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSBcdTAwMjZcdTAwMjZcbitcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayArIDEgXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pKSB7XG4gXHRcdGxiLVx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xuIFx0XHRsYi1cdTAwM2VsYXN0X2Jsb2NrID0gbGItXHUwMDNlY3Vycl9ibG9jaztcbiBcdFx0bGItXHUwMDNlY3Vycl9ibG9jaysrO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjMuMzY4NzM4ODMzWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU3MTUzNDE0MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBUaGUgZGlmZiB0YXJnZXRzIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHNwZWNpZmljYWxseSB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLiBJbW1lZGlhdGVseSwgSSBzZWUgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdGhhdCdzIGJlaW5nIG1vZGlmaWVkLiBJdCBsb29rcyBsaWtlIGl0J3MgdHJ5aW5nIHRvIG9wdGltaXplIGhvdyBleHRlbnQgcmFuZ2VzIGFyZSB1cGRhdGVkLCBsaWtlbHkgZHVyaW5nIGEgbWlncmF0aW9uIG9yIGRlZnJhZ21lbnRhdGlvbiBwcm9jZXNzLiBJJ20gZm9jdXNpbmcgb24gdGhlIGNvbmRpdGlvbiBpdHNlbGYsIHdoaWNoIGNoZWNrcyBmb3IgY29uc2VjdXRpdmUgYmxvY2tzIGFuZCBwaHlzaWNhbCBibG9ja3Mgd2l0aGluIGFuIGV4dGVudC5cblxuVGhlIG9yaWdpbmFsIGNoZWNrLCBmcm9tIHdoYXQgSSBjYW4gc2VlIG9mIGl0LCB2ZXJpZmllcyBpZiBgbGItXHUwMDNlZmlyc3RfcGJsb2NrYCBleGlzdHMsIGlmIGBsYi1cdTAwM2VsYXN0X3BibG9jayArIDFgIGlzIGVxdWFsIHRvIGBwYmxvY2tgLCBhbmQgYGxiLVx1MDAzZWxhc3RfYmxvY2sgKyAxYCBpcyBlcXVhbCB0byBgbGItXHUwMDNlY3Vycl9ibG9ja2AuIE5vdywgdGhlIHBhdGNoIGFkZHMgYW5vdGhlciBjb25kaXRpb246IGBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgKyAxIFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOYC4gVGhpcyBpcyBjcnVjaWFsLiBJdCBsb29rcyBsaWtlIHRoZXkncmUgcHJldmVudGluZyBhbiBleHRlbnQgZnJvbSBncm93aW5nIGJleW9uZCBpdHMgaW5pdGlhbCBtYXhpbXVtIGxlbmd0aCB3aGVuIHBlcmZvcm1pbmcgbWlncmF0aW9uLiBUaGlzIHdpbGwgcHJldmVudCBhIHByb2JsZW0sIHN1Y2ggYXMgYW4gb3ZlcmZsb3csIG9yIHNvbWUgb3RoZXIgYmFkIHN0YXRlLlxuXG5CeSBjaGVja2luZyB0aGUgbWF4aW11bSBleHRlbnQgbGVuZ3RoIHRoaXMgcGF0Y2ggYWltcyB0byBhdm9pZCBhbnkgcHJvYmxlbXMgYXJpc2luZyBmcm9tIHRoZSBleHRlbnQgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIHBlcm1pdHRlZCBzaXplLiBUaGlzIHN1Z2dlc3RzIHRoZSBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgcG90ZW50aWFsIGlzc3VlIHdoZXJlIGV4dGVuZGluZyBhIHJhbmdlIGNvdWxkIGxlYWQgdG8gdW5kZXNpcmFibGUgYmVoYXZpb3IsIHByb2JhYmx5IHJlbGF0ZWQgdG8gbWV0YWRhdGEgbGltaXRhdGlvbnMgb3Igc29tZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgd2l0aGluIGV4dDQncyBleHRlbnQgbWFuYWdlbWVudC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0IGlzIGFkZHJlc3NpbmcgYSBjb3JuZXIgY2FzZSB3aGVuIG1pZ3JhdGluZyBsYXJnZSBmaWxlcywgb3Igc29tZSBib3VuZGFyeSBjb25kaXRpb24sIHRvIGVuc3VyZSB0aGUgZXh0ZW50IHN0cnVjdHVyZSByZW1haW5zIGNvbnNpc3RlbnQuIFRoZSBhZGRpdGlvbiBzaG91bGQgaW1wcm92ZSB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjkuMDg0MDg0MTg5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMDMyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMzA6XFx0XFxuICAzMTpcXHRcXHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cXG4gIDMyOlxcdFxcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVxcdTAwM2VmaXJzdF9ibG9jayk7XFxuICAzMzpcXHRcXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEpO1xcbiAgMzQ6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleHQsIGxiLVxcdTAwM2VmaXJzdF9wYmxvY2spO1xcbiAgMzU6XFx0XFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG4gIDM2OlxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiAgMzc6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVxcdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XFxuICAzODpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuICAzOTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNDA6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNDE6XFx0XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKlxcbiAgNDQ6XFx0XFx0ICogQ2FsY3VsYXRlIHRoZSBjcmVkaXQgbmVlZGVkIHRvIGluc2VydGluZyB0aGlzIGV4dGVudFxcbiAgNDU6XFx0XFx0ICogU2luY2Ugd2UgYXJlIGRvaW5nIHRoaXMgaW4gbG9vcCB3ZSBtYXkgYWNjdW11bGF0ZSBleHRyYVxcbiAgNDY6XFx0XFx0ICogY3JlZGl0LiBCdXQgYmVsb3cgd2UgdHJ5IHRvIG5vdCBhY2N1bXVsYXRlIHRvbyBtdWNoXFxuICA0NzpcXHRcXHQgKiBvZiB0aGVtIGJ5IHJlc3RhcnRpbmcgdGhlIGpvdXJuYWwuXFxuICA0ODpcXHRcXHQgKi9cXG4gIDQ5OlxcdFxcdG5lZWRlZCA9IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChpbm9kZSxcXG4gIDUwOlxcdFxcdFxcdCAgICBsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEsIHBhdGgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xcbiAgNTM6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuICA1NDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA1NTpcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXh0LCAwKTtcXG4gIDU2OlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuICA1NzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNTg6XFx0ZXJyX291dDpcXG4gIDU5OlxcdFxcdHVwX3dyaXRlKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiAgNjA6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbiAgNjE6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IDA7XFxuICA2MjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDY2OlxcdFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgNjc6XFx0e1xcbiAgNjg6XFx0XFx0aW50IHJldHZhbDtcXG4gIDY5OlxcdFxcdC8qXFxuICA3MDpcXHRcXHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcXG4gIDcxOlxcdFxcdCAqL1xcbiAgNzI6XFx0XFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgXFx1MDAyNlxcdTAwMjZcXG4gIDczOlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9wYmxvY2srMSA9PSBwYmxvY2spIFxcdTAwMjZcXHUwMDI2XFxuICA3NDpcXHRcXHRcXHQobGItXFx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cXHUwMDNlY3Vycl9ibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc1OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEgXFx1MDAzYyBFWFRfSU5JVF9NQVhfTEVOKSkge1xcbiAgNzY6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiAgNzc6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cXHUwMDNlY3Vycl9ibG9jaztcXG4gIDc4OlxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuICA3OTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDgwOlxcdFxcdH1cXG4gIDgxOlxcdFxcdC8qXFxuICA4MjpcXHRcXHQgKiBTdGFydCBhIG5ldyByYW5nZS5cXG4gIDgzOlxcdFxcdCAqL1xcbiAgODQ6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTtcXG4gIDg1OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4NjpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgODc6XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDg4OlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA4OTpcXHR9XFxuICA5MDpcXHRcXG4gIDkxOlxcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDkyOlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuICA5MzpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgOTQ6XFx0e1xcbiAgOTU6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gIDk2OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAgOTc6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuICA5ODpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuICA5OTpcXHRcXG4gMTAwOlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG4gMTAxOlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxMDI6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxMDM6XFx0XFxuIDEwNDpcXHRcXHRpX2RhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTA1OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDEwNjpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDEwNzpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXFxuIDEwODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XFxuIDEwOTpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiAxMTA6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDExMTpcXHRcXHRcXHR9IGVsc2Uge1xcbiAxMTI6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gMTEzOlxcdFxcdFxcdH1cXG4gMTE0OlxcdFxcdH1cXG4gMTE1OlxcdFxcdHB1dF9iaChiaCk7XFxuIDExNjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxMTc6XFx0XFxuIDExODpcXHR9XFxuIDExOTpcXHRcXG4gMTIwOlxcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIDEyMTpcXHRcXHRcXHRcXHRcXHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gMTIyOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gMTI1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxMjY6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuIDEyNzpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDEyODpcXHRcXG4gMTI5OlxcdFxcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MjkuMDg0MTg2NTA5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1NTU3OTc2OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggaXMgYWN0dWFsbHkgY2hhbmdpbmcuIFJpZ2h0LCBpdCdzIGFib3V0IHRoZSBgZXh0NF9taWdyYXRlYCBwcm9jZXNzLCBzcGVjaWZpY2FsbHkgd2hlcmUgd2UncmUgY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIG9uZXMgdXNpbmcgYEVYVDRfSU9DX01JR1JBVEVgLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgaG93IGV4dGVudHMgYXJlIGdlbmVyYXRlZCBmcm9tIGNvbnRpZ3VvdXMgYmxvY2sgcmFuZ2VzIGR1cmluZyB0aGlzIG1pZ3JhdGlvbi5cblxuSSBrbm93IHRoYXQgZXh0NCB1c2VzIDE2LWJpdCBmaWVsZHMgKGBlZV9sZW5gKSBmb3IgZXh0ZW50IGxlbmd0aHMuIFRoZSB0cmlja3kgcGFydCBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBleHRlbnRzLiBVbmluaXRpYWxpemVkIGV4dGVudHMgbWFyayB0aGUgTVNCIGluIGBlZV9sZW5gLCB3aGlsZSBpbml0aWFsaXplZCBleHRlbnRzIGhhdmUgYGVlX2xlbmAgc2V0IHRvIGEgbWF4aW11bSB2YWx1ZSwgYEVYVF9JTklUX01BWF9MRU5gLCB3aGljaCBpcyAzMjc2OC5cblxuVGhlIHBvdGVudGlhbCBwcm9ibGVtIGlzIHByZXR0eSBjbGVhcjogaWYgd2UgdHJ5IHRvIGNyZWF0ZSBhbiBleHRlbnQgbGFyZ2VyIHRoYW4gYEVYVF9JTklUX01BWF9MRU5gIGR1cmluZyBtaWdyYXRpb24sIGBlZV9sZW5gIHdpbGwgZWl0aGVyIG92ZXJmbG93IG9yIGJlIGludmFsaWQsIGxlYWRpbmcgdG8gYWxsIHNvcnRzIG9mIG5hc3R5IGNvbnNlcXVlbmNlcyDigJMgZGF0YSBjb3JydXB0aW9uIG9yIGVycm9ycyBkb3duIHRoZSBsaW5lIGR1cmluZyBleHRlbnQgaW5zZXJ0aW9uIG9yIGV2ZW4gd2hlbiByZWFkaW5nIHRoZSBkYXRhLiBTbyBpdOKAmXMgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgaXNzdWUuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgcmVnYXJkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJIG5lZWQgdG8gc2NydXRpbml6ZSBob3cgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQuIFRoYXQncyB0aGUga2V5IHRvIGZpZ3VyaW5nIG91dCB0aGUgcG90ZW50aWFsIGZvciBwcm9ibGVtcyBoZXJlLiBHb3R0YSBsb29rIGF0IHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGFuZCBob3cgdGhlIHNpemVzIGFyZSBjaGVja2VkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGlzc3VlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MzU0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzIuNjM5OTg3NTQ1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBMR1BMLTIuMVxcbiAgIDI6XFx0LypcXG4gICAzOlxcdCAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDdcXG4gICA0OlxcdCAqIEF1dGhvciBBbmVlc2ggS3VtYXIgSy5WIFxcdTAwM2NhbmVlc2gua3VtYXJAbGludXgudm5ldC5pYm0uY29tXFx1MDAzZVxcbiAgIDU6XFx0ICpcXG4gICA2OlxcdCAqL1xcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgIDk6XFx0I2luY2x1ZGUgXFxcImV4dDRfamJkMi5oXFxcIlxcbiAgMTA6XFx0I2luY2x1ZGUgXFxcImV4dDRfZXh0ZW50cy5oXFxcIlxcbiAgMTE6XFx0XFxuICAxMjpcXHQvKlxcbiAgMTM6XFx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXFxuICAxNDpcXHQgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcXG4gIDE1OlxcdCAqL1xcbiAgMTY6XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcXG4gIDE3OlxcdFxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbiAgMTg6XFx0XFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XFxuICAxOTpcXHR9O1xcbiAgMjA6XFx0XFxuICAyMTpcXHRzdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMjI6XFx0XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0e1xcbiAgMjU6XFx0XFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcXG4gIDI2OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XFxuICAyNzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcXG4gIDI4OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXFxuICAyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMwOlxcdFxcbiAgMzE6XFx0XFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXFxuICAzMjpcXHRcXHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cXHUwMDNlZmlyc3RfYmxvY2spO1xcbiAgMzM6XFx0XFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG4gIDM0OlxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXh0LCBsYi1cXHUwMDNlZmlyc3RfcGJsb2NrKTtcXG4gIDM1OlxcdFxcdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXFxuICAzNjpcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gIDM3OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbiAgMzg6XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbiAgMzk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDQwOlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzIuNjQwMDk0NDM1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE3MDgxNDkwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgSW5zdGFudGlhdGlvbiBvZiBgbWlncmF0ZV9zdHJ1Y3QgbGJgKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgYG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBiZWluZyB1c2VkLiBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIGl0cyBpbnN0YW50aWF0aW9ucy4gTm8gcG9pbnQgaW4gbWFraW5nIGFzc3VtcHRpb25zOyBJIG5lZWQgdG8gZm9sbG93IHRoZSBjb2RlJ3MgYnJlYWRjcnVtYnMgZGlyZWN0bHkuIFRoaXMgbGlrZWx5IG1lYW5zIGdyZXBwaW5nLCBidXQgSSdsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgb3RoZXIgZmFjdG9ycyBsaWtlIG1hY3JvcyBvciBwb3RlbnRpYWwgaW5kaXJlY3QgY2FsbHMgdGhhdCBtaWdodCBvYnNjdXJlIHRoZSBkaXJlY3QgaW5zdGFudGlhdGlvbi4gSSBuZWVkIHRvIGJlIG1ldGhvZGljYWwgaGVyZSwgbWFwcGluZyBvdXQgdGhlIGNhbGwgZ3JhcGggZnJvbSB0aGUgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiB0byByZWxldmFudCBmdW5jdGlvbnMuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRoYXQgbWlnaHQgYWZmZWN0IGl0cyBhY3R1YWwgdXNhZ2UgaW4gZGlmZmVyZW50IGJ1aWxkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcXVpY2sgY29kZSBkaXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTE4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNC4zNDgyNDYxNjlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4NjI5NTEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBtaWdyYXRlX3N0cnVjdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzoxNjpzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbmZzL2V4dDQvbWlncmF0ZS5jLTE3LVxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MjE9c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYzoyMjpcXHRcXHRcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTIzLVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmM6NjY6XFx0XFx0XFx0ICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuZnMvZXh0NC9taWdyYXRlLmMtNjcte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9OTE9c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbWlncmF0ZS5jLTkyLVxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6OTM6XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy05NC17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0xMjA9c3RhdGljIGludCB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjEtXFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6MTIyOlxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTEyMy17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0xNTA9c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTEtXFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuZnMvZXh0NC9taWdyYXRlLmM6MTUyOlxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTE1My17XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz00MTE9aW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxNy1cXHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XFxuZnMvZXh0NC9taWdyYXRlLmM6NDE4OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG5mcy9leHQ0L21pZ3JhdGUuYy00MTktXFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzQuMzk2ODc4ODQxWiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxMTU3MTk3MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGVyZSB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgaXMgZGVmaW5lZCBhbmQgaW5pdGlhbGl6ZWQuIEknbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdCByZWdpb24sIHRoYXQncyB3aGVyZSB0aGUgbWFnaWMgcHJvYmFibHkgaGFwcGVucy4gTGV0J3Mgc3RhcnQgd2l0aCB3aGVyZSBpdCBpcyBkZWZpbmVkIGFuZCBpbnN0YW50aWF0ZWQuIEtub3dpbmcgaG93IGl0J3Mgc2V0IHVwIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIGhhdmUgYSBmZWVsaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNvbnRleHQgZm9yIGludGVycHJldGluZyB0aGUgc3Vycm91bmRpbmcgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNDEsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNi41MTI2MDExNjlaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTQ5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDE1OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiA0MTY6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7XFxuIDQxNzpcXHRcXHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XFxuIDQxODpcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XFxuIDQxOTpcXHRcXHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzO1xcbiA0MjA6XFx0XFx0X191MzIgZ29hbCwgdG1wX2NzdW1fc2VlZDtcXG4gNDIxOlxcdFxcdHVpZF90IG93bmVyWzJdO1xcbiA0MjI6XFx0XFx0aW50IGFsbG9jX2N0eDtcXG4gNDIzOlxcdFxcbiA0MjQ6XFx0XFx0LypcXG4gNDI1OlxcdFxcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXFxuIDQyNjpcXHRcXHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxcbiA0Mjc6XFx0XFx0ICovXFxuIDQyODpcXHRcXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cXHUwMDNlaV9zYikgfHxcXG4gNDI5OlxcdFxcdCAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSB8fFxcbiA0MzA6XFx0XFx0ICAgIGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4gNDMxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRpZiAoU19JU0xOSyhpbm9kZS1cXHUwMDNlaV9tb2RlKSBcXHUwMDI2XFx1MDAyNiBpbm9kZS1cXHUwMDNlaV9ibG9ja3MgPT0gMClcXG4gNDM0OlxcdFxcdFxcdC8qXFxuIDQzNTpcXHRcXHRcXHQgKiBkb24ndCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xcbiA0MzY6XFx0XFx0XFx0ICovXFxuIDQzNzpcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRhbGxvY19jdHggPSBleHQ0X3dyaXRlcGFnZXNfZG93bl93cml0ZShpbm9kZS1cXHUwMDNlaV9zYik7XFxuIDQ0MDpcXHRcXG4gNDQxOlxcdFxcdC8qXFxuIDQ0MjpcXHRcXHQgKiBXb3JzdCBjYXNlIHdlIGNhbiB0b3VjaCB0aGUgYWxsb2NhdGlvbiBiaXRtYXBzIGFuZCBhIGJsb2NrXFxuIDQ0MzpcXHRcXHQgKiBncm91cCBkZXNjcmlwdG9yIGJsb2NrLiAgV2UgZG8gbmVlZCB0byB3b3JyeSBhYm91dFxcbiA0NDQ6XFx0XFx0ICogY3JlZGl0cyBmb3IgbW9kaWZ5aW5nIHRoZSBxdW90YSBpbm9kZS5cXG4gNDQ1OlxcdFxcdCAqL1xcbiA0NDY6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsXFxuIDQ0NzpcXHRcXHRcXHQzICsgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLVxcdTAwM2VpX3NiKSk7XFxuIDQ0ODpcXHRcXG4gNDQ5OlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA0NTA6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihoYW5kbGUpO1xcbiA0NTE6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiA0NTI6XFx0XFx0fVxcbiA0NTM6XFx0XFx0LypcXG4gNDU0OlxcdFxcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSdzIGJsb2NrIG1hcHBpbmcgbGF5b3V0XFxuIDQ1NTpcXHRcXHQgKiAoaW5kaXJlY3QgdG8gZXh0ZW50cykgYW5kIGlzIG5vdCB0cmFja2VkIGluIHRoZSBmYXN0IGNvbW1pdFxcbiA0NTY6XFx0XFx0ICogbG9nLCBzbyBkaXNhYmxlIGZhc3QgY29tbWl0cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cXG4gNDU3OlxcdFxcdCAqL1xcbiA0NTg6XFx0XFx0ZXh0NF9mY19tYXJrX2luZWxpZ2libGUoaW5vZGUtXFx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XFxuIDQ1OTpcXHRcXHRnb2FsID0gKCgoKHUzMilpbm9kZS1cXHUwMDNlaV9pbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cXHUwMDNlaV9zYikpICpcXG4gNDYwOlxcdFxcdFxcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cXHUwMDNlaV9zYikpICsgMTtcXG4gNDYxOlxcdFxcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XFxuIDQ2MjpcXHRcXHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xcbiA0NjM6XFx0XFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX3Jvb3QpLFxcbiA0NjQ6XFx0XFx0XFx0XFx0XFx0ICAgU19JRlJFRywgTlVMTCwgZ29hbCwgb3duZXIsIDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozNi41MTI2OTgwMzlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjMwNzAzNzY5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuIGV4cGVydDpcblxuKipEZWx2aW5nIGludG8gYGV4dDRfZXh0X21pZ3JhdGVgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgZnVuY3Rpb24uIEkndmUgYWxyZWFkeSBnb3QgYSBoYW5kbGUgb24gdGhlIG92ZXJhbGwgZ29hbCDigJMgY29udmVydGluZyBleHRlbnRzIHRvIGEgbW9yZSBlZmZpY2llbnQgZm9ybWF0LiBOb3csIGxldCdzIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyAqYWN0dWFsbHkqIGRvaW5nIGl0LiBXaGF0IGFyZSB0aGUga2V5IHN0ZXBzPyBBcmUgdGhlcmUgYW55IGNsZXZlciBvcHRpbWl6YXRpb25zIGluIHBsYXk/IEFyZSB0aGV5IGNvbnNpZGVyaW5nIGZyYWdtZW50YXRpb24gb3IgdHJ5aW5nIHRvIG1pbmltaXplIGRhdGEgbW92ZW1lbnQ/IEkgbmVlZCB0byBhbmFseXplIGl0cyBzdHJhdGVneTogaG93IGRvZXMgaXQgaGFuZGxlIG1ldGFkYXRhIHVwZGF0ZXMsIGVycm9yIGNvbmRpdGlvbnMsIGFuZCB0aGUgYWN0dWFsIGNvcHlpbmcvcmV3cml0aW5nIG9mIHRoZSBkYXRhIGJsb2Nrcz8gSXMgaXQgc2luZ2xlLXRocmVhZGVkIG9yIHV0aWxpemluZyBzb21lIGZvcm0gb2YgY29uY3VycmVuY3kgZm9yIHRoZXNlIHBvdGVudGlhbGx5IGxlbmd0aHkgZGF0YSBtaWdyYXRpb25zPyBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkOiB0aGUgZXh0ZW50IHRyZWUsIHRoZSBibG9jayBncm91cHMsIHRoZSBpbm9kZSBzdHJ1Y3R1cmUg4oCTIGhvdyBhcmUgdGhlc2UgYmVpbmcgbWFuaXB1bGF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzPyBBbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3Vlcz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBmb3Igc3BhY2UgYWxsb2NhdGlvbiwgcGVyaGFwcyB0aGUgdXRpbGl6YXRpb24gb2YgYSBmcmVlIHNwYWNlIGJpdG1hcCBvciBibG9jayBncm91cCBkZXNjcmlwdG9ycywgYW5kIEknbGwgbG9vayBmb3IgYW55IHNhZmVndWFyZHMgdG8gcHJldmVudCBkYXRhIGNvcnJ1cHRpb24gaW4gY2FzZSBvZiBlcnJvcnMuIFVsdGltYXRlbHksIEknbSB0cnlpbmcgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZSBvZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MsIHN0ZXAgYnkgc3RlcCwgYW5kIGFzc2VzcyBpdHMgcm9idXN0bmVzcyBhbmQgZWZmaWNpZW5jeS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzQwMywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDM6NDg6MzguODE5NzM4Nzk2WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTI4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0NjUsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0NjU6XFx0XFx0aWYgKElTX0VSUih0bXBfaW5vZGUpKSB7XFxuIDQ2NjpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XFxuIDQ2NzpcXHRcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0Njg6XFx0XFx0XFx0dG1wX2lub2RlID0gTlVMTDtcXG4gNDY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDcwOlxcdFxcdH1cXG4gNDcxOlxcdFxcdC8qXFxuIDQ3MjpcXHRcXHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAnaW5vZGUnKS4gIFRoaXNcXG4gNDczOlxcdFxcdCAqIGlzIHNvIHRoYXQgdGhlIG1ldGFkYXRhIGJsb2NrcyB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgY2hlY2tzdW0gYWZ0ZXJcXG4gNDc0OlxcdFxcdCAqIHRoZSBtaWdyYXRpb24uXFxuIDQ3NTpcXHRcXHQgKi9cXG4gNDc2OlxcdFxcdGVpID0gRVhUNF9JKGlub2RlKTtcXG4gNDc3OlxcdFxcdHRtcF9jc3VtX3NlZWQgPSBFWFQ0X0kodG1wX2lub2RlKS1cXHUwMDNlaV9jc3VtX3NlZWQ7XFxuIDQ3ODpcXHRcXHRFWFQ0X0kodG1wX2lub2RlKS1cXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cXHUwMDNlaV9jc3VtX3NlZWQ7XFxuIDQ3OTpcXHRcXHRpX3NpemVfd3JpdGUodG1wX2lub2RlLCBpX3NpemVfcmVhZChpbm9kZSkpO1xcbiA0ODA6XFx0XFx0LypcXG4gNDgxOlxcdFxcdCAqIFNldCB0aGUgaV9ubGluayB0byB6ZXJvIHNvIGl0IHdpbGwgYmUgZGVsZXRlZCBsYXRlclxcbiA0ODI6XFx0XFx0ICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS5cXG4gNDgzOlxcdFxcdCAqL1xcbiA0ODQ6XFx0XFx0Y2xlYXJfbmxpbmsodG1wX2lub2RlKTtcXG4gNDg1OlxcdFxcbiA0ODY6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNDg3OlxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDQ4ODpcXHRcXG4gNDg5OlxcdFxcdC8qXFxuIDQ5MDpcXHRcXHQgKiBzdGFydCB3aXRoIG9uZSBjcmVkaXQgYWNjb3VudGVkIGZvclxcbiA0OTE6XFx0XFx0ICogc3VwZXJibG9jayBtb2RpZmljYXRpb24uXFxuIDQ5MjpcXHRcXHQgKlxcbiA0OTM6XFx0XFx0ICogRm9yIHRoZSB0bXBfaW5vZGUgd2UgYWxyZWFkeSBoYXZlIGNvbW1pdHRlZCB0aGVcXG4gNDk0OlxcdFxcdCAqIHRyYW5zYWN0aW9uIHRoYXQgY3JlYXRlZCB0aGUgaW5vZGUuIExhdGVyIGFzIGFuZFxcbiA0OTU6XFx0XFx0ICogd2hlbiB3ZSBhZGQgZXh0ZW50cyB3ZSBleHRlbnQgdGhlIGpvdXJuYWxcXG4gNDk2OlxcdFxcdCAqL1xcbiA0OTc6XFx0XFx0LypcXG4gNDk4OlxcdFxcdCAqIEV2ZW4gdGhvdWdoIHdlIHRha2UgaV9yd3NlbSB3ZSBjYW4gc3RpbGwgY2F1c2UgYmxvY2tcXG4gNDk5OlxcdFxcdCAqIGFsbG9jYXRpb24gdmlhIG1tYXAgd3JpdGUgdG8gaG9sZXMuIElmIHdlIGhhdmUgYWxsb2NhdGVkXFxuIDUwMDpcXHRcXHQgKiBuZXcgYmxvY2tzIHdlIGZhaWwgbWlncmF0ZS4gIE5ldyBibG9jayBhbGxvY2F0aW9uIHdpbGxcXG4gNTAxOlxcdFxcdCAqIGNsZWFyIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUgZmxhZy4gIFRoZSBmbGFnIGlzIHVwZGF0ZWRcXG4gNTAyOlxcdFxcdCAqIHdpdGggaV9kYXRhX3NlbSBoZWxkIHRvIHByZXZlbnQgcmFjaW5nIHdpdGggYmxvY2tcXG4gNTAzOlxcdFxcdCAqIGFsbG9jYXRpb24uXFxuIDUwNDpcXHRcXHQgKi9cXG4gNTA1OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuIDUwNjpcXHRcXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XFxuIDUwNzpcXHRcXHR1cF9yZWFkKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiA1MDg6XFx0XFxuIDUwOTpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSwgMSk7XFxuIDUxMDpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNTExOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNTEyOlxcdFxcdFxcdGdvdG8gb3V0X3RtcF9pbm9kZTtcXG4gNTEzOlxcdFxcdH1cXG4gNTE0OlxcdFxcbiA1MTU6XFx0XFx0aV9kYXRhID0gZWktXFx1MDAzZWlfZGF0YTtcXG4gNTE2OlxcdFxcdG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpO1xcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXFxuIDUxOTpcXHRcXHRtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiA1MjA6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkrKykge1xcbiA1MjE6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiA1MjI6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTIzOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFxcdTAwMjZsYik7XFxuIDUyNDpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODozOC44MTk4NTEyOTZaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDk3MTA2NjYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLTVNBTiBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoYXQgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBpcyBrZXkg4oCTIGl0J3MgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgc2FmZXR5IG9mIHRoaXMgY2hhbmdlLiBJdCBtZWFucyBgbGJgIGlzICphbHdheXMqIGluaXRpYWxpemVkLCBlbGltaW5hdGluZyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkLlxuXG5UaGUgY2hlY2sgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzIHN0cmFpZ2h0Zm9yd2FyZDpcblxuYGBgY1xuXHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuXHRcdChsYi1cdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXHUwMDI2XHUwMDI2XG5cdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2srMSA9PSBsYi1cdTAwM2VjdXJyX2Jsb2NrKSBcdTAwMjZcdTAwMjZcblx0XHQobGItXHUwMDNlbGFzdF9ibG9jayAtIGxiLVx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcdTAwM2MgRVhUX0lOSVRfTUFYX0xFTikpIHtcbmBgYFxuXG5JdCBib2lscyBkb3duIHRvIGEgY29udGlndW91cyBleHRlbnQgbGVuZ3RoIGNoZWNrLiBJdOKAmXMgZW5zdXJpbmcgdGhhdCBpZiB3ZSdyZSBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgZXh0ZW50LCB3ZSBkb24ndCBleGNlZWQgYEVYVF9JTklUX01BWF9MRU5gLiBUaGlzIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZWx5IGxhcmdlIGV4dGVudHMgZnJvbSBiZWluZyBjcmVhdGVkLCB3aGljaCBpcyByZWxhdGVkIHRvIGZpbGUgc3lzdGVtIG1pZ3JhdGlvbi5cblxuTm93LCBsZXQncyBjb25zaWRlciB0aGUgdXN1YWwgS01TQU4gY29uY2VybnMuIEknbSBsb29raW5nIGF0IHRoaXMgZnJvbSBhIGZldyBhbmdsZXM6XG5cbjEuICAqKlVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBzZW50IHRvIHVzZXIgc3BhY2U6KiogTm90IGhlcmUuIGBsYmAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBub3RoaW5nIHVuaW5pdGlhbGl6ZWQgaXMgbGVha2VkLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM6KiogTm9wZS4gQXMgbWVudGlvbmVkLCBgbGJgIGlzIHplcm9lZCBvdXQsIGFuZCBhbGwgdGhlIGZpZWxkcyBpbnZvbHZlZCBpbiB0aGUgY29uZGl0aW9uYWwgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgdmFsdWVzLlxuMy4gICoqQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcyBwb3RlbnRpYWxseSBiZWluZyByZWFkOioqIEFnYWluLCBuby4gVGhlIG1lbW9yeSBpcyBpbml0aWFsaXplZC5cbjQuICAqKkJvdW5kcyBjaGVja3MgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk6KiogTm8uIFRoaXMgaXMgYWJvdXQgZXh0ZW50IGxlbmd0aCBsaW1pdHMsIG5vdCBhY2NpZGVudGFsbHkgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy5cblxuQmFzaWNhbGx5LCB0aGlzIHBhdGNoIGlzIG9ubHkgZm9jdXNlZCBvbiBjaGVja2luZyBleHRlbnQgYm91bmRhcmllcyBhbmQgcHJldmVudGluZyBsYXJnZSBleHRlbnRzIGZyb20gYmVpbmcgY3JlYXRlZCwgd2hpY2ggbWlnaHQgcmVsYXRlIHRvIGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24gb3IgcmVsYXRlZCBpc3N1ZXMuIEhvd2V2ZXIsIGlmIHN1Y2ggaXNzdWVzIGFyaXNlLCB3ZSB3b3VsZCBleHBlY3QgdG8gc2VlIHRoZSBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIG9yIEtBU0FOIGZsYWcgdGhlbS4gVGhpcyBwYXRjaCBpcyBub3QgaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IG5ldyB3YXlzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZXJlZm9yZSwgZ2l2ZW4gbXkgdW5kZXJzdGFuZGluZywgYE5lZWRzS01TQU5gIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIE5vdywgdGltZSBmb3IgYSBxdWljayBub3RlIG9uIEtBU0FOIHZzLiBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODcxMSwiT3V0cHV0VG9rZW5zIjoyMzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwMzo0ODo0My43OTA5MjA4MTNaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayBgKGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIHRvIHByZXZlbnQgYWNjdW11bGF0aW5nIGNvbnRpZ3VvdXMgYmxvY2tzIGludG8gYSBzaW5nbGUgZXh0ZW50IGJleW9uZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgaW5pdGlhbGl6ZWQgZXh0ZW50IGxlbmd0aCAoYEVYVF9JTklUX01BWF9MRU5gID0gMzI3NjgpIGR1cmluZyBpbm9kZSBtaWdyYXRpb24gZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBvZiBgZXh0NF9leHRfbWlncmF0ZSgpYC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLCBhbmQgZG9lcyBub3QgYWx0ZXIgbWVtb3J5IGluaXRpYWxpemF0aW9uIGxvZ2ljLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGV4dGVudCBsZW5ndGggb3ZlcmZsb3cgb3IgY29ycnVwdGVkIGV4dGVudCBzdHJ1Y3R1cmVzIGFyZSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0gYnVncyBvciBib3VuZHMgaXNzdWVzIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4vVUJTQU4gYnVpbGRzLiBDb25zZXF1ZW50bHksIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayBgKGxiLVxcdTAwM2VsYXN0X2Jsb2NrIC0gbGItXFx1MDAzZWZpcnN0X2Jsb2NrICsgMSBcXHUwMDNjIEVYVF9JTklUX01BWF9MRU4pYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIHRvIHByZXZlbnQgYWNjdW11bGF0aW5nIGNvbnRpZ3VvdXMgYmxvY2tzIGludG8gYSBzaW5nbGUgZXh0ZW50IGJleW9uZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgaW5pdGlhbGl6ZWQgZXh0ZW50IGxlbmd0aCAoYEVYVF9JTklUX01BWF9MRU5gID0gMzI3NjgpIGR1cmluZyBpbm9kZSBtaWdyYXRpb24gZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5BbGwgZmllbGRzIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGFyZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGF0IHRoZSBzdGFydCBvZiBgZXh0NF9leHRfbWlncmF0ZSgpYC4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLCBhbmQgZG9lcyBub3QgYWx0ZXIgbWVtb3J5IGluaXRpYWxpemF0aW9uIGxvZ2ljLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGV4dGVudCBsZW5ndGggb3ZlcmZsb3cgb3IgY29ycnVwdGVkIGV4dGVudCBzdHJ1Y3R1cmVzIGFyZSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0gYnVncyBvciBib3VuZHMgaXNzdWVzIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4vVUJTQU4gYnVpbGRzLiBDb25zZXF1ZW50bHksIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[1] Phase: Succeeded StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 03:48:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 03:48:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2] Phase: Succeeded StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 03:49:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-10 03:48:56 +0000 UTC FinishedAt: 2026-09-10 03:49:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2774646873/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-10 03:49:06 +0000 UTC FinishedAt: 2026-09-10 04:05:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-10 03:49:06 +0000 UTC FinishedAt: 2026-09-10 04:05:08 +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:*5ac09cf4-64b3-4219-9bf4-9015dd5da0ea,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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2774646873/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": "1234a94a-8fdc-4e13-9518-60ce7535e789", "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-workflow5mgbp/series-workflow5mgbp-build-action-3772113143/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-10 03:49:06 +0000 UTC FinishedAt: 2026-09-10 04:04:58 +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:*5ac09cf4-64b3-4219-9bf4-9015dd5da0ea,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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2774646873/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": "1234a94a-8fdc-4e13-9518-60ce7535e789", "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-workflow5mgbp/series-workflow5mgbp-build-action-3772113143/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-10 04:05:08 +0000 UTC FinishedAt: 2026-09-10 04:05:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-10 04:05:08 +0000 UTC FinishedAt: 2026-09-10 04:05:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-10 04:05:08 +0000 UTC FinishedAt: 2026-09-10 04:05:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-10 04:05:08 +0000 UTC FinishedAt: 2026-09-10 04:05:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2309034028/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-10 04:05:19 +0000 UTC FinishedAt: 2026-09-10 04:07:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-10 04:05:19 +0000 UTC FinishedAt: 2026-09-10 04:07:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1234a94a-8fdc-4e13-9518-60ce7535e789,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-workflow5mgbp/series-workflow5mgbp-build-action-3772113143/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-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-10 04:07:27 +0000 UTC FinishedAt: 2026-09-10 04:07:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-10 04:07:27 +0000 UTC FinishedAt: 2026-09-10 04:07:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-10 04:07:27 +0000 UTC FinishedAt: 2026-09-10 04:23:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-10 04:07:27 +0000 UTC FinishedAt: 2026-09-10 04:23:20 +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:*5ac09cf4-64b3-4219-9bf4-9015dd5da0ea,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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2309034028/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": "4f7389d7-c52d-4a92-b97b-0584553a0f56", "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-workflow5mgbp/series-workflow5mgbp-build-action-4139947720/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-10 04:07:27 +0000 UTC FinishedAt: 2026-09-10 04:23:10 +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:*5ac09cf4-64b3-4219-9bf4-9015dd5da0ea,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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2309034028/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": "4f7389d7-c52d-4a92-b97b-0584553a0f56", "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-workflow5mgbp/series-workflow5mgbp-build-action-4139947720/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-10 04:23:20 +0000 UTC FinishedAt: 2026-09-10 04:23:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-10 04:23:20 +0000 UTC FinishedAt: 2026-09-10 04:23:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-10 04:23:20 +0000 UTC FinishedAt: 2026-09-10 04:25:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-10 04:23:20 +0000 UTC FinishedAt: 2026-09-10 04:25:02 +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:*4f7389d7-c52d-4a92-b97b-0584553a0f56,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-workflow5mgbp/series-workflow5mgbp-build-action-4139947720/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-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*1234a94a-8fdc-4e13-9518-60ce7535e789,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4f7389d7-c52d-4a92-b97b-0584553a0f56,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-workflow5mgbp/series-workflow5mgbp-build-action-3772113143/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-workflow5mgbp/series-workflow5mgbp-build-action-4139947720/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 04:25:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 04:25:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow5mgbp/series-workflow5mgbp-convert-artifact-2399959317/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 04:25:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 04:25:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-10 04:25:12 +0000 UTC FinishedAt: 2026-09-10 04:25:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-10 04:25:22 +0000 UTC FinishedAt: 2026-09-10 07:29:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5mgbp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_migrate","update_extent_range"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"ca532136-4f05-41fa-a842-2965978a3d56","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-10 04:25:22 +0000 UTC FinishedAt: 2026-09-10 07:29:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1234a94a-8fdc-4e13-9518-60ce7535e789,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4f7389d7-c52d-4a92-b97b-0584553a0f56,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-workflow5mgbp/series-workflow5mgbp-build-action-3772113143/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-workflow5mgbp/series-workflow5mgbp-build-action-4139947720/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-workflow5mgbp/series-workflow5mgbp-convert-artifact-2399959317/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,}