Name: series-workfloww8dtz Phase: Succeeded StartedAt: 2026-09-14 08:41:57 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[0] Phase: Succeeded StartedAt: 2026-09-14 08:41:57 +0000 UTC FinishedAt: 2026-09-14 08:50:51 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[0].run-triage Phase: Succeeded StartedAt: 2026-09-14 08:41:57 +0000 UTC FinishedAt: 2026-09-14 08:50:51 +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": "b477e560-8a06-4fc5-af74-c5727d587d81" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "update_extent_range", "ext4_ext_migrate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "base_tree": "torvalds" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+N208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cblxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC0xNCw3ICYjNDM7MTQsNyBAQFxuICAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxuICAqL1xuIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG4tXHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiYjNDM7XHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiB9O1xuIFxuQEAgLTY2LDYgJiM0Mzs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuJiM0MztcbiYjNDM7XHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcbiBcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCA1ZDYwZWYxMGZlMTEwLi45YWVkNGZkYWU2Nzg3IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtMTQsNyAmIzQzOzE0LDcgQEAKICAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudAogICovCiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgewotCWV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwomIzQzOwl1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7CiAJZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7CiB9OwogCkBAIC02Niw2ICYjNDM7NjYsMTAgQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYikKIHsKIAlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiAJLyoKIAkgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cykKIAkgKi8KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk1NwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBNaWdyYXRpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW4uIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIGFwcGxpZWQgdG8gYGZzL2V4dDQvbWlncmF0ZS5jYCwgYW5kIG15IGluaXRpYWwgYXBwcm9hY2ggaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaXRzIGltcGFjdC4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGl0c2VsZi4gSSYjMzk7bGwgemVybyBpbiBvbiB0aGUgY2hhbmdlcyBhcm91bmQgbGluZXMgMTQgYW5kIDY2IHNwZWNpZmljYWxseSwgYXMgdGhlc2UgYXJlIG9mdGVuIGhvdCBzcG90cyBmb3IgY3J1Y2lhbCBsb2dpYyBvciBkYXRhIHN0cnVjdHVyZSBtb2RpZmljYXRpb25zLiBUaGVuLCB0byBnZXQgdGhlIGNvbXBsZXRlIHBpY3R1cmUsIEkmIzM5O2xsIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgdGhlIHdob2xlIGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGFyb3VuZCB0aGUgbGluZXMgSSYjMzk7dmUgaWRlbnRpZmllZCwgYW5kIGFsbG93IG1lIHRvIHVuZGVyc3RhbmQgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBwYXJ0aWN1bGFyIHBhdGNoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXG4gICAyOlx0LypcbiAgIDM6XHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XG4gICA0Olx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVx1MDAzZVxuICAgNTpcdCAqXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9qYmQyLmhcJiMzNDtcbiAgMTA6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2V4dGVudHMuaFwmIzM0O1xuICAxMTpcdFxuICAxMjpcdC8qXG4gIDEzOlx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXG4gIDE0Olx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gIDE1Olx0ICovXG4gIDE2Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbiAgMTc6XHRcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFxuICA3MDpcdFx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbiAgNzE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuICA3MjpcdFxuICA3MzpcdFx0LypcbiAgNzQ6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3NTpcdFx0ICovXG4gIDc2Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3NzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzg6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbiAgNzk6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDgwOlx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4MTpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODI6XHRcdFx0cmV0dXJuIDA7XG4gIDgzOlx0XHR9XG4gIDg0Olx0XHQvKlxuICA4NTpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDg2Olx0XHQgKi9cbiAgODc6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg4Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODk6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDkwOlx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgOTE6XHRcdHJldHVybiByZXR2YWw7XG4gIDkyOlx0fVxuICA5MzpcdFxuICA5NDpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTU6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDk2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NzpcdHtcbiAgOTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk5Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ2NTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGBtaWdyYXRlLmNgIGluIHRoZSBleHQ0IEZpbGVzeXN0ZW0qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGUgZXh0NCBmaWxlc3lzdGVtIGFnYWluLCBhbmQgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLiBNeSBmaXJzdCB0aG91Z2h0IGlzLCAmIzM0O1doZXJlJiMzOTtzIHRoZSBlbnRyeSBwb2ludD8gV2hlcmUgaXMgYG1pZ3JhdGUuY2AgYWN0dWFsbHkgKnVzZWQqIHdpdGhpbiB0aGUgbGFyZ2VyIGV4dDQgc3RydWN0dXJlPyYjMzQ7IEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGlvY3RscyBvciBzeXNjYWxscyB0cmlnZ2VyIHRoZSBjb2RlIGluIGBtaWdyYXRlLmNgLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O2xsIHN0YXJ0IGJ5IGRvaW5nIGEgdGFyZ2V0ZWQgc2VhcmNoIGZvciBmdW5jdGlvbnMgKndpdGhpbiogYGZzL2V4dDQvbWlncmF0ZS5jYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQuIE9uY2UgSSB1bmRlcnN0YW5kIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscywgSSBjYW4gdHJhY2UgYmFjayB0byB0aGUgaW5pdGlhdGluZyBwb2ludHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9MzI1ND1pbnQgZXh0NF9mb3JjZV9zaHV0ZG93bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgZmxhZ3MpO1xuLS1cbmZzL2V4dDQvZXh0NC5oLTMyNTYtLyogbWlncmF0ZS5jICovXG5mcy9leHQ0L2V4dDQuaDozMjU3OmV4dGVybiBpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKik7XG5mcy9leHQ0L2V4dDQuaC0zMjU4LWV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbi0tXG5mcy9leHQ0L2lvY3RsLmM9NTkwPXN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvaW9jdGwuYy03MDUtXHRcdGlmIChmbGFncyBcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKVxuZnMvZXh0NC9pb2N0bC5jOjcwNjpcdFx0XHRlcnIgPSBleHQ0X2V4dF9taWdyYXRlKGlub2RlKTtcbmZzL2V4dDQvaW9jdGwuYy03MDctXHRcdGVsc2Vcbi0tXG5mcy9leHQ0L2lvY3RsLmM9MTUzOD1zdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL2V4dDQvaW9jdGwuYy0xNzAxLVx0XHRpbm9kZV9sb2NrKChpbm9kZSkpO1xuZnMvZXh0NC9pb2N0bC5jOjE3MDI6XHRcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xuZnMvZXh0NC9pb2N0bC5jLTE3MDMtXHRcdGlub2RlX3VubG9jaygoaW5vZGUpKTtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0zOTQ9c3RhdGljIGludCBmcmVlX2V4dF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQxMy1cbmZzL2V4dDQvbWlncmF0ZS5jOjQxNDppbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9taWdyYXRlLmMtNDE1LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzA5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24gQ2FsbCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGlzIGJlaW5nIHV0aWxpemVkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJJiMzOTt2ZSBub3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZnJvbSB0d28gc3BlY2lmaWMgbG9jYXRpb25zLiBUaGUgZmlyc3QgaXMgd2l0aGluIGBleHQ0X2lvY3RsX3NldGZsYWdzYCwgc3BlY2lmaWNhbGx5IHdoZW4gdGhlIGBGU19JT0NfU0VURkxBR1NgIGlvY3RsIGlzIHVzZWQgdG8gc2V0IHRoZSBgRVhUNF9FWFRFTlRTX0ZMYCBmbGFnLiBNYWtlcyBzZW5zZTsgdGhhdCYjMzk7cyB3aGVuIHdlJiMzOTtkIGV4cGVjdCBhbiBleHRlbnQgbWlncmF0aW9uIHRvIHBvdGVudGlhbGx5IG9jY3VyIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgZmlsZXN5c3RlbSYjMzk7cyBiZWhhdmlvci4gVGhlIHNlY29uZCBwb2ludCBvZiBjYWxsIGlzIGBFWFQ0X0lPQ19NSUdSQVRFYCwgd2hpY2ggaXMgYW5vdGhlciBpb2N0bCwgbGlrZWx5IGEgZGlyZWN0IG1pZ3JhdGlvbiByZXF1ZXN0LgoKVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSBjb250ZXh0LCBteSBuZXh0IG1vdmUgaXMgdG8gZGl2ZSBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGFyb3VuZCBsaW5lIDE3MDAgb2YgdGhhdCBmaWxlLiBUaGlzIHNob3VsZCBnaXZlIG1lIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBoZWxwIG1lIGRldGVybWluZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGlvY3RsIGNhbGxzLCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBiYWNrZ3JvdW5kIHRvIGZ1bGx5IGFuYWx5emUgaG93IHRoZXNlIG1pZ3JhdGlvbnMgYXJlIGJlaW5nIHRyaWdnZXJlZC4gSXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmb3JtIGEgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIHdvcmtzIGFuZCB0aGUgbG9naWMgYmVoaW5kIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY5NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjk1Olx0XHRcdC8qXG4xNjk2Olx0XHRcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxuMTY5NzpcdFx0XHQgKiBSZWFkIHN0aWxsIGdvZXMgdGhyb3VnaC4gV2UgdGFrZSBpX2RhdGFfc2VtIGluXG4xNjk4Olx0XHRcdCAqIGV4dDRfZXh0X3N3YXBfaW5vZGVfZGF0YSBiZWZvcmUgd2Ugc3dpdGNoIHRoZVxuMTY5OTpcdFx0XHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxuMTcwMDpcdFx0XHQgKi9cbjE3MDE6XHRcdFx0aW5vZGVfbG9jaygoaW5vZGUpKTtcbjE3MDI6XHRcdFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XG4xNzAzOlx0XHRcdGlub2RlX3VubG9jaygoaW5vZGUpKTtcbjE3MDQ6XHRcdFx0bW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTtcbjE3MDU6XHRcdFx0cmV0dXJuIGVycjtcbjE3MDY6XHRcdH1cbjE3MDc6XHRcbjE3MDg6XHRcdGNhc2UgRVhUNF9JT0NfQUxMT0NfREFfQkxLUzpcbjE3MDk6XHRcdHtcbjE3MTA6XHRcdFx0aW50IGVycjtcbjE3MTE6XHRcdFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXG4xNzEyOlx0XHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4xNzEzOlx0XG4xNzE0Olx0XHRcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTk4OQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkVYVDRfSU9DX01JR1JBVEUgRGVlcCBEaXZlKioKCkFscmlnaHQsIHNvIEkmIzM5O20gZm9jdXNpbmcgaW4gb24gYEVYVDRfSU9DX01JR1JBVEVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgbWVjaGFuaWNzLCBzbyBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIGNvZGUuIExpbmUgMTY5MCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50LCBidXQgSSYjMzk7bGwgcGxheSBpdCBzYWZlIGFuZCBzY29wZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dCBmb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZy4gSSYjMzk7bGwgdGFrZSBhIGxvb2sgYXQgdGhlIGNvZGUgYmxvY2sgc3Bhbm5pbmcgbGluZXMgMTY4MCB0aHJvdWdoIDE3MDAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBncmFzcCB0aGUgaW50ZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHNwZWNpZmljIGZlYXR1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjgwOlx0XHRcdFx0XHRzaXplb2YoaW5wdXQpKSlcbjE2ODE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjE2ODI6XHRcbjE2ODM6XHRcdFx0cmV0dXJuIGV4dDRfaW9jdGxfZ3JvdXBfYWRkKGZpbHAsIFx1MDAyNmlucHV0KTtcbjE2ODQ6XHRcdH1cbjE2ODU6XHRcbjE2ODY6XHRcdGNhc2UgRVhUNF9JT0NfTUlHUkFURTpcbjE2ODc6XHRcdHtcbjE2ODg6XHRcdFx0aW50IGVycjtcbjE2ODk6XHRcdFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXG4xNjkwOlx0XHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4xNjkxOlx0XG4xNjkyOlx0XHRcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XG4xNjkzOlx0XHRcdGlmIChlcnIpXG4xNjk0Olx0XHRcdFx0cmV0dXJuIGVycjtcbjE2OTU6XHRcdFx0LypcbjE2OTY6XHRcdFx0ICogaW5vZGVfbXV0ZXggcHJldmVudCB3cml0ZSBhbmQgdHJ1bmNhdGUgb24gdGhlIGZpbGUuXG4xNjk3Olx0XHRcdCAqIFJlYWQgc3RpbGwgZ29lcyB0aHJvdWdoLiBXZSB0YWtlIGlfZGF0YV9zZW0gaW5cbjE2OTg6XHRcdFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXG4xNjk5Olx0XHRcdCAqIGlub2RlIGZvcm1hdCB0byBwcmV2ZW50IHJlYWQuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0ODAKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA4NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIEVYVDQgTWlncmF0aW9uIExvZ2ljKioKCk9rYXksIHNvIGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgY2FuIHRyaWdnZXIgdGhlIGBleHQ0X2V4dF9taWdyYXRlKClgIGZ1bmN0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGlzIG1pZ3JhdGlvbiwgc28gbGV0JiMzOTtzIGNoZWNrIG91dCBgZnMvZXh0NC9taWdyYXRlLmNgLiBJIG5lZWQgdG8gZmlndXJlIG91dCAqd2h5KiB0aGlzIGNvbW1pdCB3YXMgbWFkZSBpbiB0aGUgZmlyc3QgcGxhY2UsIGFuZCB3aGF0IHByb2JsZW0gaXQmIzM5O3MgYWRkcmVzc2luZy4gTXkgcHJpbWFyeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSAqZG9lcyouCgpJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSBhcm91bmQgYGV4dDRfZXh0X21pZ3JhdGVgIHdpdGhpbiB0aGF0IGZpbGUuIEkgYWxzbyB3YW50IHRvIHNlZSB3aG8gY2FsbHMgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhbmQgaG93IHRoYXQgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggZXh0ZW50cywgdGhpcyB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNsdWVzIHRvIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbSBhbmQgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBvZiB0aGlzIG1pZ3JhdGlvbiBwcm9jZXNzLiBUaGlzIHdpbGwgaGVscCBtZSBidWlsZCBhIGdvb2QgbWVudGFsIG1vZGVsIG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDEwOlx0XHR9XG4gNDExOlx0XHRyZXR1cm4gcmV0dmFsO1xuIDQxMjpcdH1cbiA0MTM6XHRcbiA0MTQ6XHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDQxNTpcdHtcbiA0MTY6XHRcdGhhbmRsZV90ICpoYW5kbGU7XG4gNDE3Olx0XHRpbnQgcmV0dmFsID0gMCwgaTtcbiA0MTg6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDQxOTpcdFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7XG4gNDIwOlx0XHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XG4gNDIxOlx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XG4gNDIyOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzO1xuIDQyMzpcdFx0X191MzIgZ29hbCwgdG1wX2NzdW1fc2VlZDtcbiA0MjQ6XHRcdHVpZF90IG93bmVyWzJdO1xuIDQyNTpcdFx0aW50IGFsbG9jX2N0eDtcbiA0MjY6XHRcbiA0Mjc6XHRcdC8qXG4gNDI4Olx0XHQgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZVxuIDQyOTpcdFx0ICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC5cbiA0MzA6XHRcdCAqL1xuIDQzMTpcdFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXHUwMDNlaV9zYikgfHxcbiA0MzI6XHRcdCAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSB8fFxuIDQzMzpcdFx0ICAgIGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpZiAoU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpIFx1MDAyNlx1MDAyNiBpbm9kZS1cdTAwM2VpX2Jsb2NrcyA9PSAwKVxuIDQzNzpcdFx0XHQvKlxuIDQzODpcdFx0XHQgKiBkb24mIzM5O3QgbWlncmF0ZSBmYXN0IHN5bWxpbmtcbiA0Mzk6XHRcdFx0ICovXG4gNDQwOlx0XHRcdHJldHVybiByZXR2YWw7XG4gNDQxOlx0XG4gNDQyOlx0XHRhbGxvY19jdHggPSBleHQ0X3dyaXRlcGFnZXNfZG93bl93cml0ZShpbm9kZS1cdTAwM2VpX3NiKTtcbiA0NDM6XHRcbiA0NDQ6XHRcdC8qXG4gNDQ1Olx0XHQgKiBXb3JzdCBjYXNlIHdlIGNhbiB0b3VjaCB0aGUgYWxsb2NhdGlvbiBiaXRtYXBzIGFuZCBhIGJsb2NrXG4gNDQ2Olx0XHQgKiBncm91cCBkZXNjcmlwdG9yIGJsb2NrLiAgV2UgZG8gbmVlZCB0byB3b3JyeSBhYm91dFxuIDQ0NzpcdFx0ICogY3JlZGl0cyBmb3IgbW9kaWZ5aW5nIHRoZSBxdW90YSBpbm9kZS5cbiA0NDg6XHRcdCAqL1xuIDQ0OTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsXG4gNDUwOlx0XHRcdDMgJiM0MzsgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLVx1MDAzZWlfc2IpKTtcbiA0NTE6XHRcbiA0NTI6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDQ1MzpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNDU0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NTU6XHRcdH1cbiA0NTY6XHRcdC8qXG4gNDU3Olx0XHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUmIzM5O3MgYmxvY2sgbWFwcGluZyBsYXlvdXRcbiA0NTg6XHRcdCAqIChpbmRpcmVjdCB0byBleHRlbnRzKSBhbmQgaXMgbm90IHRyYWNrZWQgaW4gdGhlIGZhc3QgY29tbWl0XG4gNDU5Olx0XHQgKiBsb2csIHNvIGRpc2FibGUgZmFzdCBjb21taXRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuIDQ2MDpcdFx0ICovXG4gNDYxOlx0XHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShpbm9kZS1cdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xuIDQ2MjpcdFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXHUwMDNlaV9pbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgKlxuIDQ2MzpcdFx0XHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXHUwMDNlaV9zYikpICYjNDM7IDE7XG4gNDY0Olx0XHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xuIDQ2NTpcdFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcbiA0NjY6XHRcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCksXG4gNDY3Olx0XHRcdFx0XHQgICBTX0lGUkVHLCBOVUxMLCBnb2FsLCBvd25lciwgMCk7XG4gNDY4Olx0XHRpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHtcbiA0Njk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xuIDQ3MDpcdFx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDQ3MTpcdFx0XHR0bXBfaW5vZGUgPSBOVUxMO1xuIDQ3MjpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gNDczOlx0XHR9XG4gNDc0Olx0XHQvKlxuIDQ3NTpcdFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJiMzOTtpbm9kZSYjMzk7KS4gIFRoaXNcbiA0NzY6XHRcdCAqIGlzIHNvIHRoYXQgdGhlIG1ldGFkYXRhIGJsb2NrcyB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgY2hlY2tzdW0gYWZ0ZXJcbiA0Nzc6XHRcdCAqIHRoZSBtaWdyYXRpb24uXG4gNDc4Olx0XHQgKi9cbiA0Nzk6XHRcdGVpID0gRVhUNF9JKGlub2RlKTtcbiA0ODA6XHRcdHRtcF9jc3VtX3NlZWQgPSBFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0ODE6XHRcdEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkID0gZWktXHUwMDNlaV9jc3VtX3NlZWQ7XG4gNDgyOlx0XHRpX3NpemVfd3JpdGUodG1wX2lub2RlLCBpX3NpemVfcmVhZChpbm9kZSkpO1xuIDQ4MzpcdFx0LypcbiA0ODQ6XHRcdCAqIFNldCB0aGUgaV9ubGluayB0byB6ZXJvIHNvIGl0IHdpbGwgYmUgZGVsZXRlZCBsYXRlclxuIDQ4NTpcdFx0ICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS5cbiA0ODY6XHRcdCAqL1xuIDQ4NzpcdFx0Y2xlYXJfbmxpbmsodG1wX2lub2RlKTtcbiA0ODg6XHRcbiA0ODk6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNDkwOlx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDQ5MTpcdFxuIDQ5MjpcdFx0LypcbiA0OTM6XHRcdCAqIHN0YXJ0IHdpdGggb25lIGNyZWRpdCBhY2NvdW50ZWQgZm9yXG4gNDk0Olx0XHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cbiA0OTU6XHRcdCAqXG4gNDk2Olx0XHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxuIDQ5NzpcdFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXG4gNDk4Olx0XHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxuIDQ5OTpcdFx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNDgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgYGV4dDRfZXh0X21pZ3JhdGVgIGZyb20gNTAwIHRvIDYwMDoKCioqQW5hbHl6aW5nIGV4dDRfZXh0X21pZ3JhdGU6IExpbmVzIDUwMC02MDAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkmIzM5O20gZm9jdXNpbmcgb24gbGluZXMgNTAwLTYwMCBpbiBgZXh0NF9leHRfbWlncmF0ZWAuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgc2VjdGlvbiBpcyBwcm9iYWJseSBkZWFsaW5nIHdpdGggdGhlIGludHJpY2F0ZSBwcm9jZXNzIG9mIGFjdHVhbGx5ICptb3ZpbmcqIGRhdGEgYmxvY2tzIGR1cmluZyBhbiBleHRlbnQtYmFzZWQgbWlncmF0aW9uLCBvciwgaWYgbm90IG1vdmluZywgc2V0dGluZyB1cCB0aGUgbWFwcGluZyBzbyB0aGF0IG1vdmluZyBjYW4gaGFwcGVuLiBHaXZlbiB0aGUgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24mIzM5O3MgbmFtZSwgdGhhdCYjMzk7cyB3aGF0IEkmIzM5O2QgZXhwZWN0LiBJJiMzOTtsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGRldGFpbHMgYXJvdW5kIGJsb2NrIGFsbG9jYXRpb24sIHRoZSBoYW5kbGluZyBvZiBpbmRpcmVjdCBibG9ja3MgKGVzcGVjaWFsbHkgaWYgdGhlIG1pZ3JhdGlvbiBpbnZvbHZlcyBhIGZpbGUgdGhhdCBoYXMgZ3Jvd24gYmV5b25kIGl0cyBpbml0aWFsIGxheW91dCksIGFuZCBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgZXJyb3ItaGFuZGxpbmcgdGhhdCBtaWdodCBjb21lIGludG8gcGxheSBkdXJpbmcgdGhpcyBjcml0aWNhbCBvcGVyYXRpb24uIEFyZSB0aGVyZSBjaGVja3MgZm9yIGRhdGEgY29uc2lzdGVuY3k/IFdoYXQgYWJvdXQgam91cm5hbGluZyBjb25jZXJucz8gSSYjMzk7bSBjdXJpb3VzIHRvIHNlZSBob3cgdGhlIHN5c3RlbSBlbnN1cmVzIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZCBjb3JyZWN0bHksIGVzcGVjaWFsbHkgaW4gdGhlIGZhY2Ugb2YgcG9zc2libGUgc3lzdGVtIGludGVycnVwdGlvbnMuIEkmIzM5O20gZ29pbmcgdG8gYmUgbG9va2luZyBmb3IgY2x1ZXMgb24gaG93IHRoZSBleHRlbnQgdHJlZSBpcyBtb2RpZmllZCB0aHJvdWdob3V0IHRoaXMgb3BlcmF0aW9uLiBJJiMzOTttIGV4cGVjdGluZyBzb21lIGtpbmQgb2YgbG9vcCBpdGVyYXRpb24sIHByb2JhYmx5IG9uIGV4dGVudHMsIHdpdGggZGV0YWlsZWQgc3RlcHMgdG8gbWFpbnRhaW4gZGF0YSBpbnRlZ3JpdHkgYW5kIGNvbnNpc3RlbmN5LiBJIGFsc28gc3VzcGVjdCB0aGVyZSB3aWxsIGJlIHNvbWUgY2hlY2tzIG9yIGludGVyYWN0aW9ucyByZWxhdGVkIHRvIG1ldGFkYXRhIHVwZGF0ZXMsIHNpbmNlIHdlJiMzOTtyZSByZWFycmFuZ2luZyBibG9ja3MuIEZpbmFsbHksIEkmIzM5O20gZXhwZWN0aW5nIHNvbWUgbGV2ZWwgb2YgY29tcGxleGl0eS4gRXh0ZW50IG1pZ3JhdGlvbiBpcyBhIHNvcGhpc3RpY2F0ZWQgcHJvY2VzcywgYW5kIHRoZSBjb3JlIG9mIHRoZSB3b3JrLCB0aGF0JiMzOTtzIHdoeSB0aGVzZSBsaW5lcyBhcmUgaW1wb3J0YW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTAwOlx0XHQvKlxuIDUwMTpcdFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xuIDUwMjpcdFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcbiA1MDM6XHRcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxuIDUwNDpcdFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxuIDUwNTpcdFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xuIDUwNjpcdFx0ICogYWxsb2NhdGlvbi5cbiA1MDc6XHRcdCAqL1xuIDUwODpcdFx0ZG93bl9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG4gNTA5Olx0XHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XG4gNTEwOlx0XHR1cF9yZWFkKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiA1MTE6XHRcbiA1MTI6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcbiA1MTM6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDUxNDpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNTE1Olx0XHRcdGdvdG8gb3V0X3RtcF9pbm9kZTtcbiA1MTY6XHRcdH1cbiA1MTc6XHRcbiA1MTg6XHRcdGlfZGF0YSA9IGVpLVx1MDAzZWlfZGF0YTtcbiA1MTk6XHRcdG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XG4gNTIwOlx0XG4gNTIxOlx0XHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXG4gNTIyOlx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gNTIzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFWFQ0X05ESVJfQkxPQ0tTOyBpJiM0MzsmIzQzOykge1xuIDUyNDpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gNTI1Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MjY6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBcdTAwMjZsYik7XG4gNTI3Olx0XHRcdFx0aWYgKHJldHZhbClcbiA1Mjg6XHRcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1Mjk6XHRcdFx0fSBlbHNlXG4gNTMwOlx0XHRcdFx0bGIuY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gNTMxOlx0XHR9XG4gNTMyOlx0XHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xuIDUzMzpcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MzQ6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcdTAwMjZsYik7XG4gNTM1Olx0XHRcdGlmIChyZXR2YWwpXG4gNTM2Olx0XHRcdFx0Z290byBlcnJfb3V0O1xuIDUzNzpcdFx0fSBlbHNlXG4gNTM4Olx0XHRcdGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDUzOTpcdFx0aWYgKGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSB7XG4gNTQwOlx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDE6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0MjpcdFx0XHRpZiAocmV0dmFsKVxuIDU0MzpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NDQ6XHRcdH0gZWxzZVxuIDU0NTpcdFx0XHRsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDU0NjpcdFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XG4gNTQ3Olx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDg6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0OTpcdFx0XHRpZiAocmV0dmFsKVxuIDU1MDpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NTE6XHRcdH1cbiA1NTI6XHRcdC8qXG4gNTUzOlx0XHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcbiA1NTQ6XHRcdCAqL1xuIDU1NTpcdFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcdTAwMjZsYik7XG4gNTU2Olx0ZXJyX291dDpcbiA1NTc6XHRcdGlmIChyZXR2YWwpXG4gNTU4Olx0XHRcdC8qXG4gNTU5Olx0XHRcdCAqIEZhaWx1cmUgY2FzZSBkZWxldGUgdGhlIGV4dGVudCBpbmZvcm1hdGlvbiB3aXRoIHRoZVxuIDU2MDpcdFx0XHQgKiB0bXBfaW5vZGVcbiA1NjE6XHRcdFx0ICovXG4gNTYyOlx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NjM6XHRcdGVsc2Uge1xuIDU2NDpcdFx0XHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcbiA1NjU6XHRcdFx0aWYgKHJldHZhbClcbiA1NjY6XHRcdFx0XHQvKlxuIDU2NzpcdFx0XHRcdCAqIGlmIHdlIGZhaWwgdG8gc3dhcCBpbm9kZSBkYXRhIGZyZWUgdGhlIGV4dGVudFxuIDU2ODpcdFx0XHRcdCAqIGRldGFpbHMgb2YgdGhlIHRtcCBpbm9kZVxuIDU2OTpcdFx0XHRcdCAqL1xuIDU3MDpcdFx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NzE6XHRcdH1cbiA1NzI6XHRcbiA1NzM6XHRcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuIDU3NDpcdFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4gNTc1Olx0XHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuIDU3NjpcdFx0XHRnb3RvIG91dF9zdG9wO1xuIDU3NzpcdFx0LypcbiA1Nzg6XHRcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cbiA1Nzk6XHRcdCAqL1xuIDU4MDpcdFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XG4gNTgxOlx0XG4gNTgyOlx0XHQvKlxuIDU4MzpcdFx0ICogc2V0IHRoZSAgaV9ibG9ja3MgY291bnQgdG8gemVyb1xuIDU4NDpcdFx0ICogc28gdGhhdCB0aGUgZXh0NF9ldmljdF9pbm9kZSgpIGRvZXMgdGhlXG4gNTg1Olx0XHQgKiByaWdodCBqb2JcbiA1ODY6XHRcdCAqXG4gNTg3Olx0XHQgKiBXZSBkb24mIzM5O3QgbmVlZCB0byB0YWtlIHRoZSBpX2xvY2sgYmVjYXVzZVxuIDU4ODpcdFx0ICogdGhlIGlub2RlIGlzIG5vdCB2aXNpYmxlIHRvIHVzZXIgc3BhY2UuXG4gNTg5Olx0XHQgKi9cbiA1OTA6XHRcdHRtcF9pbm9kZS1cdTAwM2VpX2Jsb2NrcyA9IDA7XG4gNTkxOlx0XHRFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XG4gNTkyOlx0XG4gNTkzOlx0XHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cbiA1OTQ6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNTk1Olx0b3V0X3N0b3A6XG4gNTk2Olx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDU5NzpcdG91dF90bXBfaW5vZGU6XG4gNTk4Olx0XHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XG4gNTk5Olx0b3V0X3VubG9jazpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAyMzMKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAzNjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGluIEV4dDQgQmxvY2sgTWFuYWdlbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZSBzbmlwcGV0LiBNeSBpbml0aWFsIHRob3VnaHQgaXMsICYjMzQ7V2hhdCYjMzk7cyB0aGUgc2l0dWF0aW9uIGhlcmU/JiMzNDsgSSYjMzk7bSBsb29raW5nIGF0IGxpbmVzIDUzOCBhbmQgNTQ1LCBzcGVjaWZpY2FsbHkgdGhpczogYGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO2AgYW5kIGBsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO2AuIEltbWVkaWF0ZWx5LCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O1dhaXQgYSBtaW51dGUsIHdoYXQgaGFwcGVucyBpZiBgbGIuY3Vycl9ibG9ja2Agb3ZlcmZsb3dzIG9yIGJlY29tZXMgbGFyZ2VyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYD8mIzM0OyBUaGF0IGNvdWxkIGNhdXNlIHNvbWUgc2VyaW91cyBwcm9ibGVtcyB3aXRoIGJsb2NrIGFsbG9jYXRpb24uCgpBaCwgaG9sZCBvbiEgVGhlcmUmIzM5O3MgYSByZWxldmFudCBwYXRjaCBoZXJlLiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZToKCmBgYGMKc3RydWN0IG1pZ3JhdGVfc3RydWN0IHsKLQlleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jazsKJiM0MzsJdTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwogCWV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrOwogfTsKIApAQCAtNjYsNiAmIzQzOzY2LDEwIEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpCiB7CiAJaW50IHJldHZhbDsKJiM0MzsKJiM0MzsJaWYgKGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwogCS8qCiAJICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpCiAJICovCmBgYAoKUmlnaHQsIHRoZXkmIzM5O3ZlIGFjdHVhbGx5IGFkZHJlc3NlZCB0aGlzIHdpdGggYSBjaGVjayBub3c6IGBpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgLiBUaGF0JiMzOTtzIGdvb2Q7IGEgc2FuaXR5IGNoZWNrIGlzIGltcGxlbWVudGVkLCBidXQgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqIG9mIHRoaXMuCgpUaGVuIGl0IGhpdHMgbWUhIEkmIzM5O20gcmVtZW1iZXJpbmcgdGhhdCBgZXh0NF9sYmxrX3RgIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gVGhlIHBvdGVudGlhbCBmb3Igb3ZlcmZsb3cgaXMgZGVmaW5pdGVseSB0aGVyZSwgZXNwZWNpYWxseSBpbiBjYXNlcyB3aXRoIGRlZXBseSBpbmRpcmVjdC1tYXBwZWQgZmlsZXMgYW5kIGEgbGFyZ2UgYG1heF9lbnRyaWVzYC4gSW4gZmFjdCwgYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgY291bGQgcXVpY2tseSBleGNlZWQgdGhlIHJhbmdlIG9mIGEgMzItYml0IGludGVnZXIuIFRoYXQgaXMgdGhlIHZ1bG5lcmFiaWxpdHkuIEkgc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNvZGUgaW4gbW9yZSBkZXRhaWwuCgpOb3csIEkmIzM5O20gYXNraW5nIG15c2VsZi4uLiAmIzM0O1doYXQgKmlzKiBgRVhUX01BWF9CTE9DS1NgPyYjMzQ7IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbGltaXQgdG8gZnVsbHkgZ3Jhc3AgdGhlIGNvbnRleHQuIEkmIzM5O2xsIHNlYXJjaCBmb3IgaXRzIGRlZmluaXRpb24gdG8gY2xhcmlmeSB0aGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYVF9NQVhfQkxPQ0tTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zODk2PXN0cnVjdCBleHQ0X2V4dGVudDtcbi0tXG5mcy9leHQ0L2V4dDQuaC0zOTAxLSAqL1xuZnMvZXh0NC9leHQ0Lmg6MzkwMjojZGVmaW5lIEVYVF9NQVhfQkxPQ0tTXHQweGZmZmZmZmZmXG5mcy9leHQ0L2V4dDQuaC0zOTAzLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE1MzE9c3RhdGljIGludCBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjMzLSAqIGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrOlxuZnMvZXh0NC9leHRlbnRzLmM6MTYzNDogKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLUy5cbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzUtICogTk9URTogaXQgY29uc2lkZXJzIGJsb2NrIG51bWJlciBmcm9tIGluZGV4IGVudHJ5IGFzXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTY0MD1leHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ3LVx0aWYgKGRlcHRoID09IDAgXHUwMDI2XHUwMDI2IHBhdGgtXHUwMDNlcF9leHQgPT0gTlVMTClcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NDg6XHRcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDktXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTY2NC1cbmZzL2V4dDQvZXh0ZW50cy5jOjE2NjU6XHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0xNjY2LX1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY5LSAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazpcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NzA6ICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DS1NcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NzEtICovXG5mcy9leHQ0L2V4dGVudHMuYz0xNjcyPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTY4MC1cdGlmIChkZXB0aCA9PSAwKVxuZnMvZXh0NC9leHRlbnRzLmM6MTY4MTpcdFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY4Mi1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjkzLVxuZnMvZXh0NC9leHRlbnRzLmM6MTY5NDpcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTUtfVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5NDI9c3RhdGljIHVuc2lnbmVkIGludCBleHQ0X2V4dF9jaGVja19vdmVybGFwKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xOTYzLVx0XHRiMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MTk2NDpcdFx0aWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtMTk2NS1cdFx0XHRnb3RvIG91dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcwLVx0aWYgKGIxICYjNDM7IGxlbjEgXHUwMDNjIGIxKSB7XG5mcy9leHQ0L2V4dGVudHMuYzoxOTcxOlx0XHRsZW4xID0gRVhUX01BWF9CTE9DS1MgLSBiMTtcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzItXHRcdG5ld2V4dC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4xKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMTAyLVx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjIxMDM6XHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTA0LVx0aWYgKGxlMzJfdG9fY3B1KG5ld2V4dC1cdTAwM2VlZV9ibG9jaykgXHUwMDNlIGxlMzJfdG9fY3B1KGZleC1cdTAwM2VlZV9ibG9jaykpXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA1LVx0XHRuZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MjEwNjpcdGlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTA3LVx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqbnBhdGg7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjI4MD1zdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfZmluZF9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjI5MS1cdFx0KmxibGsgPSAwO1xuZnMvZXh0NC9leHRlbnRzLmM6MjI5MjpcdFx0bGVuID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0yMjkzLVx0fSBlbHNlIGlmICgqbGJsayBcdTAwM2MgbGUzMl90b19jcHUoZXgtXHUwMDNlZWVfYmxvY2spKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjYyMj1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjc2MS1cdFx0aWYgKG51bSA9PSAwKSB7XG5mcy9leHQ0L2V4dGVudHMuYzoyNzYyOlx0XHRcdGlmIChlbmQgIT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yNzYzLVx0XHRcdFx0Lypcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yODQ1PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mjg3OTpcdGlmIChlbmQgXHUwMDNjIEVYVF9NQVhfQkxPQ0tTIC0gMSkge1xuZnMvZXh0NC9leHRlbnRzLmMtMjg4MC1cdFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00NTUxPWludCBleHQ0X2V4dF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzAtXHRcdFx0XHUwMDNlXHUwMDNlIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzE6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XG5mcy9leHQ0L2V4dGVudHMuYy00NTcyLVxuZnMvZXh0NC9leHRlbnRzLmMtNDU3My1yZXRyeV9yZW1vdmVfc3BhY2U6XG5mcy9leHQ0L2V4dGVudHMuYzo0NTc0Olx0ZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpO1xuZnMvZXh0NC9leHRlbnRzLmMtNDU3NS1cdGlmIChlcnIgPT0gLUVOT01FTSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTUzNDI9aW50IGV4dDRfZ2V0X2VzX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTM3Ny1cdGxhc3RfYmxrID0gKHN0YXJ0ICYjNDM7IGxlbiAtIDEpIFx1MDAzZVx1MDAzZSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplX2JpdHM7XG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc4Olx0aWYgKGxhc3RfYmxrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc5Olx0XHRsYXN0X2JsayA9IEVYVF9NQVhfQkxPQ0tTLTE7XG5mcy9leHQ0L2V4dGVudHMuYy01MzgwLVx0bGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgJiM0MzsgMTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NDk0PWV4dDRfZXh0X3NoaWZ0X2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTAxLVx0ZXh0NF9sYmxrX3Qgc3RvcCwgKml0ZXJhdG9yLCBleF9zdGFydCwgZXhfZW5kO1xuZnMvZXh0NC9leHRlbnRzLmM6NTUwMjpcdGV4dDRfbGJsa190IHRtcCA9IEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtNTUwMy1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDQtXHQvKiBMZXQgcGF0aCBwb2ludCB0byB0aGUgbGFzdCBleHRlbnQgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjU1MDU6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNi1cdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTUxOS1cdCogYWNjb21tb2RhdGUgdGhlIHNoaWZ0LiAgRm9yIHJpZ2h0IHNoaWZ0cywgbWFrZSBzdXJlIHRoZSBsYXN0IGV4dGVudFxuZnMvZXh0NC9leHRlbnRzLmM6NTUyMDpcdCogd29uJiMzOTt0IGJlIHNoaWZ0ZWQgYmV5b25kIEVYVF9NQVhfQkxPQ0tTLlxuZnMvZXh0NC9leHRlbnRzLmMtNTUyMS1cdCovXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU0My1cdH0gZWxzZSB7XG5mcy9leHQ0L2V4dGVudHMuYzo1NTQ0Olx0XHRpZiAoc2hpZnQgXHUwMDNlIEVYVF9NQVhfQkxPQ0tTIC1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDUtXHRcdCAgICAoc3RvcCAmIzQzOyBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleHRlbnQpKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjItXG5mcy9leHQ0L2V4dGVudHMuYzo1NTYzOlx0aWYgKHRtcCAhPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjQtXHRcdCppdGVyYXRvciA9IHRtcDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NjM3PXN0YXRpYyBpbnQgZXh0NF9jb2xsYXBzZV9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01Njk1LVx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjU2OTY6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIEVYVF9NQVhfQkxPQ0tTIC0gc3RhcnRfbGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy01Njk3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU3Mzg9c3RhdGljIGludCBleHQ0X2luc2VydF9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01ODMyLVx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTgzMzpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzQtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTg3NT1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01OTMxLVx0XHRcdC8qIERvIHdlIGhhdmUgc29tZXRoaW5nIHRvIHN3YXAgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjU5MzI6XHRcdFx0aWYgKG5leHQxID09IEVYVF9NQVhfQkxPQ0tTIHx8IG5leHQyID09IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMy1cdFx0XHRcdGdvdG8gZXJyb3V0O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYyNTI9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjEtXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NjI2MjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy02MjYzLVx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYzMzk9aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjM1MC1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MzUxOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNTItXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTU5MT1zdGF0aWMgaW50IGV4dDRfZXNfY2FuX2JlX21lcmdlZChzdHJ1Y3QgZXh0ZW50X3N0YXR1cyAqZXMxLFxuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy01OTYtXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6NTk3Olx0aWYgKCgoX191NjQpIGVzMS1cdTAwM2Vlc19sZW4pICYjNDM7IGVzMi1cdTAwM2Vlc19sZW4gXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB7XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk4LVx0XHRwcl93YXJuKFwmIzM0O0VTIGFzc2VydGlvbiBmYWlsZWQgd2hlbiBtZXJnaW5nIGV4dGVudHMuIFwmIzM0O1xuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02MDAtXHRcdFx0XCYjMzQ7aXMgYmlnZ2VyIHRoYW4gYWxsb3dlZCBmaWxlIHNpemUgKCVkKVxcblwmIzM0OyxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2MDE6XHRcdFx0ZXMxLVx1MDAzZWVzX2xlbiwgZXMyLVx1MDAzZWVzX2xlbiwgRVhUX01BWF9CTE9DS1MpO1xuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMi1cdFx0V0FSTl9PTigxKTtcbi0tXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9MTk0Mz1zdGF0aWMgaW50IGVzX3JlY2xhaW1fZXh0ZW50cyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSwgaW50ICpucl90b19zY2FuKVxuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU3LVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjE5NTg6XHRpZiAoIWVzX2RvX3JlY2xhaW1fZXh0ZW50cyhlaSwgRVhUX01BWF9CTE9DS1MsIG5yX3RvX3NjYW4sIFx1MDAyNm5yX3NocnVuaykgXHUwMDI2XHUwMDI2XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtMTk1OS1cdCAgICBzdGFydCAhPSAwKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzE3PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzMzUtXHRcdGN1ciA9IDA7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjMzNjpcdFx0ZW5kID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNy1cdFx0aWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSkge1xuLS1cbmZzL2V4dDQvaW5kaXJlY3QuYz0xMTEyPXZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNS1cbmZzL2V4dDQvaW5kaXJlY3QuYzoxMTM2Olx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIGxhc3RfYmxvY2spO1xuZnMvZXh0NC9pbmRpcmVjdC5jLTExMzctXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xODYyPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTE5MDgtXHRcdGlmICghZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSkpXG5mcy9leHQ0L2lubGluZS5jOjE5MDk6XHRcdFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lubGluZS5jLTE5MTAtXG4tLVxuZnMvZXh0NC9pbm9kZS5jPTcwMD1pbnQgZXh0NF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTcyMi1cbmZzL2V4dDQvaW5vZGUuYzo3MjM6XHQvKiBXZSBjYW4gaGFuZGxlIHRoZSBibG9jayBudW1iZXIgbGVzcyB0aGFuIEVYVF9NQVhfQkxPQ0tTICovXG5mcy9leHQ0L2lub2RlLmM6NzI0Olx0aWYgKHVubGlrZWx5KG1hcC1cdTAwM2VtX2xibGsgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykpXG5mcy9leHQ0L2lub2RlLmMtNzI1LVx0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbi0tXG5mcy9leHQ0L2lub2RlLmM9MjE3Mz1zdGF0aWMgaW50IG1wYWdlX3Byb2Nlc3NfcGFnZV9idWZzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQsXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTIxODItXHRpZiAoZXh0NF92ZXJpdHlfaW5fcHJvZ3Jlc3MoaW5vZGUpKVxuZnMvZXh0NC9pbm9kZS5jOjIxODM6XHRcdGJsb2NrcyA9IEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9pbm9kZS5jLTIxODQtXG4tLVxuZnMvZXh0NC9pbm9kZS5jPTYwMDk9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2V4dDQvaW5vZGUuYy02MTcyLVx0XHRcdFx0XHRpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplX2JpdHMsXG5mcy9leHQ0L2lub2RlLmM6NjE3MzpcdFx0XHRcdFx0RVhUX01BWF9CTE9DS1MgLSAxKTtcbmZzL2V4dDQvaW5vZGUuYy02MTc0LVx0XHRcdGVsc2Vcbi0tXG5mcy9leHQ0L2lvY3RsLmM9MzEzPXN0YXRpYyB2b2lkIHN3YXBfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTM0MS1cdHN3YXAoZWkxLVx1MDAzZWlfZGlza3NpemUsIGVpMi1cdTAwM2VpX2Rpc2tzaXplKTtcbmZzL2V4dDQvaW9jdGwuYzozNDI6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUxLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lvY3RsLmM6MzQzOlx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMiwgMCwgRVhUX01BWF9CTE9DS1MpO1xuZnMvZXh0NC9pb2N0bC5jLTM0NC1cbi0tXG5mcy9leHQ0L21iYWxsb2MuYz00NTE5PWV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyxcbi0tXG5mcy9leHQ0L21iYWxsb2MuYy00NjA1LVx0LyogYXZvaWQgdW5uZWNlc3NhcnkgcHJlYWxsb2NhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIGFzc2VydGlvbnMgKi9cbmZzL2V4dDQvbWJhbGxvYy5jOjQ2MDY6XHRpZiAoc3RhcnQgJiM0Mzsgc2l6ZSBcdTAwM2UgRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA3Olx0XHRzaXplID0gRVhUX01BWF9CTE9DS1MgLSBzdGFydDtcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDgtXG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNjktXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcdGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L21pZ3JhdGUuYy03MS1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmZzL2V4dDQvbW92ZV9leHRlbnQuYz01MTc9c3RhdGljIGludCBtZXh0X2NoZWNrX2FkanVzdF9yYW5nZShzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsXG4tLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzMC1cbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzE6XHRpZiAoKG9yaWdfc3RhcnQgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzI6XHQgICAgKGRvbm9yX3N0YXJ0IFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMzOlx0ICAgICgqbGVuIFx1MDAzZSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzQ6XHQgICAgKGRvbm9yX3N0YXJ0ICYjNDM7ICpsZW4gXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzU6XHQgICAgKG9yaWdfc3RhcnQgJiM0MzsgKmxlbiBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSkgIHtcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzYtXHRcdGV4dDRfZGVidWcoXCYjMzQ7ZXh0NCBtb3ZlIGV4dGVudDogQ2FuJiMzOTt0IGhhbmRsZSBvdmVyIFsldV0gYmxvY2tzIFtpbm86b3JpZyAlbGx1LCBkb25vciAlbGx1XVxcblwmIzM0OyxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1Mzc6XHRcdFx0ICAgRVhUX01BWF9CTE9DS1MsXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTM4LVx0XHRcdCAgIG9yaWdfaW5vZGUtXHUwMDNlaV9pbm8sIGRvbm9yX2lub2RlLVx1MDAzZWlfaW5vKTtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9MTUzOT12b2lkIGV4dDRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L3N1cGVyLmMtMTU2OC1cdHJlbW92ZV9pbm9kZV9oYXNoKGlub2RlKTtcbmZzL2V4dDQvc3VwZXIuYzoxNTY5Olx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L3N1cGVyLmMtMTU3MC1cdGRxdW90X2Ryb3AoaW5vZGUpO1xuLS1cbmZzL2V4dDQvdmVyaXR5LmM9MjcxPXN0YXRpYyBpbnQgZXh0NF9nZXRfdmVyaXR5X2Rlc2NyaXB0b3JfbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L3Zlcml0eS5jLTI5My1cbmZzL2V4dDQvdmVyaXR5LmM6Mjk0Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCwgMCk7XG5mcy9leHQ0L3Zlcml0eS5jLTI5NS1cdGlmIChJU19FUlIocGF0aCkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MjU2CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IEJsb2NrIE1pZ3JhdGlvbiBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYmxvY2sgbWlncmF0aW9uIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBhbmQgc29tZXRoaW5nIHNtZWxscyBmaXNoeSB3aXRoIHRoZSBibG9jayBudW1iZXJzLiBUaGUgY29kZSB1c2VzIGBFWFRfTUFYX0JMT0NLU2Agd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBhIGB1MzJgIHZhbHVlICgweGZmZmZmZmZmLCAyXjMyIC0gMSkuIFRoYXQmIzM5O3MgYSBodWdlIG51bWJlciwgYnV0Li4uCgpCZWZvcmUgdGhpcyBjb21taXQsIHRoZSBjcml0aWNhbCB2YXJpYWJsZXMgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdpdGhpbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBzdHJ1Y3Qgd2VyZSBhbHNvIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGlmIEkmIzM5O20gbm90IG1pc3Rha2VuLCBpcyBhbHNvIGEgYHUzMmAuIFRoaXMgaW1tZWRpYXRlbHkgcmFpc2VzIGEgcmVkIGZsYWcuIElmIGJsb2NrIG51bWJlcnMgdGhlbXNlbHZlcyBhcmUgYHUzMmAsIGhvdyBjYW4gdGhleSBwb3NzaWJseSByZXByZXNlbnQgYWxsIHRoZSBibG9ja3MgdXAgdG8gYEVYVF9NQVhfQkxPQ0tTYD8gVGhlcmUgaGFzIHRvIGJlIGFuIGludGVnZXIgb3ZlcmZsb3cgc29tZXdoZXJlLgoKTG9va2luZyBhdCB0aGUgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLCBhbmQgc3BlY2lmaWNhbGx5IHRoaXMgc25pcHBldDoKCmBgYGMKCQltYXhfZW50cmllcyA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSAmZ3Q7Jmd0OyAyOwouLi4KCQlpZiAoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pIHsKCQkJcmV0dmFsID0gdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLAoJCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgJmFtcDtsYik7CgkJCWlmIChyZXR2YWwpCgkJCQlnb3RvIGVycl9vdXQ7CgkJfQpgYGAKCk9rYXksIHRoZSBgbWF4X2VudHJpZXNgIGNhbGN1bGF0aW9uIHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2g6IGJsb2Nrc2l6ZSBkaXZpZGVkIGJ5IDQgKGxpa2VseSBmb3IgYW4gZXh0ZW50IGluZGV4KSwgYnV0IHRoYXQmIzM5O3Mgbm90IHRoZSBjcml0aWNhbCBwb2ludCBoZXJlLiBUaGUgaW1wb3J0YW50IHBhcnQgaXMgdGhlIGNhbGwgdG8gYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIHdpdGggYSBgbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pYCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCBhbmQgYWxzbyB0aGUgYGxiYCBzdHJ1Y3QuIElmIHRoZSBgbGJgIHN0cnVjdCAoY29udGFpbmluZyBgY3Vycl9ibG9ja2AsIHdoaWNoIGlzIGB1MzJgKSwgaXMgcGFzc2VkIHRvIHRoZSBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYCBmdW5jdGlvbiBhbG9uZyB3aXRoIGEgYHUzMmAgYmxvY2sgbnVtYmVyLCB0aGVuIHdlJiMzOTt2ZSBnb3QgYSBwb3RlbnRpYWwgb3ZlcmZsb3csIHJpZ2h0PyBBbmQgd2UgbmVlZCB0byB0cmFjZSB0aG9zZSBmdW5jdGlvbnMsIGxpa2UgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgc28gb24uIFRoZXkgY291bGQgYmUgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbS4gVGltZSB0byBkaWcgaW4hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEwMTpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTAyOlx0XG4gMTAzOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMDQ6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEwNTpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTA2Olx0XG4gMTA3Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEwODpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTA5Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMTA6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTExOlx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDExMjpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTEzOlx0XHRcdFx0XHRicmVhaztcbiAxMTQ6XHRcdFx0fSBlbHNlIHtcbiAxMTU6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAxMTY6XHRcdFx0fVxuIDExNzpcdFx0fVxuIDExODpcdFx0cHV0X2JoKGJoKTtcbiAxMTk6XHRcdHJldHVybiByZXR2YWw7XG4gMTIwOlx0XG4gMTIxOlx0fVxuIDEyMjpcdFxuIDEyMzpcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gMTI0Olx0XHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbiAxMjU6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIDEyNjpcdHtcbiAxMjc6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMTI4Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMjk6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEzMDpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTMxOlx0XG4gMTMyOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMzM6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEzNDpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTM1Olx0XG4gMTM2Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEzNzpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTM4Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMzk6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE0MDpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNDE6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE0MjpcdFx0XHRcdFx0YnJlYWs7XG4gMTQzOlx0XHRcdH0gZWxzZSB7XG4gMTQ0Olx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTQ1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXM7XG4gMTQ2Olx0XHRcdH1cbiAxNDc6XHRcdH1cbiAxNDg6XHRcdHB1dF9iaChiaCk7XG4gMTQ5Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDE1MDpcdFxuIDE1MTpcdH1cbiAxNTI6XHRcbiAxNTM6XHRzdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDE1NDpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTU1Olx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxNTY6XHR7XG4gMTU3Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDE1ODpcdFx0X19sZTMyICppX2RhdGE7XG4gMTU5Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxNjA6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDE2MTpcdFxuIDE2MjpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTYzOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxNjQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDE2NTpcdFxuIDE2NjpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxNjc6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDE2ODpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTY5Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTcwOlx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDE3MTpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTcyOlx0XHRcdFx0XHRicmVhaztcbiAxNzM6XHRcdFx0fSBlbHNlIHtcbiAxNzQ6XHRcdFx0XHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cbiAxNzU6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDE3NjpcdFx0XHR9XG4gMTc3Olx0XHR9XG4gMTc4Olx0XHRwdXRfYmgoYmgpO1xuIDE3OTpcdFx0cmV0dXJuIHJldHZhbDtcbiAxODA6XHRcbiAxODE6XHR9XG4gMTgyOlx0XG4gMTgzOlx0c3RhdGljIGludCBmcmVlX2RpbmRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsXG4gMTg0Olx0XHRcdFx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgaV9kYXRhKVxuIDE4NTpcdHtcbiAxODY6XHRcdGludCBpO1xuIDE4NzpcdFx0X19sZTMyICp0bXBfaWRhdGE7XG4gMTg4Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDE4OTpcdFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gMTkwOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxOTE6XHRcdGludCBlcnI7XG4gMTkyOlx0XG4gMTkzOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGlfZGF0YSksIDApO1xuIDE5NDpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTk1Olx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxOTY6XHRcbiAxOTc6XHRcdHRtcF9pZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTk4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxOTk6XHRcdFx0aWYgKHRtcF9pZGF0YVtpXSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODU4MgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDc5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiBleHQ0IEZpbGVzeXN0ZW0gRXh0ZW50IE1pZ3JhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgdGhhdCB3aXRoIGEgNEsgYmxvY2sgc2l6ZSwgdGhlIGBtYXhfZW50cmllc2AgaW4gYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgY2FuIGJlIDEwMjQsIGxlYWRpbmcgdG8gYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXNgID0gMSwwNDgsNTc2LiBUaGVuLCBgbGItJmd0O2N1cnJfYmxvY2tgIGNhbiByZWFjaCAxLDA3NCw3OTEsNDM2LCB3aGljaCB3b3JrcyBiZWNhdXNlIGl0IGZpdHMgd2l0aGluIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gQnV0IGhvbGQgb24sIHdoYXQgaGFwcGVucyB3aXRoIGxhcmdlciBibG9jayBzaXplcywgbGlrZSA2NEtCPyBJZiB0aGUgYmxvY2sgc2l6ZSBpcyA2NEtCLCBgbWF4X2VudHJpZXNgIGp1bXBzIHRvIDE2Mzg0LCBhbmQgc3VkZGVubHksIDE2Mzg0IGN1YmVkIGlzICp3YXkqIGJpZ2dlciB0aGFuIGEgMzItYml0IGludGVnZXIhIFRoYXQmIzM5O3MgYSBwb3RlbnRpYWwgd3JhcC1hcm91bmQgd2FpdGluZyB0byBoYXBwZW4uCgpFdmVuIHdpdGggdGhlIDRLIGJsb2NrIHNpemUsIHdoYXQgaWYgd2UgY29uc2lkZXIgYEVYVF9NQVhfQkxPQ0tTYD8gVGhlbiwgSSByZW1lbWJlciB0aGF0IGBFWFRfTUFYX0JMT0NLU2AgaXMgMHhmZmZmZmZmZiAoNCwyOTQsOTY3LDI5NSkuCgpJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSBhIHBhdHRlcm4gaGVyZS4gTGFyZ2UgYmxvY2sgc2l6ZXMgKDE2S0Igb3IgNjRLQiksIGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24sIG9yIGV2ZW4ganVzdCBsYXJnZSBibG9jayBjb3VudHMsIGNvdWxkIHRyaWdnZXIgYW4gb3ZlcmZsb3cgd2hlbiBgY3Vycl9ibG9ja2Agd2FzIGJlaW5nIHRyZWF0ZWQgYXMgYW4gYGV4dDRfbGJsa190YCAod2hpY2ggaXMgYSB1MzIpLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGBjdXJyX2Jsb2NrYCB3cmFwcGluZyBhcm91bmQuIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgY2hlY2tpbmcgZm9yIGBsYi0mZ3Q7Y3Vycl9ibG9jayAmZ3Q7PSBFWFRfTUFYX0JMT0NLU2AsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgZm9yIGV4dGVudC1iYXNlZCBmaWxlcy4gVGhlIGBlZV9ibG9ja2AgZmllbGQgaW4gdGhlIGV4dGVudCBmb3JtYXQgaXMgYSBgX19sZTMyYCBhbmQgYEVYVF9NQVhfQkxPQ0tTYCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGJsb2NrIG51bWJlci4KClNvLCB0aGUgbmV4dCBxdWVzdGlvbiBpcywgaXMgdGhpcyByZWFjaGFibGU/IEhvdyBpcyBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSBjYWxsZWQ/IENhbiB3ZSBleHBsb2l0IHRoaXMgd2l0aCBzeXprYWxsZXI/IExldCYjMzk7cyBjaGVjayBzeXprYWxsZXImIzM5O3Mgc3VwcG9ydCBmb3IgZXh0NCBhbmQgdGhlIGBFWFQ0X0lPQ19NSUdSQVRFYCBvciBgRlNfSU9DX1NFVEZMQUdTYCBpb2N0bHMuCgpJbiBMaW51eCBzeXprYWxsZXIsIGl0IHNlZW1zIGxpa2UgZXh0NCBpbWFnZXMgYXJlIG1vdW50ZWQsIGFuZCBpb2N0bHMgbGlrZSBgRlNfSU9DX1NFVEZMQUdTYCBhbmQgYEVYVDRfSU9DX01JR1JBVEVgIGFyZSB1c2VkLiBHb29kLiBOb3csIHdoYXQgYWJvdXQgcHJpdmlsZWdlcyBmb3IgYEVYVDRfSU9DX01JR1JBVEVgPyBMb29raW5nIGludG8gYGZzL2V4dDQvaW9jdGwuY2AsIEkgc2VlIHRoYXQgYGlub2RlX293bmVyX29yX2NhcGFibGVgIGlzIGNoZWNrZWQuIElmIHRoZSB1c2VyIG93bnMgdGhlIGlub2RlLCB3aGljaCB0aGV5IG5vcm1hbGx5IGRvIHdpdGggdGhlaXIgZmlsZXMsIHRoZXkgaGF2ZSBwZXJtaXNzaW9uISBQZXJmZWN0LiBBbmQgd2hhdCBhYm91dCBgRlNfSU9DX1NFVEZMQUdTYD8gSXQgYXBwZWFycyBgZXh0NF9leHRfbWlncmF0ZWAgaXMgYWxzbyBjYWxsZWQgdGhyb3VnaCB0aGlzIGlvY3RsLCB3aGVuIGEgZmxhZyBpcyBzZXQuIFRoYXQgbWVhbnMgYW4gdW5wcml2aWxlZ2VkIHVzZXIgY2FuIHBvdGVudGlhbGx5IHRyaWdnZXIgdGhpcyB2aWEgdGhlIGBGU19JT0NfU0VURkxBR1NgIGFuZCBgRVhUNF9FWFRFTlRTX0ZMYCBmbGFnLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBpbnRvIHBlcm1pc3Npb25zIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AgdG8gY29uZmlybS4gVGhpcyBpcyBzdGFydGluZyB0byBsb29rIHZlcnkgaW50ZXJlc3RpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1OTA6XHRzdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0ZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSxcbiA1OTE6XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKVxuIDU5MjpcdHtcbiA1OTM6XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiA1OTQ6XHRcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xuIDU5NTpcdFx0aW50IGVyciA9IC1FUEVSTSwgbWlncmF0ZSA9IDA7XG4gNTk2Olx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4gNTk3Olx0XHR1bnNpZ25lZCBpbnQgb2xkZmxhZ3MsIG1hc2ssIGk7XG4gNTk4Olx0XHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiA1OTk6XHRcbiA2MDA6XHRcdC8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqL1xuIDYwMTpcdFx0aWYgKGV4dDRfaXNfcXVvdGFfZmlsZShpbm9kZSkpXG4gNjAyOlx0XHRcdGdvdG8gZmxhZ3Nfb3V0O1xuIDYwMzpcdFxuIDYwNDpcdFx0b2xkZmxhZ3MgPSBlaS1cdTAwM2VpX2ZsYWdzO1xuIDYwNTpcdFx0LypcbiA2MDY6XHRcdCAqIFRoZSBKT1VSTkFMX0RBVEEgZmxhZyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5XG4gNjA3Olx0XHQgKiB0aGUgcmVsZXZhbnQgY2FwYWJpbGl0eS5cbiA2MDg6XHRcdCAqL1xuIDYwOTpcdFx0aWYgKChmbGFncyBeIG9sZGZsYWdzKSBcdTAwMjYgKEVYVDRfSk9VUk5BTF9EQVRBX0ZMKSkge1xuIDYxMDpcdFx0XHRpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpXG4gNjExOlx0XHRcdFx0Z290byBmbGFnc19vdXQ7XG4gNjEyOlx0XHR9XG4gNjEzOlx0XG4gNjE0Olx0XHRpZiAoIWRheF9jb21wYXRpYmxlKGlub2RlLCBvbGRmbGFncywgZmxhZ3MpKSB7XG4gNjE1Olx0XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuIDYxNjpcdFx0XHRnb3RvIGZsYWdzX291dDtcbiA2MTc6XHRcdH1cbiA2MTg6XHRcbiA2MTk6XHRcdGlmICgoZmxhZ3MgXiBvbGRmbGFncykgXHUwMDI2IEVYVDRfRVhURU5UU19GTClcbiA2MjA6XHRcdFx0bWlncmF0ZSA9IDE7XG4gNjIxOlx0XG4gNjIyOlx0XHRpZiAoKGZsYWdzIF4gb2xkZmxhZ3MpIFx1MDAyNiBFWFQ0X0NBU0VGT0xEX0ZMKSB7XG4gNjIzOlx0XHRcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9jYXNlZm9sZChzYikpIHtcbiA2MjQ6XHRcdFx0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbiA2MjU6XHRcdFx0XHRnb3RvIGZsYWdzX291dDtcbiA2MjY6XHRcdFx0fVxuIDYyNzpcdFxuIDYyODpcdFx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuIDYyOTpcdFx0XHRcdGVyciA9IC1FTk9URElSO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDY5MgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4dDQgTWlncmF0aW9uIEludmVzdGlnYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYW5kIHRoaW5raW5nLCB0aGlzICpzaG91bGRuJiMzOTt0KiBiZSB0b28gY29tcGxleCBmcm9tIGEgZmlsZSBzeXN0ZW0gcGVybWlzc2lvbnMgYW5kIG93bmVyc2hpcCBwZXJzcGVjdGl2ZS4gV2UmIzM5O3JlIHRhbGtpbmcgc3RhbmRhcmQgaW5vZGUgc3R1ZmYgaGVyZSwgbm90aGluZyB1bnVzdWFsLiBQbHVzLCBleHQ0IGlzIGFscmVhZHkgcHJldHR5IHdlbGwtY292ZXJlZCBieSBzeXprYWxsZXIsIHdoaWNoIGdpdmVzIG1lIHNvbWUgY29uZmlkZW5jZSB0aGF0IGFueSBnbGFyaW5nIGlzc3VlcyB3b3VsZCBoYXZlIGJlZW4gZm91bmQuCgpNeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byBmaWd1cmUgb3V0IGhvdyBgZnMvZXh0NC9taWdyYXRlLmNgIGlzIGFjdHVhbGx5IGNvbXBpbGVkLiBXaGF0IGFyZSB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgbmVlZCB0byBiZSBzZXQgdG8gaW5jbHVkZSB0aGF0IGNvZGU/IEkmIzM5O2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIEtjb25maWcgb3B0aW9ucywgc3RhcnRpbmcgd2l0aCB0aG9zZSB0aGF0IGFmZmVjdCBgZnMvZXh0NC9taWdyYXRlLmNgIGRpcmVjdGx5LiBUaGVuLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGNoZWNraW5nIHRoZSBgZnMvZXh0NC9NYWtlZmlsZWAgdG8gc2VlIGhvdyB0aGUgYnVpbGQgcHJvY2VzcyBoYW5kbGVzIHRoaXMgZmlsZSBhbmQgd2hhdCBkZXBlbmRlbmNpZXMgaXQgbWlnaHQgaGF2ZS4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgcHJvY2VzcyBpcyBrZXkgdG8gZmlndXJpbmcgb3V0IHRoZSBwcmVjb25kaXRpb25zIGZvciB0aGUgY29kZSB0byBiZSBhdmFpbGFibGUsIGFuZCB0aHVzLCBleHBsb2l0YWJsZS4gVGhpcyBpcyB3aGVyZSBJJiMzOTtsbCBiZWdpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWlncmF0ZVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvTWFrZWZpbGU9OD1leHQ0LXlcdDo9IGJhbGxvYy5vIGJpdG1hcC5vIGJsb2NrX3ZhbGlkaXR5Lm8gZGlyLm8gZXh0NF9qYmQyLm8gZXh0ZW50cy5vIFxcXG5mcy9leHQ0L01ha2VmaWxlLTktXHRcdGV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGU6MTA6XHRcdGluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGUtMTEtXHRcdG1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTE2NQoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4dDQgTW9kdWxlIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBgbWlncmF0ZS5vYC4uLiB0aGF0JiMzOTtzIHBhcnQgb2YgdGhlIGBleHQ0LXlgIG9iamVjdCwgd2hpY2ggbWVhbnMgaXQgZ2V0cyBidWlsdCBvbmx5IHdoZW4gdGhlIEVYVDQgZmlsZXN5c3RlbSBpcyBlbmFibGVkLiBPYnZpb3VzLCBidXQgaXQmIzM5O3MgZ29vZCB0byBjb25maXJtIHRoZSBidWlsZCBsb2dpYy4gTXkgbmV4dCBtb3ZlIGlzIHRvIGRvdWJsZS1jaGVjayB0aGUgYGZzL2V4dDQvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGZvbGxvd2luZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIOKAkyBgQ09ORklHX0VYVDRfRlNgLCBzcGVjaWZpY2FsbHkg4oCTIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY3kgY29ycmVjdGx5LiBHb3R0YSBiZSBwcmVjaXNlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVzeXN0ZW0gbW9kdWxlcy4gTm8gc3VycHJpc2VzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNF9GU1xcYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xuZnMvZXh0NC9LY29uZmlnLTMtXHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTQ0NwoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDk5OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogZXh0NCBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgdGhlIHN0YW5kYXJkIGBFWFQ0X0ZTYCBpcyBpbiBwbGF5LiBGaXJzdCwgY2FuIHRoaXMgY29kZSBldmVuICpiZSogZnV6emVkPyBZZXMsIGl0JiMzOTtzIGNvcmUgZmlsZXN5c3RlbSBjb2RlIHdpdGhpbiBleHQ0LCB3aGljaCBpcyByZWFkaWx5IHJlYWNoYWJsZS4gVGhlIHByaW1hcnkgZ2F0ZSBpcyByZWFjaGFiaWxpdHkg4oCTIGxldCYjMzk7cyBjaGVjayB0aGUgY3JpdGVyaWEuICBTZWN0aW9uIDImIzM5O3MgJiMzNDt1bnJlYWNoYWJsZSYjMzQ7IGNyaXRlcmlhIGRvbiYjMzk7dCBhcHBseTsgdGhpcyBpcyBrZXJuZWwgY29kZSwgcGFydCBvZiBhIGNydWNpYWwgc3Vic3lzdGVtLiBTZWN0aW9uIDMgY2xhcmlmaWVzIHRoYXQgZmlsZXN5c3RlbSBjb2RlLCBzcGVjaWZpY2FsbHkgZXh0NCwgZmFsbHMgdW5kZXIgJiMzNDtjb3JlIHN1YnN5c3RlbXMmIzM0OyByZWxhdGVkIHRvIFZGUyBhbmQgc3RvcmFnZS4gIFN5emthbGxlciBzeXNjYWxscyBsaWtlIGBtb3VudGAsIGBvcGVuYCwgYHdyaXRlYCwgYW5kIGBpb2N0bGAgKGUuZy4sIGBGU19JT0NfU0VURkxBR1NgIG9yIGBFWFQ0X0lPQ19NSUdSQVRFYCkgY2FuIGNsZWFybHkgZXhlcmNpc2UgaXQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZyA9IHRydWVgLgoKTm93LCB0aGUgc3ltYm9scyB0byB0YXJnZXQuIEluIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHRoZSBgbWlncmF0ZV9zdHJ1Y3RgIHdhcyBtb2RpZmllZC4gIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCB3ZXJlIGNoYW5nZWQgZnJvbSBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgLiBBbHNvLCB0aGUgZnVuY3Rpb24gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHdhcyBtb2RpZmllZCwgYWRkaW5nIGEgY2hlY2sgZm9yIGBFWFRfTUFYX0JMT0NLU2AuCgpCdXQgd2FpdCwgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzICpzdGF0aWMqIHdpdGhpbiBgbWlncmF0ZS5jYC4gQ2FuIGEgc3RhdGljIGZ1bmN0aW9uIGJlIGEgJiMzNDtGb2N1c1N5bWJvbD8mIzM0OyAgUnVsZSA0IHN0YXRlcyB3aGVuIGBXb3J0aEZ1enppbmc9dHJ1ZWAsIHdlIG5lZWQgdG8gdGFyZ2V0IHNwZWNpZmljIGxvZ2ljIG9yIGVudHJ5cG9pbnRzIGFuZCBoYW5kbGUgc3RhdGljIGlubGluZSBmdW5jdGlvbnMgY2FyZWZ1bGx5LiBTdGF0aWMgaW5saW5lcyBsYWNrIGRpc3RpbmN0IHN5bWJvbHMgYW5kIGFyZSBhIGNoYWxsZW5nZSwgYnV0LCB0aGlzIGlzIGEgc3RhdGljIEMgZnVuY3Rpb24sICpub3QqIGEgc3RhdGljIGlubGluZS4KClNvLCBsZXQmIzM5O3Mgc2VlOiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXNuJiMzOTt0IGlubGluZWQhIExldCYjMzk7cyBjaGVjayBjYWxsZXJzOiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gbWlncmF0aW9uLCBhbHNvIGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gVGhhdCBpcyBjYWxsZWQgZnJvbSBgaW9jdGwuY2AuIFNpbmNlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqY2FsbGVkKiBieSBhIG5vbi1zdGF0aWMgZXhwb3J0ZWQgZnVuY3Rpb24gKGBleHQ0X2V4dF9taWdyYXRlYCksIHRoYXQmIzM5O3MgZ3JlYXQgYW5kIGl0IHByb3ZpZGVzIGEgc3ltYm9sIHRoYXQgY2FuIGJlIGZ1enplZCEKCkl0JiMzOTtzIHN0YW5kYXJkIHByYWN0aWNlIHRvIGxpc3QgYm90aC4gIEFuZCB0aGUgc3RhdGljIGZ1bmN0aW9uIGNhbiBoYXZlIGEgc3ltYm9sISBMaXN0aW5nIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIGNvdmVycyB0aGUgcmVsZXZhbnQgZmVhdHVyZXMuIFRoZSBvdGhlciBvbmUsIGBmaW5pc2hfcmFuZ2VgLCBpcyBhbHNvIHN0YXRpYyBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQsIGJ1dCBtYXliZSBub3QgYXMgaW1wb3J0YW50LiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgY2FsbGVkIGJ5IGBleHQ0X2lvY3RsX3NldGZsYWdzYCBhbmQgYF9fZXh0NF9pb2N0bGAgaW4gYGZzL2V4dDQvaW9jdGwuY2AsIGFuZCBzbyBpdCBpcyB0aGUga2V5LiBUaG9zZSB0d28gYXJlIG5vbi11YmlxdWl0b3VzLCB0YXJnZXRlZCBzeW1ib2xzIQoKRmluYWxseSwgbGV0JiMzOTtzIGRvdWJsZS1jaGVjayB0aGUgY29uZmlncy4gYEVYVDRfRlNgIGlzIGFscmVhZHkgZW5hYmxlZC4gTGV0JiMzOTtzIHNlZSBpZiB0aGUgY29kZSBoYXMgYW55IGAjaWZkZWZgIGNvbmRpdGlvbmFscy4gSSYjMzk7bGwgc2NhbiB0aHJvdWdoIGBtaWdyYXRlLmNgIHRvIGJlIGNlcnRhaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7I2lmJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzE0OAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkluaXRpYWwgQXNzZXNzbWVudCAmYW1wOyBWZXJpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBtaWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2Ugc29tZXRoaW5nIHNpZ25pZmljYW50OiB0aGVyZSBhcmUgKm5vKiBwcmVwcm9jZXNzb3IgYCNpZmRlZmAgZGlyZWN0aXZlcyBpbiB0aGlzIGZpbGUuIFRoYXQmIzM5O3MgdW51c3VhbCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgbmF0dXJlIG9mIGZpbGUgc3lzdGVtIG1pZ3JhdGlvbi4gSXQgbWFrZXMgbWUgd29uZGVyIGlmIGEgY2VydGFpbiBmaWxlIHN5c3RlbSBpcyBhbHdheXMgZW5hYmxlZC4gVGhpcyBsYWNrIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdhcnJhbnRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGlzIG5vdCB0aWVkIHRvIHNvbWUgb3RoZXIgY29uZmlnLiBUaGVyZWZvcmUsIEkmIzM5O2xsIHN3aXRjaCBnZWFycyBhbmQgdmVyaWZ5IGFueSBkZXBlbmRlbmNpZXMuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlIGZvciBgZnMvZXh0NGAgdG8gc2VlIGlmIGBFWFQ0X0ZTYCBoYXMgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIGFuZCB3aGF0JiMzOTtzIGRyaXZpbmcgdGhlIGJlaGF2aW9yIG9mIGBtaWdyYXRlLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBFWFQ0X0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuICAgNDpcdFx0c2VsZWN0IEJVRkZFUl9IRUFEXG4gICA1Olx0XHRzZWxlY3QgSkJEMlxuICAgNjpcdFx0c2VsZWN0IENSQzE2XG4gICA3Olx0XHRzZWxlY3QgQ1JDMzJcbiAgIDg6XHRcdHNlbGVjdCBGU19JT01BUFxuICAgOTpcdFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXG4gIDEwOlx0XHRoZWxwXG4gIDExOlx0XHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxuICAxMjpcdFxuICAxMzpcdFx0ICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sXG4gIDE0Olx0XHQgIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiBleHQ0IGlzIG5vdCBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGhcbiAgMTU6XHRcdCAgZXh0MzsgaXQgaXMgYmFzZWQgb24gZXh0ZW50IG1hcHMgYW5kIGl0IHN1cHBvcnRzIDQ4LWJpdFxuICAxNjpcdFx0ICBwaHlzaWNhbCBibG9jayBudW1iZXJzLiAgVGhlIGV4dDQgZmlsZXN5c3RlbSBhbHNvIHN1cHBvcnRzIGRlbGF5ZWRcbiAgMTc6XHRcdCAgYWxsb2NhdGlvbiwgcGVyc2lzdGVudCBwcmVhbGxvY2F0aW9uLCBoaWdoIHJlc29sdXRpb24gdGltZSBzdGFtcHMsXG4gIDE4Olx0XHQgIGFuZCBhIG51bWJlciBvZiBvdGhlciBmZWF0dXJlcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBzcGVlZFxuICAxOTpcdFx0ICB1cCBmc2NrIHRpbWUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgd2ViIHBhZ2VzIGF0XG4gIDIwOlx0XHQgIGh0dHA6Ly9leHQ0Lndpa2kua2VybmVsLm9yZy5cbiAgMjE6XHRcbiAgMjI6XHRcdCAgVGhlIGV4dDQgZmlsZXN5c3RlbSBzdXBwb3J0cyBtb3VudGluZyBhbiBleHQzIGZpbGVzeXN0ZW07IHdoaWxlIHRoZXJlXG4gIDIzOlx0XHQgIGFyZSBzb21lIHBlcmZvcm1hbmNlIGdhaW5zIGZyb20gdGhlIGRlbGF5ZWQgYWxsb2NhdGlvbiBhbmQgaW5vZGVcbiAgMjQ6XHRcdCAgdGFibGUgcmVhZGFoZWFkLCB0aGUgYmVzdCBwZXJmb3JtYW5jZSBnYWlucyByZXF1aXJlIGVuYWJsaW5nIGV4dDRcbiAgMjU6XHRcdCAgZmVhdHVyZXMgaW4gdGhlIGZpbGVzeXN0ZW0gdXNpbmcgdHVuZTJmcywgb3IgZm9ybWF0dGluZyBhIG5ld1xuICAyNjpcdFx0ICBmaWxlc3lzdGVtIGFzIGFuIGV4dDQgZmlsZXN5c3RlbSBpbml0aWFsbHkuIFdpdGhvdXQgZXhwbGljaXQgZW5hYmxpbmdcbiAgMjc6XHRcdCAgb2YgZXh0NCBmZWF0dXJlcywgdGhlIG9uIGRpc2sgZmlsZXN5c3RlbSBmb3JtYXQgc3RheXMgZnVsbHkgYmFja3dhcmRcbiAgMjg6XHRcdCAgY29tcGF0aWJsZS5cbiAgMjk6XHRcbiAgMzA6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxuICAzMTpcdFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cbiAgMzI6XHRcbiAgMzM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAgMzQ6XHRcbiAgMzU6XHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcbiAgMzY6XHRcdGJvb2wgXCYjMzQ7VXNlIGV4dDQgZm9yIGV4dDIgZmlsZSBzeXN0ZW1zXCYjMzQ7XG4gIDM3Olx0XHRkZXBlbmRzIG9uIEVYVDRfRlNcbiAgMzg6XHRcdGRlcGVuZHMgb24gRVhUMl9GUz1uXG4gIDM5Olx0XHRkZWZhdWx0IHlcbiAgNDA6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM5NzYKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogMjMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFWFQ0IFBhdGNoKioKCk9rYXksIHNvIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCwgaXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIHNlZW1zIGVhc3k7IGBFWFQ0X0ZTYCBwdWxscyBpbiBhbGwgdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXM6IGBCVUZGRVJfSEVBRGAsIGBKQkQyYCwgYENSQzE2YCwgYENSQzMyYCwgYW5kIGBGU19JT01BUGAuIFRoZXJlZm9yZSwgdGhlIGBFbmFibGVDb25maWdzYCBsaXN0IGlzIHNpbXBseSBgWyYjMzQ7RVhUNF9GUyYjMzQ7XWAuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGUgcmVsZXZhbnQgc3ltYm9scy4gQ2hlY2tpbmcgYEZvY3VzU3ltYm9sc2AsIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIHBvcCB1cC4gWWVwLCB0aGF0JiMzOTtzIGV4cGVjdGVkLgoKTGV0JiMzOTtzIHF1aWNrbHkgYXJ0aWN1bGF0ZSB0aGUgY29yZSBvZiB0aGlzIGNoYW5nZS4gRnJvbSB3aGF0IEkgZ2F0aGVyLCB0aGUgcGF0Y2ggYWRkcmVzc2VzIGEgcG90ZW50aWFsIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSB3aXRoaW4gdGhlIGV4dDQgbWlncmF0aW9uIGxvZ2ljLiBUaGlzIGNvbnZlcnNpb24sIGZyb20gaW5kaXJlY3QtYmxvY2sgbWFwcGluZ3MgdG8gZXh0ZW50LW1hcHBlZCBmaWxlcywgaW52b2x2ZXMgd2lkZW5pbmcgdGhlIGJsb2NrIG9mZnNldHMgaW4gYG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCAoYGV4dDRfbGJsa190YCwgb3IgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApIHRvIHByZXZlbnQgYW4gaW50ZWdlciBvdmVyZmxvdyBjb25kaXRpb24gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBsYXJnZSBmaWxlcy4gIEl0JiMzOTtzIGFsc28gbm93IGNoZWNraW5nIGlmIGBjdXJyX2Jsb2NrYCBpcyBncmVhdGVyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggcHJldmVudHMgYSBidWZmZXIgb3ZlcmZsb3cuIFRoZSBjb2RlIHBhdGggaXMgdHJpZ2dlcmVkIGJ5IGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgKHdoZW4gc2V0dGluZyB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZykgb24gZXh0NCBmaWxlc3lzdGVtcy4gVGhpcyBpbmRpY2F0ZXMgaXQgdG91Y2hlcyBsaXZlIGZpbGVzeXN0ZW0gbG9naWMgYW5kIGlzIGRlZmluaXRlbHkgd29ydGggZnV6emluZy4KCkdpdmVuIHRoaXMgdGhvcm91Z2ggdW5kZXJzdGFuZGluZywgSSYjMzk7bSBjb25maWRlbnQgaW4gdGhlIGFzc2Vzc21lbnQuIEkmIzM5O2xsIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3VwZGF0ZV9leHRlbnRfcmFuZ2UmIzM0OywKICAgICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT41bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXG5cblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZWMyYjA2YjA5YzY1NTI0NGFhZTk2OTQ3MjVmZGY5MjJmM2E5MjZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMDg6NDM6MTggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC0xNCw3ICYjNDM7MTQsNyBAQAogICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50CiAgKi8KIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7Ci0JZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7CiYjNDM7CXU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jazsKIAlleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jazsKIH07CiAKQEAgLTY2LDYgJiM0Mzs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCWludCByZXR2YWw7CiYjNDM7CiYjNDM7CWlmIChsYi0mZ3Q7Y3Vycl9ibG9jayAmZ3Q7PSBFWFRfTUFYX0JMT0NLUykKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKIAkvKgogCSAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKQogCSAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE2OQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBFeHQ0IHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gemVybyBpbiBvbiB0aGUga2V5IG1vZGlmaWNhdGlvbnMgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBub3RpbmcgdGhlIGNoYW5nZSBpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFRoZSBhbHRlcmF0aW9uIGZyb20gYGV4dDRfbGJsa190YCB0byBgdTY0YCBmb3IgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGltbWVkaWF0ZWx5IGNhdGNoZXMgbXkgZXllLiBUaGlzIHN1Z2dlc3RzIGEgc2hpZnQgdG8gNjQtYml0IGJsb2NrIGFkZHJlc3NpbmcsIHdoaWNoIGxpa2VseSBpbmRpY2F0ZXMgdGhleSYjMzk7cmUgYWRkcmVzc2luZyB0aGUgbGFyZ2VyIHZvbHVtZSBzaXplcyDigJMgd2UmIzM5O3JlIHByb2JhYmx5IGxvb2tpbmcgYXQgYSBtb3ZlIHRvd2FyZHMgc3VwcG9ydGluZyBsYXJnZXIgZmlsZXN5c3RlbXMsIG9yIGF0IGxlYXN0IGEgcHJlcGFyYXRpb24gZm9yIGl0LgoKTmV4dCwgSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLCB3aGVyZSB0aGUgYWRkaXRpb24gb2YgdGhlIGBpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgIGNoZWNrIGlzLiBUaGUgYEVYVF9NQVhfQkxPQ0tTYCBkZWZpbml0aW9uIHdpbGwgYmUgaW1wb3J0YW50LiBNeSBpbnN0aW5jdCBpcyB0aGF0IHRoaXMgaXMgc29tZSBmb3JtIG9mIGJvdW5kYXJ5IGNoZWNrIHRvIGVuc3VyZSB0aGUgYmxvY2sgbnVtYmVyIGRvZXNuJiMzOTt0IGV4Y2VlZCBhIHByZWRldGVybWluZWQgbWF4aW11bS4gVGhlIGAtRU9QTk9UU1VQUGAgZXJyb3IgaW5kaWNhdGVzIHRoYXQgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZCwgc28gdGhlIHN5c3RlbSBpcyB0cnlpbmcgdG8gaGFuZGxlIHRoZSBmYWN0IHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGJsb2NrIGFkZHJlc3NpbmcgaXNuJiMzOTt0IGhhbmRsZWQgY29ycmVjdGx5LgoKSSYjMzk7bSBub3cgZ29pbmcgdG8gc3RhcnQgc2Nhbm5pbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCBhcm91bmQgdGhlc2UgbGluZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFib3V0IHRoZSBvcmlnaW5hbCBjb25zdHJhaW50cywgd2hhdCB0aGlzIGxpbWl0IGFjdHVhbGx5IHJlcHJlc2VudHMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGZ1bmN0aW9ucyB1dGlsaXplIHRoZXNlIGJsb2NrIG51bWJlcnMuIFRoaXMgd2lsbCBjbGFyaWZ5IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UgYW5kIHRoZSByZWFzb25zIGZvciBpdC4gSXMgdGhpcyBhIHBsYW5uZWQgY2hhbmdlIHRvIGEgbW9yZSBjb21wbGV4IGxheW91dCwgb3Igc29tZSBvdGhlciBjaGFuZ2UgdG8gYmxvY2sgYWRkcmVzc2luZywgb3IgYW4gYXR0ZW1wdCB0byBwcmVwYXJlIGZvciBsYXJnZXIgdm9sdW1lcz8gSSYjMzk7bGwgc29vbiBzZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXG4gICAyOlx0LypcbiAgIDM6XHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XG4gICA0Olx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVx1MDAzZVxuICAgNTpcdCAqXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9qYmQyLmhcJiMzNDtcbiAgMTA6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2V4dGVudHMuaFwmIzM0O1xuICAxMTpcdFxuICAxMjpcdC8qXG4gIDEzOlx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXG4gIDE0Olx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gIDE1Olx0ICovXG4gIDE2Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbiAgMTc6XHRcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFxuICA3MDpcdFx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbiAgNzE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuICA3MjpcdFxuICA3MzpcdFx0LypcbiAgNzQ6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3NTpcdFx0ICovXG4gIDc2Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3NzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzg6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbiAgNzk6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDgwOlx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4MTpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODI6XHRcdFx0cmV0dXJuIDA7XG4gIDgzOlx0XHR9XG4gIDg0Olx0XHQvKlxuICA4NTpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDg2Olx0XHQgKi9cbiAgODc6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg4Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODk6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDkwOlx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgOTE6XHRcdHJldHVybiByZXR2YWw7XG4gIDkyOlx0fVxuICA5MzpcdFxuICA5NDpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTU6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDk2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NzpcdHtcbiAgOTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk5Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MTYwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIGhvdyBpdCYjMzk7cyBhbGxvY2F0ZWQsIGluaXRpYWxpemVkLCBhbmQgdGhlbiBhY3R1YWxseSAqdXNlZCogd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBFeHQ0IGZpbGVzeXN0ZW0uIEkgbmVlZCB0byBncmFzcCB0aGlzIHRob3JvdWdobHkgdG8gcmVhbGx5IHVuZGVyc3RhbmQgaG93IHRoZSBtaWdyYXRpb24gcHJvY2VzcyB3b3Jrcy4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSBoYW5kbGUgaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDE6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEwMjpcdFxuIDEwMzpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTA0Olx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMDU6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEwNjpcdFxuIDEwNzpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMDg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEwOTpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTEwOlx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDExMTpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxMTI6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDExMzpcdFx0XHRcdFx0YnJlYWs7XG4gMTE0Olx0XHRcdH0gZWxzZSB7XG4gMTE1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gMTE2Olx0XHRcdH1cbiAxMTc6XHRcdH1cbiAxMTg6XHRcdHB1dF9iaChiaCk7XG4gMTE5Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDEyMDpcdFxuIDEyMTpcdH1cbiAxMjI6XHRcbiAxMjM6XHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDEyNDpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTI1Olx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxMjY6XHR7XG4gMTI3Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDEyODpcdFx0X19sZTMyICppX2RhdGE7XG4gMTI5Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxMzA6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEzMTpcdFxuIDEzMjpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTMzOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMzQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEzNTpcdFxuIDEzNjpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMzc6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEzODpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTM5Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcbiAxNDA6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XG4gMTQxOlx0XHRcdFx0aWYgKHJldHZhbClcbiAxNDI6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MzpcdFx0XHR9IGVsc2Uge1xuIDE0NDpcdFx0XHRcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xuIDE0NTpcdFx0XHRcdGxiLVx1MDAzZWN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDE0NjpcdFx0XHR9XG4gMTQ3Olx0XHR9XG4gMTQ4Olx0XHRwdXRfYmgoYmgpO1xuIDE0OTpcdFx0cmV0dXJuIHJldHZhbDtcbiAxNTA6XHRcbiAxNTE6XHR9XG4gMTUyOlx0XG4gMTUzOlx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxNTQ6XHRcdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuIDE1NTpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gMTU2Olx0e1xuIDE1NzpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxNTg6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDE1OTpcdFx0aW50IGksIHJldHZhbCA9IDA7XG4gMTYwOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxNjE6XHRcbiAxNjI6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xuIDE2MzpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTY0Olx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxNjU6XHRcbiAxNjY6XHRcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTY3Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxNjg6XHRcdFx0aWYgKGlfZGF0YVtpXSkge1xuIDE2OTpcdFx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE3MDpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNzE6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE3MjpcdFx0XHRcdFx0YnJlYWs7XG4gMTczOlx0XHRcdH0gZWxzZSB7XG4gMTc0Olx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTc1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcbiAxNzY6XHRcdFx0fVxuIDE3NzpcdFx0fVxuIDE3ODpcdFx0cHV0X2JoKGJoKTtcbiAxNzk6XHRcdHJldHVybiByZXR2YWw7XG4gMTgwOlx0XG4gMTgxOlx0fVxuIDE4MjpcdFxuIDE4MzpcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxuIDE4NDpcdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcbiAxODU6XHR7XG4gMTg2Olx0XHRpbnQgaTtcbiAxODc6XHRcdF9fbGUzMiAqdG1wX2lkYXRhO1xuIDE4ODpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxODk6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIDE5MDpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTkxOlx0XHRpbnQgZXJyO1xuIDE5MjpcdFxuIDE5MzpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcbiAxOTQ6XHRcdGlmIChJU19FUlIoYmgpKVxuIDE5NTpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTk2Olx0XG4gMTk3Olx0XHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDE5ODpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTk5Olx0XHRcdGlmICh0bXBfaWRhdGFbaV0pIHtcbiAyMDA6XHRcdFx0XHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1ODI3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcHJvY2Vzc2luZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZnMvZXh0NC9taWdyYXRlLmNgIGZpbGUuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBtaWdyYXRpb24gcHJvY2VzcyBpcyBzdHJ1Y3R1cmVkIGFuZCB3aGVyZSB0aGUga2V5IHN0cnVjdHVyZXMsIHNwZWNpZmljYWxseSBgbWlncmF0ZV9zdHJ1Y3RgLCBnZXQgdGhlaXIgc3RhcnQuIEkgbmVlZCB0byB0cmFjZSB0aGUgaW5zdGFudGlhdGlvbiBvZiB0aGF0IGBtaWdyYXRlX3N0cnVjdGAgdG8gdW5kZXJzdGFuZCBob3cgdGhlIG1pZ3JhdGlvbiBjb250ZXh0IGlzIGJlaW5nIGJ1aWx0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgZnVydGhlciByZWFkaW5nIGluIHRoZSBzb3VyY2UgY29kZSB3aWxsIHRlbGwgbWUuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgZXhhY3QgcG9pbnQgd2hlcmUgdGhhdCBjcnVjaWFsIHN0cnVjdCBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWlncmF0ZV9zdHJ1Y3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cbmZzL2V4dDQvbWlncmF0ZS5jOjE2OnN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG5mcy9leHQ0L21pZ3JhdGUuYy0xNy1cdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9taWdyYXRlLmM6MjI6XHRcdFx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtMjMtXG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYzo2NjpcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTY3LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz05ND1zdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYy05NS1cdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG5mcy9leHQ0L21pZ3JhdGUuYzo5NjpcdFx0XHRcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy05Ny17XG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9MTIzPXN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjQtXHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbmZzL2V4dDQvbWlncmF0ZS5jOjEyNTpcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtMTI2LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0xNTM9c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTE1NC1cdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuZnMvZXh0NC9taWdyYXRlLmM6MTU1Olx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTYte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTQxND1pbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQyMC1cdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbmZzL2V4dDQvbWlncmF0ZS5jOjQyMTpcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbmZzL2V4dDQvbWlncmF0ZS5jLTQyMi1cdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2MjgKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgZnMvZXh0NC9taWdyYXRlLmNgIC0gTGluZXMgNDE0LTUwMCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4gb24gbGluZXMgNDE0IHRocm91Z2ggNTAwIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgc2VjdGlvbiB0aG9yb3VnaGx5LiBCYXNlZCBvbiB0aGUgZmlsZSBuYW1lLCBpdCYjMzk7cyBwcmV0dHkgY2xlYXIgdGhpcyBpcyBhYm91dCBtaWdyYXRpb24gcHJvY2Vzc2VzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzbyB0aGlzIHByb2JhYmx5IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCB1cGdyYWRpbmcgb3IgY2hhbmdpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBmaWxlIHN5c3RlbS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGFuZCBmaWd1cmUgb3V0IHRoZSBjb3JuZXIgY2FzZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgZm9yIHJlZ3Jlc3Npb25zIG9yIHBlcmZvcm1hbmNlIGltcGFjdCwgYXMgd2VsbCBhcyBpZiB0aGlzIGlzIHRvdWNoaW5nIGFueSBmZWF0dXJlcyBJIGFtIGZhbWlsaWFyIHdpdGguIEkgd2lsbCBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBhc3BlY3RzIG9mIHRoZSBtaWdyYXRpb24gYXJlIGFjdHVhbGx5IGhhbmRsZWQgd2l0aGluIHRoaXMgcmVnaW9uIG9mIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNDpcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNDE1Olx0e1xuIDQxNjpcdFx0aGFuZGxlX3QgKmhhbmRsZTtcbiA0MTc6XHRcdGludCByZXR2YWwgPSAwLCBpO1xuIDQxODpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE5Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MjA6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MjE6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MjI6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIzOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyNDpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDI1Olx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyNjpcdFxuIDQyNzpcdFx0LypcbiA0Mjg6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI5Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQzMDpcdFx0ICovXG4gNDMxOlx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQzMjpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMzOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzU6XHRcbiA0MzY6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM3Olx0XHRcdC8qXG4gNDM4Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzOTpcdFx0XHQgKi9cbiA0NDA6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0NDE6XHRcbiA0NDI6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MzpcdFxuIDQ0NDpcdFx0LypcbiA0NDU6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDY6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ3Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0ODpcdFx0ICovXG4gNDQ5Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NTA6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ1MTpcdFxuIDQ1MjpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNDUzOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTQ6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1NTpcdFx0fVxuIDQ1NjpcdFx0LypcbiA0NTc6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1ODpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTk6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDYwOlx0XHQgKi9cbiA0NjE6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDYyOlx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYzOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjQ6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDY1Olx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2NjpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0Njc6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiA0Njg6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2OTpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDcwOlx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDcxOlx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDcyOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzM6XHRcdH1cbiA0NzQ6XHRcdC8qXG4gNDc1Olx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3NjpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NzpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0Nzg6XHRcdCAqL1xuIDQ3OTpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ4MDpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ4MTpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0ODI6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgzOlx0XHQvKlxuIDQ4NDpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDg1Olx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4NjpcdFx0ICovXG4gNDg3Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4ODpcdFxuIDQ4OTpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0OTA6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDkxOlx0XG4gNDkyOlx0XHQvKlxuIDQ5MzpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODE4OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gZXh0NCYjMzk7cyBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgdGltZSB0byBnZXQgYmFjayBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGlzIGBleHQ0X21pZ3JhdGVgIGZ1bmN0aW9uIOKAkyBzcGVjaWZpY2FsbHksIHNlY3Rpb25zIDQ5NCB0byA1NTAgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEkgcmVjYWxsIHRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgbG9naWMgZm9yIG1pZ3JhdGluZyBpbm9kZXMgYW5kIGRhdGEgYmxvY2tzIGxpa2VseSByZXNpZGVzLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRoYXQgc3BlY2lmaWMgcmFuZ2UgdG8gcGlucG9pbnQgdGhlIG1pZ3JhdGlvbiBzdHJhdGVneSBpbXBsZW1lbnRlZC4gSSBzdXNwZWN0IHRoaXMgcGFydCBvZiB0aGUgY29kZSBkZXRhaWxzIHRoZSBoYW5kbGluZyBvZiBibG9jayBhbGxvY2F0aW9uLCBtZXRhZGF0YSB1cGRhdGVzIChpbm9kZSBudW1iZXJzLCBncm91cCBkZXNjcmlwdG9ycywgYml0bWFwcywgYW5kIHNvIG9uKSwgYW5kIHBvdGVudGlhbGx5IGFueSBjb25zaWRlcmF0aW9ucyBmb3IgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCBkdXJpbmcgdGhlIHByb2Nlc3MuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyBpdCBoYW5kbGVzIGF0b21pY2l0eSBhbmQgZGF0YSBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhpcyBwb3RlbnRpYWxseSBjb21wbGV4IHRyYW5zZm9ybWF0aW9uLiBJcyBpdCB1c2luZyBqb3VybmFsaW5nIHRvIHByb3RlY3QgYWdhaW5zdCBmYWlsdXJlcz8gSG93IGFyZSBibG9jayBudW1iZXJzIG1hbmFnZWQgZHVyaW5nIHRoZSBtb3ZlPyBJIGFsc28gd2FudCB0byBzZWUgaWYgdGhpcyBoYW5kbGVzIGFueSBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIERvZXMgaXQgYWxsb3cgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIG9yIGRvZXMgaXQgdGFrZSBleGNsdXNpdmUgbG9jayBpbiBvcmRlciB0byBtaWdyYXRlIGlub2Rlcz8gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ5NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1Ngp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDk0Olx0XHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cbiA0OTU6XHRcdCAqXG4gNDk2Olx0XHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxuIDQ5NzpcdFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXG4gNDk4Olx0XHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxuIDQ5OTpcdFx0ICovXG4gNTAwOlx0XHQvKlxuIDUwMTpcdFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xuIDUwMjpcdFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcbiA1MDM6XHRcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxuIDUwNDpcdFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxuIDUwNTpcdFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xuIDUwNjpcdFx0ICogYWxsb2NhdGlvbi5cbiA1MDc6XHRcdCAqL1xuIDUwODpcdFx0ZG93bl9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG4gNTA5Olx0XHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XG4gNTEwOlx0XHR1cF9yZWFkKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiA1MTE6XHRcbiA1MTI6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcbiA1MTM6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDUxNDpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNTE1Olx0XHRcdGdvdG8gb3V0X3RtcF9pbm9kZTtcbiA1MTY6XHRcdH1cbiA1MTc6XHRcbiA1MTg6XHRcdGlfZGF0YSA9IGVpLVx1MDAzZWlfZGF0YTtcbiA1MTk6XHRcdG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XG4gNTIwOlx0XG4gNTIxOlx0XHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXG4gNTIyOlx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gNTIzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFWFQ0X05ESVJfQkxPQ0tTOyBpJiM0MzsmIzQzOykge1xuIDUyNDpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gNTI1Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MjY6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBcdTAwMjZsYik7XG4gNTI3Olx0XHRcdFx0aWYgKHJldHZhbClcbiA1Mjg6XHRcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1Mjk6XHRcdFx0fSBlbHNlXG4gNTMwOlx0XHRcdFx0bGIuY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gNTMxOlx0XHR9XG4gNTMyOlx0XHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xuIDUzMzpcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MzQ6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcdTAwMjZsYik7XG4gNTM1Olx0XHRcdGlmIChyZXR2YWwpXG4gNTM2Olx0XHRcdFx0Z290byBlcnJfb3V0O1xuIDUzNzpcdFx0fSBlbHNlXG4gNTM4Olx0XHRcdGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDUzOTpcdFx0aWYgKGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSB7XG4gNTQwOlx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDE6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0MjpcdFx0XHRpZiAocmV0dmFsKVxuIDU0MzpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NDQ6XHRcdH0gZWxzZVxuIDU0NTpcdFx0XHRsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDU0NjpcdFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XG4gNTQ3Olx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDg6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0OTpcdFx0XHRpZiAocmV0dmFsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDQ5CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIHRoZSBNZW1vcnkgSW5pdGlhbGl6YXRpb24gaW4gYGV4dDRfZXh0X21pZ3JhdGVgKioKCk9rYXksIGxpbmUgNTE5IGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCBpdCYjMzk7cyBjcnVjaWFsIHRvIGJlIHByZWNpc2Ugd2l0aCB0aGVzZSB0aGluZ3MuIEkmIzM5O20gc2VlaW5nIGBtZW1zZXQoJmFtcDtsYiwgMCwgc2l6ZW9mKGxiKSk7YC4gUmlnaHQsIHNvIGBsYmAgaXMgZXhwbGljaXRseSBiZWluZyB6ZXJvZWQgb3V0IHVzaW5nIGBtZW1zZXRgLiBUaGF0IHRlbGxzIG1lIHRoZSBkZXZlbG9wZXIgaXMgYmVpbmcgZGlsaWdlbnQgYWJvdXQgbWVtb3J5IGluaXRpYWxpemF0aW9uLCB3aGljaCBpcyBnb29kIHByYWN0aWNlIOKAkyBlc3BlY2lhbGx5IGluIGEga2VybmVsIGNvbnRleHQuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyAqd2h5Kj8gSXMgaXQgc2ltcGx5IGRlZmVuc2l2ZSBwcm9ncmFtbWluZywgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gdGhlIHN0cnVjdHVyZSBuZWVkcyB0byBzdGFydCBpbiBhIGtub3duLCBjbGVhbiBzdGF0ZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudC4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gY2hlY2sgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIG5vdCBvbmx5IHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAqYW55d2hlcmUqIGBsYmAgb3IgYG1pZ3JhdGVfc3RydWN0YCBpcyB1c2VkIGlzIHJldmlld2VkLiBUaGVyZSBtaWdodCBiZSBhbiBhc3N1bXB0aW9uIGxhdGVyIG9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgemVybyBpbml0aWFsaXphdGlvbi4gSSYjMzk7bGwgbmVlZCB0byB0cmFjZSB0aGUgY29udHJvbCBmbG93IGFuZCBkYXRhIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIGRpZyBkZWVwZXIgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU1MDpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NTE6XHRcdH1cbiA1NTI6XHRcdC8qXG4gNTUzOlx0XHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcbiA1NTQ6XHRcdCAqL1xuIDU1NTpcdFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcdTAwMjZsYik7XG4gNTU2Olx0ZXJyX291dDpcbiA1NTc6XHRcdGlmIChyZXR2YWwpXG4gNTU4Olx0XHRcdC8qXG4gNTU5Olx0XHRcdCAqIEZhaWx1cmUgY2FzZSBkZWxldGUgdGhlIGV4dGVudCBpbmZvcm1hdGlvbiB3aXRoIHRoZVxuIDU2MDpcdFx0XHQgKiB0bXBfaW5vZGVcbiA1NjE6XHRcdFx0ICovXG4gNTYyOlx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NjM6XHRcdGVsc2Uge1xuIDU2NDpcdFx0XHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcbiA1NjU6XHRcdFx0aWYgKHJldHZhbClcbiA1NjY6XHRcdFx0XHQvKlxuIDU2NzpcdFx0XHRcdCAqIGlmIHdlIGZhaWwgdG8gc3dhcCBpbm9kZSBkYXRhIGZyZWUgdGhlIGV4dGVudFxuIDU2ODpcdFx0XHRcdCAqIGRldGFpbHMgb2YgdGhlIHRtcCBpbm9kZVxuIDU2OTpcdFx0XHRcdCAqL1xuIDU3MDpcdFx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NzE6XHRcdH1cbiA1NzI6XHRcbiA1NzM6XHRcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuIDU3NDpcdFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4gNTc1Olx0XHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuIDU3NjpcdFx0XHRnb3RvIG91dF9zdG9wO1xuIDU3NzpcdFx0LypcbiA1Nzg6XHRcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cbiA1Nzk6XHRcdCAqL1xuIDU4MDpcdFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XG4gNTgxOlx0XG4gNTgyOlx0XHQvKlxuIDU4MzpcdFx0ICogc2V0IHRoZSAgaV9ibG9ja3MgY291bnQgdG8gemVyb1xuIDU4NDpcdFx0ICogc28gdGhhdCB0aGUgZXh0NF9ldmljdF9pbm9kZSgpIGRvZXMgdGhlXG4gNTg1Olx0XHQgKiByaWdodCBqb2JcbiA1ODY6XHRcdCAqXG4gNTg3Olx0XHQgKiBXZSBkb24mIzM5O3QgbmVlZCB0byB0YWtlIHRoZSBpX2xvY2sgYmVjYXVzZVxuIDU4ODpcdFx0ICogdGhlIGlub2RlIGlzIG5vdCB2aXNpYmxlIHRvIHVzZXIgc3BhY2UuXG4gNTg5Olx0XHQgKi9cbiA1OTA6XHRcdHRtcF9pbm9kZS1cdTAwM2VpX2Jsb2NrcyA9IDA7XG4gNTkxOlx0XHRFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XG4gNTkyOlx0XG4gNTkzOlx0XHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cbiA1OTQ6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNTk1Olx0b3V0X3N0b3A6XG4gNTk2Olx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDU5NzpcdG91dF90bXBfaW5vZGU6XG4gNTk4Olx0XHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XG4gNTk5Olx0b3V0X3VubG9jazpcbiA2MDA6XHRcdGV4dDRfd3JpdGVwYWdlc191cF93cml0ZShpbm9kZS1cdTAwM2VpX3NiLCBhbGxvY19jdHgpO1xuIDYwMTpcdFx0aXB1dCh0bXBfaW5vZGUpO1xuIDYwMjpcdFx0cmV0dXJuIHJldHZhbDtcbiA2MDM6XHR9XG4gNjA0Olx0XG4gNjA1Olx0LypcbiA2MDY6XHQgKiBNaWdyYXRlIGEgc2ltcGxlIGV4dGVudC1iYXNlZCBpbm9kZSB0byB1c2UgdGhlIGlfYmxvY2tzW10gYXJyYXlcbiA2MDc6XHQgKi9cbiA2MDg6XHRpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDYwOTpcdHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA2MTMKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiB0aGUgRXh0NCBGaWxlc3lzdGVtIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB3aGF0IGl0JiMzOTtzIGFkZHJlc3NpbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoZXJlJiMzOTtzIGEgcG90ZW50aWFsIGludGVnZXIgb3ZlcmZsb3cgaXNzdWUgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSYjMzk7cyBtaWdyYXRpb24gc3RydWN0dXJlLiBTcGVjaWZpY2FsbHksIGl0IGxvb2tzIGxpa2Ugd2l0aGluIHRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCwgdGhlIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBtZW1iZXJzIGFyZSBhbGwgZGVmaW5lZCBhcyBgZXh0NF9sYmxrX3RgLCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGEgYHUzMmAg4oCTIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCgpUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBzZWVtcyB0byBiZSB3aXRoIGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgYGN1cnJfYmxvY2tgLiBUaGUgcGF0Y2ggbWVudGlvbnMgYW4gb3BlcmF0aW9uIGxpa2UgYGxiLSZndDtjdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzYCBhbmQgaW5jcmVtZW50cyB3aXRoaW4gaW5kaXJlY3QgYmxvY2sgdHJhdmVyc2Fscy4gVGhpcyBpcyB3aGVyZSBJIHNlZSB0aGUgaW1tZWRpYXRlIHJlZCBmbGFnLiBXaXRoIHBvdGVudGlhbGx5IGxhcmdlIGZpbGVzeXN0ZW1zLCBsYXJnZSBibG9jayBzaXplcywgb3IgZXZlbiBjYXJlZnVsbHkgY29uc3RydWN0ZWQgaW5kaXJlY3QgdHJlZXMsIHRob3NlIG11bHRpcGxpY2F0aW9ucyBhbmQgaW5jcmVtZW50cyBjb3VsZCBlYXNpbHkgcHVzaCBgY3Vycl9ibG9ja2AgYmV5b25kIHRoZSBsaW1pdHMgb2YgYSAzMi1iaXQgaW50ZWdlciwgbGVhZGluZyB0byBhIHdyYXAtYXJvdW5kIGNvbmRpdGlvbi4gVGhhdCBtZWFucyBgY3Vycl9ibG9ja2AgY291bGQgYmVjb21lIGEgc21hbGxlciB2YWx1ZSB0aGFuIGV4cGVjdGVkLCBsZWFkaW5nIHRvIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb3IgZXZlbiBjb3JydXB0aW9uLgoKVGhlIHBhdGNoJiMzOTtzIGFkZGl0aW9uIG9mIGEgYGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTYCBjaGVjayBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUgZml4LiBJdCYjMzk7cyBkZXNpZ25lZCB0byBwcmV2ZW50IHVzIGZyb20gZXhjZWVkaW5nIHRoZSBtYXhpbXVtIGV4dGVudCBibG9jayBudW1iZXIgd2hpY2ggaXMgZGVmaW5lZCBieSBgRVhUX01BWF9CTE9DS1NgLiBJJiMzOTttIGdvaW5nIHRvIHF1aWNrbHkgdmVyaWZ5IHdoYXQgYEVYVF9NQVhfQkxPQ0tTYCBhY3R1YWxseSAqaXMqLiBLbm93aW5nIHRoYXQgd2lsbCBjb25maXJtIHRoYXQgdGhpcyBjaGVjayBpcyBzdWZmaWNpZW50IGluIHByZXZlbnRpbmcgdGhlIG92ZXJmbG93IG9yIGlmIHNvbWUgZnVydGhlciByZWZpbmVtZW50IGlzIHJlcXVpcmVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFRfTUFYX0JMT0NLUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM4OTY9c3RydWN0IGV4dDRfZXh0ZW50O1xuLS1cbmZzL2V4dDQvZXh0NC5oLTM5MDEtICovXG5mcy9leHQ0L2V4dDQuaDozOTAyOiNkZWZpbmUgRVhUX01BWF9CTE9DS1NcdDB4ZmZmZmZmZmZcbmZzL2V4dDQvZXh0NC5oLTM5MDMtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTUzMT1zdGF0aWMgaW50IGV4dDRfZXh0X3NlYXJjaF9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzMtICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6XG5mcy9leHQ0L2V4dGVudHMuYzoxNjM0OiAqIHJldHVybnMgYWxsb2NhdGVkIGJsb2NrIGluIHN1YnNlcXVlbnQgZXh0ZW50IG9yIEVYVF9NQVhfQkxPQ0tTLlxuZnMvZXh0NC9leHRlbnRzLmMtMTYzNS0gKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXNcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xNjQwPWV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDctXHRpZiAoZGVwdGggPT0gMCBcdTAwMjZcdTAwMjYgcGF0aC1cdTAwM2VwX2V4dCA9PSBOVUxMKVxuZnMvZXh0NC9leHRlbnRzLmM6MTY0ODpcdFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY0OS1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY0LVxuZnMvZXh0NC9leHRlbnRzLmM6MTY2NTpcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjYtfVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjktICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOlxuZnMvZXh0NC9leHRlbnRzLmM6MTY3MDogKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLU1xuZnMvZXh0NC9leHRlbnRzLmMtMTY3MS0gKi9cbmZzL2V4dDQvZXh0ZW50cy5jPTE2NzI9c3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjgwLVx0aWYgKGRlcHRoID09IDApXG5mcy9leHQ0L2V4dGVudHMuYzoxNjgxOlx0XHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0xNjgyLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTMtXG5mcy9leHQ0L2V4dGVudHMuYzoxNjk0Olx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY5NS19XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTk0Mj1zdGF0aWMgdW5zaWduZWQgaW50IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE5NjMtXHRcdGIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzoxOTY0Olx0XHRpZiAoYjIgPT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYy0xOTY1LVx0XHRcdGdvdG8gb3V0O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzAtXHRpZiAoYjEgJiM0MzsgbGVuMSBcdTAwM2MgYjEpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NzE6XHRcdGxlbjEgPSBFWFRfTUFYX0JMT0NLUyAtIGIxO1xuZnMvZXh0NC9leHRlbnRzLmMtMTk3Mi1cdFx0bmV3ZXh0LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGxlbjEpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTI9ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDItXHRmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MjEwMzpcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDQtXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVx1MDAzZWVlX2Jsb2NrKSBcdTAwM2UgbGUzMl90b19jcHUoZmV4LVx1MDAzZWVlX2Jsb2NrKSlcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDUtXHRcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzoyMTA2Olx0aWYgKG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHtcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDctXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpucGF0aDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yMjgwPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9maW5kX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMjkxLVx0XHQqbGJsayA9IDA7XG5mcy9leHQ0L2V4dGVudHMuYzoyMjkyOlx0XHRsZW4gPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTMtXHR9IGVsc2UgaWYgKCpsYmxrIFx1MDAzYyBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yNjIyPWV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYxLVx0XHRpZiAobnVtID09IDApIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NjI6XHRcdFx0aWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcbmZzL2V4dDQvZXh0ZW50cy5jLTI3NjMtXHRcdFx0XHQvKlxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTI4NDU9aW50IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yODc4LVx0ICovXG5mcy9leHQ0L2V4dGVudHMuYzoyODc5Olx0aWYgKGVuZCBcdTAwM2MgRVhUX01BWF9CTE9DS1MgLSAxKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yODgwLVx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ1NTE9aW50IGV4dDRfZXh0X3RydW5jYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDU3MC1cdFx0XHRcdTAwM2VcdTAwM2UgRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDU3MTpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzItXG5mcy9leHQ0L2V4dGVudHMuYy00NTczLXJldHJ5X3JlbW92ZV9zcGFjZTpcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzQ6XHRlcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gMSk7XG5mcy9leHQ0L2V4dGVudHMuYy00NTc1LVx0aWYgKGVyciA9PSAtRU5PTUVNKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTM0Mj1pbnQgZXh0NF9nZXRfZXNfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01Mzc3LVx0bGFzdF9ibGsgPSAoc3RhcnQgJiM0MzsgbGVuIC0gMSkgXHUwMDNlXHUwMDNlIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemVfYml0cztcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzg6XHRpZiAobGFzdF9ibGsgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzk6XHRcdGxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTtcbmZzL2V4dDQvZXh0ZW50cy5jLTUzODAtXHRsZW5fYmxrcyA9ICgoZXh0NF9sYmxrX3QpIGxhc3RfYmxrKSAtIHN0YXJ0X2JsayAmIzQzOyAxO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU0OTQ9ZXh0NF9leHRfc2hpZnRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDEtXHRleHQ0X2xibGtfdCBzdG9wLCAqaXRlcmF0b3IsIGV4X3N0YXJ0LCBleF9lbmQ7XG5mcy9leHQ0L2V4dGVudHMuYzo1NTAyOlx0ZXh0NF9sYmxrX3QgdG1wID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy01NTAzLVxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNC1cdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTUwNTpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy01NTA2LVx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTE5LVx0KiBhY2NvbW1vZGF0ZSB0aGUgc2hpZnQuICBGb3IgcmlnaHQgc2hpZnRzLCBtYWtlIHN1cmUgdGhlIGxhc3QgZXh0ZW50XG5mcy9leHQ0L2V4dGVudHMuYzo1NTIwOlx0KiB3b24mIzM5O3QgYmUgc2hpZnRlZCBiZXlvbmQgRVhUX01BWF9CTE9DS1MuXG5mcy9leHQ0L2V4dGVudHMuYy01NTIxLVx0Ki9cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTQzLVx0fSBlbHNlIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NDQ6XHRcdGlmIChzaGlmdCBcdTAwM2UgRVhUX01BWF9CTE9DS1MgLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU0NS1cdFx0ICAgIChzdG9wICYjNDM7IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4dGVudCkpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU2Mi1cbmZzL2V4dDQvZXh0ZW50cy5jOjU1NjM6XHRpZiAodG1wICE9IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtNTU2NC1cdFx0Kml0ZXJhdG9yID0gdG1wO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU2Mzc9c3RhdGljIGludCBleHQ0X2NvbGxhcHNlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTUtXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTY5NjpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTctXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTczOD1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzItXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODMzOlx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNTgzNC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01ODc1PWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzEtXHRcdFx0LyogRG8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gc3dhcCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTkzMjpcdFx0XHRpZiAobmV4dDEgPT0gRVhUX01BWF9CTE9DS1MgfHwgbmV4dDIgPT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYy01OTMzLVx0XHRcdFx0Z290byBlcnJvdXQ7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjI2MS1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MjYyOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjMtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjMzOT1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzUwLVx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjYzNTE6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1Mi1cdFx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NTkxPXN0YXRpYyBpbnQgZXh0NF9lc19jYW5fYmVfbWVyZ2VkKHN0cnVjdCBleHRlbnRfc3RhdHVzICplczEsXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5Ni1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo1OTc6XHRpZiAoKChfX3U2NCkgZXMxLVx1MDAzZWVzX2xlbikgJiM0MzsgZXMyLVx1MDAzZWVzX2xlbiBcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHtcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy01OTgtXHRcdHByX3dhcm4oXCYjMzQ7RVMgYXNzZXJ0aW9uIGZhaWxlZCB3aGVuIG1lcmdpbmcgZXh0ZW50cy4gXCYjMzQ7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMC1cdFx0XHRcJiMzNDtpcyBiaWdnZXIgdGhhbiBhbGxvd2VkIGZpbGUgc2l6ZSAoJWQpXFxuXCYjMzQ7LFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjYwMTpcdFx0XHRlczEtXHUwMDNlZXNfbGVuLCBlczItXHUwMDNlZXNfbGVuLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAyLVx0XHRXQVJOX09OKDEpO1xuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYz0xOTQzPXN0YXRpYyBpbnQgZXNfcmVjbGFpbV9leHRlbnRzKHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpLCBpbnQgKm5yX3RvX3NjYW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTE5NTctXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6MTk1ODpcdGlmICghZXNfZG9fcmVjbGFpbV9leHRlbnRzKGVpLCBFWFRfTUFYX0JMT0NLUywgbnJfdG9fc2NhbiwgXHUwMDI2bnJfc2hydW5rKSBcdTAwMjZcdTAwMjZcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU5LVx0ICAgIHN0YXJ0ICE9IDApXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMTc9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNS1cdFx0Y3VyID0gMDtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMzM2Olx0XHRlbmQgPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM3LVx0XHRpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKSB7XG4tLVxuZnMvZXh0NC9pbmRpcmVjdC5jPTExMTI9dm9pZCBleHQ0X2luZF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM1LVxuZnMvZXh0NC9pbmRpcmVjdC5jOjExMzY6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNy1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTE4NjI9aW50IGV4dDRfaW5saW5lX2RhdGFfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50ICpoYXNfaW5saW5lKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTkwOC1cdFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKSlcbmZzL2V4dDQvaW5saW5lLmM6MTkwOTpcdFx0XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvaW5saW5lLmMtMTkxMC1cbi0tXG5mcy9leHQ0L2lub2RlLmM9NzAwPWludCBleHQ0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lub2RlLmMtNzIyLVxuZnMvZXh0NC9pbm9kZS5jOjcyMzpcdC8qIFdlIGNhbiBoYW5kbGUgdGhlIGJsb2NrIG51bWJlciBsZXNzIHRoYW4gRVhUX01BWF9CTE9DS1MgKi9cbmZzL2V4dDQvaW5vZGUuYzo3MjQ6XHRpZiAodW5saWtlbHkobWFwLVx1MDAzZW1fbGJsayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSlcbmZzL2V4dDQvaW5vZGUuYy03MjUtXHRcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xuLS1cbmZzL2V4dDQvaW5vZGUuYz0yMTczPXN0YXRpYyBpbnQgbXBhZ2VfcHJvY2Vzc19wYWdlX2J1ZnMoc3RydWN0IG1wYWdlX2RhX2RhdGEgKm1wZCxcbi0tXG5mcy9leHQ0L2lub2RlLmMtMjE4Mi1cdGlmIChleHQ0X3Zlcml0eV9pbl9wcm9ncmVzcyhpbm9kZSkpXG5mcy9leHQ0L2lub2RlLmM6MjE4MzpcdFx0YmxvY2tzID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2lub2RlLmMtMjE4NC1cbi0tXG5mcy9leHQ0L2lub2RlLmM9NjAwOT1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTYxNzItXHRcdFx0XHRcdGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemVfYml0cyxcbmZzL2V4dDQvaW5vZGUuYzo2MTczOlx0XHRcdFx0XHRFWFRfTUFYX0JMT0NLUyAtIDEpO1xuZnMvZXh0NC9pbm9kZS5jLTYxNzQtXHRcdFx0ZWxzZVxuLS1cbmZzL2V4dDQvaW9jdGwuYz0zMTM9c3RhdGljIHZvaWQgc3dhcF9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMilcbi0tXG5mcy9leHQ0L2lvY3RsLmMtMzQxLVx0c3dhcChlaTEtXHUwMDNlaV9kaXNrc2l6ZSwgZWkyLVx1MDAzZWlfZGlza3NpemUpO1xuZnMvZXh0NC9pb2N0bC5jOjM0MjpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTEsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvaW9jdGwuYzozNDM6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUyLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lvY3RsLmMtMzQ0LVxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jPTQ1MTk9ZXh0NF9tYl9ub3JtYWxpemVfcmVxdWVzdChzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLFxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDUtXHQvKiBhdm9pZCB1bm5lY2Vzc2FyeSBwcmVhbGxvY2F0aW9uIHRoYXQgbWF5IHRyaWdnZXIgYXNzZXJ0aW9ucyAqL1xuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNjpcdGlmIChzdGFydCAmIzQzOyBzaXplIFx1MDAzZSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvbWJhbGxvYy5jOjQ2MDc6XHRcdHNpemUgPSBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0O1xuZnMvZXh0NC9tYmFsbG9jLmMtNDYwOC1cbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cbmZzL2V4dDQvbWlncmF0ZS5jOjcwOlx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvbWlncmF0ZS5jLTcxLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4tLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jPTUxNz1zdGF0aWMgaW50IG1leHRfY2hlY2tfYWRqdXN0X3JhbmdlKHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSxcbi0tXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTMwLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMTpcdGlmICgob3JpZ19zdGFydCBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMjpcdCAgICAoZG9ub3Jfc3RhcnQgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzM6XHQgICAgKCpsZW4gXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNDpcdCAgICAoZG9ub3Jfc3RhcnQgJiM0MzsgKmxlbiBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNTpcdCAgICAob3JpZ19zdGFydCAmIzQzOyAqbGVuIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKSAge1xuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzNi1cdFx0ZXh0NF9kZWJ1ZyhcJiMzNDtleHQ0IG1vdmUgZXh0ZW50OiBDYW4mIzM5O3QgaGFuZGxlIG92ZXIgWyV1XSBibG9ja3MgW2lubzpvcmlnICVsbHUsIGRvbm9yICVsbHVdXFxuXCYjMzQ7LFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNzpcdFx0XHQgICBFWFRfTUFYX0JMT0NLUyxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzgtXHRcdFx0ICAgb3JpZ19pbm9kZS1cdTAwM2VpX2lubywgZG9ub3JfaW5vZGUtXHUwMDNlaV9pbm8pO1xuLS1cbmZzL2V4dDQvc3VwZXIuYz0xNTM5PXZvaWQgZXh0NF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvc3VwZXIuYy0xNTY4LVx0cmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpO1xuZnMvZXh0NC9zdXBlci5jOjE1Njk6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvc3VwZXIuYy0xNTcwLVx0ZHF1b3RfZHJvcChpbm9kZSk7XG4tLVxuZnMvZXh0NC92ZXJpdHkuYz0yNzE9c3RhdGljIGludCBleHQ0X2dldF92ZXJpdHlfZGVzY3JpcHRvcl9sb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvdmVyaXR5LmMtMjkzLVxuZnMvZXh0NC92ZXJpdHkuYzoyOTQ6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLCAwKTtcbmZzL2V4dDQvdmVyaXR5LmMtMjk1LVx0aWYgKElTX0VSUihwYXRoKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYyMzkKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgdGhlIEdlbmVzaXMgb2YgVGhpcyBDaGFuZ2UqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMgY2hhbmdlLiBUaGUgY29kZSBpdHNlbGYgKnNlZW1zKiBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBidXQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgaXQg4oCTIHRoZSAmIzM0O3doeSYjMzQ7IOKAkyBpcyBhbHdheXMgdGhlIGNydWNpYWwgcGllY2UsIGlzbiYjMzk7dCBpdD8gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGRpdmUgaW50byB0aGUgR2l0IGhpc3RvcnkuIExldCYjMzk7cyBzdGFydCB3aXRoIGBnaXQgbG9nYC4gSSB3YW50IHRvIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kaWZpY2F0aW9uLiBUaGF0IG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNvbnRleHQsIHRoZSBidWcgcmVwb3J0IG51bWJlciAoaG9wZWZ1bGx5ISksIHRoZSByZWFzb25pbmcsIG9yIGF0IGxlYXN0IGEgcmVmZXJlbmNlIHRvIHRoZSB0aWNrZXQgdGhhdCBzcHVycmVkIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrLiBJZGVhbGx5LCB0aGUgY29tbWl0IGxvZyB3aWxsIGNsYXJpZnkgdGhlIG9yaWdpbmFsIGludGVudGlvbiBhbmQgY29ubmVjdCBtZSB0byB0aGUgcmVsZXZhbnQgcHJvYmxlbSBvciBmZWF0dXJlIHJlcXVlc3QuIEZyb20gdGhlcmUsIEkmIzM5O2xsIGFzc2VzcyB0aGUgY29tbWl0JiMzOTtzIGxpbmVhZ2UgYW5kIGFueSByZWxhdGVkIGJyYW5jaGVzIHRvIGdldCBhIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoaXMgY2hhbmdlIGV2b2x2ZWQuIEkgY2FuIHVzdWFsbHkgZ2xlYW4gYSBsb3QgZnJvbSB0aGUgaGlzdG9yeSBpdHNlbGYsIGJ1dCBJIGFtIGhvcGluZyB0aGF0IEkgd29uJiMzOTt0IGhhdmUgdG8gc3RhcnQgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgaXNzdWUgYmFzZWQgb24gb25seSB0aGUgZGlmZi4gVWx0aW1hdGVseSwgbXkgZ29hbCBpcyB0byB0cmFjZSB0aGlzIGNoYW5nZSBiYWNrIHRvIGl0cyBvcmlnaW4sIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlLCBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCBhZGRyZXNzZWQgdGhlIG5lZWQgZWZmZWN0aXZlbHkgd2l0aGluIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jPTY1PXN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTY5LVxuZnMvZXh0NC9taWdyYXRlLmM6NzA6XHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY2NTAKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA3MTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJbnRlZ2VyIE92ZXJmbG93IEZpeCBpbiBleHQ0X2V4dF9taWdyYXRlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0aGF0IGludm9sdmVzIGEgbG9jYWwgc3RydWN0IGNhbGxlZCBgbWlncmF0ZV9zdHJ1Y3RgIChhbGlhc2VkIGFzIGBsYmAgaW4gdGhlIGNvZGUpLiBUaGUga2V5IGNoYW5nZSBhcHBlYXJzIHRvIGJlIGJ1bXBpbmcgdGhlIHNpemUgb2Ygc29tZSBibG9jayBudW1iZXIgZmllbGRzIHdpdGhpbiBgbGJgIGZyb20gMzItYml0IChgZXh0NF9sYmxrX3RgLCBha2EgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApLgoKTXkgZmlyc3QgdGhvdWdodCBpcyBhbHdheXMsIGRvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2UgYW55IHBvdGVudGlhbCBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzPyBMZXQmIzM5O3MgZ28gdGhyb3VnaCB0aGUgY2hlY2tsaXN0LgoKMS4gICoqVXNlcnNwYWNlIEV4cG9zdXJlOioqIElzIHRoaXMgbmV3IGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFueSB3YXk/IFRoYW5rZnVsbHksIG5vLiBUaGlzIHN0cnVjdCBpcyBsb2NhbCB0byB0aGUgYG1pZ3JhdGUuY2AgZmlsZSBhbmQgbmV2ZXIgYXBwZWFycyB0byBiZSBjb3BpZWQgb3V0IHZpYSBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluaywgaW9jdGwsIHNvY2tldHMsIG9yIEJQRi4gTm8gaXNzdWUgaGVyZS4KCjIuICAqKlVuaW5pdGlhbGl6ZWQgVmFyaWFibGVzOioqIElzIHRoZXJlIGFueSBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBtaWdodCBkZXBlbmQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIGBsYmAgaXMgKmV4cGxpY2l0bHkqIGluaXRpYWxpemVkIHRvIGFsbCB6ZXJvcyB3aXRoIGBtZW1zZXQoJmFtcDtsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSBhbnkgdXNlLiBUaGF0JiMzOTtzIGdvb2QgZGVmZW5zaXZlIHByb2dyYW1taW5nLgoKMy4gICoqQ29tcGxleCBEYXRhIFN0cnVjdHVyZSBJbml0aWFsaXphdGlvbjoqKiBJcyB0aGVyZSBhbnkgYWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBtb3JlIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcyB3aGVyZSBmaWVsZHMgY291bGQgYmUgdW5pbml0aWFsaXplZD8gTm8gYWdhaW4uIFRoaXMgYGxiYCBzdHJ1Y3QgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBhbmQgemVyb2VkLCBzbyB3ZSYjMzk7cmUgZ29vZCB0aGVyZS4KCjQuICAqKkJvdW5kcyBDaGVja2luZyBhbmQgTWVtb3J5IEFjY2VzczoqKiBJcyB0aGVyZSBhIHBvdGVudGlhbCBmb3IgYm91bmRzLWNoZWNrIGJ5cGFzc2VzIG9yIGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGRhdGEgaW4gc3Vycm91bmRpbmcgYnVmZmVycz8gV2VsbCwgdGhlIGNyaXRpY2FsIGxpbmUgYGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTYCBsb29rcyBsaWtlIGEga2V5IGJvdW5kcyBjaGVjay4gVGhlIHBhdGNoIGlzIHByZXZlbnRpbmcgYGxiLSZndDtjdXJyX2Jsb2NrYCAobm93IGEgNjQtYml0IHZhbHVlKSBmcm9tIGV4Y2VlZGluZyBgRVhUX01BWF9CTE9DS1NgLCB3aGljaCBsb29rcyBsaWtlIGEgaGFyZGNvZGVkIGNvbnN0YW50IHJlbGF0aW5nIHRvIGV4dGVudHMuIElmIGl0ICpkb2VzKiBnbyBiZXlvbmQsIHdlIGdldCBhIG5pY2UgYC1FT1BOT1RTVVBQYCBlcnJvci4gSXQmIzM5O3MgY2xlYXIgdGhhdCAqYmVmb3JlKiB0aGUgY2hhbmdlLCBhbiBvdmVyZmxvdyBvbiB0aGlzIDMyLWJpdCBmaWVsZCB3YXMgYSBwb3RlbnRpYWwgcHJvYmxlbS4gSXQgY291bGQgbGVhZCB0byB3cmFwcGluZyBhbmQgY29ycnVwdCBleHRlbnQgbWFuaXB1bGF0aW9ucy4KClNvLCB0aGlzIGxvb2tzIGxpa2UgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBmaXguIElmIGBsYi0mZ3Q7Y3Vycl9ibG9ja2Agd2VyZSB0byBleGNlZWQgYEVYVF9NQVhfQkxPQ0tTYCBvbiBhIGNvcnJ1cHQgb3Igb3RoZXJ3aXNlIG1hbGljaW91cyBmaWxlc3lzdGVtLCB0aGUgbWlncmF0aW9uIG1pZ2h0IGhhdmUgbWVzc2VkIHVwIGV4dGVudHMuIFNvIGZhciwgc28gZ29vZC4KCk5vdywgbGV0JiMzOTtzIGRvdWJsZS1jaGVjay4gSSBzZWUgdGhhdCB0aGUgYG5ld2V4dGAgdmFyaWFibGUgaXMgYSBgc3RydWN0IGV4dDRfZXh0ZW50YCwgd2hpY2ggaXMgcGFzc2VkIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSXQmIzM5O3MgcG9wdWxhdGVkIHVzaW5nIGRhdGEgZnJvbSBgbGJgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgKmV2ZXJ5KiBmaWVsZCBvZiBgbmV3ZXh0YCBpcyBhc3NpZ25lZCAqYmVmb3JlKiBpdCBnZXRzIHVzZWQuIEFuZCB0aGUgY29kZSBjb25maXJtcyBpdC4KVGhlIGFzc2lnbm1lbnRzIHRvIGBuZXdleHQuZWVfYmxvY2tgLCBgbmV3ZXh0LmVlX2xlbmAsIGFuZCB0aGUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgY2FsbHMsIHdoaWNoIHNldCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVycywgbG9vayBjbGVhbi4gSSB0aGluayB3ZSBhcmUgc2FmZSBoZXJlLCB0aGUgZml4IGlzIHZhbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgZXh0NF9leHRlbnQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01NS0gKi9cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXHRfX2xlMzJcdGVlX2Jsb2NrO1x0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTk1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBFeHQ0JiMzOTtzIEV4dGVudCBTdHJ1Y3R1cmVzKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGV4dDRfZXh0ZW50cy5oYC4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBsaW5lcyA1NiB0aHJvdWdoIDY1LiBJJiMzOTttIGd1ZXNzaW5nIHRoYXQgYXJlYSBwcm9iYWJseSBkZXRhaWxzIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGZvciBleHRlbnQtYmFzZWQgZmlsZSBtYXBwaW5nIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBkZWZpbml0aW9ucyBmb3Igc3RydWN0cyB0aGF0IGhvbGQgaW5mb3JtYXRpb24gbGlrZSB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzLCB0aGUgcGh5c2ljYWwgYmxvY2sgYWRkcmVzcywgdGhlIGV4dGVudCBsZW5ndGgsIGFuZCBwb3RlbnRpYWxseSBzb21lIGZsYWdzIG9yIG1ldGFkYXRhIGFib3V0IHRoZSBleHRlbnQuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyBleHQ0IG9yZ2FuaXplcyB0aGVzZSBleHRlbnRzLCBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGF0aW9uIHdpdGhpbiBhIGZpbGUsIGFuZCBob3cgaXQgdHJhbnNsYXRlcyBsb2dpY2FsIGJsb2NrIG51bWJlcnMgdG8gcGh5c2ljYWwgb25lcy4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGZpbGVzeXN0ZW0gbWFuYWdlcyBpdHMgb24tZGlzayBsYXlvdXQsIGFuZCBpbXByb3ZlIG15IGFiaWxpdHkgdG8gdHJvdWJsZXNob290IGV4dDQgcmVsYXRlZCBzdG9yYWdlIGlzc3Vlcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIGFjdHVhbGx5IHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNTY6XHRzdHJ1Y3QgZXh0NF9leHRlbnQge1xuICA1NzpcdFx0X19sZTMyXHRlZV9ibG9jaztcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xuICA1ODpcdFx0X19sZTE2XHRlZV9sZW47XHRcdC8qIG51bWJlciBvZiBibG9ja3MgY292ZXJlZCBieSBleHRlbnQgKi9cbiAgNTk6XHRcdF9fbGUxNlx0ZWVfc3RhcnRfaGk7XHQvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjA6XHRcdF9fbGUzMlx0ZWVfc3RhcnRfbG87XHQvKiBsb3cgMzIgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xuICA2MTpcdH07XG4gIDYyOlx0XG4gIDYzOlx0LypcbiAgNjQ6XHQgKiBUaGlzIGlzIGluZGV4IG9uLWRpc2sgc3RydWN0dXJlLlxuICA2NTpcdCAqIEl0JiMzOTtzIHVzZWQgYXQgYWxsIHRoZSBsZXZlbHMgZXhjZXB0IHRoZSBib3R0b20uXG4gIDY2Olx0ICovXG4gIDY3Olx0c3RydWN0IGV4dDRfZXh0ZW50X2lkeCB7XG4gIDY4Olx0XHRfX2xlMzJcdGVpX2Jsb2NrO1x0LyogaW5kZXggY292ZXJzIGxvZ2ljYWwgYmxvY2tzIGZyb20gJiMzOTtibG9jayYjMzk7ICovXG4gIDY5Olx0XHRfX2xlMzJcdGVpX2xlYWZfbG87XHQvKiBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBibG9jayBvZiB0aGUgbmV4dCAqXG4gIDcwOlx0XHRcdFx0XHQgKiBsZXZlbC4gbGVhZiBvciBuZXh0IGluZGV4IGNvdWxkIGJlIHRoZXJlICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzI5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgJiMzNDtBbmQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AmIzM0OyBhcyBhIHRob3VnaHQgcHJvY2VzcywgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzc3VtaW5nIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AqKgoKQWxyaWdodCwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEltbWVkaWF0ZWx5LCBteSBicmFpbiBnb2VzIHRvIHRoZSBjb3JlOiBob3cgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCB0aGUgYWxsb2NhdGlvbiBhbmQgc3RvcmFnZSBvZiBwaHlzaWNhbCBibG9ja3Mgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgZXh0ZW50LWJhc2VkIGZpbGVzLiBUaGUgbmFtZSBpdHNlbGYgaXMgcHJldHR5IGNsZWFyOiBpdCYjMzk7cyBhIGZ1bmN0aW9uIG9yIG1lY2hhbmlzbSByZWxhdGVkIHRvIHN0b3JpbmcgKG9yIG1hbmFnaW5nIHRoZSBzdG9yYWdlIG9mKSBwaHlzaWNhbCBibG9ja3MgbGlua2VkIHRvIGFuIGV4dGVudCBzdHJ1Y3R1cmUuCgpNeSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGxheWVycy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaW1wbGljYXRpb25zIGZvciBwZXJmb3JtYW5jZTogaG93IGVmZmljaWVudGx5IGlzIHRoaXMgaGFuZGxpbmcgYmxvY2sgYWxsb2NhdGlvbj8gV2hhdCBhcmUgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcz8gSXMgaXQgb3B0aW1pemVkIGZvciBzZXF1ZW50aWFsIHdyaXRlcywgcmFuZG9tIGFjY2Vzcywgb3IgYm90aD8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgbWFwcGluZywgb3IgaXMgdGhlcmUgc29tZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0YWRhdGEgaW52b2x2ZWQsIHBvdGVudGlhbGx5IHJlbGF0ZWQgdG8gYmxvY2sgZ3JvdXBzLCBibG9jayBiaXRtYXBzLCBvciBpbm9kZSBzdHJ1Y3R1cmVzPwoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gV2hhdCBoYXBwZW5zIGlmIHRoaXMgZnVuY3Rpb24gZW5jb3VudGVycyBhbiBhbGxvY2F0aW9uIGVycm9yPyBEb2VzIGl0IGdyYWNlZnVsbHkgaGFuZGxlIG91dC1vZi1zcGFjZSBjb25kaXRpb25zLCBvciBkb2VzIGl0IHRyaWdnZXIgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcj8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBpZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgY29uY3VycmVudGx5PyBJJiMzOTttIGltYWdpbmluZyBzY2VuYXJpb3Mgd2hlcmUgbXVsdGlwbGUgdGhyZWFkcyBvciBwcm9jZXNzZXMgY291bGQgYmUgYXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBibG9ja3Mgc2ltdWx0YW5lb3VzbHkuCgpUaGVuIHRoZXJlJiMzOTtzIHRoZSBiaWdnZXIgcGljdHVyZTogaG93IGRvZXMgdGhpcyBmdW5jdGlvbiBpbnRlZ3JhdGUgd2l0aCB0aGUgb3ZlcmFsbCBleHQ0IGFsbG9jYXRpb24gc3RyYXRlZ3k/IElzIGl0IGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGluIGltcGxlbWVudGluZyBmZWF0dXJlcyBsaWtlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvciB0aGUgZmlsZXN5c3RlbSYjMzk7cyBqb3VybmFsaW5nIHN5c3RlbT8gSSBjYW4gc2VlIGl0cyByZWxhdGlvbnNoaXAgdG8gYWxsb2NhdGlvbiBwb2xpY2llcywgaG93IGl0IG1hbmFnZXMgdGhlIGZpbGUmIzM5O3MgYmxvY2tzIGFuZCBob3cgdGhlIG1ldGFkYXRhIGludGVyYWN0cy4gSSBzdGFydCB0byBtZW50YWxseSB0cmFjZSB0aGUgY29kZSBwYXRoOiB3aGVyZSBpcyBpdCBjYWxsZWQgZnJvbT8gV2hhdCBzdHJ1Y3R1cmVzIGRvZXMgaXQgaW50ZXJhY3Qgd2l0aD8gV2hhdCBhcmUgaXRzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMsIGFuZCBob3cgYXJlIHRoZXNlIHZhbHVlcyB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBleHQ0IGZpbGVzeXN0ZW0/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MzM2CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBDb2RlKioKCk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBCYXNlZCBvbiB0aGUgcHJvYmxlbSBhdCBoYW5kLCBJIHRoaW5rIHRoZSBjcml0aWNhbCBjb2RlIHNlZ21lbnQgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGluIGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gSSYjMzk7bSBmb2N1c2luZyBteSBhdHRlbnRpb24gb24gbGluZXMgMjQ2LTI1NSB3aXRoaW4gdGhhdCBmaWxlLiBUaGlzIHJhbmdlIGxpa2VseSBjb250YWlucyB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgcGVyaGFwcyBzb21lIGNyaXRpY2FsIG1hY3JvIGRlZmluaXRpb25zIGRpcmVjdGx5IGludm9sdmVkIGluIHRoZSBleHRlbnQgbWFuYWdlbWVudC4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQgaW4gdGhlcmUuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCYjMzk7cyBnZXQgc3RhcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQ2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNDY6XHRzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG4gMjQ3Olx0XHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4gMjQ4Olx0e1xuIDI0OTpcdFx0ZXgtXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFx1MDAyNiAweGZmZmZmZmZmKSk7XG4gMjUwOlx0XHRleC1cdTAwM2VlZV9zdGFydF9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiIFx1MDAzZVx1MDAzZSAzMSkgXHUwMDNlXHUwMDNlIDEpIFx1MDAyNlxuIDI1MTpcdFx0XHRcdFx0ICAgICAgMHhmZmZmKTtcbiAyNTI6XHR9XG4gMjUzOlx0XG4gMjU0Olx0LypcbiAyNTU6XHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NzM1CgkJCQkJCQlvdXRwdXQ6IDIzOAoJCQkJCQkJdGhvdWdodHM6IDQ0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50OiBOZWVkc0tNU0FOID0gZmFsc2UqKgoKT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJJiMzOTttIHByZXR0eSBjb25maWRlbnQgaW4gbXkgYXNzZXNzbWVudC4gVGhlIGBuZXdleHRgIGZpZWxkcyBhcmUgYWxsIGdvb2Qg4oCTIHRoZXkgd2VyZW4mIzM5O3QgZXZlbiB0b3VjaGVkIGhlcmUsIHNvIG5vIGNvbmNlcm5zIHRoZXJlLiBUaGlzIHBhdGNoIGlzIGZvY3VzZWQgc29sZWx5IG9uIHRoZSBgbWlncmF0ZV9zdHJ1Y3RgIGFuZCBtYWtpbmcgc29tZSBjaGFuZ2VzIHJlbGF0ZWQgdG8gaG93IHdlIGhhbmRsZSBsb2dpY2FsIGJsb2NrIG51bWJlcnMsIHNwZWNpZmljYWxseSBleHBhbmRpbmcgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGZyb20gMzItYml0IHRvIDY0LWJpdCBpbnRlZ2Vycy4gVGhlcmUmIzM5O3MgYWxzbyBhIGNoZWNrIGFkZGVkIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBwcmV2ZW50IGV4Y2VlZGluZyB0aGUgYEVYVF9NQVhfQkxPQ0tTYCBsaW1pdC4gRXNzZW50aWFsbHksIGl0JiMzOTtzIGFib3V0IHByZXZlbnRpbmcgYSAzMi1iaXQgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBhbiBleHRlbnQtYmFzZWQgcmVwcmVzZW50YXRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uCgpUaGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBgbGJgLCBvdXIgYG1pZ3JhdGVfc3RydWN0YCBpbnN0YW5jZSwgaXMgaW5pdGlhbGl6ZWQgd2l0aCBgbWVtc2V0KCZhbXA7bGIsIDAsIHNpemVvZihsYikpYCByaWdodCBhdCB0aGUgYmVnaW5uaW5nLiBUaGF0IHplcm9zIG91dCAqZXZlcnl0aGluZyouIFRoZXJlJiMzOTtzIG5vIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGludm9sdmVkLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIEtNU0FOLCBubyB1bmluaXRpYWxpemVkIHJlYWRzLCBhbmQgZGVmaW5pdGVseSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBsZWFrcy4gVGhpcyBjaGFuZ2Ugb25seSBkZWFscyB3aXRoIGZpbGVzeXN0ZW0gbG9naWMsIGludGVnZXIgb3ZlcmZsb3csIGFuZCBib3VuZHMgY2hlY2tzLCBidXQgdGhlc2UgYXJlIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIEtNU0FOIGlzIGRlZmluaXRlbHkgbm90IHRoZSByaWdodCB0b29sIGZvciB0aGlzLiBXZSYjMzk7cmUgbG9va2luZyBhdCBzdGFuZGFyZCBpbnRlZ2VyIG92ZXJmbG93IGFuZCBib3VuZGFyeSBjb25kaXRpb25zIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpdHNlbGYuCgpMZXQgbWUgZG8gYSBxdWljayBzYW5pdHkgY2hlY2sgb2YgYWxsIG91ciByZXF1aXJlbWVudHM6CgoqICAgKipOZWVkc0tNU0FOOiBmYWxzZSoqIOKAkyBDb25maXJtZWQuCiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBgbWlncmF0ZV9zdHJ1Y3RgIGlzIHN0YWNrLWFsbG9jYXRlZCBhbmQgY29tcGxldGVseSB6ZXJvZWQuIFRoaXMgcGF0Y2ggYnJvYWRlbnMgdGhlIGxvZ2ljYWwgYmxvY2sgdHJhY2tpbmcgbWVtYmVycyB0byBgdTY0YCBhbmQgYWRkcyBhIGJvdW5kYXJ5IGNoZWNrIGFnYWluc3QgYEVYVF9NQVhfQkxPQ0tTYCB0byBwcmV2ZW50IDMyLWJpdCBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZyBpbmRpcmVjdCBibG9jayBtaWdyYXRpb24gdG8gZXh0ZW50cy4gTm8gbWVtb3J5IGlzIHNoYXJlZCB3aXRoIHVzZXIgc3BhY2UsIHRoZXJlIGFyZSBubyBjb250cm9sLWZsb3cgYnJhbmNoZXMgcmVseWluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGFjY2VzcyBpcyBpbnRyb2R1Y2VkLiBTdGFuZGFyZCBLQVNBTiBhbmQgZmlsZXN5c3RlbSB0ZXN0IHN1aXRlcyBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoaXMga2luZCBvZiBib3VuZHMvb3ZlcmZsb3cgZml4LiBLTVNBTiB3b3VsZCBiZSBvdmVya2lsbC4gV2UgZG9uJiMzOTt0IG5lZWQgZGVkaWNhdGVkIGZ1enppbmcgaGVyZS4KCkFscmlnaHQsIHRoYXQgY292ZXJzIGl0LiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXG5cblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cblxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjAuNjE3ODYxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM5NzI1NzIyMTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCIsXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYC4gVGhpcyBwcmV2ZW50cyBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGlub2RlcyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBiZWZvcmUgdXNlLiBJdCBpcyBzdHJpY3RseSBpbnRlcm5hbCBrZXJuZWwgbWV0YWRhdGEgYW5kIGlzIG5ldmVyIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJyYW5jaGVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBrZXJuZWwgaW5mby1sZWFrcy4gU3RhbmRhcmQgYnVnIGRldGVjdG9ycyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgYmxvY2sgbWlncmF0aW9uIGxvZ2ljIChjb252ZXJ0aW5nIGluZGlyZWN0LWJsb2NrIG1hcHBlZCBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIGlub2RlcykgYnkgd2lkZW5pbmcgYmxvY2sgb2Zmc2V0cyBpbiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgZnJvbSAzMi1iaXQgdG8gNjQtYml0IGFuZCBhZGRpbmcgYW4gdXBwZXItYm91bmQgY2hlY2sgYWdhaW5zdCBFWFRfTUFYX0JMT0NLUyBpbiB1cGRhdGVfZXh0ZW50X3JhbmdlKCkgdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgdGhlIEVYVDRfSU9DX01JR1JBVEUgaW9jdGwgYW5kIEZTX0lPQ19TRVRGTEFHUyB3aXRoIEVYVDRfRVhURU5UU19GTCBvbiBleHQ0IGZpbGVzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjAuNjE3ODY1NjdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MDE0ODAxMjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmZWMyYjA2YjA5YzY1NTI0NGFhZTk2OTQ3MjVmZGY5MjJmM2E5MjZhXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcXG5pbmRleCA1ZDYwZWYxMGZlMTEwLi45YWVkNGZkYWU2Nzg3IDEwMDY0NFxcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXFxuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcXG5AQCAtMTQsNyArMTQsNyBAQFxcbiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcXG4gICovXFxuIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuLVxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbitcXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XFxuIFxcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xcbiB9O1xcbiBcXG5AQCAtNjYsNiArNjYsMTAgQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiB7XFxuIFxcdGludCByZXR2YWw7XFxuK1xcbitcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuIFxcdC8qXFxuIFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiBcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjIuMDIwMDUyNTY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMTgwMDkzNjc0MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xuaW5kZXggNWQ2MGVmMTBmZTExMC4uOWFlZDRmZGFlNjc4NyAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xuQEAgLTE0LDcgKzE0LDcgQEBcbiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcbiAgKi9cbiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xuLVx0ZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4rXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiB9O1xuIFxuQEAgLTY2LDYgKzY2LDEwIEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIHtcbiBcdGludCByZXR2YWw7XG4rXG4rXHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4gXHQvKlxuIFx0ICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpXG4gXHQgKi9cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjIyLjAyMDA1NDA1NFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU0MzE5NTg2OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBleHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIEkndmUgZ290IHRoaXMgcGF0Y2ggYXBwbGllZCB0byBgZnMvZXh0NC9taWdyYXRlLmNgLCBhbmQgbXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBpdHMgaW1wYWN0LiBGaXJzdCwgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGRpZmYgaXRzZWxmLiBJJ2xsIHplcm8gaW4gb24gdGhlIGNoYW5nZXMgYXJvdW5kIGxpbmVzIDE0IGFuZCA2NiBzcGVjaWZpY2FsbHksIGFzIHRoZXNlIGFyZSBvZnRlbiBob3Qgc3BvdHMgZm9yIGNydWNpYWwgbG9naWMgb3IgZGF0YSBzdHJ1Y3R1cmUgbW9kaWZpY2F0aW9ucy4gVGhlbiwgdG8gZ2V0IHRoZSBjb21wbGV0ZSBwaWN0dXJlLCBJJ2xsIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgdGhlIHdob2xlIGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGFyb3VuZCB0aGUgbGluZXMgSSd2ZSBpZGVudGlmaWVkLCBhbmQgYWxsb3cgbWUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHBhcnRpY3VsYXIgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NTcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjI3LjQ1MjAxNjAyOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcXG4gICAyOlxcdC8qXFxuICAgMzpcXHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XFxuICAgNDpcXHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVxcdTAwM2VcXG4gICA1OlxcdCAqXFxuICAgNjpcXHQgKi9cXG4gICA3OlxcdFxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJleHQ0X2piZDIuaFxcXCJcXG4gIDEwOlxcdCNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gIDExOlxcdFxcbiAgMTI6XFx0LypcXG4gIDEzOlxcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxcbiAgMTQ6XFx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XFxuICAxNTpcXHQgKi9cXG4gIDE2OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuICAxNzpcXHRcXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XFxuICAxODpcXHRcXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcXG4gIDE5OlxcdH07XFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuICAyMjpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgMjM6XFx0XFxuICAyNDpcXHR7XFxuICAyNTpcXHRcXHRpbnQgcmV0dmFsID0gMCwgbmVlZGVkO1xcbiAgMjY6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4dDtcXG4gIDI3OlxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoO1xcbiAgMjg6XFx0XFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcXG4gIDI5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAgMzA6XFx0XFxuICAzMTpcXHRcXHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cXG4gIDMyOlxcdFxcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVxcdTAwM2VmaXJzdF9ibG9jayk7XFxuICAzMzpcXHRcXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEpO1xcbiAgMzQ6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleHQsIGxiLVxcdTAwM2VmaXJzdF9wYmxvY2spO1xcbiAgMzU6XFx0XFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG4gIDM2OlxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiAgMzc6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVxcdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XFxuICAzODpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuICAzOTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNDA6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNDE6XFx0XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKlxcbiAgNDQ6XFx0XFx0ICogQ2FsY3VsYXRlIHRoZSBjcmVkaXQgbmVlZGVkIHRvIGluc2VydGluZyB0aGlzIGV4dGVudFxcbiAgNDU6XFx0XFx0ICogU2luY2Ugd2UgYXJlIGRvaW5nIHRoaXMgaW4gbG9vcCB3ZSBtYXkgYWNjdW11bGF0ZSBleHRyYVxcbiAgNDY6XFx0XFx0ICogY3JlZGl0LiBCdXQgYmVsb3cgd2UgdHJ5IHRvIG5vdCBhY2N1bXVsYXRlIHRvbyBtdWNoXFxuICA0NzpcXHRcXHQgKiBvZiB0aGVtIGJ5IHJlc3RhcnRpbmcgdGhlIGpvdXJuYWwuXFxuICA0ODpcXHRcXHQgKi9cXG4gIDQ5OlxcdFxcdG5lZWRlZCA9IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChpbm9kZSxcXG4gIDUwOlxcdFxcdFxcdCAgICBsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEsIHBhdGgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xcbiAgNTM6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuICA1NDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA1NTpcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXh0LCAwKTtcXG4gIDU2OlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuICA1NzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNTg6XFx0ZXJyX291dDpcXG4gIDU5OlxcdFxcdHVwX3dyaXRlKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiAgNjA6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbiAgNjE6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IDA7XFxuICA2MjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDY2OlxcdFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgNjc6XFx0e1xcbiAgNjg6XFx0XFx0aW50IHJldHZhbDtcXG4gIDY5OlxcdFxcbiAgNzA6XFx0XFx0aWYgKGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxcbiAgNzE6XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiAgNzI6XFx0XFxuICA3MzpcXHRcXHQvKlxcbiAgNzQ6XFx0XFx0ICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpXFxuICA3NTpcXHRcXHQgKi9cXG4gIDc2OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrIFxcdTAwMjZcXHUwMDI2XFxuICA3NzpcXHRcXHRcXHQobGItXFx1MDAzZWxhc3RfcGJsb2NrKzEgPT0gcGJsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbiAgNzg6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXFx1MDAzZWN1cnJfYmxvY2spKSB7XFxuICA3OTpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4MDpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgODE6XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDgyOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgODM6XFx0XFx0fVxcbiAgODQ6XFx0XFx0LypcXG4gIDg1OlxcdFxcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxcbiAgODY6XFx0XFx0ICovXFxuICA4NzpcXHRcXHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xcbiAgODg6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IGxiLVxcdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcXG4gIDg5OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9ibG9jayA9IGxiLVxcdTAwM2VsYXN0X2Jsb2NrID0gbGItXFx1MDAzZWN1cnJfYmxvY2s7XFxuICA5MDpcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAgOTE6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDkyOlxcdH1cXG4gIDkzOlxcdFxcbiAgOTQ6XFx0c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgOTU6XFx0XFx0XFx0XFx0XFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gIDk2OlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA5NzpcXHR7XFxuICA5ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAgOTk6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDEwMDpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjcuNDUyMTQyMzE4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTE3MTQ1NzUxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIGBtaWdyYXRlLmNgIGluIHRoZSBleHQ0IEZpbGVzeXN0ZW0qKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gdGhlIGV4dDQgZmlsZXN5c3RlbSBhZ2FpbiwgYW5kIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4gTXkgZmlyc3QgdGhvdWdodCBpcywgXCJXaGVyZSdzIHRoZSBlbnRyeSBwb2ludD8gV2hlcmUgaXMgYG1pZ3JhdGUuY2AgYWN0dWFsbHkgKnVzZWQqIHdpdGhpbiB0aGUgbGFyZ2VyIGV4dDQgc3RydWN0dXJlP1wiIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGlvY3RscyBvciBzeXNjYWxscyB0cmlnZ2VyIHRoZSBjb2RlIGluIGBtaWdyYXRlLmNgLiBMZXQncyBzZWUuLi4gSSdsbCBzdGFydCBieSBkb2luZyBhIHRhcmdldGVkIHNlYXJjaCBmb3IgZnVuY3Rpb25zICp3aXRoaW4qIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50LiBPbmNlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMsIEkgY2FuIHRyYWNlIGJhY2sgdG8gdGhlIGluaXRpYXRpbmcgcG9pbnRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NjUyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0MzozNi42MjM2MDE3NjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc4NDYxNDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9leHRfbWlncmF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTMyNTQ9aW50IGV4dDRfZm9yY2Vfc2h1dGRvd24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIGZsYWdzKTtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTMyNTYtLyogbWlncmF0ZS5jICovXFxuZnMvZXh0NC9leHQ0Lmg6MzI1NzpleHRlcm4gaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICopO1xcbmZzL2V4dDQvZXh0NC5oLTMyNTgtZXh0ZXJuIGludCBleHQ0X2luZF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTU5MD1zdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0ZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy03MDUtXFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKVxcbmZzL2V4dDQvaW9jdGwuYzo3MDY6XFx0XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuZnMvZXh0NC9pb2N0bC5jLTcwNy1cXHRcXHRlbHNlXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9MTUzOD1zdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jLTE3MDEtXFx0XFx0aW5vZGVfbG9jaygoaW5vZGUpKTtcXG5mcy9leHQ0L2lvY3RsLmM6MTcwMjpcXHRcXHRlcnIgPSBleHQ0X2V4dF9taWdyYXRlKGlub2RlKTtcXG5mcy9leHQ0L2lvY3RsLmMtMTcwMy1cXHRcXHRpbm9kZV91bmxvY2soKGlub2RlKSk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0zOTQ9c3RhdGljIGludCBmcmVlX2V4dF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtNDEzLVxcbmZzL2V4dDQvbWlncmF0ZS5jOjQxNDppbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxNS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjM2LjY3MTQ1NDE5MVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2OTU4Njc4NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24gQ2FsbCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgZXh0NF9leHRfbWlncmF0ZWAgaXMgYmVpbmcgdXRpbGl6ZWQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEkndmUgbm90ZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGZyb20gdHdvIHNwZWNpZmljIGxvY2F0aW9ucy4gVGhlIGZpcnN0IGlzIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AsIHNwZWNpZmljYWxseSB3aGVuIHRoZSBgRlNfSU9DX1NFVEZMQUdTYCBpb2N0bCBpcyB1c2VkIHRvIHNldCB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZy4gTWFrZXMgc2Vuc2U7IHRoYXQncyB3aGVuIHdlJ2QgZXhwZWN0IGFuIGV4dGVudCBtaWdyYXRpb24gdG8gcG90ZW50aWFsbHkgb2NjdXIgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSBmaWxlc3lzdGVtJ3MgYmVoYXZpb3IuIFRoZSBzZWNvbmQgcG9pbnQgb2YgY2FsbCBpcyBgRVhUNF9JT0NfTUlHUkFURWAsIHdoaWNoIGlzIGFub3RoZXIgaW9jdGwsIGxpa2VseSBhIGRpcmVjdCBtaWdyYXRpb24gcmVxdWVzdC5cblxuVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSBjb250ZXh0LCBteSBuZXh0IG1vdmUgaXMgdG8gZGl2ZSBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLiBJJ20gZ29pbmcgdG8gZm9jdXMgYXJvdW5kIGxpbmUgMTcwMCBvZiB0aGF0IGZpbGUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIGhlbHAgbWUgZGV0ZXJtaW5lIHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW9jdGwgY2FsbHMsIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGJhY2tncm91bmQgdG8gZnVsbHkgYW5hbHl6ZSBob3cgdGhlc2UgbWlncmF0aW9ucyBhcmUgYmVpbmcgdHJpZ2dlcmVkLiBJdCBzaG91bGQgZ2l2ZSBtZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZvcm0gYSBzdHJvbmcgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGNvZGUgd29ya3MgYW5kIHRoZSBsb2dpYyBiZWhpbmQgaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMDksIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0MzozOS4zNjczMjQzMTZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pb2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2OTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2OTU6XFx0XFx0XFx0LypcXG4xNjk2OlxcdFxcdFxcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxcbjE2OTc6XFx0XFx0XFx0ICogUmVhZCBzdGlsbCBnb2VzIHRocm91Z2guIFdlIHRha2UgaV9kYXRhX3NlbSBpblxcbjE2OTg6XFx0XFx0XFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXFxuMTY5OTpcXHRcXHRcXHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxcbjE3MDA6XFx0XFx0XFx0ICovXFxuMTcwMTpcXHRcXHRcXHRpbm9kZV9sb2NrKChpbm9kZSkpO1xcbjE3MDI6XFx0XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuMTcwMzpcXHRcXHRcXHRpbm9kZV91bmxvY2soKGlub2RlKSk7XFxuMTcwNDpcXHRcXHRcXHRtbnRfZHJvcF93cml0ZV9maWxlKGZpbHApO1xcbjE3MDU6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4xNzA2OlxcdFxcdH1cXG4xNzA3OlxcdFxcbjE3MDg6XFx0XFx0Y2FzZSBFWFQ0X0lPQ19BTExPQ19EQV9CTEtTOlxcbjE3MDk6XFx0XFx0e1xcbjE3MTA6XFx0XFx0XFx0aW50IGVycjtcXG4xNzExOlxcdFxcdFxcdGlmICghaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpZG1hcCwgaW5vZGUpKVxcbjE3MTI6XFx0XFx0XFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuMTcxMzpcXHRcXG4xNzE0OlxcdFxcdFxcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjM5LjM2NzQ1MTA3NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg4NTUwODE2MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLlxuXG4qKkVYVDRfSU9DX01JR1JBVEUgRGVlcCBEaXZlKipcblxuQWxyaWdodCwgc28gSSdtIGZvY3VzaW5nIGluIG9uIGBFWFQ0X0lPQ19NSUdSQVRFYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcywgc28gbGV0J3MgZ2V0IGludG8gdGhlIGNvZGUuIExpbmUgMTY5MCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50LCBidXQgSSdsbCBwbGF5IGl0IHNhZmUgYW5kIHNjb3BlIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGZvciBhIGJldHRlciB1bmRlcnN0YW5kaW5nLiBJJ2xsIHRha2UgYSBsb29rIGF0IHRoZSBjb2RlIGJsb2NrIHNwYW5uaW5nIGxpbmVzIDE2ODAgdGhyb3VnaCAxNzAwLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZ3Jhc3AgdGhlIGludGVudCBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzcGVjaWZpYyBmZWF0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTg5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo0OC4yMjI1Mzg2MDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ0MjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW9jdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjgwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjgwOlxcdFxcdFxcdFxcdFxcdHNpemVvZihpbnB1dCkpKVxcbjE2ODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMTY4MjpcXHRcXG4xNjgzOlxcdFxcdFxcdHJldHVybiBleHQ0X2lvY3RsX2dyb3VwX2FkZChmaWxwLCBcXHUwMDI2aW5wdXQpO1xcbjE2ODQ6XFx0XFx0fVxcbjE2ODU6XFx0XFxuMTY4NjpcXHRcXHRjYXNlIEVYVDRfSU9DX01JR1JBVEU6XFxuMTY4NzpcXHRcXHR7XFxuMTY4ODpcXHRcXHRcXHRpbnQgZXJyO1xcbjE2ODk6XFx0XFx0XFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXFxuMTY5MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVBQ0NFUztcXG4xNjkxOlxcdFxcbjE2OTI6XFx0XFx0XFx0ZXJyID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTtcXG4xNjkzOlxcdFxcdFxcdGlmIChlcnIpXFxuMTY5NDpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjE2OTU6XFx0XFx0XFx0LypcXG4xNjk2OlxcdFxcdFxcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxcbjE2OTc6XFx0XFx0XFx0ICogUmVhZCBzdGlsbCBnb2VzIHRocm91Z2guIFdlIHRha2UgaV9kYXRhX3NlbSBpblxcbjE2OTg6XFx0XFx0XFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXFxuMTY5OTpcXHRcXHRcXHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo0OC4yMjI2ODk1NjhaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjgxODEyMDIyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEVYVDQgTWlncmF0aW9uIExvZ2ljKipcblxuT2theSwgc28gYEVYVDRfSU9DX01JR1JBVEVgIGFuZCBgRlNfSU9DX1NFVEZMQUdTYCBjYW4gdHJpZ2dlciB0aGUgYGV4dDRfZXh0X21pZ3JhdGUoKWAgZnVuY3Rpb24uIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgbWlncmF0aW9uLCBzbyBsZXQncyBjaGVjayBvdXQgYGZzL2V4dDQvbWlncmF0ZS5jYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgKndoeSogdGhpcyBjb21taXQgd2FzIG1hZGUgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgd2hhdCBwcm9ibGVtIGl0J3MgYWRkcmVzc2luZy4gTXkgcHJpbWFyeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSAqZG9lcyouXG5cbkknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvZGUgYXJvdW5kIGBleHQ0X2V4dF9taWdyYXRlYCB3aXRoaW4gdGhhdCBmaWxlLiBJIGFsc28gd2FudCB0byBzZWUgd2hvIGNhbGxzIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCwgYW5kIGhvdyB0aGF0IGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIGV4dGVudHMsIHRoaXMgd2lsbCBwcm92aWRlIGltcG9ydGFudCBjbHVlcyB0byB0aGUgdW5kZXJseWluZyBtZWNoYW5pc20gYW5kIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgb2YgdGhpcyBtaWdyYXRpb24gcHJvY2Vzcy4gVGhpcyB3aWxsIGhlbHAgbWUgYnVpbGQgYSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0ODAsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjUxLjA0MDgxMzgxNFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDg5ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDEwLFxuICBcIkxpbmVDb3VudFwiOiA5MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDEwOlxcdFxcdH1cXG4gNDExOlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQxMjpcXHR9XFxuIDQxMzpcXHRcXG4gNDE0OlxcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIDQxNTpcXHR7XFxuIDQxNjpcXHRcXHRoYW5kbGVfdCAqaGFuZGxlO1xcbiA0MTc6XFx0XFx0aW50IHJldHZhbCA9IDAsIGk7XFxuIDQxODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gNDE5OlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpO1xcbiA0MjA6XFx0XFx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xcbiA0MjE6XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiO1xcbiA0MjI6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcXG4gNDIzOlxcdFxcdF9fdTMyIGdvYWwsIHRtcF9jc3VtX3NlZWQ7XFxuIDQyNDpcXHRcXHR1aWRfdCBvd25lclsyXTtcXG4gNDI1OlxcdFxcdGludCBhbGxvY19jdHg7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdC8qXFxuIDQyODpcXHRcXHQgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZVxcbiA0Mjk6XFx0XFx0ICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC5cXG4gNDMwOlxcdFxcdCAqL1xcbiA0MzE6XFx0XFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXFx1MDAzZWlfc2IpIHx8XFxuIDQzMjpcXHRcXHQgICAgZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykgfHxcXG4gNDMzOlxcdFxcdCAgICBleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXFxuIDQzNDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNDM1OlxcdFxcbiA0MzY6XFx0XFx0aWYgKFNfSVNMTksoaW5vZGUtXFx1MDAzZWlfbW9kZSkgXFx1MDAyNlxcdTAwMjYgaW5vZGUtXFx1MDAzZWlfYmxvY2tzID09IDApXFxuIDQzNzpcXHRcXHRcXHQvKlxcbiA0Mzg6XFx0XFx0XFx0ICogZG9uJ3QgbWlncmF0ZSBmYXN0IHN5bWxpbmtcXG4gNDM5OlxcdFxcdFxcdCAqL1xcbiA0NDA6XFx0XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gNDQxOlxcdFxcbiA0NDI6XFx0XFx0YWxsb2NfY3R4ID0gZXh0NF93cml0ZXBhZ2VzX2Rvd25fd3JpdGUoaW5vZGUtXFx1MDAzZWlfc2IpO1xcbiA0NDM6XFx0XFxuIDQ0NDpcXHRcXHQvKlxcbiA0NDU6XFx0XFx0ICogV29yc3QgY2FzZSB3ZSBjYW4gdG91Y2ggdGhlIGFsbG9jYXRpb24gYml0bWFwcyBhbmQgYSBibG9ja1xcbiA0NDY6XFx0XFx0ICogZ3JvdXAgZGVzY3JpcHRvciBibG9jay4gIFdlIGRvIG5lZWQgdG8gd29ycnkgYWJvdXRcXG4gNDQ3OlxcdFxcdCAqIGNyZWRpdHMgZm9yIG1vZGlmeWluZyB0aGUgcXVvdGEgaW5vZGUuXFxuIDQ0ODpcXHRcXHQgKi9cXG4gNDQ5OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLFxcbiA0NTA6XFx0XFx0XFx0MyArIEVYVDRfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhpbm9kZS1cXHUwMDNlaV9zYikpO1xcbiA0NTE6XFx0XFxuIDQ1MjpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNDUzOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNDU0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDU1OlxcdFxcdH1cXG4gNDU2OlxcdFxcdC8qXFxuIDQ1NzpcXHRcXHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUncyBibG9jayBtYXBwaW5nIGxheW91dFxcbiA0NTg6XFx0XFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcXG4gNDU5OlxcdFxcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXFxuIDQ2MDpcXHRcXHQgKi9cXG4gNDYxOlxcdFxcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVxcdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xcbiA0NjI6XFx0XFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXFx1MDAzZWlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSAqXFxuIDQ2MzpcXHRcXHRcXHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSArIDE7XFxuIDQ2NDpcXHRcXHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xcbiA0NjU6XFx0XFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcXG4gNDY2OlxcdFxcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KSxcXG4gNDY3OlxcdFxcdFxcdFxcdFxcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcXG4gNDY4OlxcdFxcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xcbiA0Njk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xcbiA0NzA6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDcxOlxcdFxcdFxcdHRtcF9pbm9kZSA9IE5VTEw7XFxuIDQ3MjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ3MzpcXHRcXHR9XFxuIDQ3NDpcXHRcXHQvKlxcbiA0NzU6XFx0XFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJ2lub2RlJykuICBUaGlzXFxuIDQ3NjpcXHRcXHQgKiBpcyBzbyB0aGF0IHRoZSBtZXRhZGF0YSBibG9ja3Mgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IGNoZWNrc3VtIGFmdGVyXFxuIDQ3NzpcXHRcXHQgKiB0aGUgbWlncmF0aW9uLlxcbiA0Nzg6XFx0XFx0ICovXFxuIDQ3OTpcXHRcXHRlaSA9IEVYVDRfSShpbm9kZSk7XFxuIDQ4MDpcXHRcXHR0bXBfY3N1bV9zZWVkID0gRVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0ODE6XFx0XFx0RVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkID0gZWktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0ODI6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4gNDgzOlxcdFxcdC8qXFxuIDQ4NDpcXHRcXHQgKiBTZXQgdGhlIGlfbmxpbmsgdG8gemVybyBzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXJcXG4gNDg1OlxcdFxcdCAqIHdoZW4gd2UgZHJvcCBpbm9kZSByZWZlcmVuY2UuXFxuIDQ4NjpcXHRcXHQgKi9cXG4gNDg3OlxcdFxcdGNsZWFyX25saW5rKHRtcF9pbm9kZSk7XFxuIDQ4ODpcXHRcXG4gNDg5OlxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuIDQ5MDpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0OTE6XFx0XFxuIDQ5MjpcXHRcXHQvKlxcbiA0OTM6XFx0XFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcXG4gNDk0OlxcdFxcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxcbiA0OTU6XFx0XFx0ICpcXG4gNDk2OlxcdFxcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXFxuIDQ5NzpcXHRcXHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcXG4gNDk4OlxcdFxcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXFxuIDQ5OTpcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6NTEuMDQwOTI0OTk0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMwNzE3NjY0NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSBsaW5lcyBvZiBgZXh0NF9leHRfbWlncmF0ZWAgZnJvbSA1MDAgdG8gNjAwOlxuXG4qKkFuYWx5emluZyBleHQ0X2V4dF9taWdyYXRlOiBMaW5lcyA1MDAtNjAwKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eS4gSSdtIGZvY3VzaW5nIG9uIGxpbmVzIDUwMC02MDAgaW4gYGV4dDRfZXh0X21pZ3JhdGVgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHNlY3Rpb24gaXMgcHJvYmFibHkgZGVhbGluZyB3aXRoIHRoZSBpbnRyaWNhdGUgcHJvY2VzcyBvZiBhY3R1YWxseSAqbW92aW5nKiBkYXRhIGJsb2NrcyBkdXJpbmcgYW4gZXh0ZW50LWJhc2VkIG1pZ3JhdGlvbiwgb3IsIGlmIG5vdCBtb3ZpbmcsIHNldHRpbmcgdXAgdGhlIG1hcHBpbmcgc28gdGhhdCBtb3ZpbmcgY2FuIGhhcHBlbi4gR2l2ZW4gdGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uJ3MgbmFtZSwgdGhhdCdzIHdoYXQgSSdkIGV4cGVjdC4gSSdsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGRldGFpbHMgYXJvdW5kIGJsb2NrIGFsbG9jYXRpb24sIHRoZSBoYW5kbGluZyBvZiBpbmRpcmVjdCBibG9ja3MgKGVzcGVjaWFsbHkgaWYgdGhlIG1pZ3JhdGlvbiBpbnZvbHZlcyBhIGZpbGUgdGhhdCBoYXMgZ3Jvd24gYmV5b25kIGl0cyBpbml0aWFsIGxheW91dCksIGFuZCBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgZXJyb3ItaGFuZGxpbmcgdGhhdCBtaWdodCBjb21lIGludG8gcGxheSBkdXJpbmcgdGhpcyBjcml0aWNhbCBvcGVyYXRpb24uIEFyZSB0aGVyZSBjaGVja3MgZm9yIGRhdGEgY29uc2lzdGVuY3k/IFdoYXQgYWJvdXQgam91cm5hbGluZyBjb25jZXJucz8gSSdtIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGUgc3lzdGVtIGVuc3VyZXMgZXZlcnl0aGluZyBpcyB1cGRhdGVkIGNvcnJlY3RseSwgZXNwZWNpYWxseSBpbiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBzeXN0ZW0gaW50ZXJydXB0aW9ucy4gSSdtIGdvaW5nIHRvIGJlIGxvb2tpbmcgZm9yIGNsdWVzIG9uIGhvdyB0aGUgZXh0ZW50IHRyZWUgaXMgbW9kaWZpZWQgdGhyb3VnaG91dCB0aGlzIG9wZXJhdGlvbi4gSSdtIGV4cGVjdGluZyBzb21lIGtpbmQgb2YgbG9vcCBpdGVyYXRpb24sIHByb2JhYmx5IG9uIGV4dGVudHMsIHdpdGggZGV0YWlsZWQgc3RlcHMgdG8gbWFpbnRhaW4gZGF0YSBpbnRlZ3JpdHkgYW5kIGNvbnNpc3RlbmN5LiBJIGFsc28gc3VzcGVjdCB0aGVyZSB3aWxsIGJlIHNvbWUgY2hlY2tzIG9yIGludGVyYWN0aW9ucyByZWxhdGVkIHRvIG1ldGFkYXRhIHVwZGF0ZXMsIHNpbmNlIHdlJ3JlIHJlYXJyYW5naW5nIGJsb2Nrcy4gRmluYWxseSwgSSdtIGV4cGVjdGluZyBzb21lIGxldmVsIG9mIGNvbXBsZXhpdHkuIEV4dGVudCBtaWdyYXRpb24gaXMgYSBzb3BoaXN0aWNhdGVkIHByb2Nlc3MsIGFuZCB0aGUgY29yZSBvZiB0aGUgd29yaywgdGhhdCdzIHdoeSB0aGVzZSBsaW5lcyBhcmUgaW1wb3J0YW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjQ4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo1NC4xMTI2OTM1MDhaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyMTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MDA6XFx0XFx0LypcXG4gNTAxOlxcdFxcdCAqIEV2ZW4gdGhvdWdoIHdlIHRha2UgaV9yd3NlbSB3ZSBjYW4gc3RpbGwgY2F1c2UgYmxvY2tcXG4gNTAyOlxcdFxcdCAqIGFsbG9jYXRpb24gdmlhIG1tYXAgd3JpdGUgdG8gaG9sZXMuIElmIHdlIGhhdmUgYWxsb2NhdGVkXFxuIDUwMzpcXHRcXHQgKiBuZXcgYmxvY2tzIHdlIGZhaWwgbWlncmF0ZS4gIE5ldyBibG9jayBhbGxvY2F0aW9uIHdpbGxcXG4gNTA0OlxcdFxcdCAqIGNsZWFyIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUgZmxhZy4gIFRoZSBmbGFnIGlzIHVwZGF0ZWRcXG4gNTA1OlxcdFxcdCAqIHdpdGggaV9kYXRhX3NlbSBoZWxkIHRvIHByZXZlbnQgcmFjaW5nIHdpdGggYmxvY2tcXG4gNTA2OlxcdFxcdCAqIGFsbG9jYXRpb24uXFxuIDUwNzpcXHRcXHQgKi9cXG4gNTA4OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuIDUwOTpcXHRcXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XFxuIDUxMDpcXHRcXHR1cF9yZWFkKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiA1MTE6XFx0XFxuIDUxMjpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSwgMSk7XFxuIDUxMzpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNTE0OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNTE1OlxcdFxcdFxcdGdvdG8gb3V0X3RtcF9pbm9kZTtcXG4gNTE2OlxcdFxcdH1cXG4gNTE3OlxcdFxcbiA1MTg6XFx0XFx0aV9kYXRhID0gZWktXFx1MDAzZWlfZGF0YTtcXG4gNTE5OlxcdFxcdG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpO1xcbiA1MjA6XFx0XFxuIDUyMTpcXHRcXHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXFxuIDUyMjpcXHRcXHRtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiA1MjM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkrKykge1xcbiA1MjQ6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiA1MjU6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTI2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFxcdTAwMjZsYik7XFxuIDUyNzpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiA1Mjg6XFx0XFx0XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiA1Mjk6XFx0XFx0XFx0fSBlbHNlXFxuIDUzMDpcXHRcXHRcXHRcXHRsYi5jdXJyX2Jsb2NrKys7XFxuIDUzMTpcXHRcXHR9XFxuIDUzMjpcXHRcXHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xcbiA1MzM6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsXFxuIDUzNDpcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdKSwgXFx1MDAyNmxiKTtcXG4gNTM1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDUzNjpcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDUzNzpcXHRcXHR9IGVsc2VcXG4gNTM4OlxcdFxcdFxcdGxiLmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXM7XFxuIDUzOTpcXHRcXHRpZiAoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pIHtcXG4gNTQwOlxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTQxOlxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXFx1MDAyNmxiKTtcXG4gNTQyOlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU0MzpcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDU0NDpcXHRcXHR9IGVsc2VcXG4gNTQ1OlxcdFxcdFxcdGxiLmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gNTQ2OlxcdFxcdGlmIChpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSkge1xcbiA1NDc6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1NDg6XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1NDk6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTUwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTUxOlxcdFxcdH1cXG4gNTUyOlxcdFxcdC8qXFxuIDU1MzpcXHRcXHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcXG4gNTU0OlxcdFxcdCAqL1xcbiA1NTU6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcXHUwMDI2bGIpO1xcbiA1NTY6XFx0ZXJyX291dDpcXG4gNTU3OlxcdFxcdGlmIChyZXR2YWwpXFxuIDU1ODpcXHRcXHRcXHQvKlxcbiA1NTk6XFx0XFx0XFx0ICogRmFpbHVyZSBjYXNlIGRlbGV0ZSB0aGUgZXh0ZW50IGluZm9ybWF0aW9uIHdpdGggdGhlXFxuIDU2MDpcXHRcXHRcXHQgKiB0bXBfaW5vZGVcXG4gNTYxOlxcdFxcdFxcdCAqL1xcbiA1NjI6XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NjM6XFx0XFx0ZWxzZSB7XFxuIDU2NDpcXHRcXHRcXHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcXG4gNTY1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU2NjpcXHRcXHRcXHRcXHQvKlxcbiA1Njc6XFx0XFx0XFx0XFx0ICogaWYgd2UgZmFpbCB0byBzd2FwIGlub2RlIGRhdGEgZnJlZSB0aGUgZXh0ZW50XFxuIDU2ODpcXHRcXHRcXHRcXHQgKiBkZXRhaWxzIG9mIHRoZSB0bXAgaW5vZGVcXG4gNTY5OlxcdFxcdFxcdFxcdCAqL1xcbiA1NzA6XFx0XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NzE6XFx0XFx0fVxcbiA1NzI6XFx0XFxuIDU3MzpcXHRcXHQvKiBXZSBtYXJrIHRoZSB0bXBfaW5vZGUgZGlydHkgdmlhIGV4dDRfZXh0X3RyZWVfaW5pdC4gKi9cXG4gNTc0OlxcdFxcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIDEsIDApO1xcbiA1NzU6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDU3NjpcXHRcXHRcXHRnb3RvIG91dF9zdG9wO1xcbiA1Nzc6XFx0XFx0LypcXG4gNTc4OlxcdFxcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cXG4gNTc5OlxcdFxcdCAqL1xcbiA1ODA6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XFxuIDU4MTpcXHRcXG4gNTgyOlxcdFxcdC8qXFxuIDU4MzpcXHRcXHQgKiBzZXQgdGhlICBpX2Jsb2NrcyBjb3VudCB0byB6ZXJvXFxuIDU4NDpcXHRcXHQgKiBzbyB0aGF0IHRoZSBleHQ0X2V2aWN0X2lub2RlKCkgZG9lcyB0aGVcXG4gNTg1OlxcdFxcdCAqIHJpZ2h0IGpvYlxcbiA1ODY6XFx0XFx0ICpcXG4gNTg3OlxcdFxcdCAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGUgaV9sb2NrIGJlY2F1c2VcXG4gNTg4OlxcdFxcdCAqIHRoZSBpbm9kZSBpcyBub3QgdmlzaWJsZSB0byB1c2VyIHNwYWNlLlxcbiA1ODk6XFx0XFx0ICovXFxuIDU5MDpcXHRcXHR0bXBfaW5vZGUtXFx1MDAzZWlfYmxvY2tzID0gMDtcXG4gNTkxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XFxuIDU5MjpcXHRcXG4gNTkzOlxcdFxcdC8qIFJlc2V0IHRoZSBleHRlbnQgZGV0YWlscyAqL1xcbiA1OTQ6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNTk1OlxcdG91dF9zdG9wOlxcbiA1OTY6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNTk3OlxcdG91dF90bXBfaW5vZGU6XFxuIDU5ODpcXHRcXHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XFxuIDU5OTpcXHRvdXRfdW5sb2NrOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo1NC4xMTI4MTc0MDhaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTMzNDU5NjMxMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGluIEV4dDQgQmxvY2sgTWFuYWdlbWVudCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIldoYXQncyB0aGUgc2l0dWF0aW9uIGhlcmU/XCIgSSdtIGxvb2tpbmcgYXQgbGluZXMgNTM4IGFuZCA1NDUsIHNwZWNpZmljYWxseSB0aGlzOiBgbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztgIGFuZCBgbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO2AuIEltbWVkaWF0ZWx5LCBJJ20gdGhpbmtpbmcsIFwiV2FpdCBhIG1pbnV0ZSwgd2hhdCBoYXBwZW5zIGlmIGBsYi5jdXJyX2Jsb2NrYCBvdmVyZmxvd3Mgb3IgYmVjb21lcyBsYXJnZXIgdGhhbiBgRVhUX01BWF9CTE9DS1NgP1wiIFRoYXQgY291bGQgY2F1c2Ugc29tZSBzZXJpb3VzIHByb2JsZW1zIHdpdGggYmxvY2sgYWxsb2NhdGlvbi5cblxuQWgsIGhvbGQgb24hIFRoZXJlJ3MgYSByZWxldmFudCBwYXRjaCBoZXJlLiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZTpcblxuYGBgY1xuc3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbi1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuK1x0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuIFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XG4gfTtcbiBcbkBAIC02Niw2ICs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuK1xuK1x0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuIFx0LypcbiBcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuIFx0ICovXG5gYGBcblxuUmlnaHQsIHRoZXkndmUgYWN0dWFsbHkgYWRkcmVzc2VkIHRoaXMgd2l0aCBhIGNoZWNrIG5vdzogYGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgLiBUaGF0J3MgZ29vZDsgYSBzYW5pdHkgY2hlY2sgaXMgaW1wbGVtZW50ZWQsIGJ1dCBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSogb2YgdGhpcy5cblxuVGhlbiBpdCBoaXRzIG1lISBJJ20gcmVtZW1iZXJpbmcgdGhhdCBgZXh0NF9sYmxrX3RgIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gVGhlIHBvdGVudGlhbCBmb3Igb3ZlcmZsb3cgaXMgZGVmaW5pdGVseSB0aGVyZSwgZXNwZWNpYWxseSBpbiBjYXNlcyB3aXRoIGRlZXBseSBpbmRpcmVjdC1tYXBwZWQgZmlsZXMgYW5kIGEgbGFyZ2UgYG1heF9lbnRyaWVzYC4gSW4gZmFjdCwgYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgY291bGQgcXVpY2tseSBleGNlZWQgdGhlIHJhbmdlIG9mIGEgMzItYml0IGludGVnZXIuIFRoYXQgaXMgdGhlIHZ1bG5lcmFiaWxpdHkuIEkgc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNvZGUgaW4gbW9yZSBkZXRhaWwuXG5cbk5vdywgSSdtIGFza2luZyBteXNlbGYuLi4gXCJXaGF0ICppcyogYEVYVF9NQVhfQkxPQ0tTYD9cIiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGxpbWl0IHRvIGZ1bGx5IGdyYXNwIHRoZSBjb250ZXh0LiBJJ2xsIHNlYXJjaCBmb3IgaXRzIGRlZmluaXRpb24gdG8gY2xhcmlmeSB0aGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjMzLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MDcuNDU4NzgzNDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODQ3MDY5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFRfTUFYX0JMT0NLU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM4OTY9c3RydWN0IGV4dDRfZXh0ZW50O1xcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzkwMS0gKi9cXG5mcy9leHQ0L2V4dDQuaDozOTAyOiNkZWZpbmUgRVhUX01BWF9CTE9DS1NcXHQweGZmZmZmZmZmXFxuZnMvZXh0NC9leHQ0LmgtMzkwMy1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE1MzE9c3RhdGljIGludCBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzMtICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6XFxuZnMvZXh0NC9leHRlbnRzLmM6MTYzNDogKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLUy5cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjM1LSAqIE5PVEU6IGl0IGNvbnNpZGVycyBibG9jayBudW1iZXIgZnJvbSBpbmRleCBlbnRyeSBhc1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTY0MD1leHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDctXFx0aWYgKGRlcHRoID09IDAgXFx1MDAyNlxcdTAwMjYgcGF0aC1cXHUwMDNlcF9leHQgPT0gTlVMTClcXG5mcy9leHQ0L2V4dGVudHMuYzoxNjQ4OlxcdFxcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ5LVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTY2NC1cXG5mcy9leHQ0L2V4dGVudHMuYzoxNjY1OlxcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY2LX1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjktICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NzA6ICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DS1NcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjcxLSAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jPTE2NzI9c3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2ODAtXFx0aWYgKGRlcHRoID09IDApXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY4MTpcXHRcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY4Mi1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTMtXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY5NDpcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY5NS19XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTYzLVxcdFxcdGIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MTk2NDpcXHRcXHRpZiAoYjIgPT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9leHRlbnRzLmMtMTk2NS1cXHRcXHRcXHRnb3RvIG91dDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzAtXFx0aWYgKGIxICsgbGVuMSBcXHUwMDNjIGIxKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6MTk3MTpcXHRcXHRsZW4xID0gRVhUX01BWF9CTE9DS1MgLSBiMTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcyLVxcdFxcdG5ld2V4dC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuMSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDItXFx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTAzOlxcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA0LVxcdGlmIChsZTMyX3RvX2NwdShuZXdleHQtXFx1MDAzZWVlX2Jsb2NrKSBcXHUwMDNlIGxlMzJfdG9fY3B1KGZleC1cXHUwMDNlZWVfYmxvY2spKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDUtXFx0XFx0bmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTA2OlxcdGlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwNy1cXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqbnBhdGg7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yMjgwPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9maW5kX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTEtXFx0XFx0KmxibGsgPSAwO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIyOTI6XFx0XFx0bGVuID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjI5My1cXHR9IGVsc2UgaWYgKCpsYmxrIFxcdTAwM2MgbGUzMl90b19jcHUoZXgtXFx1MDAzZWVlX2Jsb2NrKSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MjYyMj1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYxLVxcdFxcdGlmIChudW0gPT0gMCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NjI6XFx0XFx0XFx0aWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYzLVxcdFxcdFxcdFxcdC8qXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yODQ1PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yODc4LVxcdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI4Nzk6XFx0aWYgKGVuZCBcXHUwMDNjIEVYVF9NQVhfQkxPQ0tTIC0gMSkge1xcbmZzL2V4dDQvZXh0ZW50cy5jLTI4ODAtXFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTQ1NTE9aW50IGV4dDRfZXh0X3RydW5jYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00NTcwLVxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0NTcxOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NTcyLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzMtcmV0cnlfcmVtb3ZlX3NwYWNlOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzQ6XFx0ZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzUtXFx0aWYgKGVyciA9PSAtRU5PTUVNKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01MzQyPWludCBleHQ0X2dldF9lc19jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTM3Ny1cXHRsYXN0X2JsayA9IChzdGFydCArIGxlbiAtIDEpIFxcdTAwM2VcXHUwMDNlIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZV9iaXRzO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzg6XFx0aWYgKGxhc3RfYmxrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzk6XFx0XFx0bGFzdF9ibGsgPSBFWFRfTUFYX0JMT0NLUy0xO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTUzODAtXFx0bGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgKyAxO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTQ5ND1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTAxLVxcdGV4dDRfbGJsa190IHN0b3AsICppdGVyYXRvciwgZXhfc3RhcnQsIGV4X2VuZDtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTAyOlxcdGV4dDRfbGJsa190IHRtcCA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDMtXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNC1cXHQvKiBMZXQgcGF0aCBwb2ludCB0byB0aGUgbGFzdCBleHRlbnQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo1NTA1OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNi1cXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUxOS1cXHQqIGFjY29tbW9kYXRlIHRoZSBzaGlmdC4gIEZvciByaWdodCBzaGlmdHMsIG1ha2Ugc3VyZSB0aGUgbGFzdCBleHRlbnRcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTIwOlxcdCogd29uJ3QgYmUgc2hpZnRlZCBiZXlvbmQgRVhUX01BWF9CTE9DS1MuXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUyMS1cXHQqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTU0My1cXHR9IGVsc2Uge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NDQ6XFx0XFx0aWYgKHNoaWZ0IFxcdTAwM2UgRVhUX01BWF9CTE9DS1MgLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDUtXFx0XFx0ICAgIChzdG9wICsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXh0ZW50KSkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjItXFxuZnMvZXh0NC9leHRlbnRzLmM6NTU2MzpcXHRpZiAodG1wICE9IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjQtXFx0XFx0Kml0ZXJhdG9yID0gdG1wO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTYzNz1zdGF0aWMgaW50IGV4dDRfY29sbGFwc2VfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01Njk1LVxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTY5NjpcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIEVYVF9NQVhfQkxPQ0tTIC0gc3RhcnRfbGJsayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNTY5Ny1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3Mzg9c3RhdGljIGludCBleHQ0X2luc2VydF9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzItXFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4MzM6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzQtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01ODc1PWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMS1cXHRcXHRcXHQvKiBEbyB3ZSBoYXZlIHNvbWV0aGluZyB0byBzd2FwICovXFxuZnMvZXh0NC9leHRlbnRzLmM6NTkzMjpcXHRcXHRcXHRpZiAobmV4dDEgPT0gRVhUX01BWF9CTE9DS1MgfHwgbmV4dDIgPT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMy1cXHRcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYyNTI9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI2MS1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYyNjI6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MjYzLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MzM5PWludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1MC1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYzNTE6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MzUyLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NTkxPXN0YXRpYyBpbnQgZXh0NF9lc19jYW5fYmVfbWVyZ2VkKHN0cnVjdCBleHRlbnRfc3RhdHVzICplczEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk2LVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo1OTc6XFx0aWYgKCgoX191NjQpIGVzMS1cXHUwMDNlZXNfbGVuKSArIGVzMi1cXHUwMDNlZXNfbGVuIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHtcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk4LVxcdFxcdHByX3dhcm4oXFxcIkVTIGFzc2VydGlvbiBmYWlsZWQgd2hlbiBtZXJnaW5nIGV4dGVudHMuIFxcXCJcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02MDAtXFx0XFx0XFx0XFxcImlzIGJpZ2dlciB0aGFuIGFsbG93ZWQgZmlsZSBzaXplICglZClcXFxcblxcXCIsXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjYwMTpcXHRcXHRcXHRlczEtXFx1MDAzZWVzX2xlbiwgZXMyLVxcdTAwM2Vlc19sZW4sIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAyLVxcdFxcdFdBUk5fT04oMSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9MTk0Mz1zdGF0aWMgaW50IGVzX3JlY2xhaW1fZXh0ZW50cyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSwgaW50ICpucl90b19zY2FuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTE5NTctXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjE5NTg6XFx0aWYgKCFlc19kb19yZWNsYWltX2V4dGVudHMoZWksIEVYVF9NQVhfQkxPQ0tTLCBucl90b19zY2FuLCBcXHUwMDI2bnJfc2hydW5rKSBcXHUwMDI2XFx1MDAyNlxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU5LVxcdCAgICBzdGFydCAhPSAwKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMTc9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM1LVxcdFxcdGN1ciA9IDA7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzMzY6XFx0XFx0ZW5kID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzMzctXFx0XFx0aWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSkge1xcbi0tXFxuZnMvZXh0NC9pbmRpcmVjdC5jPTExMTI9dm9pZCBleHQ0X2luZF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmRpcmVjdC5jLTExMzUtXFxuZnMvZXh0NC9pbmRpcmVjdC5jOjExMzY6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIGxhc3RfYmxvY2spO1xcbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM3LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODYyPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTkwOC1cXHRcXHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpKVxcbmZzL2V4dDQvaW5saW5lLmM6MTkwOTpcXHRcXHRcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lubGluZS5jLTE5MTAtXFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9NzAwPWludCBleHQ0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy03MjItXFxuZnMvZXh0NC9pbm9kZS5jOjcyMzpcXHQvKiBXZSBjYW4gaGFuZGxlIHRoZSBibG9jayBudW1iZXIgbGVzcyB0aGFuIEVYVF9NQVhfQkxPQ0tTICovXFxuZnMvZXh0NC9pbm9kZS5jOjcyNDpcXHRpZiAodW5saWtlbHkobWFwLVxcdTAwM2VtX2xibGsgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKVxcbmZzL2V4dDQvaW5vZGUuYy03MjUtXFx0XFx0cmV0dXJuIC1FRlNDT1JSVVBURUQ7XFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9MjE3Mz1zdGF0aWMgaW50IG1wYWdlX3Byb2Nlc3NfcGFnZV9idWZzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQsXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtMjE4Mi1cXHRpZiAoZXh0NF92ZXJpdHlfaW5fcHJvZ3Jlc3MoaW5vZGUpKVxcbmZzL2V4dDQvaW5vZGUuYzoyMTgzOlxcdFxcdGJsb2NrcyA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvaW5vZGUuYy0yMTg0LVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTYwMDk9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTYxNzItXFx0XFx0XFx0XFx0XFx0aW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplX2JpdHMsXFxuZnMvZXh0NC9pbm9kZS5jOjYxNzM6XFx0XFx0XFx0XFx0XFx0RVhUX01BWF9CTE9DS1MgLSAxKTtcXG5mcy9leHQ0L2lub2RlLmMtNjE3NC1cXHRcXHRcXHRlbHNlXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9MzEzPXN0YXRpYyB2b2lkIHN3YXBfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmMtMzQxLVxcdHN3YXAoZWkxLVxcdTAwM2VpX2Rpc2tzaXplLCBlaTItXFx1MDAzZWlfZGlza3NpemUpO1xcbmZzL2V4dDQvaW9jdGwuYzozNDI6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMSwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvaW9jdGwuYzozNDM6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMiwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvaW9jdGwuYy0zNDQtXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuYz00NTE5PWV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyxcXG4tLVxcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDUtXFx0LyogYXZvaWQgdW5uZWNlc3NhcnkgcHJlYWxsb2NhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIGFzc2VydGlvbnMgKi9cXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA2OlxcdGlmIChzdGFydCArIHNpemUgXFx1MDAzZSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA3OlxcdFxcdHNpemUgPSBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0O1xcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDgtXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTY5LVxcbmZzL2V4dDQvbWlncmF0ZS5jOjcwOlxcdGlmIChsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L21pZ3JhdGUuYy03MS1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM9NTE3PXN0YXRpYyBpbnQgbWV4dF9jaGVja19hZGp1c3RfcmFuZ2Uoc3RydWN0IGlub2RlICpvcmlnX2lub2RlLFxcbi0tXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzMC1cXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMxOlxcdGlmICgob3JpZ19zdGFydCBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMyOlxcdCAgICAoZG9ub3Jfc3RhcnQgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMzpcXHQgICAgKCpsZW4gXFx1MDAzZSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTM0OlxcdCAgICAoZG9ub3Jfc3RhcnQgKyAqbGVuIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzU6XFx0ICAgIChvcmlnX3N0YXJ0ICsgKmxlbiBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykpICB7XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzNi1cXHRcXHRleHQ0X2RlYnVnKFxcXCJleHQ0IG1vdmUgZXh0ZW50OiBDYW4ndCBoYW5kbGUgb3ZlciBbJXVdIGJsb2NrcyBbaW5vOm9yaWcgJWxsdSwgZG9ub3IgJWxsdV1cXFxcblxcXCIsXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNzpcXHRcXHRcXHQgICBFWFRfTUFYX0JMT0NLUyxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTM4LVxcdFxcdFxcdCAgIG9yaWdfaW5vZGUtXFx1MDAzZWlfaW5vLCBkb25vcl9pbm9kZS1cXHUwMDNlaV9pbm8pO1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTE1Mzk9dm9pZCBleHQ0X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTU2OC1cXHRyZW1vdmVfaW5vZGVfaGFzaChpbm9kZSk7XFxuZnMvZXh0NC9zdXBlci5jOjE1Njk6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9zdXBlci5jLTE1NzAtXFx0ZHF1b3RfZHJvcChpbm9kZSk7XFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jPTI3MT1zdGF0aWMgaW50IGV4dDRfZ2V0X3Zlcml0eV9kZXNjcmlwdG9yX2xvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jLTI5My1cXG5mcy9leHQ0L3Zlcml0eS5jOjI5NDpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLCAwKTtcXG5mcy9leHQ0L3Zlcml0eS5jLTI5NS1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDowNy41MDcyNTk3NDhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjAxMTcyNjAxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEV4dDQgQmxvY2sgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3JlIGRlYWxpbmcgd2l0aCBibG9jayBtaWdyYXRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0sIGFuZCBzb21ldGhpbmcgc21lbGxzIGZpc2h5IHdpdGggdGhlIGJsb2NrIG51bWJlcnMuIFRoZSBjb2RlIHVzZXMgYEVYVF9NQVhfQkxPQ0tTYCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGEgYHUzMmAgdmFsdWUgKDB4ZmZmZmZmZmYsIDJeMzIgLSAxKS4gVGhhdCdzIGEgaHVnZSBudW1iZXIsIGJ1dC4uLlxuXG5CZWZvcmUgdGhpcyBjb21taXQsIHRoZSBjcml0aWNhbCB2YXJpYWJsZXMgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdpdGhpbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBzdHJ1Y3Qgd2VyZSBhbHNvIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGlmIEknbSBub3QgbWlzdGFrZW4sIGlzIGFsc28gYSBgdTMyYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSByZWQgZmxhZy4gSWYgYmxvY2sgbnVtYmVycyB0aGVtc2VsdmVzIGFyZSBgdTMyYCwgaG93IGNhbiB0aGV5IHBvc3NpYmx5IHJlcHJlc2VudCBhbGwgdGhlIGJsb2NrcyB1cCB0byBgRVhUX01BWF9CTE9DS1NgPyBUaGVyZSBoYXMgdG8gYmUgYW4gaW50ZWdlciBvdmVyZmxvdyBzb21ld2hlcmUuXG5cbkxvb2tpbmcgYXQgdGhlIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbiwgYW5kIHNwZWNpZmljYWxseSB0aGlzIHNuaXBwZXQ6XG5cbmBgYGNcblx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4uLi5cblx0XHRpZiAoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pIHtcblx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcblx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSksIFx1MDAyNmxiKTtcblx0XHRcdGlmIChyZXR2YWwpXG5cdFx0XHRcdGdvdG8gZXJyX291dDtcblx0XHR9XG5gYGBcblxuT2theSwgdGhlIGBtYXhfZW50cmllc2AgY2FsY3VsYXRpb24gc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYmxvY2tzaXplIGRpdmlkZWQgYnkgNCAobGlrZWx5IGZvciBhbiBleHRlbnQgaW5kZXgpLCBidXQgdGhhdCdzIG5vdCB0aGUgY3JpdGljYWwgcG9pbnQgaGVyZS4gVGhlIGltcG9ydGFudCBwYXJ0IGlzIHRoZSBjYWxsIHRvIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLCB3aXRoIGEgYGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKWAgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiwgYW5kIGFsc28gdGhlIGBsYmAgc3RydWN0LiBJZiB0aGUgYGxiYCBzdHJ1Y3QgKGNvbnRhaW5pbmcgYGN1cnJfYmxvY2tgLCB3aGljaCBpcyBgdTMyYCksIGlzIHBhc3NlZCB0byB0aGUgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24gYWxvbmcgd2l0aCBhIGB1MzJgIGJsb2NrIG51bWJlciwgdGhlbiB3ZSd2ZSBnb3QgYSBwb3RlbnRpYWwgb3ZlcmZsb3csIHJpZ2h0PyBBbmQgd2UgbmVlZCB0byB0cmFjZSB0aG9zZSBmdW5jdGlvbnMsIGxpa2UgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgc28gb24uIFRoZXkgY291bGQgYmUgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbS4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MjU2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjI3LjYyNDUyMjExNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTAwOlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMDE6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEwNDpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTA1OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTA2OlxcdFxcbiAxMDc6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEwODpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMDk6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMTA6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxMTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxMTI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTEzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxMTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTE1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuIDExNjpcXHRcXHRcXHR9XFxuIDExNzpcXHRcXHR9XFxuIDExODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxMTk6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTIwOlxcdFxcbiAxMjE6XFx0fVxcbiAxMjI6XFx0XFxuIDEyMzpcXHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAxMjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuIDEyNTpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDEyODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gMTI5OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMzA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMzE6XFx0XFxuIDEzMjpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEzMzpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEzNzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMzg6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMzk6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTQwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTQxOlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE0MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQzOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE0NDpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTQ1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzO1xcbiAxNDY6XFx0XFx0XFx0fVxcbiAxNDc6XFx0XFx0fVxcbiAxNDg6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTQ5OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDE1MDpcXHRcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTU0OlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxNTU6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDE1NjpcXHR7XFxuIDE1NzpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxNTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDE1OTpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTYwOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTYxOlxcdFxcbiAxNjI6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxNjM6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDE2NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxNjc6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTY4OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTY5OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxNzE6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzM6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTc0OlxcdFxcdFxcdFxcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xcbiAxNzU6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gMTc2OlxcdFxcdFxcdH1cXG4gMTc3OlxcdFxcdH1cXG4gMTc4OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE3OTpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxODA6XFx0XFxuIDE4MTpcXHR9XFxuIDE4MjpcXHRcXG4gMTgzOlxcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcXG4gMTg1OlxcdHtcXG4gMTg2OlxcdFxcdGludCBpO1xcbiAxODc6XFx0XFx0X19sZTMyICp0bXBfaWRhdGE7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxODk6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAxOTA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxOTE6XFx0XFx0aW50IGVycjtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcXG4gMTk0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxOTU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxOTY6XFx0XFxuIDE5NzpcXHRcXHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTk4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE5OTpcXHRcXHRcXHRpZiAodG1wX2lkYXRhW2ldKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjI3LjYyNDYwOTg1NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo2NDYwNzAwNzY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgSW50ZWdlciBPdmVyZmxvdyBWdWxuZXJhYmlsaXR5IGluIGV4dDQgRmlsZXN5c3RlbSBFeHRlbnQgTWlncmF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgdGhhdCB3aXRoIGEgNEsgYmxvY2sgc2l6ZSwgdGhlIGBtYXhfZW50cmllc2AgaW4gYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgY2FuIGJlIDEwMjQsIGxlYWRpbmcgdG8gYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXNgID0gMSwwNDgsNTc2LiBUaGVuLCBgbGItXHUwMDNlY3Vycl9ibG9ja2AgY2FuIHJlYWNoIDEsMDc0LDc5MSw0MzYsIHdoaWNoIHdvcmtzIGJlY2F1c2UgaXQgZml0cyB3aXRoaW4gYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAoYHUzMmApLiBCdXQgaG9sZCBvbiwgd2hhdCBoYXBwZW5zIHdpdGggbGFyZ2VyIGJsb2NrIHNpemVzLCBsaWtlIDY0S0I/IElmIHRoZSBibG9jayBzaXplIGlzIDY0S0IsIGBtYXhfZW50cmllc2AganVtcHMgdG8gMTYzODQsIGFuZCBzdWRkZW5seSwgMTYzODQgY3ViZWQgaXMgKndheSogYmlnZ2VyIHRoYW4gYSAzMi1iaXQgaW50ZWdlciEgVGhhdCdzIGEgcG90ZW50aWFsIHdyYXAtYXJvdW5kIHdhaXRpbmcgdG8gaGFwcGVuLlxuXG5FdmVuIHdpdGggdGhlIDRLIGJsb2NrIHNpemUsIHdoYXQgaWYgd2UgY29uc2lkZXIgYEVYVF9NQVhfQkxPQ0tTYD8gVGhlbiwgSSByZW1lbWJlciB0aGF0IGBFWFRfTUFYX0JMT0NLU2AgaXMgMHhmZmZmZmZmZiAoNCwyOTQsOTY3LDI5NSkuXG5cbkknbSBzdGFydGluZyB0byBzZWUgYSBwYXR0ZXJuIGhlcmUuIExhcmdlIGJsb2NrIHNpemVzICgxNktCIG9yIDY0S0IpLCBmaWxlIHN5c3RlbSBjb3JydXB0aW9uLCBvciBldmVuIGp1c3QgbGFyZ2UgYmxvY2sgY291bnRzLCBjb3VsZCB0cmlnZ2VyIGFuIG92ZXJmbG93IHdoZW4gYGN1cnJfYmxvY2tgIHdhcyBiZWluZyB0cmVhdGVkIGFzIGFuIGBleHQ0X2xibGtfdGAgKHdoaWNoIGlzIGEgdTMyKSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBgY3Vycl9ibG9ja2Agd3JhcHBpbmcgYXJvdW5kLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIGNoZWNraW5nIGZvciBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayBmb3IgZXh0ZW50LWJhc2VkIGZpbGVzLiBUaGUgYGVlX2Jsb2NrYCBmaWVsZCBpbiB0aGUgZXh0ZW50IGZvcm1hdCBpcyBhIGBfX2xlMzJgIGFuZCBgRVhUX01BWF9CTE9DS1NgIHJlcHJlc2VudHMgdGhlIG1heGltdW0gYmxvY2sgbnVtYmVyLlxuXG5TbywgdGhlIG5leHQgcXVlc3Rpb24gaXMsIGlzIHRoaXMgcmVhY2hhYmxlPyBIb3cgaXMgYGV4dDRfZXh0X21pZ3JhdGUoKWAgYWN0dWFsbHkgY2FsbGVkPyBDYW4gd2UgZXhwbG9pdCB0aGlzIHdpdGggc3l6a2FsbGVyPyBMZXQncyBjaGVjayBzeXprYWxsZXIncyBzdXBwb3J0IGZvciBleHQ0IGFuZCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIG9yIGBGU19JT0NfU0VURkxBR1NgIGlvY3Rscy5cblxuSW4gTGludXggc3l6a2FsbGVyLCBpdCBzZWVtcyBsaWtlIGV4dDQgaW1hZ2VzIGFyZSBtb3VudGVkLCBhbmQgaW9jdGxzIGxpa2UgYEZTX0lPQ19TRVRGTEFHU2AgYW5kIGBFWFQ0X0lPQ19NSUdSQVRFYCBhcmUgdXNlZC4gR29vZC4gTm93LCB3aGF0IGFib3V0IHByaXZpbGVnZXMgZm9yIGBFWFQ0X0lPQ19NSUdSQVRFYD8gTG9va2luZyBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLCBJIHNlZSB0aGF0IGBpbm9kZV9vd25lcl9vcl9jYXBhYmxlYCBpcyBjaGVja2VkLiBJZiB0aGUgdXNlciBvd25zIHRoZSBpbm9kZSwgd2hpY2ggdGhleSBub3JtYWxseSBkbyB3aXRoIHRoZWlyIGZpbGVzLCB0aGV5IGhhdmUgcGVybWlzc2lvbiEgUGVyZmVjdC4gQW5kIHdoYXQgYWJvdXQgYEZTX0lPQ19TRVRGTEFHU2A/IEl0IGFwcGVhcnMgYGV4dDRfZXh0X21pZ3JhdGVgIGlzIGFsc28gY2FsbGVkIHRocm91Z2ggdGhpcyBpb2N0bCwgd2hlbiBhIGZsYWcgaXMgc2V0LiBUaGF0IG1lYW5zIGFuIHVucHJpdmlsZWdlZCB1c2VyIGNhbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoaXMgdmlhIHRoZSBgRlNfSU9DX1NFVEZMQUdTYCBhbmQgYEVYVDRfRVhURU5UU19GTGAgZmxhZy4gTGV0J3MgZGlnIGRlZXBlciBpbnRvIHBlcm1pc3Npb25zIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AgdG8gY29uZmlybS4gVGhpcyBpcyBzdGFydGluZyB0byBsb29rIHZlcnkgaW50ZXJlc3RpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NTgyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Nzk1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MzQuMDg1MzEyNzQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MDY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lvY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTkwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTkwOlxcdHN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncylcXG4gNTkyOlxcdHtcXG4gNTkzOlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4gNTk0OlxcdFxcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xcbiA1OTU6XFx0XFx0aW50IGVyciA9IC1FUEVSTSwgbWlncmF0ZSA9IDA7XFxuIDU5NjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XFxuIDU5NzpcXHRcXHR1bnNpZ25lZCBpbnQgb2xkZmxhZ3MsIG1hc2ssIGk7XFxuIDU5ODpcXHRcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuIDU5OTpcXHRcXG4gNjAwOlxcdFxcdC8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqL1xcbiA2MDE6XFx0XFx0aWYgKGV4dDRfaXNfcXVvdGFfZmlsZShpbm9kZSkpXFxuIDYwMjpcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjAzOlxcdFxcbiA2MDQ6XFx0XFx0b2xkZmxhZ3MgPSBlaS1cXHUwMDNlaV9mbGFncztcXG4gNjA1OlxcdFxcdC8qXFxuIDYwNjpcXHRcXHQgKiBUaGUgSk9VUk5BTF9EQVRBIGZsYWcgY2FuIG9ubHkgYmUgY2hhbmdlZCBieVxcbiA2MDc6XFx0XFx0ICogdGhlIHJlbGV2YW50IGNhcGFiaWxpdHkuXFxuIDYwODpcXHRcXHQgKi9cXG4gNjA5OlxcdFxcdGlmICgoZmxhZ3MgXiBvbGRmbGFncykgXFx1MDAyNiAoRVhUNF9KT1VSTkFMX0RBVEFfRkwpKSB7XFxuIDYxMDpcXHRcXHRcXHRpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpXFxuIDYxMTpcXHRcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjEyOlxcdFxcdH1cXG4gNjEzOlxcdFxcbiA2MTQ6XFx0XFx0aWYgKCFkYXhfY29tcGF0aWJsZShpbm9kZSwgb2xkZmxhZ3MsIGZsYWdzKSkge1xcbiA2MTU6XFx0XFx0XFx0ZXJyID0gLUVPUE5PVFNVUFA7XFxuIDYxNjpcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjE3OlxcdFxcdH1cXG4gNjE4OlxcdFxcbiA2MTk6XFx0XFx0aWYgKChmbGFncyBeIG9sZGZsYWdzKSBcXHUwMDI2IEVYVDRfRVhURU5UU19GTClcXG4gNjIwOlxcdFxcdFxcdG1pZ3JhdGUgPSAxO1xcbiA2MjE6XFx0XFxuIDYyMjpcXHRcXHRpZiAoKGZsYWdzIF4gb2xkZmxhZ3MpIFxcdTAwMjYgRVhUNF9DQVNFRk9MRF9GTCkge1xcbiA2MjM6XFx0XFx0XFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2Nhc2Vmb2xkKHNiKSkge1xcbiA2MjQ6XFx0XFx0XFx0XFx0ZXJyID0gLUVPUE5PVFNVUFA7XFxuIDYyNTpcXHRcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjI2OlxcdFxcdFxcdH1cXG4gNjI3OlxcdFxcbiA2Mjg6XFx0XFx0XFx0aWYgKCFTX0lTRElSKGlub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuIDYyOTpcXHRcXHRcXHRcXHRlcnIgPSAtRU5PVERJUjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MzQuMDg1NDY0OTUyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUxNjM1NzczNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXh0NCBNaWdyYXRpb24gSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgYW5kIHRoaW5raW5nLCB0aGlzICpzaG91bGRuJ3QqIGJlIHRvbyBjb21wbGV4IGZyb20gYSBmaWxlIHN5c3RlbSBwZXJtaXNzaW9ucyBhbmQgb3duZXJzaGlwIHBlcnNwZWN0aXZlLiBXZSdyZSB0YWxraW5nIHN0YW5kYXJkIGlub2RlIHN0dWZmIGhlcmUsIG5vdGhpbmcgdW51c3VhbC4gUGx1cywgZXh0NCBpcyBhbHJlYWR5IHByZXR0eSB3ZWxsLWNvdmVyZWQgYnkgc3l6a2FsbGVyLCB3aGljaCBnaXZlcyBtZSBzb21lIGNvbmZpZGVuY2UgdGhhdCBhbnkgZ2xhcmluZyBpc3N1ZXMgd291bGQgaGF2ZSBiZWVuIGZvdW5kLlxuXG5NeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byBmaWd1cmUgb3V0IGhvdyBgZnMvZXh0NC9taWdyYXRlLmNgIGlzIGFjdHVhbGx5IGNvbXBpbGVkLiBXaGF0IGFyZSB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgbmVlZCB0byBiZSBzZXQgdG8gaW5jbHVkZSB0aGF0IGNvZGU/IEknbGwgbmVlZCB0byBkaWcgaW50byB0aGUgS2NvbmZpZyBvcHRpb25zLCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQgYWZmZWN0IGBmcy9leHQ0L21pZ3JhdGUuY2AgZGlyZWN0bHkuIFRoZW4sIEknbGwgbW92ZSBvbiB0byBjaGVja2luZyB0aGUgYGZzL2V4dDQvTWFrZWZpbGVgIHRvIHNlZSBob3cgdGhlIGJ1aWxkIHByb2Nlc3MgaGFuZGxlcyB0aGlzIGZpbGUgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUuIFVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgaXMga2V5IHRvIGZpZ3VyaW5nIG91dCB0aGUgcHJlY29uZGl0aW9ucyBmb3IgdGhlIGNvZGUgdG8gYmUgYXZhaWxhYmxlLCBhbmQgdGh1cywgZXhwbG9pdGFibGUuIFRoaXMgaXMgd2hlcmUgSSdsbCBiZWdpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2OTIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjM5LjI0OTA0NDU0OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDczMTA5MzIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWlncmF0ZVxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvTWFrZWZpbGU9OD1leHQ0LXlcXHQ6PSBiYWxsb2MubyBiaXRtYXAubyBibG9ja192YWxpZGl0eS5vIGRpci5vIGV4dDRfamJkMi5vIGV4dGVudHMubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZS05LVxcdFxcdGV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGU6MTA6XFx0XFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZS0xMS1cXHRcXHRtbXAubyBtb3ZlX2V4dGVudC5vIG5hbWVpLm8gcGFnZS1pby5vIHJlYWRwYWdlLm8gcmVzaXplLm8gXFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDozOS4yOTYzNjYxNzFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzkwMDU1NTczNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeHQ0IE1vZHVsZSBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBgbWlncmF0ZS5vYC4uLiB0aGF0J3MgcGFydCBvZiB0aGUgYGV4dDQteWAgb2JqZWN0LCB3aGljaCBtZWFucyBpdCBnZXRzIGJ1aWx0IG9ubHkgd2hlbiB0aGUgRVhUNCBmaWxlc3lzdGVtIGlzIGVuYWJsZWQuIE9idmlvdXMsIGJ1dCBpdCdzIGdvb2QgdG8gY29uZmlybSB0aGUgYnVpbGQgbG9naWMuIE15IG5leHQgbW92ZSBpcyB0byBkb3VibGUtY2hlY2sgdGhlIGBmcy9leHQ0L0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIGZvbGxvd2luZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIOKAkyBgQ09ORklHX0VYVDRfRlNgLCBzcGVjaWZpY2FsbHkg4oCTIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY3kgY29ycmVjdGx5LiBHb3R0YSBiZSBwcmVjaXNlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVzeXN0ZW0gbW9kdWxlcy4gTm8gc3VycHJpc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE2NSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjQ3LjE5NjkyNDM3N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDgyMDY4NzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEVYVDRfRlNcXFxcYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbmZzL2V4dDQvS2NvbmZpZzoyOmNvbmZpZyBFWFQ0X0ZTXFxuZnMvZXh0NC9LY29uZmlnLTMtXFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDo0Ny4yNDUxMzg4MVoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4NzE2OTY0NDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBleHQ0IE1pZ3JhdGlvbiBMb2dpYyoqXG5cbk9rYXksIHRoZSBzdGFuZGFyZCBgRVhUNF9GU2AgaXMgaW4gcGxheS4gRmlyc3QsIGNhbiB0aGlzIGNvZGUgZXZlbiAqYmUqIGZ1enplZD8gWWVzLCBpdCdzIGNvcmUgZmlsZXN5c3RlbSBjb2RlIHdpdGhpbiBleHQ0LCB3aGljaCBpcyByZWFkaWx5IHJlYWNoYWJsZS4gVGhlIHByaW1hcnkgZ2F0ZSBpcyByZWFjaGFiaWxpdHkg4oCTIGxldCdzIGNoZWNrIHRoZSBjcml0ZXJpYS4gIFNlY3Rpb24gMidzIFwidW5yZWFjaGFibGVcIiBjcml0ZXJpYSBkb24ndCBhcHBseTsgdGhpcyBpcyBrZXJuZWwgY29kZSwgcGFydCBvZiBhIGNydWNpYWwgc3Vic3lzdGVtLiBTZWN0aW9uIDMgY2xhcmlmaWVzIHRoYXQgZmlsZXN5c3RlbSBjb2RlLCBzcGVjaWZpY2FsbHkgZXh0NCwgZmFsbHMgdW5kZXIgXCJjb3JlIHN1YnN5c3RlbXNcIiByZWxhdGVkIHRvIFZGUyBhbmQgc3RvcmFnZS4gIFN5emthbGxlciBzeXNjYWxscyBsaWtlIGBtb3VudGAsIGBvcGVuYCwgYHdyaXRlYCwgYW5kIGBpb2N0bGAgKGUuZy4sIGBGU19JT0NfU0VURkxBR1NgIG9yIGBFWFQ0X0lPQ19NSUdSQVRFYCkgY2FuIGNsZWFybHkgZXhlcmNpc2UgaXQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZyA9IHRydWVgLlxuXG5Ob3csIHRoZSBzeW1ib2xzIHRvIHRhcmdldC4gSW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgdGhlIGBtaWdyYXRlX3N0cnVjdGAgd2FzIG1vZGlmaWVkLiAgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdlcmUgY2hhbmdlZCBmcm9tIGBleHQ0X2xibGtfdGAgdG8gYHU2NGAuIEFsc28sIHRoZSBmdW5jdGlvbiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgd2FzIG1vZGlmaWVkLCBhZGRpbmcgYSBjaGVjayBmb3IgYEVYVF9NQVhfQkxPQ0tTYC5cblxuQnV0IHdhaXQsIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqc3RhdGljKiB3aXRoaW4gYG1pZ3JhdGUuY2AuIENhbiBhIHN0YXRpYyBmdW5jdGlvbiBiZSBhIFwiRm9jdXNTeW1ib2w/XCIgIFJ1bGUgNCBzdGF0ZXMgd2hlbiBgV29ydGhGdXp6aW5nPXRydWVgLCB3ZSBuZWVkIHRvIHRhcmdldCBzcGVjaWZpYyBsb2dpYyBvciBlbnRyeXBvaW50cyBhbmQgaGFuZGxlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIGNhcmVmdWxseS4gU3RhdGljIGlubGluZXMgbGFjayBkaXN0aW5jdCBzeW1ib2xzIGFuZCBhcmUgYSBjaGFsbGVuZ2UsIGJ1dCwgdGhpcyBpcyBhIHN0YXRpYyBDIGZ1bmN0aW9uLCAqbm90KiBhIHN0YXRpYyBpbmxpbmUuXG5cblNvLCBsZXQncyBzZWU6IGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpc24ndCBpbmxpbmVkISBMZXQncyBjaGVjayBjYWxsZXJzOiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gbWlncmF0aW9uLCBhbHNvIGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gVGhhdCBpcyBjYWxsZWQgZnJvbSBgaW9jdGwuY2AuIFNpbmNlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqY2FsbGVkKiBieSBhIG5vbi1zdGF0aWMgZXhwb3J0ZWQgZnVuY3Rpb24gKGBleHQ0X2V4dF9taWdyYXRlYCksIHRoYXQncyBncmVhdCBhbmQgaXQgcHJvdmlkZXMgYSBzeW1ib2wgdGhhdCBjYW4gYmUgZnV6emVkIVxuXG5JdCdzIHN0YW5kYXJkIHByYWN0aWNlIHRvIGxpc3QgYm90aC4gIEFuZCB0aGUgc3RhdGljIGZ1bmN0aW9uIGNhbiBoYXZlIGEgc3ltYm9sISBMaXN0aW5nIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIGNvdmVycyB0aGUgcmVsZXZhbnQgZmVhdHVyZXMuIFRoZSBvdGhlciBvbmUsIGBmaW5pc2hfcmFuZ2VgLCBpcyBhbHNvIHN0YXRpYyBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQsIGJ1dCBtYXliZSBub3QgYXMgaW1wb3J0YW50LiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgY2FsbGVkIGJ5IGBleHQ0X2lvY3RsX3NldGZsYWdzYCBhbmQgYF9fZXh0NF9pb2N0bGAgaW4gYGZzL2V4dDQvaW9jdGwuY2AsIGFuZCBzbyBpdCBpcyB0aGUga2V5LiBUaG9zZSB0d28gYXJlIG5vbi11YmlxdWl0b3VzLCB0YXJnZXRlZCBzeW1ib2xzIVxuXG5GaW5hbGx5LCBsZXQncyBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3MuIGBFWFQ0X0ZTYCBpcyBhbHJlYWR5IGVuYWJsZWQuIExldCdzIHNlZSBpZiB0aGUgY29kZSBoYXMgYW55IGAjaWZkZWZgIGNvbmRpdGlvbmFscy4gSSdsbCBzY2FuIHRocm91Z2ggYG1pZ3JhdGUuY2AgdG8gYmUgY2VydGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE0NDcsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5OTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTUuOTYyMTE5ODc0WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQwNTQwMiwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiI2lmXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDo1Ni4wMDg1MzIxNTZaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE3NDM0MDM0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbml0aWFsIEFzc2Vzc21lbnQgXHUwMDI2IFZlcmlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBtaWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2Ugc29tZXRoaW5nIHNpZ25pZmljYW50OiB0aGVyZSBhcmUgKm5vKiBwcmVwcm9jZXNzb3IgYCNpZmRlZmAgZGlyZWN0aXZlcyBpbiB0aGlzIGZpbGUuIFRoYXQncyB1bnVzdWFsLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoZSBuYXR1cmUgb2YgZmlsZSBzeXN0ZW0gbWlncmF0aW9uLiBJdCBtYWtlcyBtZSB3b25kZXIgaWYgYSBjZXJ0YWluIGZpbGUgc3lzdGVtIGlzIGFsd2F5cyBlbmFibGVkLiBUaGlzIGxhY2sgb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2FycmFudHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaXMgbm90IHRpZWQgdG8gc29tZSBvdGhlciBjb25maWcuIFRoZXJlZm9yZSwgSSdsbCBzd2l0Y2ggZ2VhcnMgYW5kIHZlcmlmeSBhbnkgZGVwZW5kZW5jaWVzLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlIGZvciBgZnMvZXh0NGAgdG8gc2VlIGlmIGBFWFQ0X0ZTYCBoYXMgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIGFuZCB3aGF0J3MgZHJpdmluZyB0aGUgYmVoYXZpb3Igb2YgYG1pZ3JhdGUuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMTQ4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTguMTgyODc1MDk2WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY2MjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIEVYVDRfRlNcXG4gICAzOlxcdFxcdHRyaXN0YXRlIFxcXCJUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbiAgIDU6XFx0XFx0c2VsZWN0IEpCRDJcXG4gICA2OlxcdFxcdHNlbGVjdCBDUkMxNlxcbiAgIDc6XFx0XFx0c2VsZWN0IENSQzMyXFxuICAgODpcXHRcXHRzZWxlY3QgRlNfSU9NQVBcXG4gICA5OlxcdFxcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxcbiAgMTA6XFx0XFx0aGVscFxcbiAgMTE6XFx0XFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cXG4gIDEyOlxcdFxcbiAgMTM6XFx0XFx0ICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sXFxuICAxNDpcXHRcXHQgIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiBleHQ0IGlzIG5vdCBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGhcXG4gIDE1OlxcdFxcdCAgZXh0MzsgaXQgaXMgYmFzZWQgb24gZXh0ZW50IG1hcHMgYW5kIGl0IHN1cHBvcnRzIDQ4LWJpdFxcbiAgMTY6XFx0XFx0ICBwaHlzaWNhbCBibG9jayBudW1iZXJzLiAgVGhlIGV4dDQgZmlsZXN5c3RlbSBhbHNvIHN1cHBvcnRzIGRlbGF5ZWRcXG4gIDE3OlxcdFxcdCAgYWxsb2NhdGlvbiwgcGVyc2lzdGVudCBwcmVhbGxvY2F0aW9uLCBoaWdoIHJlc29sdXRpb24gdGltZSBzdGFtcHMsXFxuICAxODpcXHRcXHQgIGFuZCBhIG51bWJlciBvZiBvdGhlciBmZWF0dXJlcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBzcGVlZFxcbiAgMTk6XFx0XFx0ICB1cCBmc2NrIHRpbWUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgd2ViIHBhZ2VzIGF0XFxuICAyMDpcXHRcXHQgIGh0dHA6Ly9leHQ0Lndpa2kua2VybmVsLm9yZy5cXG4gIDIxOlxcdFxcbiAgMjI6XFx0XFx0ICBUaGUgZXh0NCBmaWxlc3lzdGVtIHN1cHBvcnRzIG1vdW50aW5nIGFuIGV4dDMgZmlsZXN5c3RlbTsgd2hpbGUgdGhlcmVcXG4gIDIzOlxcdFxcdCAgYXJlIHNvbWUgcGVyZm9ybWFuY2UgZ2FpbnMgZnJvbSB0aGUgZGVsYXllZCBhbGxvY2F0aW9uIGFuZCBpbm9kZVxcbiAgMjQ6XFx0XFx0ICB0YWJsZSByZWFkYWhlYWQsIHRoZSBiZXN0IHBlcmZvcm1hbmNlIGdhaW5zIHJlcXVpcmUgZW5hYmxpbmcgZXh0NFxcbiAgMjU6XFx0XFx0ICBmZWF0dXJlcyBpbiB0aGUgZmlsZXN5c3RlbSB1c2luZyB0dW5lMmZzLCBvciBmb3JtYXR0aW5nIGEgbmV3XFxuICAyNjpcXHRcXHQgIGZpbGVzeXN0ZW0gYXMgYW4gZXh0NCBmaWxlc3lzdGVtIGluaXRpYWxseS4gV2l0aG91dCBleHBsaWNpdCBlbmFibGluZ1xcbiAgMjc6XFx0XFx0ICBvZiBleHQ0IGZlYXR1cmVzLCB0aGUgb24gZGlzayBmaWxlc3lzdGVtIGZvcm1hdCBzdGF5cyBmdWxseSBiYWNrd2FyZFxcbiAgMjg6XFx0XFx0ICBjb21wYXRpYmxlLlxcbiAgMjk6XFx0XFxuICAzMDpcXHRcXHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcXG4gIDMxOlxcdFxcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXFxuICAzMjpcXHRcXG4gIDMzOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXFxuICAzNjpcXHRcXHRib29sIFxcXCJVc2UgZXh0NCBmb3IgZXh0MiBmaWxlIHN5c3RlbXNcXFwiXFxuICAzNzpcXHRcXHRkZXBlbmRzIG9uIEVYVDRfRlNcXG4gIDM4OlxcdFxcdGRlcGVuZHMgb24gRVhUMl9GUz1uXFxuICAzOTpcXHRcXHRkZWZhdWx0IHlcXG4gIDQwOlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTguMTgyOTQzMDY2WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxNzY0MDAwMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBFWFQ0IFBhdGNoKipcblxuT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIFRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBzZWVtcyBlYXN5OyBgRVhUNF9GU2AgcHVsbHMgaW4gYWxsIHRoZSBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzOiBgQlVGRkVSX0hFQURgLCBgSkJEMmAsIGBDUkMxNmAsIGBDUkMzMmAsIGFuZCBgRlNfSU9NQVBgLiBUaGVyZWZvcmUsIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdCBpcyBzaW1wbHkgYFtcIkVYVDRfRlNcIl1gLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LlxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhlIHJlbGV2YW50IHN5bWJvbHMuIENoZWNraW5nIGBGb2N1c1N5bWJvbHNgLCBJIHNlZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgYW5kIGBleHQ0X2V4dF9taWdyYXRlYCBwb3AgdXAuIFllcCwgdGhhdCdzIGV4cGVjdGVkLlxuXG5MZXQncyBxdWlja2x5IGFydGljdWxhdGUgdGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2UuIEZyb20gd2hhdCBJIGdhdGhlciwgdGhlIHBhdGNoIGFkZHJlc3NlcyBhIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2l0aGluIHRoZSBleHQ0IG1pZ3JhdGlvbiBsb2dpYy4gVGhpcyBjb252ZXJzaW9uLCBmcm9tIGluZGlyZWN0LWJsb2NrIG1hcHBpbmdzIHRvIGV4dGVudC1tYXBwZWQgZmlsZXMsIGludm9sdmVzIHdpZGVuaW5nIHRoZSBibG9jayBvZmZzZXRzIGluIGBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgKGBleHQ0X2xibGtfdGAsIG9yIGB1MzJgKSB0byA2NC1iaXQgKGB1NjRgKSB0byBwcmV2ZW50IGFuIGludGVnZXIgb3ZlcmZsb3cgY29uZGl0aW9uIHdoZW4gZGVhbGluZyB3aXRoIHZlcnkgbGFyZ2UgZmlsZXMuICBJdCdzIGFsc28gbm93IGNoZWNraW5nIGlmIGBjdXJyX2Jsb2NrYCBpcyBncmVhdGVyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggcHJldmVudHMgYSBidWZmZXIgb3ZlcmZsb3cuIFRoZSBjb2RlIHBhdGggaXMgdHJpZ2dlcmVkIGJ5IGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgKHdoZW4gc2V0dGluZyB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZykgb24gZXh0NCBmaWxlc3lzdGVtcy4gVGhpcyBpbmRpY2F0ZXMgaXQgdG91Y2hlcyBsaXZlIGZpbGVzeXN0ZW0gbG9naWMgYW5kIGlzIGRlZmluaXRlbHkgd29ydGggZnV6emluZy5cblxuR2l2ZW4gdGhpcyB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nLCBJJ20gY29uZmlkZW50IGluIHRoZSBhc3Nlc3NtZW50LiBJJ2xsIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzk3NiwiT3V0cHV0VG9rZW5zIjoxNjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToxOS45NDY5NDU1NTZaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MjQ2OTQxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjIwLjAyOTQyNDE5M1oiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzIwMzE0MTQzODI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6MjAuMDI5OTQyNjgyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzIwMzEzNjE4MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYC4gVGhpcyBwcmV2ZW50cyBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGlub2RlcyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBiZWZvcmUgdXNlLiBJdCBpcyBzdHJpY3RseSBpbnRlcm5hbCBrZXJuZWwgbWV0YWRhdGEgYW5kIGlzIG5ldmVyIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJyYW5jaGVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBrZXJuZWwgaW5mby1sZWFrcy4gU3RhbmRhcmQgYnVnIGRldGVjdG9ycyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZlYzJiMDZiMDljNjU1MjQ0YWFlOTY5NDcyNWZkZjkyMmYzYTkyNmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAwODo0MzoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC0xNCw3ICsxNCw3IEBAXG4gICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gICovXG4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbi1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuK1x0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuIFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XG4gfTtcbiBcbkBAIC02Niw2ICs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuK1xuK1x0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuIFx0LypcbiBcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuIFx0ICovXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyMC4wMjk5NDQxNDJaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzQ2OTI5MjQ3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgRXh0NCBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gdGhlIGtleSBtb2RpZmljYXRpb25zIHdpdGhpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBTcGVjaWZpY2FsbHksIEknbSBub3RpbmcgdGhlIGNoYW5nZSBpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFRoZSBhbHRlcmF0aW9uIGZyb20gYGV4dDRfbGJsa190YCB0byBgdTY0YCBmb3IgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGltbWVkaWF0ZWx5IGNhdGNoZXMgbXkgZXllLiBUaGlzIHN1Z2dlc3RzIGEgc2hpZnQgdG8gNjQtYml0IGJsb2NrIGFkZHJlc3NpbmcsIHdoaWNoIGxpa2VseSBpbmRpY2F0ZXMgdGhleSdyZSBhZGRyZXNzaW5nIHRoZSBsYXJnZXIgdm9sdW1lIHNpemVzIOKAkyB3ZSdyZSBwcm9iYWJseSBsb29raW5nIGF0IGEgbW92ZSB0b3dhcmRzIHN1cHBvcnRpbmcgbGFyZ2VyIGZpbGVzeXN0ZW1zLCBvciBhdCBsZWFzdCBhIHByZXBhcmF0aW9uIGZvciBpdC5cblxuTmV4dCwgSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24sIHdoZXJlIHRoZSBhZGRpdGlvbiBvZiB0aGUgYGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgIGNoZWNrIGlzLiBUaGUgYEVYVF9NQVhfQkxPQ0tTYCBkZWZpbml0aW9uIHdpbGwgYmUgaW1wb3J0YW50LiBNeSBpbnN0aW5jdCBpcyB0aGF0IHRoaXMgaXMgc29tZSBmb3JtIG9mIGJvdW5kYXJ5IGNoZWNrIHRvIGVuc3VyZSB0aGUgYmxvY2sgbnVtYmVyIGRvZXNuJ3QgZXhjZWVkIGEgcHJlZGV0ZXJtaW5lZCBtYXhpbXVtLiBUaGUgYC1FT1BOT1RTVVBQYCBlcnJvciBpbmRpY2F0ZXMgdGhhdCBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLCBzbyB0aGUgc3lzdGVtIGlzIHRyeWluZyB0byBoYW5kbGUgdGhlIGZhY3QgdGhhdCB0aGlzIHBhcnRpY3VsYXIgYmxvY2sgYWRkcmVzc2luZyBpc24ndCBoYW5kbGVkIGNvcnJlY3RseS5cblxuSSdtIG5vdyBnb2luZyB0byBzdGFydCBzY2FubmluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGFyb3VuZCB0aGVzZSBsaW5lcy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgb3JpZ2luYWwgY29uc3RyYWludHMsIHdoYXQgdGhpcyBsaW1pdCBhY3R1YWxseSByZXByZXNlbnRzLCBhbmQgaG93IHRoZSBzdXJyb3VuZGluZyBmdW5jdGlvbnMgdXRpbGl6ZSB0aGVzZSBibG9jayBudW1iZXJzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlIGFuZCB0aGUgcmVhc29ucyBmb3IgaXQuIElzIHRoaXMgYSBwbGFubmVkIGNoYW5nZSB0byBhIG1vcmUgY29tcGxleCBsYXlvdXQsIG9yIHNvbWUgb3RoZXIgY2hhbmdlIHRvIGJsb2NrIGFkZHJlc3NpbmcsIG9yIGFuIGF0dGVtcHQgdG8gcHJlcGFyZSBmb3IgbGFyZ2VyIHZvbHVtZXM/IEknbGwgc29vbiBzZWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjksIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyNy40OTkyMzkzMTdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTA1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwN1xcbiAgIDQ6XFx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXFx1MDAzY2FuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb21cXHUwMDNlXFxuICAgNTpcXHQgKlxcbiAgIDY6XFx0ICovXFxuICAgNzpcXHRcXG4gICA4OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXFwiZXh0NF9qYmQyLmhcXFwiXFxuICAxMDpcXHQjaW5jbHVkZSBcXFwiZXh0NF9leHRlbnRzLmhcXFwiXFxuICAxMTpcXHRcXG4gIDEyOlxcdC8qXFxuICAxMzpcXHQgKiBUaGUgY29udGlndW91cyBibG9ja3MgZGV0YWlscyB3aGljaCBjYW4gYmVcXG4gIDE0OlxcdCAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxcbiAgMTU6XFx0ICovXFxuICAxNjpcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbiAgMTc6XFx0XFx0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbiAgMTg6XFx0XFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XFxuICAxOTpcXHR9O1xcbiAgMjA6XFx0XFxuICAyMTpcXHRzdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMjI6XFx0XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0e1xcbiAgMjU6XFx0XFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcXG4gIDI2OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XFxuICAyNzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcXG4gIDI4OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXFxuICAyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMwOlxcdFxcbiAgMzE6XFx0XFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXFxuICAzMjpcXHRcXHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cXHUwMDNlZmlyc3RfYmxvY2spO1xcbiAgMzM6XFx0XFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG4gIDM0OlxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXh0LCBsYi1cXHUwMDNlZmlyc3RfcGJsb2NrKTtcXG4gIDM1OlxcdFxcdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXFxuICAzNjpcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gIDM3OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbiAgMzg6XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbiAgMzk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDQwOlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gIDQxOlxcdFxcdH1cXG4gIDQyOlxcdFxcbiAgNDM6XFx0XFx0LypcXG4gIDQ0OlxcdFxcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcXG4gIDQ1OlxcdFxcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcXG4gIDQ2OlxcdFxcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxcbiAgNDc6XFx0XFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxcbiAgNDg6XFx0XFx0ICovXFxuICA0OTpcXHRcXHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXFxuICA1MDpcXHRcXHRcXHQgICAgbGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxLCBwYXRoKTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0XFx0cmV0dmFsID0gZXh0NF9kYXRhc2VtX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgaW5vZGUsIG5lZWRlZCwgbmVlZGVkLCAwKTtcXG4gIDUzOlxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbiAgNTQ6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNTU6XFx0XFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4dCwgMCk7XFxuICA1NjpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbiAgNTc6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDU4OlxcdGVycl9vdXQ6XFxuICA1OTpcXHRcXHR1cF93cml0ZSgoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pKTtcXG4gIDYwOlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4gIDYxOlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSAwO1xcbiAgNjI6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDYzOlxcdH1cXG4gIDY0OlxcdFxcbiAgNjU6XFx0c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuICA2NjpcXHRcXHRcXHRcXHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDY3OlxcdHtcXG4gIDY4OlxcdFxcdGludCByZXR2YWw7XFxuICA2OTpcXHRcXG4gIDcwOlxcdFxcdGlmIChsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG4gIDcxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gIDcyOlxcdFxcbiAgNzM6XFx0XFx0LypcXG4gIDc0OlxcdFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiAgNzU6XFx0XFx0ICovXFxuICA3NjpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayBcXHUwMDI2XFx1MDAyNlxcbiAgNzc6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc4OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSkge1xcbiAgNzk6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiAgODA6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cXHUwMDNlY3Vycl9ibG9jaztcXG4gIDgxOlxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuICA4MjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDgzOlxcdFxcdH1cXG4gIDg0OlxcdFxcdC8qXFxuICA4NTpcXHRcXHQgKiBTdGFydCBhIG5ldyByYW5nZS5cXG4gIDg2OlxcdFxcdCAqL1xcbiAgODc6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTtcXG4gIDg4OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4OTpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgOTA6XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDkxOlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA5MjpcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDk1OlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuICA5NjpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgOTc6XFx0e1xcbiAgOTg6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gIDk5OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxMDA6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjI3LjQ5OTMzMTk3N1oiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDI3MjYwMDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIGhvdyBpdCdzIGFsbG9jYXRlZCwgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGFjdHVhbGx5ICp1c2VkKiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIEV4dDQgZmlsZXN5c3RlbS4gSSBuZWVkIHRvIGdyYXNwIHRoaXMgdGhvcm91Z2hseSB0byByZWFsbHkgdW5kZXJzdGFuZCBob3cgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIHdvcmtzLiBMZXQncyBzZWUgaG93IHRoZXkgaGFuZGxlIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MTYwLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyOS45MjY1OTU1NzZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDE6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEwNDpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTA1OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTA2OlxcdFxcbiAxMDc6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEwODpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMDk6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMTA6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxMTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxMTI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTEzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxMTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTE1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuIDExNjpcXHRcXHRcXHR9XFxuIDExNzpcXHRcXHR9XFxuIDExODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxMTk6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTIwOlxcdFxcbiAxMjE6XFx0fVxcbiAxMjI6XFx0XFxuIDEyMzpcXHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAxMjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuIDEyNTpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDEyODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gMTI5OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMzA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMzE6XFx0XFxuIDEzMjpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEzMzpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEzNzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMzg6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMzk6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTQwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTQxOlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE0MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQzOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE0NDpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTQ1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzO1xcbiAxNDY6XFx0XFx0XFx0fVxcbiAxNDc6XFx0XFx0fVxcbiAxNDg6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTQ5OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDE1MDpcXHRcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTU0OlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxNTU6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDE1NjpcXHR7XFxuIDE1NzpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxNTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDE1OTpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTYwOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTYxOlxcdFxcbiAxNjI6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxNjM6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDE2NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxNjc6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTY4OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTY5OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxNzE6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzM6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTc0OlxcdFxcdFxcdFxcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xcbiAxNzU6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gMTc2OlxcdFxcdFxcdH1cXG4gMTc3OlxcdFxcdH1cXG4gMTc4OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE3OTpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxODA6XFx0XFxuIDE4MTpcXHR9XFxuIDE4MjpcXHRcXG4gMTgzOlxcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcXG4gMTg1OlxcdHtcXG4gMTg2OlxcdFxcdGludCBpO1xcbiAxODc6XFx0XFx0X19sZTMyICp0bXBfaWRhdGE7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxODk6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAxOTA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxOTE6XFx0XFx0aW50IGVycjtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcXG4gMTk0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxOTU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxOTY6XFx0XFxuIDE5NzpcXHRcXHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTk4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE5OTpcXHRcXHRcXHRpZiAodG1wX2lkYXRhW2ldKSB7XFxuIDIwMDpcXHRcXHRcXHRcXHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyOS45MjY3MDIxMTZaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA0MTkwODc3OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHByb2Nlc3NpbmcgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBmaWxlLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCBhbmQgd2hlcmUgdGhlIGtleSBzdHJ1Y3R1cmVzLCBzcGVjaWZpY2FsbHkgYG1pZ3JhdGVfc3RydWN0YCwgZ2V0IHRoZWlyIHN0YXJ0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhhdCBgbWlncmF0ZV9zdHJ1Y3RgIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBtaWdyYXRpb24gY29udGV4dCBpcyBiZWluZyBidWlsdC4gTGV0J3Mgc2VlIHdoYXQgZnVydGhlciByZWFkaW5nIGluIHRoZSBzb3VyY2UgY29kZSB3aWxsIHRlbGwgbWUuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgZXhhY3QgcG9pbnQgd2hlcmUgdGhhdCBjcnVjaWFsIHN0cnVjdCBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTgyNywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6NDAuMzQ1NzkzNTI1WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTA3MzcwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtaWdyYXRlX3N0cnVjdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzoxNjpzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbmZzL2V4dDQvbWlncmF0ZS5jLTE3LVxcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmM6MjI6XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0yMy1cXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTY1PXN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjY2OlxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTY3LXtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTk0PXN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy05NS1cXHRcXHRcXHRcXHQgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjk2OlxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuZnMvZXh0NC9taWdyYXRlLmMtOTcte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MTIzPXN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmMtMTI0LVxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjEyNTpcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjYte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MTUzPXN0YXRpYyBpbnQgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmMtMTU0LVxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjE1NTpcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTYte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NDE0PWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy00MjAtXFx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xcbmZzL2V4dDQvbWlncmF0ZS5jOjQyMTpcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XFxuZnMvZXh0NC9taWdyYXRlLmMtNDIyLVxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjQwLjM5NDg3MTE5N1oiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMjYzNDA3NzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGBmcy9leHQ0L21pZ3JhdGUuY2AgLSBMaW5lcyA0MTQtNTAwKipcblxuT2theSwgdGltZSB0byB6ZXJvIGluIG9uIGxpbmVzIDQxNCB0aHJvdWdoIDUwMCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHNlY3Rpb24gdGhvcm91Z2hseS4gQmFzZWQgb24gdGhlIGZpbGUgbmFtZSwgaXQncyBwcmV0dHkgY2xlYXIgdGhpcyBpcyBhYm91dCBtaWdyYXRpb24gcHJvY2Vzc2VzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzbyB0aGlzIHByb2JhYmx5IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCB1cGdyYWRpbmcgb3IgY2hhbmdpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBmaWxlIHN5c3RlbS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgYW5kIGZpZ3VyZSBvdXQgdGhlIGNvcm5lciBjYXNlcy4gSSdsbCBiZSBsb29raW5nIGZvciBhbnkgcG90ZW50aWFsIGZvciByZWdyZXNzaW9ucyBvciBwZXJmb3JtYW5jZSBpbXBhY3QsIGFzIHdlbGwgYXMgaWYgdGhpcyBpcyB0b3VjaGluZyBhbnkgZmVhdHVyZXMgSSBhbSBmYW1pbGlhciB3aXRoLiBJIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYXNwZWN0cyBvZiB0aGUgbWlncmF0aW9uIGFyZSBhY3R1YWxseSBoYW5kbGVkIHdpdGhpbiB0aGlzIHJlZ2lvbiBvZiBjb2RlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NjI4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6NDMuNjU4MjgxMzQxWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkyNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQxNCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQxNDpcXHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA0MTU6XFx0e1xcbiA0MTY6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4gNDE3OlxcdFxcdGludCByZXR2YWwgPSAwLCBpO1xcbiA0MTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDQxOTpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcXG4gNDIwOlxcdFxcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcXG4gNDIxOlxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG4gNDIyOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuIDQyMzpcXHRcXHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xcbiA0MjQ6XFx0XFx0dWlkX3Qgb3duZXJbMl07XFxuIDQyNTpcXHRcXHRpbnQgYWxsb2NfY3R4O1xcbiA0MjY6XFx0XFxuIDQyNzpcXHRcXHQvKlxcbiA0Mjg6XFx0XFx0ICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBvciB0aGUgaW5vZGVcXG4gNDI5OlxcdFxcdCAqIGFscmVhZHkgaXMgZXh0ZW50LWJhc2VkLCBlcnJvciBvdXQuXFxuIDQzMDpcXHRcXHQgKi9cXG4gNDMxOlxcdFxcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSB8fFxcbiA0MzI6XFx0XFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XFxuIDQzMzpcXHRcXHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXG4gNDM2OlxcdFxcdGlmIChTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpIFxcdTAwMjZcXHUwMDI2IGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9PSAwKVxcbiA0Mzc6XFx0XFx0XFx0LypcXG4gNDM4OlxcdFxcdFxcdCAqIGRvbid0IG1pZ3JhdGUgZmFzdCBzeW1saW5rXFxuIDQzOTpcXHRcXHRcXHQgKi9cXG4gNDQwOlxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdFxcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gNDQzOlxcdFxcbiA0NDQ6XFx0XFx0LypcXG4gNDQ1OlxcdFxcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcXG4gNDQ2OlxcdFxcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XFxuIDQ0NzpcXHRcXHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxcbiA0NDg6XFx0XFx0ICovXFxuIDQ0OTpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcXG4gNDUwOlxcdFxcdFxcdDMgKyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXFx1MDAzZWlfc2IpKTtcXG4gNDUxOlxcdFxcbiA0NTI6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDQ1MzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDQ1NDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ1NTpcXHRcXHR9XFxuIDQ1NjpcXHRcXHQvKlxcbiA0NTc6XFx0XFx0ICogVGhpcyBvcGVyYXRpb24gcmV3cml0ZXMgdGhlIGlub2RlJ3MgYmxvY2sgbWFwcGluZyBsYXlvdXRcXG4gNDU4OlxcdFxcdCAqIChpbmRpcmVjdCB0byBleHRlbnRzKSBhbmQgaXMgbm90IHRyYWNrZWQgaW4gdGhlIGZhc3QgY29tbWl0XFxuIDQ1OTpcXHRcXHQgKiBsb2csIHNvIGRpc2FibGUgZmFzdCBjb21taXRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxcbiA0NjA6XFx0XFx0ICovXFxuIDQ2MTpcXHRcXHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShpbm9kZS1cXHUwMDNlaV9zYiwgRVhUNF9GQ19SRUFTT05fTUlHUkFURSwgaGFuZGxlKTtcXG4gNDYyOlxcdFxcdGdvYWwgPSAoKCgodTMyKWlub2RlLVxcdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVxcdTAwM2VpX3NiKSkgKlxcbiA0NjM6XFx0XFx0XFx0RVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVxcdTAwM2VpX3NiKSkgKyAxO1xcbiA0NjQ6XFx0XFx0b3duZXJbMF0gPSBpX3VpZF9yZWFkKGlub2RlKTtcXG4gNDY1OlxcdFxcdG93bmVyWzFdID0gaV9naWRfcmVhZChpbm9kZSk7XFxuIDQ2NjpcXHRcXHR0bXBfaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRfaW5vZGUoaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCksXFxuIDQ2NzpcXHRcXHRcXHRcXHRcXHQgICBTX0lGUkVHLCBOVUxMLCBnb2FsLCBvd25lciwgMCk7XFxuIDQ2ODpcXHRcXHRpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHtcXG4gNDY5OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIodG1wX2lub2RlKTtcXG4gNDcwOlxcdFxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDQ3MTpcXHRcXHRcXHR0bXBfaW5vZGUgPSBOVUxMO1xcbiA0NzI6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiA0NzM6XFx0XFx0fVxcbiA0NzQ6XFx0XFx0LypcXG4gNDc1OlxcdFxcdCAqIFVzZSB0aGUgY29ycmVjdCBzZWVkIGZvciBjaGVja3N1bSAoaS5lLiB0aGUgc2VlZCBmcm9tICdpbm9kZScpLiAgVGhpc1xcbiA0NzY6XFx0XFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxcbiA0Nzc6XFx0XFx0ICogdGhlIG1pZ3JhdGlvbi5cXG4gNDc4OlxcdFxcdCAqL1xcbiA0Nzk6XFx0XFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xcbiA0ODA6XFx0XFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZDtcXG4gNDgxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IGVpLVxcdTAwM2VpX2NzdW1fc2VlZDtcXG4gNDgyOlxcdFxcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XFxuIDQ4MzpcXHRcXHQvKlxcbiA0ODQ6XFx0XFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXFxuIDQ4NTpcXHRcXHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxcbiA0ODY6XFx0XFx0ICovXFxuIDQ4NzpcXHRcXHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA0OTA6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDkxOlxcdFxcbiA0OTI6XFx0XFx0LypcXG4gNDkzOlxcdFxcdCAqIHN0YXJ0IHdpdGggb25lIGNyZWRpdCBhY2NvdW50ZWQgZm9yXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjQzLjY1ODM3NjAyMVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4OTA2ODQ1ODQzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGV4dDQncyBNaWdyYXRpb24gTG9naWMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBiYWNrIGludG8gdGhlIG5pdHR5LWdyaXR0eS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoaXMgYGV4dDRfbWlncmF0ZWAgZnVuY3Rpb24g4oCTIHNwZWNpZmljYWxseSwgc2VjdGlvbnMgNDk0IHRvIDU1MCB3aXRoaW4gYGZzL2V4dDQvbWlncmF0ZS5jYC4gSSByZWNhbGwgdGhpcyBpcyB3aGVyZSB0aGUgY29yZSBsb2dpYyBmb3IgbWlncmF0aW5nIGlub2RlcyBhbmQgZGF0YSBibG9ja3MgbGlrZWx5IHJlc2lkZXMuIEknbSBmb2N1c2luZyBvbiB0aGF0IHNwZWNpZmljIHJhbmdlIHRvIHBpbnBvaW50IHRoZSBtaWdyYXRpb24gc3RyYXRlZ3kgaW1wbGVtZW50ZWQuIEkgc3VzcGVjdCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgZGV0YWlscyB0aGUgaGFuZGxpbmcgb2YgYmxvY2sgYWxsb2NhdGlvbiwgbWV0YWRhdGEgdXBkYXRlcyAoaW5vZGUgbnVtYmVycywgZ3JvdXAgZGVzY3JpcHRvcnMsIGJpdG1hcHMsIGFuZCBzbyBvbiksIGFuZCBwb3RlbnRpYWxseSBhbnkgY29uc2lkZXJhdGlvbnMgZm9yIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgZHVyaW5nIHRoZSBwcm9jZXNzLiBJJ20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyBpdCBoYW5kbGVzIGF0b21pY2l0eSBhbmQgZGF0YSBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhpcyBwb3RlbnRpYWxseSBjb21wbGV4IHRyYW5zZm9ybWF0aW9uLiBJcyBpdCB1c2luZyBqb3VybmFsaW5nIHRvIHByb3RlY3QgYWdhaW5zdCBmYWlsdXJlcz8gSG93IGFyZSBibG9jayBudW1iZXJzIG1hbmFnZWQgZHVyaW5nIHRoZSBtb3ZlPyBJIGFsc28gd2FudCB0byBzZWUgaWYgdGhpcyBoYW5kbGVzIGFueSBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIERvZXMgaXQgYWxsb3cgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIG9yIGRvZXMgaXQgdGFrZSBleGNsdXNpdmUgbG9jayBpbiBvcmRlciB0byBtaWdyYXRlIGlub2Rlcz8gTGV0J3MgZ2V0IHRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MTg5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NTo1Mi41NjUyMjQxNzRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE2ODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ5NCxcbiAgXCJMaW5lQ291bnRcIjogNTZcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ5NDpcXHRcXHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cXG4gNDk1OlxcdFxcdCAqXFxuIDQ5NjpcXHRcXHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxcbiA0OTc6XFx0XFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXFxuIDQ5ODpcXHRcXHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxcbiA0OTk6XFx0XFx0ICovXFxuIDUwMDpcXHRcXHQvKlxcbiA1MDE6XFx0XFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xcbiA1MDI6XFx0XFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcXG4gNTAzOlxcdFxcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxcbiA1MDQ6XFx0XFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxcbiA1MDU6XFx0XFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xcbiA1MDY6XFx0XFx0ICogYWxsb2NhdGlvbi5cXG4gNTA3OlxcdFxcdCAqL1xcbiA1MDg6XFx0XFx0ZG93bl9yZWFkKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gNTA5OlxcdFxcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcXG4gNTEwOlxcdFxcdHVwX3JlYWQoKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKSk7XFxuIDUxMTpcXHRcXG4gNTEyOlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcXG4gNTEzOlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA1MTQ6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihoYW5kbGUpO1xcbiA1MTU6XFx0XFx0XFx0Z290byBvdXRfdG1wX2lub2RlO1xcbiA1MTY6XFx0XFx0fVxcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHRpX2RhdGEgPSBlaS1cXHUwMDNlaV9kYXRhO1xcbiA1MTk6XFx0XFx0bWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XFxuIDUyMDpcXHRcXG4gNTIxOlxcdFxcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cXG4gNTIyOlxcdFxcdG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDUyMzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRVhUNF9ORElSX0JMT0NLUzsgaSsrKSB7XFxuIDUyNDpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDUyNTpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1MjY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgXFx1MDAyNmxiKTtcXG4gNTI3OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDUyODpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDUyOTpcXHRcXHRcXHR9IGVsc2VcXG4gNTMwOlxcdFxcdFxcdFxcdGxiLmN1cnJfYmxvY2srKztcXG4gNTMxOlxcdFxcdH1cXG4gNTMyOlxcdFxcdGlmIChpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdKSB7XFxuIDUzMzpcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTM0OlxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTM2OlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTM3OlxcdFxcdH0gZWxzZVxcbiA1Mzg6XFx0XFx0XFx0bGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztcXG4gNTM5OlxcdFxcdGlmIChpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSkge1xcbiA1NDA6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1NDE6XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1NDI6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTQzOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTQ0OlxcdFxcdH0gZWxzZVxcbiA1NDU6XFx0XFx0XFx0bGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xcbiA1NDY6XFx0XFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XFxuIDU0NzpcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsXFxuIDU0ODpcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSksIFxcdTAwMjZsYik7XFxuIDU0OTpcXHRcXHRcXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NTo1Mi41NjUzNDMyODRaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Nzc3NjgzMzMyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgdGhlIE1lbW9yeSBJbml0aWFsaXphdGlvbiBpbiBgZXh0NF9leHRfbWlncmF0ZWAqKlxuXG5Pa2F5LCBsaW5lIDUxOSBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgaXQncyBjcnVjaWFsIHRvIGJlIHByZWNpc2Ugd2l0aCB0aGVzZSB0aGluZ3MuIEknbSBzZWVpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7YC4gUmlnaHQsIHNvIGBsYmAgaXMgZXhwbGljaXRseSBiZWluZyB6ZXJvZWQgb3V0IHVzaW5nIGBtZW1zZXRgLiBUaGF0IHRlbGxzIG1lIHRoZSBkZXZlbG9wZXIgaXMgYmVpbmcgZGlsaWdlbnQgYWJvdXQgbWVtb3J5IGluaXRpYWxpemF0aW9uLCB3aGljaCBpcyBnb29kIHByYWN0aWNlIOKAkyBlc3BlY2lhbGx5IGluIGEga2VybmVsIGNvbnRleHQuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyAqd2h5Kj8gSXMgaXQgc2ltcGx5IGRlZmVuc2l2ZSBwcm9ncmFtbWluZywgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gdGhlIHN0cnVjdHVyZSBuZWVkcyB0byBzdGFydCBpbiBhIGtub3duLCBjbGVhbiBzdGF0ZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudC4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gY2hlY2sgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIG5vdCBvbmx5IHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAqYW55d2hlcmUqIGBsYmAgb3IgYG1pZ3JhdGVfc3RydWN0YCBpcyB1c2VkIGlzIHJldmlld2VkLiBUaGVyZSBtaWdodCBiZSBhbiBhc3N1bXB0aW9uIGxhdGVyIG9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgemVybyBpbml0aWFsaXphdGlvbi4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgYW5kIGRhdGEgZGVwZW5kZW5jaWVzLiBMZXQncyBkaWcgZGVlcGVyIGFuZCBnZXQgYSBjbGVhciBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDQ5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjowMC4zNDIxNzkxNVoiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDcwMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTUwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTUwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTUxOlxcdFxcdH1cXG4gNTUyOlxcdFxcdC8qXFxuIDU1MzpcXHRcXHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcXG4gNTU0OlxcdFxcdCAqL1xcbiA1NTU6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcXHUwMDI2bGIpO1xcbiA1NTY6XFx0ZXJyX291dDpcXG4gNTU3OlxcdFxcdGlmIChyZXR2YWwpXFxuIDU1ODpcXHRcXHRcXHQvKlxcbiA1NTk6XFx0XFx0XFx0ICogRmFpbHVyZSBjYXNlIGRlbGV0ZSB0aGUgZXh0ZW50IGluZm9ybWF0aW9uIHdpdGggdGhlXFxuIDU2MDpcXHRcXHRcXHQgKiB0bXBfaW5vZGVcXG4gNTYxOlxcdFxcdFxcdCAqL1xcbiA1NjI6XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NjM6XFx0XFx0ZWxzZSB7XFxuIDU2NDpcXHRcXHRcXHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcXG4gNTY1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU2NjpcXHRcXHRcXHRcXHQvKlxcbiA1Njc6XFx0XFx0XFx0XFx0ICogaWYgd2UgZmFpbCB0byBzd2FwIGlub2RlIGRhdGEgZnJlZSB0aGUgZXh0ZW50XFxuIDU2ODpcXHRcXHRcXHRcXHQgKiBkZXRhaWxzIG9mIHRoZSB0bXAgaW5vZGVcXG4gNTY5OlxcdFxcdFxcdFxcdCAqL1xcbiA1NzA6XFx0XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NzE6XFx0XFx0fVxcbiA1NzI6XFx0XFxuIDU3MzpcXHRcXHQvKiBXZSBtYXJrIHRoZSB0bXBfaW5vZGUgZGlydHkgdmlhIGV4dDRfZXh0X3RyZWVfaW5pdC4gKi9cXG4gNTc0OlxcdFxcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIDEsIDApO1xcbiA1NzU6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDU3NjpcXHRcXHRcXHRnb3RvIG91dF9zdG9wO1xcbiA1Nzc6XFx0XFx0LypcXG4gNTc4OlxcdFxcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cXG4gNTc5OlxcdFxcdCAqL1xcbiA1ODA6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XFxuIDU4MTpcXHRcXG4gNTgyOlxcdFxcdC8qXFxuIDU4MzpcXHRcXHQgKiBzZXQgdGhlICBpX2Jsb2NrcyBjb3VudCB0byB6ZXJvXFxuIDU4NDpcXHRcXHQgKiBzbyB0aGF0IHRoZSBleHQ0X2V2aWN0X2lub2RlKCkgZG9lcyB0aGVcXG4gNTg1OlxcdFxcdCAqIHJpZ2h0IGpvYlxcbiA1ODY6XFx0XFx0ICpcXG4gNTg3OlxcdFxcdCAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGUgaV9sb2NrIGJlY2F1c2VcXG4gNTg4OlxcdFxcdCAqIHRoZSBpbm9kZSBpcyBub3QgdmlzaWJsZSB0byB1c2VyIHNwYWNlLlxcbiA1ODk6XFx0XFx0ICovXFxuIDU5MDpcXHRcXHR0bXBfaW5vZGUtXFx1MDAzZWlfYmxvY2tzID0gMDtcXG4gNTkxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XFxuIDU5MjpcXHRcXG4gNTkzOlxcdFxcdC8qIFJlc2V0IHRoZSBleHRlbnQgZGV0YWlscyAqL1xcbiA1OTQ6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNTk1OlxcdG91dF9zdG9wOlxcbiA1OTY6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNTk3OlxcdG91dF90bXBfaW5vZGU6XFxuIDU5ODpcXHRcXHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XFxuIDU5OTpcXHRvdXRfdW5sb2NrOlxcbiA2MDA6XFx0XFx0ZXh0NF93cml0ZXBhZ2VzX3VwX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiLCBhbGxvY19jdHgpO1xcbiA2MDE6XFx0XFx0aXB1dCh0bXBfaW5vZGUpO1xcbiA2MDI6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gNjAzOlxcdH1cXG4gNjA0OlxcdFxcbiA2MDU6XFx0LypcXG4gNjA2OlxcdCAqIE1pZ3JhdGUgYSBzaW1wbGUgZXh0ZW50LWJhc2VkIGlub2RlIHRvIHVzZSB0aGUgaV9ibG9ja3NbXSBhcnJheVxcbiA2MDc6XFx0ICovXFxuIDYwODpcXHRpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA2MDk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjowMC4zNDIyODgwMTlaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjMxNTIzMjQ0MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiB0aGUgRXh0NCBGaWxlc3lzdGVtIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIGZpZ3VyZSBvdXQgd2hhdCBpdCdzIGFkZHJlc3NpbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoZXJlJ3MgYSBwb3RlbnRpYWwgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZSBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtJ3MgbWlncmF0aW9uIHN0cnVjdHVyZS4gU3BlY2lmaWNhbGx5LCBpdCBsb29rcyBsaWtlIHdpdGhpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAsIHRoZSBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgbWVtYmVycyBhcmUgYWxsIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBhIGB1MzJgIOKAkyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxuXG5UaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBzZWVtcyB0byBiZSB3aXRoIGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgYGN1cnJfYmxvY2tgLiBUaGUgcGF0Y2ggbWVudGlvbnMgYW4gb3BlcmF0aW9uIGxpa2UgYGxiLVx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgYW5kIGluY3JlbWVudHMgd2l0aGluIGluZGlyZWN0IGJsb2NrIHRyYXZlcnNhbHMuIFRoaXMgaXMgd2hlcmUgSSBzZWUgdGhlIGltbWVkaWF0ZSByZWQgZmxhZy4gV2l0aCBwb3RlbnRpYWxseSBsYXJnZSBmaWxlc3lzdGVtcywgbGFyZ2UgYmxvY2sgc2l6ZXMsIG9yIGV2ZW4gY2FyZWZ1bGx5IGNvbnN0cnVjdGVkIGluZGlyZWN0IHRyZWVzLCB0aG9zZSBtdWx0aXBsaWNhdGlvbnMgYW5kIGluY3JlbWVudHMgY291bGQgZWFzaWx5IHB1c2ggYGN1cnJfYmxvY2tgIGJleW9uZCB0aGUgbGltaXRzIG9mIGEgMzItYml0IGludGVnZXIsIGxlYWRpbmcgdG8gYSB3cmFwLWFyb3VuZCBjb25kaXRpb24uIFRoYXQgbWVhbnMgYGN1cnJfYmxvY2tgIGNvdWxkIGJlY29tZSBhIHNtYWxsZXIgdmFsdWUgdGhhbiBleHBlY3RlZCwgbGVhZGluZyB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9yIGV2ZW4gY29ycnVwdGlvbi5cblxuVGhlIHBhdGNoJ3MgYWRkaXRpb24gb2YgYSBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBjaGVjayBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUgZml4LiBJdCdzIGRlc2lnbmVkIHRvIHByZXZlbnQgdXMgZnJvbSBleGNlZWRpbmcgdGhlIG1heGltdW0gZXh0ZW50IGJsb2NrIG51bWJlciB3aGljaCBpcyBkZWZpbmVkIGJ5IGBFWFRfTUFYX0JMT0NLU2AuIEknbSBnb2luZyB0byBxdWlja2x5IHZlcmlmeSB3aGF0IGBFWFRfTUFYX0JMT0NLU2AgYWN0dWFsbHkgKmlzKi4gS25vd2luZyB0aGF0IHdpbGwgY29uZmlybSB0aGF0IHRoaXMgY2hlY2sgaXMgc3VmZmljaWVudCBpbiBwcmV2ZW50aW5nIHRoZSBvdmVyZmxvdyBvciBpZiBzb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBpcyByZXF1aXJlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA2MTMsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjoyMy40OTQ2MTQ1OTVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzcwMDc0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFRfTUFYX0JMT0NLU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zODk2PXN0cnVjdCBleHQ0X2V4dGVudDtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM5MDEtICovXFxuZnMvZXh0NC9leHQ0Lmg6MzkwMjojZGVmaW5lIEVYVF9NQVhfQkxPQ0tTXFx0MHhmZmZmZmZmZlxcbmZzL2V4dDQvZXh0NC5oLTM5MDMtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xNTMxPXN0YXRpYyBpbnQgZXh0NF9leHRfc2VhcmNoX3JpZ2h0KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjMzLSAqIGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2MzQ6ICogcmV0dXJucyBhbGxvY2F0ZWQgYmxvY2sgaW4gc3Vic2VxdWVudCBleHRlbnQgb3IgRVhUX01BWF9CTE9DS1MuXFxuZnMvZXh0NC9leHRlbnRzLmMtMTYzNS0gKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXNcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE2NDA9ZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ3LVxcdGlmIChkZXB0aCA9PSAwIFxcdTAwMjZcXHUwMDI2IHBhdGgtXFx1MDAzZXBfZXh0ID09IE5VTEwpXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY0ODpcXHRcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY0OS1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjQtXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY2NTpcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY2Ni19XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY5LSAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazpcXG5mcy9leHQ0L2V4dGVudHMuYzoxNjcwOiAqIHJldHVybnMgZmlyc3QgYWxsb2NhdGVkIGJsb2NrIGZyb20gbmV4dCBsZWFmIG9yIEVYVF9NQVhfQkxPQ0tTXFxuZnMvZXh0NC9leHRlbnRzLmMtMTY3MS0gKi9cXG5mcy9leHQ0L2V4dGVudHMuYz0xNjcyPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjgwLVxcdGlmIChkZXB0aCA9PSAwKVxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2ODE6XFx0XFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTE2ODItXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjkzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2OTQ6XFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTUtfVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk0Mj1zdGF0aWMgdW5zaWduZWQgaW50IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTk2My1cXHRcXHRiMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NjQ6XFx0XFx0aWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NjUtXFx0XFx0XFx0Z290byBvdXQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcwLVxcdGlmIChiMSArIGxlbjEgXFx1MDAzYyBiMSkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NzE6XFx0XFx0bGVuMSA9IEVYVF9NQVhfQkxPQ0tTIC0gYjE7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTk3Mi1cXHRcXHRuZXdleHQtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGxlbjEpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMTAyLVxcdGZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjEwMzpcXHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwNC1cXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVxcdTAwM2VlZV9ibG9jaykgXFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXFx1MDAzZWVlX2Jsb2NrKSlcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA1LVxcdFxcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjEwNjpcXHRpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykge1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDctXFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MjI4MD1zdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfZmluZF9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMjkxLVxcdFxcdCpsYmxrID0gMDtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMjkyOlxcdFxcdGxlbiA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTMtXFx0fSBlbHNlIGlmICgqbGJsayBcXHUwMDNjIGxlMzJfdG9fY3B1KGV4LVxcdTAwM2VlZV9ibG9jaykpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTI2MjI9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjc2MS1cXHRcXHRpZiAobnVtID09IDApIHtcXG5mcy9leHQ0L2V4dGVudHMuYzoyNzYyOlxcdFxcdFxcdGlmIChlbmQgIT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjc2My1cXHRcXHRcXHRcXHQvKlxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9Mjg0NT1pbnQgZXh0NF9leHRfcmVtb3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzoyODc5OlxcdGlmIChlbmQgXFx1MDAzYyBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcXG5mcy9leHQ0L2V4dGVudHMuYy0yODgwLVxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCAqZXg7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00NTUxPWludCBleHQ0X2V4dF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDU3MC1cXHRcXHRcXHRcXHUwMDNlXFx1MDAzZSBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7XFxuZnMvZXh0NC9leHRlbnRzLmM6NDU3MTpcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDU3Mi1cXG5mcy9leHQ0L2V4dGVudHMuYy00NTczLXJldHJ5X3JlbW92ZV9zcGFjZTpcXG5mcy9leHQ0L2V4dGVudHMuYzo0NTc0OlxcdGVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSAxKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NTc1LVxcdGlmIChlcnIgPT0gLUVOT01FTSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTM0Mj1pbnQgZXh0NF9nZXRfZXNfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTUzNzctXFx0bGFzdF9ibGsgPSAoc3RhcnQgKyBsZW4gLSAxKSBcXHUwMDNlXFx1MDAzZSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemVfYml0cztcXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc4OlxcdGlmIChsYXN0X2JsayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc5OlxcdFxcdGxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTtcXG5mcy9leHQ0L2V4dGVudHMuYy01MzgwLVxcdGxlbl9ibGtzID0gKChleHQ0X2xibGtfdCkgbGFzdF9ibGspIC0gc3RhcnRfYmxrICsgMTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU0OTQ9ZXh0NF9leHRfc2hpZnRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwMS1cXHRleHQ0X2xibGtfdCBzdG9wLCAqaXRlcmF0b3IsIGV4X3N0YXJ0LCBleF9lbmQ7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTUwMjpcXHRleHQ0X2xibGtfdCB0bXAgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy01NTAzLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDQtXFx0LyogTGV0IHBhdGggcG9pbnQgdG8gdGhlIGxhc3QgZXh0ZW50ICovXFxuZnMvZXh0NC9leHRlbnRzLmM6NTUwNTpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDYtXFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MTktXFx0KiBhY2NvbW1vZGF0ZSB0aGUgc2hpZnQuICBGb3IgcmlnaHQgc2hpZnRzLCBtYWtlIHN1cmUgdGhlIGxhc3QgZXh0ZW50XFxuZnMvZXh0NC9leHRlbnRzLmM6NTUyMDpcXHQqIHdvbid0IGJlIHNoaWZ0ZWQgYmV5b25kIEVYVF9NQVhfQkxPQ0tTLlxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MjEtXFx0Ki9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDMtXFx0fSBlbHNlIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTQ0OlxcdFxcdGlmIChzaGlmdCBcXHUwMDNlIEVYVF9NQVhfQkxPQ0tTIC1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTQ1LVxcdFxcdCAgICAoc3RvcCArIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4dGVudCkpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTYyLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NjM6XFx0aWYgKHRtcCAhPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L2V4dGVudHMuYy01NTY0LVxcdFxcdCppdGVyYXRvciA9IHRtcDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU2Mzc9c3RhdGljIGludCBleHQ0X2NvbGxhcHNlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTY5NS1cXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU2OTY6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01NzM4PXN0YXRpYyBpbnQgZXh0NF9pbnNlcnRfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01ODMyLVxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo1ODMzOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01ODM0LVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTg3NT1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzEtXFx0XFx0XFx0LyogRG8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gc3dhcCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU5MzI6XFx0XFx0XFx0aWYgKG5leHQxID09IEVYVF9NQVhfQkxPQ0tTIHx8IG5leHQyID09IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzMtXFx0XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjEtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MjYyOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI2My1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjMzOT1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNTAtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MzUxOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1Mi1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTU5MT1zdGF0aWMgaW50IGV4dDRfZXNfY2FuX2JlX21lcmdlZChzdHJ1Y3QgZXh0ZW50X3N0YXR1cyAqZXMxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5Ni1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6NTk3OlxcdGlmICgoKF9fdTY0KSBlczEtXFx1MDAzZWVzX2xlbikgKyBlczItXFx1MDAzZWVzX2xlbiBcXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5OC1cXHRcXHRwcl93YXJuKFxcXCJFUyBhc3NlcnRpb24gZmFpbGVkIHdoZW4gbWVyZ2luZyBleHRlbnRzLiBcXFwiXFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAwLVxcdFxcdFxcdFxcXCJpcyBiaWdnZXIgdGhhbiBhbGxvd2VkIGZpbGUgc2l6ZSAoJWQpXFxcXG5cXFwiLFxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2MDE6XFx0XFx0XFx0ZXMxLVxcdTAwM2Vlc19sZW4sIGVzMi1cXHUwMDNlZXNfbGVuLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMi1cXHRcXHRXQVJOX09OKDEpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTE5NDM9c3RhdGljIGludCBlc19yZWNsYWltX2V4dGVudHMoc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWksIGludCAqbnJfdG9fc2NhbilcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU3LVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzoxOTU4OlxcdGlmICghZXNfZG9fcmVjbGFpbV9leHRlbnRzKGVpLCBFWFRfTUFYX0JMT0NLUywgbnJfdG9fc2NhbiwgXFx1MDAyNm5yX3NocnVuaykgXFx1MDAyNlxcdTAwMjZcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtMTk1OS1cXHQgICAgc3RhcnQgIT0gMClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzE3PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNS1cXHRcXHRjdXIgPSAwO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMzM2OlxcdFxcdGVuZCA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM3LVxcdFxcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpIHtcXG4tLVxcbmZzL2V4dDQvaW5kaXJlY3QuYz0xMTEyPXZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM1LVxcbmZzL2V4dDQvaW5kaXJlY3QuYzoxMTM2OlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcXG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNy1cXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg2Mj1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5MDgtXFx0XFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKSlcXG5mcy9leHQ0L2lubGluZS5jOjE5MDk6XFx0XFx0XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xOTEwLVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTcwMD1pbnQgZXh0NF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNzIyLVxcbmZzL2V4dDQvaW5vZGUuYzo3MjM6XFx0LyogV2UgY2FuIGhhbmRsZSB0aGUgYmxvY2sgbnVtYmVyIGxlc3MgdGhhbiBFWFRfTUFYX0JMT0NLUyAqL1xcbmZzL2V4dDQvaW5vZGUuYzo3MjQ6XFx0aWYgKHVubGlrZWx5KG1hcC1cXHUwMDNlbV9sYmxrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSlcXG5mcy9leHQ0L2lub2RlLmMtNzI1LVxcdFxcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTIxNzM9c3RhdGljIGludCBtcGFnZV9wcm9jZXNzX3BhZ2VfYnVmcyhzdHJ1Y3QgbXBhZ2VfZGFfZGF0YSAqbXBkLFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTIxODItXFx0aWYgKGV4dDRfdmVyaXR5X2luX3Byb2dyZXNzKGlub2RlKSlcXG5mcy9leHQ0L2lub2RlLmM6MjE4MzpcXHRcXHRibG9ja3MgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2lub2RlLmMtMjE4NC1cXG4tLVxcbmZzL2V4dDQvaW5vZGUuYz02MDA5PWludCBleHQ0X3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy02MTcyLVxcdFxcdFxcdFxcdFxcdGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZV9iaXRzLFxcbmZzL2V4dDQvaW5vZGUuYzo2MTczOlxcdFxcdFxcdFxcdFxcdEVYVF9NQVhfQkxPQ0tTIC0gMSk7XFxuZnMvZXh0NC9pbm9kZS5jLTYxNzQtXFx0XFx0XFx0ZWxzZVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTMxMz1zdGF0aWMgdm9pZCBzd2FwX2lub2RlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jLTM0MS1cXHRzd2FwKGVpMS1cXHUwMDNlaV9kaXNrc2l6ZSwgZWkyLVxcdTAwM2VpX2Rpc2tzaXplKTtcXG5mcy9leHQ0L2lvY3RsLmM6MzQyOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTEsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lvY3RsLmM6MzQzOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTIsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lvY3RsLmMtMzQ0LVxcbi0tXFxuZnMvZXh0NC9tYmFsbG9jLmM9NDUxOT1leHQ0X21iX25vcm1hbGl6ZV9yZXF1ZXN0KHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuYy00NjA1LVxcdC8qIGF2b2lkIHVubmVjZXNzYXJ5IHByZWFsbG9jYXRpb24gdGhhdCBtYXkgdHJpZ2dlciBhc3NlcnRpb25zICovXFxuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNjpcXHRpZiAoc3RhcnQgKyBzaXplIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNzpcXHRcXHRzaXplID0gRVhUX01BWF9CTE9DS1MgLSBzdGFydDtcXG5mcy9leHQ0L21iYWxsb2MuYy00NjA4LVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbi0tXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jPTUxNz1zdGF0aWMgaW50IG1leHRfY2hlY2tfYWRqdXN0X3JhbmdlKHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSxcXG4tLVxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzAtXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMTpcXHRpZiAoKG9yaWdfc3RhcnQgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMjpcXHQgICAgKGRvbm9yX3N0YXJ0IFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzM6XFx0ICAgICgqbGVuIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNDpcXHQgICAgKGRvbm9yX3N0YXJ0ICsgKmxlbiBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTM1OlxcdCAgICAob3JpZ19zdGFydCArICpsZW4gXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKSAge1xcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzYtXFx0XFx0ZXh0NF9kZWJ1ZyhcXFwiZXh0NCBtb3ZlIGV4dGVudDogQ2FuJ3QgaGFuZGxlIG92ZXIgWyV1XSBibG9ja3MgW2lubzpvcmlnICVsbHUsIGRvbm9yICVsbHVdXFxcXG5cXFwiLFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1Mzc6XFx0XFx0XFx0ICAgRVhUX01BWF9CTE9DS1MsXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzOC1cXHRcXHRcXHQgICBvcmlnX2lub2RlLVxcdTAwM2VpX2lubywgZG9ub3JfaW5vZGUtXFx1MDAzZWlfaW5vKTtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0xNTM5PXZvaWQgZXh0NF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTE1NjgtXFx0cmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpO1xcbmZzL2V4dDQvc3VwZXIuYzoxNTY5OlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvc3VwZXIuYy0xNTcwLVxcdGRxdW90X2Ryb3AoaW5vZGUpO1xcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYz0yNzE9c3RhdGljIGludCBleHQ0X2dldF92ZXJpdHlfZGVzY3JpcHRvcl9sb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYy0yOTMtXFxuZnMvZXh0NC92ZXJpdHkuYzoyOTQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCwgMCk7XFxuZnMvZXh0NC92ZXJpdHkuYy0yOTUtXFx0aWYgKElTX0VSUihwYXRoKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDY6MjMuNTk4MzIwODg4WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDcxODM3NjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIEdlbmVzaXMgb2YgVGhpcyBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gb2YgdGhpcyBjaGFuZ2UuIFRoZSBjb2RlIGl0c2VsZiAqc2VlbXMqIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2gsIGJ1dCB0aGUgcmF0aW9uYWxlIGJlaGluZCBpdCDigJMgdGhlIFwid2h5XCIg4oCTIGlzIGFsd2F5cyB0aGUgY3J1Y2lhbCBwaWVjZSwgaXNuJ3QgaXQ/IE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIEdpdCBoaXN0b3J5LiBMZXQncyBzdGFydCB3aXRoIGBnaXQgbG9nYC4gSSB3YW50IHRvIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kaWZpY2F0aW9uLiBUaGF0IG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNvbnRleHQsIHRoZSBidWcgcmVwb3J0IG51bWJlciAoaG9wZWZ1bGx5ISksIHRoZSByZWFzb25pbmcsIG9yIGF0IGxlYXN0IGEgcmVmZXJlbmNlIHRvIHRoZSB0aWNrZXQgdGhhdCBzcHVycmVkIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrLiBJZGVhbGx5LCB0aGUgY29tbWl0IGxvZyB3aWxsIGNsYXJpZnkgdGhlIG9yaWdpbmFsIGludGVudGlvbiBhbmQgY29ubmVjdCBtZSB0byB0aGUgcmVsZXZhbnQgcHJvYmxlbSBvciBmZWF0dXJlIHJlcXVlc3QuIEZyb20gdGhlcmUsIEknbGwgYXNzZXNzIHRoZSBjb21taXQncyBsaW5lYWdlIGFuZCBhbnkgcmVsYXRlZCBicmFuY2hlcyB0byBnZXQgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIGNoYW5nZSBldm9sdmVkLiBJIGNhbiB1c3VhbGx5IGdsZWFuIGEgbG90IGZyb20gdGhlIGhpc3RvcnkgaXRzZWxmLCBidXQgSSBhbSBob3BpbmcgdGhhdCBJIHdvbid0IGhhdmUgdG8gc3RhcnQgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgaXNzdWUgYmFzZWQgb24gb25seSB0aGUgZGlmZi4gVWx0aW1hdGVseSwgbXkgZ29hbCBpcyB0byB0cmFjZSB0aGlzIGNoYW5nZSBiYWNrIHRvIGl0cyBvcmlnaW4sIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlLCBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCBhZGRyZXNzZWQgdGhlIG5lZWQgZWZmZWN0aXZlbHkgd2l0aGluIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYyMzksIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjozNi4wNzAxNjI0MzZaIiwiU2VxIjo0OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzU5MTcyOTMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjozOC40MDYwODUzNTlaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTMzMTU2NTYwNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBJbnRlZ2VyIE92ZXJmbG93IEZpeCBpbiBleHQ0X2V4dF9taWdyYXRlKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJIHNlZSB3ZSdyZSBsb29raW5nIGF0IGEgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0aGF0IGludm9sdmVzIGEgbG9jYWwgc3RydWN0IGNhbGxlZCBgbWlncmF0ZV9zdHJ1Y3RgIChhbGlhc2VkIGFzIGBsYmAgaW4gdGhlIGNvZGUpLiBUaGUga2V5IGNoYW5nZSBhcHBlYXJzIHRvIGJlIGJ1bXBpbmcgdGhlIHNpemUgb2Ygc29tZSBibG9jayBudW1iZXIgZmllbGRzIHdpdGhpbiBgbGJgIGZyb20gMzItYml0IChgZXh0NF9sYmxrX3RgLCBha2EgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApLlxuXG5NeSBmaXJzdCB0aG91Z2h0IGlzIGFsd2F5cywgZG9lcyB0aGlzIHBhdGNoIGludHJvZHVjZSBhbnkgcG90ZW50aWFsIGZvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/IExldCdzIGdvIHRocm91Z2ggdGhlIGNoZWNrbGlzdC5cblxuMS4gICoqVXNlcnNwYWNlIEV4cG9zdXJlOioqIElzIHRoaXMgbmV3IGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFueSB3YXk/IFRoYW5rZnVsbHksIG5vLiBUaGlzIHN0cnVjdCBpcyBsb2NhbCB0byB0aGUgYG1pZ3JhdGUuY2AgZmlsZSBhbmQgbmV2ZXIgYXBwZWFycyB0byBiZSBjb3BpZWQgb3V0IHZpYSBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluaywgaW9jdGwsIHNvY2tldHMsIG9yIEJQRi4gTm8gaXNzdWUgaGVyZS5cblxuMi4gICoqVW5pbml0aWFsaXplZCBWYXJpYWJsZXM6KiogSXMgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IG1pZ2h0IGRlcGVuZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm9wZS4gYGxiYCBpcyAqZXhwbGljaXRseSogaW5pdGlhbGl6ZWQgdG8gYWxsIHplcm9zIHdpdGggYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSBhbnkgdXNlLiBUaGF0J3MgZ29vZCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcuXG5cbjMuICAqKkNvbXBsZXggRGF0YSBTdHJ1Y3R1cmUgSW5pdGlhbGl6YXRpb246KiogSXMgdGhlcmUgYW55IGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgbW9yZSBjb21wbGljYXRlZCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgZmllbGRzIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQ/IE5vIGFnYWluLiBUaGlzIGBsYmAgc3RydWN0IGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIHplcm9lZCwgc28gd2UncmUgZ29vZCB0aGVyZS5cblxuNC4gICoqQm91bmRzIENoZWNraW5nIGFuZCBNZW1vcnkgQWNjZXNzOioqIElzIHRoZXJlIGEgcG90ZW50aWFsIGZvciBib3VuZHMtY2hlY2sgYnlwYXNzZXMgb3IgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgZGF0YSBpbiBzdXJyb3VuZGluZyBidWZmZXJzPyBXZWxsLCB0aGUgY3JpdGljYWwgbGluZSBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBsb29rcyBsaWtlIGEga2V5IGJvdW5kcyBjaGVjay4gVGhlIHBhdGNoIGlzIHByZXZlbnRpbmcgYGxiLVx1MDAzZWN1cnJfYmxvY2tgIChub3cgYSA2NC1iaXQgdmFsdWUpIGZyb20gZXhjZWVkaW5nIGBFWFRfTUFYX0JMT0NLU2AsIHdoaWNoIGxvb2tzIGxpa2UgYSBoYXJkY29kZWQgY29uc3RhbnQgcmVsYXRpbmcgdG8gZXh0ZW50cy4gSWYgaXQgKmRvZXMqIGdvIGJleW9uZCwgd2UgZ2V0IGEgbmljZSBgLUVPUE5PVFNVUFBgIGVycm9yLiBJdCdzIGNsZWFyIHRoYXQgKmJlZm9yZSogdGhlIGNoYW5nZSwgYW4gb3ZlcmZsb3cgb24gdGhpcyAzMi1iaXQgZmllbGQgd2FzIGEgcG90ZW50aWFsIHByb2JsZW0uIEl0IGNvdWxkIGxlYWQgdG8gd3JhcHBpbmcgYW5kIGNvcnJ1cHQgZXh0ZW50IG1hbmlwdWxhdGlvbnMuXG5cblNvLCB0aGlzIGxvb2tzIGxpa2UgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBmaXguIElmIGBsYi1cdTAwM2VjdXJyX2Jsb2NrYCB3ZXJlIHRvIGV4Y2VlZCBgRVhUX01BWF9CTE9DS1NgIG9uIGEgY29ycnVwdCBvciBvdGhlcndpc2UgbWFsaWNpb3VzIGZpbGVzeXN0ZW0sIHRoZSBtaWdyYXRpb24gbWlnaHQgaGF2ZSBtZXNzZWQgdXAgZXh0ZW50cy4gU28gZmFyLCBzbyBnb29kLlxuXG5Ob3csIGxldCdzIGRvdWJsZS1jaGVjay4gSSBzZWUgdGhhdCB0aGUgYG5ld2V4dGAgdmFyaWFibGUgaXMgYSBgc3RydWN0IGV4dDRfZXh0ZW50YCwgd2hpY2ggaXMgcGFzc2VkIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSXQncyBwb3B1bGF0ZWQgdXNpbmcgZGF0YSBmcm9tIGBsYmAuIEkgbmVlZCB0byBlbnN1cmUgdGhhdCAqZXZlcnkqIGZpZWxkIG9mIGBuZXdleHRgIGlzIGFzc2lnbmVkICpiZWZvcmUqIGl0IGdldHMgdXNlZC4gQW5kIHRoZSBjb2RlIGNvbmZpcm1zIGl0LlxuVGhlIGFzc2lnbm1lbnRzIHRvIGBuZXdleHQuZWVfYmxvY2tgLCBgbmV3ZXh0LmVlX2xlbmAsIGFuZCB0aGUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgY2FsbHMsIHdoaWNoIHNldCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVycywgbG9vayBjbGVhbi4gSSB0aGluayB3ZSBhcmUgc2FmZSBoZXJlLCB0aGUgZml4IGlzIHZhbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY1MCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0ODoxMS43MjE3NDU0MjZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyMTUyNTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBleHQ0X2V4dGVudCBcXFxce1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjExLjc5MzkwMjUxNFoiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3OTQ0NzA2MTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIEV4dDQncyBFeHRlbnQgU3RydWN0dXJlcyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGV4dDRfZXh0ZW50cy5oYC4gSSdtIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIGxpbmVzIDU2IHRocm91Z2ggNjUuIEknbSBndWVzc2luZyB0aGF0IGFyZWEgcHJvYmFibHkgZGV0YWlscyB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBmb3IgZXh0ZW50LWJhc2VkIGZpbGUgbWFwcGluZyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBHaXZlbiBteSBleHBlcmllbmNlLCBJJ20gZXhwZWN0aW5nIHRvIHNlZSBkZWZpbml0aW9ucyBmb3Igc3RydWN0cyB0aGF0IGhvbGQgaW5mb3JtYXRpb24gbGlrZSB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzLCB0aGUgcGh5c2ljYWwgYmxvY2sgYWRkcmVzcywgdGhlIGV4dGVudCBsZW5ndGgsIGFuZCBwb3RlbnRpYWxseSBzb21lIGZsYWdzIG9yIG1ldGFkYXRhIGFib3V0IHRoZSBleHRlbnQuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IGV4dDQgb3JnYW5pemVzIHRoZXNlIGV4dGVudHMsIGhvdyBpdCBoYW5kbGVzIGZyYWdtZW50YXRpb24gd2l0aGluIGEgZmlsZSwgYW5kIGhvdyBpdCB0cmFuc2xhdGVzIGxvZ2ljYWwgYmxvY2sgbnVtYmVycyB0byBwaHlzaWNhbCBvbmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZmlsZXN5c3RlbSBtYW5hZ2VzIGl0cyBvbi1kaXNrIGxheW91dCwgYW5kIGltcHJvdmUgbXkgYWJpbGl0eSB0byB0cm91Ymxlc2hvb3QgZXh0NCByZWxhdGVkIHN0b3JhZ2UgaXNzdWVzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSBhY3R1YWxseSByZXZlYWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE5NSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjE5LjczODYxMzA0M1oiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjY0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU2LFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDU2OlxcdHN0cnVjdCBleHQ0X2V4dGVudCB7XFxuICA1NzpcXHRcXHRfX2xlMzJcXHRlZV9ibG9jaztcXHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cXG4gIDU4OlxcdFxcdF9fbGUxNlxcdGVlX2xlbjtcXHRcXHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXFxuICA1OTpcXHRcXHRfX2xlMTZcXHRlZV9zdGFydF9oaTtcXHQvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cXG4gIDYwOlxcdFxcdF9fbGUzMlxcdGVlX3N0YXJ0X2xvO1xcdC8qIGxvdyAzMiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXFxuICA2MTpcXHR9O1xcbiAgNjI6XFx0XFxuICA2MzpcXHQvKlxcbiAgNjQ6XFx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cXG4gIDY1OlxcdCAqIEl0J3MgdXNlZCBhdCBhbGwgdGhlIGxldmVscyBleGNlcHQgdGhlIGJvdHRvbS5cXG4gIDY2OlxcdCAqL1xcbiAgNjc6XFx0c3RydWN0IGV4dDRfZXh0ZW50X2lkeCB7XFxuICA2ODpcXHRcXHRfX2xlMzJcXHRlaV9ibG9jaztcXHQvKiBpbmRleCBjb3ZlcnMgbG9naWNhbCBibG9ja3MgZnJvbSAnYmxvY2snICovXFxuICA2OTpcXHRcXHRfX2xlMzJcXHRlaV9sZWFmX2xvO1xcdC8qIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIGJsb2NrIG9mIHRoZSBuZXh0ICpcXG4gIDcwOlxcdFxcdFxcdFxcdFxcdCAqIGxldmVsLiBsZWFmIG9yIG5leHQgaW5kZXggY291bGQgYmUgdGhlcmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6MTkuNzM4NzEyNDEyWiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNDc1MDE3MTUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgXCJBbmQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2BcIiBhcyBhIHRob3VnaHQgcHJvY2VzcywgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzc3VtaW5nIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCoqXG5cbkFscmlnaHQsIHNvIHdlJ3JlIGxvb2tpbmcgYXQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEltbWVkaWF0ZWx5LCBteSBicmFpbiBnb2VzIHRvIHRoZSBjb3JlOiBob3cgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBhbGxvY2F0aW9uIGFuZCBzdG9yYWdlIG9mIHBoeXNpY2FsIGJsb2NrcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBleHRlbnQtYmFzZWQgZmlsZXMuIFRoZSBuYW1lIGl0c2VsZiBpcyBwcmV0dHkgY2xlYXI6IGl0J3MgYSBmdW5jdGlvbiBvciBtZWNoYW5pc20gcmVsYXRlZCB0byBzdG9yaW5nIChvciBtYW5hZ2luZyB0aGUgc3RvcmFnZSBvZikgcGh5c2ljYWwgYmxvY2tzIGxpbmtlZCB0byBhbiBleHRlbnQgc3RydWN0dXJlLlxuXG5NeSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGxheWVycy4gSSdtIHRoaW5raW5nIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgZm9yIHBlcmZvcm1hbmNlOiBob3cgZWZmaWNpZW50bHkgaXMgdGhpcyBoYW5kbGluZyBibG9jayBhbGxvY2F0aW9uPyBXaGF0IGFyZSB0aGUgcG90ZW50aWFsIGJvdHRsZW5lY2tzPyBJcyBpdCBvcHRpbWl6ZWQgZm9yIHNlcXVlbnRpYWwgd3JpdGVzLCByYW5kb20gYWNjZXNzLCBvciBib3RoPyBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHNpbXBsZSBtYXBwaW5nLCBvciBpcyB0aGVyZSBzb21lIG1vcmUgc29waGlzdGljYXRlZCBtZXRhZGF0YSBpbnZvbHZlZCwgcG90ZW50aWFsbHkgcmVsYXRlZCB0byBibG9jayBncm91cHMsIGJsb2NrIGJpdG1hcHMsIG9yIGlub2RlIHN0cnVjdHVyZXM/XG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gV2hhdCBoYXBwZW5zIGlmIHRoaXMgZnVuY3Rpb24gZW5jb3VudGVycyBhbiBhbGxvY2F0aW9uIGVycm9yPyBEb2VzIGl0IGdyYWNlZnVsbHkgaGFuZGxlIG91dC1vZi1zcGFjZSBjb25kaXRpb25zLCBvciBkb2VzIGl0IHRyaWdnZXIgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcj8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBpZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgY29uY3VycmVudGx5PyBJJ20gaW1hZ2luaW5nIHNjZW5hcmlvcyB3aGVyZSBtdWx0aXBsZSB0aHJlYWRzIG9yIHByb2Nlc3NlcyBjb3VsZCBiZSBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlIGJsb2NrcyBzaW11bHRhbmVvdXNseS5cblxuVGhlbiB0aGVyZSdzIHRoZSBiaWdnZXIgcGljdHVyZTogaG93IGRvZXMgdGhpcyBmdW5jdGlvbiBpbnRlZ3JhdGUgd2l0aCB0aGUgb3ZlcmFsbCBleHQ0IGFsbG9jYXRpb24gc3RyYXRlZ3k/IElzIGl0IGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGluIGltcGxlbWVudGluZyBmZWF0dXJlcyBsaWtlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvciB0aGUgZmlsZXN5c3RlbSdzIGpvdXJuYWxpbmcgc3lzdGVtPyBJIGNhbiBzZWUgaXRzIHJlbGF0aW9uc2hpcCB0byBhbGxvY2F0aW9uIHBvbGljaWVzLCBob3cgaXQgbWFuYWdlcyB0aGUgZmlsZSdzIGJsb2NrcyBhbmQgaG93IHRoZSBtZXRhZGF0YSBpbnRlcmFjdHMuIEkgc3RhcnQgdG8gbWVudGFsbHkgdHJhY2UgdGhlIGNvZGUgcGF0aDogd2hlcmUgaXMgaXQgY2FsbGVkIGZyb20/IFdoYXQgc3RydWN0dXJlcyBkb2VzIGl0IGludGVyYWN0IHdpdGg/IFdoYXQgYXJlIGl0cyBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLCBhbmQgaG93IGFyZSB0aGVzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZXh0NCBmaWxlc3lzdGVtP1xuXG5cbiIsIklucHV0VG9rZW5zIjoxODcyOSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6NDMuMjEzNzMyNjk2WiIsIlNlcSI6NTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MjgwODUyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0NS0gKi9cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0NjpzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXFx0XFx0XFx0XFx0XFx0IGV4dDRfZnNibGtfdCBwYilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6NDMuMjg2NTQ3ODI0WiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM5OTQxNjg4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBDb2RlKipcblxuT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEJhc2VkIG9uIHRoZSBwcm9ibGVtIGF0IGhhbmQsIEkgdGhpbmsgdGhlIGNyaXRpY2FsIGNvZGUgc2VnbWVudCBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgaW4gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgLiBJJ20gZm9jdXNpbmcgbXkgYXR0ZW50aW9uIG9uIGxpbmVzIDI0Ni0yNTUgd2l0aGluIHRoYXQgZmlsZS4gVGhpcyByYW5nZSBsaWtlbHkgY29udGFpbnMgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIG9yIHBlcmhhcHMgc29tZSBjcml0aWNhbCBtYWNybyBkZWZpbml0aW9ucyBkaXJlY3RseSBpbnZvbHZlZCBpbiB0aGUgZXh0ZW50IG1hbmFnZW1lbnQuIExldCdzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQgaW4gdGhlcmUuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCdzIGdldCBzdGFydGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMzNiwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjQ3LjI4MDcxOTE2WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2MjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjQ2LFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQ2OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG4gMjQ3OlxcdFxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuIDI0ODpcXHR7XFxuIDI0OTpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFxcdTAwMjYgMHhmZmZmZmZmZikpO1xcbiAyNTA6XFx0XFx0ZXgtXFx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXFx1MDAzZVxcdTAwM2UgMzEpIFxcdTAwM2VcXHUwMDNlIDEpIFxcdTAwMjZcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdCAgICAgIDB4ZmZmZik7XFxuIDI1MjpcXHR9XFxuIDI1MzpcXHRcXG4gMjU0OlxcdC8qXFxuIDI1NTpcXHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjQ3LjI4MDc5NzM0OVoiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMTMwNjI3MzE4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudDogTmVlZHNLTVNBTiA9IGZhbHNlKipcblxuT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJJ20gcHJldHR5IGNvbmZpZGVudCBpbiBteSBhc3Nlc3NtZW50LiBUaGUgYG5ld2V4dGAgZmllbGRzIGFyZSBhbGwgZ29vZCDigJMgdGhleSB3ZXJlbid0IGV2ZW4gdG91Y2hlZCBoZXJlLCBzbyBubyBjb25jZXJucyB0aGVyZS4gVGhpcyBwYXRjaCBpcyBmb2N1c2VkIHNvbGVseSBvbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBhbmQgbWFraW5nIHNvbWUgY2hhbmdlcyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgbG9naWNhbCBibG9jayBudW1iZXJzLCBzcGVjaWZpY2FsbHkgZXhwYW5kaW5nIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgaW50ZWdlcnMuIFRoZXJlJ3MgYWxzbyBhIGNoZWNrIGFkZGVkIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBwcmV2ZW50IGV4Y2VlZGluZyB0aGUgYEVYVF9NQVhfQkxPQ0tTYCBsaW1pdC4gRXNzZW50aWFsbHksIGl0J3MgYWJvdXQgcHJldmVudGluZyBhIDMyLWJpdCBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGFuIGV4dGVudC1iYXNlZCByZXByZXNlbnRhdGlvbiB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS5cblxuVGhlIGNyaXRpY2FsIHRoaW5nIGlzIHRoYXQgYGxiYCwgb3VyIGBtaWdyYXRlX3N0cnVjdGAgaW5zdGFuY2UsIGlzIGluaXRpYWxpemVkIHdpdGggYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFRoYXQgemVyb3Mgb3V0ICpldmVyeXRoaW5nKi4gVGhlcmUncyBubyBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbnZvbHZlZCwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBLTVNBTiwgbm8gdW5pbml0aWFsaXplZCByZWFkcywgYW5kIGRlZmluaXRlbHkgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgbGVha3MuIFRoaXMgY2hhbmdlIG9ubHkgZGVhbHMgd2l0aCBmaWxlc3lzdGVtIGxvZ2ljLCBpbnRlZ2VyIG92ZXJmbG93LCBhbmQgYm91bmRzIGNoZWNrcywgYnV0IHRoZXNlIGFyZSBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBLTVNBTiBpcyBkZWZpbml0ZWx5IG5vdCB0aGUgcmlnaHQgdG9vbCBmb3IgdGhpcy4gV2UncmUgbG9va2luZyBhdCBzdGFuZGFyZCBpbnRlZ2VyIG92ZXJmbG93IGFuZCBib3VuZGFyeSBjb25kaXRpb25zIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpdHNlbGYuXG5cbkxldCBtZSBkbyBhIHF1aWNrIHNhbml0eSBjaGVjayBvZiBhbGwgb3VyIHJlcXVpcmVtZW50czpcblxuKiAgICoqTmVlZHNLTVNBTjogZmFsc2UqKiDigJMgQ29uZmlybWVkLlxuKiAgICoqS01TQU5SZWFzb25pbmc6KiogVGhlIGBtaWdyYXRlX3N0cnVjdGAgaXMgc3RhY2stYWxsb2NhdGVkIGFuZCBjb21wbGV0ZWx5IHplcm9lZC4gVGhpcyBwYXRjaCBicm9hZGVucyB0aGUgbG9naWNhbCBibG9jayB0cmFja2luZyBtZW1iZXJzIHRvIGB1NjRgIGFuZCBhZGRzIGEgYm91bmRhcnkgY2hlY2sgYWdhaW5zdCBgRVhUX01BWF9CTE9DS1NgIHRvIHByZXZlbnQgMzItYml0IGludGVnZXIgb3ZlcmZsb3cgZHVyaW5nIGluZGlyZWN0IGJsb2NrIG1pZ3JhdGlvbiB0byBleHRlbnRzLiBObyBtZW1vcnkgaXMgc2hhcmVkIHdpdGggdXNlciBzcGFjZSwgdGhlcmUgYXJlIG5vIGNvbnRyb2wtZmxvdyBicmFuY2hlcyByZWx5aW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgYWNjZXNzIGlzIGludHJvZHVjZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBmaWxlc3lzdGVtIHRlc3Qgc3VpdGVzIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBraW5kIG9mIGJvdW5kcy9vdmVyZmxvdyBmaXguIEtNU0FOIHdvdWxkIGJlIG92ZXJraWxsLiBXZSBkb24ndCBuZWVkIGRlZGljYXRlZCBmdXp6aW5nIGhlcmUuXG5cbkFscmlnaHQsIHRoYXQgY292ZXJzIGl0LiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk3MzUsIk91dHB1dFRva2VucyI6MjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQ2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NTA6NDAuMzQzNTMzMjVaIiwiU2VxIjo1OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDgzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBmcy9leHQ0L21pZ3JhdGUuY2AgYnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGZyb20gMzItYml0IGBleHQ0X2xibGtfdGAgdG8gYHU2NGAgYW5kIGFkZGluZyBhbiB1cHBlciBib3VuZCBjaGVjayBgbGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXFxuXFxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5UaGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBgZXh0NF9leHRfbWlncmF0ZSgpYCBhbmQgaXMgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIHVzaW5nIGBtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-14 08:41:57 +0000 UTC FinishedAt: 2026-09-14 08:50:41 +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": "b477e560-8a06-4fc5-af74-c5727d587d81" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "update_extent_range", "ext4_ext_migrate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "base_tree": "torvalds" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+N208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cblxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC0xNCw3ICYjNDM7MTQsNyBAQFxuICAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxuICAqL1xuIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG4tXHRleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiYjNDM7XHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiB9O1xuIFxuQEAgLTY2LDYgJiM0Mzs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuJiM0MztcbiYjNDM7XHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cylcbiBcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCA1ZDYwZWYxMGZlMTEwLi45YWVkNGZkYWU2Nzg3IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtMTQsNyAmIzQzOzE0LDcgQEAKICAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudAogICovCiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgewotCWV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwomIzQzOwl1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7CiAJZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7CiB9OwogCkBAIC02Niw2ICYjNDM7NjYsMTAgQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYikKIHsKIAlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiAJLyoKIAkgKiBTZWUgaWYgd2UgY2FuIGFkZCBvbiB0byB0aGUgZXhpc3RpbmcgcmFuZ2UgKGlmIGl0IGV4aXN0cykKIAkgKi8KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk1NwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBNaWdyYXRpb24gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW4uIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIGFwcGxpZWQgdG8gYGZzL2V4dDQvbWlncmF0ZS5jYCwgYW5kIG15IGluaXRpYWwgYXBwcm9hY2ggaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaXRzIGltcGFjdC4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGl0c2VsZi4gSSYjMzk7bGwgemVybyBpbiBvbiB0aGUgY2hhbmdlcyBhcm91bmQgbGluZXMgMTQgYW5kIDY2IHNwZWNpZmljYWxseSwgYXMgdGhlc2UgYXJlIG9mdGVuIGhvdCBzcG90cyBmb3IgY3J1Y2lhbCBsb2dpYyBvciBkYXRhIHN0cnVjdHVyZSBtb2RpZmljYXRpb25zLiBUaGVuLCB0byBnZXQgdGhlIGNvbXBsZXRlIHBpY3R1cmUsIEkmIzM5O2xsIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgdGhlIHdob2xlIGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGFyb3VuZCB0aGUgbGluZXMgSSYjMzk7dmUgaWRlbnRpZmllZCwgYW5kIGFsbG93IG1lIHRvIHVuZGVyc3RhbmQgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBwYXJ0aWN1bGFyIHBhdGNoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXG4gICAyOlx0LypcbiAgIDM6XHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XG4gICA0Olx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVx1MDAzZVxuICAgNTpcdCAqXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9qYmQyLmhcJiMzNDtcbiAgMTA6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2V4dGVudHMuaFwmIzM0O1xuICAxMTpcdFxuICAxMjpcdC8qXG4gIDEzOlx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXG4gIDE0Olx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gIDE1Olx0ICovXG4gIDE2Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbiAgMTc6XHRcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFxuICA3MDpcdFx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbiAgNzE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuICA3MjpcdFxuICA3MzpcdFx0LypcbiAgNzQ6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3NTpcdFx0ICovXG4gIDc2Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3NzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzg6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbiAgNzk6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDgwOlx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4MTpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODI6XHRcdFx0cmV0dXJuIDA7XG4gIDgzOlx0XHR9XG4gIDg0Olx0XHQvKlxuICA4NTpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDg2Olx0XHQgKi9cbiAgODc6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg4Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODk6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDkwOlx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgOTE6XHRcdHJldHVybiByZXR2YWw7XG4gIDkyOlx0fVxuICA5MzpcdFxuICA5NDpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTU6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDk2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NzpcdHtcbiAgOTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk5Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ2NTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGBtaWdyYXRlLmNgIGluIHRoZSBleHQ0IEZpbGVzeXN0ZW0qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGUgZXh0NCBmaWxlc3lzdGVtIGFnYWluLCBhbmQgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLiBNeSBmaXJzdCB0aG91Z2h0IGlzLCAmIzM0O1doZXJlJiMzOTtzIHRoZSBlbnRyeSBwb2ludD8gV2hlcmUgaXMgYG1pZ3JhdGUuY2AgYWN0dWFsbHkgKnVzZWQqIHdpdGhpbiB0aGUgbGFyZ2VyIGV4dDQgc3RydWN0dXJlPyYjMzQ7IEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGlvY3RscyBvciBzeXNjYWxscyB0cmlnZ2VyIHRoZSBjb2RlIGluIGBtaWdyYXRlLmNgLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O2xsIHN0YXJ0IGJ5IGRvaW5nIGEgdGFyZ2V0ZWQgc2VhcmNoIGZvciBmdW5jdGlvbnMgKndpdGhpbiogYGZzL2V4dDQvbWlncmF0ZS5jYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQuIE9uY2UgSSB1bmRlcnN0YW5kIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscywgSSBjYW4gdHJhY2UgYmFjayB0byB0aGUgaW5pdGlhdGluZyBwb2ludHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9MzI1ND1pbnQgZXh0NF9mb3JjZV9zaHV0ZG93bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgZmxhZ3MpO1xuLS1cbmZzL2V4dDQvZXh0NC5oLTMyNTYtLyogbWlncmF0ZS5jICovXG5mcy9leHQ0L2V4dDQuaDozMjU3OmV4dGVybiBpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKik7XG5mcy9leHQ0L2V4dDQuaC0zMjU4LWV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbi0tXG5mcy9leHQ0L2lvY3RsLmM9NTkwPXN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvaW9jdGwuYy03MDUtXHRcdGlmIChmbGFncyBcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKVxuZnMvZXh0NC9pb2N0bC5jOjcwNjpcdFx0XHRlcnIgPSBleHQ0X2V4dF9taWdyYXRlKGlub2RlKTtcbmZzL2V4dDQvaW9jdGwuYy03MDctXHRcdGVsc2Vcbi0tXG5mcy9leHQ0L2lvY3RsLmM9MTUzOD1zdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbmZzL2V4dDQvaW9jdGwuYy0xNzAxLVx0XHRpbm9kZV9sb2NrKChpbm9kZSkpO1xuZnMvZXh0NC9pb2N0bC5jOjE3MDI6XHRcdGVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpO1xuZnMvZXh0NC9pb2N0bC5jLTE3MDMtXHRcdGlub2RlX3VubG9jaygoaW5vZGUpKTtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0zOTQ9c3RhdGljIGludCBmcmVlX2V4dF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQxMy1cbmZzL2V4dDQvbWlncmF0ZS5jOjQxNDppbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9taWdyYXRlLmMtNDE1LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzA5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24gQ2FsbCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGV4dDRfZXh0X21pZ3JhdGVgIGlzIGJlaW5nIHV0aWxpemVkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBJJiMzOTt2ZSBub3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZnJvbSB0d28gc3BlY2lmaWMgbG9jYXRpb25zLiBUaGUgZmlyc3QgaXMgd2l0aGluIGBleHQ0X2lvY3RsX3NldGZsYWdzYCwgc3BlY2lmaWNhbGx5IHdoZW4gdGhlIGBGU19JT0NfU0VURkxBR1NgIGlvY3RsIGlzIHVzZWQgdG8gc2V0IHRoZSBgRVhUNF9FWFRFTlRTX0ZMYCBmbGFnLiBNYWtlcyBzZW5zZTsgdGhhdCYjMzk7cyB3aGVuIHdlJiMzOTtkIGV4cGVjdCBhbiBleHRlbnQgbWlncmF0aW9uIHRvIHBvdGVudGlhbGx5IG9jY3VyIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgZmlsZXN5c3RlbSYjMzk7cyBiZWhhdmlvci4gVGhlIHNlY29uZCBwb2ludCBvZiBjYWxsIGlzIGBFWFQ0X0lPQ19NSUdSQVRFYCwgd2hpY2ggaXMgYW5vdGhlciBpb2N0bCwgbGlrZWx5IGEgZGlyZWN0IG1pZ3JhdGlvbiByZXF1ZXN0LgoKVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSBjb250ZXh0LCBteSBuZXh0IG1vdmUgaXMgdG8gZGl2ZSBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGFyb3VuZCBsaW5lIDE3MDAgb2YgdGhhdCBmaWxlLiBUaGlzIHNob3VsZCBnaXZlIG1lIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBoZWxwIG1lIGRldGVybWluZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGlvY3RsIGNhbGxzLCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBiYWNrZ3JvdW5kIHRvIGZ1bGx5IGFuYWx5emUgaG93IHRoZXNlIG1pZ3JhdGlvbnMgYXJlIGJlaW5nIHRyaWdnZXJlZC4gSXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmb3JtIGEgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIHdvcmtzIGFuZCB0aGUgbG9naWMgYmVoaW5kIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY5NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjk1Olx0XHRcdC8qXG4xNjk2Olx0XHRcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxuMTY5NzpcdFx0XHQgKiBSZWFkIHN0aWxsIGdvZXMgdGhyb3VnaC4gV2UgdGFrZSBpX2RhdGFfc2VtIGluXG4xNjk4Olx0XHRcdCAqIGV4dDRfZXh0X3N3YXBfaW5vZGVfZGF0YSBiZWZvcmUgd2Ugc3dpdGNoIHRoZVxuMTY5OTpcdFx0XHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxuMTcwMDpcdFx0XHQgKi9cbjE3MDE6XHRcdFx0aW5vZGVfbG9jaygoaW5vZGUpKTtcbjE3MDI6XHRcdFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XG4xNzAzOlx0XHRcdGlub2RlX3VubG9jaygoaW5vZGUpKTtcbjE3MDQ6XHRcdFx0bW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTtcbjE3MDU6XHRcdFx0cmV0dXJuIGVycjtcbjE3MDY6XHRcdH1cbjE3MDc6XHRcbjE3MDg6XHRcdGNhc2UgRVhUNF9JT0NfQUxMT0NfREFfQkxLUzpcbjE3MDk6XHRcdHtcbjE3MTA6XHRcdFx0aW50IGVycjtcbjE3MTE6XHRcdFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXG4xNzEyOlx0XHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4xNzEzOlx0XG4xNzE0Olx0XHRcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTk4OQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkVYVDRfSU9DX01JR1JBVEUgRGVlcCBEaXZlKioKCkFscmlnaHQsIHNvIEkmIzM5O20gZm9jdXNpbmcgaW4gb24gYEVYVDRfSU9DX01JR1JBVEVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgbWVjaGFuaWNzLCBzbyBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIGNvZGUuIExpbmUgMTY5MCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50LCBidXQgSSYjMzk7bGwgcGxheSBpdCBzYWZlIGFuZCBzY29wZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dCBmb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZy4gSSYjMzk7bGwgdGFrZSBhIGxvb2sgYXQgdGhlIGNvZGUgYmxvY2sgc3Bhbm5pbmcgbGluZXMgMTY4MCB0aHJvdWdoIDE3MDAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBncmFzcCB0aGUgaW50ZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHNwZWNpZmljIGZlYXR1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjgwOlx0XHRcdFx0XHRzaXplb2YoaW5wdXQpKSlcbjE2ODE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjE2ODI6XHRcbjE2ODM6XHRcdFx0cmV0dXJuIGV4dDRfaW9jdGxfZ3JvdXBfYWRkKGZpbHAsIFx1MDAyNmlucHV0KTtcbjE2ODQ6XHRcdH1cbjE2ODU6XHRcbjE2ODY6XHRcdGNhc2UgRVhUNF9JT0NfTUlHUkFURTpcbjE2ODc6XHRcdHtcbjE2ODg6XHRcdFx0aW50IGVycjtcbjE2ODk6XHRcdFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXG4xNjkwOlx0XHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4xNjkxOlx0XG4xNjkyOlx0XHRcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XG4xNjkzOlx0XHRcdGlmIChlcnIpXG4xNjk0Olx0XHRcdFx0cmV0dXJuIGVycjtcbjE2OTU6XHRcdFx0LypcbjE2OTY6XHRcdFx0ICogaW5vZGVfbXV0ZXggcHJldmVudCB3cml0ZSBhbmQgdHJ1bmNhdGUgb24gdGhlIGZpbGUuXG4xNjk3Olx0XHRcdCAqIFJlYWQgc3RpbGwgZ29lcyB0aHJvdWdoLiBXZSB0YWtlIGlfZGF0YV9zZW0gaW5cbjE2OTg6XHRcdFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXG4xNjk5Olx0XHRcdCAqIGlub2RlIGZvcm1hdCB0byBwcmV2ZW50IHJlYWQuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0ODAKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA4NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIEVYVDQgTWlncmF0aW9uIExvZ2ljKioKCk9rYXksIHNvIGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgY2FuIHRyaWdnZXIgdGhlIGBleHQ0X2V4dF9taWdyYXRlKClgIGZ1bmN0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGlzIG1pZ3JhdGlvbiwgc28gbGV0JiMzOTtzIGNoZWNrIG91dCBgZnMvZXh0NC9taWdyYXRlLmNgLiBJIG5lZWQgdG8gZmlndXJlIG91dCAqd2h5KiB0aGlzIGNvbW1pdCB3YXMgbWFkZSBpbiB0aGUgZmlyc3QgcGxhY2UsIGFuZCB3aGF0IHByb2JsZW0gaXQmIzM5O3MgYWRkcmVzc2luZy4gTXkgcHJpbWFyeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSAqZG9lcyouCgpJJiMzOTtsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSBhcm91bmQgYGV4dDRfZXh0X21pZ3JhdGVgIHdpdGhpbiB0aGF0IGZpbGUuIEkgYWxzbyB3YW50IHRvIHNlZSB3aG8gY2FsbHMgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgLCBhbmQgaG93IHRoYXQgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggZXh0ZW50cywgdGhpcyB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGNsdWVzIHRvIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbSBhbmQgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBvZiB0aGlzIG1pZ3JhdGlvbiBwcm9jZXNzLiBUaGlzIHdpbGwgaGVscCBtZSBidWlsZCBhIGdvb2QgbWVudGFsIG1vZGVsIG9mIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDEwOlx0XHR9XG4gNDExOlx0XHRyZXR1cm4gcmV0dmFsO1xuIDQxMjpcdH1cbiA0MTM6XHRcbiA0MTQ6XHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDQxNTpcdHtcbiA0MTY6XHRcdGhhbmRsZV90ICpoYW5kbGU7XG4gNDE3Olx0XHRpbnQgcmV0dmFsID0gMCwgaTtcbiA0MTg6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDQxOTpcdFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7XG4gNDIwOlx0XHRzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7XG4gNDIxOlx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XG4gNDIyOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzO1xuIDQyMzpcdFx0X191MzIgZ29hbCwgdG1wX2NzdW1fc2VlZDtcbiA0MjQ6XHRcdHVpZF90IG93bmVyWzJdO1xuIDQyNTpcdFx0aW50IGFsbG9jX2N0eDtcbiA0MjY6XHRcbiA0Mjc6XHRcdC8qXG4gNDI4Olx0XHQgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZVxuIDQyOTpcdFx0ICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC5cbiA0MzA6XHRcdCAqL1xuIDQzMTpcdFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXHUwMDNlaV9zYikgfHxcbiA0MzI6XHRcdCAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSB8fFxuIDQzMzpcdFx0ICAgIGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpZiAoU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpIFx1MDAyNlx1MDAyNiBpbm9kZS1cdTAwM2VpX2Jsb2NrcyA9PSAwKVxuIDQzNzpcdFx0XHQvKlxuIDQzODpcdFx0XHQgKiBkb24mIzM5O3QgbWlncmF0ZSBmYXN0IHN5bWxpbmtcbiA0Mzk6XHRcdFx0ICovXG4gNDQwOlx0XHRcdHJldHVybiByZXR2YWw7XG4gNDQxOlx0XG4gNDQyOlx0XHRhbGxvY19jdHggPSBleHQ0X3dyaXRlcGFnZXNfZG93bl93cml0ZShpbm9kZS1cdTAwM2VpX3NiKTtcbiA0NDM6XHRcbiA0NDQ6XHRcdC8qXG4gNDQ1Olx0XHQgKiBXb3JzdCBjYXNlIHdlIGNhbiB0b3VjaCB0aGUgYWxsb2NhdGlvbiBiaXRtYXBzIGFuZCBhIGJsb2NrXG4gNDQ2Olx0XHQgKiBncm91cCBkZXNjcmlwdG9yIGJsb2NrLiAgV2UgZG8gbmVlZCB0byB3b3JyeSBhYm91dFxuIDQ0NzpcdFx0ICogY3JlZGl0cyBmb3IgbW9kaWZ5aW5nIHRoZSBxdW90YSBpbm9kZS5cbiA0NDg6XHRcdCAqL1xuIDQ0OTpcdFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX01JR1JBVEUsXG4gNDUwOlx0XHRcdDMgJiM0MzsgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLVx1MDAzZWlfc2IpKTtcbiA0NTE6XHRcbiA0NTI6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDQ1MzpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNDU0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NTU6XHRcdH1cbiA0NTY6XHRcdC8qXG4gNDU3Olx0XHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUmIzM5O3MgYmxvY2sgbWFwcGluZyBsYXlvdXRcbiA0NTg6XHRcdCAqIChpbmRpcmVjdCB0byBleHRlbnRzKSBhbmQgaXMgbm90IHRyYWNrZWQgaW4gdGhlIGZhc3QgY29tbWl0XG4gNDU5Olx0XHQgKiBsb2csIHNvIGRpc2FibGUgZmFzdCBjb21taXRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuIDQ2MDpcdFx0ICovXG4gNDYxOlx0XHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShpbm9kZS1cdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xuIDQ2MjpcdFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXHUwMDNlaV9pbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgKlxuIDQ2MzpcdFx0XHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXHUwMDNlaV9zYikpICYjNDM7IDE7XG4gNDY0Olx0XHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xuIDQ2NTpcdFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcbiA0NjY6XHRcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCksXG4gNDY3Olx0XHRcdFx0XHQgICBTX0lGUkVHLCBOVUxMLCBnb2FsLCBvd25lciwgMCk7XG4gNDY4Olx0XHRpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHtcbiA0Njk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xuIDQ3MDpcdFx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDQ3MTpcdFx0XHR0bXBfaW5vZGUgPSBOVUxMO1xuIDQ3MjpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gNDczOlx0XHR9XG4gNDc0Olx0XHQvKlxuIDQ3NTpcdFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJiMzOTtpbm9kZSYjMzk7KS4gIFRoaXNcbiA0NzY6XHRcdCAqIGlzIHNvIHRoYXQgdGhlIG1ldGFkYXRhIGJsb2NrcyB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgY2hlY2tzdW0gYWZ0ZXJcbiA0Nzc6XHRcdCAqIHRoZSBtaWdyYXRpb24uXG4gNDc4Olx0XHQgKi9cbiA0Nzk6XHRcdGVpID0gRVhUNF9JKGlub2RlKTtcbiA0ODA6XHRcdHRtcF9jc3VtX3NlZWQgPSBFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0ODE6XHRcdEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkID0gZWktXHUwMDNlaV9jc3VtX3NlZWQ7XG4gNDgyOlx0XHRpX3NpemVfd3JpdGUodG1wX2lub2RlLCBpX3NpemVfcmVhZChpbm9kZSkpO1xuIDQ4MzpcdFx0LypcbiA0ODQ6XHRcdCAqIFNldCB0aGUgaV9ubGluayB0byB6ZXJvIHNvIGl0IHdpbGwgYmUgZGVsZXRlZCBsYXRlclxuIDQ4NTpcdFx0ICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS5cbiA0ODY6XHRcdCAqL1xuIDQ4NzpcdFx0Y2xlYXJfbmxpbmsodG1wX2lub2RlKTtcbiA0ODg6XHRcbiA0ODk6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNDkwOlx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDQ5MTpcdFxuIDQ5MjpcdFx0LypcbiA0OTM6XHRcdCAqIHN0YXJ0IHdpdGggb25lIGNyZWRpdCBhY2NvdW50ZWQgZm9yXG4gNDk0Olx0XHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cbiA0OTU6XHRcdCAqXG4gNDk2Olx0XHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxuIDQ5NzpcdFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXG4gNDk4Olx0XHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxuIDQ5OTpcdFx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNDgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgb2YgYGV4dDRfZXh0X21pZ3JhdGVgIGZyb20gNTAwIHRvIDYwMDoKCioqQW5hbHl6aW5nIGV4dDRfZXh0X21pZ3JhdGU6IExpbmVzIDUwMC02MDAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkmIzM5O20gZm9jdXNpbmcgb24gbGluZXMgNTAwLTYwMCBpbiBgZXh0NF9leHRfbWlncmF0ZWAuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgc2VjdGlvbiBpcyBwcm9iYWJseSBkZWFsaW5nIHdpdGggdGhlIGludHJpY2F0ZSBwcm9jZXNzIG9mIGFjdHVhbGx5ICptb3ZpbmcqIGRhdGEgYmxvY2tzIGR1cmluZyBhbiBleHRlbnQtYmFzZWQgbWlncmF0aW9uLCBvciwgaWYgbm90IG1vdmluZywgc2V0dGluZyB1cCB0aGUgbWFwcGluZyBzbyB0aGF0IG1vdmluZyBjYW4gaGFwcGVuLiBHaXZlbiB0aGUgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24mIzM5O3MgbmFtZSwgdGhhdCYjMzk7cyB3aGF0IEkmIzM5O2QgZXhwZWN0LiBJJiMzOTtsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGRldGFpbHMgYXJvdW5kIGJsb2NrIGFsbG9jYXRpb24sIHRoZSBoYW5kbGluZyBvZiBpbmRpcmVjdCBibG9ja3MgKGVzcGVjaWFsbHkgaWYgdGhlIG1pZ3JhdGlvbiBpbnZvbHZlcyBhIGZpbGUgdGhhdCBoYXMgZ3Jvd24gYmV5b25kIGl0cyBpbml0aWFsIGxheW91dCksIGFuZCBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgZXJyb3ItaGFuZGxpbmcgdGhhdCBtaWdodCBjb21lIGludG8gcGxheSBkdXJpbmcgdGhpcyBjcml0aWNhbCBvcGVyYXRpb24uIEFyZSB0aGVyZSBjaGVja3MgZm9yIGRhdGEgY29uc2lzdGVuY3k/IFdoYXQgYWJvdXQgam91cm5hbGluZyBjb25jZXJucz8gSSYjMzk7bSBjdXJpb3VzIHRvIHNlZSBob3cgdGhlIHN5c3RlbSBlbnN1cmVzIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZCBjb3JyZWN0bHksIGVzcGVjaWFsbHkgaW4gdGhlIGZhY2Ugb2YgcG9zc2libGUgc3lzdGVtIGludGVycnVwdGlvbnMuIEkmIzM5O20gZ29pbmcgdG8gYmUgbG9va2luZyBmb3IgY2x1ZXMgb24gaG93IHRoZSBleHRlbnQgdHJlZSBpcyBtb2RpZmllZCB0aHJvdWdob3V0IHRoaXMgb3BlcmF0aW9uLiBJJiMzOTttIGV4cGVjdGluZyBzb21lIGtpbmQgb2YgbG9vcCBpdGVyYXRpb24sIHByb2JhYmx5IG9uIGV4dGVudHMsIHdpdGggZGV0YWlsZWQgc3RlcHMgdG8gbWFpbnRhaW4gZGF0YSBpbnRlZ3JpdHkgYW5kIGNvbnNpc3RlbmN5LiBJIGFsc28gc3VzcGVjdCB0aGVyZSB3aWxsIGJlIHNvbWUgY2hlY2tzIG9yIGludGVyYWN0aW9ucyByZWxhdGVkIHRvIG1ldGFkYXRhIHVwZGF0ZXMsIHNpbmNlIHdlJiMzOTtyZSByZWFycmFuZ2luZyBibG9ja3MuIEZpbmFsbHksIEkmIzM5O20gZXhwZWN0aW5nIHNvbWUgbGV2ZWwgb2YgY29tcGxleGl0eS4gRXh0ZW50IG1pZ3JhdGlvbiBpcyBhIHNvcGhpc3RpY2F0ZWQgcHJvY2VzcywgYW5kIHRoZSBjb3JlIG9mIHRoZSB3b3JrLCB0aGF0JiMzOTtzIHdoeSB0aGVzZSBsaW5lcyBhcmUgaW1wb3J0YW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTAwOlx0XHQvKlxuIDUwMTpcdFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xuIDUwMjpcdFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcbiA1MDM6XHRcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxuIDUwNDpcdFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxuIDUwNTpcdFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xuIDUwNjpcdFx0ICogYWxsb2NhdGlvbi5cbiA1MDc6XHRcdCAqL1xuIDUwODpcdFx0ZG93bl9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG4gNTA5Olx0XHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XG4gNTEwOlx0XHR1cF9yZWFkKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiA1MTE6XHRcbiA1MTI6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcbiA1MTM6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDUxNDpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNTE1Olx0XHRcdGdvdG8gb3V0X3RtcF9pbm9kZTtcbiA1MTY6XHRcdH1cbiA1MTc6XHRcbiA1MTg6XHRcdGlfZGF0YSA9IGVpLVx1MDAzZWlfZGF0YTtcbiA1MTk6XHRcdG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XG4gNTIwOlx0XG4gNTIxOlx0XHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXG4gNTIyOlx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gNTIzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFWFQ0X05ESVJfQkxPQ0tTOyBpJiM0MzsmIzQzOykge1xuIDUyNDpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gNTI1Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MjY6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBcdTAwMjZsYik7XG4gNTI3Olx0XHRcdFx0aWYgKHJldHZhbClcbiA1Mjg6XHRcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1Mjk6XHRcdFx0fSBlbHNlXG4gNTMwOlx0XHRcdFx0bGIuY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gNTMxOlx0XHR9XG4gNTMyOlx0XHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xuIDUzMzpcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MzQ6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcdTAwMjZsYik7XG4gNTM1Olx0XHRcdGlmIChyZXR2YWwpXG4gNTM2Olx0XHRcdFx0Z290byBlcnJfb3V0O1xuIDUzNzpcdFx0fSBlbHNlXG4gNTM4Olx0XHRcdGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDUzOTpcdFx0aWYgKGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSB7XG4gNTQwOlx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDE6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0MjpcdFx0XHRpZiAocmV0dmFsKVxuIDU0MzpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NDQ6XHRcdH0gZWxzZVxuIDU0NTpcdFx0XHRsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDU0NjpcdFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XG4gNTQ3Olx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDg6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0OTpcdFx0XHRpZiAocmV0dmFsKVxuIDU1MDpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NTE6XHRcdH1cbiA1NTI6XHRcdC8qXG4gNTUzOlx0XHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcbiA1NTQ6XHRcdCAqL1xuIDU1NTpcdFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcdTAwMjZsYik7XG4gNTU2Olx0ZXJyX291dDpcbiA1NTc6XHRcdGlmIChyZXR2YWwpXG4gNTU4Olx0XHRcdC8qXG4gNTU5Olx0XHRcdCAqIEZhaWx1cmUgY2FzZSBkZWxldGUgdGhlIGV4dGVudCBpbmZvcm1hdGlvbiB3aXRoIHRoZVxuIDU2MDpcdFx0XHQgKiB0bXBfaW5vZGVcbiA1NjE6XHRcdFx0ICovXG4gNTYyOlx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NjM6XHRcdGVsc2Uge1xuIDU2NDpcdFx0XHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcbiA1NjU6XHRcdFx0aWYgKHJldHZhbClcbiA1NjY6XHRcdFx0XHQvKlxuIDU2NzpcdFx0XHRcdCAqIGlmIHdlIGZhaWwgdG8gc3dhcCBpbm9kZSBkYXRhIGZyZWUgdGhlIGV4dGVudFxuIDU2ODpcdFx0XHRcdCAqIGRldGFpbHMgb2YgdGhlIHRtcCBpbm9kZVxuIDU2OTpcdFx0XHRcdCAqL1xuIDU3MDpcdFx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NzE6XHRcdH1cbiA1NzI6XHRcbiA1NzM6XHRcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuIDU3NDpcdFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4gNTc1Olx0XHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuIDU3NjpcdFx0XHRnb3RvIG91dF9zdG9wO1xuIDU3NzpcdFx0LypcbiA1Nzg6XHRcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cbiA1Nzk6XHRcdCAqL1xuIDU4MDpcdFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XG4gNTgxOlx0XG4gNTgyOlx0XHQvKlxuIDU4MzpcdFx0ICogc2V0IHRoZSAgaV9ibG9ja3MgY291bnQgdG8gemVyb1xuIDU4NDpcdFx0ICogc28gdGhhdCB0aGUgZXh0NF9ldmljdF9pbm9kZSgpIGRvZXMgdGhlXG4gNTg1Olx0XHQgKiByaWdodCBqb2JcbiA1ODY6XHRcdCAqXG4gNTg3Olx0XHQgKiBXZSBkb24mIzM5O3QgbmVlZCB0byB0YWtlIHRoZSBpX2xvY2sgYmVjYXVzZVxuIDU4ODpcdFx0ICogdGhlIGlub2RlIGlzIG5vdCB2aXNpYmxlIHRvIHVzZXIgc3BhY2UuXG4gNTg5Olx0XHQgKi9cbiA1OTA6XHRcdHRtcF9pbm9kZS1cdTAwM2VpX2Jsb2NrcyA9IDA7XG4gNTkxOlx0XHRFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XG4gNTkyOlx0XG4gNTkzOlx0XHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cbiA1OTQ6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNTk1Olx0b3V0X3N0b3A6XG4gNTk2Olx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDU5NzpcdG91dF90bXBfaW5vZGU6XG4gNTk4Olx0XHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XG4gNTk5Olx0b3V0X3VubG9jazpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAyMzMKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAzNjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGluIEV4dDQgQmxvY2sgTWFuYWdlbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZSBzbmlwcGV0LiBNeSBpbml0aWFsIHRob3VnaHQgaXMsICYjMzQ7V2hhdCYjMzk7cyB0aGUgc2l0dWF0aW9uIGhlcmU/JiMzNDsgSSYjMzk7bSBsb29raW5nIGF0IGxpbmVzIDUzOCBhbmQgNTQ1LCBzcGVjaWZpY2FsbHkgdGhpczogYGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO2AgYW5kIGBsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO2AuIEltbWVkaWF0ZWx5LCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O1dhaXQgYSBtaW51dGUsIHdoYXQgaGFwcGVucyBpZiBgbGIuY3Vycl9ibG9ja2Agb3ZlcmZsb3dzIG9yIGJlY29tZXMgbGFyZ2VyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYD8mIzM0OyBUaGF0IGNvdWxkIGNhdXNlIHNvbWUgc2VyaW91cyBwcm9ibGVtcyB3aXRoIGJsb2NrIGFsbG9jYXRpb24uCgpBaCwgaG9sZCBvbiEgVGhlcmUmIzM5O3MgYSByZWxldmFudCBwYXRjaCBoZXJlLiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZToKCmBgYGMKc3RydWN0IG1pZ3JhdGVfc3RydWN0IHsKLQlleHQ0X2xibGtfdCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jazsKJiM0MzsJdTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwogCWV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrOwogfTsKIApAQCAtNjYsNiAmIzQzOzY2LDEwIEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpCiB7CiAJaW50IHJldHZhbDsKJiM0MzsKJiM0MzsJaWYgKGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwogCS8qCiAJICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpCiAJICovCmBgYAoKUmlnaHQsIHRoZXkmIzM5O3ZlIGFjdHVhbGx5IGFkZHJlc3NlZCB0aGlzIHdpdGggYSBjaGVjayBub3c6IGBpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgLiBUaGF0JiMzOTtzIGdvb2Q7IGEgc2FuaXR5IGNoZWNrIGlzIGltcGxlbWVudGVkLCBidXQgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqIG9mIHRoaXMuCgpUaGVuIGl0IGhpdHMgbWUhIEkmIzM5O20gcmVtZW1iZXJpbmcgdGhhdCBgZXh0NF9sYmxrX3RgIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gVGhlIHBvdGVudGlhbCBmb3Igb3ZlcmZsb3cgaXMgZGVmaW5pdGVseSB0aGVyZSwgZXNwZWNpYWxseSBpbiBjYXNlcyB3aXRoIGRlZXBseSBpbmRpcmVjdC1tYXBwZWQgZmlsZXMgYW5kIGEgbGFyZ2UgYG1heF9lbnRyaWVzYC4gSW4gZmFjdCwgYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgY291bGQgcXVpY2tseSBleGNlZWQgdGhlIHJhbmdlIG9mIGEgMzItYml0IGludGVnZXIuIFRoYXQgaXMgdGhlIHZ1bG5lcmFiaWxpdHkuIEkgc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNvZGUgaW4gbW9yZSBkZXRhaWwuCgpOb3csIEkmIzM5O20gYXNraW5nIG15c2VsZi4uLiAmIzM0O1doYXQgKmlzKiBgRVhUX01BWF9CTE9DS1NgPyYjMzQ7IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbGltaXQgdG8gZnVsbHkgZ3Jhc3AgdGhlIGNvbnRleHQuIEkmIzM5O2xsIHNlYXJjaCBmb3IgaXRzIGRlZmluaXRpb24gdG8gY2xhcmlmeSB0aGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYVF9NQVhfQkxPQ0tTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zODk2PXN0cnVjdCBleHQ0X2V4dGVudDtcbi0tXG5mcy9leHQ0L2V4dDQuaC0zOTAxLSAqL1xuZnMvZXh0NC9leHQ0Lmg6MzkwMjojZGVmaW5lIEVYVF9NQVhfQkxPQ0tTXHQweGZmZmZmZmZmXG5mcy9leHQ0L2V4dDQuaC0zOTAzLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE1MzE9c3RhdGljIGludCBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjMzLSAqIGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrOlxuZnMvZXh0NC9leHRlbnRzLmM6MTYzNDogKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLUy5cbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzUtICogTk9URTogaXQgY29uc2lkZXJzIGJsb2NrIG51bWJlciBmcm9tIGluZGV4IGVudHJ5IGFzXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTY0MD1leHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ3LVx0aWYgKGRlcHRoID09IDAgXHUwMDI2XHUwMDI2IHBhdGgtXHUwMDNlcF9leHQgPT0gTlVMTClcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NDg6XHRcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDktXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTY2NC1cbmZzL2V4dDQvZXh0ZW50cy5jOjE2NjU6XHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0xNjY2LX1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY5LSAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazpcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NzA6ICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DS1NcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NzEtICovXG5mcy9leHQ0L2V4dGVudHMuYz0xNjcyPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTY4MC1cdGlmIChkZXB0aCA9PSAwKVxuZnMvZXh0NC9leHRlbnRzLmM6MTY4MTpcdFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY4Mi1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjkzLVxuZnMvZXh0NC9leHRlbnRzLmM6MTY5NDpcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTUtfVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5NDI9c3RhdGljIHVuc2lnbmVkIGludCBleHQ0X2V4dF9jaGVja19vdmVybGFwKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xOTYzLVx0XHRiMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MTk2NDpcdFx0aWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtMTk2NS1cdFx0XHRnb3RvIG91dDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcwLVx0aWYgKGIxICYjNDM7IGxlbjEgXHUwMDNjIGIxKSB7XG5mcy9leHQ0L2V4dGVudHMuYzoxOTcxOlx0XHRsZW4xID0gRVhUX01BWF9CTE9DS1MgLSBiMTtcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzItXHRcdG5ld2V4dC1cdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4xKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMTAyLVx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjIxMDM6XHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTA0LVx0aWYgKGxlMzJfdG9fY3B1KG5ld2V4dC1cdTAwM2VlZV9ibG9jaykgXHUwMDNlIGxlMzJfdG9fY3B1KGZleC1cdTAwM2VlZV9ibG9jaykpXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA1LVx0XHRuZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MjEwNjpcdGlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yMTA3LVx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqbnBhdGg7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjI4MD1zdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfZmluZF9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjI5MS1cdFx0KmxibGsgPSAwO1xuZnMvZXh0NC9leHRlbnRzLmM6MjI5MjpcdFx0bGVuID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0yMjkzLVx0fSBlbHNlIGlmICgqbGJsayBcdTAwM2MgbGUzMl90b19jcHUoZXgtXHUwMDNlZWVfYmxvY2spKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MjYyMj1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjc2MS1cdFx0aWYgKG51bSA9PSAwKSB7XG5mcy9leHQ0L2V4dGVudHMuYzoyNzYyOlx0XHRcdGlmIChlbmQgIT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yNzYzLVx0XHRcdFx0Lypcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yODQ1PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mjg3OTpcdGlmIChlbmQgXHUwMDNjIEVYVF9NQVhfQkxPQ0tTIC0gMSkge1xuZnMvZXh0NC9leHRlbnRzLmMtMjg4MC1cdFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz00NTUxPWludCBleHQ0X2V4dF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzAtXHRcdFx0XHUwMDNlXHUwMDNlIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzE6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XG5mcy9leHQ0L2V4dGVudHMuYy00NTcyLVxuZnMvZXh0NC9leHRlbnRzLmMtNDU3My1yZXRyeV9yZW1vdmVfc3BhY2U6XG5mcy9leHQ0L2V4dGVudHMuYzo0NTc0Olx0ZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpO1xuZnMvZXh0NC9leHRlbnRzLmMtNDU3NS1cdGlmIChlcnIgPT0gLUVOT01FTSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTUzNDI9aW50IGV4dDRfZ2V0X2VzX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTM3Ny1cdGxhc3RfYmxrID0gKHN0YXJ0ICYjNDM7IGxlbiAtIDEpIFx1MDAzZVx1MDAzZSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplX2JpdHM7XG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc4Olx0aWYgKGxhc3RfYmxrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc5Olx0XHRsYXN0X2JsayA9IEVYVF9NQVhfQkxPQ0tTLTE7XG5mcy9leHQ0L2V4dGVudHMuYy01MzgwLVx0bGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgJiM0MzsgMTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NDk0PWV4dDRfZXh0X3NoaWZ0X2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTAxLVx0ZXh0NF9sYmxrX3Qgc3RvcCwgKml0ZXJhdG9yLCBleF9zdGFydCwgZXhfZW5kO1xuZnMvZXh0NC9leHRlbnRzLmM6NTUwMjpcdGV4dDRfbGJsa190IHRtcCA9IEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtNTUwMy1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDQtXHQvKiBMZXQgcGF0aCBwb2ludCB0byB0aGUgbGFzdCBleHRlbnQgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjU1MDU6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNi1cdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTUxOS1cdCogYWNjb21tb2RhdGUgdGhlIHNoaWZ0LiAgRm9yIHJpZ2h0IHNoaWZ0cywgbWFrZSBzdXJlIHRoZSBsYXN0IGV4dGVudFxuZnMvZXh0NC9leHRlbnRzLmM6NTUyMDpcdCogd29uJiMzOTt0IGJlIHNoaWZ0ZWQgYmV5b25kIEVYVF9NQVhfQkxPQ0tTLlxuZnMvZXh0NC9leHRlbnRzLmMtNTUyMS1cdCovXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU0My1cdH0gZWxzZSB7XG5mcy9leHQ0L2V4dGVudHMuYzo1NTQ0Olx0XHRpZiAoc2hpZnQgXHUwMDNlIEVYVF9NQVhfQkxPQ0tTIC1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDUtXHRcdCAgICAoc3RvcCAmIzQzOyBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleHRlbnQpKSkge1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjItXG5mcy9leHQ0L2V4dGVudHMuYzo1NTYzOlx0aWYgKHRtcCAhPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjQtXHRcdCppdGVyYXRvciA9IHRtcDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01NjM3PXN0YXRpYyBpbnQgZXh0NF9jb2xsYXBzZV9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01Njk1LVx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjU2OTY6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIEVYVF9NQVhfQkxPQ0tTIC0gc3RhcnRfbGJsayk7XG5mcy9leHQ0L2V4dGVudHMuYy01Njk3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU3Mzg9c3RhdGljIGludCBleHQ0X2luc2VydF9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01ODMyLVx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTgzMzpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzQtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTg3NT1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01OTMxLVx0XHRcdC8qIERvIHdlIGhhdmUgc29tZXRoaW5nIHRvIHN3YXAgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjU5MzI6XHRcdFx0aWYgKG5leHQxID09IEVYVF9NQVhfQkxPQ0tTIHx8IG5leHQyID09IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMy1cdFx0XHRcdGdvdG8gZXJyb3V0O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYyNTI9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjEtXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NjI2MjpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy02MjYzLVx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTYzMzk9aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjM1MC1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MzUxOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNTItXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTU5MT1zdGF0aWMgaW50IGV4dDRfZXNfY2FuX2JlX21lcmdlZChzdHJ1Y3QgZXh0ZW50X3N0YXR1cyAqZXMxLFxuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy01OTYtXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6NTk3Olx0aWYgKCgoX191NjQpIGVzMS1cdTAwM2Vlc19sZW4pICYjNDM7IGVzMi1cdTAwM2Vlc19sZW4gXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB7XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk4LVx0XHRwcl93YXJuKFwmIzM0O0VTIGFzc2VydGlvbiBmYWlsZWQgd2hlbiBtZXJnaW5nIGV4dGVudHMuIFwmIzM0O1xuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02MDAtXHRcdFx0XCYjMzQ7aXMgYmlnZ2VyIHRoYW4gYWxsb3dlZCBmaWxlIHNpemUgKCVkKVxcblwmIzM0OyxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2MDE6XHRcdFx0ZXMxLVx1MDAzZWVzX2xlbiwgZXMyLVx1MDAzZWVzX2xlbiwgRVhUX01BWF9CTE9DS1MpO1xuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMi1cdFx0V0FSTl9PTigxKTtcbi0tXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9MTk0Mz1zdGF0aWMgaW50IGVzX3JlY2xhaW1fZXh0ZW50cyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSwgaW50ICpucl90b19zY2FuKVxuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU3LVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjE5NTg6XHRpZiAoIWVzX2RvX3JlY2xhaW1fZXh0ZW50cyhlaSwgRVhUX01BWF9CTE9DS1MsIG5yX3RvX3NjYW4sIFx1MDAyNm5yX3NocnVuaykgXHUwMDI2XHUwMDI2XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtMTk1OS1cdCAgICBzdGFydCAhPSAwKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzE3PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzMzUtXHRcdGN1ciA9IDA7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjMzNjpcdFx0ZW5kID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNy1cdFx0aWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSkge1xuLS1cbmZzL2V4dDQvaW5kaXJlY3QuYz0xMTEyPXZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNS1cbmZzL2V4dDQvaW5kaXJlY3QuYzoxMTM2Olx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIGxhc3RfYmxvY2spO1xuZnMvZXh0NC9pbmRpcmVjdC5jLTExMzctXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xODYyPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTE5MDgtXHRcdGlmICghZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSkpXG5mcy9leHQ0L2lubGluZS5jOjE5MDk6XHRcdFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lubGluZS5jLTE5MTAtXG4tLVxuZnMvZXh0NC9pbm9kZS5jPTcwMD1pbnQgZXh0NF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTcyMi1cbmZzL2V4dDQvaW5vZGUuYzo3MjM6XHQvKiBXZSBjYW4gaGFuZGxlIHRoZSBibG9jayBudW1iZXIgbGVzcyB0aGFuIEVYVF9NQVhfQkxPQ0tTICovXG5mcy9leHQ0L2lub2RlLmM6NzI0Olx0aWYgKHVubGlrZWx5KG1hcC1cdTAwM2VtX2xibGsgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykpXG5mcy9leHQ0L2lub2RlLmMtNzI1LVx0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbi0tXG5mcy9leHQ0L2lub2RlLmM9MjE3Mz1zdGF0aWMgaW50IG1wYWdlX3Byb2Nlc3NfcGFnZV9idWZzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQsXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTIxODItXHRpZiAoZXh0NF92ZXJpdHlfaW5fcHJvZ3Jlc3MoaW5vZGUpKVxuZnMvZXh0NC9pbm9kZS5jOjIxODM6XHRcdGJsb2NrcyA9IEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9pbm9kZS5jLTIxODQtXG4tLVxuZnMvZXh0NC9pbm9kZS5jPTYwMDk9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2V4dDQvaW5vZGUuYy02MTcyLVx0XHRcdFx0XHRpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplX2JpdHMsXG5mcy9leHQ0L2lub2RlLmM6NjE3MzpcdFx0XHRcdFx0RVhUX01BWF9CTE9DS1MgLSAxKTtcbmZzL2V4dDQvaW5vZGUuYy02MTc0LVx0XHRcdGVsc2Vcbi0tXG5mcy9leHQ0L2lvY3RsLmM9MzEzPXN0YXRpYyB2b2lkIHN3YXBfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTM0MS1cdHN3YXAoZWkxLVx1MDAzZWlfZGlza3NpemUsIGVpMi1cdTAwM2VpX2Rpc2tzaXplKTtcbmZzL2V4dDQvaW9jdGwuYzozNDI6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUxLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lvY3RsLmM6MzQzOlx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMiwgMCwgRVhUX01BWF9CTE9DS1MpO1xuZnMvZXh0NC9pb2N0bC5jLTM0NC1cbi0tXG5mcy9leHQ0L21iYWxsb2MuYz00NTE5PWV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyxcbi0tXG5mcy9leHQ0L21iYWxsb2MuYy00NjA1LVx0LyogYXZvaWQgdW5uZWNlc3NhcnkgcHJlYWxsb2NhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIGFzc2VydGlvbnMgKi9cbmZzL2V4dDQvbWJhbGxvYy5jOjQ2MDY6XHRpZiAoc3RhcnQgJiM0Mzsgc2l6ZSBcdTAwM2UgRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA3Olx0XHRzaXplID0gRVhUX01BWF9CTE9DS1MgLSBzdGFydDtcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDgtXG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtNjktXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcdGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L21pZ3JhdGUuYy03MS1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmZzL2V4dDQvbW92ZV9leHRlbnQuYz01MTc9c3RhdGljIGludCBtZXh0X2NoZWNrX2FkanVzdF9yYW5nZShzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsXG4tLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzMC1cbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzE6XHRpZiAoKG9yaWdfc3RhcnQgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzI6XHQgICAgKGRvbm9yX3N0YXJ0IFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMzOlx0ICAgICgqbGVuIFx1MDAzZSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzQ6XHQgICAgKGRvbm9yX3N0YXJ0ICYjNDM7ICpsZW4gXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzU6XHQgICAgKG9yaWdfc3RhcnQgJiM0MzsgKmxlbiBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSkgIHtcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzYtXHRcdGV4dDRfZGVidWcoXCYjMzQ7ZXh0NCBtb3ZlIGV4dGVudDogQ2FuJiMzOTt0IGhhbmRsZSBvdmVyIFsldV0gYmxvY2tzIFtpbm86b3JpZyAlbGx1LCBkb25vciAlbGx1XVxcblwmIzM0OyxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1Mzc6XHRcdFx0ICAgRVhUX01BWF9CTE9DS1MsXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTM4LVx0XHRcdCAgIG9yaWdfaW5vZGUtXHUwMDNlaV9pbm8sIGRvbm9yX2lub2RlLVx1MDAzZWlfaW5vKTtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9MTUzOT12b2lkIGV4dDRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L3N1cGVyLmMtMTU2OC1cdHJlbW92ZV9pbm9kZV9oYXNoKGlub2RlKTtcbmZzL2V4dDQvc3VwZXIuYzoxNTY5Olx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L3N1cGVyLmMtMTU3MC1cdGRxdW90X2Ryb3AoaW5vZGUpO1xuLS1cbmZzL2V4dDQvdmVyaXR5LmM9MjcxPXN0YXRpYyBpbnQgZXh0NF9nZXRfdmVyaXR5X2Rlc2NyaXB0b3JfbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L3Zlcml0eS5jLTI5My1cbmZzL2V4dDQvdmVyaXR5LmM6Mjk0Olx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCwgMCk7XG5mcy9leHQ0L3Zlcml0eS5jLTI5NS1cdGlmIChJU19FUlIocGF0aCkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MjU2CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFeHQ0IEJsb2NrIE1pZ3JhdGlvbiBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYmxvY2sgbWlncmF0aW9uIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBhbmQgc29tZXRoaW5nIHNtZWxscyBmaXNoeSB3aXRoIHRoZSBibG9jayBudW1iZXJzLiBUaGUgY29kZSB1c2VzIGBFWFRfTUFYX0JMT0NLU2Agd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBhIGB1MzJgIHZhbHVlICgweGZmZmZmZmZmLCAyXjMyIC0gMSkuIFRoYXQmIzM5O3MgYSBodWdlIG51bWJlciwgYnV0Li4uCgpCZWZvcmUgdGhpcyBjb21taXQsIHRoZSBjcml0aWNhbCB2YXJpYWJsZXMgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdpdGhpbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBzdHJ1Y3Qgd2VyZSBhbHNvIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGlmIEkmIzM5O20gbm90IG1pc3Rha2VuLCBpcyBhbHNvIGEgYHUzMmAuIFRoaXMgaW1tZWRpYXRlbHkgcmFpc2VzIGEgcmVkIGZsYWcuIElmIGJsb2NrIG51bWJlcnMgdGhlbXNlbHZlcyBhcmUgYHUzMmAsIGhvdyBjYW4gdGhleSBwb3NzaWJseSByZXByZXNlbnQgYWxsIHRoZSBibG9ja3MgdXAgdG8gYEVYVF9NQVhfQkxPQ0tTYD8gVGhlcmUgaGFzIHRvIGJlIGFuIGludGVnZXIgb3ZlcmZsb3cgc29tZXdoZXJlLgoKTG9va2luZyBhdCB0aGUgYGV4dDRfZXh0X21pZ3JhdGVgIGZ1bmN0aW9uLCBhbmQgc3BlY2lmaWNhbGx5IHRoaXMgc25pcHBldDoKCmBgYGMKCQltYXhfZW50cmllcyA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSAmZ3Q7Jmd0OyAyOwouLi4KCQlpZiAoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pIHsKCQkJcmV0dmFsID0gdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLAoJCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgJmFtcDtsYik7CgkJCWlmIChyZXR2YWwpCgkJCQlnb3RvIGVycl9vdXQ7CgkJfQpgYGAKCk9rYXksIHRoZSBgbWF4X2VudHJpZXNgIGNhbGN1bGF0aW9uIHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2g6IGJsb2Nrc2l6ZSBkaXZpZGVkIGJ5IDQgKGxpa2VseSBmb3IgYW4gZXh0ZW50IGluZGV4KSwgYnV0IHRoYXQmIzM5O3Mgbm90IHRoZSBjcml0aWNhbCBwb2ludCBoZXJlLiBUaGUgaW1wb3J0YW50IHBhcnQgaXMgdGhlIGNhbGwgdG8gYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIHdpdGggYSBgbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pYCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLCBhbmQgYWxzbyB0aGUgYGxiYCBzdHJ1Y3QuIElmIHRoZSBgbGJgIHN0cnVjdCAoY29udGFpbmluZyBgY3Vycl9ibG9ja2AsIHdoaWNoIGlzIGB1MzJgKSwgaXMgcGFzc2VkIHRvIHRoZSBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYCBmdW5jdGlvbiBhbG9uZyB3aXRoIGEgYHUzMmAgYmxvY2sgbnVtYmVyLCB0aGVuIHdlJiMzOTt2ZSBnb3QgYSBwb3RlbnRpYWwgb3ZlcmZsb3csIHJpZ2h0PyBBbmQgd2UgbmVlZCB0byB0cmFjZSB0aG9zZSBmdW5jdGlvbnMsIGxpa2UgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgc28gb24uIFRoZXkgY291bGQgYmUgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbS4gVGltZSB0byBkaWcgaW4hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEwMTpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTAyOlx0XG4gMTAzOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMDQ6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEwNTpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTA2Olx0XG4gMTA3Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEwODpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTA5Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMTA6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTExOlx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDExMjpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTEzOlx0XHRcdFx0XHRicmVhaztcbiAxMTQ6XHRcdFx0fSBlbHNlIHtcbiAxMTU6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAxMTY6XHRcdFx0fVxuIDExNzpcdFx0fVxuIDExODpcdFx0cHV0X2JoKGJoKTtcbiAxMTk6XHRcdHJldHVybiByZXR2YWw7XG4gMTIwOlx0XG4gMTIxOlx0fVxuIDEyMjpcdFxuIDEyMzpcdHN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gMTI0Olx0XHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbiAxMjU6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIDEyNjpcdHtcbiAxMjc6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gMTI4Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMjk6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuIDEzMDpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTMxOlx0XG4gMTMyOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXHUwMDNlaV9zYiwgcGJsb2NrLCAwKTtcbiAxMzM6XHRcdGlmIChJU19FUlIoYmgpKVxuIDEzNDpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTM1Olx0XG4gMTM2Olx0XHRpX2RhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDEzNzpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTM4Olx0XHRcdGlmIChpX2RhdGFbaV0pIHtcbiAxMzk6XHRcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE0MDpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNDE6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE0MjpcdFx0XHRcdFx0YnJlYWs7XG4gMTQzOlx0XHRcdH0gZWxzZSB7XG4gMTQ0Olx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTQ1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXM7XG4gMTQ2Olx0XHRcdH1cbiAxNDc6XHRcdH1cbiAxNDg6XHRcdHB1dF9iaChiaCk7XG4gMTQ5Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDE1MDpcdFxuIDE1MTpcdH1cbiAxNTI6XHRcbiAxNTM6XHRzdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDE1NDpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTU1Olx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxNTY6XHR7XG4gMTU3Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDE1ODpcdFx0X19sZTMyICppX2RhdGE7XG4gMTU5Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxNjA6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDE2MTpcdFxuIDE2MjpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTYzOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxNjQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDE2NTpcdFxuIDE2NjpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxNjc6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDE2ODpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTY5Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsXG4gMTcwOlx0XHRcdFx0XHRcdFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xuIDE3MTpcdFx0XHRcdGlmIChyZXR2YWwpXG4gMTcyOlx0XHRcdFx0XHRicmVhaztcbiAxNzM6XHRcdFx0fSBlbHNlIHtcbiAxNzQ6XHRcdFx0XHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cbiAxNzU6XHRcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDE3NjpcdFx0XHR9XG4gMTc3Olx0XHR9XG4gMTc4Olx0XHRwdXRfYmgoYmgpO1xuIDE3OTpcdFx0cmV0dXJuIHJldHZhbDtcbiAxODA6XHRcbiAxODE6XHR9XG4gMTgyOlx0XG4gMTgzOlx0c3RhdGljIGludCBmcmVlX2RpbmRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsXG4gMTg0Olx0XHRcdFx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgaV9kYXRhKVxuIDE4NTpcdHtcbiAxODY6XHRcdGludCBpO1xuIDE4NzpcdFx0X19sZTMyICp0bXBfaWRhdGE7XG4gMTg4Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDE4OTpcdFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gMTkwOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxOTE6XHRcdGludCBlcnI7XG4gMTkyOlx0XG4gMTkzOlx0XHRiaCA9IGV4dDRfc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGlfZGF0YSksIDApO1xuIDE5NDpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTk1Olx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxOTY6XHRcbiAxOTc6XHRcdHRtcF9pZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTk4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxOTk6XHRcdFx0aWYgKHRtcF9pZGF0YVtpXSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODU4MgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDc5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiBleHQ0IEZpbGVzeXN0ZW0gRXh0ZW50IE1pZ3JhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgdGhhdCB3aXRoIGEgNEsgYmxvY2sgc2l6ZSwgdGhlIGBtYXhfZW50cmllc2AgaW4gYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgY2FuIGJlIDEwMjQsIGxlYWRpbmcgdG8gYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXNgID0gMSwwNDgsNTc2LiBUaGVuLCBgbGItJmd0O2N1cnJfYmxvY2tgIGNhbiByZWFjaCAxLDA3NCw3OTEsNDM2LCB3aGljaCB3b3JrcyBiZWNhdXNlIGl0IGZpdHMgd2l0aGluIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gQnV0IGhvbGQgb24sIHdoYXQgaGFwcGVucyB3aXRoIGxhcmdlciBibG9jayBzaXplcywgbGlrZSA2NEtCPyBJZiB0aGUgYmxvY2sgc2l6ZSBpcyA2NEtCLCBgbWF4X2VudHJpZXNgIGp1bXBzIHRvIDE2Mzg0LCBhbmQgc3VkZGVubHksIDE2Mzg0IGN1YmVkIGlzICp3YXkqIGJpZ2dlciB0aGFuIGEgMzItYml0IGludGVnZXIhIFRoYXQmIzM5O3MgYSBwb3RlbnRpYWwgd3JhcC1hcm91bmQgd2FpdGluZyB0byBoYXBwZW4uCgpFdmVuIHdpdGggdGhlIDRLIGJsb2NrIHNpemUsIHdoYXQgaWYgd2UgY29uc2lkZXIgYEVYVF9NQVhfQkxPQ0tTYD8gVGhlbiwgSSByZW1lbWJlciB0aGF0IGBFWFRfTUFYX0JMT0NLU2AgaXMgMHhmZmZmZmZmZiAoNCwyOTQsOTY3LDI5NSkuCgpJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSBhIHBhdHRlcm4gaGVyZS4gTGFyZ2UgYmxvY2sgc2l6ZXMgKDE2S0Igb3IgNjRLQiksIGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24sIG9yIGV2ZW4ganVzdCBsYXJnZSBibG9jayBjb3VudHMsIGNvdWxkIHRyaWdnZXIgYW4gb3ZlcmZsb3cgd2hlbiBgY3Vycl9ibG9ja2Agd2FzIGJlaW5nIHRyZWF0ZWQgYXMgYW4gYGV4dDRfbGJsa190YCAod2hpY2ggaXMgYSB1MzIpLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGBjdXJyX2Jsb2NrYCB3cmFwcGluZyBhcm91bmQuIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgY2hlY2tpbmcgZm9yIGBsYi0mZ3Q7Y3Vycl9ibG9jayAmZ3Q7PSBFWFRfTUFYX0JMT0NLU2AsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgZm9yIGV4dGVudC1iYXNlZCBmaWxlcy4gVGhlIGBlZV9ibG9ja2AgZmllbGQgaW4gdGhlIGV4dGVudCBmb3JtYXQgaXMgYSBgX19sZTMyYCBhbmQgYEVYVF9NQVhfQkxPQ0tTYCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGJsb2NrIG51bWJlci4KClNvLCB0aGUgbmV4dCBxdWVzdGlvbiBpcywgaXMgdGhpcyByZWFjaGFibGU/IEhvdyBpcyBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSBjYWxsZWQ/IENhbiB3ZSBleHBsb2l0IHRoaXMgd2l0aCBzeXprYWxsZXI/IExldCYjMzk7cyBjaGVjayBzeXprYWxsZXImIzM5O3Mgc3VwcG9ydCBmb3IgZXh0NCBhbmQgdGhlIGBFWFQ0X0lPQ19NSUdSQVRFYCBvciBgRlNfSU9DX1NFVEZMQUdTYCBpb2N0bHMuCgpJbiBMaW51eCBzeXprYWxsZXIsIGl0IHNlZW1zIGxpa2UgZXh0NCBpbWFnZXMgYXJlIG1vdW50ZWQsIGFuZCBpb2N0bHMgbGlrZSBgRlNfSU9DX1NFVEZMQUdTYCBhbmQgYEVYVDRfSU9DX01JR1JBVEVgIGFyZSB1c2VkLiBHb29kLiBOb3csIHdoYXQgYWJvdXQgcHJpdmlsZWdlcyBmb3IgYEVYVDRfSU9DX01JR1JBVEVgPyBMb29raW5nIGludG8gYGZzL2V4dDQvaW9jdGwuY2AsIEkgc2VlIHRoYXQgYGlub2RlX293bmVyX29yX2NhcGFibGVgIGlzIGNoZWNrZWQuIElmIHRoZSB1c2VyIG93bnMgdGhlIGlub2RlLCB3aGljaCB0aGV5IG5vcm1hbGx5IGRvIHdpdGggdGhlaXIgZmlsZXMsIHRoZXkgaGF2ZSBwZXJtaXNzaW9uISBQZXJmZWN0LiBBbmQgd2hhdCBhYm91dCBgRlNfSU9DX1NFVEZMQUdTYD8gSXQgYXBwZWFycyBgZXh0NF9leHRfbWlncmF0ZWAgaXMgYWxzbyBjYWxsZWQgdGhyb3VnaCB0aGlzIGlvY3RsLCB3aGVuIGEgZmxhZyBpcyBzZXQuIFRoYXQgbWVhbnMgYW4gdW5wcml2aWxlZ2VkIHVzZXIgY2FuIHBvdGVudGlhbGx5IHRyaWdnZXIgdGhpcyB2aWEgdGhlIGBGU19JT0NfU0VURkxBR1NgIGFuZCBgRVhUNF9FWFRFTlRTX0ZMYCBmbGFnLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBpbnRvIHBlcm1pc3Npb25zIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AgdG8gY29uZmlybS4gVGhpcyBpcyBzdGFydGluZyB0byBsb29rIHZlcnkgaW50ZXJlc3RpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9pb2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1OTA6XHRzdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0ZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSxcbiA1OTE6XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKVxuIDU5MjpcdHtcbiA1OTM6XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiA1OTQ6XHRcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xuIDU5NTpcdFx0aW50IGVyciA9IC1FUEVSTSwgbWlncmF0ZSA9IDA7XG4gNTk2Olx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4gNTk3Olx0XHR1bnNpZ25lZCBpbnQgb2xkZmxhZ3MsIG1hc2ssIGk7XG4gNTk4Olx0XHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiA1OTk6XHRcbiA2MDA6XHRcdC8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqL1xuIDYwMTpcdFx0aWYgKGV4dDRfaXNfcXVvdGFfZmlsZShpbm9kZSkpXG4gNjAyOlx0XHRcdGdvdG8gZmxhZ3Nfb3V0O1xuIDYwMzpcdFxuIDYwNDpcdFx0b2xkZmxhZ3MgPSBlaS1cdTAwM2VpX2ZsYWdzO1xuIDYwNTpcdFx0LypcbiA2MDY6XHRcdCAqIFRoZSBKT1VSTkFMX0RBVEEgZmxhZyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5XG4gNjA3Olx0XHQgKiB0aGUgcmVsZXZhbnQgY2FwYWJpbGl0eS5cbiA2MDg6XHRcdCAqL1xuIDYwOTpcdFx0aWYgKChmbGFncyBeIG9sZGZsYWdzKSBcdTAwMjYgKEVYVDRfSk9VUk5BTF9EQVRBX0ZMKSkge1xuIDYxMDpcdFx0XHRpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpXG4gNjExOlx0XHRcdFx0Z290byBmbGFnc19vdXQ7XG4gNjEyOlx0XHR9XG4gNjEzOlx0XG4gNjE0Olx0XHRpZiAoIWRheF9jb21wYXRpYmxlKGlub2RlLCBvbGRmbGFncywgZmxhZ3MpKSB7XG4gNjE1Olx0XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuIDYxNjpcdFx0XHRnb3RvIGZsYWdzX291dDtcbiA2MTc6XHRcdH1cbiA2MTg6XHRcbiA2MTk6XHRcdGlmICgoZmxhZ3MgXiBvbGRmbGFncykgXHUwMDI2IEVYVDRfRVhURU5UU19GTClcbiA2MjA6XHRcdFx0bWlncmF0ZSA9IDE7XG4gNjIxOlx0XG4gNjIyOlx0XHRpZiAoKGZsYWdzIF4gb2xkZmxhZ3MpIFx1MDAyNiBFWFQ0X0NBU0VGT0xEX0ZMKSB7XG4gNjIzOlx0XHRcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9jYXNlZm9sZChzYikpIHtcbiA2MjQ6XHRcdFx0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbiA2MjU6XHRcdFx0XHRnb3RvIGZsYWdzX291dDtcbiA2MjY6XHRcdFx0fVxuIDYyNzpcdFxuIDYyODpcdFx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuIDYyOTpcdFx0XHRcdGVyciA9IC1FTk9URElSO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDY5MgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4dDQgTWlncmF0aW9uIEludmVzdGlnYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYW5kIHRoaW5raW5nLCB0aGlzICpzaG91bGRuJiMzOTt0KiBiZSB0b28gY29tcGxleCBmcm9tIGEgZmlsZSBzeXN0ZW0gcGVybWlzc2lvbnMgYW5kIG93bmVyc2hpcCBwZXJzcGVjdGl2ZS4gV2UmIzM5O3JlIHRhbGtpbmcgc3RhbmRhcmQgaW5vZGUgc3R1ZmYgaGVyZSwgbm90aGluZyB1bnVzdWFsLiBQbHVzLCBleHQ0IGlzIGFscmVhZHkgcHJldHR5IHdlbGwtY292ZXJlZCBieSBzeXprYWxsZXIsIHdoaWNoIGdpdmVzIG1lIHNvbWUgY29uZmlkZW5jZSB0aGF0IGFueSBnbGFyaW5nIGlzc3VlcyB3b3VsZCBoYXZlIGJlZW4gZm91bmQuCgpNeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byBmaWd1cmUgb3V0IGhvdyBgZnMvZXh0NC9taWdyYXRlLmNgIGlzIGFjdHVhbGx5IGNvbXBpbGVkLiBXaGF0IGFyZSB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgbmVlZCB0byBiZSBzZXQgdG8gaW5jbHVkZSB0aGF0IGNvZGU/IEkmIzM5O2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIEtjb25maWcgb3B0aW9ucywgc3RhcnRpbmcgd2l0aCB0aG9zZSB0aGF0IGFmZmVjdCBgZnMvZXh0NC9taWdyYXRlLmNgIGRpcmVjdGx5LiBUaGVuLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGNoZWNraW5nIHRoZSBgZnMvZXh0NC9NYWtlZmlsZWAgdG8gc2VlIGhvdyB0aGUgYnVpbGQgcHJvY2VzcyBoYW5kbGVzIHRoaXMgZmlsZSBhbmQgd2hhdCBkZXBlbmRlbmNpZXMgaXQgbWlnaHQgaGF2ZS4gVW5kZXJzdGFuZGluZyB0aGUgYnVpbGQgcHJvY2VzcyBpcyBrZXkgdG8gZmlndXJpbmcgb3V0IHRoZSBwcmVjb25kaXRpb25zIGZvciB0aGUgY29kZSB0byBiZSBhdmFpbGFibGUsIGFuZCB0aHVzLCBleHBsb2l0YWJsZS4gVGhpcyBpcyB3aGVyZSBJJiMzOTtsbCBiZWdpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWlncmF0ZVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvTWFrZWZpbGU9OD1leHQ0LXlcdDo9IGJhbGxvYy5vIGJpdG1hcC5vIGJsb2NrX3ZhbGlkaXR5Lm8gZGlyLm8gZXh0NF9qYmQyLm8gZXh0ZW50cy5vIFxcXG5mcy9leHQ0L01ha2VmaWxlLTktXHRcdGV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGU6MTA6XHRcdGluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXFxcbmZzL2V4dDQvTWFrZWZpbGUtMTEtXHRcdG1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTE2NQoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4dDQgTW9kdWxlIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBgbWlncmF0ZS5vYC4uLiB0aGF0JiMzOTtzIHBhcnQgb2YgdGhlIGBleHQ0LXlgIG9iamVjdCwgd2hpY2ggbWVhbnMgaXQgZ2V0cyBidWlsdCBvbmx5IHdoZW4gdGhlIEVYVDQgZmlsZXN5c3RlbSBpcyBlbmFibGVkLiBPYnZpb3VzLCBidXQgaXQmIzM5O3MgZ29vZCB0byBjb25maXJtIHRoZSBidWlsZCBsb2dpYy4gTXkgbmV4dCBtb3ZlIGlzIHRvIGRvdWJsZS1jaGVjayB0aGUgYGZzL2V4dDQvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGZvbGxvd2luZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIOKAkyBgQ09ORklHX0VYVDRfRlNgLCBzcGVjaWZpY2FsbHkg4oCTIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY3kgY29ycmVjdGx5LiBHb3R0YSBiZSBwcmVjaXNlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVzeXN0ZW0gbW9kdWxlcy4gTm8gc3VycHJpc2VzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNF9GU1xcYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xuZnMvZXh0NC9LY29uZmlnLTMtXHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTQ0NwoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDk5OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogZXh0NCBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgdGhlIHN0YW5kYXJkIGBFWFQ0X0ZTYCBpcyBpbiBwbGF5LiBGaXJzdCwgY2FuIHRoaXMgY29kZSBldmVuICpiZSogZnV6emVkPyBZZXMsIGl0JiMzOTtzIGNvcmUgZmlsZXN5c3RlbSBjb2RlIHdpdGhpbiBleHQ0LCB3aGljaCBpcyByZWFkaWx5IHJlYWNoYWJsZS4gVGhlIHByaW1hcnkgZ2F0ZSBpcyByZWFjaGFiaWxpdHkg4oCTIGxldCYjMzk7cyBjaGVjayB0aGUgY3JpdGVyaWEuICBTZWN0aW9uIDImIzM5O3MgJiMzNDt1bnJlYWNoYWJsZSYjMzQ7IGNyaXRlcmlhIGRvbiYjMzk7dCBhcHBseTsgdGhpcyBpcyBrZXJuZWwgY29kZSwgcGFydCBvZiBhIGNydWNpYWwgc3Vic3lzdGVtLiBTZWN0aW9uIDMgY2xhcmlmaWVzIHRoYXQgZmlsZXN5c3RlbSBjb2RlLCBzcGVjaWZpY2FsbHkgZXh0NCwgZmFsbHMgdW5kZXIgJiMzNDtjb3JlIHN1YnN5c3RlbXMmIzM0OyByZWxhdGVkIHRvIFZGUyBhbmQgc3RvcmFnZS4gIFN5emthbGxlciBzeXNjYWxscyBsaWtlIGBtb3VudGAsIGBvcGVuYCwgYHdyaXRlYCwgYW5kIGBpb2N0bGAgKGUuZy4sIGBGU19JT0NfU0VURkxBR1NgIG9yIGBFWFQ0X0lPQ19NSUdSQVRFYCkgY2FuIGNsZWFybHkgZXhlcmNpc2UgaXQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZyA9IHRydWVgLgoKTm93LCB0aGUgc3ltYm9scyB0byB0YXJnZXQuIEluIGBmcy9leHQ0L21pZ3JhdGUuY2AsIHRoZSBgbWlncmF0ZV9zdHJ1Y3RgIHdhcyBtb2RpZmllZC4gIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCB3ZXJlIGNoYW5nZWQgZnJvbSBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgLiBBbHNvLCB0aGUgZnVuY3Rpb24gYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIHdhcyBtb2RpZmllZCwgYWRkaW5nIGEgY2hlY2sgZm9yIGBFWFRfTUFYX0JMT0NLU2AuCgpCdXQgd2FpdCwgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGlzICpzdGF0aWMqIHdpdGhpbiBgbWlncmF0ZS5jYC4gQ2FuIGEgc3RhdGljIGZ1bmN0aW9uIGJlIGEgJiMzNDtGb2N1c1N5bWJvbD8mIzM0OyAgUnVsZSA0IHN0YXRlcyB3aGVuIGBXb3J0aEZ1enppbmc9dHJ1ZWAsIHdlIG5lZWQgdG8gdGFyZ2V0IHNwZWNpZmljIGxvZ2ljIG9yIGVudHJ5cG9pbnRzIGFuZCBoYW5kbGUgc3RhdGljIGlubGluZSBmdW5jdGlvbnMgY2FyZWZ1bGx5LiBTdGF0aWMgaW5saW5lcyBsYWNrIGRpc3RpbmN0IHN5bWJvbHMgYW5kIGFyZSBhIGNoYWxsZW5nZSwgYnV0LCB0aGlzIGlzIGEgc3RhdGljIEMgZnVuY3Rpb24sICpub3QqIGEgc3RhdGljIGlubGluZS4KClNvLCBsZXQmIzM5O3Mgc2VlOiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgaXNuJiMzOTt0IGlubGluZWQhIExldCYjMzk7cyBjaGVjayBjYWxsZXJzOiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gbWlncmF0aW9uLCBhbHNvIGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gVGhhdCBpcyBjYWxsZWQgZnJvbSBgaW9jdGwuY2AuIFNpbmNlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqY2FsbGVkKiBieSBhIG5vbi1zdGF0aWMgZXhwb3J0ZWQgZnVuY3Rpb24gKGBleHQ0X2V4dF9taWdyYXRlYCksIHRoYXQmIzM5O3MgZ3JlYXQgYW5kIGl0IHByb3ZpZGVzIGEgc3ltYm9sIHRoYXQgY2FuIGJlIGZ1enplZCEKCkl0JiMzOTtzIHN0YW5kYXJkIHByYWN0aWNlIHRvIGxpc3QgYm90aC4gIEFuZCB0aGUgc3RhdGljIGZ1bmN0aW9uIGNhbiBoYXZlIGEgc3ltYm9sISBMaXN0aW5nIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIGNvdmVycyB0aGUgcmVsZXZhbnQgZmVhdHVyZXMuIFRoZSBvdGhlciBvbmUsIGBmaW5pc2hfcmFuZ2VgLCBpcyBhbHNvIHN0YXRpYyBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQsIGJ1dCBtYXliZSBub3QgYXMgaW1wb3J0YW50LiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgY2FsbGVkIGJ5IGBleHQ0X2lvY3RsX3NldGZsYWdzYCBhbmQgYF9fZXh0NF9pb2N0bGAgaW4gYGZzL2V4dDQvaW9jdGwuY2AsIGFuZCBzbyBpdCBpcyB0aGUga2V5LiBUaG9zZSB0d28gYXJlIG5vbi11YmlxdWl0b3VzLCB0YXJnZXRlZCBzeW1ib2xzIQoKRmluYWxseSwgbGV0JiMzOTtzIGRvdWJsZS1jaGVjayB0aGUgY29uZmlncy4gYEVYVDRfRlNgIGlzIGFscmVhZHkgZW5hYmxlZC4gTGV0JiMzOTtzIHNlZSBpZiB0aGUgY29kZSBoYXMgYW55IGAjaWZkZWZgIGNvbmRpdGlvbmFscy4gSSYjMzk7bGwgc2NhbiB0aHJvdWdoIGBtaWdyYXRlLmNgIHRvIGJlIGNlcnRhaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7I2lmJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzE0OAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkluaXRpYWwgQXNzZXNzbWVudCAmYW1wOyBWZXJpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBtaWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2Ugc29tZXRoaW5nIHNpZ25pZmljYW50OiB0aGVyZSBhcmUgKm5vKiBwcmVwcm9jZXNzb3IgYCNpZmRlZmAgZGlyZWN0aXZlcyBpbiB0aGlzIGZpbGUuIFRoYXQmIzM5O3MgdW51c3VhbCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgbmF0dXJlIG9mIGZpbGUgc3lzdGVtIG1pZ3JhdGlvbi4gSXQgbWFrZXMgbWUgd29uZGVyIGlmIGEgY2VydGFpbiBmaWxlIHN5c3RlbSBpcyBhbHdheXMgZW5hYmxlZC4gVGhpcyBsYWNrIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdhcnJhbnRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGlzIG5vdCB0aWVkIHRvIHNvbWUgb3RoZXIgY29uZmlnLiBUaGVyZWZvcmUsIEkmIzM5O2xsIHN3aXRjaCBnZWFycyBhbmQgdmVyaWZ5IGFueSBkZXBlbmRlbmNpZXMuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlIGZvciBgZnMvZXh0NGAgdG8gc2VlIGlmIGBFWFQ0X0ZTYCBoYXMgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIGFuZCB3aGF0JiMzOTtzIGRyaXZpbmcgdGhlIGJlaGF2aW9yIG9mIGBtaWdyYXRlLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBFWFQ0X0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuICAgNDpcdFx0c2VsZWN0IEJVRkZFUl9IRUFEXG4gICA1Olx0XHRzZWxlY3QgSkJEMlxuICAgNjpcdFx0c2VsZWN0IENSQzE2XG4gICA3Olx0XHRzZWxlY3QgQ1JDMzJcbiAgIDg6XHRcdHNlbGVjdCBGU19JT01BUFxuICAgOTpcdFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXG4gIDEwOlx0XHRoZWxwXG4gIDExOlx0XHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxuICAxMjpcdFxuICAxMzpcdFx0ICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sXG4gIDE0Olx0XHQgIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiBleHQ0IGlzIG5vdCBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGhcbiAgMTU6XHRcdCAgZXh0MzsgaXQgaXMgYmFzZWQgb24gZXh0ZW50IG1hcHMgYW5kIGl0IHN1cHBvcnRzIDQ4LWJpdFxuICAxNjpcdFx0ICBwaHlzaWNhbCBibG9jayBudW1iZXJzLiAgVGhlIGV4dDQgZmlsZXN5c3RlbSBhbHNvIHN1cHBvcnRzIGRlbGF5ZWRcbiAgMTc6XHRcdCAgYWxsb2NhdGlvbiwgcGVyc2lzdGVudCBwcmVhbGxvY2F0aW9uLCBoaWdoIHJlc29sdXRpb24gdGltZSBzdGFtcHMsXG4gIDE4Olx0XHQgIGFuZCBhIG51bWJlciBvZiBvdGhlciBmZWF0dXJlcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBzcGVlZFxuICAxOTpcdFx0ICB1cCBmc2NrIHRpbWUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgd2ViIHBhZ2VzIGF0XG4gIDIwOlx0XHQgIGh0dHA6Ly9leHQ0Lndpa2kua2VybmVsLm9yZy5cbiAgMjE6XHRcbiAgMjI6XHRcdCAgVGhlIGV4dDQgZmlsZXN5c3RlbSBzdXBwb3J0cyBtb3VudGluZyBhbiBleHQzIGZpbGVzeXN0ZW07IHdoaWxlIHRoZXJlXG4gIDIzOlx0XHQgIGFyZSBzb21lIHBlcmZvcm1hbmNlIGdhaW5zIGZyb20gdGhlIGRlbGF5ZWQgYWxsb2NhdGlvbiBhbmQgaW5vZGVcbiAgMjQ6XHRcdCAgdGFibGUgcmVhZGFoZWFkLCB0aGUgYmVzdCBwZXJmb3JtYW5jZSBnYWlucyByZXF1aXJlIGVuYWJsaW5nIGV4dDRcbiAgMjU6XHRcdCAgZmVhdHVyZXMgaW4gdGhlIGZpbGVzeXN0ZW0gdXNpbmcgdHVuZTJmcywgb3IgZm9ybWF0dGluZyBhIG5ld1xuICAyNjpcdFx0ICBmaWxlc3lzdGVtIGFzIGFuIGV4dDQgZmlsZXN5c3RlbSBpbml0aWFsbHkuIFdpdGhvdXQgZXhwbGljaXQgZW5hYmxpbmdcbiAgMjc6XHRcdCAgb2YgZXh0NCBmZWF0dXJlcywgdGhlIG9uIGRpc2sgZmlsZXN5c3RlbSBmb3JtYXQgc3RheXMgZnVsbHkgYmFja3dhcmRcbiAgMjg6XHRcdCAgY29tcGF0aWJsZS5cbiAgMjk6XHRcbiAgMzA6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxuICAzMTpcdFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cbiAgMzI6XHRcbiAgMzM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAgMzQ6XHRcbiAgMzU6XHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcbiAgMzY6XHRcdGJvb2wgXCYjMzQ7VXNlIGV4dDQgZm9yIGV4dDIgZmlsZSBzeXN0ZW1zXCYjMzQ7XG4gIDM3Olx0XHRkZXBlbmRzIG9uIEVYVDRfRlNcbiAgMzg6XHRcdGRlcGVuZHMgb24gRVhUMl9GUz1uXG4gIDM5Olx0XHRkZWZhdWx0IHlcbiAgNDA6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM5NzYKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogMjMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBFWFQ0IFBhdGNoKioKCk9rYXksIHNvIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCwgaXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIHNlZW1zIGVhc3k7IGBFWFQ0X0ZTYCBwdWxscyBpbiBhbGwgdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXM6IGBCVUZGRVJfSEVBRGAsIGBKQkQyYCwgYENSQzE2YCwgYENSQzMyYCwgYW5kIGBGU19JT01BUGAuIFRoZXJlZm9yZSwgdGhlIGBFbmFibGVDb25maWdzYCBsaXN0IGlzIHNpbXBseSBgWyYjMzQ7RVhUNF9GUyYjMzQ7XWAuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGUgcmVsZXZhbnQgc3ltYm9scy4gQ2hlY2tpbmcgYEZvY3VzU3ltYm9sc2AsIEkgc2VlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIHBvcCB1cC4gWWVwLCB0aGF0JiMzOTtzIGV4cGVjdGVkLgoKTGV0JiMzOTtzIHF1aWNrbHkgYXJ0aWN1bGF0ZSB0aGUgY29yZSBvZiB0aGlzIGNoYW5nZS4gRnJvbSB3aGF0IEkgZ2F0aGVyLCB0aGUgcGF0Y2ggYWRkcmVzc2VzIGEgcG90ZW50aWFsIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSB3aXRoaW4gdGhlIGV4dDQgbWlncmF0aW9uIGxvZ2ljLiBUaGlzIGNvbnZlcnNpb24sIGZyb20gaW5kaXJlY3QtYmxvY2sgbWFwcGluZ3MgdG8gZXh0ZW50LW1hcHBlZCBmaWxlcywgaW52b2x2ZXMgd2lkZW5pbmcgdGhlIGJsb2NrIG9mZnNldHMgaW4gYG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCAoYGV4dDRfbGJsa190YCwgb3IgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApIHRvIHByZXZlbnQgYW4gaW50ZWdlciBvdmVyZmxvdyBjb25kaXRpb24gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBsYXJnZSBmaWxlcy4gIEl0JiMzOTtzIGFsc28gbm93IGNoZWNraW5nIGlmIGBjdXJyX2Jsb2NrYCBpcyBncmVhdGVyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggcHJldmVudHMgYSBidWZmZXIgb3ZlcmZsb3cuIFRoZSBjb2RlIHBhdGggaXMgdHJpZ2dlcmVkIGJ5IGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgKHdoZW4gc2V0dGluZyB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZykgb24gZXh0NCBmaWxlc3lzdGVtcy4gVGhpcyBpbmRpY2F0ZXMgaXQgdG91Y2hlcyBsaXZlIGZpbGVzeXN0ZW0gbG9naWMgYW5kIGlzIGRlZmluaXRlbHkgd29ydGggZnV6emluZy4KCkdpdmVuIHRoaXMgdGhvcm91Z2ggdW5kZXJzdGFuZGluZywgSSYjMzk7bSBjb25maWRlbnQgaW4gdGhlIGFzc2Vzc21lbnQuIEkmIzM5O2xsIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3VwZGF0ZV9leHRlbnRfcmFuZ2UmIzM0OywKICAgICYjMzQ7ZXh0NF9leHRfbWlncmF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1cGRhdGVfZXh0ZW50X3JhbmdlJiMzNDssCiAgICAmIzM0O2V4dDRfZXh0X21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXh0NCBibG9jayBtaWdyYXRpb24gbG9naWMgKGNvbnZlcnRpbmcgaW5kaXJlY3QtYmxvY2sgbWFwcGVkIGlub2RlcyB0byBleHRlbnQtYmFzZWQgaW5vZGVzKSBieSB3aWRlbmluZyBibG9jayBvZmZzZXRzIGluIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgYW5kIGFkZGluZyBhbiB1cHBlci1ib3VuZCBjaGVjayBhZ2FpbnN0IEVYVF9NQVhfQkxPQ0tTIGluIHVwZGF0ZV9leHRlbnRfcmFuZ2UoKSB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSB0aGUgRVhUNF9JT0NfTUlHUkFURSBpb2N0bCBhbmQgRlNfSU9DX1NFVEZMQUdTIHdpdGggRVhUNF9FWFRFTlRTX0ZMIG9uIGV4dDQgZmlsZXN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT41bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXG5cblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZWMyYjA2YjA5YzY1NTI0NGFhZTk2OTQ3MjVmZGY5MjJmM2E5MjZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgMTQgMDg6NDM6MTggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC0xNCw3ICYjNDM7MTQsNyBAQAogICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50CiAgKi8KIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7Ci0JZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7CiYjNDM7CXU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jazsKIAlleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jazsKIH07CiAKQEAgLTY2LDYgJiM0Mzs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCWludCByZXR2YWw7CiYjNDM7CiYjNDM7CWlmIChsYi0mZ3Q7Y3Vycl9ibG9jayAmZ3Q7PSBFWFRfTUFYX0JMT0NLUykKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKIAkvKgogCSAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKQogCSAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE2OQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBFeHQ0IHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gemVybyBpbiBvbiB0aGUga2V5IG1vZGlmaWNhdGlvbnMgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBub3RpbmcgdGhlIGNoYW5nZSBpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFRoZSBhbHRlcmF0aW9uIGZyb20gYGV4dDRfbGJsa190YCB0byBgdTY0YCBmb3IgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGltbWVkaWF0ZWx5IGNhdGNoZXMgbXkgZXllLiBUaGlzIHN1Z2dlc3RzIGEgc2hpZnQgdG8gNjQtYml0IGJsb2NrIGFkZHJlc3NpbmcsIHdoaWNoIGxpa2VseSBpbmRpY2F0ZXMgdGhleSYjMzk7cmUgYWRkcmVzc2luZyB0aGUgbGFyZ2VyIHZvbHVtZSBzaXplcyDigJMgd2UmIzM5O3JlIHByb2JhYmx5IGxvb2tpbmcgYXQgYSBtb3ZlIHRvd2FyZHMgc3VwcG9ydGluZyBsYXJnZXIgZmlsZXN5c3RlbXMsIG9yIGF0IGxlYXN0IGEgcHJlcGFyYXRpb24gZm9yIGl0LgoKTmV4dCwgSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgYHVwZGF0ZV9leHRlbnRfcmFuZ2VgIGZ1bmN0aW9uLCB3aGVyZSB0aGUgYWRkaXRpb24gb2YgdGhlIGBpZiAobGItJmd0O2N1cnJfYmxvY2sgJmd0Oz0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgIGNoZWNrIGlzLiBUaGUgYEVYVF9NQVhfQkxPQ0tTYCBkZWZpbml0aW9uIHdpbGwgYmUgaW1wb3J0YW50LiBNeSBpbnN0aW5jdCBpcyB0aGF0IHRoaXMgaXMgc29tZSBmb3JtIG9mIGJvdW5kYXJ5IGNoZWNrIHRvIGVuc3VyZSB0aGUgYmxvY2sgbnVtYmVyIGRvZXNuJiMzOTt0IGV4Y2VlZCBhIHByZWRldGVybWluZWQgbWF4aW11bS4gVGhlIGAtRU9QTk9UU1VQUGAgZXJyb3IgaW5kaWNhdGVzIHRoYXQgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZCwgc28gdGhlIHN5c3RlbSBpcyB0cnlpbmcgdG8gaGFuZGxlIHRoZSBmYWN0IHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGJsb2NrIGFkZHJlc3NpbmcgaXNuJiMzOTt0IGhhbmRsZWQgY29ycmVjdGx5LgoKSSYjMzk7bSBub3cgZ29pbmcgdG8gc3RhcnQgc2Nhbm5pbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCBhcm91bmQgdGhlc2UgbGluZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFib3V0IHRoZSBvcmlnaW5hbCBjb25zdHJhaW50cywgd2hhdCB0aGlzIGxpbWl0IGFjdHVhbGx5IHJlcHJlc2VudHMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGZ1bmN0aW9ucyB1dGlsaXplIHRoZXNlIGJsb2NrIG51bWJlcnMuIFRoaXMgd2lsbCBjbGFyaWZ5IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UgYW5kIHRoZSByZWFzb25zIGZvciBpdC4gSXMgdGhpcyBhIHBsYW5uZWQgY2hhbmdlIHRvIGEgbW9yZSBjb21wbGV4IGxheW91dCwgb3Igc29tZSBvdGhlciBjaGFuZ2UgdG8gYmxvY2sgYWRkcmVzc2luZywgb3IgYW4gYXR0ZW1wdCB0byBwcmVwYXJlIGZvciBsYXJnZXIgdm9sdW1lcz8gSSYjMzk7bGwgc29vbiBzZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXG4gICAyOlx0LypcbiAgIDM6XHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XG4gICA0Olx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVx1MDAzZVxuICAgNTpcdCAqXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXCYjMzQ7ZXh0NF9qYmQyLmhcJiMzNDtcbiAgMTA6XHQjaW5jbHVkZSBcJiMzNDtleHQ0X2V4dGVudHMuaFwmIzM0O1xuICAxMTpcdFxuICAxMjpcdC8qXG4gIDEzOlx0ICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlXG4gIDE0Olx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gIDE1Olx0ICovXG4gIDE2Olx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbiAgMTc6XHRcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbiAgMTg6XHRcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xuICAxOTpcdH07XG4gIDIwOlx0XG4gIDIxOlx0c3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgMjI6XHRcdFx0XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gIDIzOlx0XG4gIDI0Olx0e1xuICAyNTpcdFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcbiAgMjY6XHRcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XG4gIDI3Olx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcbiAgMjg6XHRcdGlmIChsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcbiAgMjk6XHRcdFx0cmV0dXJuIDA7XG4gIDMwOlx0XG4gIDMxOlx0XHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cbiAgMzI6XHRcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVx1MDAzZWZpcnN0X2Jsb2NrKTtcbiAgMzM6XHRcdG5ld2V4dC5lZV9sZW4gICA9IGNwdV90b19sZTE2KGxiLVx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cdTAwM2VmaXJzdF9ibG9jayAmIzQzOyAxKTtcbiAgMzQ6XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG4gIDM1Olx0XHQvKiBMb2NraW5nIG9ubHkgZm9yIGNvbnZlbmllbmNlIHNpbmNlIHdlIGFyZSBvcGVyYXRpbmcgb24gdGVtcCBpbm9kZSAqL1xuICAzNjpcdFx0ZG93bl93cml0ZShcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pO1xuICAzNzpcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVx1MDAzZWZpcnN0X2Jsb2NrLCBOVUxMLCAwKTtcbiAgMzg6XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiAgMzk6XHRcdFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcbiAgNDA6XHRcdFx0Z290byBlcnJfb3V0O1xuICA0MTpcdFx0fVxuICA0MjpcdFxuICA0MzpcdFx0LypcbiAgNDQ6XHRcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcbiAgNDU6XHRcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcbiAgNDY6XHRcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxuICA0NzpcdFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxuICA0ODpcdFx0ICovXG4gIDQ5Olx0XHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXG4gIDUwOlx0XHRcdCAgICBsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSwgcGF0aCk7XG4gIDUxOlx0XG4gIDUyOlx0XHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xuICA1MzpcdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbiAgNTQ6XHRcdFx0Z290byBlcnJfb3V0O1xuICA1NTpcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXh0LCAwKTtcbiAgNTY6XHRcdGlmIChJU19FUlIocGF0aCkpXG4gIDU3Olx0XHRcdHJldHZhbCA9IFBUUl9FUlIocGF0aCk7XG4gIDU4Olx0ZXJyX291dDpcbiAgNTk6XHRcdHVwX3dyaXRlKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiAgNjA6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbiAgNjE6XHRcdGxiLVx1MDAzZWZpcnN0X3BibG9jayA9IDA7XG4gIDYyOlx0XHRyZXR1cm4gcmV0dmFsO1xuICA2MzpcdH1cbiAgNjQ6XHRcbiAgNjU6XHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgNjY6XHRcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAgNjc6XHR7XG4gIDY4Olx0XHRpbnQgcmV0dmFsO1xuICA2OTpcdFxuICA3MDpcdFx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbiAgNzE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuICA3MjpcdFxuICA3MzpcdFx0LypcbiAgNzQ6XHRcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuICA3NTpcdFx0ICovXG4gIDc2Olx0XHRpZiAobGItXHUwMDNlZmlyc3RfcGJsb2NrIFx1MDAyNlx1MDAyNlxuICA3NzpcdFx0XHQobGItXHUwMDNlbGFzdF9wYmxvY2smIzQzOzEgPT0gcGJsb2NrKSBcdTAwMjZcdTAwMjZcbiAgNzg6XHRcdFx0KGxiLVx1MDAzZWxhc3RfYmxvY2smIzQzOzEgPT0gbGItXHUwMDNlY3Vycl9ibG9jaykpIHtcbiAgNzk6XHRcdFx0bGItXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XG4gIDgwOlx0XHRcdGxiLVx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cdTAwM2VjdXJyX2Jsb2NrO1xuICA4MTpcdFx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgODI6XHRcdFx0cmV0dXJuIDA7XG4gIDgzOlx0XHR9XG4gIDg0Olx0XHQvKlxuICA4NTpcdFx0ICogU3RhcnQgYSBuZXcgcmFuZ2UuXG4gIDg2Olx0XHQgKi9cbiAgODc6XHRcdHJldHZhbCA9IGZpbmlzaF9yYW5nZShoYW5kbGUsIGlub2RlLCBsYik7XG4gIDg4Olx0XHRsYi1cdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcbiAgODk6XHRcdGxiLVx1MDAzZWZpcnN0X2Jsb2NrID0gbGItXHUwMDNlbGFzdF9ibG9jayA9IGxiLVx1MDAzZWN1cnJfYmxvY2s7XG4gIDkwOlx0XHRsYi1cdTAwM2VjdXJyX2Jsb2NrJiM0MzsmIzQzOztcbiAgOTE6XHRcdHJldHVybiByZXR2YWw7XG4gIDkyOlx0fVxuICA5MzpcdFxuICA5NDpcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAgOTU6XHRcdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gIDk2Olx0XHRcdFx0XHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuICA5NzpcdHtcbiAgOTg6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XG4gIDk5Olx0XHRfX2xlMzIgKmlfZGF0YTtcbiAxMDA6XHRcdGludCBpLCByZXR2YWwgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MTYwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIGhvdyBpdCYjMzk7cyBhbGxvY2F0ZWQsIGluaXRpYWxpemVkLCBhbmQgdGhlbiBhY3R1YWxseSAqdXNlZCogd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBFeHQ0IGZpbGVzeXN0ZW0uIEkgbmVlZCB0byBncmFzcCB0aGlzIHRob3JvdWdobHkgdG8gcmVhbGx5IHVuZGVyc3RhbmQgaG93IHRoZSBtaWdyYXRpb24gcHJvY2VzcyB3b3Jrcy4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSBoYW5kbGUgaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDE6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEwMjpcdFxuIDEwMzpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTA0Olx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMDU6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEwNjpcdFxuIDEwNzpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMDg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEwOTpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTEwOlx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDExMTpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxMTI6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDExMzpcdFx0XHRcdFx0YnJlYWs7XG4gMTE0Olx0XHRcdH0gZWxzZSB7XG4gMTE1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gMTE2Olx0XHRcdH1cbiAxMTc6XHRcdH1cbiAxMTg6XHRcdHB1dF9iaChiaCk7XG4gMTE5Olx0XHRyZXR1cm4gcmV0dmFsO1xuIDEyMDpcdFxuIDEyMTpcdH1cbiAxMjI6XHRcbiAxMjM6XHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIDEyNDpcdFx0XHRcdFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG4gMTI1Olx0XHRcdFx0XHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiAxMjY6XHR7XG4gMTI3Olx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xuIDEyODpcdFx0X19sZTMyICppX2RhdGE7XG4gMTI5Olx0XHRpbnQgaSwgcmV0dmFsID0gMDtcbiAxMzA6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIFx1MDAzZVx1MDAzZSAyO1xuIDEzMTpcdFxuIDEzMjpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVx1MDAzZWlfc2IsIHBibG9jaywgMCk7XG4gMTMzOlx0XHRpZiAoSVNfRVJSKGJoKSlcbiAxMzQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xuIDEzNTpcdFxuIDEzNjpcdFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVx1MDAzZWJfZGF0YTtcbiAxMzc6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1heF9lbnRyaWVzOyBpJiM0MzsmIzQzOykge1xuIDEzODpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gMTM5Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcbiAxNDA6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7XG4gMTQxOlx0XHRcdFx0aWYgKHJldHZhbClcbiAxNDI6XHRcdFx0XHRcdGJyZWFrO1xuIDE0MzpcdFx0XHR9IGVsc2Uge1xuIDE0NDpcdFx0XHRcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xuIDE0NTpcdFx0XHRcdGxiLVx1MDAzZWN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDE0NjpcdFx0XHR9XG4gMTQ3Olx0XHR9XG4gMTQ4Olx0XHRwdXRfYmgoYmgpO1xuIDE0OTpcdFx0cmV0dXJuIHJldHZhbDtcbiAxNTA6XHRcbiAxNTE6XHR9XG4gMTUyOlx0XG4gMTUzOlx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxNTQ6XHRcdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuIDE1NTpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG4gMTU2Olx0e1xuIDE1NzpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxNTg6XHRcdF9fbGUzMiAqaV9kYXRhO1xuIDE1OTpcdFx0aW50IGksIHJldHZhbCA9IDA7XG4gMTYwOlx0XHR1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSBcdTAwM2VcdTAwM2UgMjtcbiAxNjE6XHRcbiAxNjI6XHRcdGJoID0gZXh0NF9zYl9icmVhZChpbm9kZS1cdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xuIDE2MzpcdFx0aWYgKElTX0VSUihiaCkpXG4gMTY0Olx0XHRcdHJldHVybiBQVFJfRVJSKGJoKTtcbiAxNjU6XHRcbiAxNjY6XHRcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cdTAwM2ViX2RhdGE7XG4gMTY3Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiAxNjg6XHRcdFx0aWYgKGlfZGF0YVtpXSkge1xuIDE2OTpcdFx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxuIDE3MDpcdFx0XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcbiAxNzE6XHRcdFx0XHRpZiAocmV0dmFsKVxuIDE3MjpcdFx0XHRcdFx0YnJlYWs7XG4gMTczOlx0XHRcdH0gZWxzZSB7XG4gMTc0Olx0XHRcdFx0LyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovXG4gMTc1Olx0XHRcdFx0bGItXHUwMDNlY3Vycl9ibG9jayAmIzQzOz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcbiAxNzY6XHRcdFx0fVxuIDE3NzpcdFx0fVxuIDE3ODpcdFx0cHV0X2JoKGJoKTtcbiAxNzk6XHRcdHJldHVybiByZXR2YWw7XG4gMTgwOlx0XG4gMTgxOlx0fVxuIDE4MjpcdFxuIDE4MzpcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxuIDE4NDpcdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcbiAxODU6XHR7XG4gMTg2Olx0XHRpbnQgaTtcbiAxODc6XHRcdF9fbGUzMiAqdG1wX2lkYXRhO1xuIDE4ODpcdFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbiAxODk6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIDE5MDpcdFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gMTkxOlx0XHRpbnQgZXJyO1xuIDE5MjpcdFxuIDE5MzpcdFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcbiAxOTQ6XHRcdGlmIChJU19FUlIoYmgpKVxuIDE5NTpcdFx0XHRyZXR1cm4gUFRSX0VSUihiaCk7XG4gMTk2Olx0XG4gMTk3Olx0XHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXHUwMDNlYl9kYXRhO1xuIDE5ODpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7XG4gMTk5Olx0XHRcdGlmICh0bXBfaWRhdGFbaV0pIHtcbiAyMDA6XHRcdFx0XHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1ODI3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcHJvY2Vzc2luZyB0aGUgY29kZToKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgZnMvZXh0NC9taWdyYXRlLmNgIGZpbGUuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBtaWdyYXRpb24gcHJvY2VzcyBpcyBzdHJ1Y3R1cmVkIGFuZCB3aGVyZSB0aGUga2V5IHN0cnVjdHVyZXMsIHNwZWNpZmljYWxseSBgbWlncmF0ZV9zdHJ1Y3RgLCBnZXQgdGhlaXIgc3RhcnQuIEkgbmVlZCB0byB0cmFjZSB0aGUgaW5zdGFudGlhdGlvbiBvZiB0aGF0IGBtaWdyYXRlX3N0cnVjdGAgdG8gdW5kZXJzdGFuZCBob3cgdGhlIG1pZ3JhdGlvbiBjb250ZXh0IGlzIGJlaW5nIGJ1aWx0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgZnVydGhlciByZWFkaW5nIGluIHRoZSBzb3VyY2UgY29kZSB3aWxsIHRlbGwgbWUuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgZXhhY3QgcG9pbnQgd2hlcmUgdGhhdCBjcnVjaWFsIHN0cnVjdCBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWlncmF0ZV9zdHJ1Y3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cbmZzL2V4dDQvbWlncmF0ZS5jOjE2OnN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XG5mcy9leHQ0L21pZ3JhdGUuYy0xNy1cdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9taWdyYXRlLmM6MjI6XHRcdFx0XHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtMjMtXG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYzo2NjpcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbmZzL2V4dDQvbWlncmF0ZS5jLTY3LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz05ND1zdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYy05NS1cdFx0XHRcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXG5mcy9leHQ0L21pZ3JhdGUuYzo5NjpcdFx0XHRcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy05Ny17XG4tLVxuZnMvZXh0NC9taWdyYXRlLmM9MTIzPXN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjQtXHRcdFx0XHQgICAgZXh0NF9mc2Jsa190IHBibG9jayxcbmZzL2V4dDQvbWlncmF0ZS5jOjEyNTpcdFx0XHRcdCAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuZnMvZXh0NC9taWdyYXRlLmMtMTI2LXtcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz0xNTM9c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbWlncmF0ZS5jLTE1NC1cdFx0XHRcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxuZnMvZXh0NC9taWdyYXRlLmM6MTU1Olx0XHRcdFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTYte1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTQxND1pbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTQyMC1cdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbmZzL2V4dDQvbWlncmF0ZS5jOjQyMTpcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbmZzL2V4dDQvbWlncmF0ZS5jLTQyMi1cdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2MjgKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgZnMvZXh0NC9taWdyYXRlLmNgIC0gTGluZXMgNDE0LTUwMCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4gb24gbGluZXMgNDE0IHRocm91Z2ggNTAwIGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgc2VjdGlvbiB0aG9yb3VnaGx5LiBCYXNlZCBvbiB0aGUgZmlsZSBuYW1lLCBpdCYjMzk7cyBwcmV0dHkgY2xlYXIgdGhpcyBpcyBhYm91dCBtaWdyYXRpb24gcHJvY2Vzc2VzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzbyB0aGlzIHByb2JhYmx5IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCB1cGdyYWRpbmcgb3IgY2hhbmdpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBmaWxlIHN5c3RlbS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGFuZCBmaWd1cmUgb3V0IHRoZSBjb3JuZXIgY2FzZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgZm9yIHJlZ3Jlc3Npb25zIG9yIHBlcmZvcm1hbmNlIGltcGFjdCwgYXMgd2VsbCBhcyBpZiB0aGlzIGlzIHRvdWNoaW5nIGFueSBmZWF0dXJlcyBJIGFtIGZhbWlsaWFyIHdpdGguIEkgd2lsbCBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBhc3BlY3RzIG9mIHRoZSBtaWdyYXRpb24gYXJlIGFjdHVhbGx5IGhhbmRsZWQgd2l0aGluIHRoaXMgcmVnaW9uIG9mIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNDpcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNDE1Olx0e1xuIDQxNjpcdFx0aGFuZGxlX3QgKmhhbmRsZTtcbiA0MTc6XHRcdGludCByZXR2YWwgPSAwLCBpO1xuIDQxODpcdFx0X19sZTMyICppX2RhdGE7XG4gNDE5Olx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcbiA0MjA6XHRcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcbiA0MjE6XHRcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcbiA0MjI6XHRcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XG4gNDIzOlx0XHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xuIDQyNDpcdFx0dWlkX3Qgb3duZXJbMl07XG4gNDI1Olx0XHRpbnQgYWxsb2NfY3R4O1xuIDQyNjpcdFxuIDQyNzpcdFx0LypcbiA0Mjg6XHRcdCAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlXG4gNDI5Olx0XHQgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LlxuIDQzMDpcdFx0ICovXG4gNDMxOlx0XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSB8fFxuIDQzMjpcdFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XG4gNDMzOlx0XHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuIDQzNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzU6XHRcbiA0MzY6XHRcdGlmIChTX0lTTE5LKGlub2RlLVx1MDAzZWlfbW9kZSkgXHUwMDI2XHUwMDI2IGlub2RlLVx1MDAzZWlfYmxvY2tzID09IDApXG4gNDM3Olx0XHRcdC8qXG4gNDM4Olx0XHRcdCAqIGRvbiYjMzk7dCBtaWdyYXRlIGZhc3Qgc3ltbGlua1xuIDQzOTpcdFx0XHQgKi9cbiA0NDA6XHRcdFx0cmV0dXJuIHJldHZhbDtcbiA0NDE6XHRcbiA0NDI6XHRcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVx1MDAzZWlfc2IpO1xuIDQ0MzpcdFxuIDQ0NDpcdFx0LypcbiA0NDU6XHRcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcbiA0NDY6XHRcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XG4gNDQ3Olx0XHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxuIDQ0ODpcdFx0ICovXG4gNDQ5Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcbiA0NTA6XHRcdFx0MyAmIzQzOyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXHUwMDNlaV9zYikpO1xuIDQ1MTpcdFxuIDQ1MjpcdFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XG4gNDUzOlx0XHRcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcbiA0NTQ6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDQ1NTpcdFx0fVxuIDQ1NjpcdFx0LypcbiA0NTc6XHRcdCAqIFRoaXMgb3BlcmF0aW9uIHJld3JpdGVzIHRoZSBpbm9kZSYjMzk7cyBibG9jayBtYXBwaW5nIGxheW91dFxuIDQ1ODpcdFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcbiA0NTk6XHRcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gNDYwOlx0XHQgKi9cbiA0NjE6XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX01JR1JBVEUsIGhhbmRsZSk7XG4gNDYyOlx0XHRnb2FsID0gKCgoKHUzMilpbm9kZS1cdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVx1MDAzZWlfc2IpKSAqXG4gNDYzOlx0XHRcdEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS1cdTAwM2VpX3NiKSkgJiM0MzsgMTtcbiA0NjQ6XHRcdG93bmVyWzBdID0gaV91aWRfcmVhZChpbm9kZSk7XG4gNDY1Olx0XHRvd25lclsxXSA9IGlfZ2lkX3JlYWQoaW5vZGUpO1xuIDQ2NjpcdFx0dG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KSxcbiA0Njc6XHRcdFx0XHRcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcbiA0Njg6XHRcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xuIDQ2OTpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKHRtcF9pbm9kZSk7XG4gNDcwOlx0XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDcxOlx0XHRcdHRtcF9pbm9kZSA9IE5VTEw7XG4gNDcyOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA0NzM6XHRcdH1cbiA0NzQ6XHRcdC8qXG4gNDc1Olx0XHQgKiBVc2UgdGhlIGNvcnJlY3Qgc2VlZCBmb3IgY2hlY2tzdW0gKGkuZS4gdGhlIHNlZWQgZnJvbSAmIzM5O2lub2RlJiMzOTspLiAgVGhpc1xuIDQ3NjpcdFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxuIDQ3NzpcdFx0ICogdGhlIG1pZ3JhdGlvbi5cbiA0Nzg6XHRcdCAqL1xuIDQ3OTpcdFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xuIDQ4MDpcdFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVx1MDAzZWlfY3N1bV9zZWVkO1xuIDQ4MTpcdFx0RVhUNF9JKHRtcF9pbm9kZSktXHUwMDNlaV9jc3VtX3NlZWQgPSBlaS1cdTAwM2VpX2NzdW1fc2VlZDtcbiA0ODI6XHRcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XG4gNDgzOlx0XHQvKlxuIDQ4NDpcdFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXG4gNDg1Olx0XHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxuIDQ4NjpcdFx0ICovXG4gNDg3Olx0XHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xuIDQ4ODpcdFxuIDQ4OTpcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcbiA0OTA6XHRcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4gNDkxOlx0XG4gNDkyOlx0XHQvKlxuIDQ5MzpcdFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODE4OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gZXh0NCYjMzk7cyBNaWdyYXRpb24gTG9naWMqKgoKT2theSwgdGltZSB0byBnZXQgYmFjayBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGlzIGBleHQ0X21pZ3JhdGVgIGZ1bmN0aW9uIOKAkyBzcGVjaWZpY2FsbHksIHNlY3Rpb25zIDQ5NCB0byA1NTAgd2l0aGluIGBmcy9leHQ0L21pZ3JhdGUuY2AuIEkgcmVjYWxsIHRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgbG9naWMgZm9yIG1pZ3JhdGluZyBpbm9kZXMgYW5kIGRhdGEgYmxvY2tzIGxpa2VseSByZXNpZGVzLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRoYXQgc3BlY2lmaWMgcmFuZ2UgdG8gcGlucG9pbnQgdGhlIG1pZ3JhdGlvbiBzdHJhdGVneSBpbXBsZW1lbnRlZC4gSSBzdXNwZWN0IHRoaXMgcGFydCBvZiB0aGUgY29kZSBkZXRhaWxzIHRoZSBoYW5kbGluZyBvZiBibG9jayBhbGxvY2F0aW9uLCBtZXRhZGF0YSB1cGRhdGVzIChpbm9kZSBudW1iZXJzLCBncm91cCBkZXNjcmlwdG9ycywgYml0bWFwcywgYW5kIHNvIG9uKSwgYW5kIHBvdGVudGlhbGx5IGFueSBjb25zaWRlcmF0aW9ucyBmb3IgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCBkdXJpbmcgdGhlIHByb2Nlc3MuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyBpdCBoYW5kbGVzIGF0b21pY2l0eSBhbmQgZGF0YSBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhpcyBwb3RlbnRpYWxseSBjb21wbGV4IHRyYW5zZm9ybWF0aW9uLiBJcyBpdCB1c2luZyBqb3VybmFsaW5nIHRvIHByb3RlY3QgYWdhaW5zdCBmYWlsdXJlcz8gSG93IGFyZSBibG9jayBudW1iZXJzIG1hbmFnZWQgZHVyaW5nIHRoZSBtb3ZlPyBJIGFsc28gd2FudCB0byBzZWUgaWYgdGhpcyBoYW5kbGVzIGFueSBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIERvZXMgaXQgYWxsb3cgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIG9yIGRvZXMgaXQgdGFrZSBleGNsdXNpdmUgbG9jayBpbiBvcmRlciB0byBtaWdyYXRlIGlub2Rlcz8gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L21pZ3JhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ5NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1Ngp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDk0Olx0XHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cbiA0OTU6XHRcdCAqXG4gNDk2Olx0XHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxuIDQ5NzpcdFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXG4gNDk4Olx0XHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxuIDQ5OTpcdFx0ICovXG4gNTAwOlx0XHQvKlxuIDUwMTpcdFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xuIDUwMjpcdFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcbiA1MDM6XHRcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxuIDUwNDpcdFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxuIDUwNTpcdFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xuIDUwNjpcdFx0ICogYWxsb2NhdGlvbi5cbiA1MDc6XHRcdCAqL1xuIDUwODpcdFx0ZG93bl9yZWFkKFx1MDAyNkVYVDRfSShpbm9kZSktXHUwMDNlaV9kYXRhX3NlbSk7XG4gNTA5Olx0XHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XG4gNTEwOlx0XHR1cF9yZWFkKChcdTAwMjZFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YV9zZW0pKTtcbiA1MTE6XHRcbiA1MTI6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcbiA1MTM6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuIDUxNDpcdFx0XHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XG4gNTE1Olx0XHRcdGdvdG8gb3V0X3RtcF9pbm9kZTtcbiA1MTY6XHRcdH1cbiA1MTc6XHRcbiA1MTg6XHRcdGlfZGF0YSA9IGVpLVx1MDAzZWlfZGF0YTtcbiA1MTk6XHRcdG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XG4gNTIwOlx0XG4gNTIxOlx0XHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXG4gNTIyOlx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4gNTIzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFWFQ0X05ESVJfQkxPQ0tTOyBpJiM0MzsmIzQzOykge1xuIDUyNDpcdFx0XHRpZiAoaV9kYXRhW2ldKSB7XG4gNTI1Olx0XHRcdFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MjY6XHRcdFx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBcdTAwMjZsYik7XG4gNTI3Olx0XHRcdFx0aWYgKHJldHZhbClcbiA1Mjg6XHRcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1Mjk6XHRcdFx0fSBlbHNlXG4gNTMwOlx0XHRcdFx0bGIuY3Vycl9ibG9jayYjNDM7JiM0Mzs7XG4gNTMxOlx0XHR9XG4gNTMyOlx0XHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xuIDUzMzpcdFx0XHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1MzQ6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcdTAwMjZsYik7XG4gNTM1Olx0XHRcdGlmIChyZXR2YWwpXG4gNTM2Olx0XHRcdFx0Z290byBlcnJfb3V0O1xuIDUzNzpcdFx0fSBlbHNlXG4gNTM4Olx0XHRcdGxiLmN1cnJfYmxvY2sgJiM0Mzs9IG1heF9lbnRyaWVzO1xuIDUzOTpcdFx0aWYgKGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSB7XG4gNTQwOlx0XHRcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDE6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0MjpcdFx0XHRpZiAocmV0dmFsKVxuIDU0MzpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NDQ6XHRcdH0gZWxzZVxuIDU0NTpcdFx0XHRsYi5jdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xuIDU0NjpcdFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XG4gNTQ3Olx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcbiA1NDg6XHRcdFx0XHRcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgXHUwMDI2bGIpO1xuIDU0OTpcdFx0XHRpZiAocmV0dmFsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDQ5CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIHRoZSBNZW1vcnkgSW5pdGlhbGl6YXRpb24gaW4gYGV4dDRfZXh0X21pZ3JhdGVgKioKCk9rYXksIGxpbmUgNTE5IGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCBpdCYjMzk7cyBjcnVjaWFsIHRvIGJlIHByZWNpc2Ugd2l0aCB0aGVzZSB0aGluZ3MuIEkmIzM5O20gc2VlaW5nIGBtZW1zZXQoJmFtcDtsYiwgMCwgc2l6ZW9mKGxiKSk7YC4gUmlnaHQsIHNvIGBsYmAgaXMgZXhwbGljaXRseSBiZWluZyB6ZXJvZWQgb3V0IHVzaW5nIGBtZW1zZXRgLiBUaGF0IHRlbGxzIG1lIHRoZSBkZXZlbG9wZXIgaXMgYmVpbmcgZGlsaWdlbnQgYWJvdXQgbWVtb3J5IGluaXRpYWxpemF0aW9uLCB3aGljaCBpcyBnb29kIHByYWN0aWNlIOKAkyBlc3BlY2lhbGx5IGluIGEga2VybmVsIGNvbnRleHQuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyAqd2h5Kj8gSXMgaXQgc2ltcGx5IGRlZmVuc2l2ZSBwcm9ncmFtbWluZywgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gdGhlIHN0cnVjdHVyZSBuZWVkcyB0byBzdGFydCBpbiBhIGtub3duLCBjbGVhbiBzdGF0ZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudC4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gY2hlY2sgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIG5vdCBvbmx5IHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAqYW55d2hlcmUqIGBsYmAgb3IgYG1pZ3JhdGVfc3RydWN0YCBpcyB1c2VkIGlzIHJldmlld2VkLiBUaGVyZSBtaWdodCBiZSBhbiBhc3N1bXB0aW9uIGxhdGVyIG9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgemVybyBpbml0aWFsaXphdGlvbi4gSSYjMzk7bGwgbmVlZCB0byB0cmFjZSB0aGUgY29udHJvbCBmbG93IGFuZCBkYXRhIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIGRpZyBkZWVwZXIgYW5kIGdldCBhIGNsZWFyIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9taWdyYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU1MDpcdFx0XHRcdGdvdG8gZXJyX291dDtcbiA1NTE6XHRcdH1cbiA1NTI6XHRcdC8qXG4gNTUzOlx0XHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcbiA1NTQ6XHRcdCAqL1xuIDU1NTpcdFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcdTAwMjZsYik7XG4gNTU2Olx0ZXJyX291dDpcbiA1NTc6XHRcdGlmIChyZXR2YWwpXG4gNTU4Olx0XHRcdC8qXG4gNTU5Olx0XHRcdCAqIEZhaWx1cmUgY2FzZSBkZWxldGUgdGhlIGV4dGVudCBpbmZvcm1hdGlvbiB3aXRoIHRoZVxuIDU2MDpcdFx0XHQgKiB0bXBfaW5vZGVcbiA1NjE6XHRcdFx0ICovXG4gNTYyOlx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NjM6XHRcdGVsc2Uge1xuIDU2NDpcdFx0XHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcbiA1NjU6XHRcdFx0aWYgKHJldHZhbClcbiA1NjY6XHRcdFx0XHQvKlxuIDU2NzpcdFx0XHRcdCAqIGlmIHdlIGZhaWwgdG8gc3dhcCBpbm9kZSBkYXRhIGZyZWUgdGhlIGV4dGVudFxuIDU2ODpcdFx0XHRcdCAqIGRldGFpbHMgb2YgdGhlIHRtcCBpbm9kZVxuIDU2OTpcdFx0XHRcdCAqL1xuIDU3MDpcdFx0XHRcdGZyZWVfZXh0X2Jsb2NrKGhhbmRsZSwgdG1wX2lub2RlKTtcbiA1NzE6XHRcdH1cbiA1NzI6XHRcbiA1NzM6XHRcdC8qIFdlIG1hcmsgdGhlIHRtcF9pbm9kZSBkaXJ0eSB2aWEgZXh0NF9leHRfdHJlZV9pbml0LiAqL1xuIDU3NDpcdFx0cmV0dmFsID0gZXh0NF9qb3VybmFsX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgMSwgMCk7XG4gNTc1Olx0XHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuIDU3NjpcdFx0XHRnb3RvIG91dF9zdG9wO1xuIDU3NzpcdFx0LypcbiA1Nzg6XHRcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cbiA1Nzk6XHRcdCAqL1xuIDU4MDpcdFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XG4gNTgxOlx0XG4gNTgyOlx0XHQvKlxuIDU4MzpcdFx0ICogc2V0IHRoZSAgaV9ibG9ja3MgY291bnQgdG8gemVyb1xuIDU4NDpcdFx0ICogc28gdGhhdCB0aGUgZXh0NF9ldmljdF9pbm9kZSgpIGRvZXMgdGhlXG4gNTg1Olx0XHQgKiByaWdodCBqb2JcbiA1ODY6XHRcdCAqXG4gNTg3Olx0XHQgKiBXZSBkb24mIzM5O3QgbmVlZCB0byB0YWtlIHRoZSBpX2xvY2sgYmVjYXVzZVxuIDU4ODpcdFx0ICogdGhlIGlub2RlIGlzIG5vdCB2aXNpYmxlIHRvIHVzZXIgc3BhY2UuXG4gNTg5Olx0XHQgKi9cbiA1OTA6XHRcdHRtcF9pbm9kZS1cdTAwM2VpX2Jsb2NrcyA9IDA7XG4gNTkxOlx0XHRFWFQ0X0kodG1wX2lub2RlKS1cdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XG4gNTkyOlx0XG4gNTkzOlx0XHQvKiBSZXNldCB0aGUgZXh0ZW50IGRldGFpbHMgKi9cbiA1OTQ6XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XG4gNTk1Olx0b3V0X3N0b3A6XG4gNTk2Olx0XHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xuIDU5NzpcdG91dF90bXBfaW5vZGU6XG4gNTk4Olx0XHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XG4gNTk5Olx0b3V0X3VubG9jazpcbiA2MDA6XHRcdGV4dDRfd3JpdGVwYWdlc191cF93cml0ZShpbm9kZS1cdTAwM2VpX3NiLCBhbGxvY19jdHgpO1xuIDYwMTpcdFx0aXB1dCh0bXBfaW5vZGUpO1xuIDYwMjpcdFx0cmV0dXJuIHJldHZhbDtcbiA2MDM6XHR9XG4gNjA0Olx0XG4gNjA1Olx0LypcbiA2MDY6XHQgKiBNaWdyYXRlIGEgc2ltcGxlIGV4dGVudC1iYXNlZCBpbm9kZSB0byB1c2UgdGhlIGlfYmxvY2tzW10gYXJyYXlcbiA2MDc6XHQgKi9cbiA2MDg6XHRpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIDYwOTpcdHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA2MTMKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiB0aGUgRXh0NCBGaWxlc3lzdGVtIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB3aGF0IGl0JiMzOTtzIGFkZHJlc3NpbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoZXJlJiMzOTtzIGEgcG90ZW50aWFsIGludGVnZXIgb3ZlcmZsb3cgaXNzdWUgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSYjMzk7cyBtaWdyYXRpb24gc3RydWN0dXJlLiBTcGVjaWZpY2FsbHksIGl0IGxvb2tzIGxpa2Ugd2l0aGluIHRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCwgdGhlIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBtZW1iZXJzIGFyZSBhbGwgZGVmaW5lZCBhcyBgZXh0NF9sYmxrX3RgLCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGEgYHUzMmAg4oCTIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCgpUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBzZWVtcyB0byBiZSB3aXRoIGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgYGN1cnJfYmxvY2tgLiBUaGUgcGF0Y2ggbWVudGlvbnMgYW4gb3BlcmF0aW9uIGxpa2UgYGxiLSZndDtjdXJyX2Jsb2NrICYjNDM7PSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzYCBhbmQgaW5jcmVtZW50cyB3aXRoaW4gaW5kaXJlY3QgYmxvY2sgdHJhdmVyc2Fscy4gVGhpcyBpcyB3aGVyZSBJIHNlZSB0aGUgaW1tZWRpYXRlIHJlZCBmbGFnLiBXaXRoIHBvdGVudGlhbGx5IGxhcmdlIGZpbGVzeXN0ZW1zLCBsYXJnZSBibG9jayBzaXplcywgb3IgZXZlbiBjYXJlZnVsbHkgY29uc3RydWN0ZWQgaW5kaXJlY3QgdHJlZXMsIHRob3NlIG11bHRpcGxpY2F0aW9ucyBhbmQgaW5jcmVtZW50cyBjb3VsZCBlYXNpbHkgcHVzaCBgY3Vycl9ibG9ja2AgYmV5b25kIHRoZSBsaW1pdHMgb2YgYSAzMi1iaXQgaW50ZWdlciwgbGVhZGluZyB0byBhIHdyYXAtYXJvdW5kIGNvbmRpdGlvbi4gVGhhdCBtZWFucyBgY3Vycl9ibG9ja2AgY291bGQgYmVjb21lIGEgc21hbGxlciB2YWx1ZSB0aGFuIGV4cGVjdGVkLCBsZWFkaW5nIHRvIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb3IgZXZlbiBjb3JydXB0aW9uLgoKVGhlIHBhdGNoJiMzOTtzIGFkZGl0aW9uIG9mIGEgYGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTYCBjaGVjayBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUgZml4LiBJdCYjMzk7cyBkZXNpZ25lZCB0byBwcmV2ZW50IHVzIGZyb20gZXhjZWVkaW5nIHRoZSBtYXhpbXVtIGV4dGVudCBibG9jayBudW1iZXIgd2hpY2ggaXMgZGVmaW5lZCBieSBgRVhUX01BWF9CTE9DS1NgLiBJJiMzOTttIGdvaW5nIHRvIHF1aWNrbHkgdmVyaWZ5IHdoYXQgYEVYVF9NQVhfQkxPQ0tTYCBhY3R1YWxseSAqaXMqLiBLbm93aW5nIHRoYXQgd2lsbCBjb25maXJtIHRoYXQgdGhpcyBjaGVjayBpcyBzdWZmaWNpZW50IGluIHByZXZlbnRpbmcgdGhlIG92ZXJmbG93IG9yIGlmIHNvbWUgZnVydGhlciByZWZpbmVtZW50IGlzIHJlcXVpcmVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFRfTUFYX0JMT0NLUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM4OTY9c3RydWN0IGV4dDRfZXh0ZW50O1xuLS1cbmZzL2V4dDQvZXh0NC5oLTM5MDEtICovXG5mcy9leHQ0L2V4dDQuaDozOTAyOiNkZWZpbmUgRVhUX01BWF9CTE9DS1NcdDB4ZmZmZmZmZmZcbmZzL2V4dDQvZXh0NC5oLTM5MDMtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTUzMT1zdGF0aWMgaW50IGV4dDRfZXh0X3NlYXJjaF9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzMtICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6XG5mcy9leHQ0L2V4dGVudHMuYzoxNjM0OiAqIHJldHVybnMgYWxsb2NhdGVkIGJsb2NrIGluIHN1YnNlcXVlbnQgZXh0ZW50IG9yIEVYVF9NQVhfQkxPQ0tTLlxuZnMvZXh0NC9leHRlbnRzLmMtMTYzNS0gKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXNcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0xNjQwPWV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDctXHRpZiAoZGVwdGggPT0gMCBcdTAwMjZcdTAwMjYgcGF0aC1cdTAwM2VwX2V4dCA9PSBOVUxMKVxuZnMvZXh0NC9leHRlbnRzLmM6MTY0ODpcdFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY0OS1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY0LVxuZnMvZXh0NC9leHRlbnRzLmM6MTY2NTpcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjYtfVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjktICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOlxuZnMvZXh0NC9leHRlbnRzLmM6MTY3MDogKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLU1xuZnMvZXh0NC9leHRlbnRzLmMtMTY3MS0gKi9cbmZzL2V4dDQvZXh0ZW50cy5jPTE2NzI9c3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0xNjgwLVx0aWYgKGRlcHRoID09IDApXG5mcy9leHQ0L2V4dGVudHMuYzoxNjgxOlx0XHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy0xNjgyLVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTMtXG5mcy9leHQ0L2V4dGVudHMuYzoxNjk0Olx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xuZnMvZXh0NC9leHRlbnRzLmMtMTY5NS19XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTk0Mj1zdGF0aWMgdW5zaWduZWQgaW50IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE5NjMtXHRcdGIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzoxOTY0Olx0XHRpZiAoYjIgPT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYy0xOTY1LVx0XHRcdGdvdG8gb3V0O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzAtXHRpZiAoYjEgJiM0MzsgbGVuMSBcdTAwM2MgYjEpIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NzE6XHRcdGxlbjEgPSBFWFRfTUFYX0JMT0NLUyAtIGIxO1xuZnMvZXh0NC9leHRlbnRzLmMtMTk3Mi1cdFx0bmV3ZXh0LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGxlbjEpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTI9ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDItXHRmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpO1xuZnMvZXh0NC9leHRlbnRzLmM6MjEwMzpcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDQtXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVx1MDAzZWVlX2Jsb2NrKSBcdTAwM2UgbGUzMl90b19jcHUoZmV4LVx1MDAzZWVlX2Jsb2NrKSlcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDUtXHRcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzoyMTA2Olx0aWYgKG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHtcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDctXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpucGF0aDtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yMjgwPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9maW5kX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yMjkxLVx0XHQqbGJsayA9IDA7XG5mcy9leHQ0L2V4dGVudHMuYzoyMjkyOlx0XHRsZW4gPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTMtXHR9IGVsc2UgaWYgKCpsYmxrIFx1MDAzYyBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykpIHtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0yNjIyPWV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYxLVx0XHRpZiAobnVtID09IDApIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NjI6XHRcdFx0aWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcbmZzL2V4dDQvZXh0ZW50cy5jLTI3NjMtXHRcdFx0XHQvKlxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTI4NDU9aW50IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0yODc4LVx0ICovXG5mcy9leHQ0L2V4dGVudHMuYzoyODc5Olx0aWYgKGVuZCBcdTAwM2MgRVhUX01BWF9CTE9DS1MgLSAxKSB7XG5mcy9leHQ0L2V4dGVudHMuYy0yODgwLVx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ1NTE9aW50IGV4dDRfZXh0X3RydW5jYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDU3MC1cdFx0XHRcdTAwM2VcdTAwM2UgRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDU3MTpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzItXG5mcy9leHQ0L2V4dGVudHMuYy00NTczLXJldHJ5X3JlbW92ZV9zcGFjZTpcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzQ6XHRlcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gMSk7XG5mcy9leHQ0L2V4dGVudHMuYy00NTc1LVx0aWYgKGVyciA9PSAtRU5PTUVNKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTM0Mj1pbnQgZXh0NF9nZXRfZXNfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01Mzc3LVx0bGFzdF9ibGsgPSAoc3RhcnQgJiM0MzsgbGVuIC0gMSkgXHUwMDNlXHUwMDNlIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemVfYml0cztcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzg6XHRpZiAobGFzdF9ibGsgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzk6XHRcdGxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTtcbmZzL2V4dDQvZXh0ZW50cy5jLTUzODAtXHRsZW5fYmxrcyA9ICgoZXh0NF9sYmxrX3QpIGxhc3RfYmxrKSAtIHN0YXJ0X2JsayAmIzQzOyAxO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU0OTQ9ZXh0NF9leHRfc2hpZnRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDEtXHRleHQ0X2xibGtfdCBzdG9wLCAqaXRlcmF0b3IsIGV4X3N0YXJ0LCBleF9lbmQ7XG5mcy9leHQ0L2V4dGVudHMuYzo1NTAyOlx0ZXh0NF9sYmxrX3QgdG1wID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2V4dGVudHMuYy01NTAzLVxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNC1cdC8qIExldCBwYXRoIHBvaW50IHRvIHRoZSBsYXN0IGV4dGVudCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTUwNTpcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG5mcy9leHQ0L2V4dGVudHMuYy01NTA2LVx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTE5LVx0KiBhY2NvbW1vZGF0ZSB0aGUgc2hpZnQuICBGb3IgcmlnaHQgc2hpZnRzLCBtYWtlIHN1cmUgdGhlIGxhc3QgZXh0ZW50XG5mcy9leHQ0L2V4dGVudHMuYzo1NTIwOlx0KiB3b24mIzM5O3QgYmUgc2hpZnRlZCBiZXlvbmQgRVhUX01BWF9CTE9DS1MuXG5mcy9leHQ0L2V4dGVudHMuYy01NTIxLVx0Ki9cbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01NTQzLVx0fSBlbHNlIHtcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NDQ6XHRcdGlmIChzaGlmdCBcdTAwM2UgRVhUX01BWF9CTE9DS1MgLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU0NS1cdFx0ICAgIChzdG9wICYjNDM7IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4dGVudCkpKSB7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNTU2Mi1cbmZzL2V4dDQvZXh0ZW50cy5jOjU1NjM6XHRpZiAodG1wICE9IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9leHRlbnRzLmMtNTU2NC1cdFx0Kml0ZXJhdG9yID0gdG1wO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTU2Mzc9c3RhdGljIGludCBleHQ0X2NvbGxhcHNlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTUtXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTY5NjpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTctXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTczOD1zdGF0aWMgaW50IGV4dDRfaW5zZXJ0X3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzItXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XG5mcy9leHQ0L2V4dGVudHMuYzo1ODMzOlx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNTgzNC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz01ODc1PWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzEtXHRcdFx0LyogRG8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gc3dhcCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6NTkzMjpcdFx0XHRpZiAobmV4dDEgPT0gRVhUX01BWF9CTE9DS1MgfHwgbmV4dDIgPT0gRVhUX01BWF9CTE9DS1MpXG5mcy9leHQ0L2V4dGVudHMuYy01OTMzLVx0XHRcdFx0Z290byBlcnJvdXQ7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjI2MS1cdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG5mcy9leHQ0L2V4dGVudHMuYzo2MjYyOlx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjMtXHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjMzOT1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzUwLVx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbmZzL2V4dDQvZXh0ZW50cy5jOjYzNTE6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1Mi1cdFx0XHRcdFx0RVhUNF9FWF9OT0NBQ0hFKTtcbi0tXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NTkxPXN0YXRpYyBpbnQgZXh0NF9lc19jYW5fYmVfbWVyZ2VkKHN0cnVjdCBleHRlbnRfc3RhdHVzICplczEsXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5Ni1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo1OTc6XHRpZiAoKChfX3U2NCkgZXMxLVx1MDAzZWVzX2xlbikgJiM0MzsgZXMyLVx1MDAzZWVzX2xlbiBcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHtcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy01OTgtXHRcdHByX3dhcm4oXCYjMzQ7RVMgYXNzZXJ0aW9uIGZhaWxlZCB3aGVuIG1lcmdpbmcgZXh0ZW50cy4gXCYjMzQ7XG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMC1cdFx0XHRcJiMzNDtpcyBiaWdnZXIgdGhhbiBhbGxvd2VkIGZpbGUgc2l6ZSAoJWQpXFxuXCYjMzQ7LFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjYwMTpcdFx0XHRlczEtXHUwMDNlZXNfbGVuLCBlczItXHUwMDNlZXNfbGVuLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAyLVx0XHRXQVJOX09OKDEpO1xuLS1cbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYz0xOTQzPXN0YXRpYyBpbnQgZXNfcmVjbGFpbV9leHRlbnRzKHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpLCBpbnQgKm5yX3RvX3NjYW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTE5NTctXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6MTk1ODpcdGlmICghZXNfZG9fcmVjbGFpbV9leHRlbnRzKGVpLCBFWFRfTUFYX0JMT0NLUywgbnJfdG9fc2NhbiwgXHUwMDI2bnJfc2hydW5rKSBcdTAwMjZcdTAwMjZcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU5LVx0ICAgIHN0YXJ0ICE9IDApXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMTc9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNS1cdFx0Y3VyID0gMDtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMzM2Olx0XHRlbmQgPSBFWFRfTUFYX0JMT0NLUztcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM3LVx0XHRpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKSB7XG4tLVxuZnMvZXh0NC9pbmRpcmVjdC5jPTExMTI9dm9pZCBleHQ0X2luZF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM1LVxuZnMvZXh0NC9pbmRpcmVjdC5jOjExMzY6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNy1cbi0tXG5mcy9leHQ0L2lubGluZS5jPTE4NjI9aW50IGV4dDRfaW5saW5lX2RhdGFfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50ICpoYXNfaW5saW5lKVxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTkwOC1cdFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKSlcbmZzL2V4dDQvaW5saW5lLmM6MTkwOTpcdFx0XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvaW5saW5lLmMtMTkxMC1cbi0tXG5mcy9leHQ0L2lub2RlLmM9NzAwPWludCBleHQ0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lub2RlLmMtNzIyLVxuZnMvZXh0NC9pbm9kZS5jOjcyMzpcdC8qIFdlIGNhbiBoYW5kbGUgdGhlIGJsb2NrIG51bWJlciBsZXNzIHRoYW4gRVhUX01BWF9CTE9DS1MgKi9cbmZzL2V4dDQvaW5vZGUuYzo3MjQ6XHRpZiAodW5saWtlbHkobWFwLVx1MDAzZW1fbGJsayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSlcbmZzL2V4dDQvaW5vZGUuYy03MjUtXHRcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xuLS1cbmZzL2V4dDQvaW5vZGUuYz0yMTczPXN0YXRpYyBpbnQgbXBhZ2VfcHJvY2Vzc19wYWdlX2J1ZnMoc3RydWN0IG1wYWdlX2RhX2RhdGEgKm1wZCxcbi0tXG5mcy9leHQ0L2lub2RlLmMtMjE4Mi1cdGlmIChleHQ0X3Zlcml0eV9pbl9wcm9ncmVzcyhpbm9kZSkpXG5mcy9leHQ0L2lub2RlLmM6MjE4MzpcdFx0YmxvY2tzID0gRVhUX01BWF9CTE9DS1M7XG5mcy9leHQ0L2lub2RlLmMtMjE4NC1cbi0tXG5mcy9leHQ0L2lub2RlLmM9NjAwOT1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTYxNzItXHRcdFx0XHRcdGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemVfYml0cyxcbmZzL2V4dDQvaW5vZGUuYzo2MTczOlx0XHRcdFx0XHRFWFRfTUFYX0JMT0NLUyAtIDEpO1xuZnMvZXh0NC9pbm9kZS5jLTYxNzQtXHRcdFx0ZWxzZVxuLS1cbmZzL2V4dDQvaW9jdGwuYz0zMTM9c3RhdGljIHZvaWQgc3dhcF9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMilcbi0tXG5mcy9leHQ0L2lvY3RsLmMtMzQxLVx0c3dhcChlaTEtXHUwMDNlaV9kaXNrc2l6ZSwgZWkyLVx1MDAzZWlfZGlza3NpemUpO1xuZnMvZXh0NC9pb2N0bC5jOjM0MjpcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTEsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvaW9jdGwuYzozNDM6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUyLCAwLCBFWFRfTUFYX0JMT0NLUyk7XG5mcy9leHQ0L2lvY3RsLmMtMzQ0LVxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jPTQ1MTk9ZXh0NF9tYl9ub3JtYWxpemVfcmVxdWVzdChzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLFxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDUtXHQvKiBhdm9pZCB1bm5lY2Vzc2FyeSBwcmVhbGxvY2F0aW9uIHRoYXQgbWF5IHRyaWdnZXIgYXNzZXJ0aW9ucyAqL1xuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNjpcdGlmIChzdGFydCAmIzQzOyBzaXplIFx1MDAzZSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvbWJhbGxvYy5jOjQ2MDc6XHRcdHNpemUgPSBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0O1xuZnMvZXh0NC9tYmFsbG9jLmMtNDYwOC1cbi0tXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cbmZzL2V4dDQvbWlncmF0ZS5jOjcwOlx0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbmZzL2V4dDQvbWlncmF0ZS5jLTcxLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4tLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jPTUxNz1zdGF0aWMgaW50IG1leHRfY2hlY2tfYWRqdXN0X3JhbmdlKHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSxcbi0tXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTMwLVxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMTpcdGlmICgob3JpZ19zdGFydCBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMjpcdCAgICAoZG9ub3Jfc3RhcnQgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzM6XHQgICAgKCpsZW4gXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNDpcdCAgICAoZG9ub3Jfc3RhcnQgJiM0MzsgKmxlbiBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNTpcdCAgICAob3JpZ19zdGFydCAmIzQzOyAqbGVuIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKSAge1xuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzNi1cdFx0ZXh0NF9kZWJ1ZyhcJiMzNDtleHQ0IG1vdmUgZXh0ZW50OiBDYW4mIzM5O3QgaGFuZGxlIG92ZXIgWyV1XSBibG9ja3MgW2lubzpvcmlnICVsbHUsIGRvbm9yICVsbHVdXFxuXCYjMzQ7LFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNzpcdFx0XHQgICBFWFRfTUFYX0JMT0NLUyxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzgtXHRcdFx0ICAgb3JpZ19pbm9kZS1cdTAwM2VpX2lubywgZG9ub3JfaW5vZGUtXHUwMDNlaV9pbm8pO1xuLS1cbmZzL2V4dDQvc3VwZXIuYz0xNTM5PXZvaWQgZXh0NF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvc3VwZXIuYy0xNTY4LVx0cmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpO1xuZnMvZXh0NC9zdXBlci5jOjE1Njk6XHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcbmZzL2V4dDQvc3VwZXIuYy0xNTcwLVx0ZHF1b3RfZHJvcChpbm9kZSk7XG4tLVxuZnMvZXh0NC92ZXJpdHkuYz0yNzE9c3RhdGljIGludCBleHQ0X2dldF92ZXJpdHlfZGVzY3JpcHRvcl9sb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvdmVyaXR5LmMtMjkzLVxuZnMvZXh0NC92ZXJpdHkuYzoyOTQ6XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLCAwKTtcbmZzL2V4dDQvdmVyaXR5LmMtMjk1LVx0aWYgKElTX0VSUihwYXRoKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYyMzkKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgdGhlIEdlbmVzaXMgb2YgVGhpcyBDaGFuZ2UqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMgY2hhbmdlLiBUaGUgY29kZSBpdHNlbGYgKnNlZW1zKiBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBidXQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgaXQg4oCTIHRoZSAmIzM0O3doeSYjMzQ7IOKAkyBpcyBhbHdheXMgdGhlIGNydWNpYWwgcGllY2UsIGlzbiYjMzk7dCBpdD8gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGRpdmUgaW50byB0aGUgR2l0IGhpc3RvcnkuIExldCYjMzk7cyBzdGFydCB3aXRoIGBnaXQgbG9nYC4gSSB3YW50IHRvIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kaWZpY2F0aW9uLiBUaGF0IG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNvbnRleHQsIHRoZSBidWcgcmVwb3J0IG51bWJlciAoaG9wZWZ1bGx5ISksIHRoZSByZWFzb25pbmcsIG9yIGF0IGxlYXN0IGEgcmVmZXJlbmNlIHRvIHRoZSB0aWNrZXQgdGhhdCBzcHVycmVkIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrLiBJZGVhbGx5LCB0aGUgY29tbWl0IGxvZyB3aWxsIGNsYXJpZnkgdGhlIG9yaWdpbmFsIGludGVudGlvbiBhbmQgY29ubmVjdCBtZSB0byB0aGUgcmVsZXZhbnQgcHJvYmxlbSBvciBmZWF0dXJlIHJlcXVlc3QuIEZyb20gdGhlcmUsIEkmIzM5O2xsIGFzc2VzcyB0aGUgY29tbWl0JiMzOTtzIGxpbmVhZ2UgYW5kIGFueSByZWxhdGVkIGJyYW5jaGVzIHRvIGdldCBhIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoaXMgY2hhbmdlIGV2b2x2ZWQuIEkgY2FuIHVzdWFsbHkgZ2xlYW4gYSBsb3QgZnJvbSB0aGUgaGlzdG9yeSBpdHNlbGYsIGJ1dCBJIGFtIGhvcGluZyB0aGF0IEkgd29uJiMzOTt0IGhhdmUgdG8gc3RhcnQgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgaXNzdWUgYmFzZWQgb24gb25seSB0aGUgZGlmZi4gVWx0aW1hdGVseSwgbXkgZ29hbCBpcyB0byB0cmFjZSB0aGlzIGNoYW5nZSBiYWNrIHRvIGl0cyBvcmlnaW4sIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlLCBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCBhZGRyZXNzZWQgdGhlIG5lZWQgZWZmZWN0aXZlbHkgd2l0aGluIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbWlncmF0ZS5jPTY1PXN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvbWlncmF0ZS5jLTY5LVxuZnMvZXh0NC9taWdyYXRlLmM6NzA6XHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY2NTAKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA3MTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJbnRlZ2VyIE92ZXJmbG93IEZpeCBpbiBleHQ0X2V4dF9taWdyYXRlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0aGF0IGludm9sdmVzIGEgbG9jYWwgc3RydWN0IGNhbGxlZCBgbWlncmF0ZV9zdHJ1Y3RgIChhbGlhc2VkIGFzIGBsYmAgaW4gdGhlIGNvZGUpLiBUaGUga2V5IGNoYW5nZSBhcHBlYXJzIHRvIGJlIGJ1bXBpbmcgdGhlIHNpemUgb2Ygc29tZSBibG9jayBudW1iZXIgZmllbGRzIHdpdGhpbiBgbGJgIGZyb20gMzItYml0IChgZXh0NF9sYmxrX3RgLCBha2EgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApLgoKTXkgZmlyc3QgdGhvdWdodCBpcyBhbHdheXMsIGRvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2UgYW55IHBvdGVudGlhbCBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzPyBMZXQmIzM5O3MgZ28gdGhyb3VnaCB0aGUgY2hlY2tsaXN0LgoKMS4gICoqVXNlcnNwYWNlIEV4cG9zdXJlOioqIElzIHRoaXMgbmV3IGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFueSB3YXk/IFRoYW5rZnVsbHksIG5vLiBUaGlzIHN0cnVjdCBpcyBsb2NhbCB0byB0aGUgYG1pZ3JhdGUuY2AgZmlsZSBhbmQgbmV2ZXIgYXBwZWFycyB0byBiZSBjb3BpZWQgb3V0IHZpYSBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluaywgaW9jdGwsIHNvY2tldHMsIG9yIEJQRi4gTm8gaXNzdWUgaGVyZS4KCjIuICAqKlVuaW5pdGlhbGl6ZWQgVmFyaWFibGVzOioqIElzIHRoZXJlIGFueSBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBtaWdodCBkZXBlbmQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIGBsYmAgaXMgKmV4cGxpY2l0bHkqIGluaXRpYWxpemVkIHRvIGFsbCB6ZXJvcyB3aXRoIGBtZW1zZXQoJmFtcDtsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSBhbnkgdXNlLiBUaGF0JiMzOTtzIGdvb2QgZGVmZW5zaXZlIHByb2dyYW1taW5nLgoKMy4gICoqQ29tcGxleCBEYXRhIFN0cnVjdHVyZSBJbml0aWFsaXphdGlvbjoqKiBJcyB0aGVyZSBhbnkgYWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBtb3JlIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcyB3aGVyZSBmaWVsZHMgY291bGQgYmUgdW5pbml0aWFsaXplZD8gTm8gYWdhaW4uIFRoaXMgYGxiYCBzdHJ1Y3QgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBhbmQgemVyb2VkLCBzbyB3ZSYjMzk7cmUgZ29vZCB0aGVyZS4KCjQuICAqKkJvdW5kcyBDaGVja2luZyBhbmQgTWVtb3J5IEFjY2VzczoqKiBJcyB0aGVyZSBhIHBvdGVudGlhbCBmb3IgYm91bmRzLWNoZWNrIGJ5cGFzc2VzIG9yIGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGRhdGEgaW4gc3Vycm91bmRpbmcgYnVmZmVycz8gV2VsbCwgdGhlIGNyaXRpY2FsIGxpbmUgYGxiLSZndDtjdXJyX2Jsb2NrICZndDs9IEVYVF9NQVhfQkxPQ0tTYCBsb29rcyBsaWtlIGEga2V5IGJvdW5kcyBjaGVjay4gVGhlIHBhdGNoIGlzIHByZXZlbnRpbmcgYGxiLSZndDtjdXJyX2Jsb2NrYCAobm93IGEgNjQtYml0IHZhbHVlKSBmcm9tIGV4Y2VlZGluZyBgRVhUX01BWF9CTE9DS1NgLCB3aGljaCBsb29rcyBsaWtlIGEgaGFyZGNvZGVkIGNvbnN0YW50IHJlbGF0aW5nIHRvIGV4dGVudHMuIElmIGl0ICpkb2VzKiBnbyBiZXlvbmQsIHdlIGdldCBhIG5pY2UgYC1FT1BOT1RTVVBQYCBlcnJvci4gSXQmIzM5O3MgY2xlYXIgdGhhdCAqYmVmb3JlKiB0aGUgY2hhbmdlLCBhbiBvdmVyZmxvdyBvbiB0aGlzIDMyLWJpdCBmaWVsZCB3YXMgYSBwb3RlbnRpYWwgcHJvYmxlbS4gSXQgY291bGQgbGVhZCB0byB3cmFwcGluZyBhbmQgY29ycnVwdCBleHRlbnQgbWFuaXB1bGF0aW9ucy4KClNvLCB0aGlzIGxvb2tzIGxpa2UgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBmaXguIElmIGBsYi0mZ3Q7Y3Vycl9ibG9ja2Agd2VyZSB0byBleGNlZWQgYEVYVF9NQVhfQkxPQ0tTYCBvbiBhIGNvcnJ1cHQgb3Igb3RoZXJ3aXNlIG1hbGljaW91cyBmaWxlc3lzdGVtLCB0aGUgbWlncmF0aW9uIG1pZ2h0IGhhdmUgbWVzc2VkIHVwIGV4dGVudHMuIFNvIGZhciwgc28gZ29vZC4KCk5vdywgbGV0JiMzOTtzIGRvdWJsZS1jaGVjay4gSSBzZWUgdGhhdCB0aGUgYG5ld2V4dGAgdmFyaWFibGUgaXMgYSBgc3RydWN0IGV4dDRfZXh0ZW50YCwgd2hpY2ggaXMgcGFzc2VkIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSXQmIzM5O3MgcG9wdWxhdGVkIHVzaW5nIGRhdGEgZnJvbSBgbGJgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgKmV2ZXJ5KiBmaWVsZCBvZiBgbmV3ZXh0YCBpcyBhc3NpZ25lZCAqYmVmb3JlKiBpdCBnZXRzIHVzZWQuIEFuZCB0aGUgY29kZSBjb25maXJtcyBpdC4KVGhlIGFzc2lnbm1lbnRzIHRvIGBuZXdleHQuZWVfYmxvY2tgLCBgbmV3ZXh0LmVlX2xlbmAsIGFuZCB0aGUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgY2FsbHMsIHdoaWNoIHNldCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVycywgbG9vayBjbGVhbi4gSSB0aGluayB3ZSBhcmUgc2FmZSBoZXJlLCB0aGUgZml4IGlzIHZhbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwODo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgZXh0NF9leHRlbnQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01NS0gKi9cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXHRfX2xlMzJcdGVlX2Jsb2NrO1x0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTk1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBFeHQ0JiMzOTtzIEV4dGVudCBTdHJ1Y3R1cmVzKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGV4dDRfZXh0ZW50cy5oYC4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBsaW5lcyA1NiB0aHJvdWdoIDY1LiBJJiMzOTttIGd1ZXNzaW5nIHRoYXQgYXJlYSBwcm9iYWJseSBkZXRhaWxzIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGZvciBleHRlbnQtYmFzZWQgZmlsZSBtYXBwaW5nIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBkZWZpbml0aW9ucyBmb3Igc3RydWN0cyB0aGF0IGhvbGQgaW5mb3JtYXRpb24gbGlrZSB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzLCB0aGUgcGh5c2ljYWwgYmxvY2sgYWRkcmVzcywgdGhlIGV4dGVudCBsZW5ndGgsIGFuZCBwb3RlbnRpYWxseSBzb21lIGZsYWdzIG9yIG1ldGFkYXRhIGFib3V0IHRoZSBleHRlbnQuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyBleHQ0IG9yZ2FuaXplcyB0aGVzZSBleHRlbnRzLCBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGF0aW9uIHdpdGhpbiBhIGZpbGUsIGFuZCBob3cgaXQgdHJhbnNsYXRlcyBsb2dpY2FsIGJsb2NrIG51bWJlcnMgdG8gcGh5c2ljYWwgb25lcy4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGZpbGVzeXN0ZW0gbWFuYWdlcyBpdHMgb24tZGlzayBsYXlvdXQsIGFuZCBpbXByb3ZlIG15IGFiaWxpdHkgdG8gdHJvdWJsZXNob290IGV4dDQgcmVsYXRlZCBzdG9yYWdlIGlzc3Vlcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIGFjdHVhbGx5IHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNTY6XHRzdHJ1Y3QgZXh0NF9leHRlbnQge1xuICA1NzpcdFx0X19sZTMyXHRlZV9ibG9jaztcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xuICA1ODpcdFx0X19sZTE2XHRlZV9sZW47XHRcdC8qIG51bWJlciBvZiBibG9ja3MgY292ZXJlZCBieSBleHRlbnQgKi9cbiAgNTk6XHRcdF9fbGUxNlx0ZWVfc3RhcnRfaGk7XHQvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjA6XHRcdF9fbGUzMlx0ZWVfc3RhcnRfbG87XHQvKiBsb3cgMzIgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xuICA2MTpcdH07XG4gIDYyOlx0XG4gIDYzOlx0LypcbiAgNjQ6XHQgKiBUaGlzIGlzIGluZGV4IG9uLWRpc2sgc3RydWN0dXJlLlxuICA2NTpcdCAqIEl0JiMzOTtzIHVzZWQgYXQgYWxsIHRoZSBsZXZlbHMgZXhjZXB0IHRoZSBib3R0b20uXG4gIDY2Olx0ICovXG4gIDY3Olx0c3RydWN0IGV4dDRfZXh0ZW50X2lkeCB7XG4gIDY4Olx0XHRfX2xlMzJcdGVpX2Jsb2NrO1x0LyogaW5kZXggY292ZXJzIGxvZ2ljYWwgYmxvY2tzIGZyb20gJiMzOTtibG9jayYjMzk7ICovXG4gIDY5Olx0XHRfX2xlMzJcdGVpX2xlYWZfbG87XHQvKiBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBibG9jayBvZiB0aGUgbmV4dCAqXG4gIDcwOlx0XHRcdFx0XHQgKiBsZXZlbC4gbGVhZiBvciBuZXh0IGluZGV4IGNvdWxkIGJlIHRoZXJlICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzI5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgJiMzNDtBbmQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AmIzM0OyBhcyBhIHRob3VnaHQgcHJvY2VzcywgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzc3VtaW5nIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AqKgoKQWxyaWdodCwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEltbWVkaWF0ZWx5LCBteSBicmFpbiBnb2VzIHRvIHRoZSBjb3JlOiBob3cgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCB0aGUgYWxsb2NhdGlvbiBhbmQgc3RvcmFnZSBvZiBwaHlzaWNhbCBibG9ja3Mgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgZXh0ZW50LWJhc2VkIGZpbGVzLiBUaGUgbmFtZSBpdHNlbGYgaXMgcHJldHR5IGNsZWFyOiBpdCYjMzk7cyBhIGZ1bmN0aW9uIG9yIG1lY2hhbmlzbSByZWxhdGVkIHRvIHN0b3JpbmcgKG9yIG1hbmFnaW5nIHRoZSBzdG9yYWdlIG9mKSBwaHlzaWNhbCBibG9ja3MgbGlua2VkIHRvIGFuIGV4dGVudCBzdHJ1Y3R1cmUuCgpNeSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGxheWVycy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaW1wbGljYXRpb25zIGZvciBwZXJmb3JtYW5jZTogaG93IGVmZmljaWVudGx5IGlzIHRoaXMgaGFuZGxpbmcgYmxvY2sgYWxsb2NhdGlvbj8gV2hhdCBhcmUgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcz8gSXMgaXQgb3B0aW1pemVkIGZvciBzZXF1ZW50aWFsIHdyaXRlcywgcmFuZG9tIGFjY2Vzcywgb3IgYm90aD8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgbWFwcGluZywgb3IgaXMgdGhlcmUgc29tZSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0YWRhdGEgaW52b2x2ZWQsIHBvdGVudGlhbGx5IHJlbGF0ZWQgdG8gYmxvY2sgZ3JvdXBzLCBibG9jayBiaXRtYXBzLCBvciBpbm9kZSBzdHJ1Y3R1cmVzPwoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gV2hhdCBoYXBwZW5zIGlmIHRoaXMgZnVuY3Rpb24gZW5jb3VudGVycyBhbiBhbGxvY2F0aW9uIGVycm9yPyBEb2VzIGl0IGdyYWNlZnVsbHkgaGFuZGxlIG91dC1vZi1zcGFjZSBjb25kaXRpb25zLCBvciBkb2VzIGl0IHRyaWdnZXIgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcj8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBpZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgY29uY3VycmVudGx5PyBJJiMzOTttIGltYWdpbmluZyBzY2VuYXJpb3Mgd2hlcmUgbXVsdGlwbGUgdGhyZWFkcyBvciBwcm9jZXNzZXMgY291bGQgYmUgYXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBibG9ja3Mgc2ltdWx0YW5lb3VzbHkuCgpUaGVuIHRoZXJlJiMzOTtzIHRoZSBiaWdnZXIgcGljdHVyZTogaG93IGRvZXMgdGhpcyBmdW5jdGlvbiBpbnRlZ3JhdGUgd2l0aCB0aGUgb3ZlcmFsbCBleHQ0IGFsbG9jYXRpb24gc3RyYXRlZ3k/IElzIGl0IGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGluIGltcGxlbWVudGluZyBmZWF0dXJlcyBsaWtlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvciB0aGUgZmlsZXN5c3RlbSYjMzk7cyBqb3VybmFsaW5nIHN5c3RlbT8gSSBjYW4gc2VlIGl0cyByZWxhdGlvbnNoaXAgdG8gYWxsb2NhdGlvbiBwb2xpY2llcywgaG93IGl0IG1hbmFnZXMgdGhlIGZpbGUmIzM5O3MgYmxvY2tzIGFuZCBob3cgdGhlIG1ldGFkYXRhIGludGVyYWN0cy4gSSBzdGFydCB0byBtZW50YWxseSB0cmFjZSB0aGUgY29kZSBwYXRoOiB3aGVyZSBpcyBpdCBjYWxsZWQgZnJvbT8gV2hhdCBzdHJ1Y3R1cmVzIGRvZXMgaXQgaW50ZXJhY3Qgd2l0aD8gV2hhdCBhcmUgaXRzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMsIGFuZCBob3cgYXJlIHRoZXNlIHZhbHVlcyB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBleHQ0IGZpbGVzeXN0ZW0/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MzM2CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBDb2RlKioKCk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBCYXNlZCBvbiB0aGUgcHJvYmxlbSBhdCBoYW5kLCBJIHRoaW5rIHRoZSBjcml0aWNhbCBjb2RlIHNlZ21lbnQgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGluIGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gSSYjMzk7bSBmb2N1c2luZyBteSBhdHRlbnRpb24gb24gbGluZXMgMjQ2LTI1NSB3aXRoaW4gdGhhdCBmaWxlLiBUaGlzIHJhbmdlIGxpa2VseSBjb250YWlucyB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgcGVyaGFwcyBzb21lIGNyaXRpY2FsIG1hY3JvIGRlZmluaXRpb25zIGRpcmVjdGx5IGludm9sdmVkIGluIHRoZSBleHRlbnQgbWFuYWdlbWVudC4gTGV0JiMzOTtzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQgaW4gdGhlcmUuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCYjMzk7cyBnZXQgc3RhcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDRfZXh0ZW50cy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQ2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNDY6XHRzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXG4gMjQ3Olx0XHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4gMjQ4Olx0e1xuIDI0OTpcdFx0ZXgtXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFx1MDAyNiAweGZmZmZmZmZmKSk7XG4gMjUwOlx0XHRleC1cdTAwM2VlZV9zdGFydF9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiIFx1MDAzZVx1MDAzZSAzMSkgXHUwMDNlXHUwMDNlIDEpIFx1MDAyNlxuIDI1MTpcdFx0XHRcdFx0ICAgICAgMHhmZmZmKTtcbiAyNTI6XHR9XG4gMjUzOlx0XG4gMjU0Olx0LypcbiAyNTU6XHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA4OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NzM1CgkJCQkJCQlvdXRwdXQ6IDIzOAoJCQkJCQkJdGhvdWdodHM6IDQ0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50OiBOZWVkc0tNU0FOID0gZmFsc2UqKgoKT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJJiMzOTttIHByZXR0eSBjb25maWRlbnQgaW4gbXkgYXNzZXNzbWVudC4gVGhlIGBuZXdleHRgIGZpZWxkcyBhcmUgYWxsIGdvb2Qg4oCTIHRoZXkgd2VyZW4mIzM5O3QgZXZlbiB0b3VjaGVkIGhlcmUsIHNvIG5vIGNvbmNlcm5zIHRoZXJlLiBUaGlzIHBhdGNoIGlzIGZvY3VzZWQgc29sZWx5IG9uIHRoZSBgbWlncmF0ZV9zdHJ1Y3RgIGFuZCBtYWtpbmcgc29tZSBjaGFuZ2VzIHJlbGF0ZWQgdG8gaG93IHdlIGhhbmRsZSBsb2dpY2FsIGJsb2NrIG51bWJlcnMsIHNwZWNpZmljYWxseSBleHBhbmRpbmcgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGZyb20gMzItYml0IHRvIDY0LWJpdCBpbnRlZ2Vycy4gVGhlcmUmIzM5O3MgYWxzbyBhIGNoZWNrIGFkZGVkIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBwcmV2ZW50IGV4Y2VlZGluZyB0aGUgYEVYVF9NQVhfQkxPQ0tTYCBsaW1pdC4gRXNzZW50aWFsbHksIGl0JiMzOTtzIGFib3V0IHByZXZlbnRpbmcgYSAzMi1iaXQgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBhbiBleHRlbnQtYmFzZWQgcmVwcmVzZW50YXRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uCgpUaGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBgbGJgLCBvdXIgYG1pZ3JhdGVfc3RydWN0YCBpbnN0YW5jZSwgaXMgaW5pdGlhbGl6ZWQgd2l0aCBgbWVtc2V0KCZhbXA7bGIsIDAsIHNpemVvZihsYikpYCByaWdodCBhdCB0aGUgYmVnaW5uaW5nLiBUaGF0IHplcm9zIG91dCAqZXZlcnl0aGluZyouIFRoZXJlJiMzOTtzIG5vIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGludm9sdmVkLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIEtNU0FOLCBubyB1bmluaXRpYWxpemVkIHJlYWRzLCBhbmQgZGVmaW5pdGVseSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBsZWFrcy4gVGhpcyBjaGFuZ2Ugb25seSBkZWFscyB3aXRoIGZpbGVzeXN0ZW0gbG9naWMsIGludGVnZXIgb3ZlcmZsb3csIGFuZCBib3VuZHMgY2hlY2tzLCBidXQgdGhlc2UgYXJlIG5vdCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIEtNU0FOIGlzIGRlZmluaXRlbHkgbm90IHRoZSByaWdodCB0b29sIGZvciB0aGlzLiBXZSYjMzk7cmUgbG9va2luZyBhdCBzdGFuZGFyZCBpbnRlZ2VyIG92ZXJmbG93IGFuZCBib3VuZGFyeSBjb25kaXRpb25zIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpdHNlbGYuCgpMZXQgbWUgZG8gYSBxdWljayBzYW5pdHkgY2hlY2sgb2YgYWxsIG91ciByZXF1aXJlbWVudHM6CgoqICAgKipOZWVkc0tNU0FOOiBmYWxzZSoqIOKAkyBDb25maXJtZWQuCiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBgbWlncmF0ZV9zdHJ1Y3RgIGlzIHN0YWNrLWFsbG9jYXRlZCBhbmQgY29tcGxldGVseSB6ZXJvZWQuIFRoaXMgcGF0Y2ggYnJvYWRlbnMgdGhlIGxvZ2ljYWwgYmxvY2sgdHJhY2tpbmcgbWVtYmVycyB0byBgdTY0YCBhbmQgYWRkcyBhIGJvdW5kYXJ5IGNoZWNrIGFnYWluc3QgYEVYVF9NQVhfQkxPQ0tTYCB0byBwcmV2ZW50IDMyLWJpdCBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZyBpbmRpcmVjdCBibG9jayBtaWdyYXRpb24gdG8gZXh0ZW50cy4gTm8gbWVtb3J5IGlzIHNoYXJlZCB3aXRoIHVzZXIgc3BhY2UsIHRoZXJlIGFyZSBubyBjb250cm9sLWZsb3cgYnJhbmNoZXMgcmVseWluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgYnVmZmVyIGFjY2VzcyBpcyBpbnRyb2R1Y2VkLiBTdGFuZGFyZCBLQVNBTiBhbmQgZmlsZXN5c3RlbSB0ZXN0IHN1aXRlcyBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoaXMga2luZCBvZiBib3VuZHMvb3ZlcmZsb3cgZml4LiBLTVNBTiB3b3VsZCBiZSBvdmVya2lsbC4gV2UgZG9uJiMzOTt0IG5lZWQgZGVkaWNhdGVkIGZ1enppbmcgaGVyZS4KCkFscmlnaHQsIHRoYXQgY292ZXJzIGl0LiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDg6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXG5cblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cblxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjAuNjE3ODYxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM5NzI1NzIyMTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ1cGRhdGVfZXh0ZW50X3JhbmdlXCIsXG4gICAgXCJleHQ0X2V4dF9taWdyYXRlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYC4gVGhpcyBwcmV2ZW50cyBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGlub2RlcyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBiZWZvcmUgdXNlLiBJdCBpcyBzdHJpY3RseSBpbnRlcm5hbCBrZXJuZWwgbWV0YWRhdGEgYW5kIGlzIG5ldmVyIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJyYW5jaGVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBrZXJuZWwgaW5mby1sZWFrcy4gU3RhbmRhcmQgYnVnIGRldGVjdG9ycyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGV4dDQgYmxvY2sgbWlncmF0aW9uIGxvZ2ljIChjb252ZXJ0aW5nIGluZGlyZWN0LWJsb2NrIG1hcHBlZCBpbm9kZXMgdG8gZXh0ZW50LWJhc2VkIGlub2RlcykgYnkgd2lkZW5pbmcgYmxvY2sgb2Zmc2V0cyBpbiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgZnJvbSAzMi1iaXQgdG8gNjQtYml0IGFuZCBhZGRpbmcgYW4gdXBwZXItYm91bmQgY2hlY2sgYWdhaW5zdCBFWFRfTUFYX0JMT0NLUyBpbiB1cGRhdGVfZXh0ZW50X3JhbmdlKCkgdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgdGhlIEVYVDRfSU9DX01JR1JBVEUgaW9jdGwgYW5kIEZTX0lPQ19TRVRGTEFHUyB3aXRoIEVYVDRfRVhURU5UU19GTCBvbiBleHQ0IGZpbGVzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjAuNjE3ODY1NjdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MDE0ODAxMjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmZWMyYjA2YjA5YzY1NTI0NGFhZTk2OTQ3MjVmZGY5MjJmM2E5MjZhXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcXG5pbmRleCA1ZDYwZWYxMGZlMTEwLi45YWVkNGZkYWU2Nzg3IDEwMDY0NFxcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXFxuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcXG5AQCAtMTQsNyArMTQsNyBAQFxcbiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcXG4gICovXFxuIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuLVxcdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbitcXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XFxuIFxcdGV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrO1xcbiB9O1xcbiBcXG5AQCAtNjYsNiArNjYsMTAgQEAgc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiB7XFxuIFxcdGludCByZXR2YWw7XFxuK1xcbitcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuIFxcdC8qXFxuIFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiBcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjIuMDIwMDUyNTY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMTgwMDkzNjc0MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZmVjMmIwNmIwOWM2NTUyNDRhYWU5Njk0NzI1ZmRmOTIyZjNhOTI2YVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA4OjQzOjE4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuY1xuaW5kZXggNWQ2MGVmMTBmZTExMC4uOWFlZDRmZGFlNjc4NyAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jXG4rKysgYi9mcy9leHQ0L21pZ3JhdGUuY1xuQEAgLTE0LDcgKzE0LDcgQEBcbiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnRcbiAgKi9cbiBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xuLVx0ZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4rXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XG4gXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcbiB9O1xuIFxuQEAgLTY2LDYgKzY2LDEwIEBAIHN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxuIHtcbiBcdGludCByZXR2YWw7XG4rXG4rXHRpZiAobGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4gXHQvKlxuIFx0ICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpXG4gXHQgKi9cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjIyLjAyMDA1NDA1NFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU0MzE5NTg2OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBleHQ0IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIEkndmUgZ290IHRoaXMgcGF0Y2ggYXBwbGllZCB0byBgZnMvZXh0NC9taWdyYXRlLmNgLCBhbmQgbXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBpdHMgaW1wYWN0LiBGaXJzdCwgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGRpZmYgaXRzZWxmLiBJJ2xsIHplcm8gaW4gb24gdGhlIGNoYW5nZXMgYXJvdW5kIGxpbmVzIDE0IGFuZCA2NiBzcGVjaWZpY2FsbHksIGFzIHRoZXNlIGFyZSBvZnRlbiBob3Qgc3BvdHMgZm9yIGNydWNpYWwgbG9naWMgb3IgZGF0YSBzdHJ1Y3R1cmUgbW9kaWZpY2F0aW9ucy4gVGhlbiwgdG8gZ2V0IHRoZSBjb21wbGV0ZSBwaWN0dXJlLCBJJ2xsIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgdGhlIHdob2xlIGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGFyb3VuZCB0aGUgbGluZXMgSSd2ZSBpZGVudGlmaWVkLCBhbmQgYWxsb3cgbWUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHBhcnRpY3VsYXIgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NTcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjI3LjQ1MjAxNjAyOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTEdQTC0yLjFcXG4gICAyOlxcdC8qXFxuICAgMzpcXHQgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3XFxuICAgNDpcXHQgKiBBdXRob3IgQW5lZXNoIEt1bWFyIEsuViBcXHUwMDNjYW5lZXNoLmt1bWFyQGxpbnV4LnZuZXQuaWJtLmNvbVxcdTAwM2VcXG4gICA1OlxcdCAqXFxuICAgNjpcXHQgKi9cXG4gICA3OlxcdFxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJleHQ0X2piZDIuaFxcXCJcXG4gIDEwOlxcdCNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gIDExOlxcdFxcbiAgMTI6XFx0LypcXG4gIDEzOlxcdCAqIFRoZSBjb250aWd1b3VzIGJsb2NrcyBkZXRhaWxzIHdoaWNoIGNhbiBiZVxcbiAgMTQ6XFx0ICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XFxuICAxNTpcXHQgKi9cXG4gIDE2OlxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCB7XFxuICAxNzpcXHRcXHR1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2ssIGN1cnJfYmxvY2s7XFxuICAxODpcXHRcXHRleHQ0X2ZzYmxrX3QgZmlyc3RfcGJsb2NrLCBsYXN0X3BibG9jaztcXG4gIDE5OlxcdH07XFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuICAyMjpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgMjM6XFx0XFxuICAyNDpcXHR7XFxuICAyNTpcXHRcXHRpbnQgcmV0dmFsID0gMCwgbmVlZGVkO1xcbiAgMjY6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4dDtcXG4gIDI3OlxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoO1xcbiAgMjg6XFx0XFx0aWYgKGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPT0gMClcXG4gIDI5OlxcdFxcdFxcdHJldHVybiAwO1xcbiAgMzA6XFx0XFxuICAzMTpcXHRcXHQvKiBBZGQgdGhlIGV4dGVudCB0byB0ZW1wIGlub2RlKi9cXG4gIDMyOlxcdFxcdG5ld2V4dC5lZV9ibG9jayA9IGNwdV90b19sZTMyKGxiLVxcdTAwM2VmaXJzdF9ibG9jayk7XFxuICAzMzpcXHRcXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEpO1xcbiAgMzQ6XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFxcdTAwMjZuZXdleHQsIGxiLVxcdTAwM2VmaXJzdF9wYmxvY2spO1xcbiAgMzU6XFx0XFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG4gIDM2OlxcdFxcdGRvd25fd3JpdGUoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbiAgMzc6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIGxiLVxcdTAwM2VmaXJzdF9ibG9jaywgTlVMTCwgMCk7XFxuICAzODpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuICAzOTpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNDA6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNDE6XFx0XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRcXHQvKlxcbiAgNDQ6XFx0XFx0ICogQ2FsY3VsYXRlIHRoZSBjcmVkaXQgbmVlZGVkIHRvIGluc2VydGluZyB0aGlzIGV4dGVudFxcbiAgNDU6XFx0XFx0ICogU2luY2Ugd2UgYXJlIGRvaW5nIHRoaXMgaW4gbG9vcCB3ZSBtYXkgYWNjdW11bGF0ZSBleHRyYVxcbiAgNDY6XFx0XFx0ICogY3JlZGl0LiBCdXQgYmVsb3cgd2UgdHJ5IHRvIG5vdCBhY2N1bXVsYXRlIHRvbyBtdWNoXFxuICA0NzpcXHRcXHQgKiBvZiB0aGVtIGJ5IHJlc3RhcnRpbmcgdGhlIGpvdXJuYWwuXFxuICA0ODpcXHRcXHQgKi9cXG4gIDQ5OlxcdFxcdG5lZWRlZCA9IGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3Jfc2luZ2xlX2V4dGVudChpbm9kZSxcXG4gIDUwOlxcdFxcdFxcdCAgICBsYi1cXHUwMDNlbGFzdF9ibG9jayAtIGxiLVxcdTAwM2VmaXJzdF9ibG9jayArIDEsIHBhdGgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRyZXR2YWwgPSBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlLCBpbm9kZSwgbmVlZGVkLCBuZWVkZWQsIDApO1xcbiAgNTM6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuICA1NDpcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuICA1NTpcXHRcXHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcXHUwMDI2bmV3ZXh0LCAwKTtcXG4gIDU2OlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuICA1NzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKHBhdGgpO1xcbiAgNTg6XFx0ZXJyX291dDpcXG4gIDU5OlxcdFxcdHVwX3dyaXRlKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiAgNjA6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbiAgNjE6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IDA7XFxuICA2MjpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0XFxuICA2NTpcXHRzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDY2OlxcdFxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgNjc6XFx0e1xcbiAgNjg6XFx0XFx0aW50IHJldHZhbDtcXG4gIDY5OlxcdFxcbiAgNzA6XFx0XFx0aWYgKGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxcbiAgNzE6XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiAgNzI6XFx0XFxuICA3MzpcXHRcXHQvKlxcbiAgNzQ6XFx0XFx0ICogU2VlIGlmIHdlIGNhbiBhZGQgb24gdG8gdGhlIGV4aXN0aW5nIHJhbmdlIChpZiBpdCBleGlzdHMpXFxuICA3NTpcXHRcXHQgKi9cXG4gIDc2OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrIFxcdTAwMjZcXHUwMDI2XFxuICA3NzpcXHRcXHRcXHQobGItXFx1MDAzZWxhc3RfcGJsb2NrKzEgPT0gcGJsb2NrKSBcXHUwMDI2XFx1MDAyNlxcbiAgNzg6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X2Jsb2NrKzEgPT0gbGItXFx1MDAzZWN1cnJfYmxvY2spKSB7XFxuICA3OTpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4MDpcXHRcXHRcXHRsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgODE6XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDgyOlxcdFxcdFxcdHJldHVybiAwO1xcbiAgODM6XFx0XFx0fVxcbiAgODQ6XFx0XFx0LypcXG4gIDg1OlxcdFxcdCAqIFN0YXJ0IGEgbmV3IHJhbmdlLlxcbiAgODY6XFx0XFx0ICovXFxuICA4NzpcXHRcXHRyZXR2YWwgPSBmaW5pc2hfcmFuZ2UoaGFuZGxlLCBpbm9kZSwgbGIpO1xcbiAgODg6XFx0XFx0bGItXFx1MDAzZWZpcnN0X3BibG9jayA9IGxiLVxcdTAwM2VsYXN0X3BibG9jayA9IHBibG9jaztcXG4gIDg5OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9ibG9jayA9IGxiLVxcdTAwM2VsYXN0X2Jsb2NrID0gbGItXFx1MDAzZWN1cnJfYmxvY2s7XFxuICA5MDpcXHRcXHRsYi1cXHUwMDNlY3Vycl9ibG9jaysrO1xcbiAgOTE6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDkyOlxcdH1cXG4gIDkzOlxcdFxcbiAgOTQ6XFx0c3RhdGljIGludCB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgOTU6XFx0XFx0XFx0XFx0XFx0ICAgZXh0NF9mc2Jsa190IHBibG9jayxcXG4gIDk2OlxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuICA5NzpcXHR7XFxuICA5ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAgOTk6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDEwMDpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6MjcuNDUyMTQyMzE4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTE3MTQ1NzUxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIGBtaWdyYXRlLmNgIGluIHRoZSBleHQ0IEZpbGVzeXN0ZW0qKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gdGhlIGV4dDQgZmlsZXN5c3RlbSBhZ2FpbiwgYW5kIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4gTXkgZmlyc3QgdGhvdWdodCBpcywgXCJXaGVyZSdzIHRoZSBlbnRyeSBwb2ludD8gV2hlcmUgaXMgYG1pZ3JhdGUuY2AgYWN0dWFsbHkgKnVzZWQqIHdpdGhpbiB0aGUgbGFyZ2VyIGV4dDQgc3RydWN0dXJlP1wiIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGlvY3RscyBvciBzeXNjYWxscyB0cmlnZ2VyIHRoZSBjb2RlIGluIGBtaWdyYXRlLmNgLiBMZXQncyBzZWUuLi4gSSdsbCBzdGFydCBieSBkb2luZyBhIHRhcmdldGVkIHNlYXJjaCBmb3IgZnVuY3Rpb25zICp3aXRoaW4qIGBmcy9leHQ0L21pZ3JhdGUuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50LiBPbmNlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMsIEkgY2FuIHRyYWNlIGJhY2sgdG8gdGhlIGluaXRpYXRpbmcgcG9pbnRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NjUyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0MzozNi42MjM2MDE3NjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc4NDYxNDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9leHRfbWlncmF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTMyNTQ9aW50IGV4dDRfZm9yY2Vfc2h1dGRvd24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIGZsYWdzKTtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTMyNTYtLyogbWlncmF0ZS5jICovXFxuZnMvZXh0NC9leHQ0Lmg6MzI1NzpleHRlcm4gaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICopO1xcbmZzL2V4dDQvZXh0NC5oLTMyNTgtZXh0ZXJuIGludCBleHQ0X2luZF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTU5MD1zdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0ZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy03MDUtXFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKVxcbmZzL2V4dDQvaW9jdGwuYzo3MDY6XFx0XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuZnMvZXh0NC9pb2N0bC5jLTcwNy1cXHRcXHRlbHNlXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9MTUzOD1zdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jLTE3MDEtXFx0XFx0aW5vZGVfbG9jaygoaW5vZGUpKTtcXG5mcy9leHQ0L2lvY3RsLmM6MTcwMjpcXHRcXHRlcnIgPSBleHQ0X2V4dF9taWdyYXRlKGlub2RlKTtcXG5mcy9leHQ0L2lvY3RsLmMtMTcwMy1cXHRcXHRpbm9kZV91bmxvY2soKGlub2RlKSk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0zOTQ9c3RhdGljIGludCBmcmVlX2V4dF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtNDEzLVxcbmZzL2V4dDQvbWlncmF0ZS5jOjQxNDppbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTQxNS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjM2LjY3MTQ1NDE5MVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2OTU4Njc4NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgZXh0NF9leHRfbWlncmF0ZWAgRnVuY3Rpb24gQ2FsbCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgZXh0NF9leHRfbWlncmF0ZWAgaXMgYmVpbmcgdXRpbGl6ZWQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEkndmUgbm90ZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGZyb20gdHdvIHNwZWNpZmljIGxvY2F0aW9ucy4gVGhlIGZpcnN0IGlzIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AsIHNwZWNpZmljYWxseSB3aGVuIHRoZSBgRlNfSU9DX1NFVEZMQUdTYCBpb2N0bCBpcyB1c2VkIHRvIHNldCB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZy4gTWFrZXMgc2Vuc2U7IHRoYXQncyB3aGVuIHdlJ2QgZXhwZWN0IGFuIGV4dGVudCBtaWdyYXRpb24gdG8gcG90ZW50aWFsbHkgb2NjdXIgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSBmaWxlc3lzdGVtJ3MgYmVoYXZpb3IuIFRoZSBzZWNvbmQgcG9pbnQgb2YgY2FsbCBpcyBgRVhUNF9JT0NfTUlHUkFURWAsIHdoaWNoIGlzIGFub3RoZXIgaW9jdGwsIGxpa2VseSBhIGRpcmVjdCBtaWdyYXRpb24gcmVxdWVzdC5cblxuVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIHRoZSBjb250ZXh0LCBteSBuZXh0IG1vdmUgaXMgdG8gZGl2ZSBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLiBJJ20gZ29pbmcgdG8gZm9jdXMgYXJvdW5kIGxpbmUgMTcwMCBvZiB0aGF0IGZpbGUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIGhlbHAgbWUgZGV0ZXJtaW5lIHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW9jdGwgY2FsbHMsIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGJhY2tncm91bmQgdG8gZnVsbHkgYW5hbHl6ZSBob3cgdGhlc2UgbWlncmF0aW9ucyBhcmUgYmVpbmcgdHJpZ2dlcmVkLiBJdCBzaG91bGQgZ2l2ZSBtZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZvcm0gYSBzdHJvbmcgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGNvZGUgd29ya3MgYW5kIHRoZSBsb2dpYyBiZWhpbmQgaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMDksIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0MzozOS4zNjczMjQzMTZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pb2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2OTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2OTU6XFx0XFx0XFx0LypcXG4xNjk2OlxcdFxcdFxcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxcbjE2OTc6XFx0XFx0XFx0ICogUmVhZCBzdGlsbCBnb2VzIHRocm91Z2guIFdlIHRha2UgaV9kYXRhX3NlbSBpblxcbjE2OTg6XFx0XFx0XFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXFxuMTY5OTpcXHRcXHRcXHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxcbjE3MDA6XFx0XFx0XFx0ICovXFxuMTcwMTpcXHRcXHRcXHRpbm9kZV9sb2NrKChpbm9kZSkpO1xcbjE3MDI6XFx0XFx0XFx0ZXJyID0gZXh0NF9leHRfbWlncmF0ZShpbm9kZSk7XFxuMTcwMzpcXHRcXHRcXHRpbm9kZV91bmxvY2soKGlub2RlKSk7XFxuMTcwNDpcXHRcXHRcXHRtbnRfZHJvcF93cml0ZV9maWxlKGZpbHApO1xcbjE3MDU6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4xNzA2OlxcdFxcdH1cXG4xNzA3OlxcdFxcbjE3MDg6XFx0XFx0Y2FzZSBFWFQ0X0lPQ19BTExPQ19EQV9CTEtTOlxcbjE3MDk6XFx0XFx0e1xcbjE3MTA6XFx0XFx0XFx0aW50IGVycjtcXG4xNzExOlxcdFxcdFxcdGlmICghaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpZG1hcCwgaW5vZGUpKVxcbjE3MTI6XFx0XFx0XFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuMTcxMzpcXHRcXG4xNzE0OlxcdFxcdFxcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjM5LjM2NzQ1MTA3NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg4NTUwODE2MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLlxuXG4qKkVYVDRfSU9DX01JR1JBVEUgRGVlcCBEaXZlKipcblxuQWxyaWdodCwgc28gSSdtIGZvY3VzaW5nIGluIG9uIGBFWFQ0X0lPQ19NSUdSQVRFYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcywgc28gbGV0J3MgZ2V0IGludG8gdGhlIGNvZGUuIExpbmUgMTY5MCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50LCBidXQgSSdsbCBwbGF5IGl0IHNhZmUgYW5kIHNjb3BlIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGZvciBhIGJldHRlciB1bmRlcnN0YW5kaW5nLiBJJ2xsIHRha2UgYSBsb29rIGF0IHRoZSBjb2RlIGJsb2NrIHNwYW5uaW5nIGxpbmVzIDE2ODAgdGhyb3VnaCAxNzAwLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZ3Jhc3AgdGhlIGludGVudCBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzcGVjaWZpYyBmZWF0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTg5LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo0OC4yMjI1Mzg2MDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ0MjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvaW9jdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjgwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjgwOlxcdFxcdFxcdFxcdFxcdHNpemVvZihpbnB1dCkpKVxcbjE2ODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMTY4MjpcXHRcXG4xNjgzOlxcdFxcdFxcdHJldHVybiBleHQ0X2lvY3RsX2dyb3VwX2FkZChmaWxwLCBcXHUwMDI2aW5wdXQpO1xcbjE2ODQ6XFx0XFx0fVxcbjE2ODU6XFx0XFxuMTY4NjpcXHRcXHRjYXNlIEVYVDRfSU9DX01JR1JBVEU6XFxuMTY4NzpcXHRcXHR7XFxuMTY4ODpcXHRcXHRcXHRpbnQgZXJyO1xcbjE2ODk6XFx0XFx0XFx0aWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlkbWFwLCBpbm9kZSkpXFxuMTY5MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVBQ0NFUztcXG4xNjkxOlxcdFxcbjE2OTI6XFx0XFx0XFx0ZXJyID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTtcXG4xNjkzOlxcdFxcdFxcdGlmIChlcnIpXFxuMTY5NDpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjE2OTU6XFx0XFx0XFx0LypcXG4xNjk2OlxcdFxcdFxcdCAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLlxcbjE2OTc6XFx0XFx0XFx0ICogUmVhZCBzdGlsbCBnb2VzIHRocm91Z2guIFdlIHRha2UgaV9kYXRhX3NlbSBpblxcbjE2OTg6XFx0XFx0XFx0ICogZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZSBzd2l0Y2ggdGhlXFxuMTY5OTpcXHRcXHRcXHQgKiBpbm9kZSBmb3JtYXQgdG8gcHJldmVudCByZWFkLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo0OC4yMjI2ODk1NjhaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjgxODEyMDIyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEVYVDQgTWlncmF0aW9uIExvZ2ljKipcblxuT2theSwgc28gYEVYVDRfSU9DX01JR1JBVEVgIGFuZCBgRlNfSU9DX1NFVEZMQUdTYCBjYW4gdHJpZ2dlciB0aGUgYGV4dDRfZXh0X21pZ3JhdGUoKWAgZnVuY3Rpb24uIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgbWlncmF0aW9uLCBzbyBsZXQncyBjaGVjayBvdXQgYGZzL2V4dDQvbWlncmF0ZS5jYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgKndoeSogdGhpcyBjb21taXQgd2FzIG1hZGUgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgd2hhdCBwcm9ibGVtIGl0J3MgYWRkcmVzc2luZy4gTXkgcHJpbWFyeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBgZXh0NF9leHRfbWlncmF0ZSgpYCBhY3R1YWxseSAqZG9lcyouXG5cbkknbGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvZGUgYXJvdW5kIGBleHQ0X2V4dF9taWdyYXRlYCB3aXRoaW4gdGhhdCBmaWxlLiBJIGFsc28gd2FudCB0byBzZWUgd2hvIGNhbGxzIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCwgYW5kIGhvdyB0aGF0IGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIGV4dGVudHMsIHRoaXMgd2lsbCBwcm92aWRlIGltcG9ydGFudCBjbHVlcyB0byB0aGUgdW5kZXJseWluZyBtZWNoYW5pc20gYW5kIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgb2YgdGhpcyBtaWdyYXRpb24gcHJvY2Vzcy4gVGhpcyB3aWxsIGhlbHAgbWUgYnVpbGQgYSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgbWlncmF0aW9uIHByb2Nlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0ODAsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQzOjUxLjA0MDgxMzgxNFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDg5ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDEwLFxuICBcIkxpbmVDb3VudFwiOiA5MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDEwOlxcdFxcdH1cXG4gNDExOlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQxMjpcXHR9XFxuIDQxMzpcXHRcXG4gNDE0OlxcdGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIDQxNTpcXHR7XFxuIDQxNjpcXHRcXHRoYW5kbGVfdCAqaGFuZGxlO1xcbiA0MTc6XFx0XFx0aW50IHJldHZhbCA9IDAsIGk7XFxuIDQxODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gNDE5OlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpO1xcbiA0MjA6XFx0XFx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xcbiA0MjE6XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiO1xcbiA0MjI6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcztcXG4gNDIzOlxcdFxcdF9fdTMyIGdvYWwsIHRtcF9jc3VtX3NlZWQ7XFxuIDQyNDpcXHRcXHR1aWRfdCBvd25lclsyXTtcXG4gNDI1OlxcdFxcdGludCBhbGxvY19jdHg7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdC8qXFxuIDQyODpcXHRcXHQgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZVxcbiA0Mjk6XFx0XFx0ICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC5cXG4gNDMwOlxcdFxcdCAqL1xcbiA0MzE6XFx0XFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXFx1MDAzZWlfc2IpIHx8XFxuIDQzMjpcXHRcXHQgICAgZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykgfHxcXG4gNDMzOlxcdFxcdCAgICBleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXFxuIDQzNDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNDM1OlxcdFxcbiA0MzY6XFx0XFx0aWYgKFNfSVNMTksoaW5vZGUtXFx1MDAzZWlfbW9kZSkgXFx1MDAyNlxcdTAwMjYgaW5vZGUtXFx1MDAzZWlfYmxvY2tzID09IDApXFxuIDQzNzpcXHRcXHRcXHQvKlxcbiA0Mzg6XFx0XFx0XFx0ICogZG9uJ3QgbWlncmF0ZSBmYXN0IHN5bWxpbmtcXG4gNDM5OlxcdFxcdFxcdCAqL1xcbiA0NDA6XFx0XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gNDQxOlxcdFxcbiA0NDI6XFx0XFx0YWxsb2NfY3R4ID0gZXh0NF93cml0ZXBhZ2VzX2Rvd25fd3JpdGUoaW5vZGUtXFx1MDAzZWlfc2IpO1xcbiA0NDM6XFx0XFxuIDQ0NDpcXHRcXHQvKlxcbiA0NDU6XFx0XFx0ICogV29yc3QgY2FzZSB3ZSBjYW4gdG91Y2ggdGhlIGFsbG9jYXRpb24gYml0bWFwcyBhbmQgYSBibG9ja1xcbiA0NDY6XFx0XFx0ICogZ3JvdXAgZGVzY3JpcHRvciBibG9jay4gIFdlIGRvIG5lZWQgdG8gd29ycnkgYWJvdXRcXG4gNDQ3OlxcdFxcdCAqIGNyZWRpdHMgZm9yIG1vZGlmeWluZyB0aGUgcXVvdGEgaW5vZGUuXFxuIDQ0ODpcXHRcXHQgKi9cXG4gNDQ5OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLFxcbiA0NTA6XFx0XFx0XFx0MyArIEVYVDRfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhpbm9kZS1cXHUwMDNlaV9zYikpO1xcbiA0NTE6XFx0XFxuIDQ1MjpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNDUzOlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNDU0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gNDU1OlxcdFxcdH1cXG4gNDU2OlxcdFxcdC8qXFxuIDQ1NzpcXHRcXHQgKiBUaGlzIG9wZXJhdGlvbiByZXdyaXRlcyB0aGUgaW5vZGUncyBibG9jayBtYXBwaW5nIGxheW91dFxcbiA0NTg6XFx0XFx0ICogKGluZGlyZWN0IHRvIGV4dGVudHMpIGFuZCBpcyBub3QgdHJhY2tlZCBpbiB0aGUgZmFzdCBjb21taXRcXG4gNDU5OlxcdFxcdCAqIGxvZywgc28gZGlzYWJsZSBmYXN0IGNvbW1pdHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXFxuIDQ2MDpcXHRcXHQgKi9cXG4gNDYxOlxcdFxcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGlub2RlLVxcdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLCBoYW5kbGUpO1xcbiA0NjI6XFx0XFx0Z29hbCA9ICgoKCh1MzIpaW5vZGUtXFx1MDAzZWlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSAqXFxuIDQ2MzpcXHRcXHRcXHRFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtXFx1MDAzZWlfc2IpKSArIDE7XFxuIDQ2NDpcXHRcXHRvd25lclswXSA9IGlfdWlkX3JlYWQoaW5vZGUpO1xcbiA0NjU6XFx0XFx0b3duZXJbMV0gPSBpX2dpZF9yZWFkKGlub2RlKTtcXG4gNDY2OlxcdFxcdHRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KSxcXG4gNDY3OlxcdFxcdFxcdFxcdFxcdCAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyLCAwKTtcXG4gNDY4OlxcdFxcdGlmIChJU19FUlIodG1wX2lub2RlKSkge1xcbiA0Njk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUih0bXBfaW5vZGUpO1xcbiA0NzA6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDcxOlxcdFxcdFxcdHRtcF9pbm9kZSA9IE5VTEw7XFxuIDQ3MjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ3MzpcXHRcXHR9XFxuIDQ3NDpcXHRcXHQvKlxcbiA0NzU6XFx0XFx0ICogVXNlIHRoZSBjb3JyZWN0IHNlZWQgZm9yIGNoZWNrc3VtIChpLmUuIHRoZSBzZWVkIGZyb20gJ2lub2RlJykuICBUaGlzXFxuIDQ3NjpcXHRcXHQgKiBpcyBzbyB0aGF0IHRoZSBtZXRhZGF0YSBibG9ja3Mgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IGNoZWNrc3VtIGFmdGVyXFxuIDQ3NzpcXHRcXHQgKiB0aGUgbWlncmF0aW9uLlxcbiA0Nzg6XFx0XFx0ICovXFxuIDQ3OTpcXHRcXHRlaSA9IEVYVDRfSShpbm9kZSk7XFxuIDQ4MDpcXHRcXHR0bXBfY3N1bV9zZWVkID0gRVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0ODE6XFx0XFx0RVhUNF9JKHRtcF9pbm9kZSktXFx1MDAzZWlfY3N1bV9zZWVkID0gZWktXFx1MDAzZWlfY3N1bV9zZWVkO1xcbiA0ODI6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgaV9zaXplX3JlYWQoaW5vZGUpKTtcXG4gNDgzOlxcdFxcdC8qXFxuIDQ4NDpcXHRcXHQgKiBTZXQgdGhlIGlfbmxpbmsgdG8gemVybyBzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXJcXG4gNDg1OlxcdFxcdCAqIHdoZW4gd2UgZHJvcCBpbm9kZSByZWZlcmVuY2UuXFxuIDQ4NjpcXHRcXHQgKi9cXG4gNDg3OlxcdFxcdGNsZWFyX25saW5rKHRtcF9pbm9kZSk7XFxuIDQ4ODpcXHRcXG4gNDg5OlxcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIHRtcF9pbm9kZSk7XFxuIDQ5MDpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbiA0OTE6XFx0XFxuIDQ5MjpcXHRcXHQvKlxcbiA0OTM6XFx0XFx0ICogc3RhcnQgd2l0aCBvbmUgY3JlZGl0IGFjY291bnRlZCBmb3JcXG4gNDk0OlxcdFxcdCAqIHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9uLlxcbiA0OTU6XFx0XFx0ICpcXG4gNDk2OlxcdFxcdCAqIEZvciB0aGUgdG1wX2lub2RlIHdlIGFscmVhZHkgaGF2ZSBjb21taXR0ZWQgdGhlXFxuIDQ5NzpcXHRcXHQgKiB0cmFuc2FjdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGlub2RlLiBMYXRlciBhcyBhbmRcXG4gNDk4OlxcdFxcdCAqIHdoZW4gd2UgYWRkIGV4dGVudHMgd2UgZXh0ZW50IHRoZSBqb3VybmFsXFxuIDQ5OTpcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDM6NTEuMDQwOTI0OTk0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMwNzE3NjY0NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSBsaW5lcyBvZiBgZXh0NF9leHRfbWlncmF0ZWAgZnJvbSA1MDAgdG8gNjAwOlxuXG4qKkFuYWx5emluZyBleHQ0X2V4dF9taWdyYXRlOiBMaW5lcyA1MDAtNjAwKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eS4gSSdtIGZvY3VzaW5nIG9uIGxpbmVzIDUwMC02MDAgaW4gYGV4dDRfZXh0X21pZ3JhdGVgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHNlY3Rpb24gaXMgcHJvYmFibHkgZGVhbGluZyB3aXRoIHRoZSBpbnRyaWNhdGUgcHJvY2VzcyBvZiBhY3R1YWxseSAqbW92aW5nKiBkYXRhIGJsb2NrcyBkdXJpbmcgYW4gZXh0ZW50LWJhc2VkIG1pZ3JhdGlvbiwgb3IsIGlmIG5vdCBtb3ZpbmcsIHNldHRpbmcgdXAgdGhlIG1hcHBpbmcgc28gdGhhdCBtb3ZpbmcgY2FuIGhhcHBlbi4gR2l2ZW4gdGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uJ3MgbmFtZSwgdGhhdCdzIHdoYXQgSSdkIGV4cGVjdC4gSSdsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGRldGFpbHMgYXJvdW5kIGJsb2NrIGFsbG9jYXRpb24sIHRoZSBoYW5kbGluZyBvZiBpbmRpcmVjdCBibG9ja3MgKGVzcGVjaWFsbHkgaWYgdGhlIG1pZ3JhdGlvbiBpbnZvbHZlcyBhIGZpbGUgdGhhdCBoYXMgZ3Jvd24gYmV5b25kIGl0cyBpbml0aWFsIGxheW91dCksIGFuZCBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbnMgb3IgZXJyb3ItaGFuZGxpbmcgdGhhdCBtaWdodCBjb21lIGludG8gcGxheSBkdXJpbmcgdGhpcyBjcml0aWNhbCBvcGVyYXRpb24uIEFyZSB0aGVyZSBjaGVja3MgZm9yIGRhdGEgY29uc2lzdGVuY3k/IFdoYXQgYWJvdXQgam91cm5hbGluZyBjb25jZXJucz8gSSdtIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGUgc3lzdGVtIGVuc3VyZXMgZXZlcnl0aGluZyBpcyB1cGRhdGVkIGNvcnJlY3RseSwgZXNwZWNpYWxseSBpbiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBzeXN0ZW0gaW50ZXJydXB0aW9ucy4gSSdtIGdvaW5nIHRvIGJlIGxvb2tpbmcgZm9yIGNsdWVzIG9uIGhvdyB0aGUgZXh0ZW50IHRyZWUgaXMgbW9kaWZpZWQgdGhyb3VnaG91dCB0aGlzIG9wZXJhdGlvbi4gSSdtIGV4cGVjdGluZyBzb21lIGtpbmQgb2YgbG9vcCBpdGVyYXRpb24sIHByb2JhYmx5IG9uIGV4dGVudHMsIHdpdGggZGV0YWlsZWQgc3RlcHMgdG8gbWFpbnRhaW4gZGF0YSBpbnRlZ3JpdHkgYW5kIGNvbnNpc3RlbmN5LiBJIGFsc28gc3VzcGVjdCB0aGVyZSB3aWxsIGJlIHNvbWUgY2hlY2tzIG9yIGludGVyYWN0aW9ucyByZWxhdGVkIHRvIG1ldGFkYXRhIHVwZGF0ZXMsIHNpbmNlIHdlJ3JlIHJlYXJyYW5naW5nIGJsb2Nrcy4gRmluYWxseSwgSSdtIGV4cGVjdGluZyBzb21lIGxldmVsIG9mIGNvbXBsZXhpdHkuIEV4dGVudCBtaWdyYXRpb24gaXMgYSBzb3BoaXN0aWNhdGVkIHByb2Nlc3MsIGFuZCB0aGUgY29yZSBvZiB0aGUgd29yaywgdGhhdCdzIHdoeSB0aGVzZSBsaW5lcyBhcmUgaW1wb3J0YW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjQ4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo1NC4xMTI2OTM1MDhaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyMTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MDA6XFx0XFx0LypcXG4gNTAxOlxcdFxcdCAqIEV2ZW4gdGhvdWdoIHdlIHRha2UgaV9yd3NlbSB3ZSBjYW4gc3RpbGwgY2F1c2UgYmxvY2tcXG4gNTAyOlxcdFxcdCAqIGFsbG9jYXRpb24gdmlhIG1tYXAgd3JpdGUgdG8gaG9sZXMuIElmIHdlIGhhdmUgYWxsb2NhdGVkXFxuIDUwMzpcXHRcXHQgKiBuZXcgYmxvY2tzIHdlIGZhaWwgbWlncmF0ZS4gIE5ldyBibG9jayBhbGxvY2F0aW9uIHdpbGxcXG4gNTA0OlxcdFxcdCAqIGNsZWFyIEVYVDRfU1RBVEVfRVhUX01JR1JBVEUgZmxhZy4gIFRoZSBmbGFnIGlzIHVwZGF0ZWRcXG4gNTA1OlxcdFxcdCAqIHdpdGggaV9kYXRhX3NlbSBoZWxkIHRvIHByZXZlbnQgcmFjaW5nIHdpdGggYmxvY2tcXG4gNTA2OlxcdFxcdCAqIGFsbG9jYXRpb24uXFxuIDUwNzpcXHRcXHQgKi9cXG4gNTA4OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuIDUwOTpcXHRcXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9FWFRfTUlHUkFURSk7XFxuIDUxMDpcXHRcXHR1cF9yZWFkKChcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSkpO1xcbiA1MTE6XFx0XFxuIDUxMjpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSwgMSk7XFxuIDUxMzpcXHRcXHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcXG4gNTE0OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIoaGFuZGxlKTtcXG4gNTE1OlxcdFxcdFxcdGdvdG8gb3V0X3RtcF9pbm9kZTtcXG4gNTE2OlxcdFxcdH1cXG4gNTE3OlxcdFxcbiA1MTg6XFx0XFx0aV9kYXRhID0gZWktXFx1MDAzZWlfZGF0YTtcXG4gNTE5OlxcdFxcdG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpO1xcbiA1MjA6XFx0XFxuIDUyMTpcXHRcXHQvKiAzMiBiaXQgYmxvY2sgYWRkcmVzcyA0IGJ5dGVzICovXFxuIDUyMjpcXHRcXHRtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiA1MjM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEVYVDRfTkRJUl9CTE9DS1M7IGkrKykge1xcbiA1MjQ6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiA1MjU6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTI2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIFxcdTAwMjZsYik7XFxuIDUyNzpcXHRcXHRcXHRcXHRpZiAocmV0dmFsKVxcbiA1Mjg6XFx0XFx0XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiA1Mjk6XFx0XFx0XFx0fSBlbHNlXFxuIDUzMDpcXHRcXHRcXHRcXHRsYi5jdXJyX2Jsb2NrKys7XFxuIDUzMTpcXHRcXHR9XFxuIDUzMjpcXHRcXHRpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkge1xcbiA1MzM6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsXFxuIDUzNDpcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdKSwgXFx1MDAyNmxiKTtcXG4gNTM1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDUzNjpcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDUzNzpcXHRcXHR9IGVsc2VcXG4gNTM4OlxcdFxcdFxcdGxiLmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXM7XFxuIDUzOTpcXHRcXHRpZiAoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pIHtcXG4gNTQwOlxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTQxOlxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdKSwgXFx1MDAyNmxiKTtcXG4gNTQyOlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU0MzpcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDU0NDpcXHRcXHR9IGVsc2VcXG4gNTQ1OlxcdFxcdFxcdGxiLmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gNTQ2OlxcdFxcdGlmIChpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSkge1xcbiA1NDc6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1NDg6XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1NDk6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTUwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTUxOlxcdFxcdH1cXG4gNTUyOlxcdFxcdC8qXFxuIDU1MzpcXHRcXHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcXG4gNTU0OlxcdFxcdCAqL1xcbiA1NTU6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcXHUwMDI2bGIpO1xcbiA1NTY6XFx0ZXJyX291dDpcXG4gNTU3OlxcdFxcdGlmIChyZXR2YWwpXFxuIDU1ODpcXHRcXHRcXHQvKlxcbiA1NTk6XFx0XFx0XFx0ICogRmFpbHVyZSBjYXNlIGRlbGV0ZSB0aGUgZXh0ZW50IGluZm9ybWF0aW9uIHdpdGggdGhlXFxuIDU2MDpcXHRcXHRcXHQgKiB0bXBfaW5vZGVcXG4gNTYxOlxcdFxcdFxcdCAqL1xcbiA1NjI6XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NjM6XFx0XFx0ZWxzZSB7XFxuIDU2NDpcXHRcXHRcXHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcXG4gNTY1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU2NjpcXHRcXHRcXHRcXHQvKlxcbiA1Njc6XFx0XFx0XFx0XFx0ICogaWYgd2UgZmFpbCB0byBzd2FwIGlub2RlIGRhdGEgZnJlZSB0aGUgZXh0ZW50XFxuIDU2ODpcXHRcXHRcXHRcXHQgKiBkZXRhaWxzIG9mIHRoZSB0bXAgaW5vZGVcXG4gNTY5OlxcdFxcdFxcdFxcdCAqL1xcbiA1NzA6XFx0XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NzE6XFx0XFx0fVxcbiA1NzI6XFx0XFxuIDU3MzpcXHRcXHQvKiBXZSBtYXJrIHRoZSB0bXBfaW5vZGUgZGlydHkgdmlhIGV4dDRfZXh0X3RyZWVfaW5pdC4gKi9cXG4gNTc0OlxcdFxcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIDEsIDApO1xcbiA1NzU6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDU3NjpcXHRcXHRcXHRnb3RvIG91dF9zdG9wO1xcbiA1Nzc6XFx0XFx0LypcXG4gNTc4OlxcdFxcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cXG4gNTc5OlxcdFxcdCAqL1xcbiA1ODA6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XFxuIDU4MTpcXHRcXG4gNTgyOlxcdFxcdC8qXFxuIDU4MzpcXHRcXHQgKiBzZXQgdGhlICBpX2Jsb2NrcyBjb3VudCB0byB6ZXJvXFxuIDU4NDpcXHRcXHQgKiBzbyB0aGF0IHRoZSBleHQ0X2V2aWN0X2lub2RlKCkgZG9lcyB0aGVcXG4gNTg1OlxcdFxcdCAqIHJpZ2h0IGpvYlxcbiA1ODY6XFx0XFx0ICpcXG4gNTg3OlxcdFxcdCAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGUgaV9sb2NrIGJlY2F1c2VcXG4gNTg4OlxcdFxcdCAqIHRoZSBpbm9kZSBpcyBub3QgdmlzaWJsZSB0byB1c2VyIHNwYWNlLlxcbiA1ODk6XFx0XFx0ICovXFxuIDU5MDpcXHRcXHR0bXBfaW5vZGUtXFx1MDAzZWlfYmxvY2tzID0gMDtcXG4gNTkxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XFxuIDU5MjpcXHRcXG4gNTkzOlxcdFxcdC8qIFJlc2V0IHRoZSBleHRlbnQgZGV0YWlscyAqL1xcbiA1OTQ6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNTk1OlxcdG91dF9zdG9wOlxcbiA1OTY6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNTk3OlxcdG91dF90bXBfaW5vZGU6XFxuIDU5ODpcXHRcXHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XFxuIDU5OTpcXHRvdXRfdW5sb2NrOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0Mzo1NC4xMTI4MTc0MDhaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTMzNDU5NjMxMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBJbnRlZ2VyIE92ZXJmbG93IGluIEV4dDQgQmxvY2sgTWFuYWdlbWVudCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIldoYXQncyB0aGUgc2l0dWF0aW9uIGhlcmU/XCIgSSdtIGxvb2tpbmcgYXQgbGluZXMgNTM4IGFuZCA1NDUsIHNwZWNpZmljYWxseSB0aGlzOiBgbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztgIGFuZCBgbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO2AuIEltbWVkaWF0ZWx5LCBJJ20gdGhpbmtpbmcsIFwiV2FpdCBhIG1pbnV0ZSwgd2hhdCBoYXBwZW5zIGlmIGBsYi5jdXJyX2Jsb2NrYCBvdmVyZmxvd3Mgb3IgYmVjb21lcyBsYXJnZXIgdGhhbiBgRVhUX01BWF9CTE9DS1NgP1wiIFRoYXQgY291bGQgY2F1c2Ugc29tZSBzZXJpb3VzIHByb2JsZW1zIHdpdGggYmxvY2sgYWxsb2NhdGlvbi5cblxuQWgsIGhvbGQgb24hIFRoZXJlJ3MgYSByZWxldmFudCBwYXRjaCBoZXJlLiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZTpcblxuYGBgY1xuc3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbi1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuK1x0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuIFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XG4gfTtcbiBcbkBAIC02Niw2ICs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuK1xuK1x0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuIFx0LypcbiBcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuIFx0ICovXG5gYGBcblxuUmlnaHQsIHRoZXkndmUgYWN0dWFsbHkgYWRkcmVzc2VkIHRoaXMgd2l0aCBhIGNoZWNrIG5vdzogYGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgLiBUaGF0J3MgZ29vZDsgYSBzYW5pdHkgY2hlY2sgaXMgaW1wbGVtZW50ZWQsIGJ1dCBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSogb2YgdGhpcy5cblxuVGhlbiBpdCBoaXRzIG1lISBJJ20gcmVtZW1iZXJpbmcgdGhhdCBgZXh0NF9sYmxrX3RgIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKGB1MzJgKS4gVGhlIHBvdGVudGlhbCBmb3Igb3ZlcmZsb3cgaXMgZGVmaW5pdGVseSB0aGVyZSwgZXNwZWNpYWxseSBpbiBjYXNlcyB3aXRoIGRlZXBseSBpbmRpcmVjdC1tYXBwZWQgZmlsZXMgYW5kIGEgbGFyZ2UgYG1heF9lbnRyaWVzYC4gSW4gZmFjdCwgYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgY291bGQgcXVpY2tseSBleGNlZWQgdGhlIHJhbmdlIG9mIGEgMzItYml0IGludGVnZXIuIFRoYXQgaXMgdGhlIHZ1bG5lcmFiaWxpdHkuIEkgc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNvZGUgaW4gbW9yZSBkZXRhaWwuXG5cbk5vdywgSSdtIGFza2luZyBteXNlbGYuLi4gXCJXaGF0ICppcyogYEVYVF9NQVhfQkxPQ0tTYD9cIiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGxpbWl0IHRvIGZ1bGx5IGdyYXNwIHRoZSBjb250ZXh0LiBJJ2xsIHNlYXJjaCBmb3IgaXRzIGRlZmluaXRpb24gdG8gY2xhcmlmeSB0aGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjMzLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MDcuNDU4NzgzNDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODQ3MDY5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFRfTUFYX0JMT0NLU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM4OTY9c3RydWN0IGV4dDRfZXh0ZW50O1xcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzkwMS0gKi9cXG5mcy9leHQ0L2V4dDQuaDozOTAyOiNkZWZpbmUgRVhUX01BWF9CTE9DS1NcXHQweGZmZmZmZmZmXFxuZnMvZXh0NC9leHQ0LmgtMzkwMy1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE1MzE9c3RhdGljIGludCBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2MzMtICogZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2s6XFxuZnMvZXh0NC9leHRlbnRzLmM6MTYzNDogKiByZXR1cm5zIGFsbG9jYXRlZCBibG9jayBpbiBzdWJzZXF1ZW50IGV4dGVudCBvciBFWFRfTUFYX0JMT0NLUy5cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjM1LSAqIE5PVEU6IGl0IGNvbnNpZGVycyBibG9jayBudW1iZXIgZnJvbSBpbmRleCBlbnRyeSBhc1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTY0MD1leHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NDctXFx0aWYgKGRlcHRoID09IDAgXFx1MDAyNlxcdTAwMjYgcGF0aC1cXHUwMDNlcF9leHQgPT0gTlVMTClcXG5mcy9leHQ0L2V4dGVudHMuYzoxNjQ4OlxcdFxcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ5LVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTY2NC1cXG5mcy9leHQ0L2V4dGVudHMuYzoxNjY1OlxcdHJldHVybiBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY2LX1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjktICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2NzA6ICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DS1NcXG5mcy9leHQ0L2V4dGVudHMuYy0xNjcxLSAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jPTE2NzI9c3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2ODAtXFx0aWYgKGRlcHRoID09IDApXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY4MTpcXHRcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY4Mi1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTMtXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY5NDpcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY5NS19XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTQyPXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTYzLVxcdFxcdGIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MTk2NDpcXHRcXHRpZiAoYjIgPT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9leHRlbnRzLmMtMTk2NS1cXHRcXHRcXHRnb3RvIG91dDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NzAtXFx0aWYgKGIxICsgbGVuMSBcXHUwMDNjIGIxKSB7XFxuZnMvZXh0NC9leHRlbnRzLmM6MTk3MTpcXHRcXHRsZW4xID0gRVhUX01BWF9CTE9DS1MgLSBiMTtcXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcyLVxcdFxcdG5ld2V4dC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYobGVuMSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xOTkyPWV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDItXFx0ZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTAzOlxcdG5leHQgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA0LVxcdGlmIChsZTMyX3RvX2NwdShuZXdleHQtXFx1MDAzZWVlX2Jsb2NrKSBcXHUwMDNlIGxlMzJfdG9fY3B1KGZleC1cXHUwMDNlZWVfYmxvY2spKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDUtXFx0XFx0bmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMTA2OlxcdGlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwNy1cXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqbnBhdGg7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yMjgwPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9maW5kX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTEtXFx0XFx0KmxibGsgPSAwO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIyOTI6XFx0XFx0bGVuID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjI5My1cXHR9IGVsc2UgaWYgKCpsYmxrIFxcdTAwM2MgbGUzMl90b19jcHUoZXgtXFx1MDAzZWVlX2Jsb2NrKSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MjYyMj1leHQ0X2V4dF9ybV9sZWFmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYxLVxcdFxcdGlmIChudW0gPT0gMCkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI3NjI6XFx0XFx0XFx0aWYgKGVuZCAhPSBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcXG5mcy9leHQ0L2V4dGVudHMuYy0yNzYzLVxcdFxcdFxcdFxcdC8qXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0yODQ1PWludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yODc4LVxcdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjI4Nzk6XFx0aWYgKGVuZCBcXHUwMDNjIEVYVF9NQVhfQkxPQ0tTIC0gMSkge1xcbmZzL2V4dDQvZXh0ZW50cy5jLTI4ODAtXFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTQ1NTE9aW50IGV4dDRfZXh0X3RydW5jYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00NTcwLVxcdFxcdFxcdFxcdTAwM2VcXHUwMDNlIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0NTcxOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NTcyLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzMtcmV0cnlfcmVtb3ZlX3NwYWNlOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjQ1NzQ6XFx0ZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ1NzUtXFx0aWYgKGVyciA9PSAtRU5PTUVNKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01MzQyPWludCBleHQ0X2dldF9lc19jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTM3Ny1cXHRsYXN0X2JsayA9IChzdGFydCArIGxlbiAtIDEpIFxcdTAwM2VcXHUwMDNlIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZV9iaXRzO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzg6XFx0aWYgKGxhc3RfYmxrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jOjUzNzk6XFx0XFx0bGFzdF9ibGsgPSBFWFRfTUFYX0JMT0NLUy0xO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTUzODAtXFx0bGVuX2Jsa3MgPSAoKGV4dDRfbGJsa190KSBsYXN0X2JsaykgLSBzdGFydF9ibGsgKyAxO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTQ5ND1leHQ0X2V4dF9zaGlmdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTAxLVxcdGV4dDRfbGJsa190IHN0b3AsICppdGVyYXRvciwgZXhfc3RhcnQsIGV4X2VuZDtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTAyOlxcdGV4dDRfbGJsa190IHRtcCA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDMtXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNC1cXHQvKiBMZXQgcGF0aCBwb2ludCB0byB0aGUgbGFzdCBleHRlbnQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo1NTA1OlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwNi1cXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUxOS1cXHQqIGFjY29tbW9kYXRlIHRoZSBzaGlmdC4gIEZvciByaWdodCBzaGlmdHMsIG1ha2Ugc3VyZSB0aGUgbGFzdCBleHRlbnRcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTIwOlxcdCogd29uJ3QgYmUgc2hpZnRlZCBiZXlvbmQgRVhUX01BWF9CTE9DS1MuXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUyMS1cXHQqL1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTU0My1cXHR9IGVsc2Uge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NDQ6XFx0XFx0aWYgKHNoaWZ0IFxcdTAwM2UgRVhUX01BWF9CTE9DS1MgLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDUtXFx0XFx0ICAgIChzdG9wICsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXh0ZW50KSkpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjItXFxuZnMvZXh0NC9leHRlbnRzLmM6NTU2MzpcXHRpZiAodG1wICE9IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NjQtXFx0XFx0Kml0ZXJhdG9yID0gdG1wO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTYzNz1zdGF0aWMgaW50IGV4dDRfY29sbGFwc2VfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01Njk1LVxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTY5NjpcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIHN0YXJ0X2xibGssIEVYVF9NQVhfQkxPQ0tTIC0gc3RhcnRfbGJsayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNTY5Ny1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3Mzg9c3RhdGljIGludCBleHQ0X2luc2VydF9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbilcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzItXFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU4MzM6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU4MzQtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01ODc1PWV4dDRfc3dhcF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMS1cXHRcXHRcXHQvKiBEbyB3ZSBoYXZlIHNvbWV0aGluZyB0byBzd2FwICovXFxuZnMvZXh0NC9leHRlbnRzLmM6NTkzMjpcXHRcXHRcXHRpZiAobmV4dDEgPT0gRVhUX01BWF9CTE9DS1MgfHwgbmV4dDIgPT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9leHRlbnRzLmMtNTkzMy1cXHRcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTYyNTI9aW50IGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI2MS1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYyNjI6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MjYzLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MzM5PWludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1MC1cXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjYzNTE6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG5mcy9leHQ0L2V4dGVudHMuYy02MzUyLVxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9NTkxPXN0YXRpYyBpbnQgZXh0NF9lc19jYW5fYmVfbWVyZ2VkKHN0cnVjdCBleHRlbnRfc3RhdHVzICplczEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk2LVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo1OTc6XFx0aWYgKCgoX191NjQpIGVzMS1cXHUwMDNlZXNfbGVuKSArIGVzMi1cXHUwMDNlZXNfbGVuIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHtcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNTk4LVxcdFxcdHByX3dhcm4oXFxcIkVTIGFzc2VydGlvbiBmYWlsZWQgd2hlbiBtZXJnaW5nIGV4dGVudHMuIFxcXCJcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy02MDAtXFx0XFx0XFx0XFxcImlzIGJpZ2dlciB0aGFuIGFsbG93ZWQgZmlsZSBzaXplICglZClcXFxcblxcXCIsXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjYwMTpcXHRcXHRcXHRlczEtXFx1MDAzZWVzX2xlbiwgZXMyLVxcdTAwM2Vlc19sZW4sIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAyLVxcdFxcdFdBUk5fT04oMSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM9MTk0Mz1zdGF0aWMgaW50IGVzX3JlY2xhaW1fZXh0ZW50cyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSwgaW50ICpucl90b19zY2FuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTE5NTctXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jOjE5NTg6XFx0aWYgKCFlc19kb19yZWNsYWltX2V4dGVudHMoZWksIEVYVF9NQVhfQkxPQ0tTLCBucl90b19zY2FuLCBcXHUwMDI2bnJfc2hydW5rKSBcXHUwMDI2XFx1MDAyNlxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU5LVxcdCAgICBzdGFydCAhPSAwKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIzMTc9c3RhdGljIHZvaWQgZXh0NF9mY19zZXRfYml0bWFwc19hbmRfY291bnRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM1LVxcdFxcdGN1ciA9IDA7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIzMzY6XFx0XFx0ZW5kID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIzMzctXFx0XFx0aWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSkge1xcbi0tXFxuZnMvZXh0NC9pbmRpcmVjdC5jPTExMTI9dm9pZCBleHQ0X2luZF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmRpcmVjdC5jLTExMzUtXFxuZnMvZXh0NC9pbmRpcmVjdC5jOjExMzY6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIGxhc3RfYmxvY2spO1xcbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM3LVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xODYyPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMTkwOC1cXHRcXHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpKVxcbmZzL2V4dDQvaW5saW5lLmM6MTkwOTpcXHRcXHRcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lubGluZS5jLTE5MTAtXFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9NzAwPWludCBleHQ0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy03MjItXFxuZnMvZXh0NC9pbm9kZS5jOjcyMzpcXHQvKiBXZSBjYW4gaGFuZGxlIHRoZSBibG9jayBudW1iZXIgbGVzcyB0aGFuIEVYVF9NQVhfQkxPQ0tTICovXFxuZnMvZXh0NC9pbm9kZS5jOjcyNDpcXHRpZiAodW5saWtlbHkobWFwLVxcdTAwM2VtX2xibGsgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKVxcbmZzL2V4dDQvaW5vZGUuYy03MjUtXFx0XFx0cmV0dXJuIC1FRlNDT1JSVVBURUQ7XFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9MjE3Mz1zdGF0aWMgaW50IG1wYWdlX3Byb2Nlc3NfcGFnZV9idWZzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQsXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtMjE4Mi1cXHRpZiAoZXh0NF92ZXJpdHlfaW5fcHJvZ3Jlc3MoaW5vZGUpKVxcbmZzL2V4dDQvaW5vZGUuYzoyMTgzOlxcdFxcdGJsb2NrcyA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvaW5vZGUuYy0yMTg0LVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTYwMDk9aW50IGV4dDRfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTYxNzItXFx0XFx0XFx0XFx0XFx0aW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplX2JpdHMsXFxuZnMvZXh0NC9pbm9kZS5jOjYxNzM6XFx0XFx0XFx0XFx0XFx0RVhUX01BWF9CTE9DS1MgLSAxKTtcXG5mcy9leHQ0L2lub2RlLmMtNjE3NC1cXHRcXHRcXHRlbHNlXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmM9MzEzPXN0YXRpYyB2b2lkIHN3YXBfaW5vZGVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpXFxuLS1cXG5mcy9leHQ0L2lvY3RsLmMtMzQxLVxcdHN3YXAoZWkxLVxcdTAwM2VpX2Rpc2tzaXplLCBlaTItXFx1MDAzZWlfZGlza3NpemUpO1xcbmZzL2V4dDQvaW9jdGwuYzozNDI6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMSwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvaW9jdGwuYzozNDM6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlMiwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvaW9jdGwuYy0zNDQtXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuYz00NTE5PWV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyxcXG4tLVxcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDUtXFx0LyogYXZvaWQgdW5uZWNlc3NhcnkgcHJlYWxsb2NhdGlvbiB0aGF0IG1heSB0cmlnZ2VyIGFzc2VydGlvbnMgKi9cXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA2OlxcdGlmIChzdGFydCArIHNpemUgXFx1MDAzZSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L21iYWxsb2MuYzo0NjA3OlxcdFxcdHNpemUgPSBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0O1xcbmZzL2V4dDQvbWJhbGxvYy5jLTQ2MDgtXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz02NT1zdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jLTY5LVxcbmZzL2V4dDQvbWlncmF0ZS5jOjcwOlxcdGlmIChsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L21pZ3JhdGUuYy03MS1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM9NTE3PXN0YXRpYyBpbnQgbWV4dF9jaGVja19hZGp1c3RfcmFuZ2Uoc3RydWN0IGlub2RlICpvcmlnX2lub2RlLFxcbi0tXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzMC1cXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMxOlxcdGlmICgob3JpZ19zdGFydCBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTMyOlxcdCAgICAoZG9ub3Jfc3RhcnQgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMzpcXHQgICAgKCpsZW4gXFx1MDAzZSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTM0OlxcdCAgICAoZG9ub3Jfc3RhcnQgKyAqbGVuIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzU6XFx0ICAgIChvcmlnX3N0YXJ0ICsgKmxlbiBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykpICB7XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzNi1cXHRcXHRleHQ0X2RlYnVnKFxcXCJleHQ0IG1vdmUgZXh0ZW50OiBDYW4ndCBoYW5kbGUgb3ZlciBbJXVdIGJsb2NrcyBbaW5vOm9yaWcgJWxsdSwgZG9ub3IgJWxsdV1cXFxcblxcXCIsXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNzpcXHRcXHRcXHQgICBFWFRfTUFYX0JMT0NLUyxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmMtNTM4LVxcdFxcdFxcdCAgIG9yaWdfaW5vZGUtXFx1MDAzZWlfaW5vLCBkb25vcl9pbm9kZS1cXHUwMDNlaV9pbm8pO1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTE1Mzk9dm9pZCBleHQ0X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTU2OC1cXHRyZW1vdmVfaW5vZGVfaGFzaChpbm9kZSk7XFxuZnMvZXh0NC9zdXBlci5jOjE1Njk6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9zdXBlci5jLTE1NzAtXFx0ZHF1b3RfZHJvcChpbm9kZSk7XFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jPTI3MT1zdGF0aWMgaW50IGV4dDRfZ2V0X3Zlcml0eV9kZXNjcmlwdG9yX2xvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L3Zlcml0eS5jLTI5My1cXG5mcy9leHQ0L3Zlcml0eS5jOjI5NDpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLCAwKTtcXG5mcy9leHQ0L3Zlcml0eS5jLTI5NS1cXHRpZiAoSVNfRVJSKHBhdGgpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDowNy41MDcyNTk3NDhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjAxMTcyNjAxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEV4dDQgQmxvY2sgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlJ3JlIGRlYWxpbmcgd2l0aCBibG9jayBtaWdyYXRpb24gd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0sIGFuZCBzb21ldGhpbmcgc21lbGxzIGZpc2h5IHdpdGggdGhlIGJsb2NrIG51bWJlcnMuIFRoZSBjb2RlIHVzZXMgYEVYVF9NQVhfQkxPQ0tTYCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGEgYHUzMmAgdmFsdWUgKDB4ZmZmZmZmZmYsIDJeMzIgLSAxKS4gVGhhdCdzIGEgaHVnZSBudW1iZXIsIGJ1dC4uLlxuXG5CZWZvcmUgdGhpcyBjb21taXQsIHRoZSBjcml0aWNhbCB2YXJpYWJsZXMgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdpdGhpbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBzdHJ1Y3Qgd2VyZSBhbHNvIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGlmIEknbSBub3QgbWlzdGFrZW4sIGlzIGFsc28gYSBgdTMyYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSByZWQgZmxhZy4gSWYgYmxvY2sgbnVtYmVycyB0aGVtc2VsdmVzIGFyZSBgdTMyYCwgaG93IGNhbiB0aGV5IHBvc3NpYmx5IHJlcHJlc2VudCBhbGwgdGhlIGJsb2NrcyB1cCB0byBgRVhUX01BWF9CTE9DS1NgPyBUaGVyZSBoYXMgdG8gYmUgYW4gaW50ZWdlciBvdmVyZmxvdyBzb21ld2hlcmUuXG5cbkxvb2tpbmcgYXQgdGhlIGBleHQ0X2V4dF9taWdyYXRlYCBmdW5jdGlvbiwgYW5kIHNwZWNpZmljYWxseSB0aGlzIHNuaXBwZXQ6XG5cbmBgYGNcblx0XHRtYXhfZW50cmllcyA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgXHUwMDNlXHUwMDNlIDI7XG4uLi5cblx0XHRpZiAoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pIHtcblx0XHRcdHJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcblx0XHRcdFx0XHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSksIFx1MDAyNmxiKTtcblx0XHRcdGlmIChyZXR2YWwpXG5cdFx0XHRcdGdvdG8gZXJyX291dDtcblx0XHR9XG5gYGBcblxuT2theSwgdGhlIGBtYXhfZW50cmllc2AgY2FsY3VsYXRpb24gc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYmxvY2tzaXplIGRpdmlkZWQgYnkgNCAobGlrZWx5IGZvciBhbiBleHRlbnQgaW5kZXgpLCBidXQgdGhhdCdzIG5vdCB0aGUgY3JpdGljYWwgcG9pbnQgaGVyZS4gVGhlIGltcG9ydGFudCBwYXJ0IGlzIHRoZSBjYWxsIHRvIGB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2VgLCB3aXRoIGEgYGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKWAgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiwgYW5kIGFsc28gdGhlIGBsYmAgc3RydWN0LiBJZiB0aGUgYGxiYCBzdHJ1Y3QgKGNvbnRhaW5pbmcgYGN1cnJfYmxvY2tgLCB3aGljaCBpcyBgdTMyYCksIGlzIHBhc3NlZCB0byB0aGUgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24gYWxvbmcgd2l0aCBhIGB1MzJgIGJsb2NrIG51bWJlciwgdGhlbiB3ZSd2ZSBnb3QgYSBwb3RlbnRpYWwgb3ZlcmZsb3csIHJpZ2h0PyBBbmQgd2UgbmVlZCB0byB0cmFjZSB0aG9zZSBmdW5jdGlvbnMsIGxpa2UgYHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBhbmQgc28gb24uIFRoZXkgY291bGQgYmUgdGhlIHNvdXJjZSBvZiB0aGUgcHJvYmxlbS4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MjU2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjI3LjYyNDUyMjExNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTAwOlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMDE6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEwNDpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTA1OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTA2OlxcdFxcbiAxMDc6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEwODpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMDk6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMTA6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxMTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxMTI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTEzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxMTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTE1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuIDExNjpcXHRcXHRcXHR9XFxuIDExNzpcXHRcXHR9XFxuIDExODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxMTk6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTIwOlxcdFxcbiAxMjE6XFx0fVxcbiAxMjI6XFx0XFxuIDEyMzpcXHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAxMjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuIDEyNTpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDEyODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gMTI5OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMzA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMzE6XFx0XFxuIDEzMjpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEzMzpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEzNzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMzg6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMzk6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTQwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTQxOlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE0MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQzOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE0NDpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTQ1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzO1xcbiAxNDY6XFx0XFx0XFx0fVxcbiAxNDc6XFx0XFx0fVxcbiAxNDg6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTQ5OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDE1MDpcXHRcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTU0OlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxNTU6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDE1NjpcXHR7XFxuIDE1NzpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxNTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDE1OTpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTYwOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTYxOlxcdFxcbiAxNjI6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxNjM6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDE2NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxNjc6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTY4OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTY5OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxNzE6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzM6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTc0OlxcdFxcdFxcdFxcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xcbiAxNzU6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gMTc2OlxcdFxcdFxcdH1cXG4gMTc3OlxcdFxcdH1cXG4gMTc4OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE3OTpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxODA6XFx0XFxuIDE4MTpcXHR9XFxuIDE4MjpcXHRcXG4gMTgzOlxcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcXG4gMTg1OlxcdHtcXG4gMTg2OlxcdFxcdGludCBpO1xcbiAxODc6XFx0XFx0X19sZTMyICp0bXBfaWRhdGE7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxODk6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAxOTA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxOTE6XFx0XFx0aW50IGVycjtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcXG4gMTk0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxOTU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxOTY6XFx0XFxuIDE5NzpcXHRcXHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTk4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE5OTpcXHRcXHRcXHRpZiAodG1wX2lkYXRhW2ldKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjI3LjYyNDYwOTg1NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo2NDYwNzAwNzY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgSW50ZWdlciBPdmVyZmxvdyBWdWxuZXJhYmlsaXR5IGluIGV4dDQgRmlsZXN5c3RlbSBFeHRlbnQgTWlncmF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgdGhhdCB3aXRoIGEgNEsgYmxvY2sgc2l6ZSwgdGhlIGBtYXhfZW50cmllc2AgaW4gYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgY2FuIGJlIDEwMjQsIGxlYWRpbmcgdG8gYG1heF9lbnRyaWVzICogbWF4X2VudHJpZXNgID0gMSwwNDgsNTc2LiBUaGVuLCBgbGItXHUwMDNlY3Vycl9ibG9ja2AgY2FuIHJlYWNoIDEsMDc0LDc5MSw0MzYsIHdoaWNoIHdvcmtzIGJlY2F1c2UgaXQgZml0cyB3aXRoaW4gYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAoYHUzMmApLiBCdXQgaG9sZCBvbiwgd2hhdCBoYXBwZW5zIHdpdGggbGFyZ2VyIGJsb2NrIHNpemVzLCBsaWtlIDY0S0I/IElmIHRoZSBibG9jayBzaXplIGlzIDY0S0IsIGBtYXhfZW50cmllc2AganVtcHMgdG8gMTYzODQsIGFuZCBzdWRkZW5seSwgMTYzODQgY3ViZWQgaXMgKndheSogYmlnZ2VyIHRoYW4gYSAzMi1iaXQgaW50ZWdlciEgVGhhdCdzIGEgcG90ZW50aWFsIHdyYXAtYXJvdW5kIHdhaXRpbmcgdG8gaGFwcGVuLlxuXG5FdmVuIHdpdGggdGhlIDRLIGJsb2NrIHNpemUsIHdoYXQgaWYgd2UgY29uc2lkZXIgYEVYVF9NQVhfQkxPQ0tTYD8gVGhlbiwgSSByZW1lbWJlciB0aGF0IGBFWFRfTUFYX0JMT0NLU2AgaXMgMHhmZmZmZmZmZiAoNCwyOTQsOTY3LDI5NSkuXG5cbkknbSBzdGFydGluZyB0byBzZWUgYSBwYXR0ZXJuIGhlcmUuIExhcmdlIGJsb2NrIHNpemVzICgxNktCIG9yIDY0S0IpLCBmaWxlIHN5c3RlbSBjb3JydXB0aW9uLCBvciBldmVuIGp1c3QgbGFyZ2UgYmxvY2sgY291bnRzLCBjb3VsZCB0cmlnZ2VyIGFuIG92ZXJmbG93IHdoZW4gYGN1cnJfYmxvY2tgIHdhcyBiZWluZyB0cmVhdGVkIGFzIGFuIGBleHQ0X2xibGtfdGAgKHdoaWNoIGlzIGEgdTMyKSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBgY3Vycl9ibG9ja2Agd3JhcHBpbmcgYXJvdW5kLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIGNoZWNraW5nIGZvciBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayBmb3IgZXh0ZW50LWJhc2VkIGZpbGVzLiBUaGUgYGVlX2Jsb2NrYCBmaWVsZCBpbiB0aGUgZXh0ZW50IGZvcm1hdCBpcyBhIGBfX2xlMzJgIGFuZCBgRVhUX01BWF9CTE9DS1NgIHJlcHJlc2VudHMgdGhlIG1heGltdW0gYmxvY2sgbnVtYmVyLlxuXG5TbywgdGhlIG5leHQgcXVlc3Rpb24gaXMsIGlzIHRoaXMgcmVhY2hhYmxlPyBIb3cgaXMgYGV4dDRfZXh0X21pZ3JhdGUoKWAgYWN0dWFsbHkgY2FsbGVkPyBDYW4gd2UgZXhwbG9pdCB0aGlzIHdpdGggc3l6a2FsbGVyPyBMZXQncyBjaGVjayBzeXprYWxsZXIncyBzdXBwb3J0IGZvciBleHQ0IGFuZCB0aGUgYEVYVDRfSU9DX01JR1JBVEVgIG9yIGBGU19JT0NfU0VURkxBR1NgIGlvY3Rscy5cblxuSW4gTGludXggc3l6a2FsbGVyLCBpdCBzZWVtcyBsaWtlIGV4dDQgaW1hZ2VzIGFyZSBtb3VudGVkLCBhbmQgaW9jdGxzIGxpa2UgYEZTX0lPQ19TRVRGTEFHU2AgYW5kIGBFWFQ0X0lPQ19NSUdSQVRFYCBhcmUgdXNlZC4gR29vZC4gTm93LCB3aGF0IGFib3V0IHByaXZpbGVnZXMgZm9yIGBFWFQ0X0lPQ19NSUdSQVRFYD8gTG9va2luZyBpbnRvIGBmcy9leHQ0L2lvY3RsLmNgLCBJIHNlZSB0aGF0IGBpbm9kZV9vd25lcl9vcl9jYXBhYmxlYCBpcyBjaGVja2VkLiBJZiB0aGUgdXNlciBvd25zIHRoZSBpbm9kZSwgd2hpY2ggdGhleSBub3JtYWxseSBkbyB3aXRoIHRoZWlyIGZpbGVzLCB0aGV5IGhhdmUgcGVybWlzc2lvbiEgUGVyZmVjdC4gQW5kIHdoYXQgYWJvdXQgYEZTX0lPQ19TRVRGTEFHU2A/IEl0IGFwcGVhcnMgYGV4dDRfZXh0X21pZ3JhdGVgIGlzIGFsc28gY2FsbGVkIHRocm91Z2ggdGhpcyBpb2N0bCwgd2hlbiBhIGZsYWcgaXMgc2V0LiBUaGF0IG1lYW5zIGFuIHVucHJpdmlsZWdlZCB1c2VyIGNhbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoaXMgdmlhIHRoZSBgRlNfSU9DX1NFVEZMQUdTYCBhbmQgYEVYVDRfRVhURU5UU19GTGAgZmxhZy4gTGV0J3MgZGlnIGRlZXBlciBpbnRvIHBlcm1pc3Npb25zIHdpdGhpbiBgZXh0NF9pb2N0bF9zZXRmbGFnc2AgdG8gY29uZmlybS4gVGhpcyBpcyBzdGFydGluZyB0byBsb29rIHZlcnkgaW50ZXJlc3RpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NTgyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Nzk1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MzQuMDg1MzEyNzQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MDY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lvY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTkwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTkwOlxcdHN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBmbGFncylcXG4gNTkyOlxcdHtcXG4gNTkzOlxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4gNTk0OlxcdFxcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xcbiA1OTU6XFx0XFx0aW50IGVyciA9IC1FUEVSTSwgbWlncmF0ZSA9IDA7XFxuIDU5NjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XFxuIDU5NzpcXHRcXHR1bnNpZ25lZCBpbnQgb2xkZmxhZ3MsIG1hc2ssIGk7XFxuIDU5ODpcXHRcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuIDU5OTpcXHRcXG4gNjAwOlxcdFxcdC8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqL1xcbiA2MDE6XFx0XFx0aWYgKGV4dDRfaXNfcXVvdGFfZmlsZShpbm9kZSkpXFxuIDYwMjpcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjAzOlxcdFxcbiA2MDQ6XFx0XFx0b2xkZmxhZ3MgPSBlaS1cXHUwMDNlaV9mbGFncztcXG4gNjA1OlxcdFxcdC8qXFxuIDYwNjpcXHRcXHQgKiBUaGUgSk9VUk5BTF9EQVRBIGZsYWcgY2FuIG9ubHkgYmUgY2hhbmdlZCBieVxcbiA2MDc6XFx0XFx0ICogdGhlIHJlbGV2YW50IGNhcGFiaWxpdHkuXFxuIDYwODpcXHRcXHQgKi9cXG4gNjA5OlxcdFxcdGlmICgoZmxhZ3MgXiBvbGRmbGFncykgXFx1MDAyNiAoRVhUNF9KT1VSTkFMX0RBVEFfRkwpKSB7XFxuIDYxMDpcXHRcXHRcXHRpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpXFxuIDYxMTpcXHRcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjEyOlxcdFxcdH1cXG4gNjEzOlxcdFxcbiA2MTQ6XFx0XFx0aWYgKCFkYXhfY29tcGF0aWJsZShpbm9kZSwgb2xkZmxhZ3MsIGZsYWdzKSkge1xcbiA2MTU6XFx0XFx0XFx0ZXJyID0gLUVPUE5PVFNVUFA7XFxuIDYxNjpcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjE3OlxcdFxcdH1cXG4gNjE4OlxcdFxcbiA2MTk6XFx0XFx0aWYgKChmbGFncyBeIG9sZGZsYWdzKSBcXHUwMDI2IEVYVDRfRVhURU5UU19GTClcXG4gNjIwOlxcdFxcdFxcdG1pZ3JhdGUgPSAxO1xcbiA2MjE6XFx0XFxuIDYyMjpcXHRcXHRpZiAoKGZsYWdzIF4gb2xkZmxhZ3MpIFxcdTAwMjYgRVhUNF9DQVNFRk9MRF9GTCkge1xcbiA2MjM6XFx0XFx0XFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2Nhc2Vmb2xkKHNiKSkge1xcbiA2MjQ6XFx0XFx0XFx0XFx0ZXJyID0gLUVPUE5PVFNVUFA7XFxuIDYyNTpcXHRcXHRcXHRcXHRnb3RvIGZsYWdzX291dDtcXG4gNjI2OlxcdFxcdFxcdH1cXG4gNjI3OlxcdFxcbiA2Mjg6XFx0XFx0XFx0aWYgKCFTX0lTRElSKGlub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuIDYyOTpcXHRcXHRcXHRcXHRlcnIgPSAtRU5PVERJUjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6MzQuMDg1NDY0OTUyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUxNjM1NzczNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXh0NCBNaWdyYXRpb24gSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgYW5kIHRoaW5raW5nLCB0aGlzICpzaG91bGRuJ3QqIGJlIHRvbyBjb21wbGV4IGZyb20gYSBmaWxlIHN5c3RlbSBwZXJtaXNzaW9ucyBhbmQgb3duZXJzaGlwIHBlcnNwZWN0aXZlLiBXZSdyZSB0YWxraW5nIHN0YW5kYXJkIGlub2RlIHN0dWZmIGhlcmUsIG5vdGhpbmcgdW51c3VhbC4gUGx1cywgZXh0NCBpcyBhbHJlYWR5IHByZXR0eSB3ZWxsLWNvdmVyZWQgYnkgc3l6a2FsbGVyLCB3aGljaCBnaXZlcyBtZSBzb21lIGNvbmZpZGVuY2UgdGhhdCBhbnkgZ2xhcmluZyBpc3N1ZXMgd291bGQgaGF2ZSBiZWVuIGZvdW5kLlxuXG5NeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byBmaWd1cmUgb3V0IGhvdyBgZnMvZXh0NC9taWdyYXRlLmNgIGlzIGFjdHVhbGx5IGNvbXBpbGVkLiBXaGF0IGFyZSB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgbmVlZCB0byBiZSBzZXQgdG8gaW5jbHVkZSB0aGF0IGNvZGU/IEknbGwgbmVlZCB0byBkaWcgaW50byB0aGUgS2NvbmZpZyBvcHRpb25zLCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQgYWZmZWN0IGBmcy9leHQ0L21pZ3JhdGUuY2AgZGlyZWN0bHkuIFRoZW4sIEknbGwgbW92ZSBvbiB0byBjaGVja2luZyB0aGUgYGZzL2V4dDQvTWFrZWZpbGVgIHRvIHNlZSBob3cgdGhlIGJ1aWxkIHByb2Nlc3MgaGFuZGxlcyB0aGlzIGZpbGUgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUuIFVuZGVyc3RhbmRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgaXMga2V5IHRvIGZpZ3VyaW5nIG91dCB0aGUgcHJlY29uZGl0aW9ucyBmb3IgdGhlIGNvZGUgdG8gYmUgYXZhaWxhYmxlLCBhbmQgdGh1cywgZXhwbG9pdGFibGUuIFRoaXMgaXMgd2hlcmUgSSdsbCBiZWdpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2OTIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjM5LjI0OTA0NDU0OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDczMTA5MzIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWlncmF0ZVxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvTWFrZWZpbGU9OD1leHQ0LXlcXHQ6PSBiYWxsb2MubyBiaXRtYXAubyBibG9ja192YWxpZGl0eS5vIGRpci5vIGV4dDRfamJkMi5vIGV4dGVudHMubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZS05LVxcdFxcdGV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXFxcXFxcbmZzL2V4dDQvTWFrZWZpbGU6MTA6XFx0XFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZS0xMS1cXHRcXHRtbXAubyBtb3ZlX2V4dGVudC5vIG5hbWVpLm8gcGFnZS1pby5vIHJlYWRwYWdlLm8gcmVzaXplLm8gXFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDozOS4yOTYzNjYxNzFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzkwMDU1NTczNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeHQ0IE1vZHVsZSBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBgbWlncmF0ZS5vYC4uLiB0aGF0J3MgcGFydCBvZiB0aGUgYGV4dDQteWAgb2JqZWN0LCB3aGljaCBtZWFucyBpdCBnZXRzIGJ1aWx0IG9ubHkgd2hlbiB0aGUgRVhUNCBmaWxlc3lzdGVtIGlzIGVuYWJsZWQuIE9idmlvdXMsIGJ1dCBpdCdzIGdvb2QgdG8gY29uZmlybSB0aGUgYnVpbGQgbG9naWMuIE15IG5leHQgbW92ZSBpcyB0byBkb3VibGUtY2hlY2sgdGhlIGBmcy9leHQ0L0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIGZvbGxvd2luZyB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIOKAkyBgQ09ORklHX0VYVDRfRlNgLCBzcGVjaWZpY2FsbHkg4oCTIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY3kgY29ycmVjdGx5LiBHb3R0YSBiZSBwcmVjaXNlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVzeXN0ZW0gbW9kdWxlcy4gTm8gc3VycHJpc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE2NSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ0OjQ3LjE5NjkyNDM3N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDgyMDY4NzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEVYVDRfRlNcXFxcYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbmZzL2V4dDQvS2NvbmZpZzoyOmNvbmZpZyBFWFQ0X0ZTXFxuZnMvZXh0NC9LY29uZmlnLTMtXFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDo0Ny4yNDUxMzg4MVoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4NzE2OTY0NDk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBleHQ0IE1pZ3JhdGlvbiBMb2dpYyoqXG5cbk9rYXksIHRoZSBzdGFuZGFyZCBgRVhUNF9GU2AgaXMgaW4gcGxheS4gRmlyc3QsIGNhbiB0aGlzIGNvZGUgZXZlbiAqYmUqIGZ1enplZD8gWWVzLCBpdCdzIGNvcmUgZmlsZXN5c3RlbSBjb2RlIHdpdGhpbiBleHQ0LCB3aGljaCBpcyByZWFkaWx5IHJlYWNoYWJsZS4gVGhlIHByaW1hcnkgZ2F0ZSBpcyByZWFjaGFiaWxpdHkg4oCTIGxldCdzIGNoZWNrIHRoZSBjcml0ZXJpYS4gIFNlY3Rpb24gMidzIFwidW5yZWFjaGFibGVcIiBjcml0ZXJpYSBkb24ndCBhcHBseTsgdGhpcyBpcyBrZXJuZWwgY29kZSwgcGFydCBvZiBhIGNydWNpYWwgc3Vic3lzdGVtLiBTZWN0aW9uIDMgY2xhcmlmaWVzIHRoYXQgZmlsZXN5c3RlbSBjb2RlLCBzcGVjaWZpY2FsbHkgZXh0NCwgZmFsbHMgdW5kZXIgXCJjb3JlIHN1YnN5c3RlbXNcIiByZWxhdGVkIHRvIFZGUyBhbmQgc3RvcmFnZS4gIFN5emthbGxlciBzeXNjYWxscyBsaWtlIGBtb3VudGAsIGBvcGVuYCwgYHdyaXRlYCwgYW5kIGBpb2N0bGAgKGUuZy4sIGBGU19JT0NfU0VURkxBR1NgIG9yIGBFWFQ0X0lPQ19NSUdSQVRFYCkgY2FuIGNsZWFybHkgZXhlcmNpc2UgaXQuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZyA9IHRydWVgLlxuXG5Ob3csIHRoZSBzeW1ib2xzIHRvIHRhcmdldC4gSW4gYGZzL2V4dDQvbWlncmF0ZS5jYCwgdGhlIGBtaWdyYXRlX3N0cnVjdGAgd2FzIG1vZGlmaWVkLiAgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIHdlcmUgY2hhbmdlZCBmcm9tIGBleHQ0X2xibGtfdGAgdG8gYHU2NGAuIEFsc28sIHRoZSBmdW5jdGlvbiBgdXBkYXRlX2V4dGVudF9yYW5nZWAgd2FzIG1vZGlmaWVkLCBhZGRpbmcgYSBjaGVjayBmb3IgYEVYVF9NQVhfQkxPQ0tTYC5cblxuQnV0IHdhaXQsIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqc3RhdGljKiB3aXRoaW4gYG1pZ3JhdGUuY2AuIENhbiBhIHN0YXRpYyBmdW5jdGlvbiBiZSBhIFwiRm9jdXNTeW1ib2w/XCIgIFJ1bGUgNCBzdGF0ZXMgd2hlbiBgV29ydGhGdXp6aW5nPXRydWVgLCB3ZSBuZWVkIHRvIHRhcmdldCBzcGVjaWZpYyBsb2dpYyBvciBlbnRyeXBvaW50cyBhbmQgaGFuZGxlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIGNhcmVmdWxseS4gU3RhdGljIGlubGluZXMgbGFjayBkaXN0aW5jdCBzeW1ib2xzIGFuZCBhcmUgYSBjaGFsbGVuZ2UsIGJ1dCwgdGhpcyBpcyBhIHN0YXRpYyBDIGZ1bmN0aW9uLCAqbm90KiBhIHN0YXRpYyBpbmxpbmUuXG5cblNvLCBsZXQncyBzZWU6IGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpc24ndCBpbmxpbmVkISBMZXQncyBjaGVjayBjYWxsZXJzOiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gbWlncmF0aW9uLCBhbHNvIGB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZWAsIGB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2VgLCBgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlYC4gVGhhdCBpcyBjYWxsZWQgZnJvbSBgaW9jdGwuY2AuIFNpbmNlIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBpcyAqY2FsbGVkKiBieSBhIG5vbi1zdGF0aWMgZXhwb3J0ZWQgZnVuY3Rpb24gKGBleHQ0X2V4dF9taWdyYXRlYCksIHRoYXQncyBncmVhdCBhbmQgaXQgcHJvdmlkZXMgYSBzeW1ib2wgdGhhdCBjYW4gYmUgZnV6emVkIVxuXG5JdCdzIHN0YW5kYXJkIHByYWN0aWNlIHRvIGxpc3QgYm90aC4gIEFuZCB0aGUgc3RhdGljIGZ1bmN0aW9uIGNhbiBoYXZlIGEgc3ltYm9sISBMaXN0aW5nIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCBhbmQgYGV4dDRfZXh0X21pZ3JhdGVgIGNvdmVycyB0aGUgcmVsZXZhbnQgZmVhdHVyZXMuIFRoZSBvdGhlciBvbmUsIGBmaW5pc2hfcmFuZ2VgLCBpcyBhbHNvIHN0YXRpYyBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQsIGJ1dCBtYXliZSBub3QgYXMgaW1wb3J0YW50LiBgZXh0NF9leHRfbWlncmF0ZWAgaXMgY2FsbGVkIGJ5IGBleHQ0X2lvY3RsX3NldGZsYWdzYCBhbmQgYF9fZXh0NF9pb2N0bGAgaW4gYGZzL2V4dDQvaW9jdGwuY2AsIGFuZCBzbyBpdCBpcyB0aGUga2V5LiBUaG9zZSB0d28gYXJlIG5vbi11YmlxdWl0b3VzLCB0YXJnZXRlZCBzeW1ib2xzIVxuXG5GaW5hbGx5LCBsZXQncyBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3MuIGBFWFQ0X0ZTYCBpcyBhbHJlYWR5IGVuYWJsZWQuIExldCdzIHNlZSBpZiB0aGUgY29kZSBoYXMgYW55IGAjaWZkZWZgIGNvbmRpdGlvbmFscy4gSSdsbCBzY2FuIHRocm91Z2ggYG1pZ3JhdGUuY2AgdG8gYmUgY2VydGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE0NDcsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5OTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTUuOTYyMTE5ODc0WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjQwNTQwMiwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiI2lmXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NDo1Ni4wMDg1MzIxNTZaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE3NDM0MDM0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbml0aWFsIEFzc2Vzc21lbnQgXHUwMDI2IFZlcmlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBtaWdyYXRlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2Ugc29tZXRoaW5nIHNpZ25pZmljYW50OiB0aGVyZSBhcmUgKm5vKiBwcmVwcm9jZXNzb3IgYCNpZmRlZmAgZGlyZWN0aXZlcyBpbiB0aGlzIGZpbGUuIFRoYXQncyB1bnVzdWFsLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoZSBuYXR1cmUgb2YgZmlsZSBzeXN0ZW0gbWlncmF0aW9uLiBJdCBtYWtlcyBtZSB3b25kZXIgaWYgYSBjZXJ0YWluIGZpbGUgc3lzdGVtIGlzIGFsd2F5cyBlbmFibGVkLiBUaGlzIGxhY2sgb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2FycmFudHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaXMgbm90IHRpZWQgdG8gc29tZSBvdGhlciBjb25maWcuIFRoZXJlZm9yZSwgSSdsbCBzd2l0Y2ggZ2VhcnMgYW5kIHZlcmlmeSBhbnkgZGVwZW5kZW5jaWVzLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlIGZvciBgZnMvZXh0NGAgdG8gc2VlIGlmIGBFWFQ0X0ZTYCBoYXMgYW55IGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIGFuZCB3aGF0J3MgZHJpdmluZyB0aGUgYmVoYXZpb3Igb2YgYG1pZ3JhdGUuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMTQ4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTguMTgyODc1MDk2WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY2MjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIEVYVDRfRlNcXG4gICAzOlxcdFxcdHRyaXN0YXRlIFxcXCJUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbiAgIDU6XFx0XFx0c2VsZWN0IEpCRDJcXG4gICA2OlxcdFxcdHNlbGVjdCBDUkMxNlxcbiAgIDc6XFx0XFx0c2VsZWN0IENSQzMyXFxuICAgODpcXHRcXHRzZWxlY3QgRlNfSU9NQVBcXG4gICA5OlxcdFxcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxcbiAgMTA6XFx0XFx0aGVscFxcbiAgMTE6XFx0XFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cXG4gIDEyOlxcdFxcbiAgMTM6XFx0XFx0ICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sXFxuICAxNDpcXHRcXHQgIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiBleHQ0IGlzIG5vdCBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGhcXG4gIDE1OlxcdFxcdCAgZXh0MzsgaXQgaXMgYmFzZWQgb24gZXh0ZW50IG1hcHMgYW5kIGl0IHN1cHBvcnRzIDQ4LWJpdFxcbiAgMTY6XFx0XFx0ICBwaHlzaWNhbCBibG9jayBudW1iZXJzLiAgVGhlIGV4dDQgZmlsZXN5c3RlbSBhbHNvIHN1cHBvcnRzIGRlbGF5ZWRcXG4gIDE3OlxcdFxcdCAgYWxsb2NhdGlvbiwgcGVyc2lzdGVudCBwcmVhbGxvY2F0aW9uLCBoaWdoIHJlc29sdXRpb24gdGltZSBzdGFtcHMsXFxuICAxODpcXHRcXHQgIGFuZCBhIG51bWJlciBvZiBvdGhlciBmZWF0dXJlcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBzcGVlZFxcbiAgMTk6XFx0XFx0ICB1cCBmc2NrIHRpbWUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgd2ViIHBhZ2VzIGF0XFxuICAyMDpcXHRcXHQgIGh0dHA6Ly9leHQ0Lndpa2kua2VybmVsLm9yZy5cXG4gIDIxOlxcdFxcbiAgMjI6XFx0XFx0ICBUaGUgZXh0NCBmaWxlc3lzdGVtIHN1cHBvcnRzIG1vdW50aW5nIGFuIGV4dDMgZmlsZXN5c3RlbTsgd2hpbGUgdGhlcmVcXG4gIDIzOlxcdFxcdCAgYXJlIHNvbWUgcGVyZm9ybWFuY2UgZ2FpbnMgZnJvbSB0aGUgZGVsYXllZCBhbGxvY2F0aW9uIGFuZCBpbm9kZVxcbiAgMjQ6XFx0XFx0ICB0YWJsZSByZWFkYWhlYWQsIHRoZSBiZXN0IHBlcmZvcm1hbmNlIGdhaW5zIHJlcXVpcmUgZW5hYmxpbmcgZXh0NFxcbiAgMjU6XFx0XFx0ICBmZWF0dXJlcyBpbiB0aGUgZmlsZXN5c3RlbSB1c2luZyB0dW5lMmZzLCBvciBmb3JtYXR0aW5nIGEgbmV3XFxuICAyNjpcXHRcXHQgIGZpbGVzeXN0ZW0gYXMgYW4gZXh0NCBmaWxlc3lzdGVtIGluaXRpYWxseS4gV2l0aG91dCBleHBsaWNpdCBlbmFibGluZ1xcbiAgMjc6XFx0XFx0ICBvZiBleHQ0IGZlYXR1cmVzLCB0aGUgb24gZGlzayBmaWxlc3lzdGVtIGZvcm1hdCBzdGF5cyBmdWxseSBiYWNrd2FyZFxcbiAgMjg6XFx0XFx0ICBjb21wYXRpYmxlLlxcbiAgMjk6XFx0XFxuICAzMDpcXHRcXHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcXG4gIDMxOlxcdFxcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXFxuICAzMjpcXHRcXG4gIDMzOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXFxuICAzNjpcXHRcXHRib29sIFxcXCJVc2UgZXh0NCBmb3IgZXh0MiBmaWxlIHN5c3RlbXNcXFwiXFxuICAzNzpcXHRcXHRkZXBlbmRzIG9uIEVYVDRfRlNcXG4gIDM4OlxcdFxcdGRlcGVuZHMgb24gRVhUMl9GUz1uXFxuICAzOTpcXHRcXHRkZWZhdWx0IHlcXG4gIDQwOlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDQ6NTguMTgyOTQzMDY2WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxNzY0MDAwMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBFWFQ0IFBhdGNoKipcblxuT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIFRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBzZWVtcyBlYXN5OyBgRVhUNF9GU2AgcHVsbHMgaW4gYWxsIHRoZSBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzOiBgQlVGRkVSX0hFQURgLCBgSkJEMmAsIGBDUkMxNmAsIGBDUkMzMmAsIGFuZCBgRlNfSU9NQVBgLiBUaGVyZWZvcmUsIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdCBpcyBzaW1wbHkgYFtcIkVYVDRfRlNcIl1gLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LlxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhlIHJlbGV2YW50IHN5bWJvbHMuIENoZWNraW5nIGBGb2N1c1N5bWJvbHNgLCBJIHNlZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgYW5kIGBleHQ0X2V4dF9taWdyYXRlYCBwb3AgdXAuIFllcCwgdGhhdCdzIGV4cGVjdGVkLlxuXG5MZXQncyBxdWlja2x5IGFydGljdWxhdGUgdGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2UuIEZyb20gd2hhdCBJIGdhdGhlciwgdGhlIHBhdGNoIGFkZHJlc3NlcyBhIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2l0aGluIHRoZSBleHQ0IG1pZ3JhdGlvbiBsb2dpYy4gVGhpcyBjb252ZXJzaW9uLCBmcm9tIGluZGlyZWN0LWJsb2NrIG1hcHBpbmdzIHRvIGV4dGVudC1tYXBwZWQgZmlsZXMsIGludm9sdmVzIHdpZGVuaW5nIHRoZSBibG9jayBvZmZzZXRzIGluIGBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgKGBleHQ0X2xibGtfdGAsIG9yIGB1MzJgKSB0byA2NC1iaXQgKGB1NjRgKSB0byBwcmV2ZW50IGFuIGludGVnZXIgb3ZlcmZsb3cgY29uZGl0aW9uIHdoZW4gZGVhbGluZyB3aXRoIHZlcnkgbGFyZ2UgZmlsZXMuICBJdCdzIGFsc28gbm93IGNoZWNraW5nIGlmIGBjdXJyX2Jsb2NrYCBpcyBncmVhdGVyIHRoYW4gYEVYVF9NQVhfQkxPQ0tTYCwgd2hpY2ggcHJldmVudHMgYSBidWZmZXIgb3ZlcmZsb3cuIFRoZSBjb2RlIHBhdGggaXMgdHJpZ2dlcmVkIGJ5IGBFWFQ0X0lPQ19NSUdSQVRFYCBhbmQgYEZTX0lPQ19TRVRGTEFHU2AgKHdoZW4gc2V0dGluZyB0aGUgYEVYVDRfRVhURU5UU19GTGAgZmxhZykgb24gZXh0NCBmaWxlc3lzdGVtcy4gVGhpcyBpbmRpY2F0ZXMgaXQgdG91Y2hlcyBsaXZlIGZpbGVzeXN0ZW0gbG9naWMgYW5kIGlzIGRlZmluaXRlbHkgd29ydGggZnV6emluZy5cblxuR2l2ZW4gdGhpcyB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nLCBJJ20gY29uZmlkZW50IGluIHRoZSBhc3Nlc3NtZW50LiBJJ2xsIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzk3NiwiT3V0cHV0VG9rZW5zIjoxNjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToxOS45NDY5NDU1NTZaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MjQ2OTQxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVwZGF0ZV9leHRlbnRfcmFuZ2VcIixcbiAgICBcImV4dDRfZXh0X21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBleHQ0IGJsb2NrIG1pZ3JhdGlvbiBsb2dpYyAoY29udmVydGluZyBpbmRpcmVjdC1ibG9jayBtYXBwZWQgaW5vZGVzIHRvIGV4dGVudC1iYXNlZCBpbm9kZXMpIGJ5IHdpZGVuaW5nIGJsb2NrIG9mZnNldHMgaW4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IGZyb20gMzItYml0IHRvIDY0LWJpdCBhbmQgYWRkaW5nIGFuIHVwcGVyLWJvdW5kIGNoZWNrIGFnYWluc3QgRVhUX01BWF9CTE9DS1MgaW4gdXBkYXRlX2V4dGVudF9yYW5nZSgpIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHRoZSBFWFQ0X0lPQ19NSUdSQVRFIGlvY3RsIGFuZCBGU19JT0NfU0VURkxBR1Mgd2l0aCBFWFQ0X0VYVEVOVFNfRkwgb24gZXh0NCBmaWxlc3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjIwLjAyOTQyNDE5M1oiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzIwMzE0MTQzODI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6MjAuMDI5OTQyNjgyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzIwMzEzNjE4MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgZnMvZXh0NC9taWdyYXRlLmNgIGJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBpbiBgc3RydWN0IG1pZ3JhdGVfc3RydWN0YCBmcm9tIDMyLWJpdCBgZXh0NF9sYmxrX3RgIHRvIGB1NjRgIGFuZCBhZGRpbmcgYW4gdXBwZXIgYm91bmQgY2hlY2sgYGxiLVxcdTAwM2VjdXJyX2Jsb2NrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBpbiBgdXBkYXRlX2V4dGVudF9yYW5nZSgpYC4gVGhpcyBwcmV2ZW50cyBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGlub2RlcyBmcm9tIGluZGlyZWN0IGJsb2NrcyB0byBleHRlbnRzLlxcblxcblRoZSBgc3RydWN0IG1pZ3JhdGVfc3RydWN0IGxiYCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBleHQ0X2V4dF9taWdyYXRlKClgIGFuZCBpcyBleHBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgdXNpbmcgYG1lbXNldChcXHUwMDI2bGIsIDAsIHNpemVvZihsYikpYCBiZWZvcmUgdXNlLiBJdCBpcyBzdHJpY3RseSBpbnRlcm5hbCBrZXJuZWwgbWV0YWRhdGEgYW5kIGlzIG5ldmVyIGV4cG9zZWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGJyYW5jaGVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBrZXJuZWwgaW5mby1sZWFrcy4gU3RhbmRhcmQgYnVnIGRldGVjdG9ycyBhbmQgS0FTQU4gYXJlIHN1ZmZpY2llbnQsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZlYzJiMDZiMDljNjU1MjQ0YWFlOTY5NDcyNWZkZjkyMmYzYTkyNmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAwODo0MzoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmNcbmluZGV4IDVkNjBlZjEwZmUxMTAuLjlhZWQ0ZmRhZTY3ODcgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L21pZ3JhdGUuY1xuKysrIGIvZnMvZXh0NC9taWdyYXRlLmNcbkBAIC0xNCw3ICsxNCw3IEBAXG4gICogcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZXh0ZW50XG4gICovXG4gc3RydWN0IG1pZ3JhdGVfc3RydWN0IHtcbi1cdGV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuK1x0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xuIFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XG4gfTtcbiBcbkBAIC02Niw2ICs2NiwxMCBAQCBzdGF0aWMgaW50IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcbiB7XG4gXHRpbnQgcmV0dmFsO1xuK1xuK1x0aWYgKGxiLVx1MDAzZWN1cnJfYmxvY2sgXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuIFx0LypcbiBcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxuIFx0ICovXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyMC4wMjk5NDQxNDJaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzQ2OTI5MjQ3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgTWlncmF0aW9uIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgRXh0NCBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gdGhlIGtleSBtb2RpZmljYXRpb25zIHdpdGhpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBTcGVjaWZpY2FsbHksIEknbSBub3RpbmcgdGhlIGNoYW5nZSBpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFRoZSBhbHRlcmF0aW9uIGZyb20gYGV4dDRfbGJsa190YCB0byBgdTY0YCBmb3IgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGltbWVkaWF0ZWx5IGNhdGNoZXMgbXkgZXllLiBUaGlzIHN1Z2dlc3RzIGEgc2hpZnQgdG8gNjQtYml0IGJsb2NrIGFkZHJlc3NpbmcsIHdoaWNoIGxpa2VseSBpbmRpY2F0ZXMgdGhleSdyZSBhZGRyZXNzaW5nIHRoZSBsYXJnZXIgdm9sdW1lIHNpemVzIOKAkyB3ZSdyZSBwcm9iYWJseSBsb29raW5nIGF0IGEgbW92ZSB0b3dhcmRzIHN1cHBvcnRpbmcgbGFyZ2VyIGZpbGVzeXN0ZW1zLCBvciBhdCBsZWFzdCBhIHByZXBhcmF0aW9uIGZvciBpdC5cblxuTmV4dCwgSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBgdXBkYXRlX2V4dGVudF9yYW5nZWAgZnVuY3Rpb24sIHdoZXJlIHRoZSBhZGRpdGlvbiBvZiB0aGUgYGlmIChsYi1cdTAwM2VjdXJyX2Jsb2NrIFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHJldHVybiAtRU9QTk9UU1VQUDtgIGNoZWNrIGlzLiBUaGUgYEVYVF9NQVhfQkxPQ0tTYCBkZWZpbml0aW9uIHdpbGwgYmUgaW1wb3J0YW50LiBNeSBpbnN0aW5jdCBpcyB0aGF0IHRoaXMgaXMgc29tZSBmb3JtIG9mIGJvdW5kYXJ5IGNoZWNrIHRvIGVuc3VyZSB0aGUgYmxvY2sgbnVtYmVyIGRvZXNuJ3QgZXhjZWVkIGEgcHJlZGV0ZXJtaW5lZCBtYXhpbXVtLiBUaGUgYC1FT1BOT1RTVVBQYCBlcnJvciBpbmRpY2F0ZXMgdGhhdCBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLCBzbyB0aGUgc3lzdGVtIGlzIHRyeWluZyB0byBoYW5kbGUgdGhlIGZhY3QgdGhhdCB0aGlzIHBhcnRpY3VsYXIgYmxvY2sgYWRkcmVzc2luZyBpc24ndCBoYW5kbGVkIGNvcnJlY3RseS5cblxuSSdtIG5vdyBnb2luZyB0byBzdGFydCBzY2FubmluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgZnMvZXh0NC9taWdyYXRlLmNgIGFyb3VuZCB0aGVzZSBsaW5lcy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgb3JpZ2luYWwgY29uc3RyYWludHMsIHdoYXQgdGhpcyBsaW1pdCBhY3R1YWxseSByZXByZXNlbnRzLCBhbmQgaG93IHRoZSBzdXJyb3VuZGluZyBmdW5jdGlvbnMgdXRpbGl6ZSB0aGVzZSBibG9jayBudW1iZXJzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlIGFuZCB0aGUgcmVhc29ucyBmb3IgaXQuIElzIHRoaXMgYSBwbGFubmVkIGNoYW5nZSB0byBhIG1vcmUgY29tcGxleCBsYXlvdXQsIG9yIHNvbWUgb3RoZXIgY2hhbmdlIHRvIGJsb2NrIGFkZHJlc3NpbmcsIG9yIGFuIGF0dGVtcHQgdG8gcHJlcGFyZSBmb3IgbGFyZ2VyIHZvbHVtZXM/IEknbGwgc29vbiBzZWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNjksIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyNy40OTkyMzkzMTdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTA1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IExHUEwtMi4xXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwN1xcbiAgIDQ6XFx0ICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgXFx1MDAzY2FuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb21cXHUwMDNlXFxuICAgNTpcXHQgKlxcbiAgIDY6XFx0ICovXFxuICAgNzpcXHRcXG4gICA4OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXFwiZXh0NF9qYmQyLmhcXFwiXFxuICAxMDpcXHQjaW5jbHVkZSBcXFwiZXh0NF9leHRlbnRzLmhcXFwiXFxuICAxMTpcXHRcXG4gIDEyOlxcdC8qXFxuICAxMzpcXHQgKiBUaGUgY29udGlndW91cyBibG9ja3MgZGV0YWlscyB3aGljaCBjYW4gYmVcXG4gIDE0OlxcdCAqIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGV4dGVudFxcbiAgMTU6XFx0ICovXFxuICAxNjpcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbiAgMTc6XFx0XFx0dTY0IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrO1xcbiAgMTg6XFx0XFx0ZXh0NF9mc2Jsa190IGZpcnN0X3BibG9jaywgbGFzdF9wYmxvY2s7XFxuICAxOTpcXHR9O1xcbiAgMjA6XFx0XFxuICAyMTpcXHRzdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAgMjI6XFx0XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0e1xcbiAgMjU6XFx0XFx0aW50IHJldHZhbCA9IDAsIG5lZWRlZDtcXG4gIDI2OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleHQ7XFxuICAyNzpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDtcXG4gIDI4OlxcdFxcdGlmIChsYi1cXHUwMDNlZmlyc3RfcGJsb2NrID09IDApXFxuICAyOTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMwOlxcdFxcbiAgMzE6XFx0XFx0LyogQWRkIHRoZSBleHRlbnQgdG8gdGVtcCBpbm9kZSovXFxuICAzMjpcXHRcXHRuZXdleHQuZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihsYi1cXHUwMDNlZmlyc3RfYmxvY2spO1xcbiAgMzM6XFx0XFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG4gIDM0OlxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXh0LCBsYi1cXHUwMDNlZmlyc3RfcGJsb2NrKTtcXG4gIDM1OlxcdFxcdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXFxuICAzNjpcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gIDM3OlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBsYi1cXHUwMDNlZmlyc3RfYmxvY2ssIE5VTEwsIDApO1xcbiAgMzg6XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbiAgMzk6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDQwOlxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gIDQxOlxcdFxcdH1cXG4gIDQyOlxcdFxcbiAgNDM6XFx0XFx0LypcXG4gIDQ0OlxcdFxcdCAqIENhbGN1bGF0ZSB0aGUgY3JlZGl0IG5lZWRlZCB0byBpbnNlcnRpbmcgdGhpcyBleHRlbnRcXG4gIDQ1OlxcdFxcdCAqIFNpbmNlIHdlIGFyZSBkb2luZyB0aGlzIGluIGxvb3Agd2UgbWF5IGFjY3VtdWxhdGUgZXh0cmFcXG4gIDQ2OlxcdFxcdCAqIGNyZWRpdC4gQnV0IGJlbG93IHdlIHRyeSB0byBub3QgYWNjdW11bGF0ZSB0b28gbXVjaFxcbiAgNDc6XFx0XFx0ICogb2YgdGhlbSBieSByZXN0YXJ0aW5nIHRoZSBqb3VybmFsLlxcbiAgNDg6XFx0XFx0ICovXFxuICA0OTpcXHRcXHRuZWVkZWQgPSBleHQ0X2V4dF9jYWxjX2NyZWRpdHNfZm9yX3NpbmdsZV9leHRlbnQoaW5vZGUsXFxuICA1MDpcXHRcXHRcXHQgICAgbGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxLCBwYXRoKTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0XFx0cmV0dmFsID0gZXh0NF9kYXRhc2VtX2Vuc3VyZV9jcmVkaXRzKGhhbmRsZSwgaW5vZGUsIG5lZWRlZCwgbmVlZGVkLCAwKTtcXG4gIDUzOlxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbiAgNTQ6XFx0XFx0XFx0Z290byBlcnJfb3V0O1xcbiAgNTU6XFx0XFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXFx1MDAyNm5ld2V4dCwgMCk7XFxuICA1NjpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbiAgNTc6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihwYXRoKTtcXG4gIDU4OlxcdGVycl9vdXQ6XFxuICA1OTpcXHRcXHR1cF93cml0ZSgoXFx1MDAyNkVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGF0YV9zZW0pKTtcXG4gIDYwOlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4gIDYxOlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSAwO1xcbiAgNjI6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gIDYzOlxcdH1cXG4gIDY0OlxcdFxcbiAgNjU6XFx0c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuICA2NjpcXHRcXHRcXHRcXHQgICAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gIDY3OlxcdHtcXG4gIDY4OlxcdFxcdGludCByZXR2YWw7XFxuICA2OTpcXHRcXG4gIDcwOlxcdFxcdGlmIChsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG4gIDcxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gIDcyOlxcdFxcbiAgNzM6XFx0XFx0LypcXG4gIDc0OlxcdFxcdCAqIFNlZSBpZiB3ZSBjYW4gYWRkIG9uIHRvIHRoZSBleGlzdGluZyByYW5nZSAoaWYgaXQgZXhpc3RzKVxcbiAgNzU6XFx0XFx0ICovXFxuICA3NjpcXHRcXHRpZiAobGItXFx1MDAzZWZpcnN0X3BibG9jayBcXHUwMDI2XFx1MDAyNlxcbiAgNzc6XFx0XFx0XFx0KGxiLVxcdTAwM2VsYXN0X3BibG9jaysxID09IHBibG9jaykgXFx1MDAyNlxcdTAwMjZcXG4gIDc4OlxcdFxcdFxcdChsYi1cXHUwMDNlbGFzdF9ibG9jaysxID09IGxiLVxcdTAwM2VjdXJyX2Jsb2NrKSkge1xcbiAgNzk6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfcGJsb2NrID0gcGJsb2NrO1xcbiAgODA6XFx0XFx0XFx0bGItXFx1MDAzZWxhc3RfYmxvY2sgPSBsYi1cXHUwMDNlY3Vycl9ibG9jaztcXG4gIDgxOlxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuICA4MjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDgzOlxcdFxcdH1cXG4gIDg0OlxcdFxcdC8qXFxuICA4NTpcXHRcXHQgKiBTdGFydCBhIG5ldyByYW5nZS5cXG4gIDg2OlxcdFxcdCAqL1xcbiAgODc6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTtcXG4gIDg4OlxcdFxcdGxiLVxcdTAwM2VmaXJzdF9wYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9wYmxvY2sgPSBwYmxvY2s7XFxuICA4OTpcXHRcXHRsYi1cXHUwMDNlZmlyc3RfYmxvY2sgPSBsYi1cXHUwMDNlbGFzdF9ibG9jayA9IGxiLVxcdTAwM2VjdXJyX2Jsb2NrO1xcbiAgOTA6XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2srKztcXG4gIDkxOlxcdFxcdHJldHVybiByZXR2YWw7XFxuICA5MjpcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdHN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gIDk1OlxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuICA5NjpcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbiAgOTc6XFx0e1xcbiAgOTg6XFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4gIDk5OlxcdFxcdF9fbGUzMiAqaV9kYXRhO1xcbiAxMDA6XFx0XFx0aW50IGksIHJldHZhbCA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjI3LjQ5OTMzMTk3N1oiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDI3MjYwMDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvbWlncmF0ZS5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRyYWNlIGhvdyBpdCdzIGFsbG9jYXRlZCwgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGFjdHVhbGx5ICp1c2VkKiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIEV4dDQgZmlsZXN5c3RlbS4gSSBuZWVkIHRvIGdyYXNwIHRoaXMgdGhvcm91Z2hseSB0byByZWFsbHkgdW5kZXJzdGFuZCBob3cgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIHdvcmtzLiBMZXQncyBzZWUgaG93IHRoZXkgaGFuZGxlIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MTYwLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyOS45MjY1OTU1NzZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDE6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEwNDpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTA1OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTA2OlxcdFxcbiAxMDc6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEwODpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMDk6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMTA6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxMTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxMTI6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTEzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxMTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTE1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrKys7XFxuIDExNjpcXHRcXHRcXHR9XFxuIDExNzpcXHRcXHR9XFxuIDExODpcXHRcXHRwdXRfYmgoYmgpO1xcbiAxMTk6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gMTIwOlxcdFxcbiAxMjE6XFx0fVxcbiAxMjI6XFx0XFxuIDEyMzpcXHRzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiAxMjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssXFxuIDEyNTpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7XFxuIDEyODpcXHRcXHRfX2xlMzIgKmlfZGF0YTtcXG4gMTI5OlxcdFxcdGludCBpLCByZXR2YWwgPSAwO1xcbiAxMzA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxMzE6XFx0XFxuIDEzMjpcXHRcXHRiaCA9IGV4dDRfc2JfYnJlYWQoaW5vZGUtXFx1MDAzZWlfc2IsIHBibG9jaywgMCk7XFxuIDEzMzpcXHRcXHRpZiAoSVNfRVJSKGJoKSlcXG4gMTM0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGJoKTtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aV9kYXRhID0gKF9fbGUzMiAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuIDEzNzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWF4X2VudHJpZXM7IGkrKykge1xcbiAxMzg6XFx0XFx0XFx0aWYgKGlfZGF0YVtpXSkge1xcbiAxMzk6XFx0XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSxcXG4gMTQwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtpXSksIGxiKTtcXG4gMTQxOlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDE0MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQzOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDE0NDpcXHRcXHRcXHRcXHQvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi9cXG4gMTQ1OlxcdFxcdFxcdFxcdGxiLVxcdTAwM2VjdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzO1xcbiAxNDY6XFx0XFx0XFx0fVxcbiAxNDc6XFx0XFx0fVxcbiAxNDg6XFx0XFx0cHV0X2JoKGJoKTtcXG4gMTQ5OlxcdFxcdHJldHVybiByZXR2YWw7XFxuIDE1MDpcXHRcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGludCB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTU0OlxcdFxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbiAxNTU6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuIDE1NjpcXHR7XFxuIDE1NzpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxNTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDE1OTpcXHRcXHRpbnQgaSwgcmV0dmFsID0gMDtcXG4gMTYwOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUgXFx1MDAzZVxcdTAwM2UgMjtcXG4gMTYxOlxcdFxcbiAxNjI6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKGlub2RlLVxcdTAwM2VpX3NiLCBwYmxvY2ssIDApO1xcbiAxNjM6XFx0XFx0aWYgKElTX0VSUihiaCkpXFxuIDE2NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihiaCk7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdGlfZGF0YSA9IChfX2xlMzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbiAxNjc6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9lbnRyaWVzOyBpKyspIHtcXG4gMTY4OlxcdFxcdFxcdGlmIChpX2RhdGFbaV0pIHtcXG4gMTY5OlxcdFxcdFxcdFxcdHJldHZhbCA9IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpO1xcbiAxNzE6XFx0XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzM6XFx0XFx0XFx0fSBlbHNlIHtcXG4gMTc0OlxcdFxcdFxcdFxcdC8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqL1xcbiAxNzU6XFx0XFx0XFx0XFx0bGItXFx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllcztcXG4gMTc2OlxcdFxcdFxcdH1cXG4gMTc3OlxcdFxcdH1cXG4gMTc4OlxcdFxcdHB1dF9iaChiaCk7XFxuIDE3OTpcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiAxODA6XFx0XFxuIDE4MTpcXHR9XFxuIDE4MjpcXHRcXG4gMTgzOlxcdHN0YXRpYyBpbnQgZnJlZV9kaW5kX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLFxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyIGlfZGF0YSlcXG4gMTg1OlxcdHtcXG4gMTg2OlxcdFxcdGludCBpO1xcbiAxODc6XFx0XFx0X19sZTMyICp0bXBfaWRhdGE7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoO1xcbiAxODk6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAxOTA6XFx0XFx0dW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSBcXHUwMDNlXFx1MDAzZSAyO1xcbiAxOTE6XFx0XFx0aW50IGVycjtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0YmggPSBleHQ0X3NiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAwKTtcXG4gMTk0OlxcdFxcdGlmIChJU19FUlIoYmgpKVxcbiAxOTU6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoYmgpO1xcbiAxOTY6XFx0XFxuIDE5NzpcXHRcXHR0bXBfaWRhdGEgPSAoX19sZTMyICopYmgtXFx1MDAzZWJfZGF0YTtcXG4gMTk4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXhfZW50cmllczsgaSsrKSB7XFxuIDE5OTpcXHRcXHRcXHRpZiAodG1wX2lkYXRhW2ldKSB7XFxuIDIwMDpcXHRcXHRcXHRcXHRlcnIgPSBleHQ0X2pvdXJuYWxfZW5zdXJlX2NyZWRpdHMoaGFuZGxlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NToyOS45MjY3MDIxMTZaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA0MTkwODc3OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHByb2Nlc3NpbmcgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gdGhlIGV4dDQgTWlncmF0aW9uIENvZGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBmaWxlLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbWlncmF0aW9uIHByb2Nlc3MgaXMgc3RydWN0dXJlZCBhbmQgd2hlcmUgdGhlIGtleSBzdHJ1Y3R1cmVzLCBzcGVjaWZpY2FsbHkgYG1pZ3JhdGVfc3RydWN0YCwgZ2V0IHRoZWlyIHN0YXJ0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhhdCBgbWlncmF0ZV9zdHJ1Y3RgIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBtaWdyYXRpb24gY29udGV4dCBpcyBiZWluZyBidWlsdC4gTGV0J3Mgc2VlIHdoYXQgZnVydGhlciByZWFkaW5nIGluIHRoZSBzb3VyY2UgY29kZSB3aWxsIHRlbGwgbWUuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgZXhhY3QgcG9pbnQgd2hlcmUgdGhhdCBjcnVjaWFsIHN0cnVjdCBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTgyNywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6NDAuMzQ1NzkzNTI1WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTA3MzcwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtaWdyYXRlX3N0cnVjdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L21pZ3JhdGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L21pZ3JhdGUuYy0xNS0gKi9cXG5mcy9leHQ0L21pZ3JhdGUuYzoxNjpzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3Qge1xcbmZzL2V4dDQvbWlncmF0ZS5jLTE3LVxcdHU2NCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jaywgY3Vycl9ibG9jaztcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmM6MjI6XFx0XFx0XFx0XFx0c3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0yMy1cXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTY1PXN0YXRpYyBpbnQgdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjY2OlxcdFxcdFxcdCAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKVxcbmZzL2V4dDQvbWlncmF0ZS5jLTY3LXtcXG4tLVxcbmZzL2V4dDQvbWlncmF0ZS5jPTk0PXN0YXRpYyBpbnQgdXBkYXRlX2luZF9leHRlbnRfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L21pZ3JhdGUuYy05NS1cXHRcXHRcXHRcXHQgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjk2OlxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpXFxuZnMvZXh0NC9taWdyYXRlLmMtOTcte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MTIzPXN0YXRpYyBpbnQgdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmMtMTI0LVxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjEyNTpcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0xMjYte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9MTUzPXN0YXRpYyBpbnQgdXBkYXRlX3RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuZnMvZXh0NC9taWdyYXRlLmMtMTU0LVxcdFxcdFxcdFxcdCAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLFxcbmZzL2V4dDQvbWlncmF0ZS5jOjE1NTpcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYilcXG5mcy9leHQ0L21pZ3JhdGUuYy0xNTYte1xcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NDE0PWludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy00MjAtXFx0c3RydWN0IGlub2RlICp0bXBfaW5vZGUgPSBOVUxMO1xcbmZzL2V4dDQvbWlncmF0ZS5jOjQyMTpcXHRzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7XFxuZnMvZXh0NC9taWdyYXRlLmMtNDIyLVxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjQwLjM5NDg3MTE5N1oiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMjYzNDA3NzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGBmcy9leHQ0L21pZ3JhdGUuY2AgLSBMaW5lcyA0MTQtNTAwKipcblxuT2theSwgdGltZSB0byB6ZXJvIGluIG9uIGxpbmVzIDQxNCB0aHJvdWdoIDUwMCBpbiBgZnMvZXh0NC9taWdyYXRlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHNlY3Rpb24gdGhvcm91Z2hseS4gQmFzZWQgb24gdGhlIGZpbGUgbmFtZSwgaXQncyBwcmV0dHkgY2xlYXIgdGhpcyBpcyBhYm91dCBtaWdyYXRpb24gcHJvY2Vzc2VzIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzbyB0aGlzIHByb2JhYmx5IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCB1cGdyYWRpbmcgb3IgY2hhbmdpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBmaWxlIHN5c3RlbS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgYW5kIGZpZ3VyZSBvdXQgdGhlIGNvcm5lciBjYXNlcy4gSSdsbCBiZSBsb29raW5nIGZvciBhbnkgcG90ZW50aWFsIGZvciByZWdyZXNzaW9ucyBvciBwZXJmb3JtYW5jZSBpbXBhY3QsIGFzIHdlbGwgYXMgaWYgdGhpcyBpcyB0b3VjaGluZyBhbnkgZmVhdHVyZXMgSSBhbSBmYW1pbGlhciB3aXRoLiBJIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYXNwZWN0cyBvZiB0aGUgbWlncmF0aW9uIGFyZSBhY3R1YWxseSBoYW5kbGVkIHdpdGhpbiB0aGlzIHJlZ2lvbiBvZiBjb2RlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NjI4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDU6NDMuNjU4MjgxMzQxWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkyNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQxNCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQxNDpcXHRpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA0MTU6XFx0e1xcbiA0MTY6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4gNDE3OlxcdFxcdGludCByZXR2YWwgPSAwLCBpO1xcbiA0MTg6XFx0XFx0X19sZTMyICppX2RhdGE7XFxuIDQxOTpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTtcXG4gNDIwOlxcdFxcdHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlID0gTlVMTDtcXG4gNDIxOlxcdFxcdHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYjtcXG4gNDIyOlxcdFxcdHVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7XFxuIDQyMzpcXHRcXHRfX3UzMiBnb2FsLCB0bXBfY3N1bV9zZWVkO1xcbiA0MjQ6XFx0XFx0dWlkX3Qgb3duZXJbMl07XFxuIDQyNTpcXHRcXHRpbnQgYWxsb2NfY3R4O1xcbiA0MjY6XFx0XFxuIDQyNzpcXHRcXHQvKlxcbiA0Mjg6XFx0XFx0ICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBvciB0aGUgaW5vZGVcXG4gNDI5OlxcdFxcdCAqIGFscmVhZHkgaXMgZXh0ZW50LWJhc2VkLCBlcnJvciBvdXQuXFxuIDQzMDpcXHRcXHQgKi9cXG4gNDMxOlxcdFxcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSB8fFxcbiA0MzI6XFx0XFx0ICAgIGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpIHx8XFxuIDQzMzpcXHRcXHQgICAgZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXG4gNDM2OlxcdFxcdGlmIChTX0lTTE5LKGlub2RlLVxcdTAwM2VpX21vZGUpIFxcdTAwMjZcXHUwMDI2IGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9PSAwKVxcbiA0Mzc6XFx0XFx0XFx0LypcXG4gNDM4OlxcdFxcdFxcdCAqIGRvbid0IG1pZ3JhdGUgZmFzdCBzeW1saW5rXFxuIDQzOTpcXHRcXHRcXHQgKi9cXG4gNDQwOlxcdFxcdFxcdHJldHVybiByZXR2YWw7XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdFxcdGFsbG9jX2N0eCA9IGV4dDRfd3JpdGVwYWdlc19kb3duX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gNDQzOlxcdFxcbiA0NDQ6XFx0XFx0LypcXG4gNDQ1OlxcdFxcdCAqIFdvcnN0IGNhc2Ugd2UgY2FuIHRvdWNoIHRoZSBhbGxvY2F0aW9uIGJpdG1hcHMgYW5kIGEgYmxvY2tcXG4gNDQ2OlxcdFxcdCAqIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2suICBXZSBkbyBuZWVkIHRvIHdvcnJ5IGFib3V0XFxuIDQ0NzpcXHRcXHQgKiBjcmVkaXRzIGZvciBtb2RpZnlpbmcgdGhlIHF1b3RhIGlub2RlLlxcbiA0NDg6XFx0XFx0ICovXFxuIDQ0OTpcXHRcXHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfTUlHUkFURSxcXG4gNDUwOlxcdFxcdFxcdDMgKyBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtXFx1MDAzZWlfc2IpKTtcXG4gNDUxOlxcdFxcbiA0NTI6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDQ1MzpcXHRcXHRcXHRyZXR2YWwgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDQ1NDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDQ1NTpcXHRcXHR9XFxuIDQ1NjpcXHRcXHQvKlxcbiA0NTc6XFx0XFx0ICogVGhpcyBvcGVyYXRpb24gcmV3cml0ZXMgdGhlIGlub2RlJ3MgYmxvY2sgbWFwcGluZyBsYXlvdXRcXG4gNDU4OlxcdFxcdCAqIChpbmRpcmVjdCB0byBleHRlbnRzKSBhbmQgaXMgbm90IHRyYWNrZWQgaW4gdGhlIGZhc3QgY29tbWl0XFxuIDQ1OTpcXHRcXHQgKiBsb2csIHNvIGRpc2FibGUgZmFzdCBjb21taXRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxcbiA0NjA6XFx0XFx0ICovXFxuIDQ2MTpcXHRcXHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShpbm9kZS1cXHUwMDNlaV9zYiwgRVhUNF9GQ19SRUFTT05fTUlHUkFURSwgaGFuZGxlKTtcXG4gNDYyOlxcdFxcdGdvYWwgPSAoKCgodTMyKWlub2RlLVxcdTAwM2VpX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVxcdTAwM2VpX3NiKSkgKlxcbiA0NjM6XFx0XFx0XFx0RVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLVxcdTAwM2VpX3NiKSkgKyAxO1xcbiA0NjQ6XFx0XFx0b3duZXJbMF0gPSBpX3VpZF9yZWFkKGlub2RlKTtcXG4gNDY1OlxcdFxcdG93bmVyWzFdID0gaV9naWRfcmVhZChpbm9kZSk7XFxuIDQ2NjpcXHRcXHR0bXBfaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRfaW5vZGUoaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCksXFxuIDQ2NzpcXHRcXHRcXHRcXHRcXHQgICBTX0lGUkVHLCBOVUxMLCBnb2FsLCBvd25lciwgMCk7XFxuIDQ2ODpcXHRcXHRpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHtcXG4gNDY5OlxcdFxcdFxcdHJldHZhbCA9IFBUUl9FUlIodG1wX2lub2RlKTtcXG4gNDcwOlxcdFxcdFxcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XFxuIDQ3MTpcXHRcXHRcXHR0bXBfaW5vZGUgPSBOVUxMO1xcbiA0NzI6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiA0NzM6XFx0XFx0fVxcbiA0NzQ6XFx0XFx0LypcXG4gNDc1OlxcdFxcdCAqIFVzZSB0aGUgY29ycmVjdCBzZWVkIGZvciBjaGVja3N1bSAoaS5lLiB0aGUgc2VlZCBmcm9tICdpbm9kZScpLiAgVGhpc1xcbiA0NzY6XFx0XFx0ICogaXMgc28gdGhhdCB0aGUgbWV0YWRhdGEgYmxvY2tzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBjaGVja3N1bSBhZnRlclxcbiA0Nzc6XFx0XFx0ICogdGhlIG1pZ3JhdGlvbi5cXG4gNDc4OlxcdFxcdCAqL1xcbiA0Nzk6XFx0XFx0ZWkgPSBFWFQ0X0koaW5vZGUpO1xcbiA0ODA6XFx0XFx0dG1wX2NzdW1fc2VlZCA9IEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZDtcXG4gNDgxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IGVpLVxcdTAwM2VpX2NzdW1fc2VlZDtcXG4gNDgyOlxcdFxcdGlfc2l6ZV93cml0ZSh0bXBfaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7XFxuIDQ4MzpcXHRcXHQvKlxcbiA0ODQ6XFx0XFx0ICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyXFxuIDQ4NTpcXHRcXHQgKiB3aGVuIHdlIGRyb3AgaW5vZGUgcmVmZXJlbmNlLlxcbiA0ODY6XFx0XFx0ICovXFxuIDQ4NzpcXHRcXHRjbGVhcl9ubGluayh0bXBfaW5vZGUpO1xcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA0OTA6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNDkxOlxcdFxcbiA0OTI6XFx0XFx0LypcXG4gNDkzOlxcdFxcdCAqIHN0YXJ0IHdpdGggb25lIGNyZWRpdCBhY2NvdW50ZWQgZm9yXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ1OjQzLjY1ODM3NjAyMVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4OTA2ODQ1ODQzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGV4dDQncyBNaWdyYXRpb24gTG9naWMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBiYWNrIGludG8gdGhlIG5pdHR5LWdyaXR0eS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoaXMgYGV4dDRfbWlncmF0ZWAgZnVuY3Rpb24g4oCTIHNwZWNpZmljYWxseSwgc2VjdGlvbnMgNDk0IHRvIDU1MCB3aXRoaW4gYGZzL2V4dDQvbWlncmF0ZS5jYC4gSSByZWNhbGwgdGhpcyBpcyB3aGVyZSB0aGUgY29yZSBsb2dpYyBmb3IgbWlncmF0aW5nIGlub2RlcyBhbmQgZGF0YSBibG9ja3MgbGlrZWx5IHJlc2lkZXMuIEknbSBmb2N1c2luZyBvbiB0aGF0IHNwZWNpZmljIHJhbmdlIHRvIHBpbnBvaW50IHRoZSBtaWdyYXRpb24gc3RyYXRlZ3kgaW1wbGVtZW50ZWQuIEkgc3VzcGVjdCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgZGV0YWlscyB0aGUgaGFuZGxpbmcgb2YgYmxvY2sgYWxsb2NhdGlvbiwgbWV0YWRhdGEgdXBkYXRlcyAoaW5vZGUgbnVtYmVycywgZ3JvdXAgZGVzY3JpcHRvcnMsIGJpdG1hcHMsIGFuZCBzbyBvbiksIGFuZCBwb3RlbnRpYWxseSBhbnkgY29uc2lkZXJhdGlvbnMgZm9yIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgZHVyaW5nIHRoZSBwcm9jZXNzLiBJJ20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyBpdCBoYW5kbGVzIGF0b21pY2l0eSBhbmQgZGF0YSBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhpcyBwb3RlbnRpYWxseSBjb21wbGV4IHRyYW5zZm9ybWF0aW9uLiBJcyBpdCB1c2luZyBqb3VybmFsaW5nIHRvIHByb3RlY3QgYWdhaW5zdCBmYWlsdXJlcz8gSG93IGFyZSBibG9jayBudW1iZXJzIG1hbmFnZWQgZHVyaW5nIHRoZSBtb3ZlPyBJIGFsc28gd2FudCB0byBzZWUgaWYgdGhpcyBoYW5kbGVzIGFueSBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIERvZXMgaXQgYWxsb3cgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIG9yIGRvZXMgaXQgdGFrZSBleGNsdXNpdmUgbG9jayBpbiBvcmRlciB0byBtaWdyYXRlIGlub2Rlcz8gTGV0J3MgZ2V0IHRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MTg5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NTo1Mi41NjUyMjQxNzRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE2ODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvbWlncmF0ZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ5NCxcbiAgXCJMaW5lQ291bnRcIjogNTZcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ5NDpcXHRcXHQgKiBzdXBlcmJsb2NrIG1vZGlmaWNhdGlvbi5cXG4gNDk1OlxcdFxcdCAqXFxuIDQ5NjpcXHRcXHQgKiBGb3IgdGhlIHRtcF9pbm9kZSB3ZSBhbHJlYWR5IGhhdmUgY29tbWl0dGVkIHRoZVxcbiA0OTc6XFx0XFx0ICogdHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBpbm9kZS4gTGF0ZXIgYXMgYW5kXFxuIDQ5ODpcXHRcXHQgKiB3aGVuIHdlIGFkZCBleHRlbnRzIHdlIGV4dGVudCB0aGUgam91cm5hbFxcbiA0OTk6XFx0XFx0ICovXFxuIDUwMDpcXHRcXHQvKlxcbiA1MDE6XFx0XFx0ICogRXZlbiB0aG91Z2ggd2UgdGFrZSBpX3J3c2VtIHdlIGNhbiBzdGlsbCBjYXVzZSBibG9ja1xcbiA1MDI6XFx0XFx0ICogYWxsb2NhdGlvbiB2aWEgbW1hcCB3cml0ZSB0byBob2xlcy4gSWYgd2UgaGF2ZSBhbGxvY2F0ZWRcXG4gNTAzOlxcdFxcdCAqIG5ldyBibG9ja3Mgd2UgZmFpbCBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbFxcbiA1MDQ6XFx0XFx0ICogY2xlYXIgRVhUNF9TVEFURV9FWFRfTUlHUkFURSBmbGFnLiAgVGhlIGZsYWcgaXMgdXBkYXRlZFxcbiA1MDU6XFx0XFx0ICogd2l0aCBpX2RhdGFfc2VtIGhlbGQgdG8gcHJldmVudCByYWNpbmcgd2l0aCBibG9ja1xcbiA1MDY6XFx0XFx0ICogYWxsb2NhdGlvbi5cXG4gNTA3OlxcdFxcdCAqL1xcbiA1MDg6XFx0XFx0ZG93bl9yZWFkKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4gNTA5OlxcdFxcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFKTtcXG4gNTEwOlxcdFxcdHVwX3JlYWQoKFxcdTAwMjZFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFfc2VtKSk7XFxuIDUxMTpcXHRcXG4gNTEyOlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9NSUdSQVRFLCAxKTtcXG4gNTEzOlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbiA1MTQ6XFx0XFx0XFx0cmV0dmFsID0gUFRSX0VSUihoYW5kbGUpO1xcbiA1MTU6XFx0XFx0XFx0Z290byBvdXRfdG1wX2lub2RlO1xcbiA1MTY6XFx0XFx0fVxcbiA1MTc6XFx0XFxuIDUxODpcXHRcXHRpX2RhdGEgPSBlaS1cXHUwMDNlaV9kYXRhO1xcbiA1MTk6XFx0XFx0bWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7XFxuIDUyMDpcXHRcXG4gNTIxOlxcdFxcdC8qIDMyIGJpdCBibG9jayBhZGRyZXNzIDQgYnl0ZXMgKi9cXG4gNTIyOlxcdFxcdG1heF9lbnRyaWVzID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIFxcdTAwM2VcXHUwMDNlIDI7XFxuIDUyMzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRVhUNF9ORElSX0JMT0NLUzsgaSsrKSB7XFxuIDUyNDpcXHRcXHRcXHRpZiAoaV9kYXRhW2ldKSB7XFxuIDUyNTpcXHRcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1MjY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW2ldKSwgXFx1MDAyNmxiKTtcXG4gNTI3OlxcdFxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDUyODpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIDUyOTpcXHRcXHRcXHR9IGVsc2VcXG4gNTMwOlxcdFxcdFxcdFxcdGxiLmN1cnJfYmxvY2srKztcXG4gNTMxOlxcdFxcdH1cXG4gNTMyOlxcdFxcdGlmIChpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdKSB7XFxuIDUzMzpcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSxcXG4gNTM0OlxcdFxcdFxcdFxcdFxcdGxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X0lORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTM2OlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTM3OlxcdFxcdH0gZWxzZVxcbiA1Mzg6XFx0XFx0XFx0bGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcztcXG4gNTM5OlxcdFxcdGlmIChpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSkge1xcbiA1NDA6XFx0XFx0XFx0cmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLFxcbiA1NDE6XFx0XFx0XFx0XFx0XFx0bGUzMl90b19jcHUoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pLCBcXHUwMDI2bGIpO1xcbiA1NDI6XFx0XFx0XFx0aWYgKHJldHZhbClcXG4gNTQzOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTQ0OlxcdFxcdH0gZWxzZVxcbiA1NDU6XFx0XFx0XFx0bGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzO1xcbiA1NDY6XFx0XFx0aWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7XFxuIDU0NzpcXHRcXHRcXHRyZXR2YWwgPSB1cGRhdGVfdGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsXFxuIDU0ODpcXHRcXHRcXHRcXHRcXHRsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSksIFxcdTAwMjZsYik7XFxuIDU0OTpcXHRcXHRcXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NTo1Mi41NjUzNDMyODRaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Nzc3NjgzMzMyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgdGhlIE1lbW9yeSBJbml0aWFsaXphdGlvbiBpbiBgZXh0NF9leHRfbWlncmF0ZWAqKlxuXG5Pa2F5LCBsaW5lIDUxOSBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgaXQncyBjcnVjaWFsIHRvIGJlIHByZWNpc2Ugd2l0aCB0aGVzZSB0aGluZ3MuIEknbSBzZWVpbmcgYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSk7YC4gUmlnaHQsIHNvIGBsYmAgaXMgZXhwbGljaXRseSBiZWluZyB6ZXJvZWQgb3V0IHVzaW5nIGBtZW1zZXRgLiBUaGF0IHRlbGxzIG1lIHRoZSBkZXZlbG9wZXIgaXMgYmVpbmcgZGlsaWdlbnQgYWJvdXQgbWVtb3J5IGluaXRpYWxpemF0aW9uLCB3aGljaCBpcyBnb29kIHByYWN0aWNlIOKAkyBlc3BlY2lhbGx5IGluIGEga2VybmVsIGNvbnRleHQuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyAqd2h5Kj8gSXMgaXQgc2ltcGx5IGRlZmVuc2l2ZSBwcm9ncmFtbWluZywgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gdGhlIHN0cnVjdHVyZSBuZWVkcyB0byBzdGFydCBpbiBhIGtub3duLCBjbGVhbiBzdGF0ZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudC4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gY2hlY2sgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYGV4dDRfZXh0X21pZ3JhdGVgIGl0c2VsZiwgYW5kIG5vdCBvbmx5IHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAqYW55d2hlcmUqIGBsYmAgb3IgYG1pZ3JhdGVfc3RydWN0YCBpcyB1c2VkIGlzIHJldmlld2VkLiBUaGVyZSBtaWdodCBiZSBhbiBhc3N1bXB0aW9uIGxhdGVyIG9uIHRoYXQgcmVsaWVzIG9uIHRoaXMgemVybyBpbml0aWFsaXphdGlvbi4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgYW5kIGRhdGEgZGVwZW5kZW5jaWVzLiBMZXQncyBkaWcgZGVlcGVyIGFuZCBnZXQgYSBjbGVhciBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDQ5LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjowMC4zNDIxNzkxNVoiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDcwMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9taWdyYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTUwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTUwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX291dDtcXG4gNTUxOlxcdFxcdH1cXG4gNTUyOlxcdFxcdC8qXFxuIDU1MzpcXHRcXHQgKiBCdWlsZCB0aGUgbGFzdCBleHRlbnRcXG4gNTU0OlxcdFxcdCAqL1xcbiA1NTU6XFx0XFx0cmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLCBcXHUwMDI2bGIpO1xcbiA1NTY6XFx0ZXJyX291dDpcXG4gNTU3OlxcdFxcdGlmIChyZXR2YWwpXFxuIDU1ODpcXHRcXHRcXHQvKlxcbiA1NTk6XFx0XFx0XFx0ICogRmFpbHVyZSBjYXNlIGRlbGV0ZSB0aGUgZXh0ZW50IGluZm9ybWF0aW9uIHdpdGggdGhlXFxuIDU2MDpcXHRcXHRcXHQgKiB0bXBfaW5vZGVcXG4gNTYxOlxcdFxcdFxcdCAqL1xcbiA1NjI6XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NjM6XFx0XFx0ZWxzZSB7XFxuIDU2NDpcXHRcXHRcXHRyZXR2YWwgPSBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEoaGFuZGxlLCBpbm9kZSwgdG1wX2lub2RlKTtcXG4gNTY1OlxcdFxcdFxcdGlmIChyZXR2YWwpXFxuIDU2NjpcXHRcXHRcXHRcXHQvKlxcbiA1Njc6XFx0XFx0XFx0XFx0ICogaWYgd2UgZmFpbCB0byBzd2FwIGlub2RlIGRhdGEgZnJlZSB0aGUgZXh0ZW50XFxuIDU2ODpcXHRcXHRcXHRcXHQgKiBkZXRhaWxzIG9mIHRoZSB0bXAgaW5vZGVcXG4gNTY5OlxcdFxcdFxcdFxcdCAqL1xcbiA1NzA6XFx0XFx0XFx0XFx0ZnJlZV9leHRfYmxvY2soaGFuZGxlLCB0bXBfaW5vZGUpO1xcbiA1NzE6XFx0XFx0fVxcbiA1NzI6XFx0XFxuIDU3MzpcXHRcXHQvKiBXZSBtYXJrIHRoZSB0bXBfaW5vZGUgZGlydHkgdmlhIGV4dDRfZXh0X3RyZWVfaW5pdC4gKi9cXG4gNTc0OlxcdFxcdHJldHZhbCA9IGV4dDRfam91cm5hbF9lbnN1cmVfY3JlZGl0cyhoYW5kbGUsIDEsIDApO1xcbiA1NzU6XFx0XFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuIDU3NjpcXHRcXHRcXHRnb3RvIG91dF9zdG9wO1xcbiA1Nzc6XFx0XFx0LypcXG4gNTc4OlxcdFxcdCAqIE1hcmsgdGhlIHRtcF9pbm9kZSBhcyBvZiBzaXplIHplcm9cXG4gNTc5OlxcdFxcdCAqL1xcbiA1ODA6XFx0XFx0aV9zaXplX3dyaXRlKHRtcF9pbm9kZSwgMCk7XFxuIDU4MTpcXHRcXG4gNTgyOlxcdFxcdC8qXFxuIDU4MzpcXHRcXHQgKiBzZXQgdGhlICBpX2Jsb2NrcyBjb3VudCB0byB6ZXJvXFxuIDU4NDpcXHRcXHQgKiBzbyB0aGF0IHRoZSBleHQ0X2V2aWN0X2lub2RlKCkgZG9lcyB0aGVcXG4gNTg1OlxcdFxcdCAqIHJpZ2h0IGpvYlxcbiA1ODY6XFx0XFx0ICpcXG4gNTg3OlxcdFxcdCAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGUgaV9sb2NrIGJlY2F1c2VcXG4gNTg4OlxcdFxcdCAqIHRoZSBpbm9kZSBpcyBub3QgdmlzaWJsZSB0byB1c2VyIHNwYWNlLlxcbiA1ODk6XFx0XFx0ICovXFxuIDU5MDpcXHRcXHR0bXBfaW5vZGUtXFx1MDAzZWlfYmxvY2tzID0gMDtcXG4gNTkxOlxcdFxcdEVYVDRfSSh0bXBfaW5vZGUpLVxcdTAwM2VpX2NzdW1fc2VlZCA9IHRtcF9jc3VtX3NlZWQ7XFxuIDU5MjpcXHRcXG4gNTkzOlxcdFxcdC8qIFJlc2V0IHRoZSBleHRlbnQgZGV0YWlscyAqL1xcbiA1OTQ6XFx0XFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgdG1wX2lub2RlKTtcXG4gNTk1OlxcdG91dF9zdG9wOlxcbiA1OTY6XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNTk3OlxcdG91dF90bXBfaW5vZGU6XFxuIDU5ODpcXHRcXHR1bmxvY2tfbmV3X2lub2RlKHRtcF9pbm9kZSk7XFxuIDU5OTpcXHRvdXRfdW5sb2NrOlxcbiA2MDA6XFx0XFx0ZXh0NF93cml0ZXBhZ2VzX3VwX3dyaXRlKGlub2RlLVxcdTAwM2VpX3NiLCBhbGxvY19jdHgpO1xcbiA2MDE6XFx0XFx0aXB1dCh0bXBfaW5vZGUpO1xcbiA2MDI6XFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gNjAzOlxcdH1cXG4gNjA0OlxcdFxcbiA2MDU6XFx0LypcXG4gNjA2OlxcdCAqIE1pZ3JhdGUgYSBzaW1wbGUgZXh0ZW50LWJhc2VkIGlub2RlIHRvIHVzZSB0aGUgaV9ibG9ja3NbXSBhcnJheVxcbiA2MDc6XFx0ICovXFxuIDYwODpcXHRpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiA2MDk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjowMC4zNDIyODgwMTlaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjMxNTIzMjQ0MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEludGVnZXIgT3ZlcmZsb3cgVnVsbmVyYWJpbGl0eSBpbiB0aGUgRXh0NCBGaWxlc3lzdGVtIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIGZpZ3VyZSBvdXQgd2hhdCBpdCdzIGFkZHJlc3NpbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoZXJlJ3MgYSBwb3RlbnRpYWwgaW50ZWdlciBvdmVyZmxvdyBpc3N1ZSBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtJ3MgbWlncmF0aW9uIHN0cnVjdHVyZS4gU3BlY2lmaWNhbGx5LCBpdCBsb29rcyBsaWtlIHdpdGhpbiB0aGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAsIHRoZSBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgbWVtYmVycyBhcmUgYWxsIGRlZmluZWQgYXMgYGV4dDRfbGJsa190YCwgd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBhIGB1MzJgIOKAkyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLlxuXG5UaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBzZWVtcyB0byBiZSB3aXRoIGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgYGN1cnJfYmxvY2tgLiBUaGUgcGF0Y2ggbWVudGlvbnMgYW4gb3BlcmF0aW9uIGxpa2UgYGxiLVx1MDAzZWN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllc2AgYW5kIGluY3JlbWVudHMgd2l0aGluIGluZGlyZWN0IGJsb2NrIHRyYXZlcnNhbHMuIFRoaXMgaXMgd2hlcmUgSSBzZWUgdGhlIGltbWVkaWF0ZSByZWQgZmxhZy4gV2l0aCBwb3RlbnRpYWxseSBsYXJnZSBmaWxlc3lzdGVtcywgbGFyZ2UgYmxvY2sgc2l6ZXMsIG9yIGV2ZW4gY2FyZWZ1bGx5IGNvbnN0cnVjdGVkIGluZGlyZWN0IHRyZWVzLCB0aG9zZSBtdWx0aXBsaWNhdGlvbnMgYW5kIGluY3JlbWVudHMgY291bGQgZWFzaWx5IHB1c2ggYGN1cnJfYmxvY2tgIGJleW9uZCB0aGUgbGltaXRzIG9mIGEgMzItYml0IGludGVnZXIsIGxlYWRpbmcgdG8gYSB3cmFwLWFyb3VuZCBjb25kaXRpb24uIFRoYXQgbWVhbnMgYGN1cnJfYmxvY2tgIGNvdWxkIGJlY29tZSBhIHNtYWxsZXIgdmFsdWUgdGhhbiBleHBlY3RlZCwgbGVhZGluZyB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9yIGV2ZW4gY29ycnVwdGlvbi5cblxuVGhlIHBhdGNoJ3MgYWRkaXRpb24gb2YgYSBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBjaGVjayBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUgZml4LiBJdCdzIGRlc2lnbmVkIHRvIHByZXZlbnQgdXMgZnJvbSBleGNlZWRpbmcgdGhlIG1heGltdW0gZXh0ZW50IGJsb2NrIG51bWJlciB3aGljaCBpcyBkZWZpbmVkIGJ5IGBFWFRfTUFYX0JMT0NLU2AuIEknbSBnb2luZyB0byBxdWlja2x5IHZlcmlmeSB3aGF0IGBFWFRfTUFYX0JMT0NLU2AgYWN0dWFsbHkgKmlzKi4gS25vd2luZyB0aGF0IHdpbGwgY29uZmlybSB0aGF0IHRoaXMgY2hlY2sgaXMgc3VmZmljaWVudCBpbiBwcmV2ZW50aW5nIHRoZSBvdmVyZmxvdyBvciBpZiBzb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBpcyByZXF1aXJlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA2MTMsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjoyMy40OTQ2MTQ1OTVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzcwMDc0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFRfTUFYX0JMT0NLU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDQuaD0zODk2PXN0cnVjdCBleHQ0X2V4dGVudDtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM5MDEtICovXFxuZnMvZXh0NC9leHQ0Lmg6MzkwMjojZGVmaW5lIEVYVF9NQVhfQkxPQ0tTXFx0MHhmZmZmZmZmZlxcbmZzL2V4dDQvZXh0NC5oLTM5MDMtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xNTMxPXN0YXRpYyBpbnQgZXh0NF9leHRfc2VhcmNoX3JpZ2h0KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjMzLSAqIGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrOlxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2MzQ6ICogcmV0dXJucyBhbGxvY2F0ZWQgYmxvY2sgaW4gc3Vic2VxdWVudCBleHRlbnQgb3IgRVhUX01BWF9CTE9DS1MuXFxuZnMvZXh0NC9leHRlbnRzLmMtMTYzNS0gKiBOT1RFOiBpdCBjb25zaWRlcnMgYmxvY2sgbnVtYmVyIGZyb20gaW5kZXggZW50cnkgYXNcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE2NDA9ZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjQ3LVxcdGlmIChkZXB0aCA9PSAwIFxcdTAwMjZcXHUwMDI2IHBhdGgtXFx1MDAzZXBfZXh0ID09IE5VTEwpXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY0ODpcXHRcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY0OS1cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE2NjQtXFxuZnMvZXh0NC9leHRlbnRzLmM6MTY2NTpcXHRyZXR1cm4gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTY2Ni19XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjY5LSAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazpcXG5mcy9leHQ0L2V4dGVudHMuYzoxNjcwOiAqIHJldHVybnMgZmlyc3QgYWxsb2NhdGVkIGJsb2NrIGZyb20gbmV4dCBsZWFmIG9yIEVYVF9NQVhfQkxPQ0tTXFxuZnMvZXh0NC9leHRlbnRzLmMtMTY3MS0gKi9cXG5mcy9leHQ0L2V4dGVudHMuYz0xNjcyPXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjgwLVxcdGlmIChkZXB0aCA9PSAwKVxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2ODE6XFx0XFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTE2ODItXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xNjkzLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjE2OTQ6XFx0cmV0dXJuIEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTE2OTUtfVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk0Mj1zdGF0aWMgdW5zaWduZWQgaW50IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTk2My1cXHRcXHRiMiA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NjQ6XFx0XFx0aWYgKGIyID09IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTE5NjUtXFx0XFx0XFx0Z290byBvdXQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0xOTcwLVxcdGlmIChiMSArIGxlbjEgXFx1MDAzYyBiMSkge1xcbmZzL2V4dDQvZXh0ZW50cy5jOjE5NzE6XFx0XFx0bGVuMSA9IEVYVF9NQVhfQkxPQ0tTIC0gYjE7XFxuZnMvZXh0NC9leHRlbnRzLmMtMTk3Mi1cXHRcXHRuZXdleHQtXFx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGxlbjEpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMTAyLVxcdGZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjEwMzpcXHRuZXh0ID0gRVhUX01BWF9CTE9DS1M7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjEwNC1cXHRpZiAobGUzMl90b19jcHUobmV3ZXh0LVxcdTAwM2VlZV9ibG9jaykgXFx1MDAzZSBsZTMyX3RvX2NwdShmZXgtXFx1MDAzZWVlX2Jsb2NrKSlcXG5mcy9leHQ0L2V4dGVudHMuYy0yMTA1LVxcdFxcdG5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MjEwNjpcXHRpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykge1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIxMDctXFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKm5wYXRoO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MjI4MD1zdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfZmluZF9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMjkxLVxcdFxcdCpsYmxrID0gMDtcXG5mcy9leHQ0L2V4dGVudHMuYzoyMjkyOlxcdFxcdGxlbiA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIyOTMtXFx0fSBlbHNlIGlmICgqbGJsayBcXHUwMDNjIGxlMzJfdG9fY3B1KGV4LVxcdTAwM2VlZV9ibG9jaykpIHtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTI2MjI9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjc2MS1cXHRcXHRpZiAobnVtID09IDApIHtcXG5mcy9leHQ0L2V4dGVudHMuYzoyNzYyOlxcdFxcdFxcdGlmIChlbmQgIT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjc2My1cXHRcXHRcXHRcXHQvKlxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9Mjg0NT1pbnQgZXh0NF9leHRfcmVtb3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjg3OC1cXHQgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzoyODc5OlxcdGlmIChlbmQgXFx1MDAzYyBFWFRfTUFYX0JMT0NLUyAtIDEpIHtcXG5mcy9leHQ0L2V4dGVudHMuYy0yODgwLVxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCAqZXg7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00NTUxPWludCBleHQ0X2V4dF90cnVuY2F0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDU3MC1cXHRcXHRcXHRcXHUwMDNlXFx1MDAzZSBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7XFxuZnMvZXh0NC9leHRlbnRzLmM6NDU3MTpcXHRleHQ0X2VzX3JlbW92ZV9leHRlbnQoaW5vZGUsIGxhc3RfYmxvY2ssIEVYVF9NQVhfQkxPQ0tTIC0gbGFzdF9ibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDU3Mi1cXG5mcy9leHQ0L2V4dGVudHMuYy00NTczLXJldHJ5X3JlbW92ZV9zcGFjZTpcXG5mcy9leHQ0L2V4dGVudHMuYzo0NTc0OlxcdGVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSAxKTtcXG5mcy9leHQ0L2V4dGVudHMuYy00NTc1LVxcdGlmIChlcnIgPT0gLUVOT01FTSkge1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTM0Mj1pbnQgZXh0NF9nZXRfZXNfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTUzNzctXFx0bGFzdF9ibGsgPSAoc3RhcnQgKyBsZW4gLSAxKSBcXHUwMDNlXFx1MDAzZSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemVfYml0cztcXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc4OlxcdGlmIChsYXN0X2JsayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L2V4dGVudHMuYzo1Mzc5OlxcdFxcdGxhc3RfYmxrID0gRVhUX01BWF9CTE9DS1MtMTtcXG5mcy9leHQ0L2V4dGVudHMuYy01MzgwLVxcdGxlbl9ibGtzID0gKChleHQ0X2xibGtfdCkgbGFzdF9ibGspIC0gc3RhcnRfYmxrICsgMTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU0OTQ9ZXh0NF9leHRfc2hpZnRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTUwMS1cXHRleHQ0X2xibGtfdCBzdG9wLCAqaXRlcmF0b3IsIGV4X3N0YXJ0LCBleF9lbmQ7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTUwMjpcXHRleHQ0X2xibGtfdCB0bXAgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2V4dGVudHMuYy01NTAzLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDQtXFx0LyogTGV0IHBhdGggcG9pbnQgdG8gdGhlIGxhc3QgZXh0ZW50ICovXFxuZnMvZXh0NC9leHRlbnRzLmM6NTUwNTpcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MDYtXFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MTktXFx0KiBhY2NvbW1vZGF0ZSB0aGUgc2hpZnQuICBGb3IgcmlnaHQgc2hpZnRzLCBtYWtlIHN1cmUgdGhlIGxhc3QgZXh0ZW50XFxuZnMvZXh0NC9leHRlbnRzLmM6NTUyMDpcXHQqIHdvbid0IGJlIHNoaWZ0ZWQgYmV5b25kIEVYVF9NQVhfQkxPQ0tTLlxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1MjEtXFx0Ki9cXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU1NDMtXFx0fSBlbHNlIHtcXG5mcy9leHQ0L2V4dGVudHMuYzo1NTQ0OlxcdFxcdGlmIChzaGlmdCBcXHUwMDNlIEVYVF9NQVhfQkxPQ0tTIC1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTQ1LVxcdFxcdCAgICAoc3RvcCArIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4dGVudCkpKSB7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01NTYyLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjU1NjM6XFx0aWYgKHRtcCAhPSBFWFRfTUFYX0JMT0NLUylcXG5mcy9leHQ0L2V4dGVudHMuYy01NTY0LVxcdFxcdCppdGVyYXRvciA9IHRtcDtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU2Mzc9c3RhdGljIGludCBleHQ0X2NvbGxhcHNlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNTY5NS1cXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU2OTY6XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBzdGFydF9sYmxrLCBFWFRfTUFYX0JMT0NLUyAtIHN0YXJ0X2xibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU2OTctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz01NzM4PXN0YXRpYyBpbnQgZXh0NF9pbnNlcnRfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01ODMyLVxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo1ODMzOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgc3RhcnRfbGJsaywgRVhUX01BWF9CTE9DS1MgLSBzdGFydF9sYmxrKTtcXG5mcy9leHQ0L2V4dGVudHMuYy01ODM0LVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NTg3NT1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzEtXFx0XFx0XFx0LyogRG8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gc3dhcCAqL1xcbmZzL2V4dDQvZXh0ZW50cy5jOjU5MzI6XFx0XFx0XFx0aWYgKG5leHQxID09IEVYVF9NQVhfQkxPQ0tTIHx8IG5leHQyID09IEVYVF9NQVhfQkxPQ0tTKVxcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MzMtXFx0XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNjEtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MjYyOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjI2My1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjMzOT1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNTAtXFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG5mcy9leHQ0L2V4dGVudHMuYzo2MzUxOlxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM1Mi1cXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTU5MT1zdGF0aWMgaW50IGV4dDRfZXNfY2FuX2JlX21lcmdlZChzdHJ1Y3QgZXh0ZW50X3N0YXR1cyAqZXMxLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5Ni1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmM6NTk3OlxcdGlmICgoKF9fdTY0KSBlczEtXFx1MDAzZWVzX2xlbikgKyBlczItXFx1MDAzZWVzX2xlbiBcXHUwMDNlIEVYVF9NQVhfQkxPQ0tTKSB7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTU5OC1cXHRcXHRwcl93YXJuKFxcXCJFUyBhc3NlcnRpb24gZmFpbGVkIHdoZW4gbWVyZ2luZyBleHRlbnRzLiBcXFwiXFxuLS1cXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtNjAwLVxcdFxcdFxcdFxcXCJpcyBiaWdnZXIgdGhhbiBhbGxvd2VkIGZpbGUgc2l6ZSAoJWQpXFxcXG5cXFwiLFxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzo2MDE6XFx0XFx0XFx0ZXMxLVxcdTAwM2Vlc19sZW4sIGVzMi1cXHUwMDNlZXNfbGVuLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jLTYwMi1cXHRcXHRXQVJOX09OKDEpO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jPTE5NDM9c3RhdGljIGludCBlc19yZWNsYWltX2V4dGVudHMoc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWksIGludCAqbnJfdG9fc2NhbilcXG4tLVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYy0xOTU3LVxcbmZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYzoxOTU4OlxcdGlmICghZXNfZG9fcmVjbGFpbV9leHRlbnRzKGVpLCBFWFRfTUFYX0JMT0NLUywgbnJfdG9fc2NhbiwgXFx1MDAyNm5yX3NocnVuaykgXFx1MDAyNlxcdTAwMjZcXG5mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmMtMTk1OS1cXHQgICAgc3RhcnQgIT0gMClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMzE3PXN0YXRpYyB2b2lkIGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjMzNS1cXHRcXHRjdXIgPSAwO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMzM2OlxcdFxcdGVuZCA9IEVYVF9NQVhfQkxPQ0tTO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMzM3LVxcdFxcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpIHtcXG4tLVxcbmZzL2V4dDQvaW5kaXJlY3QuYz0xMTEyPXZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5kaXJlY3QuYy0xMTM1LVxcbmZzL2V4dDQvaW5kaXJlY3QuYzoxMTM2OlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSBsYXN0X2Jsb2NrKTtcXG5mcy9leHQ0L2luZGlyZWN0LmMtMTEzNy1cXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTg2Mj1pbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTE5MDgtXFx0XFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKSlcXG5mcy9leHQ0L2lubGluZS5jOjE5MDk6XFx0XFx0XFx0ZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCAwLCBFWFRfTUFYX0JMT0NLUyk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xOTEwLVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTcwMD1pbnQgZXh0NF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNzIyLVxcbmZzL2V4dDQvaW5vZGUuYzo3MjM6XFx0LyogV2UgY2FuIGhhbmRsZSB0aGUgYmxvY2sgbnVtYmVyIGxlc3MgdGhhbiBFWFRfTUFYX0JMT0NLUyAqL1xcbmZzL2V4dDQvaW5vZGUuYzo3MjQ6XFx0aWYgKHVubGlrZWx5KG1hcC1cXHUwMDNlbV9sYmxrIFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSlcXG5mcy9leHQ0L2lub2RlLmMtNzI1LVxcdFxcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTIxNzM9c3RhdGljIGludCBtcGFnZV9wcm9jZXNzX3BhZ2VfYnVmcyhzdHJ1Y3QgbXBhZ2VfZGFfZGF0YSAqbXBkLFxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTIxODItXFx0aWYgKGV4dDRfdmVyaXR5X2luX3Byb2dyZXNzKGlub2RlKSlcXG5mcy9leHQ0L2lub2RlLmM6MjE4MzpcXHRcXHRibG9ja3MgPSBFWFRfTUFYX0JMT0NLUztcXG5mcy9leHQ0L2lub2RlLmMtMjE4NC1cXG4tLVxcbmZzL2V4dDQvaW5vZGUuYz02MDA5PWludCBleHQ0X3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy02MTcyLVxcdFxcdFxcdFxcdFxcdGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZV9iaXRzLFxcbmZzL2V4dDQvaW5vZGUuYzo2MTczOlxcdFxcdFxcdFxcdFxcdEVYVF9NQVhfQkxPQ0tTIC0gMSk7XFxuZnMvZXh0NC9pbm9kZS5jLTYxNzQtXFx0XFx0XFx0ZWxzZVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jPTMxMz1zdGF0aWMgdm9pZCBzd2FwX2lub2RlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKVxcbi0tXFxuZnMvZXh0NC9pb2N0bC5jLTM0MS1cXHRzd2FwKGVpMS1cXHUwMDNlaV9kaXNrc2l6ZSwgZWkyLVxcdTAwM2VpX2Rpc2tzaXplKTtcXG5mcy9leHQ0L2lvY3RsLmM6MzQyOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTEsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lvY3RsLmM6MzQzOlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZTIsIDAsIEVYVF9NQVhfQkxPQ0tTKTtcXG5mcy9leHQ0L2lvY3RsLmMtMzQ0LVxcbi0tXFxuZnMvZXh0NC9tYmFsbG9jLmM9NDUxOT1leHQ0X21iX25vcm1hbGl6ZV9yZXF1ZXN0KHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuYy00NjA1LVxcdC8qIGF2b2lkIHVubmVjZXNzYXJ5IHByZWFsbG9jYXRpb24gdGhhdCBtYXkgdHJpZ2dlciBhc3NlcnRpb25zICovXFxuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNjpcXHRpZiAoc3RhcnQgKyBzaXplIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9tYmFsbG9jLmM6NDYwNzpcXHRcXHRzaXplID0gRVhUX01BWF9CTE9DS1MgLSBzdGFydDtcXG5mcy9leHQ0L21iYWxsb2MuYy00NjA4LVxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbi0tXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jPTUxNz1zdGF0aWMgaW50IG1leHRfY2hlY2tfYWRqdXN0X3JhbmdlKHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSxcXG4tLVxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzAtXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMTpcXHRpZiAoKG9yaWdfc3RhcnQgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzMjpcXHQgICAgKGRvbm9yX3N0YXJ0IFxcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTKSB8fFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1MzM6XFx0ICAgICgqbGVuIFxcdTAwM2UgRVhUX01BWF9CTE9DS1MpIHx8XFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jOjUzNDpcXHQgICAgKGRvbm9yX3N0YXJ0ICsgKmxlbiBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLUykgfHxcXG5mcy9leHQ0L21vdmVfZXh0ZW50LmM6NTM1OlxcdCAgICAob3JpZ19zdGFydCArICpsZW4gXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpKSAge1xcbmZzL2V4dDQvbW92ZV9leHRlbnQuYy01MzYtXFx0XFx0ZXh0NF9kZWJ1ZyhcXFwiZXh0NCBtb3ZlIGV4dGVudDogQ2FuJ3QgaGFuZGxlIG92ZXIgWyV1XSBibG9ja3MgW2lubzpvcmlnICVsbHUsIGRvbm9yICVsbHVdXFxcXG5cXFwiLFxcbmZzL2V4dDQvbW92ZV9leHRlbnQuYzo1Mzc6XFx0XFx0XFx0ICAgRVhUX01BWF9CTE9DS1MsXFxuZnMvZXh0NC9tb3ZlX2V4dGVudC5jLTUzOC1cXHRcXHRcXHQgICBvcmlnX2lub2RlLVxcdTAwM2VpX2lubywgZG9ub3JfaW5vZGUtXFx1MDAzZWlfaW5vKTtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0xNTM5PXZvaWQgZXh0NF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTE1NjgtXFx0cmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpO1xcbmZzL2V4dDQvc3VwZXIuYzoxNTY5OlxcdGV4dDRfZXNfcmVtb3ZlX2V4dGVudChpbm9kZSwgMCwgRVhUX01BWF9CTE9DS1MpO1xcbmZzL2V4dDQvc3VwZXIuYy0xNTcwLVxcdGRxdW90X2Ryb3AoaW5vZGUpO1xcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYz0yNzE9c3RhdGljIGludCBleHQ0X2dldF92ZXJpdHlfZGVzY3JpcHRvcl9sb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYy0yOTMtXFxuZnMvZXh0NC92ZXJpdHkuYzoyOTQ6XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCwgMCk7XFxuZnMvZXh0NC92ZXJpdHkuYy0yOTUtXFx0aWYgKElTX0VSUihwYXRoKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDY6MjMuNTk4MzIwODg4WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDcxODM3NjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIEdlbmVzaXMgb2YgVGhpcyBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gb2YgdGhpcyBjaGFuZ2UuIFRoZSBjb2RlIGl0c2VsZiAqc2VlbXMqIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2gsIGJ1dCB0aGUgcmF0aW9uYWxlIGJlaGluZCBpdCDigJMgdGhlIFwid2h5XCIg4oCTIGlzIGFsd2F5cyB0aGUgY3J1Y2lhbCBwaWVjZSwgaXNuJ3QgaXQ/IE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIEdpdCBoaXN0b3J5LiBMZXQncyBzdGFydCB3aXRoIGBnaXQgbG9nYC4gSSB3YW50IHRvIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kaWZpY2F0aW9uLiBUaGF0IG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNvbnRleHQsIHRoZSBidWcgcmVwb3J0IG51bWJlciAoaG9wZWZ1bGx5ISksIHRoZSByZWFzb25pbmcsIG9yIGF0IGxlYXN0IGEgcmVmZXJlbmNlIHRvIHRoZSB0aWNrZXQgdGhhdCBzcHVycmVkIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrLiBJZGVhbGx5LCB0aGUgY29tbWl0IGxvZyB3aWxsIGNsYXJpZnkgdGhlIG9yaWdpbmFsIGludGVudGlvbiBhbmQgY29ubmVjdCBtZSB0byB0aGUgcmVsZXZhbnQgcHJvYmxlbSBvciBmZWF0dXJlIHJlcXVlc3QuIEZyb20gdGhlcmUsIEknbGwgYXNzZXNzIHRoZSBjb21taXQncyBsaW5lYWdlIGFuZCBhbnkgcmVsYXRlZCBicmFuY2hlcyB0byBnZXQgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIGNoYW5nZSBldm9sdmVkLiBJIGNhbiB1c3VhbGx5IGdsZWFuIGEgbG90IGZyb20gdGhlIGhpc3RvcnkgaXRzZWxmLCBidXQgSSBhbSBob3BpbmcgdGhhdCBJIHdvbid0IGhhdmUgdG8gc3RhcnQgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgaXNzdWUgYmFzZWQgb24gb25seSB0aGUgZGlmZi4gVWx0aW1hdGVseSwgbXkgZ29hbCBpcyB0byB0cmFjZSB0aGlzIGNoYW5nZSBiYWNrIHRvIGl0cyBvcmlnaW4sIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlLCBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCBhZGRyZXNzZWQgdGhlIG5lZWQgZWZmZWN0aXZlbHkgd2l0aGluIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYyMzksIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjozNi4wNzAxNjI0MzZaIiwiU2VxIjo0OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMzU5MTcyOTMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9taWdyYXRlLmM9NjU9c3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYy02OS1cXG5mcy9leHQ0L21pZ3JhdGUuYzo3MDpcXHRpZiAobGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1MpXFxuZnMvZXh0NC9taWdyYXRlLmMtNzEtXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0NjozOC40MDYwODUzNTlaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTMzMTU2NTYwNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBJbnRlZ2VyIE92ZXJmbG93IEZpeCBpbiBleHQ0X2V4dF9taWdyYXRlKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJIHNlZSB3ZSdyZSBsb29raW5nIGF0IGEgcGF0Y2ggaW4gYGZzL2V4dDQvbWlncmF0ZS5jYCB0aGF0IGludm9sdmVzIGEgbG9jYWwgc3RydWN0IGNhbGxlZCBgbWlncmF0ZV9zdHJ1Y3RgIChhbGlhc2VkIGFzIGBsYmAgaW4gdGhlIGNvZGUpLiBUaGUga2V5IGNoYW5nZSBhcHBlYXJzIHRvIGJlIGJ1bXBpbmcgdGhlIHNpemUgb2Ygc29tZSBibG9jayBudW1iZXIgZmllbGRzIHdpdGhpbiBgbGJgIGZyb20gMzItYml0IChgZXh0NF9sYmxrX3RgLCBha2EgYHUzMmApIHRvIDY0LWJpdCAoYHU2NGApLlxuXG5NeSBmaXJzdCB0aG91Z2h0IGlzIGFsd2F5cywgZG9lcyB0aGlzIHBhdGNoIGludHJvZHVjZSBhbnkgcG90ZW50aWFsIGZvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/IExldCdzIGdvIHRocm91Z2ggdGhlIGNoZWNrbGlzdC5cblxuMS4gICoqVXNlcnNwYWNlIEV4cG9zdXJlOioqIElzIHRoaXMgbmV3IGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFueSB3YXk/IFRoYW5rZnVsbHksIG5vLiBUaGlzIHN0cnVjdCBpcyBsb2NhbCB0byB0aGUgYG1pZ3JhdGUuY2AgZmlsZSBhbmQgbmV2ZXIgYXBwZWFycyB0byBiZSBjb3BpZWQgb3V0IHZpYSBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluaywgaW9jdGwsIHNvY2tldHMsIG9yIEJQRi4gTm8gaXNzdWUgaGVyZS5cblxuMi4gICoqVW5pbml0aWFsaXplZCBWYXJpYWJsZXM6KiogSXMgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IG1pZ2h0IGRlcGVuZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm9wZS4gYGxiYCBpcyAqZXhwbGljaXRseSogaW5pdGlhbGl6ZWQgdG8gYWxsIHplcm9zIHdpdGggYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSBhbnkgdXNlLiBUaGF0J3MgZ29vZCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcuXG5cbjMuICAqKkNvbXBsZXggRGF0YSBTdHJ1Y3R1cmUgSW5pdGlhbGl6YXRpb246KiogSXMgdGhlcmUgYW55IGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgbW9yZSBjb21wbGljYXRlZCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgZmllbGRzIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQ/IE5vIGFnYWluLiBUaGlzIGBsYmAgc3RydWN0IGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIHplcm9lZCwgc28gd2UncmUgZ29vZCB0aGVyZS5cblxuNC4gICoqQm91bmRzIENoZWNraW5nIGFuZCBNZW1vcnkgQWNjZXNzOioqIElzIHRoZXJlIGEgcG90ZW50aWFsIGZvciBib3VuZHMtY2hlY2sgYnlwYXNzZXMgb3IgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgZGF0YSBpbiBzdXJyb3VuZGluZyBidWZmZXJzPyBXZWxsLCB0aGUgY3JpdGljYWwgbGluZSBgbGItXHUwMDNlY3Vycl9ibG9jayBcdTAwM2U9IEVYVF9NQVhfQkxPQ0tTYCBsb29rcyBsaWtlIGEga2V5IGJvdW5kcyBjaGVjay4gVGhlIHBhdGNoIGlzIHByZXZlbnRpbmcgYGxiLVx1MDAzZWN1cnJfYmxvY2tgIChub3cgYSA2NC1iaXQgdmFsdWUpIGZyb20gZXhjZWVkaW5nIGBFWFRfTUFYX0JMT0NLU2AsIHdoaWNoIGxvb2tzIGxpa2UgYSBoYXJkY29kZWQgY29uc3RhbnQgcmVsYXRpbmcgdG8gZXh0ZW50cy4gSWYgaXQgKmRvZXMqIGdvIGJleW9uZCwgd2UgZ2V0IGEgbmljZSBgLUVPUE5PVFNVUFBgIGVycm9yLiBJdCdzIGNsZWFyIHRoYXQgKmJlZm9yZSogdGhlIGNoYW5nZSwgYW4gb3ZlcmZsb3cgb24gdGhpcyAzMi1iaXQgZmllbGQgd2FzIGEgcG90ZW50aWFsIHByb2JsZW0uIEl0IGNvdWxkIGxlYWQgdG8gd3JhcHBpbmcgYW5kIGNvcnJ1cHQgZXh0ZW50IG1hbmlwdWxhdGlvbnMuXG5cblNvLCB0aGlzIGxvb2tzIGxpa2UgYSBjbGFzc2ljIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBmaXguIElmIGBsYi1cdTAwM2VjdXJyX2Jsb2NrYCB3ZXJlIHRvIGV4Y2VlZCBgRVhUX01BWF9CTE9DS1NgIG9uIGEgY29ycnVwdCBvciBvdGhlcndpc2UgbWFsaWNpb3VzIGZpbGVzeXN0ZW0sIHRoZSBtaWdyYXRpb24gbWlnaHQgaGF2ZSBtZXNzZWQgdXAgZXh0ZW50cy4gU28gZmFyLCBzbyBnb29kLlxuXG5Ob3csIGxldCdzIGRvdWJsZS1jaGVjay4gSSBzZWUgdGhhdCB0aGUgYG5ld2V4dGAgdmFyaWFibGUgaXMgYSBgc3RydWN0IGV4dDRfZXh0ZW50YCwgd2hpY2ggaXMgcGFzc2VkIHRvIGBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50YC4gSXQncyBwb3B1bGF0ZWQgdXNpbmcgZGF0YSBmcm9tIGBsYmAuIEkgbmVlZCB0byBlbnN1cmUgdGhhdCAqZXZlcnkqIGZpZWxkIG9mIGBuZXdleHRgIGlzIGFzc2lnbmVkICpiZWZvcmUqIGl0IGdldHMgdXNlZC4gQW5kIHRoZSBjb2RlIGNvbmZpcm1zIGl0LlxuVGhlIGFzc2lnbm1lbnRzIHRvIGBuZXdleHQuZWVfYmxvY2tgLCBgbmV3ZXh0LmVlX2xlbmAsIGFuZCB0aGUgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AgY2FsbHMsIHdoaWNoIHNldCB0aGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVycywgbG9vayBjbGVhbi4gSSB0aGluayB3ZSBhcmUgc2FmZSBoZXJlLCB0aGUgZml4IGlzIHZhbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjY1MCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwODo0ODoxMS43MjE3NDU0MjZaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyMTUyNTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBleHQ0X2V4dGVudCBcXFxce1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTQ4PXN0cnVjdCBleHQ0X2V4dGVudF90YWlsIHtcXG4tLVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDo1NjpzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjExLjc5MzkwMjUxNFoiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3OTQ0NzA2MTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIEV4dDQncyBFeHRlbnQgU3RydWN0dXJlcyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IHdpdGggYGV4dDRfZXh0ZW50cy5oYC4gSSdtIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIGxpbmVzIDU2IHRocm91Z2ggNjUuIEknbSBndWVzc2luZyB0aGF0IGFyZWEgcHJvYmFibHkgZGV0YWlscyB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBmb3IgZXh0ZW50LWJhc2VkIGZpbGUgbWFwcGluZyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBHaXZlbiBteSBleHBlcmllbmNlLCBJJ20gZXhwZWN0aW5nIHRvIHNlZSBkZWZpbml0aW9ucyBmb3Igc3RydWN0cyB0aGF0IGhvbGQgaW5mb3JtYXRpb24gbGlrZSB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzLCB0aGUgcGh5c2ljYWwgYmxvY2sgYWRkcmVzcywgdGhlIGV4dGVudCBsZW5ndGgsIGFuZCBwb3RlbnRpYWxseSBzb21lIGZsYWdzIG9yIG1ldGFkYXRhIGFib3V0IHRoZSBleHRlbnQuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IGV4dDQgb3JnYW5pemVzIHRoZXNlIGV4dGVudHMsIGhvdyBpdCBoYW5kbGVzIGZyYWdtZW50YXRpb24gd2l0aGluIGEgZmlsZSwgYW5kIGhvdyBpdCB0cmFuc2xhdGVzIGxvZ2ljYWwgYmxvY2sgbnVtYmVycyB0byBwaHlzaWNhbCBvbmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZmlsZXN5c3RlbSBtYW5hZ2VzIGl0cyBvbi1kaXNrIGxheW91dCwgYW5kIGltcHJvdmUgbXkgYWJpbGl0eSB0byB0cm91Ymxlc2hvb3QgZXh0NCByZWxhdGVkIHN0b3JhZ2UgaXNzdWVzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSBhY3R1YWxseSByZXZlYWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE5NSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjE5LjczODYxMzA0M1oiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjY0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU2LFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDU2OlxcdHN0cnVjdCBleHQ0X2V4dGVudCB7XFxuICA1NzpcXHRcXHRfX2xlMzJcXHRlZV9ibG9jaztcXHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cXG4gIDU4OlxcdFxcdF9fbGUxNlxcdGVlX2xlbjtcXHRcXHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXFxuICA1OTpcXHRcXHRfX2xlMTZcXHRlZV9zdGFydF9oaTtcXHQvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cXG4gIDYwOlxcdFxcdF9fbGUzMlxcdGVlX3N0YXJ0X2xvO1xcdC8qIGxvdyAzMiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXFxuICA2MTpcXHR9O1xcbiAgNjI6XFx0XFxuICA2MzpcXHQvKlxcbiAgNjQ6XFx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cXG4gIDY1OlxcdCAqIEl0J3MgdXNlZCBhdCBhbGwgdGhlIGxldmVscyBleGNlcHQgdGhlIGJvdHRvbS5cXG4gIDY2OlxcdCAqL1xcbiAgNjc6XFx0c3RydWN0IGV4dDRfZXh0ZW50X2lkeCB7XFxuICA2ODpcXHRcXHRfX2xlMzJcXHRlaV9ibG9jaztcXHQvKiBpbmRleCBjb3ZlcnMgbG9naWNhbCBibG9ja3MgZnJvbSAnYmxvY2snICovXFxuICA2OTpcXHRcXHRfX2xlMzJcXHRlaV9sZWFmX2xvO1xcdC8qIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIGJsb2NrIG9mIHRoZSBuZXh0ICpcXG4gIDcwOlxcdFxcdFxcdFxcdFxcdCAqIGxldmVsLiBsZWFmIG9yIG5leHQgaW5kZXggY291bGQgYmUgdGhlcmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6MTkuNzM4NzEyNDEyWiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNDc1MDE3MTUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgXCJBbmQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2BcIiBhcyBhIHRob3VnaHQgcHJvY2VzcywgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzc3VtaW5nIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCoqXG5cbkFscmlnaHQsIHNvIHdlJ3JlIGxvb2tpbmcgYXQgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2AuIEltbWVkaWF0ZWx5LCBteSBicmFpbiBnb2VzIHRvIHRoZSBjb3JlOiBob3cgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBhbGxvY2F0aW9uIGFuZCBzdG9yYWdlIG9mIHBoeXNpY2FsIGJsb2NrcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBleHRlbnQtYmFzZWQgZmlsZXMuIFRoZSBuYW1lIGl0c2VsZiBpcyBwcmV0dHkgY2xlYXI6IGl0J3MgYSBmdW5jdGlvbiBvciBtZWNoYW5pc20gcmVsYXRlZCB0byBzdG9yaW5nIChvciBtYW5hZ2luZyB0aGUgc3RvcmFnZSBvZikgcGh5c2ljYWwgYmxvY2tzIGxpbmtlZCB0byBhbiBleHRlbnQgc3RydWN0dXJlLlxuXG5NeSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGxheWVycy4gSSdtIHRoaW5raW5nIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgZm9yIHBlcmZvcm1hbmNlOiBob3cgZWZmaWNpZW50bHkgaXMgdGhpcyBoYW5kbGluZyBibG9jayBhbGxvY2F0aW9uPyBXaGF0IGFyZSB0aGUgcG90ZW50aWFsIGJvdHRsZW5lY2tzPyBJcyBpdCBvcHRpbWl6ZWQgZm9yIHNlcXVlbnRpYWwgd3JpdGVzLCByYW5kb20gYWNjZXNzLCBvciBib3RoPyBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHNpbXBsZSBtYXBwaW5nLCBvciBpcyB0aGVyZSBzb21lIG1vcmUgc29waGlzdGljYXRlZCBtZXRhZGF0YSBpbnZvbHZlZCwgcG90ZW50aWFsbHkgcmVsYXRlZCB0byBibG9jayBncm91cHMsIGJsb2NrIGJpdG1hcHMsIG9yIGlub2RlIHN0cnVjdHVyZXM/XG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gV2hhdCBoYXBwZW5zIGlmIHRoaXMgZnVuY3Rpb24gZW5jb3VudGVycyBhbiBhbGxvY2F0aW9uIGVycm9yPyBEb2VzIGl0IGdyYWNlZnVsbHkgaGFuZGxlIG91dC1vZi1zcGFjZSBjb25kaXRpb25zLCBvciBkb2VzIGl0IHRyaWdnZXIgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcj8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBpZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgY29uY3VycmVudGx5PyBJJ20gaW1hZ2luaW5nIHNjZW5hcmlvcyB3aGVyZSBtdWx0aXBsZSB0aHJlYWRzIG9yIHByb2Nlc3NlcyBjb3VsZCBiZSBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlIGJsb2NrcyBzaW11bHRhbmVvdXNseS5cblxuVGhlbiB0aGVyZSdzIHRoZSBiaWdnZXIgcGljdHVyZTogaG93IGRvZXMgdGhpcyBmdW5jdGlvbiBpbnRlZ3JhdGUgd2l0aCB0aGUgb3ZlcmFsbCBleHQ0IGFsbG9jYXRpb24gc3RyYXRlZ3k/IElzIGl0IGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGluIGltcGxlbWVudGluZyBmZWF0dXJlcyBsaWtlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvciB0aGUgZmlsZXN5c3RlbSdzIGpvdXJuYWxpbmcgc3lzdGVtPyBJIGNhbiBzZWUgaXRzIHJlbGF0aW9uc2hpcCB0byBhbGxvY2F0aW9uIHBvbGljaWVzLCBob3cgaXQgbWFuYWdlcyB0aGUgZmlsZSdzIGJsb2NrcyBhbmQgaG93IHRoZSBtZXRhZGF0YSBpbnRlcmFjdHMuIEkgc3RhcnQgdG8gbWVudGFsbHkgdHJhY2UgdGhlIGNvZGUgcGF0aDogd2hlcmUgaXMgaXQgY2FsbGVkIGZyb20/IFdoYXQgc3RydWN0dXJlcyBkb2VzIGl0IGludGVyYWN0IHdpdGg/IFdoYXQgYXJlIGl0cyBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLCBhbmQgaG93IGFyZSB0aGVzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZXh0NCBmaWxlc3lzdGVtP1xuXG5cbiIsIklucHV0VG9rZW5zIjoxODcyOSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6NDMuMjEzNzMyNjk2WiIsIlNlcSI6NTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MjgwODUyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0NS0gKi9cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0NjpzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXFx0XFx0XFx0XFx0XFx0IGV4dDRfZnNibGtfdCBwYilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NDg6NDMuMjg2NTQ3ODI0WiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM5OTQxNjg4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHQ0IEV4dGVudCBDb2RlKipcblxuT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEJhc2VkIG9uIHRoZSBwcm9ibGVtIGF0IGhhbmQsIEkgdGhpbmsgdGhlIGNyaXRpY2FsIGNvZGUgc2VnbWVudCBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgaW4gYGZzL2V4dDQvZXh0NF9leHRlbnRzLmhgLiBJJ20gZm9jdXNpbmcgbXkgYXR0ZW50aW9uIG9uIGxpbmVzIDI0Ni0yNTUgd2l0aGluIHRoYXQgZmlsZS4gVGhpcyByYW5nZSBsaWtlbHkgY29udGFpbnMgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIG9yIHBlcmhhcHMgc29tZSBjcml0aWNhbCBtYWNybyBkZWZpbml0aW9ucyBkaXJlY3RseSBpbnZvbHZlZCBpbiB0aGUgZXh0ZW50IG1hbmFnZW1lbnQuIExldCdzIHNlZSB3aGF0IGdlbXMgd2UgY2FuIGZpbmQgaW4gdGhlcmUuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCdzIGdldCBzdGFydGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMzNiwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjQ3LjI4MDcxOTE2WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2MjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjQ2LFxuICBcIkxpbmVDb3VudFwiOiAxMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQ2OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcXG4gMjQ3OlxcdFxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuIDI0ODpcXHR7XFxuIDI0OTpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfbG8gPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiIFxcdTAwMjYgMHhmZmZmZmZmZikpO1xcbiAyNTA6XFx0XFx0ZXgtXFx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXFx1MDAzZVxcdTAwM2UgMzEpIFxcdTAwM2VcXHUwMDNlIDEpIFxcdTAwMjZcXG4gMjUxOlxcdFxcdFxcdFxcdFxcdCAgICAgIDB4ZmZmZik7XFxuIDI1MjpcXHR9XFxuIDI1MzpcXHRcXG4gMjU0OlxcdC8qXFxuIDI1NTpcXHQgKiBleHQ0X2lkeF9zdG9yZV9wYmxvY2s6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA4OjQ4OjQ3LjI4MDc5NzM0OVoiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMTMwNjI3MzE4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudDogTmVlZHNLTVNBTiA9IGZhbHNlKipcblxuT2theSwgc28gbG9va2luZyBhdCB0aGlzIHBhdGNoLCBJJ20gcHJldHR5IGNvbmZpZGVudCBpbiBteSBhc3Nlc3NtZW50LiBUaGUgYG5ld2V4dGAgZmllbGRzIGFyZSBhbGwgZ29vZCDigJMgdGhleSB3ZXJlbid0IGV2ZW4gdG91Y2hlZCBoZXJlLCBzbyBubyBjb25jZXJucyB0aGVyZS4gVGhpcyBwYXRjaCBpcyBmb2N1c2VkIHNvbGVseSBvbiB0aGUgYG1pZ3JhdGVfc3RydWN0YCBhbmQgbWFraW5nIHNvbWUgY2hhbmdlcyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgbG9naWNhbCBibG9jayBudW1iZXJzLCBzcGVjaWZpY2FsbHkgZXhwYW5kaW5nIGBmaXJzdF9ibG9ja2AsIGBsYXN0X2Jsb2NrYCwgYW5kIGBjdXJyX2Jsb2NrYCBmcm9tIDMyLWJpdCB0byA2NC1iaXQgaW50ZWdlcnMuIFRoZXJlJ3MgYWxzbyBhIGNoZWNrIGFkZGVkIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlYCB0byBwcmV2ZW50IGV4Y2VlZGluZyB0aGUgYEVYVF9NQVhfQkxPQ0tTYCBsaW1pdC4gRXNzZW50aWFsbHksIGl0J3MgYWJvdXQgcHJldmVudGluZyBhIDMyLWJpdCBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gbWlncmF0aW5nIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGFuIGV4dGVudC1iYXNlZCByZXByZXNlbnRhdGlvbiB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS5cblxuVGhlIGNyaXRpY2FsIHRoaW5nIGlzIHRoYXQgYGxiYCwgb3VyIGBtaWdyYXRlX3N0cnVjdGAgaW5zdGFuY2UsIGlzIGluaXRpYWxpemVkIHdpdGggYG1lbXNldChcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFRoYXQgemVyb3Mgb3V0ICpldmVyeXRoaW5nKi4gVGhlcmUncyBubyBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbnZvbHZlZCwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBLTVNBTiwgbm8gdW5pbml0aWFsaXplZCByZWFkcywgYW5kIGRlZmluaXRlbHkgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgbGVha3MuIFRoaXMgY2hhbmdlIG9ubHkgZGVhbHMgd2l0aCBmaWxlc3lzdGVtIGxvZ2ljLCBpbnRlZ2VyIG92ZXJmbG93LCBhbmQgYm91bmRzIGNoZWNrcywgYnV0IHRoZXNlIGFyZSBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBLTVNBTiBpcyBkZWZpbml0ZWx5IG5vdCB0aGUgcmlnaHQgdG9vbCBmb3IgdGhpcy4gV2UncmUgbG9va2luZyBhdCBzdGFuZGFyZCBpbnRlZ2VyIG92ZXJmbG93IGFuZCBib3VuZGFyeSBjb25kaXRpb25zIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpdHNlbGYuXG5cbkxldCBtZSBkbyBhIHF1aWNrIHNhbml0eSBjaGVjayBvZiBhbGwgb3VyIHJlcXVpcmVtZW50czpcblxuKiAgICoqTmVlZHNLTVNBTjogZmFsc2UqKiDigJMgQ29uZmlybWVkLlxuKiAgICoqS01TQU5SZWFzb25pbmc6KiogVGhlIGBtaWdyYXRlX3N0cnVjdGAgaXMgc3RhY2stYWxsb2NhdGVkIGFuZCBjb21wbGV0ZWx5IHplcm9lZC4gVGhpcyBwYXRjaCBicm9hZGVucyB0aGUgbG9naWNhbCBibG9jayB0cmFja2luZyBtZW1iZXJzIHRvIGB1NjRgIGFuZCBhZGRzIGEgYm91bmRhcnkgY2hlY2sgYWdhaW5zdCBgRVhUX01BWF9CTE9DS1NgIHRvIHByZXZlbnQgMzItYml0IGludGVnZXIgb3ZlcmZsb3cgZHVyaW5nIGluZGlyZWN0IGJsb2NrIG1pZ3JhdGlvbiB0byBleHRlbnRzLiBObyBtZW1vcnkgaXMgc2hhcmVkIHdpdGggdXNlciBzcGFjZSwgdGhlcmUgYXJlIG5vIGNvbnRyb2wtZmxvdyBicmFuY2hlcyByZWx5aW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgYWNjZXNzIGlzIGludHJvZHVjZWQuIFN0YW5kYXJkIEtBU0FOIGFuZCBmaWxlc3lzdGVtIHRlc3Qgc3VpdGVzIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBraW5kIG9mIGJvdW5kcy9vdmVyZmxvdyBmaXguIEtNU0FOIHdvdWxkIGJlIG92ZXJraWxsLiBXZSBkb24ndCBuZWVkIGRlZGljYXRlZCBmdXp6aW5nIGhlcmUuXG5cbkFscmlnaHQsIHRoYXQgY292ZXJzIGl0LiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk3MzUsIk91dHB1dFRva2VucyI6MjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQ2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDg6NTA6NDAuMzQzNTMzMjVaIiwiU2VxIjo1OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDgzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBmcy9leHQ0L21pZ3JhdGUuY2AgYnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgYGZpcnN0X2Jsb2NrYCwgYGxhc3RfYmxvY2tgLCBhbmQgYGN1cnJfYmxvY2tgIGluIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3RgIGZyb20gMzItYml0IGBleHQ0X2xibGtfdGAgdG8gYHU2NGAgYW5kIGFkZGluZyBhbiB1cHBlciBib3VuZCBjaGVjayBgbGItXFx1MDAzZWN1cnJfYmxvY2sgXFx1MDAzZT0gRVhUX01BWF9CTE9DS1NgIGluIGB1cGRhdGVfZXh0ZW50X3JhbmdlKClgLiBUaGlzIHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtaWdyYXRpbmcgaW5vZGVzIGZyb20gaW5kaXJlY3QgYmxvY2tzIHRvIGV4dGVudHMuXFxuXFxuVGhlIGBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGJgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gYGV4dDRfZXh0X21pZ3JhdGUoKWAgYW5kIGlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB1c2luZyBgbWVtc2V0KFxcdTAwMjZsYiwgMCwgc2l6ZW9mKGxiKSlgIGJlZm9yZSB1c2UuIEl0IGlzIHN0cmljdGx5IGludGVybmFsIGtlcm5lbCBtZXRhZGF0YSBhbmQgaXMgbmV2ZXIgZXhwb3NlZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgYnJhbmNoZXMgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFuZCBLQVNBTiBhcmUgc3VmZmljaWVudCwgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2V4dDQvbWlncmF0ZS5jYCBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBgZmlyc3RfYmxvY2tgLCBgbGFzdF9ibG9ja2AsIGFuZCBgY3Vycl9ibG9ja2AgaW4gYHN0cnVjdCBtaWdyYXRlX3N0cnVjdGAgZnJvbSAzMi1iaXQgYGV4dDRfbGJsa190YCB0byBgdTY0YCBhbmQgYWRkaW5nIGFuIHVwcGVyIGJvdW5kIGNoZWNrIGBsYi1cXHUwMDNlY3Vycl9ibG9jayBcXHUwMDNlPSBFWFRfTUFYX0JMT0NLU2AgaW4gYHVwZGF0ZV9leHRlbnRfcmFuZ2UoKWAuIFRoaXMgcHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyB3aGVuIG1pZ3JhdGluZyBpbm9kZXMgZnJvbSBpbmRpcmVjdCBibG9ja3MgdG8gZXh0ZW50cy5cXG5cXG5UaGUgYHN0cnVjdCBtaWdyYXRlX3N0cnVjdCBsYmAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBgZXh0NF9leHRfbWlncmF0ZSgpYCBhbmQgaXMgZXhwbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIHVzaW5nIGBtZW1zZXQoXFx1MDAyNmxiLCAwLCBzaXplb2YobGIpKWAgYmVmb3JlIHVzZS4gSXQgaXMgc3RyaWN0bHkgaW50ZXJuYWwga2VybmVsIG1ldGFkYXRhIGFuZCBpcyBuZXZlciBleHBvc2VkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBicmFuY2hlcyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3Iga2VybmVsIGluZm8tbGVha3MuIFN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYW5kIEtBU0FOIGFyZSBzdWZmaWNpZW50LCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[1] Phase: Succeeded StartedAt: 2026-09-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 08:50:51 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 08:50:51 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[2] Phase: Succeeded StartedAt: 2026-09-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +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":{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 08:51:01 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:50:51 +0000 UTC FinishedAt: 2026-09-14 08:50:57 +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-workfloww8dtz/series-workfloww8dtz-convert-artifact-1630139308/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:51:01 +0000 UTC FinishedAt: 2026-09-14 09:08:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:51:01 +0000 UTC FinishedAt: 2026-09-14 09:08:44 +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:*7445fe11-c2af-4866-b88e-b2f5cc68e572,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-workfloww8dtz/series-workfloww8dtz-convert-artifact-1630139308/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": "38477dcc-9a22-4799-b7d7-67f503e95192", "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-workfloww8dtz/series-workfloww8dtz-build-action-720173530/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 08:51:01 +0000 UTC FinishedAt: 2026-09-14 09:08:34 +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:*7445fe11-c2af-4866-b88e-b2f5cc68e572,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-workfloww8dtz/series-workfloww8dtz-convert-artifact-1630139308/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": "38477dcc-9a22-4799-b7d7-67f503e95192", "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-workfloww8dtz/series-workfloww8dtz-build-action-720173530/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:08:44 +0000 UTC FinishedAt: 2026-09-14 09:08:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:08:44 +0000 UTC FinishedAt: 2026-09-14 09:08:44 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:08:44 +0000 UTC FinishedAt: 2026-09-14 09:09:07 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:08:44 +0000 UTC FinishedAt: 2026-09-14 09:08:50 +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":"b477e560-8a06-4fc5-af74-c5727d587d81","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-workfloww8dtz/series-workfloww8dtz-convert-artifact-2151805803/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:09:07 +0000 UTC FinishedAt: 2026-09-14 09:11:05 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:09:07 +0000 UTC FinishedAt: 2026-09-14 09:10:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*38477dcc-9a22-4799-b7d7-67f503e95192,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-workfloww8dtz/series-workfloww8dtz-build-action-720173530/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-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:11:05 +0000 UTC FinishedAt: 2026-09-14 09:11:05 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:11:05 +0000 UTC FinishedAt: 2026-09-14 09:11:05 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:11:05 +0000 UTC FinishedAt: 2026-09-14 09:31:21 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:11:05 +0000 UTC FinishedAt: 2026-09-14 09:31:21 +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:*7445fe11-c2af-4866-b88e-b2f5cc68e572,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-workfloww8dtz/series-workfloww8dtz-convert-artifact-2151805803/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": "b27bd76d-cb49-4124-870c-70a820a048b0", "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-workfloww8dtz/series-workfloww8dtz-build-action-3732353167/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:11:05 +0000 UTC FinishedAt: 2026-09-14 09:31:11 +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:*7445fe11-c2af-4866-b88e-b2f5cc68e572,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-workfloww8dtz/series-workfloww8dtz-convert-artifact-2151805803/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": "b27bd76d-cb49-4124-870c-70a820a048b0", "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-workfloww8dtz/series-workfloww8dtz-build-action-3732353167/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:31:21 +0000 UTC FinishedAt: 2026-09-14 09:31:21 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:31:21 +0000 UTC FinishedAt: 2026-09-14 09:31:21 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:31:21 +0000 UTC FinishedAt: 2026-09-14 09:33:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:31:21 +0000 UTC FinishedAt: 2026-09-14 09:33:08 +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:*b27bd76d-cb49-4124-870c-70a820a048b0,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-workfloww8dtz/series-workfloww8dtz-build-action-3732353167/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-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"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:*38477dcc-9a22-4799-b7d7-67f503e95192,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*b27bd76d-cb49-4124-870c-70a820a048b0,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-workfloww8dtz/series-workfloww8dtz-build-action-720173530/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-workfloww8dtz/series-workfloww8dtz-build-action-3732353167/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 09:33:28 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 09:33:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"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-workfloww8dtz/series-workfloww8dtz-convert-artifact-1716681348/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 09:33:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 09:33:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:18 +0000 UTC FinishedAt: 2026-09-14 09:33:18 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:28 +0000 UTC FinishedAt: 2026-09-14 12:37:35 +0000 UTC Input: nil Output: nil --------- Name: series-workfloww8dtz[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:{"base_commit":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","base_tree":"torvalds","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["update_extent_range","ext4_ext_migrate"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"b477e560-8a06-4fc5-af74-c5727d587d81","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-14 09:33:28 +0000 UTC FinishedAt: 2026-09-14 12:37:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*38477dcc-9a22-4799-b7d7-67f503e95192,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*b27bd76d-cb49-4124-870c-70a820a048b0,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-workfloww8dtz/series-workfloww8dtz-build-action-720173530/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-workfloww8dtz/series-workfloww8dtz-build-action-3732353167/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-workfloww8dtz/series-workfloww8dtz-convert-artifact-1716681348/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,}